Index: webkit/renderer/cpp_variant_unittest.cc |
diff --git a/webkit/renderer/cpp_variant_unittest.cc b/webkit/renderer/cpp_variant_unittest.cc |
deleted file mode 100644 |
index dc7d908c3c83a31c7e6ae462d9de432d55cf2c27..0000000000000000000000000000000000000000 |
--- a/webkit/renderer/cpp_variant_unittest.cc |
+++ /dev/null |
@@ -1,514 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <vector> |
- |
-#include "base/compiler_specific.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/strings/string_util.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/WebKit/public/web/WebBindings.h" |
-#include "webkit/renderer/cpp_variant.h" |
- |
-using blink::WebBindings; |
-using webkit_glue::CppVariant; |
- |
-// Creates a std::string from an NPVariant of string type. If the NPVariant |
-// is not a string, empties the std::string. |
-void MakeStdString(const NPVariant& np, std::string* std_string) { |
- if (np.type == NPVariantType_String) { |
- const char* chars = |
- reinterpret_cast<const char*>(np.value.stringValue.UTF8Characters); |
- (*std_string).assign(chars, np.value.stringValue.UTF8Length); |
- } else { |
- (*std_string).clear(); |
- } |
-} |
- |
-// Verifies that the actual NPVariant is a string and that its value matches |
-// the expected_str. |
-void CheckString(const std::string& expected_str, const NPVariant& actual) { |
- EXPECT_EQ(NPVariantType_String, actual.type); |
- std::string actual_str; |
- MakeStdString(actual, &actual_str); |
- EXPECT_EQ(expected_str, actual_str); |
-} |
- |
-// Verifies that both the actual and the expected NPVariants are strings and |
-// that their values match. |
-void CheckString(const NPVariant& expected, const NPVariant& actual) { |
- EXPECT_EQ(NPVariantType_String, expected.type); |
- std::string expected_str; |
- MakeStdString(expected, &expected_str); |
- CheckString(expected_str, actual); |
-} |
- |
-int g_allocate_call_count = 0; |
-int g_deallocate_call_count = 0; |
- |
-void CheckObject(const NPVariant& actual) { |
- EXPECT_EQ(NPVariantType_Object, actual.type); |
- EXPECT_TRUE(actual.value.objectValue); |
- EXPECT_EQ(1U, actual.value.objectValue->referenceCount); |
- EXPECT_EQ(1, g_allocate_call_count); |
- EXPECT_EQ(0, g_deallocate_call_count); |
-} |
- |
-NPObject* MockNPAllocate(NPP npp, NPClass* aClass) { |
- // This is a mock allocate method that mimics the behavior |
- // of WebBindings::createObject when allocate() is NULL |
- |
- ++g_allocate_call_count; |
- // Ignore npp and NPClass |
- return reinterpret_cast<NPObject*>(malloc(sizeof(NPObject))); |
-} |
- |
-void MockNPDeallocate(NPObject* npobj) { |
- // This is a mock deallocate method that mimics the behavior |
- // of NPN_DeallocateObject when deallocate() is NULL |
- |
- ++g_deallocate_call_count; |
- free(npobj); |
-} |
- |
-static NPClass void_class = { NP_CLASS_STRUCT_VERSION, |
- MockNPAllocate, |
- MockNPDeallocate, |
- 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
- |
-class CppVariantTest : public testing::Test { |
-public: |
- CppVariantTest() : npp_(new struct _NPP) {} |
- virtual ~CppVariantTest() {} |
- |
- virtual void SetUp() OVERRIDE { |
- WebBindings::registerObjectOwner(npp_.get()); |
- } |
- |
- virtual void TearDown() OVERRIDE { |
- WebBindings::unregisterObjectOwner(npp_.get()); |
- } |
- |
- struct _NPP* npp() { return npp_.get(); } |
- |
- NPObject* MakeVoidObject() { |
- g_allocate_call_count = 0; |
- g_deallocate_call_count = 0; |
- return WebBindings::createObject(npp_.get(), &void_class); |
- } |
- |
-private: |
- scoped_ptr<struct _NPP> npp_; |
-}; |
- |
-TEST_F(CppVariantTest, NewVariantHasNullType) { |
- CppVariant value; |
- EXPECT_EQ(NPVariantType_Null, value.type); |
-} |
- |
-TEST_F(CppVariantTest, SetNullSetsType) { |
- CppVariant value; |
- value.Set(17); |
- value.SetNull(); |
- EXPECT_EQ(NPVariantType_Null, value.type); |
-} |
- |
-TEST_F(CppVariantTest, CopyConstructorDoesDeepCopy) { |
- CppVariant source; |
- source.Set("test string"); |
- CppVariant dest = source; |
- EXPECT_EQ(NPVariantType_String, dest.type); |
- EXPECT_EQ(NPVariantType_String, source.type); |
- |
- // Ensure that the string was copied, not just the pointer. |
- EXPECT_NE(source.value.stringValue.UTF8Characters, |
- dest.value.stringValue.UTF8Characters); |
- |
- CheckString(source, dest); |
-} |
- |
-TEST_F(CppVariantTest, CopyConstructorIncrementsRefCount) { |
- CppVariant source; |
- NPObject *object = MakeVoidObject(); |
- source.Set(object); |
- // 2 references so far. |
- EXPECT_EQ(2U, source.value.objectValue->referenceCount); |
- |
- CppVariant dest = source; |
- EXPECT_EQ(3U, dest.value.objectValue->referenceCount); |
- EXPECT_EQ(1, g_allocate_call_count); |
- WebBindings::releaseObject(object); |
- source.SetNull(); |
- CheckObject(dest); |
-} |
- |
-TEST_F(CppVariantTest, AssignmentDoesDeepCopy) { |
- CppVariant source; |
- source.Set("test string"); |
- CppVariant dest; |
- dest = source; |
- EXPECT_EQ(NPVariantType_String, dest.type); |
- EXPECT_EQ(NPVariantType_String, source.type); |
- |
- // Ensure that the string was copied, not just the pointer. |
- EXPECT_NE(source.value.stringValue.UTF8Characters, |
- dest.value.stringValue.UTF8Characters); |
- |
- CheckString(source, dest); |
-} |
- |
-TEST_F(CppVariantTest, AssignmentIncrementsRefCount) { |
- CppVariant source; |
- NPObject *object = MakeVoidObject(); |
- source.Set(object); |
- // 2 references so far. |
- EXPECT_EQ(2U, source.value.objectValue->referenceCount); |
- |
- CppVariant dest; |
- dest = source; |
- EXPECT_EQ(3U, dest.value.objectValue->referenceCount); |
- EXPECT_EQ(1, g_allocate_call_count); |
- |
- WebBindings::releaseObject(object); |
- source.SetNull(); |
- CheckObject(dest); |
-} |
- |
-TEST_F(CppVariantTest, DestroyingCopyDoesNotCorruptSource) { |
- CppVariant source; |
- source.Set("test string"); |
- std::string before; |
- MakeStdString(source, &before); |
- { |
- CppVariant dest = source; |
- } |
- CheckString(before, source); |
- |
- NPObject *object = MakeVoidObject(); |
- source.Set(object); |
- { |
- CppVariant dest2 = source; |
- } |
- WebBindings::releaseObject(object); |
- CheckObject(source); |
-} |
- |
-TEST_F(CppVariantTest, CopiesTypeAndValueToNPVariant) { |
- NPVariant np; |
- CppVariant cpp; |
- |
- cpp.Set(true); |
- cpp.CopyToNPVariant(&np); |
- EXPECT_EQ(cpp.type, np.type); |
- EXPECT_EQ(cpp.value.boolValue, np.value.boolValue); |
- WebBindings::releaseVariantValue(&np); |
- |
- cpp.Set(17); |
- cpp.CopyToNPVariant(&np); |
- EXPECT_EQ(cpp.type, np.type); |
- EXPECT_EQ(cpp.value.intValue, np.value.intValue); |
- WebBindings::releaseVariantValue(&np); |
- |
- cpp.Set(3.1415); |
- cpp.CopyToNPVariant(&np); |
- EXPECT_EQ(cpp.type, np.type); |
- EXPECT_EQ(cpp.value.doubleValue, np.value.doubleValue); |
- WebBindings::releaseVariantValue(&np); |
- |
- cpp.Set("test value"); |
- cpp.CopyToNPVariant(&np); |
- CheckString("test value", np); |
- WebBindings::releaseVariantValue(&np); |
- |
- cpp.SetNull(); |
- cpp.CopyToNPVariant(&np); |
- EXPECT_EQ(cpp.type, np.type); |
- WebBindings::releaseVariantValue(&np); |
- |
- NPObject *object = MakeVoidObject(); |
- cpp.Set(object); |
- cpp.CopyToNPVariant(&np); |
- WebBindings::releaseObject(object); |
- cpp.SetNull(); |
- CheckObject(np); |
- WebBindings::releaseVariantValue(&np); |
-} |
- |
-TEST_F(CppVariantTest, SetsTypeAndValueFromNPVariant) { |
- NPVariant np; |
- CppVariant cpp; |
- |
- VOID_TO_NPVARIANT(np); |
- cpp.Set(np); |
- EXPECT_EQ(np.type, cpp.type); |
- WebBindings::releaseVariantValue(&np); |
- |
- NULL_TO_NPVARIANT(np); |
- cpp.Set(np); |
- EXPECT_EQ(np.type, cpp.type); |
- WebBindings::releaseVariantValue(&np); |
- |
- BOOLEAN_TO_NPVARIANT(true, np); |
- cpp.Set(np); |
- EXPECT_EQ(np.type, cpp.type); |
- EXPECT_EQ(np.value.boolValue, cpp.value.boolValue); |
- WebBindings::releaseVariantValue(&np); |
- |
- INT32_TO_NPVARIANT(15, np); |
- cpp.Set(np); |
- EXPECT_EQ(np.type, cpp.type); |
- EXPECT_EQ(np.value.intValue, cpp.value.intValue); |
- WebBindings::releaseVariantValue(&np); |
- |
- DOUBLE_TO_NPVARIANT(2.71828, np); |
- cpp.Set(np); |
- EXPECT_EQ(np.type, cpp.type); |
- EXPECT_EQ(np.value.doubleValue, cpp.value.doubleValue); |
- WebBindings::releaseVariantValue(&np); |
- |
- NPString np_ascii_str = { "1st test value", |
- static_cast<uint32_t>(strlen("1st test value")) }; |
- WebBindings::initializeVariantWithStringCopy(&np, &np_ascii_str); |
- cpp.Set(np); |
- CheckString("1st test value", cpp); |
- WebBindings::releaseVariantValue(&np); |
- |
- // Test characters represented in 2/3/4 bytes in UTF-8 |
- // Greek alpha, Chinese number 1 (horizontal bar), |
- // Deseret letter (similar to 'O') |
- NPString np_intl_str = { "\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84", |
- static_cast<uint32_t>(strlen( |
- "\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84")) }; |
- WebBindings::initializeVariantWithStringCopy(&np, &np_intl_str); |
- cpp.Set(np); |
- CheckString("\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84", cpp); |
- WebBindings::releaseVariantValue(&np); |
- |
- NPObject *obj = MakeVoidObject(); |
- OBJECT_TO_NPVARIANT(obj, np); // Doesn't make a copy. |
- cpp.Set(np); |
- // Use this or WebBindings::releaseObject but NOT both. |
- WebBindings::releaseVariantValue(&np); |
- CheckObject(cpp); |
-} |
- |
-TEST_F(CppVariantTest, SetsSimpleTypesAndValues) { |
- CppVariant cpp; |
- cpp.Set(true); |
- EXPECT_EQ(NPVariantType_Bool, cpp.type); |
- EXPECT_TRUE(cpp.value.boolValue); |
- |
- cpp.Set(5); |
- EXPECT_EQ(NPVariantType_Int32, cpp.type); |
- EXPECT_EQ(5, cpp.value.intValue); |
- |
- cpp.Set(1.234); |
- EXPECT_EQ(NPVariantType_Double, cpp.type); |
- EXPECT_EQ(1.234, cpp.value.doubleValue); |
- |
- // C string |
- cpp.Set("1st test string"); |
- CheckString("1st test string", cpp); |
- |
- // std::string |
- std::string source("std test string"); |
- cpp.Set(source); |
- CheckString("std test string", cpp); |
- |
- // NPString |
- NPString np_ascii_str = { "test NPString", |
- static_cast<uint32_t>(strlen("test NPString")) }; |
- cpp.Set(np_ascii_str); |
- std::string expected("test NPString"); |
- CheckString(expected, cpp); |
- |
- // Test characters represented in 2/3/4 bytes in UTF-8 |
- // Greek alpha, Chinese number 1 (horizontal bar), |
- // Deseret letter (similar to 'O') |
- NPString np_intl_str = { "\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84", |
- static_cast<uint32_t>(strlen( |
- "\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84")) }; |
- cpp.Set(np_intl_str); |
- expected = std::string("\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84"); |
- CheckString(expected, cpp); |
- |
- NPObject* obj = MakeVoidObject(); |
- cpp.Set(obj); |
- WebBindings::releaseObject(obj); |
- CheckObject(cpp); |
-} |
- |
-TEST_F(CppVariantTest, FreeDataSetsToVoid) { |
- CppVariant cpp; |
- EXPECT_EQ(NPVariantType_Null, cpp.type); |
- cpp.Set(12); |
- EXPECT_EQ(NPVariantType_Int32, cpp.type); |
- cpp.FreeData(); |
- EXPECT_EQ(NPVariantType_Void, cpp.type); |
-} |
- |
-TEST_F(CppVariantTest, FreeDataReleasesObject) { |
- CppVariant cpp; |
- NPObject* object = MakeVoidObject(); |
- cpp.Set(object); |
- EXPECT_EQ(2U, object->referenceCount); |
- cpp.FreeData(); |
- EXPECT_EQ(1U, object->referenceCount); |
- EXPECT_EQ(0, g_deallocate_call_count); |
- |
- cpp.Set(object); |
- WebBindings::releaseObject(object); |
- EXPECT_EQ(0, g_deallocate_call_count); |
- cpp.FreeData(); |
- EXPECT_EQ(1, g_deallocate_call_count); |
-} |
- |
-TEST_F(CppVariantTest, IsTypeFunctionsWork) { |
- CppVariant cpp; |
- // These should not happen in practice, since voids are not supported |
- // This test must be first since it just clobbers internal data without |
- // releasing. |
- VOID_TO_NPVARIANT(cpp); |
- EXPECT_FALSE(cpp.isBool()); |
- EXPECT_FALSE(cpp.isInt32()); |
- EXPECT_FALSE(cpp.isDouble()); |
- EXPECT_FALSE(cpp.isNumber()); |
- EXPECT_FALSE(cpp.isString()); |
- EXPECT_TRUE(cpp.isVoid()); |
- EXPECT_FALSE(cpp.isNull()); |
- EXPECT_TRUE(cpp.isEmpty()); |
- |
- cpp.Set(true); |
- EXPECT_TRUE(cpp.isBool()); |
- EXPECT_FALSE(cpp.isInt32()); |
- EXPECT_FALSE(cpp.isDouble()); |
- EXPECT_FALSE(cpp.isNumber()); |
- EXPECT_FALSE(cpp.isString()); |
- EXPECT_FALSE(cpp.isVoid()); |
- EXPECT_FALSE(cpp.isNull()); |
- EXPECT_FALSE(cpp.isEmpty()); |
- EXPECT_FALSE(cpp.isObject()); |
- |
- cpp.Set(12); |
- EXPECT_FALSE(cpp.isBool()); |
- EXPECT_TRUE(cpp.isInt32()); |
- EXPECT_FALSE(cpp.isDouble()); |
- EXPECT_TRUE(cpp.isNumber()); |
- EXPECT_FALSE(cpp.isString()); |
- EXPECT_FALSE(cpp.isVoid()); |
- EXPECT_FALSE(cpp.isNull()); |
- EXPECT_FALSE(cpp.isEmpty()); |
- EXPECT_FALSE(cpp.isObject()); |
- |
- cpp.Set(3.1415); |
- EXPECT_FALSE(cpp.isBool()); |
- EXPECT_FALSE(cpp.isInt32()); |
- EXPECT_TRUE(cpp.isDouble()); |
- EXPECT_TRUE(cpp.isNumber()); |
- EXPECT_FALSE(cpp.isString()); |
- EXPECT_FALSE(cpp.isVoid()); |
- EXPECT_FALSE(cpp.isNull()); |
- EXPECT_FALSE(cpp.isEmpty()); |
- EXPECT_FALSE(cpp.isObject()); |
- |
- cpp.Set("a string"); |
- EXPECT_FALSE(cpp.isBool()); |
- EXPECT_FALSE(cpp.isInt32()); |
- EXPECT_FALSE(cpp.isDouble()); |
- EXPECT_FALSE(cpp.isNumber()); |
- EXPECT_TRUE(cpp.isString()); |
- EXPECT_FALSE(cpp.isVoid()); |
- EXPECT_FALSE(cpp.isNull()); |
- EXPECT_FALSE(cpp.isEmpty()); |
- EXPECT_FALSE(cpp.isObject()); |
- |
- cpp.SetNull(); |
- EXPECT_FALSE(cpp.isBool()); |
- EXPECT_FALSE(cpp.isInt32()); |
- EXPECT_FALSE(cpp.isDouble()); |
- EXPECT_FALSE(cpp.isNumber()); |
- EXPECT_FALSE(cpp.isString()); |
- EXPECT_FALSE(cpp.isVoid()); |
- EXPECT_TRUE(cpp.isNull()); |
- EXPECT_TRUE(cpp.isEmpty()); |
- EXPECT_FALSE(cpp.isObject()); |
- |
- NPObject *obj = MakeVoidObject(); |
- cpp.Set(obj); |
- EXPECT_FALSE(cpp.isBool()); |
- EXPECT_FALSE(cpp.isInt32()); |
- EXPECT_FALSE(cpp.isDouble()); |
- EXPECT_FALSE(cpp.isNumber()); |
- EXPECT_FALSE(cpp.isString()); |
- EXPECT_FALSE(cpp.isVoid()); |
- EXPECT_FALSE(cpp.isNull()); |
- EXPECT_FALSE(cpp.isEmpty()); |
- EXPECT_TRUE(cpp.isObject()); |
- WebBindings::releaseObject(obj); |
- CheckObject(cpp); |
-} |
- |
-bool MockNPHasPropertyFunction(NPObject *npobj, NPIdentifier name) { |
- return true; |
-} |
- |
-bool MockNPGetPropertyFunction(NPObject *npobj, NPIdentifier name, |
- NPVariant *result) { |
- if (WebBindings::getStringIdentifier("length") == name) { |
- DOUBLE_TO_NPVARIANT(4, *result); |
- } else if (WebBindings::getIntIdentifier(0) == name) { |
- DOUBLE_TO_NPVARIANT(0, *result); |
- } else if (WebBindings::getIntIdentifier(1) == name) { |
- BOOLEAN_TO_NPVARIANT(true, *result); |
- } else if (WebBindings::getIntIdentifier(2) == name) { |
- NULL_TO_NPVARIANT(*result); |
- } else if (WebBindings::getIntIdentifier(3) == name) { |
- const char* s = "string"; |
- size_t length = strlen(s); |
- char* mem = static_cast<char*>(malloc(length + 1)); |
- base::strlcpy(mem, s, length + 1); |
- STRINGZ_TO_NPVARIANT(mem, *result); |
- } |
- |
- return true; |
-} |
- |
-TEST_F(CppVariantTest, ToVector) { |
- NPClass array_like_class = { |
- NP_CLASS_STRUCT_VERSION, |
- 0, // NPAllocateFunctionPtr allocate; |
- 0, // NPDeallocateFunctionPtr deallocate; |
- 0, // NPInvalidateFunctionPtr invalidate; |
- 0, // NPHasMethodFunctionPtr hasMethod; |
- 0, // NPInvokeFunctionPtr invoke; |
- 0, // NPInvokeDefaultFunctionPtr invokeDefault; |
- MockNPHasPropertyFunction, // NPHasPropertyFunctionPtr hasProperty; |
- MockNPGetPropertyFunction, // NPGetPropertyFunctionPtr getProperty; |
- 0, // NPSetPropertyFunctionPtr setProperty; |
- 0, // NPRemovePropertyFunctionPtr removeProperty; |
- 0, // NPEnumerationFunctionPtr enumerate; |
- 0 // NPConstructFunctionPtr construct; |
- }; |
- |
- NPObject* obj = WebBindings::createObject(npp(), &array_like_class); |
- |
- CppVariant cpp; |
- cpp.Set(obj); |
- |
- std::vector<CppVariant> cpp_vector = cpp.ToVector(); |
- EXPECT_EQ(4u, cpp_vector.size()); |
- |
- EXPECT_TRUE(cpp_vector[0].isDouble()); |
- EXPECT_EQ(0, cpp_vector[0].ToDouble()); |
- |
- EXPECT_TRUE(cpp_vector[1].isBool()); |
- EXPECT_EQ(true, cpp_vector[1].ToBoolean()); |
- |
- EXPECT_TRUE(cpp_vector[2].isNull()); |
- |
- EXPECT_TRUE(cpp_vector[3].isString()); |
- CheckString("string", cpp_vector[3]); |
- |
- WebBindings::releaseObject(obj); |
-} |