| // Copyright (c) 2006-2008 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 "gpu/np_utils/np_object_mock.h" |
| #include "gpu/np_utils/np_browser_stub.h" |
| #include "gpu/np_utils/np_utils.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| using testing::_; |
| using testing::DoAll; |
| using testing::MakeMatcher; |
| using testing::Matcher; |
| using testing::Pointee; |
| using testing::Return; |
| using testing::SetArgumentPointee; |
| using testing::StrictMock; |
| |
| namespace np_utils { |
| |
| class NPUtilsTest : public testing::Test { |
| protected: |
| StubNPBrowser stub_browser_; |
| NPP_t npp_; |
| NPVariant variant_; |
| }; |
| |
| TEST_F(NPUtilsTest, TestBoolNPVariantToValue) { |
| bool v; |
| |
| BOOLEAN_TO_NPVARIANT(false, variant_); |
| EXPECT_TRUE(NPVariantToValue(&v, variant_)); |
| EXPECT_FALSE(v); |
| |
| BOOLEAN_TO_NPVARIANT(true, variant_); |
| EXPECT_TRUE(NPVariantToValue(&v, variant_)); |
| EXPECT_TRUE(v); |
| |
| INT32_TO_NPVARIANT(7, variant_); |
| EXPECT_FALSE(NPVariantToValue(&v, variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestIntNPVariantToValue) { |
| INT32_TO_NPVARIANT(7, variant_); |
| |
| int v1; |
| EXPECT_TRUE(NPVariantToValue(&v1, variant_)); |
| EXPECT_EQ(7, v1); |
| |
| float v2; |
| EXPECT_TRUE(NPVariantToValue(&v2, variant_)); |
| EXPECT_EQ(7.0f, v2); |
| |
| double v3; |
| EXPECT_TRUE(NPVariantToValue(&v3, variant_)); |
| EXPECT_EQ(7.0, v3); |
| |
| BOOLEAN_TO_NPVARIANT(false, variant_); |
| EXPECT_FALSE(NPVariantToValue(&v1, variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestFloatNPVariantToValue) { |
| float v; |
| |
| DOUBLE_TO_NPVARIANT(7.0, variant_); |
| EXPECT_TRUE(NPVariantToValue(&v, variant_)); |
| EXPECT_EQ(7.0f, v); |
| |
| BOOLEAN_TO_NPVARIANT(false, variant_); |
| EXPECT_FALSE(NPVariantToValue(&v, variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestDoubleNPVariantToValue) { |
| double v; |
| |
| DOUBLE_TO_NPVARIANT(7.0, variant_); |
| EXPECT_TRUE(NPVariantToValue(&v, variant_)); |
| EXPECT_EQ(7.0, v); |
| |
| BOOLEAN_TO_NPVARIANT(false, variant_); |
| EXPECT_FALSE(NPVariantToValue(&v, variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestStringNPVariantToValue) { |
| std::string v; |
| |
| STRINGZ_TO_NPVARIANT("hello", variant_); |
| EXPECT_TRUE(NPVariantToValue(&v, variant_)); |
| EXPECT_EQ(std::string("hello"), v); |
| |
| BOOLEAN_TO_NPVARIANT(false, variant_); |
| EXPECT_FALSE(NPVariantToValue(&v, variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestObjectNPVariantToValue) { |
| NPObjectPointer<NPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| NPObjectPointer<NPObject> v; |
| |
| OBJECT_TO_NPVARIANT(object.Get(), variant_); |
| EXPECT_TRUE(NPVariantToValue(&v, variant_)); |
| EXPECT_EQ(object, v); |
| |
| BOOLEAN_TO_NPVARIANT(false, variant_); |
| EXPECT_FALSE(NPVariantToValue(&v, variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestNullNPVariantToValue) { |
| NPObjectPointer<NPObject> v; |
| |
| NULL_TO_NPVARIANT(variant_); |
| EXPECT_TRUE(NPVariantToValue(&v, variant_)); |
| EXPECT_TRUE(NPObjectPointer<NPObject>() == v); |
| |
| BOOLEAN_TO_NPVARIANT(false, variant_); |
| EXPECT_FALSE(NPVariantToValue(&v, variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestDerivedObjectNPVariantToValue) { |
| NPObjectPointer<NPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| NPObjectPointer<StrictMock<MockNPObject> > v; |
| |
| OBJECT_TO_NPVARIANT(object.Get(), variant_); |
| EXPECT_TRUE(NPVariantToValue(&v, variant_)); |
| EXPECT_EQ(object, v); |
| } |
| |
| TEST_F(NPUtilsTest, |
| TestDerivedObjectNPVariantToValueFailsIfValueHasDifferentType) { |
| NPObjectPointer<NPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| NPObjectPointer<MockNPObject> v; |
| |
| OBJECT_TO_NPVARIANT(object.Get(), variant_); |
| EXPECT_FALSE(NPVariantToValue(&v, variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestBoolValueToNPVariant) { |
| ValueToNPVariant(true, &variant_); |
| EXPECT_TRUE(NPVARIANT_IS_BOOLEAN(variant_)); |
| EXPECT_TRUE(NPVARIANT_TO_BOOLEAN(variant_)); |
| |
| ValueToNPVariant(false, &variant_); |
| EXPECT_TRUE(NPVARIANT_IS_BOOLEAN(variant_)); |
| EXPECT_FALSE(NPVARIANT_TO_BOOLEAN(variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestIntValueToNPVariant) { |
| ValueToNPVariant(7, &variant_); |
| EXPECT_TRUE(NPVARIANT_IS_INT32(variant_)); |
| EXPECT_EQ(7, NPVARIANT_TO_INT32(variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestFloatValueToNPVariant) { |
| ValueToNPVariant(7.0f, &variant_); |
| EXPECT_TRUE(NPVARIANT_IS_DOUBLE(variant_)); |
| EXPECT_EQ(7.0, NPVARIANT_TO_DOUBLE(variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestDoubleValueToNPVariant) { |
| ValueToNPVariant(7.0, &variant_); |
| EXPECT_TRUE(NPVARIANT_IS_DOUBLE(variant_)); |
| EXPECT_EQ(7.0, NPVARIANT_TO_DOUBLE(variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, TestStringValueToNPVariant) { |
| ValueToNPVariant(std::string("hello"), &variant_); |
| EXPECT_TRUE(NPVARIANT_IS_STRING(variant_)); |
| EXPECT_EQ(std::string("hello"), |
| std::string(variant_.value.stringValue.UTF8Characters, |
| variant_.value.stringValue.UTF8Length)); |
| } |
| |
| TEST_F(NPUtilsTest, TestObjectValueToNPVariant) { |
| NPObjectPointer<NPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| ValueToNPVariant(object, &variant_); |
| EXPECT_TRUE(NPVARIANT_IS_OBJECT(variant_)); |
| EXPECT_EQ(object.Get(), NPVARIANT_TO_OBJECT(variant_)); |
| |
| NPBrowser::get()->ReleaseVariantValue(&variant_); |
| } |
| |
| TEST_F(NPUtilsTest, TestNullValueToNPVariant) { |
| ValueToNPVariant(NPObjectPointer<NPObject>(), &variant_); |
| EXPECT_TRUE(NPVARIANT_IS_NULL(variant_)); |
| } |
| |
| TEST_F(NPUtilsTest, CanCopyObjectSmartVariant) { |
| NPObjectPointer<NPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| EXPECT_EQ(1, object->referenceCount); |
| { |
| SmartNPVariant v1(object); |
| EXPECT_EQ(2, object->referenceCount); |
| { |
| SmartNPVariant v2(v1); |
| EXPECT_EQ(3, object->referenceCount); |
| } |
| EXPECT_EQ(2, object->referenceCount); |
| } |
| EXPECT_EQ(1, object->referenceCount); |
| } |
| |
| TEST_F(NPUtilsTest, CanCopyStringSmartVariant) { |
| SmartNPVariant v1(std::string("hello")); |
| SmartNPVariant v2(v1); |
| std::string r; |
| EXPECT_TRUE(NPVariantToValue(&r, v2)); |
| EXPECT_EQ(std::string("hello"), r); |
| EXPECT_NE(v1.value.stringValue.UTF8Characters, |
| v2.value.stringValue.UTF8Characters); |
| } |
| |
| TEST_F(NPUtilsTest, CanReleaseSmartVariant) { |
| SmartNPVariant variant(std::string("hello")); |
| EXPECT_FALSE(variant.IsVoid()); |
| variant.Release(); |
| EXPECT_TRUE(variant.IsVoid()); |
| } |
| |
| template <typename T> |
| class VariantMatcher : public testing::MatcherInterface<const NPVariant&> { |
| public: |
| explicit VariantMatcher(const T& value) : value_(value) { |
| } |
| |
| virtual bool Matches(const NPVariant& variant) const { |
| T other_value; |
| return NPVariantToValue(&other_value, variant) && other_value == value_; |
| } |
| |
| virtual void DescribeTo(::std::ostream* os) const { |
| *os << "equals " << value_; |
| } |
| |
| virtual void DescribeNegationTo(::std::ostream* os) const { |
| *os << "does not equal " << value_; |
| } |
| |
| private: |
| T value_; |
| }; |
| |
| template <typename T> |
| Matcher<const NPVariant&> VariantMatches(const T& value) { |
| return MakeMatcher(new VariantMatcher<T>(value)); |
| } |
| |
| TEST_F(NPUtilsTest, CanDetermineIfObjectHasMethod) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| EXPECT_CALL(*object, HasMethod(name)) |
| .WillOnce(Return(true)); |
| |
| EXPECT_TRUE(NPHasMethod(NULL, object, "foo")); |
| } |
| |
| TEST_F(NPUtilsTest, CanInvokeVoidMethodWithNativeTypes) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| VOID_TO_NPVARIANT(variant_); |
| |
| EXPECT_CALL(*object, Invoke(name, Pointee(VariantMatches<int32>(7)), 1, _)) |
| .WillOnce(DoAll(SetArgumentPointee<3>(variant_), |
| Return(true))); |
| |
| EXPECT_TRUE(NPInvokeVoid(NULL, object, "foo", 7)); |
| } |
| |
| TEST_F(NPUtilsTest, InvokeVoidMethodCanFail) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| VOID_TO_NPVARIANT(variant_); |
| |
| EXPECT_CALL(*object, Invoke(name, Pointee(VariantMatches<int32>(7)), 1, _)) |
| .WillOnce(DoAll(SetArgumentPointee<3>(variant_), |
| Return(false))); |
| |
| EXPECT_FALSE(NPInvokeVoid(NULL, object, "foo", 7)); |
| } |
| |
| TEST_F(NPUtilsTest, CanInvokeNonVoidMethodWithNativeTypes) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| DOUBLE_TO_NPVARIANT(1.5, variant_); |
| |
| EXPECT_CALL(*object, Invoke(name, Pointee(VariantMatches<int32>(7)), 1, _)) |
| .WillOnce(DoAll(SetArgumentPointee<3>(variant_), |
| Return(true))); |
| |
| double r; |
| EXPECT_TRUE(NPInvoke(NULL, object, "foo", 7, &r)); |
| EXPECT_EQ(1.5, r); |
| } |
| |
| TEST_F(NPUtilsTest, InvokeNonVoidMethodCanFail) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| DOUBLE_TO_NPVARIANT(1.5, variant_); |
| |
| EXPECT_CALL(*object, Invoke(name, Pointee(VariantMatches<int32>(7)), 1, _)) |
| .WillOnce(DoAll(SetArgumentPointee<3>(variant_), |
| Return(false))); |
| |
| double r; |
| EXPECT_FALSE(NPInvoke(NULL, object, "foo", 7, &r)); |
| } |
| |
| TEST_F(NPUtilsTest, InvokeNonVoidMethodFailsIfResultIsIncompatible) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| DOUBLE_TO_NPVARIANT(1.5, variant_); |
| |
| EXPECT_CALL(*object, Invoke(name, Pointee(VariantMatches<int32>(7)), 1, _)) |
| .WillOnce(DoAll(SetArgumentPointee<3>(variant_), |
| Return(true))); |
| |
| int r; |
| EXPECT_FALSE(NPInvoke(NULL, object, "foo", 7, &r)); |
| } |
| |
| TEST_F(NPUtilsTest, CanDetermineIfObjectHasProperty) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| EXPECT_CALL(*object, HasProperty(name)) |
| .WillOnce(Return(true)); |
| |
| EXPECT_TRUE(NPHasProperty(NULL, object, "foo")); |
| } |
| |
| TEST_F(NPUtilsTest, CanGetPropertyValue) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| DOUBLE_TO_NPVARIANT(1.5, variant_); |
| |
| EXPECT_CALL(*object, GetProperty(name, _)) |
| .WillOnce(DoAll(SetArgumentPointee<1>(variant_), |
| Return(true))); |
| |
| double r; |
| EXPECT_TRUE(NPGetProperty(NULL, object, "foo", &r)); |
| } |
| |
| TEST_F(NPUtilsTest, NPGetPropertyReportsFailureIfResultTypeIsDifferent) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| DOUBLE_TO_NPVARIANT(1.5, variant_); |
| |
| EXPECT_CALL(*object, GetProperty(name, _)) |
| .WillOnce(DoAll(SetArgumentPointee<1>(variant_), |
| Return(true))); |
| |
| bool r; |
| EXPECT_FALSE(NPGetProperty(NULL, object, "foo", &r)); |
| } |
| |
| TEST_F(NPUtilsTest, NPGetPropertyReportsFailureFromGetProperty) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| EXPECT_CALL(*object, GetProperty(name, _)) |
| .WillOnce(Return(false)); |
| |
| double r; |
| EXPECT_FALSE(NPGetProperty(NULL, object, "foo", &r)); |
| } |
| |
| TEST_F(NPUtilsTest, CanSetPropertyValue) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| EXPECT_CALL(*object, SetProperty(name, Pointee(VariantMatches(1.5)))) |
| .WillOnce(Return(true)); |
| |
| EXPECT_TRUE(NPSetProperty(NULL, object, "foo", 1.5)); |
| } |
| |
| TEST_F(NPUtilsTest, NPSetPropertyReportsFailureFromSetProperty) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| EXPECT_CALL(*object, SetProperty(name, Pointee(VariantMatches(1.5)))) |
| .WillOnce(Return(false)); |
| |
| EXPECT_FALSE(NPSetProperty(NULL, object, "foo", 1.5)); |
| } |
| |
| TEST_F(NPUtilsTest, CanRemovePropertyValue) { |
| NPIdentifier name = NPBrowser::get()->GetStringIdentifier("foo"); |
| NPObjectPointer<MockNPObject> object = |
| NPCreateObject<StrictMock<MockNPObject> >(NULL); |
| |
| EXPECT_CALL(*object, RemoveProperty(name)) |
| .WillOnce(Return(true)); |
| |
| EXPECT_TRUE(NPRemoveProperty(NULL, object, "foo")); |
| } |
| |
| } // namespace np_utils |