OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/extension_settings_storage_unittest.h" | 5 #include "chrome/browser/extensions/extension_settings_storage_unittest.h" |
6 | 6 |
7 #include "base/json/json_writer.h" | 7 #include "base/json/json_writer.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... |
26 string.append(", "); | 26 string.append(", "); |
27 } | 27 } |
28 string.append(*it); | 28 string.append(*it); |
29 } | 29 } |
30 string.append("}"); | 30 string.append("}"); |
31 return string; | 31 return string; |
32 } | 32 } |
33 | 33 |
34 } // namespace | 34 } // namespace |
35 | 35 |
| 36 // Compares two possibly NULL values for equality, filling |error| with an |
| 37 // appropriate error message if they're different. |
| 38 bool ValuesEqual(Value* expected, Value* actual, std::string* error) { |
| 39 if (expected == actual) { |
| 40 return true; |
| 41 } |
| 42 if (expected && !actual) { |
| 43 *error = "Expected: " + GetJSON(*expected) + ", actual: NULL"; |
| 44 return false; |
| 45 } |
| 46 if (actual && !expected) { |
| 47 *error = "Expected: NULL, actual: " + GetJSON(*actual); |
| 48 return false; |
| 49 } |
| 50 if (!expected->Equals(actual)) { |
| 51 *error = |
| 52 "Expected: " + GetJSON(*expected) + ", actual: " + GetJSON(*actual); |
| 53 return false; |
| 54 } |
| 55 return true; |
| 56 } |
| 57 |
36 // Returns whether the result of a storage operation has the expected settings | 58 // Returns whether the result of a storage operation has the expected settings |
37 // and changed keys. | 59 // and changed keys. |
38 testing::AssertionResult SettingsEq( | 60 testing::AssertionResult SettingsEq( |
39 const char* _1, const char* _2, const char* _3, | 61 const char* _1, const char* _2, const char* _3, const char* _4, |
40 DictionaryValue* expected_settings, | 62 DictionaryValue* expected_settings, |
| 63 DictionaryValue* expected_old_settings, |
41 std::set<std::string>* expected_changed_keys, | 64 std::set<std::string>* expected_changed_keys, |
42 ExtensionSettingsStorage::Result actual) { | 65 ExtensionSettingsStorage::Result actual) { |
| 66 std::string error; |
| 67 |
43 if (actual.HasError()) { | 68 if (actual.HasError()) { |
44 return testing::AssertionFailure() << | 69 return testing::AssertionFailure() << |
45 "Expected: " << GetJSON(*expected_settings) << | 70 "Expected: " << GetJSON(*expected_settings) << |
46 ", " << ToString(*expected_changed_keys) << "\n" << | 71 ", " << ToString(*expected_changed_keys) << "\n" << |
47 ", actual has error: " << actual.GetError(); | 72 ", actual has error: " << actual.GetError(); |
48 } | 73 } |
49 if (expected_settings == NULL && actual.GetSettings() != NULL) { | 74 |
50 return testing::AssertionFailure() << | 75 if (!ValuesEqual(expected_settings, actual.GetSettings(), &error)) { |
51 "Expected NULL settings, actual: " << GetJSON(*actual.GetSettings()); | 76 return testing::AssertionFailure() << "For settings, " << error; |
52 } | 77 } |
53 if (expected_changed_keys == NULL && actual.GetChangedKeys() != NULL) { | 78 |
| 79 if (!expected_changed_keys && actual.GetChangedKeys()) { |
54 return testing::AssertionFailure() << | 80 return testing::AssertionFailure() << |
55 "Expected NULL changed keys, actual: " << | 81 "Expected NULL changed keys, actual: " << |
56 ToString(*actual.GetChangedKeys()); | 82 ToString(*actual.GetChangedKeys()); |
57 } | 83 } |
58 if (expected_settings != NULL && actual.GetSettings() == NULL) { | 84 if (expected_changed_keys && !actual.GetChangedKeys()) { |
59 return testing::AssertionFailure() << | |
60 "Expected: " << GetJSON(*expected_settings) << ", actual NULL"; | |
61 } | |
62 if (expected_changed_keys != NULL && actual.GetChangedKeys() == NULL) { | |
63 return testing::AssertionFailure() << | 85 return testing::AssertionFailure() << |
64 "Expected: " << ToString(*expected_changed_keys) << ", actual NULL"; | 86 "Expected: " << ToString(*expected_changed_keys) << ", actual NULL"; |
65 } | 87 } |
66 if (expected_settings != actual.GetSettings() && | |
67 !expected_settings->Equals(actual.GetSettings())) { | |
68 return testing::AssertionFailure() << | |
69 "Expected: " << GetJSON(*expected_settings) << | |
70 ", actual: " << GetJSON(*actual.GetSettings()); | |
71 } | |
72 if (expected_changed_keys != actual.GetChangedKeys() && | 88 if (expected_changed_keys != actual.GetChangedKeys() && |
73 *expected_changed_keys != *actual.GetChangedKeys()) { | 89 *expected_changed_keys != *actual.GetChangedKeys()) { |
74 return testing::AssertionFailure() << | 90 return testing::AssertionFailure() << |
75 "Expected: " << ToString(*expected_changed_keys) << | 91 "Expected: " << ToString(*expected_changed_keys) << |
76 ", actual: " << ToString(*actual.GetChangedKeys()); | 92 ", actual: " << ToString(*actual.GetChangedKeys()); |
77 } | 93 } |
| 94 |
| 95 std::set<std::string>* changed_keys = actual.GetChangedKeys(); |
| 96 if (changed_keys) { |
| 97 for (std::set<std::string>::iterator it = changed_keys->begin(); |
| 98 it != changed_keys->end(); ++it) { |
| 99 Value *expected_old_value = NULL; |
| 100 expected_old_settings->GetWithoutPathExpansion(*it, &expected_old_value); |
| 101 Value *actual_old_value = NULL; |
| 102 actual.GetOldValue(*it, &actual_old_value); |
| 103 if (!ValuesEqual(expected_old_value, actual_old_value, &error)) { |
| 104 return testing::AssertionFailure() << "Old values not equal: " << error; |
| 105 } |
| 106 |
| 107 Value *expected_new_value = NULL; |
| 108 if (expected_settings) { |
| 109 expected_settings->GetWithoutPathExpansion(*it, &expected_new_value); |
| 110 } |
| 111 Value *actual_new_value = NULL; |
| 112 actual.GetNewValue(*it, &actual_new_value); |
| 113 if (!ValuesEqual(expected_new_value, actual_new_value, &error)) { |
| 114 return testing::AssertionFailure() << "New values not equal: " << error; |
| 115 } |
| 116 } |
| 117 } |
| 118 |
78 return testing::AssertionSuccess(); | 119 return testing::AssertionSuccess(); |
79 } | 120 } |
80 | 121 |
81 ExtensionSettingsStorageTest::ExtensionSettingsStorageTest() | 122 ExtensionSettingsStorageTest::ExtensionSettingsStorageTest() |
82 : key1_("foo"), | 123 : key1_("foo"), |
83 key2_("bar"), | 124 key2_("bar"), |
84 key3_("baz"), | 125 key3_("baz"), |
85 empty_dict_(new DictionaryValue), | 126 empty_dict_(new DictionaryValue()), |
86 dict1_(new DictionaryValue), | 127 dict1_(new DictionaryValue()), |
87 dict12_(new DictionaryValue), | 128 dict3_(new DictionaryValue()), |
88 dict123_(new DictionaryValue), | 129 dict12_(new DictionaryValue()), |
| 130 dict123_(new DictionaryValue()), |
89 ui_thread_(BrowserThread::UI, MessageLoop::current()), | 131 ui_thread_(BrowserThread::UI, MessageLoop::current()), |
90 file_thread_(BrowserThread::FILE, MessageLoop::current()) { | 132 file_thread_(BrowserThread::FILE, MessageLoop::current()) { |
91 val1_.reset(Value::CreateStringValue(key1_ + "Value")); | 133 val1_.reset(Value::CreateStringValue(key1_ + "Value")); |
92 val2_.reset(Value::CreateStringValue(key2_ + "Value")); | 134 val2_.reset(Value::CreateStringValue(key2_ + "Value")); |
93 val3_.reset(Value::CreateStringValue(key3_ + "Value")); | 135 val3_.reset(Value::CreateStringValue(key3_ + "Value")); |
94 | 136 |
95 list1_.push_back(key1_); | 137 list1_.push_back(key1_); |
96 list2_.push_back(key2_); | 138 list2_.push_back(key2_); |
97 list3_.push_back(key3_); | 139 list3_.push_back(key3_); |
98 list12_.push_back(key1_); | 140 list12_.push_back(key1_); |
99 list12_.push_back(key2_); | 141 list12_.push_back(key2_); |
100 list13_.push_back(key1_); | 142 list13_.push_back(key1_); |
101 list13_.push_back(key3_); | 143 list13_.push_back(key3_); |
102 list123_.push_back(key1_); | 144 list123_.push_back(key1_); |
103 list123_.push_back(key2_); | 145 list123_.push_back(key2_); |
104 list123_.push_back(key3_); | 146 list123_.push_back(key3_); |
105 | 147 |
106 set1_.insert(list1_.begin(), list1_.end()); | 148 set1_.insert(list1_.begin(), list1_.end()); |
107 set2_.insert(list2_.begin(), list2_.end()); | 149 set2_.insert(list2_.begin(), list2_.end()); |
108 set3_.insert(list3_.begin(), list3_.end()); | 150 set3_.insert(list3_.begin(), list3_.end()); |
109 set12_.insert(list12_.begin(), list12_.end()); | 151 set12_.insert(list12_.begin(), list12_.end()); |
110 set13_.insert(list13_.begin(), list13_.end()); | 152 set13_.insert(list13_.begin(), list13_.end()); |
111 set123_.insert(list123_.begin(), list123_.end()); | 153 set123_.insert(list123_.begin(), list123_.end()); |
112 | 154 |
113 dict1_->Set(key1_, val1_->DeepCopy()); | 155 dict1_->Set(key1_, val1_->DeepCopy()); |
| 156 dict3_->Set(key3_, val3_->DeepCopy()); |
114 dict12_->Set(key1_, val1_->DeepCopy()); | 157 dict12_->Set(key1_, val1_->DeepCopy()); |
115 dict12_->Set(key2_, val2_->DeepCopy()); | 158 dict12_->Set(key2_, val2_->DeepCopy()); |
116 dict123_->Set(key1_, val1_->DeepCopy()); | 159 dict123_->Set(key1_, val1_->DeepCopy()); |
117 dict123_->Set(key2_, val2_->DeepCopy()); | 160 dict123_->Set(key2_, val2_->DeepCopy()); |
118 dict123_->Set(key3_, val3_->DeepCopy()); | 161 dict123_->Set(key3_, val3_->DeepCopy()); |
119 } | 162 } |
120 | 163 |
121 ExtensionSettingsStorageTest::~ExtensionSettingsStorageTest() {} | 164 ExtensionSettingsStorageTest::~ExtensionSettingsStorageTest() {} |
122 | 165 |
123 void ExtensionSettingsStorageTest::SetUp() { | 166 void ExtensionSettingsStorageTest::SetUp() { |
124 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 167 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
125 storage_.reset((GetParam())(temp_dir_.path(), "fakeExtension")); | 168 storage_.reset((GetParam())(temp_dir_.path(), "fakeExtension")); |
126 ASSERT_TRUE(storage_.get()); | 169 ASSERT_TRUE(storage_.get()); |
127 } | 170 } |
128 | 171 |
129 void ExtensionSettingsStorageTest::TearDown() { | 172 void ExtensionSettingsStorageTest::TearDown() { |
130 storage_.reset(); | 173 storage_.reset(); |
131 } | 174 } |
132 | 175 |
133 TEST_P(ExtensionSettingsStorageTest, GetWhenEmpty) { | 176 TEST_P(ExtensionSettingsStorageTest, GetWhenEmpty) { |
134 EXPECT_PRED_FORMAT3(SettingsEq, | 177 EXPECT_PRED_FORMAT4(SettingsEq, |
135 empty_dict_.get(), NULL, storage_->Get(key1_)); | 178 empty_dict_.get(), NULL, NULL, storage_->Get(key1_)); |
136 EXPECT_PRED_FORMAT3(SettingsEq, | 179 EXPECT_PRED_FORMAT4(SettingsEq, |
137 empty_dict_.get(), NULL, storage_->Get(empty_list_)); | 180 empty_dict_.get(), NULL, NULL, storage_->Get(empty_list_)); |
138 EXPECT_PRED_FORMAT3(SettingsEq, | 181 EXPECT_PRED_FORMAT4(SettingsEq, |
139 empty_dict_.get(), NULL, storage_->Get(list123_)); | 182 empty_dict_.get(), NULL, NULL, storage_->Get(list123_)); |
140 EXPECT_PRED_FORMAT3(SettingsEq, | 183 EXPECT_PRED_FORMAT4(SettingsEq, |
141 empty_dict_.get(), NULL, storage_->Get()); | 184 empty_dict_.get(), NULL, NULL, storage_->Get()); |
142 } | 185 } |
143 | 186 |
144 TEST_P(ExtensionSettingsStorageTest, GetWithSingleValue) { | 187 TEST_P(ExtensionSettingsStorageTest, GetWithSingleValue) { |
145 EXPECT_PRED_FORMAT3(SettingsEq, | 188 EXPECT_PRED_FORMAT4(SettingsEq, |
146 dict1_.get(), &set1_, storage_->Set(key1_, *val1_)); | 189 dict1_.get(), empty_dict_.get(), &set1_, storage_->Set(key1_, *val1_)); |
147 | 190 |
148 EXPECT_PRED_FORMAT3(SettingsEq, | 191 EXPECT_PRED_FORMAT4(SettingsEq, |
149 dict1_.get(), NULL, storage_->Get(key1_)); | 192 dict1_.get(), NULL, NULL, storage_->Get(key1_)); |
150 EXPECT_PRED_FORMAT3(SettingsEq, | 193 EXPECT_PRED_FORMAT4(SettingsEq, |
151 empty_dict_.get(), NULL, storage_->Get(key2_)); | 194 empty_dict_.get(), NULL, NULL, storage_->Get(key2_)); |
152 EXPECT_PRED_FORMAT3(SettingsEq, | 195 EXPECT_PRED_FORMAT4(SettingsEq, |
153 empty_dict_.get(), NULL, storage_->Get(key3_)); | 196 empty_dict_.get(), NULL, NULL, storage_->Get(key3_)); |
154 EXPECT_PRED_FORMAT3(SettingsEq, | 197 EXPECT_PRED_FORMAT4(SettingsEq, |
155 empty_dict_.get(), NULL, storage_->Get(empty_list_)); | 198 empty_dict_.get(), NULL, NULL, storage_->Get(empty_list_)); |
156 EXPECT_PRED_FORMAT3(SettingsEq, | 199 EXPECT_PRED_FORMAT4(SettingsEq, |
157 dict1_.get(), NULL, storage_->Get(list123_)); | 200 dict1_.get(), NULL, NULL, storage_->Get(list123_)); |
158 EXPECT_PRED_FORMAT3(SettingsEq, | 201 EXPECT_PRED_FORMAT4(SettingsEq, |
159 dict1_.get(), NULL, storage_->Get()); | 202 dict1_.get(), NULL, NULL, storage_->Get()); |
160 } | 203 } |
161 | 204 |
162 TEST_P(ExtensionSettingsStorageTest, GetWithMultipleValues) { | 205 TEST_P(ExtensionSettingsStorageTest, GetWithMultipleValues) { |
163 EXPECT_PRED_FORMAT3(SettingsEq, | 206 EXPECT_PRED_FORMAT4(SettingsEq, |
164 dict12_.get(), &set12_, storage_->Set(*dict12_)); | 207 dict12_.get(), empty_dict_.get(), &set12_, storage_->Set(*dict12_)); |
165 | 208 |
166 EXPECT_PRED_FORMAT3(SettingsEq, | 209 EXPECT_PRED_FORMAT4(SettingsEq, |
167 dict1_.get(), NULL, storage_->Get(key1_)); | 210 dict1_.get(), NULL, NULL, storage_->Get(key1_)); |
168 EXPECT_PRED_FORMAT3(SettingsEq, | 211 EXPECT_PRED_FORMAT4(SettingsEq, |
169 empty_dict_.get(), NULL, storage_->Get(key3_)); | 212 empty_dict_.get(), NULL, NULL, storage_->Get(key3_)); |
170 EXPECT_PRED_FORMAT3(SettingsEq, | 213 EXPECT_PRED_FORMAT4(SettingsEq, |
171 empty_dict_.get(), NULL, storage_->Get(empty_list_)); | 214 empty_dict_.get(), NULL, NULL, storage_->Get(empty_list_)); |
172 EXPECT_PRED_FORMAT3(SettingsEq, | 215 EXPECT_PRED_FORMAT4(SettingsEq, |
173 dict12_.get(), NULL, storage_->Get(list123_)); | 216 dict12_.get(), NULL, NULL, storage_->Get(list123_)); |
174 EXPECT_PRED_FORMAT3(SettingsEq, | 217 EXPECT_PRED_FORMAT4(SettingsEq, |
175 dict12_.get(), NULL, storage_->Get()); | 218 dict12_.get(), NULL, NULL, storage_->Get()); |
176 } | 219 } |
177 | 220 |
178 TEST_P(ExtensionSettingsStorageTest, RemoveWhenEmpty) { | 221 TEST_P(ExtensionSettingsStorageTest, RemoveWhenEmpty) { |
179 EXPECT_PRED_FORMAT3(SettingsEq, | 222 EXPECT_PRED_FORMAT4(SettingsEq, |
180 NULL, &empty_set_, storage_->Remove(key1_)); | 223 NULL, empty_dict_.get(), &empty_set_, storage_->Remove(key1_)); |
181 | 224 |
182 EXPECT_PRED_FORMAT3(SettingsEq, | 225 EXPECT_PRED_FORMAT4(SettingsEq, |
183 empty_dict_.get(), NULL, storage_->Get(key1_)); | 226 empty_dict_.get(), NULL, NULL, storage_->Get(key1_)); |
184 EXPECT_PRED_FORMAT3(SettingsEq, | 227 EXPECT_PRED_FORMAT4(SettingsEq, |
185 empty_dict_.get(), NULL, storage_->Get(list1_)); | 228 empty_dict_.get(), NULL, NULL, storage_->Get(list1_)); |
186 EXPECT_PRED_FORMAT3(SettingsEq, | 229 EXPECT_PRED_FORMAT4(SettingsEq, |
187 empty_dict_.get(), NULL, storage_->Get()); | 230 empty_dict_.get(), NULL, NULL, storage_->Get()); |
188 } | 231 } |
189 | 232 |
190 TEST_P(ExtensionSettingsStorageTest, RemoveWithSingleValue) { | 233 TEST_P(ExtensionSettingsStorageTest, RemoveWithSingleValue) { |
191 EXPECT_PRED_FORMAT3(SettingsEq, | 234 EXPECT_PRED_FORMAT4(SettingsEq, |
192 dict1_.get(), &set1_, storage_->Set(*dict1_)); | 235 dict1_.get(), empty_dict_.get(), &set1_, storage_->Set(*dict1_)); |
193 EXPECT_PRED_FORMAT3(SettingsEq, | 236 EXPECT_PRED_FORMAT4(SettingsEq, |
194 NULL, &set1_, storage_->Remove(key1_)); | 237 NULL, dict1_.get(), &set1_, storage_->Remove(key1_)); |
195 | 238 |
196 EXPECT_PRED_FORMAT3(SettingsEq, | 239 EXPECT_PRED_FORMAT4(SettingsEq, |
197 empty_dict_.get(), NULL, storage_->Get(key1_)); | 240 empty_dict_.get(), NULL, NULL, storage_->Get(key1_)); |
198 EXPECT_PRED_FORMAT3(SettingsEq, | 241 EXPECT_PRED_FORMAT4(SettingsEq, |
199 empty_dict_.get(), NULL, storage_->Get(key2_)); | 242 empty_dict_.get(), NULL, NULL, storage_->Get(key2_)); |
200 EXPECT_PRED_FORMAT3(SettingsEq, | 243 EXPECT_PRED_FORMAT4(SettingsEq, |
201 empty_dict_.get(), NULL, storage_->Get(list1_)); | 244 empty_dict_.get(), NULL, NULL, storage_->Get(list1_)); |
202 EXPECT_PRED_FORMAT3(SettingsEq, | 245 EXPECT_PRED_FORMAT4(SettingsEq, |
203 empty_dict_.get(), NULL, storage_->Get(list12_)); | 246 empty_dict_.get(), NULL, NULL, storage_->Get(list12_)); |
204 EXPECT_PRED_FORMAT3(SettingsEq, | 247 EXPECT_PRED_FORMAT4(SettingsEq, |
205 empty_dict_.get(), NULL, storage_->Get()); | 248 empty_dict_.get(), NULL, NULL, storage_->Get()); |
206 } | 249 } |
207 | 250 |
208 TEST_P(ExtensionSettingsStorageTest, RemoveWithMultipleValues) { | 251 TEST_P(ExtensionSettingsStorageTest, RemoveWithMultipleValues) { |
209 EXPECT_PRED_FORMAT3(SettingsEq, | 252 EXPECT_PRED_FORMAT4(SettingsEq, |
210 dict123_.get(), &set123_, storage_->Set(*dict123_)); | 253 dict123_.get(), empty_dict_.get(), &set123_, storage_->Set(*dict123_)); |
211 EXPECT_PRED_FORMAT3(SettingsEq, | 254 EXPECT_PRED_FORMAT4(SettingsEq, |
212 NULL, &set3_, storage_->Remove(key3_)); | 255 NULL, dict3_.get(), &set3_, storage_->Remove(key3_)); |
213 | 256 |
214 EXPECT_PRED_FORMAT3(SettingsEq, | 257 EXPECT_PRED_FORMAT4(SettingsEq, |
215 dict1_.get(), NULL, storage_->Get(key1_)); | 258 dict1_.get(), NULL, NULL, storage_->Get(key1_)); |
216 EXPECT_PRED_FORMAT3(SettingsEq, | 259 EXPECT_PRED_FORMAT4(SettingsEq, |
217 empty_dict_.get(), NULL, storage_->Get(key3_)); | 260 empty_dict_.get(), NULL, NULL, storage_->Get(key3_)); |
218 EXPECT_PRED_FORMAT3(SettingsEq, | 261 EXPECT_PRED_FORMAT4(SettingsEq, |
219 empty_dict_.get(), NULL, storage_->Get(empty_list_)); | 262 empty_dict_.get(), NULL, NULL, storage_->Get(empty_list_)); |
220 EXPECT_PRED_FORMAT3(SettingsEq, | 263 EXPECT_PRED_FORMAT4(SettingsEq, |
221 dict1_.get(), NULL, storage_->Get(list1_)); | 264 dict1_.get(), NULL, NULL, storage_->Get(list1_)); |
222 EXPECT_PRED_FORMAT3(SettingsEq, | 265 EXPECT_PRED_FORMAT4(SettingsEq, |
223 dict12_.get(), NULL, storage_->Get(list12_)); | 266 dict12_.get(), NULL, NULL, storage_->Get(list12_)); |
224 EXPECT_PRED_FORMAT3(SettingsEq, | 267 EXPECT_PRED_FORMAT4(SettingsEq, |
225 dict1_.get(), NULL, storage_->Get(list13_)); | 268 dict1_.get(), NULL, NULL, storage_->Get(list13_)); |
226 EXPECT_PRED_FORMAT3(SettingsEq, | 269 EXPECT_PRED_FORMAT4(SettingsEq, |
227 dict12_.get(), NULL, storage_->Get(list123_)); | 270 dict12_.get(), NULL, NULL, storage_->Get(list123_)); |
228 EXPECT_PRED_FORMAT3(SettingsEq, | 271 EXPECT_PRED_FORMAT4(SettingsEq, |
229 dict12_.get(), NULL, storage_->Get()); | 272 dict12_.get(), NULL, NULL, storage_->Get()); |
230 | 273 |
231 EXPECT_PRED_FORMAT3(SettingsEq, | 274 EXPECT_PRED_FORMAT4(SettingsEq, |
232 NULL, &set12_, storage_->Remove(list12_)); | 275 NULL, dict12_.get(), &set12_, storage_->Remove(list12_)); |
233 | 276 |
234 EXPECT_PRED_FORMAT3(SettingsEq, | 277 EXPECT_PRED_FORMAT4(SettingsEq, |
235 empty_dict_.get(), NULL, storage_->Get(key1_)); | 278 empty_dict_.get(), NULL, NULL, storage_->Get(key1_)); |
236 EXPECT_PRED_FORMAT3(SettingsEq, | 279 EXPECT_PRED_FORMAT4(SettingsEq, |
237 empty_dict_.get(), NULL, storage_->Get(key3_)); | 280 empty_dict_.get(), NULL, NULL, storage_->Get(key3_)); |
238 EXPECT_PRED_FORMAT3(SettingsEq, | 281 EXPECT_PRED_FORMAT4(SettingsEq, |
239 empty_dict_.get(), NULL, storage_->Get(empty_list_)); | 282 empty_dict_.get(), NULL, NULL, storage_->Get(empty_list_)); |
240 EXPECT_PRED_FORMAT3(SettingsEq, | 283 EXPECT_PRED_FORMAT4(SettingsEq, |
241 empty_dict_.get(), NULL, storage_->Get(list1_)); | 284 empty_dict_.get(), NULL, NULL, storage_->Get(list1_)); |
242 EXPECT_PRED_FORMAT3(SettingsEq, | 285 EXPECT_PRED_FORMAT4(SettingsEq, |
243 empty_dict_.get(), NULL, storage_->Get(list12_)); | 286 empty_dict_.get(), NULL, NULL, storage_->Get(list12_)); |
244 EXPECT_PRED_FORMAT3(SettingsEq, | 287 EXPECT_PRED_FORMAT4(SettingsEq, |
245 empty_dict_.get(), NULL, storage_->Get(list13_)); | 288 empty_dict_.get(), NULL, NULL, storage_->Get(list13_)); |
246 EXPECT_PRED_FORMAT3(SettingsEq, | 289 EXPECT_PRED_FORMAT4(SettingsEq, |
247 empty_dict_.get(), NULL, storage_->Get(list123_)); | 290 empty_dict_.get(), NULL, NULL, storage_->Get(list123_)); |
248 EXPECT_PRED_FORMAT3(SettingsEq, | 291 EXPECT_PRED_FORMAT4(SettingsEq, |
249 empty_dict_.get(), NULL, storage_->Get()); | 292 empty_dict_.get(), NULL, NULL, storage_->Get()); |
250 } | 293 } |
251 | 294 |
252 TEST_P(ExtensionSettingsStorageTest, SetWhenOverwriting) { | 295 TEST_P(ExtensionSettingsStorageTest, SetWhenOverwriting) { |
253 DictionaryValue key1_val2; | 296 DictionaryValue key1_val2; |
254 key1_val2.Set(key1_, val2_->DeepCopy()); | 297 key1_val2.Set(key1_, val2_->DeepCopy()); |
255 | 298 |
256 EXPECT_PRED_FORMAT3(SettingsEq, | 299 EXPECT_PRED_FORMAT4(SettingsEq, |
257 &key1_val2, &set1_, storage_->Set(key1_, *val2_)); | 300 &key1_val2, empty_dict_.get(), &set1_, storage_->Set(key1_, *val2_)); |
258 EXPECT_PRED_FORMAT3(SettingsEq, | 301 EXPECT_PRED_FORMAT4(SettingsEq, |
259 dict12_.get(), &set12_, storage_->Set(*dict12_)); | 302 dict12_.get(), &key1_val2, &set12_, storage_->Set(*dict12_)); |
260 | 303 |
261 EXPECT_PRED_FORMAT3(SettingsEq, | 304 EXPECT_PRED_FORMAT4(SettingsEq, |
262 dict1_.get(), NULL, storage_->Get(key1_)); | 305 dict1_.get(), NULL, NULL, storage_->Get(key1_)); |
263 EXPECT_PRED_FORMAT3(SettingsEq, | 306 EXPECT_PRED_FORMAT4(SettingsEq, |
264 empty_dict_.get(), NULL, storage_->Get(key3_)); | 307 empty_dict_.get(), NULL, NULL, storage_->Get(key3_)); |
265 EXPECT_PRED_FORMAT3(SettingsEq, | 308 EXPECT_PRED_FORMAT4(SettingsEq, |
266 empty_dict_.get(), NULL, storage_->Get(empty_list_)); | 309 empty_dict_.get(), NULL, NULL, storage_->Get(empty_list_)); |
267 EXPECT_PRED_FORMAT3(SettingsEq, | 310 EXPECT_PRED_FORMAT4(SettingsEq, |
268 dict1_.get(), NULL, storage_->Get(list1_)); | 311 dict1_.get(), NULL, NULL, storage_->Get(list1_)); |
269 EXPECT_PRED_FORMAT3(SettingsEq, | 312 EXPECT_PRED_FORMAT4(SettingsEq, |
270 dict12_.get(), NULL, storage_->Get(list12_)); | 313 dict12_.get(), NULL, NULL, storage_->Get(list12_)); |
271 EXPECT_PRED_FORMAT3(SettingsEq, | 314 EXPECT_PRED_FORMAT4(SettingsEq, |
272 dict1_.get(), NULL, storage_->Get(list13_)); | 315 dict1_.get(), NULL, NULL, storage_->Get(list13_)); |
273 EXPECT_PRED_FORMAT3(SettingsEq, | 316 EXPECT_PRED_FORMAT4(SettingsEq, |
274 dict12_.get(), NULL, storage_->Get(list123_)); | 317 dict12_.get(), NULL, NULL, storage_->Get(list123_)); |
275 EXPECT_PRED_FORMAT3(SettingsEq, | 318 EXPECT_PRED_FORMAT4(SettingsEq, |
276 dict12_.get(), NULL, storage_->Get()); | 319 dict12_.get(), NULL, NULL, storage_->Get()); |
277 } | 320 } |
278 | 321 |
279 TEST_P(ExtensionSettingsStorageTest, ClearWhenEmpty) { | 322 TEST_P(ExtensionSettingsStorageTest, ClearWhenEmpty) { |
280 EXPECT_PRED_FORMAT3(SettingsEq, | 323 EXPECT_PRED_FORMAT4(SettingsEq, |
281 NULL, &empty_set_, storage_->Clear()); | 324 NULL, empty_dict_.get(), &empty_set_, storage_->Clear()); |
282 | 325 |
283 EXPECT_PRED_FORMAT3(SettingsEq, | 326 EXPECT_PRED_FORMAT4(SettingsEq, |
284 empty_dict_.get(), NULL, storage_->Get(key1_)); | 327 empty_dict_.get(), NULL, NULL, storage_->Get(key1_)); |
285 EXPECT_PRED_FORMAT3(SettingsEq, | 328 EXPECT_PRED_FORMAT4(SettingsEq, |
286 empty_dict_.get(), NULL, storage_->Get(empty_list_)); | 329 empty_dict_.get(), NULL, NULL, storage_->Get(empty_list_)); |
287 EXPECT_PRED_FORMAT3(SettingsEq, | 330 EXPECT_PRED_FORMAT4(SettingsEq, |
288 empty_dict_.get(), NULL, storage_->Get(list123_)); | 331 empty_dict_.get(), NULL, NULL, storage_->Get(list123_)); |
289 EXPECT_PRED_FORMAT3(SettingsEq, | 332 EXPECT_PRED_FORMAT4(SettingsEq, |
290 empty_dict_.get(), NULL, storage_->Get()); | 333 empty_dict_.get(), NULL, NULL, storage_->Get()); |
291 } | 334 } |
292 | 335 |
293 TEST_P(ExtensionSettingsStorageTest, ClearWhenNotEmpty) { | 336 TEST_P(ExtensionSettingsStorageTest, ClearWhenNotEmpty) { |
294 EXPECT_PRED_FORMAT3(SettingsEq, | 337 EXPECT_PRED_FORMAT4(SettingsEq, |
295 dict12_.get(), &set12_, storage_->Set(*dict12_)); | 338 dict12_.get(), empty_dict_.get(), &set12_, storage_->Set(*dict12_)); |
296 EXPECT_PRED_FORMAT3(SettingsEq, | 339 EXPECT_PRED_FORMAT4(SettingsEq, |
297 NULL, &set12_, storage_->Clear()); | 340 NULL, dict12_.get(), &set12_, storage_->Clear()); |
298 | 341 |
299 EXPECT_PRED_FORMAT3(SettingsEq, | 342 EXPECT_PRED_FORMAT4(SettingsEq, |
300 empty_dict_.get(), NULL, storage_->Get(key1_)); | 343 empty_dict_.get(), NULL, NULL, storage_->Get(key1_)); |
301 EXPECT_PRED_FORMAT3(SettingsEq, | 344 EXPECT_PRED_FORMAT4(SettingsEq, |
302 empty_dict_.get(), NULL, storage_->Get(empty_list_)); | 345 empty_dict_.get(), NULL, NULL, storage_->Get(empty_list_)); |
303 EXPECT_PRED_FORMAT3(SettingsEq, | 346 EXPECT_PRED_FORMAT4(SettingsEq, |
304 empty_dict_.get(), NULL, storage_->Get(list123_)); | 347 empty_dict_.get(), NULL, NULL, storage_->Get(list123_)); |
305 EXPECT_PRED_FORMAT3(SettingsEq, | 348 EXPECT_PRED_FORMAT4(SettingsEq, |
306 empty_dict_.get(), NULL, storage_->Get()); | 349 empty_dict_.get(), NULL, NULL, storage_->Get()); |
307 } | 350 } |
308 | 351 |
309 // Dots should be allowed in key names; they shouldn't be interpreted as | 352 // Dots should be allowed in key names; they shouldn't be interpreted as |
310 // indexing into a dictionary. | 353 // indexing into a dictionary. |
311 TEST_P(ExtensionSettingsStorageTest, DotsInKeyNames) { | 354 TEST_P(ExtensionSettingsStorageTest, DotsInKeyNames) { |
312 std::string dot_key("foo.bar"); | 355 std::string dot_key("foo.bar"); |
313 StringValue dot_value("baz.qux"); | 356 StringValue dot_value("baz.qux"); |
314 std::vector<std::string> dot_list; | 357 std::vector<std::string> dot_list; |
315 dot_list.push_back(dot_key); | 358 dot_list.push_back(dot_key); |
316 std::set<std::string> dot_set; | 359 std::set<std::string> dot_set; |
317 dot_set.insert(dot_key); | 360 dot_set.insert(dot_key); |
318 DictionaryValue dot_dict; | 361 DictionaryValue dot_dict; |
319 dot_dict.SetWithoutPathExpansion(dot_key, dot_value.DeepCopy()); | 362 dot_dict.SetWithoutPathExpansion(dot_key, dot_value.DeepCopy()); |
320 | 363 |
321 EXPECT_PRED_FORMAT3(SettingsEq, | 364 EXPECT_PRED_FORMAT4(SettingsEq, |
322 empty_dict_.get(), NULL, storage_->Get(dot_key)); | 365 empty_dict_.get(), NULL, NULL, storage_->Get(dot_key)); |
323 | 366 |
324 EXPECT_PRED_FORMAT3(SettingsEq, | 367 EXPECT_PRED_FORMAT4(SettingsEq, |
325 &dot_dict, &dot_set, storage_->Set(dot_key, dot_value)); | 368 &dot_dict, empty_dict_.get(), &dot_set, |
326 EXPECT_PRED_FORMAT3(SettingsEq, | 369 storage_->Set(dot_key, dot_value)); |
327 &dot_dict, &empty_set_, storage_->Set(dot_key, dot_value)); | 370 EXPECT_PRED_FORMAT4(SettingsEq, |
328 EXPECT_PRED_FORMAT3(SettingsEq, | 371 &dot_dict, &dot_dict, &empty_set_, |
329 &dot_dict, NULL, storage_->Get(dot_key)); | 372 storage_->Set(dot_key, dot_value)); |
| 373 EXPECT_PRED_FORMAT4(SettingsEq, |
| 374 &dot_dict, NULL, NULL, storage_->Get(dot_key)); |
330 | 375 |
331 EXPECT_PRED_FORMAT3(SettingsEq, | 376 EXPECT_PRED_FORMAT4(SettingsEq, |
332 NULL, &dot_set, storage_->Remove(dot_key)); | 377 NULL, &dot_dict, &dot_set, storage_->Remove(dot_key)); |
333 EXPECT_PRED_FORMAT3(SettingsEq, | 378 EXPECT_PRED_FORMAT4(SettingsEq, |
334 NULL, &empty_set_, storage_->Remove(dot_key)); | 379 NULL, empty_dict_.get(), &empty_set_, storage_->Remove(dot_key)); |
335 EXPECT_PRED_FORMAT3(SettingsEq, | 380 EXPECT_PRED_FORMAT4(SettingsEq, |
336 &dot_dict, &dot_set, storage_->Set(dot_dict)); | 381 &dot_dict, empty_dict_.get(), &dot_set, storage_->Set(dot_dict)); |
337 EXPECT_PRED_FORMAT3(SettingsEq, | 382 EXPECT_PRED_FORMAT4(SettingsEq, |
338 &dot_dict, NULL, storage_->Get(dot_list)); | 383 &dot_dict, NULL, NULL, storage_->Get(dot_list)); |
339 EXPECT_PRED_FORMAT3(SettingsEq, | 384 EXPECT_PRED_FORMAT4(SettingsEq, |
340 &dot_dict, NULL, storage_->Get()); | 385 &dot_dict, NULL, NULL, storage_->Get()); |
341 | 386 |
342 EXPECT_PRED_FORMAT3(SettingsEq, | 387 EXPECT_PRED_FORMAT4(SettingsEq, |
343 NULL, &dot_set, storage_->Remove(dot_list)); | 388 NULL, &dot_dict, &dot_set, storage_->Remove(dot_list)); |
344 EXPECT_PRED_FORMAT3(SettingsEq, | 389 EXPECT_PRED_FORMAT4(SettingsEq, |
345 empty_dict_.get(), NULL, storage_->Get(dot_key)); | 390 empty_dict_.get(), NULL, NULL, storage_->Get(dot_key)); |
346 EXPECT_PRED_FORMAT3(SettingsEq, | 391 EXPECT_PRED_FORMAT4(SettingsEq, |
347 empty_dict_.get(), NULL, storage_->Get()); | 392 empty_dict_.get(), NULL, NULL, storage_->Get()); |
348 } | 393 } |
349 | 394 |
350 TEST_P(ExtensionSettingsStorageTest, DotsInKeyNamesWithDicts) { | 395 TEST_P(ExtensionSettingsStorageTest, DotsInKeyNamesWithDicts) { |
351 DictionaryValue outer_dict; | 396 DictionaryValue outer_dict; |
352 DictionaryValue* inner_dict = new DictionaryValue(); | 397 DictionaryValue* inner_dict = new DictionaryValue(); |
353 outer_dict.Set("foo", inner_dict); | 398 outer_dict.Set("foo", inner_dict); |
354 inner_dict->Set("bar", Value::CreateStringValue("baz")); | 399 inner_dict->Set("bar", Value::CreateStringValue("baz")); |
355 std::set<std::string> changed_keys; | 400 std::set<std::string> changed_keys; |
356 changed_keys.insert("foo"); | 401 changed_keys.insert("foo"); |
357 | 402 |
358 EXPECT_PRED_FORMAT3(SettingsEq, | 403 EXPECT_PRED_FORMAT4(SettingsEq, |
359 &outer_dict, &changed_keys, storage_->Set(outer_dict)); | 404 &outer_dict, empty_dict_.get(), &changed_keys, storage_->Set(outer_dict)); |
360 EXPECT_PRED_FORMAT3(SettingsEq, | 405 EXPECT_PRED_FORMAT4(SettingsEq, |
361 &outer_dict, NULL, storage_->Get("foo")); | 406 &outer_dict, NULL, NULL, storage_->Get("foo")); |
362 EXPECT_PRED_FORMAT3(SettingsEq, | 407 EXPECT_PRED_FORMAT4(SettingsEq, |
363 empty_dict_.get(), NULL, storage_->Get("foo.bar")); | 408 empty_dict_.get(), NULL, NULL, storage_->Get("foo.bar")); |
364 } | 409 } |
365 | 410 |
366 TEST_P(ExtensionSettingsStorageTest, ComplexChangedKeysScenarios) { | 411 TEST_P(ExtensionSettingsStorageTest, ComplexChangedKeysScenarios) { |
367 // Test: | 412 // Test: |
368 // - Setting over missing/changed/same keys, combinations. | 413 // - Setting over missing/changed/same keys, combinations. |
369 // - Removing over missing and present keys, combinations. | 414 // - Removing over missing and present keys, combinations. |
370 // - Clearing. | 415 // - Clearing. |
371 std::vector<std::string> complex_list; | 416 std::vector<std::string> complex_list; |
372 std::set<std::string> complex_set; | 417 std::set<std::string> complex_set; |
373 DictionaryValue complex_dict; | 418 DictionaryValue complex_dict; |
| 419 DictionaryValue complex_changed_dict; |
374 | 420 |
375 EXPECT_PRED_FORMAT3(SettingsEq, | 421 EXPECT_PRED_FORMAT4(SettingsEq, |
376 dict1_.get(), &set1_, storage_->Set(key1_, *val1_)); | 422 dict1_.get(), empty_dict_.get(), &set1_, storage_->Set(key1_, *val1_)); |
377 EXPECT_PRED_FORMAT3(SettingsEq, | 423 EXPECT_PRED_FORMAT4(SettingsEq, |
378 dict1_.get(), &empty_set_, storage_->Set(key1_, *val1_)); | 424 dict1_.get(), dict1_.get(), &empty_set_, storage_->Set(key1_, *val1_)); |
379 | 425 |
380 complex_dict.Clear(); | 426 complex_dict.Clear(); |
381 complex_dict.Set(key1_, val2_->DeepCopy()); | 427 complex_dict.Set(key1_, val2_->DeepCopy()); |
382 EXPECT_PRED_FORMAT3(SettingsEq, | 428 EXPECT_PRED_FORMAT4(SettingsEq, |
383 &complex_dict, &set1_, storage_->Set(key1_, *val2_)); | 429 &complex_dict, dict1_.get(), &set1_, storage_->Set(key1_, *val2_)); |
384 | 430 |
385 EXPECT_PRED_FORMAT3(SettingsEq, | 431 EXPECT_PRED_FORMAT4(SettingsEq, |
386 NULL, &set1_, storage_->Remove(key1_)); | 432 NULL, &complex_dict, &set1_, storage_->Remove(key1_)); |
387 EXPECT_PRED_FORMAT3(SettingsEq, | 433 EXPECT_PRED_FORMAT4(SettingsEq, |
388 NULL, &empty_set_, storage_->Remove(key1_)); | 434 NULL, empty_dict_.get(), &empty_set_, storage_->Remove(key1_)); |
389 | 435 |
390 EXPECT_PRED_FORMAT3(SettingsEq, | 436 EXPECT_PRED_FORMAT4(SettingsEq, |
391 dict1_.get(), &set1_, storage_->Set(key1_, *val1_)); | 437 dict1_.get(), empty_dict_.get(), &set1_, storage_->Set(key1_, *val1_)); |
392 EXPECT_PRED_FORMAT3(SettingsEq, | 438 EXPECT_PRED_FORMAT4(SettingsEq, |
393 NULL, &set1_, storage_->Clear()); | 439 NULL, dict1_.get(), &set1_, storage_->Clear()); |
394 EXPECT_PRED_FORMAT3(SettingsEq, | 440 EXPECT_PRED_FORMAT4(SettingsEq, |
395 NULL, &empty_set_, storage_->Clear()); | 441 NULL, empty_dict_.get(), &empty_set_, storage_->Clear()); |
396 | 442 |
397 EXPECT_PRED_FORMAT3(SettingsEq, | 443 EXPECT_PRED_FORMAT4(SettingsEq, |
398 dict12_.get(), &set12_, storage_->Set(*dict12_)); | 444 dict12_.get(), empty_dict_.get(), &set12_, storage_->Set(*dict12_)); |
399 EXPECT_PRED_FORMAT3(SettingsEq, | 445 EXPECT_PRED_FORMAT4(SettingsEq, |
400 dict12_.get(), &empty_set_, storage_->Set(*dict12_)); | 446 dict12_.get(), dict12_.get(), &empty_set_, storage_->Set(*dict12_)); |
401 EXPECT_PRED_FORMAT3(SettingsEq, | 447 EXPECT_PRED_FORMAT4(SettingsEq, |
402 dict123_.get(), &set3_, storage_->Set(*dict123_)); | 448 dict123_.get(), dict12_.get(), &set3_, storage_->Set(*dict123_)); |
403 | 449 |
404 complex_dict.Clear(); | 450 complex_dict.Clear(); |
405 complex_dict.Set(key1_, val2_->DeepCopy()); | 451 complex_dict.Set(key1_, val2_->DeepCopy()); |
406 complex_dict.Set(key2_, val2_->DeepCopy()); | 452 complex_dict.Set(key2_, val2_->DeepCopy()); |
407 complex_dict.Set("asdf", val1_->DeepCopy()); | 453 complex_dict.Set("asdf", val1_->DeepCopy()); |
408 complex_dict.Set("qwerty", val3_->DeepCopy()); | 454 complex_dict.Set("qwerty", val3_->DeepCopy()); |
| 455 complex_changed_dict.Clear(); |
| 456 complex_changed_dict.Set(key1_, val1_->DeepCopy()); |
| 457 complex_changed_dict.Set(key2_, val2_->DeepCopy()); |
409 complex_set.clear(); | 458 complex_set.clear(); |
410 complex_set.insert(key1_); | 459 complex_set.insert(key1_); |
411 complex_set.insert("asdf"); | 460 complex_set.insert("asdf"); |
412 complex_set.insert("qwerty"); | 461 complex_set.insert("qwerty"); |
413 EXPECT_PRED_FORMAT3(SettingsEq, | 462 EXPECT_PRED_FORMAT4(SettingsEq, |
414 &complex_dict, &complex_set, storage_->Set(complex_dict)); | 463 &complex_dict, &complex_changed_dict, &complex_set, |
| 464 storage_->Set(complex_dict)); |
415 | 465 |
416 EXPECT_PRED_FORMAT3(SettingsEq, | 466 complex_changed_dict.Clear(); |
417 NULL, &set12_, storage_->Remove(list12_)); | 467 complex_changed_dict.Set(key1_, val2_->DeepCopy()); |
418 EXPECT_PRED_FORMAT3(SettingsEq, | 468 complex_changed_dict.Set(key2_, val2_->DeepCopy()); |
419 NULL, &empty_set_, storage_->Remove(list12_)); | 469 EXPECT_PRED_FORMAT4(SettingsEq, |
| 470 NULL, &complex_changed_dict, &set12_, storage_->Remove(list12_)); |
| 471 EXPECT_PRED_FORMAT4(SettingsEq, |
| 472 NULL, empty_dict_.get(), &empty_set_, storage_->Remove(list12_)); |
420 | 473 |
421 complex_list.clear(); | 474 complex_list.clear(); |
422 complex_list.push_back(key1_); | 475 complex_list.push_back(key1_); |
423 complex_list.push_back("asdf"); | 476 complex_list.push_back("asdf"); |
| 477 complex_changed_dict.Clear(); |
| 478 complex_changed_dict.Set("asdf", val1_->DeepCopy()); |
424 complex_set.clear(); | 479 complex_set.clear(); |
425 complex_set.insert("asdf"); | 480 complex_set.insert("asdf"); |
426 EXPECT_PRED_FORMAT3(SettingsEq, | 481 EXPECT_PRED_FORMAT4(SettingsEq, |
427 NULL, &complex_set, storage_->Remove(complex_list)); | 482 NULL, |
| 483 &complex_changed_dict, |
| 484 &complex_set, |
| 485 storage_->Remove(complex_list)); |
428 | 486 |
| 487 complex_changed_dict.Clear(); |
| 488 complex_changed_dict.Set(key3_, val3_->DeepCopy()); |
| 489 complex_changed_dict.Set("qwerty", val3_->DeepCopy()); |
429 complex_set.clear(); | 490 complex_set.clear(); |
430 complex_set.insert(key3_); | 491 complex_set.insert(key3_); |
431 complex_set.insert("qwerty"); | 492 complex_set.insert("qwerty"); |
432 EXPECT_PRED_FORMAT3(SettingsEq, | 493 EXPECT_PRED_FORMAT4(SettingsEq, |
433 NULL, &complex_set, storage_->Clear()); | 494 NULL, &complex_changed_dict, &complex_set, storage_->Clear()); |
434 EXPECT_PRED_FORMAT3(SettingsEq, | 495 EXPECT_PRED_FORMAT4(SettingsEq, |
435 NULL, &empty_set_, storage_->Clear()); | 496 NULL, empty_dict_.get(), &empty_set_, storage_->Clear()); |
436 } | 497 } |
OLD | NEW |