OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/memory/scoped_ptr.h" |
8 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "third_party/WebKit/public/web/WebBindings.h" | 11 #include "third_party/WebKit/public/web/WebBindings.h" |
11 #include "webkit/renderer/cpp_variant.h" | 12 #include "webkit/renderer/cpp_variant.h" |
12 | 13 |
13 using WebKit::WebBindings; | 14 using WebKit::WebBindings; |
14 using webkit_glue::CppVariant; | 15 using webkit_glue::CppVariant; |
15 | 16 |
16 // Creates a std::string from an NPVariant of string type. If the NPVariant | 17 // Creates a std::string from an NPVariant of string type. If the NPVariant |
17 // is not a string, empties the std::string. | 18 // is not a string, empties the std::string. |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 | 70 |
70 ++g_deallocate_call_count; | 71 ++g_deallocate_call_count; |
71 free(npobj); | 72 free(npobj); |
72 } | 73 } |
73 | 74 |
74 static NPClass void_class = { NP_CLASS_STRUCT_VERSION, | 75 static NPClass void_class = { NP_CLASS_STRUCT_VERSION, |
75 MockNPAllocate, | 76 MockNPAllocate, |
76 MockNPDeallocate, | 77 MockNPDeallocate, |
77 0, 0, 0, 0, 0, 0, 0, 0, 0 }; | 78 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
78 | 79 |
79 NPObject* MakeVoidObject() { | 80 class CppVariantTest : public testing::Test { |
80 g_allocate_call_count = 0; | 81 public: |
81 g_deallocate_call_count = 0; | 82 CppVariantTest() : npp_(new struct _NPP) {} |
82 return WebBindings::createObject(NULL, &void_class); | 83 virtual ~CppVariantTest() {} |
83 } | |
84 | 84 |
85 TEST(CppVariantTest, NewVariantHasNullType) { | 85 virtual void SetUp() OVERRIDE { |
| 86 WebBindings::registerObjectOwner(npp_.get()); |
| 87 } |
| 88 |
| 89 virtual void TearDown() OVERRIDE { |
| 90 WebBindings::unregisterObjectOwner(npp_.get()); |
| 91 } |
| 92 |
| 93 struct _NPP* npp() { return npp_.get(); } |
| 94 |
| 95 NPObject* MakeVoidObject() { |
| 96 g_allocate_call_count = 0; |
| 97 g_deallocate_call_count = 0; |
| 98 return WebBindings::createObject(npp_.get(), &void_class); |
| 99 } |
| 100 |
| 101 private: |
| 102 scoped_ptr<struct _NPP> npp_; |
| 103 }; |
| 104 |
| 105 TEST_F(CppVariantTest, NewVariantHasNullType) { |
86 CppVariant value; | 106 CppVariant value; |
87 EXPECT_EQ(NPVariantType_Null, value.type); | 107 EXPECT_EQ(NPVariantType_Null, value.type); |
88 } | 108 } |
89 | 109 |
90 TEST(CppVariantTest, SetNullSetsType) { | 110 TEST_F(CppVariantTest, SetNullSetsType) { |
91 CppVariant value; | 111 CppVariant value; |
92 value.Set(17); | 112 value.Set(17); |
93 value.SetNull(); | 113 value.SetNull(); |
94 EXPECT_EQ(NPVariantType_Null, value.type); | 114 EXPECT_EQ(NPVariantType_Null, value.type); |
95 } | 115 } |
96 | 116 |
97 TEST(CppVariantTest, CopyConstructorDoesDeepCopy) { | 117 TEST_F(CppVariantTest, CopyConstructorDoesDeepCopy) { |
98 CppVariant source; | 118 CppVariant source; |
99 source.Set("test string"); | 119 source.Set("test string"); |
100 CppVariant dest = source; | 120 CppVariant dest = source; |
101 EXPECT_EQ(NPVariantType_String, dest.type); | 121 EXPECT_EQ(NPVariantType_String, dest.type); |
102 EXPECT_EQ(NPVariantType_String, source.type); | 122 EXPECT_EQ(NPVariantType_String, source.type); |
103 | 123 |
104 // Ensure that the string was copied, not just the pointer. | 124 // Ensure that the string was copied, not just the pointer. |
105 EXPECT_NE(source.value.stringValue.UTF8Characters, | 125 EXPECT_NE(source.value.stringValue.UTF8Characters, |
106 dest.value.stringValue.UTF8Characters); | 126 dest.value.stringValue.UTF8Characters); |
107 | 127 |
108 CheckString(source, dest); | 128 CheckString(source, dest); |
109 } | 129 } |
110 | 130 |
111 TEST(CppVariantTest, CopyConstructorIncrementsRefCount) { | 131 TEST_F(CppVariantTest, CopyConstructorIncrementsRefCount) { |
112 CppVariant source; | 132 CppVariant source; |
113 NPObject *object = MakeVoidObject(); | 133 NPObject *object = MakeVoidObject(); |
114 source.Set(object); | 134 source.Set(object); |
115 // 2 references so far. | 135 // 2 references so far. |
116 EXPECT_EQ(2U, source.value.objectValue->referenceCount); | 136 EXPECT_EQ(2U, source.value.objectValue->referenceCount); |
117 | 137 |
118 CppVariant dest = source; | 138 CppVariant dest = source; |
119 EXPECT_EQ(3U, dest.value.objectValue->referenceCount); | 139 EXPECT_EQ(3U, dest.value.objectValue->referenceCount); |
120 EXPECT_EQ(1, g_allocate_call_count); | 140 EXPECT_EQ(1, g_allocate_call_count); |
121 WebBindings::releaseObject(object); | 141 WebBindings::releaseObject(object); |
122 source.SetNull(); | 142 source.SetNull(); |
123 CheckObject(dest); | 143 CheckObject(dest); |
124 } | 144 } |
125 | 145 |
126 TEST(CppVariantTest, AssignmentDoesDeepCopy) { | 146 TEST_F(CppVariantTest, AssignmentDoesDeepCopy) { |
127 CppVariant source; | 147 CppVariant source; |
128 source.Set("test string"); | 148 source.Set("test string"); |
129 CppVariant dest; | 149 CppVariant dest; |
130 dest = source; | 150 dest = source; |
131 EXPECT_EQ(NPVariantType_String, dest.type); | 151 EXPECT_EQ(NPVariantType_String, dest.type); |
132 EXPECT_EQ(NPVariantType_String, source.type); | 152 EXPECT_EQ(NPVariantType_String, source.type); |
133 | 153 |
134 // Ensure that the string was copied, not just the pointer. | 154 // Ensure that the string was copied, not just the pointer. |
135 EXPECT_NE(source.value.stringValue.UTF8Characters, | 155 EXPECT_NE(source.value.stringValue.UTF8Characters, |
136 dest.value.stringValue.UTF8Characters); | 156 dest.value.stringValue.UTF8Characters); |
137 | 157 |
138 CheckString(source, dest); | 158 CheckString(source, dest); |
139 } | 159 } |
140 | 160 |
141 TEST(CppVariantTest, AssignmentIncrementsRefCount) { | 161 TEST_F(CppVariantTest, AssignmentIncrementsRefCount) { |
142 CppVariant source; | 162 CppVariant source; |
143 NPObject *object = MakeVoidObject(); | 163 NPObject *object = MakeVoidObject(); |
144 source.Set(object); | 164 source.Set(object); |
145 // 2 references so far. | 165 // 2 references so far. |
146 EXPECT_EQ(2U, source.value.objectValue->referenceCount); | 166 EXPECT_EQ(2U, source.value.objectValue->referenceCount); |
147 | 167 |
148 CppVariant dest; | 168 CppVariant dest; |
149 dest = source; | 169 dest = source; |
150 EXPECT_EQ(3U, dest.value.objectValue->referenceCount); | 170 EXPECT_EQ(3U, dest.value.objectValue->referenceCount); |
151 EXPECT_EQ(1, g_allocate_call_count); | 171 EXPECT_EQ(1, g_allocate_call_count); |
152 | 172 |
153 WebBindings::releaseObject(object); | 173 WebBindings::releaseObject(object); |
154 source.SetNull(); | 174 source.SetNull(); |
155 CheckObject(dest); | 175 CheckObject(dest); |
156 } | 176 } |
157 | 177 |
158 TEST(CppVariantTest, DestroyingCopyDoesNotCorruptSource) { | 178 TEST_F(CppVariantTest, DestroyingCopyDoesNotCorruptSource) { |
159 CppVariant source; | 179 CppVariant source; |
160 source.Set("test string"); | 180 source.Set("test string"); |
161 std::string before; | 181 std::string before; |
162 MakeStdString(source, &before); | 182 MakeStdString(source, &before); |
163 { | 183 { |
164 CppVariant dest = source; | 184 CppVariant dest = source; |
165 } | 185 } |
166 CheckString(before, source); | 186 CheckString(before, source); |
167 | 187 |
168 NPObject *object = MakeVoidObject(); | 188 NPObject *object = MakeVoidObject(); |
169 source.Set(object); | 189 source.Set(object); |
170 { | 190 { |
171 CppVariant dest2 = source; | 191 CppVariant dest2 = source; |
172 } | 192 } |
173 WebBindings::releaseObject(object); | 193 WebBindings::releaseObject(object); |
174 CheckObject(source); | 194 CheckObject(source); |
175 } | 195 } |
176 | 196 |
177 TEST(CppVariantTest, CopiesTypeAndValueToNPVariant) { | 197 TEST_F(CppVariantTest, CopiesTypeAndValueToNPVariant) { |
178 NPVariant np; | 198 NPVariant np; |
179 CppVariant cpp; | 199 CppVariant cpp; |
180 | 200 |
181 cpp.Set(true); | 201 cpp.Set(true); |
182 cpp.CopyToNPVariant(&np); | 202 cpp.CopyToNPVariant(&np); |
183 EXPECT_EQ(cpp.type, np.type); | 203 EXPECT_EQ(cpp.type, np.type); |
184 EXPECT_EQ(cpp.value.boolValue, np.value.boolValue); | 204 EXPECT_EQ(cpp.value.boolValue, np.value.boolValue); |
185 WebBindings::releaseVariantValue(&np); | 205 WebBindings::releaseVariantValue(&np); |
186 | 206 |
187 cpp.Set(17); | 207 cpp.Set(17); |
(...skipping 20 matching lines...) Expand all Loading... |
208 | 228 |
209 NPObject *object = MakeVoidObject(); | 229 NPObject *object = MakeVoidObject(); |
210 cpp.Set(object); | 230 cpp.Set(object); |
211 cpp.CopyToNPVariant(&np); | 231 cpp.CopyToNPVariant(&np); |
212 WebBindings::releaseObject(object); | 232 WebBindings::releaseObject(object); |
213 cpp.SetNull(); | 233 cpp.SetNull(); |
214 CheckObject(np); | 234 CheckObject(np); |
215 WebBindings::releaseVariantValue(&np); | 235 WebBindings::releaseVariantValue(&np); |
216 } | 236 } |
217 | 237 |
218 TEST(CppVariantTest, SetsTypeAndValueFromNPVariant) { | 238 TEST_F(CppVariantTest, SetsTypeAndValueFromNPVariant) { |
219 NPVariant np; | 239 NPVariant np; |
220 CppVariant cpp; | 240 CppVariant cpp; |
221 | 241 |
222 VOID_TO_NPVARIANT(np); | 242 VOID_TO_NPVARIANT(np); |
223 cpp.Set(np); | 243 cpp.Set(np); |
224 EXPECT_EQ(np.type, cpp.type); | 244 EXPECT_EQ(np.type, cpp.type); |
225 WebBindings::releaseVariantValue(&np); | 245 WebBindings::releaseVariantValue(&np); |
226 | 246 |
227 NULL_TO_NPVARIANT(np); | 247 NULL_TO_NPVARIANT(np); |
228 cpp.Set(np); | 248 cpp.Set(np); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 WebBindings::releaseVariantValue(&np); | 286 WebBindings::releaseVariantValue(&np); |
267 | 287 |
268 NPObject *obj = MakeVoidObject(); | 288 NPObject *obj = MakeVoidObject(); |
269 OBJECT_TO_NPVARIANT(obj, np); // Doesn't make a copy. | 289 OBJECT_TO_NPVARIANT(obj, np); // Doesn't make a copy. |
270 cpp.Set(np); | 290 cpp.Set(np); |
271 // Use this or WebBindings::releaseObject but NOT both. | 291 // Use this or WebBindings::releaseObject but NOT both. |
272 WebBindings::releaseVariantValue(&np); | 292 WebBindings::releaseVariantValue(&np); |
273 CheckObject(cpp); | 293 CheckObject(cpp); |
274 } | 294 } |
275 | 295 |
276 TEST(CppVariantTest, SetsSimpleTypesAndValues) { | 296 TEST_F(CppVariantTest, SetsSimpleTypesAndValues) { |
277 CppVariant cpp; | 297 CppVariant cpp; |
278 cpp.Set(true); | 298 cpp.Set(true); |
279 EXPECT_EQ(NPVariantType_Bool, cpp.type); | 299 EXPECT_EQ(NPVariantType_Bool, cpp.type); |
280 EXPECT_TRUE(cpp.value.boolValue); | 300 EXPECT_TRUE(cpp.value.boolValue); |
281 | 301 |
282 cpp.Set(5); | 302 cpp.Set(5); |
283 EXPECT_EQ(NPVariantType_Int32, cpp.type); | 303 EXPECT_EQ(NPVariantType_Int32, cpp.type); |
284 EXPECT_EQ(5, cpp.value.intValue); | 304 EXPECT_EQ(5, cpp.value.intValue); |
285 | 305 |
286 cpp.Set(1.234); | 306 cpp.Set(1.234); |
(...skipping 25 matching lines...) Expand all Loading... |
312 cpp.Set(np_intl_str); | 332 cpp.Set(np_intl_str); |
313 expected = std::string("\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84"); | 333 expected = std::string("\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84"); |
314 CheckString(expected, cpp); | 334 CheckString(expected, cpp); |
315 | 335 |
316 NPObject* obj = MakeVoidObject(); | 336 NPObject* obj = MakeVoidObject(); |
317 cpp.Set(obj); | 337 cpp.Set(obj); |
318 WebBindings::releaseObject(obj); | 338 WebBindings::releaseObject(obj); |
319 CheckObject(cpp); | 339 CheckObject(cpp); |
320 } | 340 } |
321 | 341 |
322 TEST(CppVariantTest, FreeDataSetsToVoid) { | 342 TEST_F(CppVariantTest, FreeDataSetsToVoid) { |
323 CppVariant cpp; | 343 CppVariant cpp; |
324 EXPECT_EQ(NPVariantType_Null, cpp.type); | 344 EXPECT_EQ(NPVariantType_Null, cpp.type); |
325 cpp.Set(12); | 345 cpp.Set(12); |
326 EXPECT_EQ(NPVariantType_Int32, cpp.type); | 346 EXPECT_EQ(NPVariantType_Int32, cpp.type); |
327 cpp.FreeData(); | 347 cpp.FreeData(); |
328 EXPECT_EQ(NPVariantType_Void, cpp.type); | 348 EXPECT_EQ(NPVariantType_Void, cpp.type); |
329 } | 349 } |
330 | 350 |
331 TEST(CppVariantTest, FreeDataReleasesObject) { | 351 TEST_F(CppVariantTest, FreeDataReleasesObject) { |
332 CppVariant cpp; | 352 CppVariant cpp; |
333 NPObject* object = MakeVoidObject(); | 353 NPObject* object = MakeVoidObject(); |
334 cpp.Set(object); | 354 cpp.Set(object); |
335 EXPECT_EQ(2U, object->referenceCount); | 355 EXPECT_EQ(2U, object->referenceCount); |
336 cpp.FreeData(); | 356 cpp.FreeData(); |
337 EXPECT_EQ(1U, object->referenceCount); | 357 EXPECT_EQ(1U, object->referenceCount); |
338 EXPECT_EQ(0, g_deallocate_call_count); | 358 EXPECT_EQ(0, g_deallocate_call_count); |
339 | 359 |
340 cpp.Set(object); | 360 cpp.Set(object); |
341 WebBindings::releaseObject(object); | 361 WebBindings::releaseObject(object); |
342 EXPECT_EQ(0, g_deallocate_call_count); | 362 EXPECT_EQ(0, g_deallocate_call_count); |
343 cpp.FreeData(); | 363 cpp.FreeData(); |
344 EXPECT_EQ(1, g_deallocate_call_count); | 364 EXPECT_EQ(1, g_deallocate_call_count); |
345 } | 365 } |
346 | 366 |
347 TEST(CppVariantTest, IsTypeFunctionsWork) { | 367 TEST_F(CppVariantTest, IsTypeFunctionsWork) { |
348 CppVariant cpp; | 368 CppVariant cpp; |
349 // These should not happen in practice, since voids are not supported | 369 // These should not happen in practice, since voids are not supported |
350 // This test must be first since it just clobbers internal data without | 370 // This test must be first since it just clobbers internal data without |
351 // releasing. | 371 // releasing. |
352 VOID_TO_NPVARIANT(cpp); | 372 VOID_TO_NPVARIANT(cpp); |
353 EXPECT_FALSE(cpp.isBool()); | 373 EXPECT_FALSE(cpp.isBool()); |
354 EXPECT_FALSE(cpp.isInt32()); | 374 EXPECT_FALSE(cpp.isInt32()); |
355 EXPECT_FALSE(cpp.isDouble()); | 375 EXPECT_FALSE(cpp.isDouble()); |
356 EXPECT_FALSE(cpp.isNumber()); | 376 EXPECT_FALSE(cpp.isNumber()); |
357 EXPECT_FALSE(cpp.isString()); | 377 EXPECT_FALSE(cpp.isString()); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 const char* s = "string"; | 467 const char* s = "string"; |
448 size_t length = strlen(s); | 468 size_t length = strlen(s); |
449 char* mem = static_cast<char*>(malloc(length + 1)); | 469 char* mem = static_cast<char*>(malloc(length + 1)); |
450 base::strlcpy(mem, s, length + 1); | 470 base::strlcpy(mem, s, length + 1); |
451 STRINGZ_TO_NPVARIANT(mem, *result); | 471 STRINGZ_TO_NPVARIANT(mem, *result); |
452 } | 472 } |
453 | 473 |
454 return true; | 474 return true; |
455 } | 475 } |
456 | 476 |
457 TEST(CppVariantTest, ToVector) { | 477 TEST_F(CppVariantTest, ToVector) { |
458 NPClass array_like_class = { | 478 NPClass array_like_class = { |
459 NP_CLASS_STRUCT_VERSION, | 479 NP_CLASS_STRUCT_VERSION, |
460 0, // NPAllocateFunctionPtr allocate; | 480 0, // NPAllocateFunctionPtr allocate; |
461 0, // NPDeallocateFunctionPtr deallocate; | 481 0, // NPDeallocateFunctionPtr deallocate; |
462 0, // NPInvalidateFunctionPtr invalidate; | 482 0, // NPInvalidateFunctionPtr invalidate; |
463 0, // NPHasMethodFunctionPtr hasMethod; | 483 0, // NPHasMethodFunctionPtr hasMethod; |
464 0, // NPInvokeFunctionPtr invoke; | 484 0, // NPInvokeFunctionPtr invoke; |
465 0, // NPInvokeDefaultFunctionPtr invokeDefault; | 485 0, // NPInvokeDefaultFunctionPtr invokeDefault; |
466 MockNPHasPropertyFunction, // NPHasPropertyFunctionPtr hasProperty; | 486 MockNPHasPropertyFunction, // NPHasPropertyFunctionPtr hasProperty; |
467 MockNPGetPropertyFunction, // NPGetPropertyFunctionPtr getProperty; | 487 MockNPGetPropertyFunction, // NPGetPropertyFunctionPtr getProperty; |
468 0, // NPSetPropertyFunctionPtr setProperty; | 488 0, // NPSetPropertyFunctionPtr setProperty; |
469 0, // NPRemovePropertyFunctionPtr removeProperty; | 489 0, // NPRemovePropertyFunctionPtr removeProperty; |
470 0, // NPEnumerationFunctionPtr enumerate; | 490 0, // NPEnumerationFunctionPtr enumerate; |
471 0 // NPConstructFunctionPtr construct; | 491 0 // NPConstructFunctionPtr construct; |
472 }; | 492 }; |
473 | 493 |
474 NPObject* obj = WebBindings::createObject(NULL, &array_like_class); | 494 NPObject* obj = WebBindings::createObject(npp(), &array_like_class); |
475 | 495 |
476 CppVariant cpp; | 496 CppVariant cpp; |
477 cpp.Set(obj); | 497 cpp.Set(obj); |
478 | 498 |
479 std::vector<CppVariant> cpp_vector = cpp.ToVector(); | 499 std::vector<CppVariant> cpp_vector = cpp.ToVector(); |
480 EXPECT_EQ(4u, cpp_vector.size()); | 500 EXPECT_EQ(4u, cpp_vector.size()); |
481 | 501 |
482 EXPECT_TRUE(cpp_vector[0].isDouble()); | 502 EXPECT_TRUE(cpp_vector[0].isDouble()); |
483 EXPECT_EQ(0, cpp_vector[0].ToDouble()); | 503 EXPECT_EQ(0, cpp_vector[0].ToDouble()); |
484 | 504 |
485 EXPECT_TRUE(cpp_vector[1].isBool()); | 505 EXPECT_TRUE(cpp_vector[1].isBool()); |
486 EXPECT_EQ(true, cpp_vector[1].ToBoolean()); | 506 EXPECT_EQ(true, cpp_vector[1].ToBoolean()); |
487 | 507 |
488 EXPECT_TRUE(cpp_vector[2].isNull()); | 508 EXPECT_TRUE(cpp_vector[2].isNull()); |
489 | 509 |
490 EXPECT_TRUE(cpp_vector[3].isString()); | 510 EXPECT_TRUE(cpp_vector[3].isString()); |
491 CheckString("string", cpp_vector[3]); | 511 CheckString("string", cpp_vector[3]); |
492 | 512 |
493 WebBindings::releaseObject(obj); | 513 WebBindings::releaseObject(obj); |
494 } | 514 } |
OLD | NEW |