Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: ppapi/shared_impl/var_value_conversions_unittest.cc

Issue 12387073: Add PPB_VarDictionary_Dev support - part 1. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: changes in response to David's suggestions Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 "ppapi/shared_impl/var_value_conversions.h"
6
7 #include <cmath>
8 #include <cstring>
9
10 #include "base/logging.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/values.h"
14 #include "ppapi/c/pp_bool.h"
15 #include "ppapi/c/pp_var.h"
16 #include "ppapi/shared_impl/dictionary_var.h"
17 #include "ppapi/shared_impl/ppapi_globals.h"
18 #include "ppapi/shared_impl/proxy_lock.h"
19 #include "ppapi/shared_impl/scoped_pp_var.h"
20 #include "ppapi/shared_impl/test_globals.h"
21 #include "ppapi/shared_impl/var.h"
22 #include "ppapi/shared_impl/var_tracker.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 namespace ppapi {
26 namespace {
27
28 bool Equals(const base::Value& value, const PP_Var& var) {
29 switch (value.GetType()) {
30 case base::Value::TYPE_NULL: {
31 return var.type == PP_VARTYPE_NULL || var.type == PP_VARTYPE_UNDEFINED;
32 }
33 case base::Value::TYPE_BOOLEAN: {
34 bool result = false;
35 return var.type == PP_VARTYPE_BOOL &&
36 value.GetAsBoolean(&result) &&
37 result == PP_ToBool(var.value.as_bool);
38 }
39 case base::Value::TYPE_INTEGER: {
40 int result = 0;
41 return var.type == PP_VARTYPE_INT32 &&
42 value.GetAsInteger(&result) &&
43 result == var.value.as_int;
44 }
45 case base::Value::TYPE_DOUBLE: {
46 double result = 0;
47 return var.type == PP_VARTYPE_DOUBLE &&
48 value.GetAsDouble(&result) &&
49 fabs(result - var.value.as_double) < 1.0e-4;
50 }
51 case base::Value::TYPE_STRING: {
52 std::string result;
53 StringVar* string_var = StringVar::FromPPVar(var);
54 return string_var &&
55 value.GetAsString(&result) &&
56 result == string_var->value();
57 }
58 case base::Value::TYPE_BINARY: {
59 const base::BinaryValue& binary_value =
60 static_cast<const base::BinaryValue&>(value);
61 ArrayBufferVar* array_buffer_var = ArrayBufferVar::FromPPVar(var);
62 if (!array_buffer_var ||
63 binary_value.GetSize() != array_buffer_var->ByteLength()) {
64 return false;
65 }
66
67 bool result = !memcmp(binary_value.GetBuffer(), array_buffer_var->Map(),
68 binary_value.GetSize());
69 array_buffer_var->Unmap();
70 return result;
71 }
72 case base::Value::TYPE_DICTIONARY: {
73 const base::DictionaryValue& dict_value =
74 static_cast<const base::DictionaryValue&>(value);
75 DictionaryVar* dict_var = DictionaryVar::FromPPVar(var);
76 if (!dict_var)
77 return false;
78
79 size_t non_undefined_count = 0;
80 for (DictionaryVar::KeyValueMap::const_iterator iter =
81 dict_var->key_value_map().begin();
82 iter != dict_var->key_value_map().end();
83 ++iter) {
84 if (iter->second.get().type == PP_VARTYPE_UNDEFINED)
85 continue;
86
87 ++non_undefined_count;
88 const base::Value* sub_value = NULL;
89 if (!dict_value.GetWithoutPathExpansion(iter->first, &sub_value) ||
90 !Equals(*sub_value, iter->second.get())) {
91 return false;
92 }
93 }
94 return non_undefined_count == dict_value.size();
95 }
96 case base::Value::TYPE_LIST: {
97 // TODO(yzshen): add support once array var is supported.
98 return false;
99 }
100 }
101 NOTREACHED();
102 return false;
103 }
104
105 class VarValueConversionsTest : public testing::Test {
106 public:
107 VarValueConversionsTest() {
108 }
109 virtual ~VarValueConversionsTest() {
110 }
111
112 // testing::Test implementation.
113 virtual void SetUp() {
114 ProxyLock::Acquire();
115 }
116 virtual void TearDown() {
117 ASSERT_TRUE(PpapiGlobals::Get()->GetVarTracker()->GetLiveVars().empty());
118 ProxyLock::Release();
119 }
120
121 private:
122 TestGlobals globals_;
123 };
124
125 } // namespace
126
127 TEST_F(VarValueConversionsTest, CreateValueFromVar) {
128 {
129 // Var holding a ref to itself is not a valid input.
130 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar());
131 ScopedPPVar var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar());
132 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar());
133 ScopedPPVar var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar());
134
135 ASSERT_TRUE(dict_var_1->SetWithStringKey("key_1", var_2.get()));
136 scoped_ptr<base::Value> value(CreateValueFromVar(var_1.get()));
137 ASSERT_TRUE(value.get() != NULL);
138
139 ASSERT_TRUE(dict_var_2->SetWithStringKey("key_2", var_1.get()));
140 value.reset(CreateValueFromVar(var_1.get()));
141 ASSERT_EQ(NULL, value.get());
142
143 // Make sure |var_1| doesn't indirectly hold a ref to itself, otherwise it
144 // is leaked.
145 dict_var_1->DeleteWithStringKey("key_1");
146 }
147
148 // Vars of null or undefined type are converted to null values.
149 {
150 scoped_ptr<base::Value> value(CreateValueFromVar(PP_MakeNull()));
151 ASSERT_TRUE(value.get() != NULL);
152 ASSERT_TRUE(Equals(*value, PP_MakeNull()));
153
154 value.reset(CreateValueFromVar(PP_MakeUndefined()));
155 ASSERT_TRUE(value.get() != NULL);
156 ASSERT_TRUE(Equals(*value, PP_MakeUndefined()));
157 }
158
159 {
160 // Key-value pairs whose value is undefined are ignored.
161 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar());
162 ASSERT_TRUE(dict_var->SetWithStringKey("key_1", PP_MakeUndefined()));
163 ASSERT_TRUE(dict_var->SetWithStringKey("key_2", PP_MakeInt32(1)));
164 ScopedPPVar var(ScopedPPVar::PassRef(), dict_var->GetPPVar());
165
166 scoped_ptr<base::Value> value(CreateValueFromVar(var.get()));
167 ASSERT_TRUE(value.get() != NULL);
168 ASSERT_TRUE(Equals(*value, var.get()));
169 }
170
171 {
172 // Test more complex inputs.
173 scoped_refptr<DictionaryVar> dict_var_1(new DictionaryVar());
174 ScopedPPVar dict_pp_var_1(ScopedPPVar::PassRef(), dict_var_1->GetPPVar());
175 scoped_refptr<DictionaryVar> dict_var_2(new DictionaryVar());
176 ScopedPPVar dict_pp_var_2(ScopedPPVar::PassRef(), dict_var_2->GetPPVar());
177 scoped_refptr<StringVar> string_var(new StringVar("string_value"));
178 ScopedPPVar string_pp_var(ScopedPPVar::PassRef(), string_var->GetPPVar());
179
180 ASSERT_TRUE(dict_var_1->SetWithStringKey("null_key", PP_MakeNull()));
181 ASSERT_TRUE(dict_var_1->SetWithStringKey("string_key",
182 string_pp_var.get()));
183 ASSERT_TRUE(dict_var_1->SetWithStringKey("dict_key", dict_pp_var_2.get()));
184
185 ASSERT_TRUE(dict_var_2->SetWithStringKey("undefined_key",
186 PP_MakeUndefined()));
187 ASSERT_TRUE(dict_var_2->SetWithStringKey("double_key", PP_MakeDouble(1)));
188 ASSERT_TRUE(dict_var_2->SetWithStringKey("int_key", PP_MakeInt32(2)));
189 ASSERT_TRUE(dict_var_2->SetWithStringKey("bool_key", PP_MakeBool(PP_TRUE)));
190
191 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var_1.get()));
192 ASSERT_TRUE(value.get() != NULL);
193 ASSERT_TRUE(Equals(*value, dict_pp_var_1.get()));
194 }
195
196 {
197 // Test that dictionary keys containing '.' are handled correctly.
198 scoped_refptr<DictionaryVar> dict_var(new DictionaryVar());
199 ScopedPPVar dict_pp_var(ScopedPPVar::PassRef(), dict_var->GetPPVar());
200
201 ASSERT_TRUE(dict_var->SetWithStringKey("double.key", PP_MakeDouble(1)));
202 ASSERT_TRUE(dict_var->SetWithStringKey("int.key..name", PP_MakeInt32(2)));
203
204 scoped_ptr<base::Value> value(CreateValueFromVar(dict_pp_var.get()));
205 ASSERT_TRUE(value.get() != NULL);
206 ASSERT_TRUE(Equals(*value, dict_pp_var.get()));
207 }
208 }
209
210 TEST_F(VarValueConversionsTest, CreateVarFromValue) {
211 base::DictionaryValue dict_value;
212 dict_value.Set("null_key", base::Value::CreateNullValue());
213 dict_value.SetString("string_key", "string_value");
214 dict_value.SetDouble("dict_key.double_key", 1);
215 dict_value.SetInteger("dict_key.int_key", 2);
216 dict_value.SetBoolean("dict_key.bool_key", true);
217
218 ScopedPPVar var(ScopedPPVar::PassRef(), CreateVarFromValue(dict_value));
219 ASSERT_TRUE(Equals(dict_value, var.get()));
220 }
221
222 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698