15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/pref_store_observer_mock.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_pref_value_map.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExt1[] = "ext1";
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExt2[] = "ext2";
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExt3[] = "ext3";
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPref1[] = "path1.subpath";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPref2[] = "path2";
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPref3[] = "path3";
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPref4[] = "path4";
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static base::Value* CreateVal(const char* str) {
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return new base::StringValue(str);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::Time CreateTime(int64 t) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Time::FromInternalValue(t);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename BASECLASS>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefValueMapTestBase : public BASECLASS {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const extensions::ExtensionPrefsScope kRegular =
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::kExtensionPrefsScopeRegular;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const extensions::ExtensionPrefsScope kRegularOnly =
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::kExtensionPrefsScopeRegularOnly;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const extensions::ExtensionPrefsScope kIncognitoPersistent =
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::kExtensionPrefsScopeIncognitoPersistent;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const extensions::ExtensionPrefsScope kIncognitoSessionOnly =
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::kExtensionPrefsScopeIncognitoSessionOnly;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns an empty string if the key is not set.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetValue(const char * key, bool incognito) const {
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::Value *value =
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        epvm_.GetEffectivePrefValue(key, incognito, NULL);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string string_value;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value->GetAsString(&string_value);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return string_value;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Registers the extension as enabled but without incognito permission.
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void RegisterExtension(const std::string& ext_id,
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                         const base::Time& install_time) {
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    epvm_.RegisterExtension(
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ext_id, install_time, true /*enabled*/, false /*incognito*/);
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionPrefValueMap epvm_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefValueMapTest
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ExtensionPrefValueMapTestBase<testing::Test> {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A gmock-ified implementation of PrefStore::Observer.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefValueMapObserverMock
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ExtensionPrefValueMap::Observer {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionPrefValueMapObserverMock() {}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionPrefValueMapObserverMock() {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnPrefValueChanged, void(const std::string&));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OnInitializationCompleted, void());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OnExtensionPrefValueMapDestruction, void());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionPrefValueMapObserverMock);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, SetAndGetPrefValue) {
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val1", GetValue(kPref1, false));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, GetNotSetPrefValue) {
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(std::string(), GetValue(kPref1, false));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure the last-installed extension wins for each preference.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, Override) {
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt2, CreateTime(20));
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt3, CreateTime(30));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2"));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3"));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4"));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val5"));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val6"));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val7"));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref3, kRegular, CreateVal("val8"));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val3", GetValue(kPref1, false));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val5", GetValue(kPref2, false));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val8", GetValue(kPref3, false));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, OverrideChecks) {
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt2, CreateTime(20));
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt3, CreateTime(30));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt1, kPref1, NULL));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt2, kPref1, NULL));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt3, kPref1, NULL));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt1, kPref1, false));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt2, kPref1, false));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt3, kPref1, false));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val1"));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt1, kPref1, NULL));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(epvm_.DoesExtensionControlPref(kExt2, kPref1, NULL));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(epvm_.DoesExtensionControlPref(kExt3, kPref1, NULL));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(epvm_.CanExtensionControlPref(kExt1, kPref1, false));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt2, kPref1, false));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(epvm_.CanExtensionControlPref(kExt3, kPref1, false));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, SetAndGetPrefValueIncognito) {
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Check that the value is not propagated until the extension gets incognito
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // permission.
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(std::string(), GetValue(kPref1, true));
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  epvm_.SetExtensionIncognitoState(kExt1, true);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val1", GetValue(kPref1, true));
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  epvm_.SetExtensionIncognitoState(kExt1, false);
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(std::string(), GetValue(kPref1, true));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, UninstallOnlyExtension) {
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.UnregisterExtension(kExt1);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(std::string(), GetValue(kPref1, false));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests uninstalling an extension that wasn't winning for any preferences.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, UninstallIrrelevantExtension) {
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt2, CreateTime(10));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2"));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val3"));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val4"));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.UnregisterExtension(kExt1);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val2", GetValue(kPref1, false));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val4", GetValue(kPref2, false));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests uninstalling an extension that was winning for all preferences.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, UninstallExtensionFromTop) {
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt2, CreateTime(20));
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt3, CreateTime(30));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2"));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3"));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4"));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt3, kPref2, kRegular, CreateVal("val5"));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.UnregisterExtension(kExt3);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val2", GetValue(kPref1, false));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val4", GetValue(kPref2, false));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests uninstalling an extension that was winning for only some preferences.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, UninstallExtensionFromMiddle) {
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt2, CreateTime(20));
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt3, CreateTime(30));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref1, kRegular, CreateVal("val2"));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt3, kPref1, kRegular, CreateVal("val3"));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref2, kRegular, CreateVal("val4"));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref2, kRegular, CreateVal("val5"));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref3, kRegular, CreateVal("val6"));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt2, kPref4, kRegular, CreateVal("val7"));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.UnregisterExtension(kExt2);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val3", GetValue(kPref1, false));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val4", GetValue(kPref2, false));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val6", GetValue(kPref3, false));
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(std::string(), GetValue(kPref4, false));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests triggering of notifications to registered observers.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, NotifyWhenNeeded) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using testing::Mock;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using testing::StrEq;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionPrefValueMapObserverMock observer;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.AddObserver(&observer);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write the same value again.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))).Times(0);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override incognito value.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val2"));
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override non-incognito value.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val3"));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionState(kExt1, false);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionState(kExt1, true);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1)));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.UnregisterExtension(kExt1);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.RemoveObserver(&observer);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write new value --> no notification after removing observer.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnPrefValueChanged(std::string(kPref1))).Times(0);
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val4"));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests disabling an extension.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, DisableExt) {
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionState(kExt1, false);
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(std::string(), GetValue(kPref1, false));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests disabling and reenabling an extension.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionPrefValueMapTest, ReenableExt) {
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RegisterExtension(kExt1, CreateTime(10));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionPref(kExt1, kPref1, kRegular, CreateVal("val1"));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionState(kExt1, false);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.SetExtensionState(kExt1, true);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("val1", GetValue(kPref1, false));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct OverrideIncognitoTestCase {
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  OverrideIncognitoTestCase(bool enable_ext1_in_incognito,
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            bool enable_ext2_in_incognito,
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            int val_ext1_regular,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int val_ext1_regular_only,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int val_ext1_incognito_pers,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int val_ext1_incognito_sess,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int val_ext2_regular,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int val_ext2_regular_only,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int val_ext2_incognito_pers,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int val_ext2_incognito_sess,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int effective_value_regular,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int effective_value_incognito)
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : enable_ext1_in_incognito_(enable_ext1_in_incognito),
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        enable_ext2_in_incognito_(enable_ext2_in_incognito),
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        val_ext1_regular_(val_ext1_regular),
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        val_ext1_regular_only_(val_ext1_regular_only),
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        val_ext1_incognito_pers_(val_ext1_incognito_pers),
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        val_ext1_incognito_sess_(val_ext1_incognito_sess),
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        val_ext2_regular_(val_ext2_regular),
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        val_ext2_regular_only_(val_ext2_regular_only),
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        val_ext2_incognito_pers_(val_ext2_incognito_pers),
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        val_ext2_incognito_sess_(val_ext2_incognito_sess),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        effective_value_regular_(effective_value_regular),
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        effective_value_incognito_(effective_value_incognito) {}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool enable_ext1_in_incognito_;
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool enable_ext2_in_incognito_;
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pers. = persistent
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sess. = session only
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val_ext1_regular_;           // pref value of extension 1
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val_ext1_regular_only_;      // pref value of extension 1 regular-only.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val_ext1_incognito_pers_;    // pref value of extension 1 incognito pers.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val_ext1_incognito_sess_;    // pref value of extension 1 incognito sess.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val_ext2_regular_;           // pref value of extension 2
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val_ext2_regular_only_;      // pref value of extension 2 regular-only.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val_ext2_incognito_pers_;    // pref value of extension 2 incognito pers.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int val_ext2_incognito_sess_;    // pref value of extension 2 incognito sess.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int effective_value_regular_;    // desired winner regular
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int effective_value_incognito_;  // desired winner incognito
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefValueMapTestIncognitoTests
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ExtensionPrefValueMapTestBase<
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          testing::TestWithParam<OverrideIncognitoTestCase> > {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_P(ExtensionPrefValueMapTestIncognitoTests, OverrideIncognito) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OverrideIncognitoTestCase test = GetParam();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* strings[] = {
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "",  // undefined
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "val1",
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "val2",
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "val3",
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "val4",
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "val5",
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "val6",
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "val7",
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "val8",
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const bool kEnabled = true;
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  epvm_.RegisterExtension(
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      kExt1, CreateTime(10), kEnabled, test.enable_ext1_in_incognito_);
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  epvm_.RegisterExtension(
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      kExt2, CreateTime(20), kEnabled, test.enable_ext2_in_incognito_);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test.val_ext1_regular_) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    epvm_.SetExtensionPref(kExt1, kPref1, kRegular,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CreateVal(strings[test.val_ext1_regular_]));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test.val_ext1_regular_only_) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    epvm_.SetExtensionPref(kExt1, kPref1, kRegularOnly,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CreateVal(strings[test.val_ext1_regular_only_]));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test.val_ext1_incognito_pers_) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    epvm_.SetExtensionPref(kExt1, kPref1, kIncognitoPersistent,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CreateVal(strings[test.val_ext1_incognito_pers_]));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test.val_ext1_incognito_sess_) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    epvm_.SetExtensionPref(kExt1, kPref1, kIncognitoSessionOnly,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CreateVal(strings[test.val_ext1_incognito_sess_]));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test.val_ext2_regular_) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    epvm_.SetExtensionPref(kExt2, kPref1, kRegular,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CreateVal(strings[test.val_ext2_regular_]));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test.val_ext2_regular_only_) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    epvm_.SetExtensionPref(kExt2, kPref1, kRegularOnly,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CreateVal(strings[test.val_ext2_regular_only_]));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test.val_ext2_incognito_pers_) {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    epvm_.SetExtensionPref(kExt2, kPref1, kIncognitoPersistent,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CreateVal(strings[test.val_ext2_incognito_pers_]));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (test.val_ext2_incognito_sess_) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    epvm_.SetExtensionPref(kExt2, kPref1, kIncognitoSessionOnly,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           CreateVal(strings[test.val_ext2_incognito_sess_]));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string actual;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(strings[test.effective_value_regular_], GetValue(kPref1, false));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(strings[test.effective_value_incognito_], GetValue(kPref1, true));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.UnregisterExtension(kExt1);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  epvm_.UnregisterExtension(kExt2);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionPrefValueMapTestIncognitoTestsInstance,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionPrefValueMapTestIncognitoTests,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Values(
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // e.g. (true, 1, 0, 0, 0,  0, 0, 7, 0,  1, 7), means:
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // ext1 regular is set to "val1", ext2 incognito persistent is set to
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // "val7"
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // --> the winning regular value is "val1", the winning incognito
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        //     value is "val7".
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 0, 0,  0, 0, 0, 0,  1, 1),
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 2, 0, 0,  0, 0, 0, 0,  2, 1),
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 3, 0,  0, 0, 0, 0,  1, 3),
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 0, 4,  0, 0, 0, 0,  1, 4),
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 3, 4,  0, 0, 0, 0,  1, 4),
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 2, 3, 0,  0, 0, 0, 0,  2, 3),
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 0, 0,  5, 0, 0, 0,  5, 5),
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 2, 3, 0,  5, 0, 0, 0,  5, 5),
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 0, 0,  0, 6, 0, 0,  6, 1),
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 3, 0,  5, 6, 0, 0,  6, 5),
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 0, 4,  5, 6, 0, 0,  6, 5),
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 0, 0, 0,  0, 0, 7, 0,  1, 7),
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 2, 0, 0,  5, 0, 7, 0,  5, 7),
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 2, 0, 0,  5, 0, 0, 8,  5, 8),
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 2, 0, 0,  5, 0, 7, 8,  5, 8),
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(true, true, 1, 2, 3, 0,  0, 6, 7, 0,  6, 7),
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        // Same tests as above but w/o incognito permission.
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 0, 0,  0, 0, 0, 0,  1, 0),
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 2, 0, 0,  0, 0, 0, 0,  2, 0),
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 3, 0,  0, 0, 0, 0,  1, 0),
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 0, 4,  0, 0, 0, 0,  1, 0),
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 3, 4,  0, 0, 0, 0,  1, 0),
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 2, 3, 0,  0, 0, 0, 0,  2, 0),
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 0, 0,  5, 0, 0, 0,  5, 0),
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 2, 3, 0,  5, 0, 0, 0,  5, 0),
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 0, 0,  0, 6, 0, 0,  6, 0),
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 3, 0,  5, 6, 0, 0,  6, 0),
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 0, 4,  5, 6, 0, 0,  6, 0),
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 0, 0, 0,  0, 0, 7, 0,  1, 0),
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 2, 0, 0,  5, 0, 7, 0,  5, 0),
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 2, 0, 0,  5, 0, 0, 8,  5, 0),
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 2, 0, 0,  5, 0, 7, 8,  5, 0),
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        OverrideIncognitoTestCase(false, false, 1, 2, 3, 0,  0, 6, 7, 0,  6, 0)
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ));
442