diff options
author | wolfbeast <mcwerewolf@wolfbeast.com> | 2020-04-14 21:49:04 +0200 |
---|---|---|
committer | wolfbeast <mcwerewolf@wolfbeast.com> | 2020-04-14 21:49:04 +0200 |
commit | 39dac57259cff8b61db0b22cb2ad0a8adb02692e (patch) | |
tree | 52a026cc8c22793eb17fd0f5e22adce1ae08a1dd /toolkit/components/places/tests/cpp/places_test_harness.h | |
parent | a1cce3b2b00bbd9f4983013ddd8934a7bccb9e99 (diff) | |
parent | c2d9ab62f3d097c9e0e00184cab1f546554f5eaa (diff) | |
download | UXP-39dac57259cff8b61db0b22cb2ad0a8adb02692e.tar UXP-39dac57259cff8b61db0b22cb2ad0a8adb02692e.tar.gz UXP-39dac57259cff8b61db0b22cb2ad0a8adb02692e.tar.lz UXP-39dac57259cff8b61db0b22cb2ad0a8adb02692e.tar.xz UXP-39dac57259cff8b61db0b22cb2ad0a8adb02692e.zip |
Merge branch 'redwood' into 28.9-platform
Diffstat (limited to 'toolkit/components/places/tests/cpp/places_test_harness.h')
-rw-r--r-- | toolkit/components/places/tests/cpp/places_test_harness.h | 413 |
1 files changed, 0 insertions, 413 deletions
diff --git a/toolkit/components/places/tests/cpp/places_test_harness.h b/toolkit/components/places/tests/cpp/places_test_harness.h deleted file mode 100644 index 557a25f90..000000000 --- a/toolkit/components/places/tests/cpp/places_test_harness.h +++ /dev/null @@ -1,413 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ : - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "TestHarness.h" -#include "nsMemory.h" -#include "nsThreadUtils.h" -#include "nsDocShellCID.h" - -#include "nsToolkitCompsCID.h" -#include "nsINavHistoryService.h" -#include "nsIObserverService.h" -#include "nsIURI.h" -#include "mozilla/IHistory.h" -#include "mozIStorageConnection.h" -#include "mozIStorageStatement.h" -#include "mozIStorageAsyncStatement.h" -#include "mozIStorageStatementCallback.h" -#include "mozIStoragePendingStatement.h" -#include "nsPIPlacesDatabase.h" -#include "nsIObserver.h" -#include "prinrval.h" -#include "prtime.h" -#include "mozilla/Attributes.h" - -#define WAITFORTOPIC_TIMEOUT_SECONDS 5 - - -static size_t gTotalTests = 0; -static size_t gPassedTests = 0; - -#define do_check_true(aCondition) \ - PR_BEGIN_MACRO \ - gTotalTests++; \ - if (aCondition) { \ - gPassedTests++; \ - } else { \ - fail("%s | Expected true, got false at line %d", __FILE__, __LINE__); \ - } \ - PR_END_MACRO - -#define do_check_false(aCondition) \ - PR_BEGIN_MACRO \ - gTotalTests++; \ - if (!aCondition) { \ - gPassedTests++; \ - } else { \ - fail("%s | Expected false, got true at line %d", __FILE__, __LINE__); \ - } \ - PR_END_MACRO - -#define do_check_success(aResult) \ - do_check_true(NS_SUCCEEDED(aResult)) - -#ifdef LINUX -// XXX Linux opt builds on tinderbox are orange due to linking with stdlib. -// This is sad and annoying, but it's a workaround that works. -#define do_check_eq(aExpected, aActual) \ - do_check_true(aExpected == aActual) -#else -#include <sstream> - -#define do_check_eq(aActual, aExpected) \ - PR_BEGIN_MACRO \ - gTotalTests++; \ - if (aExpected == aActual) { \ - gPassedTests++; \ - } else { \ - std::ostringstream temp; \ - temp << __FILE__ << " | Expected '" << aExpected << "', got '"; \ - temp << aActual <<"' at line " << __LINE__; \ - fail(temp.str().c_str()); \ - } \ - PR_END_MACRO -#endif - -struct Test -{ - void (*func)(void); - const char* const name; -}; -#define TEST(aName) \ - {aName, #aName} - -/** - * Runs the next text. - */ -void run_next_test(); - -/** - * To be used around asynchronous work. - */ -void do_test_pending(); -void do_test_finished(); - -/** - * Spins current thread until a topic is received. - */ -class WaitForTopicSpinner final : public nsIObserver -{ -public: - NS_DECL_ISUPPORTS - - explicit WaitForTopicSpinner(const char* const aTopic) - : mTopicReceived(false) - , mStartTime(PR_IntervalNow()) - { - nsCOMPtr<nsIObserverService> observerService = - do_GetService(NS_OBSERVERSERVICE_CONTRACTID); - do_check_true(observerService); - (void)observerService->AddObserver(this, aTopic, false); - } - - void Spin() { - while (!mTopicReceived) { - if ((PR_IntervalNow() - mStartTime) > (WAITFORTOPIC_TIMEOUT_SECONDS * PR_USEC_PER_SEC)) { - // Timed out waiting for the topic. - do_check_true(false); - break; - } - (void)NS_ProcessNextEvent(); - } - } - - NS_IMETHOD Observe(nsISupports* aSubject, - const char* aTopic, - const char16_t* aData) override - { - mTopicReceived = true; - nsCOMPtr<nsIObserverService> observerService = - do_GetService(NS_OBSERVERSERVICE_CONTRACTID); - do_check_true(observerService); - (void)observerService->RemoveObserver(this, aTopic); - return NS_OK; - } - -private: - ~WaitForTopicSpinner() {} - - bool mTopicReceived; - PRIntervalTime mStartTime; -}; -NS_IMPL_ISUPPORTS( - WaitForTopicSpinner, - nsIObserver -) - -/** - * Spins current thread until an async statement is executed. - */ -class AsyncStatementSpinner final : public mozIStorageStatementCallback -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_MOZISTORAGESTATEMENTCALLBACK - - AsyncStatementSpinner(); - void SpinUntilCompleted(); - uint16_t completionReason; - -protected: - ~AsyncStatementSpinner() {} - - volatile bool mCompleted; -}; - -NS_IMPL_ISUPPORTS(AsyncStatementSpinner, - mozIStorageStatementCallback) - -AsyncStatementSpinner::AsyncStatementSpinner() -: completionReason(0) -, mCompleted(false) -{ -} - -NS_IMETHODIMP -AsyncStatementSpinner::HandleResult(mozIStorageResultSet *aResultSet) -{ - return NS_OK; -} - -NS_IMETHODIMP -AsyncStatementSpinner::HandleError(mozIStorageError *aError) -{ - return NS_OK; -} - -NS_IMETHODIMP -AsyncStatementSpinner::HandleCompletion(uint16_t aReason) -{ - completionReason = aReason; - mCompleted = true; - return NS_OK; -} - -void AsyncStatementSpinner::SpinUntilCompleted() -{ - nsCOMPtr<nsIThread> thread(::do_GetCurrentThread()); - nsresult rv = NS_OK; - bool processed = true; - while (!mCompleted && NS_SUCCEEDED(rv)) { - rv = thread->ProcessNextEvent(true, &processed); - } -} - -struct PlaceRecord -{ - int64_t id; - int32_t hidden; - int32_t typed; - int32_t visitCount; - nsCString guid; -}; - -struct VisitRecord -{ - int64_t id; - int64_t lastVisitId; - int32_t transitionType; -}; - -already_AddRefed<mozilla::IHistory> -do_get_IHistory() -{ - nsCOMPtr<mozilla::IHistory> history = do_GetService(NS_IHISTORY_CONTRACTID); - do_check_true(history); - return history.forget(); -} - -already_AddRefed<nsINavHistoryService> -do_get_NavHistory() -{ - nsCOMPtr<nsINavHistoryService> serv = - do_GetService(NS_NAVHISTORYSERVICE_CONTRACTID); - do_check_true(serv); - return serv.forget(); -} - -already_AddRefed<mozIStorageConnection> -do_get_db() -{ - nsCOMPtr<nsINavHistoryService> history = do_get_NavHistory(); - nsCOMPtr<nsPIPlacesDatabase> database = do_QueryInterface(history); - do_check_true(database); - - nsCOMPtr<mozIStorageConnection> dbConn; - nsresult rv = database->GetDBConnection(getter_AddRefs(dbConn)); - do_check_success(rv); - return dbConn.forget(); -} - -/** - * Get the place record from the database. - * - * @param aURI The unique URI of the place we are looking up - * @param result Out parameter where the result is stored - */ -void -do_get_place(nsIURI* aURI, PlaceRecord& result) -{ - nsCOMPtr<mozIStorageConnection> dbConn = do_get_db(); - nsCOMPtr<mozIStorageStatement> stmt; - - nsCString spec; - nsresult rv = aURI->GetSpec(spec); - do_check_success(rv); - - rv = dbConn->CreateStatement(NS_LITERAL_CSTRING( - "SELECT id, hidden, typed, visit_count, guid FROM moz_places " - "WHERE url_hash = hash(?1) AND url = ?1" - ), getter_AddRefs(stmt)); - do_check_success(rv); - - rv = stmt->BindUTF8StringByIndex(0, spec); - do_check_success(rv); - - bool hasResults; - rv = stmt->ExecuteStep(&hasResults); - do_check_success(rv); - if (!hasResults) { - result.id = 0; - return; - } - - rv = stmt->GetInt64(0, &result.id); - do_check_success(rv); - rv = stmt->GetInt32(1, &result.hidden); - do_check_success(rv); - rv = stmt->GetInt32(2, &result.typed); - do_check_success(rv); - rv = stmt->GetInt32(3, &result.visitCount); - do_check_success(rv); - rv = stmt->GetUTF8String(4, result.guid); - do_check_success(rv); -} - -/** - * Gets the most recent visit to a place. - * - * @param placeID ID from the moz_places table - * @param result Out parameter where visit is stored - */ -void -do_get_lastVisit(int64_t placeId, VisitRecord& result) -{ - nsCOMPtr<mozIStorageConnection> dbConn = do_get_db(); - nsCOMPtr<mozIStorageStatement> stmt; - - nsresult rv = dbConn->CreateStatement(NS_LITERAL_CSTRING( - "SELECT id, from_visit, visit_type FROM moz_historyvisits " - "WHERE place_id=?1 " - "LIMIT 1" - ), getter_AddRefs(stmt)); - do_check_success(rv); - - rv = stmt->BindInt64ByIndex(0, placeId); - do_check_success(rv); - - bool hasResults; - rv = stmt->ExecuteStep(&hasResults); - do_check_success(rv); - - if (!hasResults) { - result.id = 0; - return; - } - - rv = stmt->GetInt64(0, &result.id); - do_check_success(rv); - rv = stmt->GetInt64(1, &result.lastVisitId); - do_check_success(rv); - rv = stmt->GetInt32(2, &result.transitionType); - do_check_success(rv); -} - -void -do_wait_async_updates() { - nsCOMPtr<mozIStorageConnection> db = do_get_db(); - nsCOMPtr<mozIStorageAsyncStatement> stmt; - - db->CreateAsyncStatement(NS_LITERAL_CSTRING("BEGIN EXCLUSIVE"), - getter_AddRefs(stmt)); - nsCOMPtr<mozIStoragePendingStatement> pending; - (void)stmt->ExecuteAsync(nullptr, getter_AddRefs(pending)); - - db->CreateAsyncStatement(NS_LITERAL_CSTRING("COMMIT"), - getter_AddRefs(stmt)); - RefPtr<AsyncStatementSpinner> spinner = new AsyncStatementSpinner(); - (void)stmt->ExecuteAsync(spinner, getter_AddRefs(pending)); - - spinner->SpinUntilCompleted(); -} - -/** - * Adds a URI to the database. - * - * @param aURI - * The URI to add to the database. - */ -void -addURI(nsIURI* aURI) -{ - nsCOMPtr<mozilla::IHistory> history = do_GetService(NS_IHISTORY_CONTRACTID); - do_check_true(history); - nsresult rv = history->VisitURI(aURI, nullptr, mozilla::IHistory::TOP_LEVEL); - do_check_success(rv); - - do_wait_async_updates(); -} - -static const char TOPIC_PROFILE_CHANGE[] = "profile-before-change"; -static const char TOPIC_PLACES_CONNECTION_CLOSED[] = "places-connection-closed"; - -class WaitForConnectionClosed final : public nsIObserver -{ - RefPtr<WaitForTopicSpinner> mSpinner; - - ~WaitForConnectionClosed() {} - -public: - NS_DECL_ISUPPORTS - - WaitForConnectionClosed() - { - nsCOMPtr<nsIObserverService> os = - do_GetService(NS_OBSERVERSERVICE_CONTRACTID); - MOZ_ASSERT(os); - if (os) { - MOZ_ALWAYS_SUCCEEDS(os->AddObserver(this, TOPIC_PROFILE_CHANGE, false)); - } - mSpinner = new WaitForTopicSpinner(TOPIC_PLACES_CONNECTION_CLOSED); - } - - NS_IMETHOD Observe(nsISupports* aSubject, - const char* aTopic, - const char16_t* aData) override - { - nsCOMPtr<nsIObserverService> os = - do_GetService(NS_OBSERVERSERVICE_CONTRACTID); - MOZ_ASSERT(os); - if (os) { - MOZ_ALWAYS_SUCCEEDS(os->RemoveObserver(this, aTopic)); - } - - mSpinner->Spin(); - - return NS_OK; - } -}; - -NS_IMPL_ISUPPORTS(WaitForConnectionClosed, nsIObserver) |