extension_settings_helper.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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.
4
5#include "chrome/browser/sync/test/integration/extension_settings_helper.h"
6
7#include "base/bind.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/extensions/api/storage/settings_frontend.h"
14#include "chrome/browser/extensions/extension_service.h"
15#include "chrome/browser/profiles/profile.h"
16#include "chrome/browser/sync/test/integration/extensions_helper.h"
17#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
18#include "chrome/browser/sync/test/integration/sync_extension_helper.h"
19#include "chrome/browser/value_store/value_store.h"
20#include "chrome/common/extensions/extension.h"
21#include "chrome/common/extensions/extension_set.h"
22#include "content/public/browser/browser_thread.h"
23
24using content::BrowserThread;
25using sync_datatype_helper::test;
26
27namespace extension_settings_helper {
28
29namespace {
30
31std::string ToJson(const Value& value) {
32  std::string json;
33  base::JSONWriter::WriteWithOptions(&value,
34                                     base::JSONWriter::OPTIONS_PRETTY_PRINT,
35                                     &json);
36  return json;
37}
38
39void GetAllSettingsOnFileThread(DictionaryValue* out,
40                                base::WaitableEvent* signal,
41                                ValueStore* storage) {
42  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
43  out->Swap(&storage->Get()->settings());
44  signal->Signal();
45}
46
47scoped_ptr<DictionaryValue> GetAllSettings(
48    Profile* profile, const std::string& id) {
49  base::WaitableEvent signal(false, false);
50  scoped_ptr<DictionaryValue> settings(new DictionaryValue());
51  profile->GetExtensionService()->settings_frontend()->RunWithStorage(
52      id,
53      extensions::settings_namespace::SYNC,
54      base::Bind(&GetAllSettingsOnFileThread, settings.get(), &signal));
55  signal.Wait();
56  return settings.Pass();
57}
58
59bool AreSettingsSame(Profile* expected_profile, Profile* actual_profile) {
60  const ExtensionSet* extensions =
61      expected_profile->GetExtensionService()->extensions();
62  if (extensions->size() !=
63      actual_profile->GetExtensionService()->extensions()->size()) {
64    ADD_FAILURE();
65    return false;
66  }
67
68  bool same = true;
69  for (ExtensionSet::const_iterator it = extensions->begin();
70      it != extensions->end(); ++it) {
71    const std::string& id = (*it)->id();
72    scoped_ptr<DictionaryValue> expected(GetAllSettings(expected_profile, id));
73    scoped_ptr<DictionaryValue> actual(GetAllSettings(actual_profile, id));
74    if (!expected->Equals(actual.get())) {
75      ADD_FAILURE() <<
76          "Expected " << ToJson(*expected) << " got " << ToJson(*actual);
77      same = false;
78    }
79  }
80  return same;
81}
82
83void SetSettingsOnFileThread(
84    const DictionaryValue* settings,
85    base::WaitableEvent* signal,
86    ValueStore* storage) {
87  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
88  storage->Set(ValueStore::DEFAULTS, *settings);
89  signal->Signal();
90}
91
92}  // namespace
93
94void SetExtensionSettings(
95    Profile* profile, const std::string& id, const DictionaryValue& settings) {
96  base::WaitableEvent signal(false, false);
97  profile->GetExtensionService()->settings_frontend()->RunWithStorage(
98      id,
99      extensions::settings_namespace::SYNC,
100      base::Bind(&SetSettingsOnFileThread, &settings, &signal));
101  signal.Wait();
102}
103
104void SetExtensionSettingsForAllProfiles(
105    const std::string& id, const DictionaryValue& settings) {
106  for (int i = 0; i < test()->num_clients(); ++i)
107    SetExtensionSettings(test()->GetProfile(i), id, settings);
108  SetExtensionSettings(test()->verifier(), id, settings);
109}
110
111bool AllExtensionSettingsSameAsVerifier() {
112  bool all_profiles_same = true;
113  for (int i = 0; i < test()->num_clients(); ++i) {
114    // &= so that all profiles are tested; analogous to EXPECT over ASSERT.
115    all_profiles_same &=
116        AreSettingsSame(test()->verifier(), test()->GetProfile(i));
117  }
118  return all_profiles_same;
119}
120
121}  // namespace extension_settings_helper
122