diff options
-rw-r--r-- | chrome/test/live_sync/live_sync_test.cc | 41 | ||||
-rw-r--r-- | chrome/test/live_sync/live_sync_test.h | 6 | ||||
-rw-r--r-- | chrome/test/live_sync/many_client_live_bookmarks_sync_test.cc | 3 | ||||
-rw-r--r-- | chrome/test/live_sync/many_client_live_preferences_sync_test.cc | 3 | ||||
-rw-r--r-- | chrome/test/live_sync/profile_sync_service_test_harness.cc | 194 | ||||
-rw-r--r-- | chrome/test/live_sync/profile_sync_service_test_harness.h | 32 | ||||
-rw-r--r-- | chrome/test/live_sync/single_client_live_bookmarks_sync_test.cc | 41 | ||||
-rw-r--r-- | chrome/test/test_switches.cc | 3 | ||||
-rw-r--r-- | chrome/test/test_switches.h | 1 | ||||
-rw-r--r-- | chrome/test/test_timeouts.cc | 6 | ||||
-rw-r--r-- | chrome/test/test_timeouts.h | 7 | ||||
-rwxr-xr-x | net/tools/testserver/chromiumsync.py | 15 | ||||
-rw-r--r-- | net/tools/testserver/testserver.py | 24 |
13 files changed, 166 insertions, 210 deletions
diff --git a/chrome/test/live_sync/live_sync_test.cc b/chrome/test/live_sync/live_sync_test.cc index fcf1e47..14ecf8d 100644 --- a/chrome/test/live_sync/live_sync_test.cc +++ b/chrome/test/live_sync/live_sync_test.cc @@ -229,14 +229,11 @@ void LiveSyncTest::SetUpInProcessBrowserTestFixture() { net::RuleBasedHostResolverProc* resolver = new net::RuleBasedHostResolverProc(host_resolver()); resolver->AllowDirectLookup("*.google.com"); - // Allow direct lookup of thawte.com. On Linux, we use Chromium's nss - // implementation which uses ocsp.thawte.com for certificate verification. - // Without this, running the test case on Linux causes an error as we make an - // external DNS lookup of "ocsp.thawte.com". + // On Linux, we use Chromium's NSS implementation which uses the following + // hosts for certificate verification. Without these overrides, running the + // integration tests on Linux causes error as we make external DNS lookups. resolver->AllowDirectLookup("*.thawte.com"); - // The new XMPP cert seems to use crl.geotrust.com on Linux. resolver->AllowDirectLookup("*.geotrust.com"); - // SSL chain. resolver->AllowDirectLookup("*.gstatic.com"); mock_host_resolver_override_.reset( new net::ScopedDefaultHostResolverProc(resolver)); @@ -268,28 +265,20 @@ void LiveSyncTest::TearDownLocalTestServer() { void LiveSyncTest::EnableNetwork(Profile* profile) { SetProxyConfig(profile->GetRequestContext(), net::ProxyConfig::CreateDirect()); - // Bugs: http://crbug.com/53857 - // http://crbug.com/53858 + // TODO(rsimha): Remove this line once http://crbug.com/53857 is fixed. net::NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); } void LiveSyncTest::DisableNetwork(Profile* profile) { - // Set the current proxy configuration to a nonexistent proxy to - // effectively disable networking. + // Set the current proxy configuration to a nonexistent proxy to effectively + // disable networking. net::ProxyConfig config; config.proxy_rules().ParseFromString("http=127.0.0.1:0"); SetProxyConfig(profile->GetRequestContext(), config); + // TODO(rsimha): Remove this line once http://crbug.com/53857 is fixed. net::NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); } -bool LiveSyncTest::EnsureSyncServerConfiguration() { - const CommandLine* cl = CommandLine::ForCurrentProcess(); - if (!cl->HasSwitch(switches::kSyncServiceURL)) - return true; - - return ConfigureSyncServer("user_email", username_); -} - void LiveSyncTest::SetProxyConfig(URLRequestContextGetter* context_getter, const net::ProxyConfig& proxy_config) { base::WaitableEvent done(false, false); @@ -301,19 +290,3 @@ void LiveSyncTest::SetProxyConfig(URLRequestContextGetter* context_getter, proxy_config)); done.Wait(); } - -bool LiveSyncTest::ConfigureSyncServer(const std::string& name, - const std::string& value) { - std::string url = StringPrintf("http://%s:%d/chromiumsync/configure", - test_server_.host_port_pair().host().c_str(), - test_server_.host_port_pair().port()); - std::string data = EscapePath(name) + "=" + EscapePath(value); - ConfigureURLFectcherDelegate delegate; - scoped_ptr<URLFetcher> fetcher( - URLFetcher::Create(0, GURL(url), URLFetcher::POST, &delegate)); - fetcher->set_request_context(Profile::GetDefaultRequestContext()); - fetcher->set_upload_data("application/x-www-form-urlencoded", data); - fetcher->Start(); - MessageLoop::current()->Run(); - return delegate.success(); -} diff --git a/chrome/test/live_sync/live_sync_test.h b/chrome/test/live_sync/live_sync_test.h index 134b200..ee5ab08 100644 --- a/chrome/test/live_sync/live_sync_test.h +++ b/chrome/test/live_sync/live_sync_test.h @@ -129,9 +129,6 @@ class LiveSyncTest : public InProcessBrowserTest { // Enable outgoing network connections for the given profile. virtual void EnableNetwork(Profile* profile); - // Configure mock server with test's options. - virtual bool EnsureSyncServerConfiguration(); - protected: // InProcessBrowserTest override. Destroys all the sync clients and sync // profiles created by a test. @@ -170,9 +167,6 @@ class LiveSyncTest : public InProcessBrowserTest { void SetProxyConfig(URLRequestContextGetter* context, const net::ProxyConfig& proxy_config); - // Sends configuration options to the mock sync server. - bool ConfigureSyncServer(const std::string& name, const std::string& value); - // Used to differentiate between single-client, two-client, multi-client and // many-client tests. TestType test_type_; diff --git a/chrome/test/live_sync/many_client_live_bookmarks_sync_test.cc b/chrome/test/live_sync/many_client_live_bookmarks_sync_test.cc index 174fd12..2736537 100644 --- a/chrome/test/live_sync/many_client_live_bookmarks_sync_test.cc +++ b/chrome/test/live_sync/many_client_live_bookmarks_sync_test.cc @@ -5,8 +5,7 @@ #include "chrome/browser/bookmarks/bookmark_utils.h" #include "chrome/test/live_sync/live_bookmarks_sync_test.h" -// TODO(rsimha): Marking this as flaky until crbug.com/53931 is fixed. -IN_PROC_BROWSER_TEST_F(ManyClientLiveBookmarksSyncTest, FLAKY_Sanity) { +IN_PROC_BROWSER_TEST_F(ManyClientLiveBookmarksSyncTest, Sanity) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; BookmarkModelVerifier* v = verifier_helper(); v->AddURL(GetBookmarkModel(0), GetBookmarkBarNode(0), 0, L"Google URL", diff --git a/chrome/test/live_sync/many_client_live_preferences_sync_test.cc b/chrome/test/live_sync/many_client_live_preferences_sync_test.cc index 3c0ab77..1b28f39 100644 --- a/chrome/test/live_sync/many_client_live_preferences_sync_test.cc +++ b/chrome/test/live_sync/many_client_live_preferences_sync_test.cc @@ -4,8 +4,7 @@ #include "chrome/test/live_sync/live_preferences_sync_test.h" -// TODO(rsimha): Marking this as flaky until crbug.com/53931 is fixed. -IN_PROC_BROWSER_TEST_F(ManyClientLivePreferencesSyncTest, FLAKY_Sanity) { +IN_PROC_BROWSER_TEST_F(ManyClientLivePreferencesSyncTest, Sanity) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; bool new_value = !GetVerifierPrefs()->GetBoolean( diff --git a/chrome/test/live_sync/profile_sync_service_test_harness.cc b/chrome/test/live_sync/profile_sync_service_test_harness.cc index b49bf56..541403b 100644 --- a/chrome/test/live_sync/profile_sync_service_test_harness.cc +++ b/chrome/test/live_sync/profile_sync_service_test_harness.cc @@ -15,6 +15,7 @@ #include "chrome/common/net/gaia/google_service_auth_error.h" #include "chrome/common/pref_names.h" #include "chrome/test/live_sync/profile_sync_service_test_harness.h" +#include "chrome/test/test_timeouts.h" #include "chrome/test/ui_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" @@ -22,8 +23,6 @@ // WAITING_FOR_UPDATES state. static const int kMinTimestampNeededNone = -1; -static const ProfileSyncService::Status kInvalidStatus = {}; - // Simple class to implement a timeout using PostDelayedTask. If it is not // aborted before picked up by a message queue, then it asserts with the message // provided. This class is not thread safe. @@ -88,7 +87,6 @@ ProfileSyncServiceTestHarness::ProfileSyncServiceTestHarness(Profile* p, const std::string& username, const std::string& password, int id) : wait_state_(WAITING_FOR_ON_BACKEND_INITIALIZED), profile_(p), service_(NULL), - last_status_(kInvalidStatus), last_timestamp_(0), min_timestamp_needed_(kMinTimestampNeededNone), username_(username), password_(password), id_(id) { @@ -99,15 +97,14 @@ ProfileSyncServiceTestHarness::ProfileSyncServiceTestHarness(Profile* p, bool ProfileSyncServiceTestHarness::SetupSync() { service_ = profile_->GetProfileSyncService(""); + EXPECT_FALSE(service_ == NULL) << "SetupSync(): service_ is null."; service_->AddObserver(this); service_->signin_.StartSignIn(username_, password_, "", ""); - return WaitForServiceInit(); } void ProfileSyncServiceTestHarness::SignalStateCompleteWithNextState( WaitState next_state) { - wait_state_ = next_state; SignalStateComplete(); } @@ -117,78 +114,62 @@ void ProfileSyncServiceTestHarness::SignalStateComplete() { } bool ProfileSyncServiceTestHarness::RunStateChangeMachine() { - WaitState state = wait_state_; - ProfileSyncService::Status status(service_->QueryDetailedSyncStatus()); + WaitState original_wait_state = wait_state_; switch (wait_state_) { case WAITING_FOR_ON_BACKEND_INITIALIZED: { LogClientInfo("WAITING_FOR_ON_BACKEND_INITIALIZED"); - if (service_->GetAuthError().state() != GoogleServiceAuthError::NONE) { - SignalStateCompleteWithNextState(AUTH_ERROR); - } - if (service_->sync_initialized()) { - SignalStateCompleteWithNextState(WAITING_FOR_NOTIFICATIONS_ENABLED); + if (service()->sync_initialized()) { + // The sync backend is initialized. Start waiting for the first sync + // cycle to complete. + SignalStateCompleteWithNextState(WAITING_FOR_INITIAL_SYNC); } break; } - case WAITING_FOR_NOTIFICATIONS_ENABLED: { - LogClientInfo("WAITING_FOR_NOTIFICATIONS_ENABLED"); - if (status.notifications_enabled) { + case WAITING_FOR_INITIAL_SYNC: { + LogClientInfo("WAITING_FOR_INITIAL_SYNC"); + if (IsSynced()) { + // The first sync cycle is now complete. We can start running tests. SignalStateCompleteWithNextState(FULLY_SYNCED); } break; } - case WAITING_FOR_SERVER_REACHABLE: { - LogClientInfo("WAITING_FOR_SERVER_REACHABLE"); - const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); - if (!status.server_reachable) { - break; - } - if (service()->backend()->HasUnsyncedItems() || - snap->has_more_to_sync || snap->unsynced_count != 0) { - SignalStateCompleteWithNextState(WAITING_FOR_SYNC_TO_FINISH); - break; - } - last_timestamp_ = snap->max_local_timestamp; - SignalStateCompleteWithNextState(FULLY_SYNCED); - break; - } case WAITING_FOR_SYNC_TO_FINISH: { LogClientInfo("WAITING_FOR_SYNC_TO_FINISH"); - const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); - DCHECK(snap) << "Should have been at least one sync session by now"; - // TODO(rsimha): In an ideal world, snap->has_more_to_sync == false should - // be a sufficient condition for sync to have completed. However, the - // additional check of snap->unsynced_count is required due to - // http://crbug.com/48989. - if (service()->backend()->HasUnsyncedItems() || - snap->has_more_to_sync || snap->unsynced_count != 0) { - if (!status.server_reachable) - SignalStateCompleteWithNextState(WAITING_FOR_SERVER_REACHABLE); + if (!IsSynced()) { + // The client is not yet fully synced. Continue waiting. + if (!GetStatus().server_reachable) { + // The client cannot reach the sync server because the network is + // disabled. There is no need to wait anymore. + SignalStateCompleteWithNextState(SERVER_UNREACHABLE); + } break; } - EXPECT_LE(last_timestamp_, snap->max_local_timestamp); - last_timestamp_ = snap->max_local_timestamp; + GetUpdatedTimestamp(); SignalStateCompleteWithNextState(FULLY_SYNCED); break; } case WAITING_FOR_UPDATES: { LogClientInfo("WAITING_FOR_UPDATES"); - const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); - DCHECK(snap) << "Should have been at least one sync session by now"; - if (snap->max_local_timestamp < min_timestamp_needed_) { + if (!IsSynced() || GetUpdatedTimestamp() < min_timestamp_needed_) { + // The client is not yet fully synced. Continue waiting until the client + // is at the required minimum timestamp. break; } - EXPECT_LE(last_timestamp_, snap->max_local_timestamp); - last_timestamp_ = snap->max_local_timestamp; SignalStateCompleteWithNextState(FULLY_SYNCED); break; } - case FULLY_SYNCED: { - LogClientInfo("FULLY_SYNCED"); + case SERVER_UNREACHABLE: { + LogClientInfo("SERVER_UNREACHABLE"); + if (GetStatus().server_reachable) { + // The client was offline due to the network being disabled, but is now + // back online. Wait for the pending sync cycle to complete. + SignalStateCompleteWithNextState(WAITING_FOR_SYNC_TO_FINISH); + } break; } - case AUTH_ERROR: { - LogClientInfo("AUTH_ERROR"); + case FULLY_SYNCED: { + // The client is online and fully synced. There is nothing to do. + LogClientInfo("FULLY_SYNCED"); break; } default: @@ -196,8 +177,7 @@ bool ProfileSyncServiceTestHarness::RunStateChangeMachine() { // classes using the the UI message loop. Defer to their handling. break; } - last_status_ = status; - return state != wait_state_; + return original_wait_state != wait_state_; } void ProfileSyncServiceTestHarness::OnStateChanged() { @@ -207,18 +187,33 @@ void ProfileSyncServiceTestHarness::OnStateChanged() { bool ProfileSyncServiceTestHarness::AwaitSyncCycleCompletion( const std::string& reason) { LogClientInfo("AwaitSyncCycleCompletion"); - const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); - DCHECK(snap) << "Should have been at least one sync session by now"; - // TODO(rsimha): Remove additional checks of snap->has_more_to_sync and - // snap->unsynced_count once http://crbug.com/48989 is fixed. - if (service()->backend()->HasUnsyncedItems() || - snap->has_more_to_sync || - snap->unsynced_count != 0) { - wait_state_ = WAITING_FOR_SYNC_TO_FINISH; - return AwaitStatusChangeWithTimeout(60, reason); + if (!IsSynced()) { + if (wait_state_ == SERVER_UNREACHABLE) { + // Client was offline; wait for it to go online, and then wait for sync. + AwaitStatusChangeWithTimeout( + TestTimeouts::live_operation_timeout_ms(), reason); + EXPECT_EQ(wait_state_, WAITING_FOR_SYNC_TO_FINISH); + return AwaitStatusChangeWithTimeout( + TestTimeouts::live_operation_timeout_ms(), reason); + } else { + EXPECT_TRUE(service()->sync_initialized()); + wait_state_ = WAITING_FOR_SYNC_TO_FINISH; + AwaitStatusChangeWithTimeout( + TestTimeouts::live_operation_timeout_ms(), reason); + if (wait_state_ == FULLY_SYNCED) { + // Client is online; sync was successful. + return true; + } else if (wait_state_ == SERVER_UNREACHABLE){ + // Client is offline; sync was unsuccessful. + return false; + } else { + LOG(FATAL) << "Invalid wait state:" << wait_state_; + return false; + } + } } else { - EXPECT_LE(last_timestamp_, snap->max_local_timestamp); - last_timestamp_ = snap->max_local_timestamp; + // Client is already synced; don't wait. + GetUpdatedTimestamp(); return true; } } @@ -270,18 +265,17 @@ bool ProfileSyncServiceTestHarness::WaitUntilTimestampIsAtLeast( int64 timestamp, const std::string& reason) { LogClientInfo("WaitUntilTimestampIsAtLeast"); min_timestamp_needed_ = timestamp; - const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); - DCHECK(snap) << "Should have been at least one sync session by now"; - if (snap->max_local_timestamp < min_timestamp_needed_) { + if (GetUpdatedTimestamp() < min_timestamp_needed_) { wait_state_ = WAITING_FOR_UPDATES; - return AwaitStatusChangeWithTimeout(60, reason); + return AwaitStatusChangeWithTimeout( + TestTimeouts::live_operation_timeout_ms(), reason); } else { return true; } } bool ProfileSyncServiceTestHarness::AwaitStatusChangeWithTimeout( - int timeout_seconds, + int timeout_milliseconds, const std::string& reason) { LogClientInfo("AwaitStatusChangeWithTimeout"); scoped_refptr<StateChangeTimeoutEvent> timeout_signal( @@ -291,7 +285,7 @@ bool ProfileSyncServiceTestHarness::AwaitStatusChangeWithTimeout( FROM_HERE, NewRunnableMethod(timeout_signal.get(), &StateChangeTimeoutEvent::Callback), - 1000 * timeout_seconds); + timeout_milliseconds); LogClientInfo("Before RunMessageLoop"); ui_test_utils::RunMessageLoop(); LogClientInfo("After RunMessageLoop"); @@ -303,12 +297,11 @@ bool ProfileSyncServiceTestHarness::WaitForServiceInit() { // Wait for the OnBackendInitialized() callback. EXPECT_EQ(wait_state_, WAITING_FOR_ON_BACKEND_INITIALIZED); - EXPECT_TRUE(AwaitStatusChangeWithTimeout(30, - "Waiting for OnBackendInitialized().")) << - "OnBackendInitialized() not seen after 30 seconds."; - - if (wait_state_ == AUTH_ERROR) { - return false; + if (!AwaitStatusChangeWithTimeout(TestTimeouts::live_operation_timeout_ms(), + "Waiting for OnBackendInitialized().")) { + LOG(FATAL) << "OnBackendInitialized() not seen after " + << TestTimeouts::live_operation_timeout_ms() / 1000 + << " seconds."; } // Choose datatypes to be synced. @@ -317,17 +310,38 @@ bool ProfileSyncServiceTestHarness::WaitForServiceInit() { i < syncable::MODEL_TYPE_COUNT; ++i) { set.insert(syncable::ModelTypeFromInt(i)); } - service_->OnUserChoseDatatypes(true, set); - - // Wait for notifications_enabled to be set to true. - EXPECT_EQ(wait_state_, WAITING_FOR_NOTIFICATIONS_ENABLED); - EXPECT_TRUE(AwaitStatusChangeWithTimeout(30, - "Waiting for notifications_enabled to be set to true.")) << - "notifications_enabled not set to true after 30 seconds."; + service()->OnUserChoseDatatypes(true, set); + + // Wait for initial sync cycle to complete. + EXPECT_EQ(wait_state_, WAITING_FOR_INITIAL_SYNC); + if (!AwaitStatusChangeWithTimeout(TestTimeouts::live_operation_timeout_ms(), + "Waiting for initial sync cycle to complete.")) { + LOG(FATAL) << "Initial sync cycle did not complete after " + << TestTimeouts::live_operation_timeout_ms() / 1000 + << " seconds."; + } return true; } +ProfileSyncService::Status ProfileSyncServiceTestHarness::GetStatus() { + EXPECT_FALSE(service() == NULL) << "GetStatus(): service() is NULL."; + return service()->QueryDetailedSyncStatus(); +} + +bool ProfileSyncServiceTestHarness::IsSynced() { + const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); + // TODO(rsimha): Remove additional checks of snap->has_more_to_sync and + // snap->unsynced_count once http://crbug.com/48989 is fixed. + return (service() && + snap && + ServiceIsPushingChanges() && + GetStatus().notifications_enabled && + !service()->backend()->HasUnsyncedItems() && + !snap->has_more_to_sync && + snap->unsynced_count == 0); +} + const SyncSessionSnapshot* ProfileSyncServiceTestHarness::GetLastSessionSnapshot() const { EXPECT_FALSE(service_ == NULL) << "Sync service has not yet been set up."; @@ -337,14 +351,24 @@ const SyncSessionSnapshot* return NULL; } +int64 ProfileSyncServiceTestHarness::GetUpdatedTimestamp() { + const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); + EXPECT_FALSE(snap == NULL) << "GetUpdatedTimestamp(): Sync snapshot is NULL."; + EXPECT_LE(last_timestamp_, snap->max_local_timestamp); + last_timestamp_ = snap->max_local_timestamp; + return last_timestamp_; +} + void ProfileSyncServiceTestHarness::LogClientInfo(std::string message) { const SyncSessionSnapshot* snap = GetLastSessionSnapshot(); if (snap) { LOG(INFO) << "Client " << id_ << ": " << message << ": " - << "has_more_to_sync: " << snap->has_more_to_sync - << ", max_local_timestamp: " << snap->max_local_timestamp + << "max_local_timestamp: " << snap->max_local_timestamp + << ", has_more_to_sync: " << snap->has_more_to_sync << ", unsynced_count: " << snap->unsynced_count << ", has_unsynced_items: " << service()->backend()->HasUnsyncedItems() + << ", notifications_enabled: " << GetStatus().notifications_enabled + << ", ServiceIsPushingChanges(): " << ServiceIsPushingChanges() << "."; } else { LOG(INFO) << "Client " << id_ << ": " << message << ": " diff --git a/chrome/test/live_sync/profile_sync_service_test_harness.h b/chrome/test/live_sync/profile_sync_service_test_harness.h index 34cfde3..e9c50ea 100644 --- a/chrome/test/live_sync/profile_sync_service_test_harness.h +++ b/chrome/test/live_sync/profile_sync_service_test_harness.h @@ -66,8 +66,12 @@ class ProfileSyncServiceTestHarness : public ProfileSyncServiceObserver { static bool AwaitQuiescence( std::vector<ProfileSyncServiceTestHarness*>& clients); + // Returns the ProfileSyncService member of the the sync client. ProfileSyncService* service() { return service_; } + // Returns the status of the ProfileSyncService member of the the sync client. + ProfileSyncService::Status GetStatus(); + // See ProfileSyncService::ShouldPushChanges(). bool ServiceIsPushingChanges() { return service_->ShouldPushChanges(); } @@ -77,18 +81,21 @@ class ProfileSyncServiceTestHarness : public ProfileSyncServiceObserver { enum WaitState { // The sync client awaits the OnBackendInitialized() callback. WAITING_FOR_ON_BACKEND_INITIALIZED = 0, - // The sync client is waiting for notifications_enabled to become true. - WAITING_FOR_NOTIFICATIONS_ENABLED, + + // The sync client is waiting for the first sync cycle to complete. + WAITING_FOR_INITIAL_SYNC, + // The sync client is waiting for an ongoing sync cycle to complete. WAITING_FOR_SYNC_TO_FINISH, + // The sync client anticipates incoming updates leading to a new sync cycle. WAITING_FOR_UPDATES, - // The sync client is waiting for server_reachable to become true. - WAITING_FOR_SERVER_REACHABLE, + + // The sync client cannot reach the server. + SERVER_UNREACHABLE, + // The sync client is fully synced and there are no pending updates. FULLY_SYNCED, - // An authentication error has occurred. - AUTH_ERROR, NUMBER_OF_STATES, }; @@ -101,13 +108,15 @@ class ProfileSyncServiceTestHarness : public ProfileSyncServiceObserver { bool RunStateChangeMachine(); // Returns true if a status change took place, false on timeout. - virtual bool AwaitStatusChangeWithTimeout(int timeout_seconds, + virtual bool AwaitStatusChangeWithTimeout(int timeout_milliseconds, const std::string& reason); - // Returns true if the service initialized correctly. Set is_auth_retry to - // true when calling this method second time after an authentication failure. + // Returns true if the service initialized correctly. bool WaitForServiceInit(); + // Returns true if the sync client has no unsynced items. + bool IsSynced(); + // Logs message with relevant info about client's sync state (if available). void LogClientInfo(std::string message); @@ -119,8 +128,9 @@ class ProfileSyncServiceTestHarness : public ProfileSyncServiceObserver { // Returns a snapshot of the current sync session. const SyncSessionSnapshot* GetLastSessionSnapshot() const; - // State tracking. Used for debugging and tracking of state. - ProfileSyncService::Status last_status_; + // Updates |last_timestamp_| with the timestamp of the current sync session. + // Returns the new value of |last_timestamp_|. + int64 GetUpdatedTimestamp(); // This value tracks the max sync timestamp (e.g. synced-to revision) inside // the sync engine. It gets updated when a sync cycle ends and the session diff --git a/chrome/test/live_sync/single_client_live_bookmarks_sync_test.cc b/chrome/test/live_sync/single_client_live_bookmarks_sync_test.cc index bc66917..702d56b 100644 --- a/chrome/test/live_sync/single_client_live_bookmarks_sync_test.cc +++ b/chrome/test/live_sync/single_client_live_bookmarks_sync_test.cc @@ -4,35 +4,25 @@ #include "chrome/test/live_sync/live_bookmarks_sync_test.h" -// TODO(rsimha): Debug the flakiness of this with fred. http://crbug.com/53858 -IN_PROC_BROWSER_TEST_F(SingleClientLiveBookmarksSyncTest, - FAILS_OfflineToOnline) { +IN_PROC_BROWSER_TEST_F(SingleClientLiveBookmarksSyncTest, OfflineToOnline) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - DisableNetwork(GetProfile(0)); BookmarkModel* bm = GetBookmarkModel(0); BookmarkModelVerifier* v = verifier_helper(); - const BookmarkNode* top = v->AddGroup(bm, bm->other_node(), 0, L"top"); v->SetTitle(bm, top, L"title"); - - EXPECT_TRUE(GetClient(0)->AwaitSyncCycleCompletion("Offline state change.")); - { - ProfileSyncService::Status status( - GetClient(0)->service()->QueryDetailedSyncStatus()); - EXPECT_EQ(status.summary, ProfileSyncService::Status::OFFLINE_UNSYNCED); - } + EXPECT_FALSE(GetClient(0)->AwaitSyncCycleCompletion("Offline state change.")); + EXPECT_EQ(ProfileSyncService::Status::OFFLINE_UNSYNCED, + GetClient(0)->GetStatus().summary); EnableNetwork(GetProfile(0)); - { - EXPECT_TRUE(GetClient(0)->AwaitSyncCycleCompletion("Commit changes.")); - ProfileSyncService::Status status( - GetClient(0)->service()->QueryDetailedSyncStatus()); - EXPECT_EQ(status.summary, ProfileSyncService::Status::READY); - v->ExpectMatch(bm); - } + EXPECT_TRUE(GetClient(0)->AwaitSyncCycleCompletion("Commit changes.")); + EXPECT_EQ(ProfileSyncService::Status::READY, + GetClient(0)->GetStatus().summary); + + v->ExpectMatch(bm); } IN_PROC_BROWSER_TEST_F(SingleClientLiveBookmarksSyncTest, Sanity) { @@ -142,16 +132,3 @@ IN_PROC_BROWSER_TEST_F(SingleClientLiveBookmarksSyncTest, Sanity) { "Move after addition of bookmarks.")); v->ExpectMatch(bm); } - -// Connects a client with no bookmarks to a cloud account. As a natural -// consequence of shutdown, this will encode the BookmarkModel as JSON to the -// 'Bookmarks' file. This is mostly useful to verify server state. -// DISABLED because it should be; we use this as a utility more than a test. -IN_PROC_BROWSER_TEST_F(SingleClientLiveBookmarksSyncTest, DISABLED_GetUpdates) { - ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - - EXPECT_TRUE(GetClient(0)->ServiceIsPushingChanges()); - ProfileSyncService::Status status(GetService(0)->QueryDetailedSyncStatus()); - EXPECT_EQ(status.summary, ProfileSyncService::Status::READY); - EXPECT_EQ(status.unsynced_count, 0); -} diff --git a/chrome/test/test_switches.cc b/chrome/test/test_switches.cc index 9fbf153..3eb1dd2 100644 --- a/chrome/test/test_switches.cc +++ b/chrome/test/test_switches.cc @@ -10,6 +10,9 @@ const char switches::kExtraChromeFlags[] = "extra-chrome-flags"; // Enable displaying error dialogs (for debugging). const char switches::kEnableErrorDialogs[] = "enable-errdialogs"; +// Time (in milliseconds) for which we wait for live operations to complete. +const char switches::kLiveOperationTimeout[] = "live-operation-timeout"; + // Number of iterations that page cycler tests will run. const char switches::kPageCyclerIterations[] = "page-cycler-iterations"; diff --git a/chrome/test/test_switches.h b/chrome/test/test_switches.h index 4497d1a..f8a101f 100644 --- a/chrome/test/test_switches.h +++ b/chrome/test/test_switches.h @@ -11,6 +11,7 @@ namespace switches { // alongside the definition of their values in the .cc file. extern const char kExtraChromeFlags[]; extern const char kEnableErrorDialogs[]; +extern const char kLiveOperationTimeout[]; extern const char kPageCyclerIterations[]; extern const char kUiTestActionTimeout[]; extern const char kUiTestActionMaxTimeout[]; diff --git a/chrome/test/test_timeouts.cc b/chrome/test/test_timeouts.cc index 245f148..8e38da0 100644 --- a/chrome/test/test_timeouts.cc +++ b/chrome/test/test_timeouts.cc @@ -43,6 +43,9 @@ int TestTimeouts::command_execution_timeout_ms_ = 25000; int TestTimeouts::wait_for_terminate_timeout_ms_ = 15000; // static +int TestTimeouts::live_operation_timeout_ms_ = 30000; + +// static void TestTimeouts::Initialize() { if (initialized_) { NOTREACHED(); @@ -64,4 +67,7 @@ void TestTimeouts::Initialize() { &command_execution_timeout_ms_); InitializeTimeout(switches::kUiTestTerminateTimeout, &wait_for_terminate_timeout_ms_); + + InitializeTimeout(switches::kLiveOperationTimeout, + &live_operation_timeout_ms_); } diff --git a/chrome/test/test_timeouts.h b/chrome/test/test_timeouts.h index 8405a51..45034c4 100644 --- a/chrome/test/test_timeouts.h +++ b/chrome/test/test_timeouts.h @@ -45,6 +45,12 @@ class TestTimeouts { return wait_for_terminate_timeout_ms_; } + // Timeout to wait for a live operation to complete. Used by tests that access + // external services. + static int live_operation_timeout_ms() { + return live_operation_timeout_ms_; + } + private: static bool initialized_; @@ -54,6 +60,7 @@ class TestTimeouts { static int sleep_timeout_ms_; static int command_execution_timeout_ms_; static int wait_for_terminate_timeout_ms_; + static int live_operation_timeout_ms_; DISALLOW_IMPLICIT_CONSTRUCTORS(TestTimeouts); }; diff --git a/net/tools/testserver/chromiumsync.py b/net/tools/testserver/chromiumsync.py index a9041f0..c36054c 100755 --- a/net/tools/testserver/chromiumsync.py +++ b/net/tools/testserver/chromiumsync.py @@ -619,19 +619,6 @@ class TestServer(object): # The implementation supports exactly one account; its state is here. self.account = SyncDataModel() self.account_lock = threading.Lock() - self.account_user_email = 'syncjuser@chromium.org' - - def HandleConfigure(self, config): - """Handles various test configuration parameters sent from the client. - - Args: - config: Dictionary of configuration parameters. - Returns: - True if configuration was successful. - """ - if config.has_key('user_email'): - self.account_user_email = config['user_email'][0] - return True def HandleCommand(self, raw_request): """Decode and handle a sync command from a raw input of bytes. @@ -661,7 +648,7 @@ class TestServer(object): print 'Authenticate' # We accept any authentication token, and support only one account. # TODO(nick): Mock out the GAIA authentication as well; hook up here. - response.authenticate.user.email = self.account_user_email + response.authenticate.user.email = 'syncjuser@chromium' response.authenticate.user.display_name = 'Sync J User' elif contents == sync_pb2.ClientToServerMessage.COMMIT: print 'Commit' diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py index 4f30b2c..6ab36df 100644 --- a/net/tools/testserver/testserver.py +++ b/net/tools/testserver/testserver.py @@ -141,7 +141,6 @@ class TestPageHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.WriteFile, self.EchoTitleHandler, self.EchoAllHandler, - self.ChromiumSyncConfigureHandler, self.ChromiumSyncCommandHandler, self.EchoHandler] + self._get_handlers self._put_handlers = [ @@ -1027,29 +1026,6 @@ class TestPageHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.end_headers() return True - def ChromiumSyncConfigureHandler(self): - """Handle updating the configuration of the sync server. - - The name and value pairs of the post payload will update the - configuration of the sync server. Supported tuples are: - user_email,<email address> - Sets the email for the fake user account - """ - test_name = "/chromiumsync/configure" - if not self._ShouldHandleRequest(test_name): - return False - - length = int(self.headers.getheader('content-length')) - raw_request = self.rfile.read(length) - config = cgi.parse_qs(raw_request, keep_blank_values=1) - - success = self._sync_handler.HandleConfigure(config) - if success: - self.send_response(200) - else: - self.send_response(500) - self.end_headers() - return True - def ChromiumSyncCommandHandler(self): """Handle a chromiumsync command arriving via http. |