Index: chrome/browser/extensions/api/preferences_private/preferences_private_apitest.cc |
diff --git a/chrome/browser/extensions/api/preferences_private/preferences_private_apitest.cc b/chrome/browser/extensions/api/preferences_private/preferences_private_apitest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..28edadb153c13bf8e66f92190a85496c971114b1 |
--- /dev/null |
+++ b/chrome/browser/extensions/api/preferences_private/preferences_private_apitest.cc |
@@ -0,0 +1,124 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/basictypes.h" |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/message_loop/message_loop.h" |
+#include "chrome/browser/extensions/extension_apitest.h" |
+#include "chrome/browser/extensions/extension_test_message_listener.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
+#include "chrome/browser/sync/profile_sync_service.h" |
+#include "chrome/browser/sync/profile_sync_service_factory.h" |
+#include "content/public/browser/browser_context.h" |
+ |
+namespace { |
+ |
+class FakeProfileSyncService : public ProfileSyncService { |
+ public: |
+ explicit FakeProfileSyncService(Profile* profile) |
+ : ProfileSyncService( |
+ NULL, |
+ profile, |
+ NULL, |
+ ProfileOAuth2TokenServiceFactory::GetForProfile(profile), |
+ ProfileSyncService::MANUAL_START), |
+ sync_initialized_(true), |
+ initialized_state_violation_(false) {} |
+ |
+ virtual ~FakeProfileSyncService() {} |
+ |
+ static BrowserContextKeyedService* BuildFakeProfileSyncService( |
+ content::BrowserContext* context) { |
+ return new FakeProfileSyncService(static_cast<Profile*>(context)); |
+ } |
+ |
+ void set_sync_initialized(bool sync_initialized) { |
+ sync_initialized_ = sync_initialized; |
+ } |
+ |
+ bool initialized_state_violation() { return initialized_state_violation_; } |
+ |
+ // ProfileSyncService: |
+ virtual bool sync_initialized() const OVERRIDE { |
+ return sync_initialized_; |
+ } |
+ |
+ virtual void AddObserver( |
+ ProfileSyncServiceBase::Observer* observer) OVERRIDE { |
+ if (sync_initialized_) |
+ initialized_state_violation_ = true; |
+ // Set sync initialized state to true so the function will run after |
+ // OnStateChanged is called. |
+ sync_initialized_ = true; |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ProfileSyncServiceBase::Observer::OnStateChanged, |
+ base::Unretained(observer))); |
+ } |
+ |
+ virtual syncer::ModelTypeSet GetEncryptedDataTypes() const OVERRIDE { |
+ if (!sync_initialized_) |
+ initialized_state_violation_ = true; |
+ syncer::ModelTypeSet type_set; |
+ type_set.Put(syncer::AUTOFILL); |
+ return type_set; |
+ } |
+ |
+ virtual syncer::ModelTypeSet GetPreferredDataTypes() const OVERRIDE { |
+ if (!sync_initialized_) |
+ initialized_state_violation_ = true; |
+ syncer::ModelTypeSet preferred_types = |
+ syncer::UserSelectableTypes(); |
+ preferred_types.Remove(syncer::TYPED_URLS); |
+ return preferred_types; |
+ } |
+ |
+ private: |
+ bool sync_initialized_; |
+ // Set to true if a function is called when sync_initialized is in an |
+ // unexpected state. |
+ mutable bool initialized_state_violation_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeProfileSyncService); |
+}; |
+ |
+class PreferencesPrivateApiTest : public ExtensionApiTest { |
+ public: |
+ PreferencesPrivateApiTest() : service_(NULL) {} |
+ virtual ~PreferencesPrivateApiTest() {} |
+ |
+ virtual void SetUpOnMainThread() OVERRIDE { |
+ ExtensionApiTest::SetUpOnMainThread(); |
+ service_ = static_cast<FakeProfileSyncService*>( |
+ ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse( |
+ profile(), &FakeProfileSyncService::BuildFakeProfileSyncService)); |
+ browser_sync::SyncPrefs sync_prefs(profile()->GetPrefs()); |
+ sync_prefs.SetKeepEverythingSynced(false); |
+ } |
+ |
+ FakeProfileSyncService* service() { return service_; } |
+ |
+ private: |
+ FakeProfileSyncService* service_; |
+ DISALLOW_COPY_AND_ASSIGN(PreferencesPrivateApiTest); |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(PreferencesPrivateApiTest, |
+ GetSyncCategoriesWithoutPassphraseSynchronous) { |
+ ASSERT_TRUE(RunComponentExtensionTest("preferences_private")) << message_; |
+ EXPECT_FALSE(service()->initialized_state_violation()); |
+} |
+ |
+// Verifies that we wait for the sync service to be ready before checking |
+// encryption status. |
+IN_PROC_BROWSER_TEST_F(PreferencesPrivateApiTest, |
+ GetSyncCategoriesWithoutPassphraseAsynchronous) { |
+ service()->set_sync_initialized(false); |
+ ASSERT_TRUE(RunComponentExtensionTest("preferences_private")) << message_; |
+ EXPECT_FALSE(service()->initialized_state_violation()); |
+} |
+ |
+} // namespace |