1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/sync/test/integration/extension_settings_helper.h"
8 #include "base/json/json_writer.h"
9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/synchronization/waitable_event.h"
12 #include "base/values.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/sync/test/integration/extensions_helper.h"
15 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
16 #include "chrome/browser/sync/test/integration/sync_extension_helper.h"
17 #include "content/public/browser/browser_thread.h"
18 #include "extensions/browser/api/storage/storage_frontend.h"
19 #include "extensions/browser/extension_registry.h"
20 #include "extensions/browser/value_store/value_store.h"
21 #include "extensions/common/extension.h"
22 #include "extensions/common/extension_set.h"
24 using content::BrowserThread
;
25 using extensions::ExtensionRegistry
;
26 using sync_datatype_helper::test
;
28 namespace extension_settings_helper
{
32 std::string
ToJson(const base::Value
& value
) {
34 base::JSONWriter::WriteWithOptions(&value
,
35 base::JSONWriter::OPTIONS_PRETTY_PRINT
,
40 void GetAllSettingsOnFileThread(base::DictionaryValue
* out
,
41 base::WaitableEvent
* signal
,
42 ValueStore
* storage
) {
43 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
44 out
->Swap(&storage
->Get()->settings());
48 scoped_ptr
<base::DictionaryValue
> GetAllSettings(
49 Profile
* profile
, const std::string
& id
) {
50 base::WaitableEvent
signal(false, false);
51 scoped_ptr
<base::DictionaryValue
> settings(new base::DictionaryValue());
52 extensions::StorageFrontend::Get(profile
)->RunWithStorage(
53 ExtensionRegistry::Get(profile
)->enabled_extensions().GetByID(id
),
54 extensions::settings_namespace::SYNC
,
55 base::Bind(&GetAllSettingsOnFileThread
, settings
.get(), &signal
));
57 return settings
.Pass();
60 bool AreSettingsSame(Profile
* expected_profile
, Profile
* actual_profile
) {
61 const extensions::ExtensionSet
& extensions
=
62 ExtensionRegistry::Get(expected_profile
)->enabled_extensions();
63 if (extensions
.size() !=
64 ExtensionRegistry::Get(actual_profile
)->enabled_extensions().size()) {
70 for (extensions::ExtensionSet::const_iterator it
= extensions
.begin();
71 it
!= extensions
.end();
73 const std::string
& id
= (*it
)->id();
74 scoped_ptr
<base::DictionaryValue
> expected(
75 GetAllSettings(expected_profile
, id
));
76 scoped_ptr
<base::DictionaryValue
> actual(
77 GetAllSettings(actual_profile
, id
));
78 if (!expected
->Equals(actual
.get())) {
80 "Expected " << ToJson(*expected
) << " got " << ToJson(*actual
);
87 void SetSettingsOnFileThread(
88 const base::DictionaryValue
* settings
,
89 base::WaitableEvent
* signal
,
90 ValueStore
* storage
) {
91 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
92 storage
->Set(ValueStore::DEFAULTS
, *settings
);
98 void SetExtensionSettings(
100 const std::string
& id
,
101 const base::DictionaryValue
& settings
) {
102 base::WaitableEvent
signal(false, false);
103 extensions::StorageFrontend::Get(profile
)->RunWithStorage(
104 ExtensionRegistry::Get(profile
)->enabled_extensions().GetByID(id
),
105 extensions::settings_namespace::SYNC
,
106 base::Bind(&SetSettingsOnFileThread
, &settings
, &signal
));
110 void SetExtensionSettingsForAllProfiles(
111 const std::string
& id
, const base::DictionaryValue
& settings
) {
112 for (int i
= 0; i
< test()->num_clients(); ++i
)
113 SetExtensionSettings(test()->GetProfile(i
), id
, settings
);
114 SetExtensionSettings(test()->verifier(), id
, settings
);
117 bool AllExtensionSettingsSameAsVerifier() {
118 bool all_profiles_same
= true;
119 for (int i
= 0; i
< test()->num_clients(); ++i
) {
120 // &= so that all profiles are tested; analogous to EXPECT over ASSERT.
122 AreSettingsSame(test()->verifier(), test()->GetProfile(i
));
124 return all_profiles_same
;
127 } // namespace extension_settings_helper