1// Copyright 2014 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 "base/json/json_reader.h" 6#include "base/json/json_writer.h" 7#include "base/logging.h" 8#include "base/values.h" 9#include "extensions/browser/value_store/value_store_change.h" 10#include "extensions/common/value_builder.h" 11#include "testing/gtest/include/gtest/gtest.h" 12 13using base::DictionaryValue; 14using base::Value; 15using extensions::DictionaryBuilder; 16using extensions::ListBuilder; 17 18namespace { 19 20TEST(ValueStoreChangeTest, NullOldValue) { 21 ValueStoreChange change("key", NULL, new base::StringValue("value")); 22 23 EXPECT_EQ("key", change.key()); 24 EXPECT_EQ(NULL, change.old_value()); 25 { 26 scoped_ptr<base::Value> expected(new base::StringValue("value")); 27 EXPECT_TRUE(change.new_value()->Equals(expected.get())); 28 } 29} 30 31TEST(ValueStoreChangeTest, NullNewValue) { 32 ValueStoreChange change("key", new base::StringValue("value"), NULL); 33 34 EXPECT_EQ("key", change.key()); 35 { 36 scoped_ptr<base::Value> expected(new base::StringValue("value")); 37 EXPECT_TRUE(change.old_value()->Equals(expected.get())); 38 } 39 EXPECT_EQ(NULL, change.new_value()); 40} 41 42TEST(ValueStoreChangeTest, NonNullValues) { 43 ValueStoreChange change("key", 44 new base::StringValue("old_value"), 45 new base::StringValue("new_value")); 46 47 EXPECT_EQ("key", change.key()); 48 { 49 scoped_ptr<base::Value> expected(new base::StringValue("old_value")); 50 EXPECT_TRUE(change.old_value()->Equals(expected.get())); 51 } 52 { 53 scoped_ptr<base::Value> expected(new base::StringValue("new_value")); 54 EXPECT_TRUE(change.new_value()->Equals(expected.get())); 55 } 56} 57 58TEST(ValueStoreChangeTest, ToJson) { 59 // Create a mildly complicated structure that has dots in it. 60 scoped_ptr<base::DictionaryValue> value = DictionaryBuilder() 61 .Set("key", "value") 62 .Set("key.with.dots", "value.with.dots") 63 .Set("tricked", DictionaryBuilder() 64 .Set("you", "nodots")) 65 .Set("tricked.you", "with.dots") 66 .Build(); 67 68 ValueStoreChangeList change_list; 69 change_list.push_back( 70 ValueStoreChange("key", value->DeepCopy(), value->DeepCopy())); 71 change_list.push_back( 72 ValueStoreChange("key.with.dots", value->DeepCopy(), value->DeepCopy())); 73 74 std::string json = ValueStoreChange::ToJson(change_list); 75 scoped_ptr<base::Value> from_json(base::JSONReader::Read(json)); 76 ASSERT_TRUE(from_json.get()); 77 78 DictionaryBuilder v1(*value); 79 DictionaryBuilder v2(*value); 80 DictionaryBuilder v3(*value); 81 DictionaryBuilder v4(*value); 82 scoped_ptr<base::DictionaryValue> expected_from_json = DictionaryBuilder() 83 .Set("key", DictionaryBuilder() 84 .Set("oldValue", v1) 85 .Set("newValue", v2)) 86 .Set("key.with.dots", DictionaryBuilder() 87 .Set("oldValue", v3) 88 .Set("newValue", v4)) 89 .Build(); 90 91 EXPECT_TRUE(from_json->Equals(expected_from_json.get())); 92} 93 94} // namespace 95