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

Side by Side Diff: ppapi/proxy/raw_var_data_unittest.cc

Issue 13887007: Introduce RawVarData and associated classes for serializing PP_Vars (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ppapi/proxy/ppapi_proxy_test.h"
6
7 #include "ppapi/proxy/raw_var_data.h"
8 #include "ppapi/shared_impl/array_var.h"
9 #include "ppapi/shared_impl/dictionary_var.h"
10 #include "ppapi/shared_impl/proxy_lock.h"
11 #include "ppapi/shared_impl/var.h"
12
13 namespace ppapi {
14 namespace proxy {
15
16 namespace {
17
18 class RawVarDataTest : public PluginProxyTest {
19 public:
20 RawVarDataTest() {}
21 };
22
23 bool Equals(const PP_Var& expected,
24 const PP_Var& actual,
25 base::hash_map<int64_t, int64_t>* visited_map) {
26 if (expected.type != actual.type)
27 return false;
28 if (VarTracker::IsVarTypeRefcounted(expected.type)) {
29 base::hash_map<int64_t, int64_t>::iterator it =
30 visited_map->find(expected.value.as_id);
31 if (it != visited_map->end())
32 return it->second == actual.value.as_id;
33 else
34 (*visited_map)[expected.value.as_id] = actual.value.as_id;
35 }
36 switch (expected.type) {
37 case PP_VARTYPE_UNDEFINED:
38 return true;
39 case PP_VARTYPE_NULL:
40 return true;
41 case PP_VARTYPE_BOOL:
42 return expected.value.as_bool == actual.value.as_bool;
43 case PP_VARTYPE_INT32:
44 return expected.value.as_int == actual.value.as_int;
45 case PP_VARTYPE_DOUBLE:
46 return expected.value.as_double == actual.value.as_double;
47 case PP_VARTYPE_OBJECT:
48 return expected.value.as_id == actual.value.as_id;
49 case PP_VARTYPE_STRING: {
50 StringVar* expected_var = StringVar::FromPPVar(expected);
51 StringVar* actual_var = StringVar::FromPPVar(actual);
52 if (!expected_var || !actual_var)
53 return expected_var == actual_var;
54 return expected_var->value() == expected_var->value();
55 }
56 case PP_VARTYPE_ARRAY_BUFFER: {
57 ArrayBufferVar* expected_var = ArrayBufferVar::FromPPVar(expected);
58 ArrayBufferVar* actual_var = ArrayBufferVar::FromPPVar(actual);
59 if (!expected_var || !actual_var)
60 return expected_var == actual_var;
61 std::string expected_data(static_cast<const char*>(expected_var->Map()),
62 expected_var->ByteLength());
63 std::string actual_data(static_cast<const char*>(actual_var->Map()),
64 actual_var->ByteLength());
65 return expected_data == actual_data;
66 }
67 case PP_VARTYPE_ARRAY: {
68 ArrayVar* expected_var = ArrayVar::FromPPVar(expected);
69 ArrayVar* actual_var = ArrayVar::FromPPVar(actual);
70 if (!expected_var || !actual_var)
71 return expected_var == actual_var;
72 if (expected_var->elements().size() != actual_var->elements().size())
73 return false;
74 for (size_t i = 0; i < expected_var->elements().size(); ++i) {
75 if (!Equals(expected_var->elements()[i].get(),
76 actual_var->elements()[i].get(),
77 visited_map)) {
78 return false;
79 }
80 }
81 return true;
82 }
83 case PP_VARTYPE_DICTIONARY: {
84 DictionaryVar* expected_var = DictionaryVar::FromPPVar(expected);
85 DictionaryVar* actual_var = DictionaryVar::FromPPVar(actual);
86 if (!expected_var || !actual_var)
87 return expected_var == actual_var;
88 if (expected_var->key_value_map().size() !=
89 actual_var->key_value_map().size())
90 return false;
91 DictionaryVar::KeyValueMap::const_iterator expected_iter =
92 expected_var->key_value_map().begin();
93 DictionaryVar::KeyValueMap::const_iterator actual_iter =
94 actual_var->key_value_map().begin();
95 for ( ; expected_iter != expected_var->key_value_map().end() &&
96 actual_iter != actual_var->key_value_map().end();
97 ++expected_iter, ++actual_iter) {
98 if (expected_iter->first != actual_iter->first)
99 return false;
100 if (!Equals(expected_iter->second.get(),
101 actual_iter->second.get(),
102 visited_map)) {
103 return false;
104 }
105 }
106 return true;
107 }
108 }
109 NOTREACHED();
110 return false;
111 }
112
113 bool Equals(const PP_Var& expected,
114 const PP_Var& actual) {
115 base::hash_map<int64_t, int64_t> visited_map;
116 return Equals(expected, actual, &visited_map);
117 }
118
119 PP_Var WriteAndRead(const PP_Var& var) {
120 PP_Instance dummy_instance = 1234;
121 scoped_ptr<RawVarDataGraph> expected_data(RawVarDataGraph::Create(
122 var, dummy_instance));
123 IPC::Message m;
124 expected_data->Write(&m);
125 PickleIterator iter(m);
126 scoped_ptr<RawVarDataGraph> actual_data(RawVarDataGraph::Read(&m, &iter));
127 return actual_data->CreatePPVar(dummy_instance);
128 }
129
130 // Assumes a ref for var.
131 bool WriteReadAndCompare(const PP_Var& var) {
132 ScopedPPVar expected(ScopedPPVar::PassRef(), var);
133 ScopedPPVar actual(ScopedPPVar::PassRef(), WriteAndRead(expected.get()));
134 return Equals(expected.get(), actual.get());
135 }
136
137 } // namespace
138
139 TEST_F(RawVarDataTest, SimpleTest) {
140 ProxyAutoLock lock;
141 EXPECT_TRUE(WriteReadAndCompare(PP_MakeUndefined()));
142 EXPECT_TRUE(WriteReadAndCompare(PP_MakeNull()));
143 EXPECT_TRUE(WriteReadAndCompare(PP_MakeInt32(100)));
144 EXPECT_TRUE(WriteReadAndCompare(PP_MakeBool(PP_TRUE)));
145 EXPECT_TRUE(WriteReadAndCompare(PP_MakeDouble(53.75)));
146 PP_Var object;
147 object.type = PP_VARTYPE_OBJECT;
148 object.value.as_id = 10;
149 EXPECT_TRUE(WriteReadAndCompare(object));
150 }
151
152 TEST_F(RawVarDataTest, StringTest) {
153 ProxyAutoLock lock;
154 EXPECT_TRUE(WriteReadAndCompare(StringVar::StringToPPVar("")));
155 EXPECT_TRUE(WriteReadAndCompare(StringVar::StringToPPVar("hello world!")));
156 }
157
158 TEST_F(RawVarDataTest, ArrayBufferTest) {
159 ProxyAutoLock lock;
160 std::string data = "hello world!";
161 PP_Var var = PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
162 data.size(), data.data());
163 EXPECT_TRUE(WriteReadAndCompare(var));
164 var = PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(0, NULL);
165 EXPECT_TRUE(WriteReadAndCompare(var));
166 // TODO(raymes): add tests for shmem type array buffers.
167 }
168
169 TEST_F(RawVarDataTest, DictionaryArrayTest) {
170 ProxyAutoLock lock;
171
172 // Empty array.
173 scoped_refptr<ArrayVar> array(new ArrayVar);
174 ScopedPPVar release_array(ScopedPPVar::PassRef(), array->GetPPVar());
175 EXPECT_TRUE(WriteReadAndCompare(array->GetPPVar()));
176
177 size_t index = 0;
178
179 // Array with primitives.
180 array->Set(index++, PP_MakeUndefined());
181 array->Set(index++, PP_MakeNull());
182 array->Set(index++, PP_MakeInt32(100));
183 array->Set(index++, PP_MakeBool(PP_FALSE));
184 array->Set(index++, PP_MakeDouble(0.123));
185 EXPECT_TRUE(WriteReadAndCompare(array->GetPPVar()));
186
187 // Empty dictionary.
188 scoped_refptr<DictionaryVar> dictionary(new DictionaryVar);
189 ScopedPPVar release_dictionary(ScopedPPVar::PassRef(),
190 dictionary->GetPPVar());
191 EXPECT_TRUE(WriteReadAndCompare(dictionary->GetPPVar()));
192
193 // Dictionary with primitives.
194 ScopedPPVar key1(ScopedPPVar::PassRef(), StringVar::StringToPPVar("1"));
195 dictionary->Set(key1.get(), PP_MakeUndefined());
196 ScopedPPVar key2(ScopedPPVar::PassRef(), StringVar::StringToPPVar("2"));
197 dictionary->Set(key2.get(), PP_MakeNull());
198 ScopedPPVar key3(ScopedPPVar::PassRef(), StringVar::StringToPPVar("3"));
199 dictionary->Set(key3.get(), PP_MakeInt32(-100));
200 ScopedPPVar key4(ScopedPPVar::PassRef(), StringVar::StringToPPVar("4"));
201 dictionary->Set(key4.get(), PP_MakeBool(PP_TRUE));
202 ScopedPPVar key5(ScopedPPVar::PassRef(), StringVar::StringToPPVar("5"));
203 dictionary->Set(key5.get(), PP_MakeDouble(-103.52));
204 EXPECT_TRUE(WriteReadAndCompare(dictionary->GetPPVar()));
205
206 // Array with dictionary.
207 array->Set(index++, release_dictionary.get());
208 EXPECT_TRUE(WriteReadAndCompare(array->GetPPVar()));
209
210 // Array with dictionary with array.
211 scoped_refptr<ArrayVar> array2(new ArrayVar);
212 ScopedPPVar release_array2(ScopedPPVar::PassRef(), array2->GetPPVar());
213 array2->Set(0, PP_MakeInt32(100));
214 ScopedPPVar key6(ScopedPPVar::PassRef(), StringVar::StringToPPVar("6"));
215 dictionary->Set(key6.get(), release_array2.get());
216 EXPECT_TRUE(WriteReadAndCompare(array->GetPPVar()));
217
218 // Array <-> dictionary cycle.
219 ScopedPPVar key7(ScopedPPVar::PassRef(), StringVar::StringToPPVar("7"));
220 dictionary->Set(key7.get(), release_array.get());
221 ScopedPPVar result = ScopedPPVar(ScopedPPVar::PassRef(),
222 WriteAndRead(release_dictionary.get()));
223 EXPECT_TRUE(Equals(release_dictionary.get(), result.get()));
224 // Break the cycle.
225 dictionary->Delete(key7.get());
226 DictionaryVar* result_dictionary = DictionaryVar::FromPPVar(result.get());
227 result_dictionary->Delete(key7.get());
228
229 // Array with self references.
230 array->Set(index, release_array.get());
231 result = ScopedPPVar(ScopedPPVar::PassRef(),
232 WriteAndRead(release_array.get()));
233 EXPECT_TRUE(Equals(release_array.get(), result.get()));
234 // Break the self reference.
235 array->Set(index, PP_MakeUndefined());
236 ArrayVar* result_array = ArrayVar::FromPPVar(result.get());
237 result_array->Set(index, PP_MakeUndefined());
238 }
239
240 } // namespace proxy
241 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698