blob: ea1bb5f94d5fa911efb7b66f317a52c4c50f13d1 [file] [log] [blame]
// 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/gpu_plugin/gpu_plugin.h"
#include "gpu/gpu_plugin/gpu_plugin_object.h"
#include "gpu/np_utils/np_object_mock.h"
#include "gpu/np_utils/np_plugin_object_factory_mock.h"
#include "gpu/np_utils/np_plugin_object_mock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/glue/plugins/nphostapi.h"
#if defined(OS_LINUX)
#define INITIALIZE_PLUGIN_FUNCS , &plugin_funcs_
#else
#define INITIALIZE_PLUGIN_FUNCS
#endif
using np_utils::MockPluginObject;
using np_utils::PluginObject;
using testing::_;
using testing::DoAll;
using testing::NiceMock;
using testing::Return;
using testing::SetArgumentPointee;
using testing::StrictMock;
namespace gpu_plugin {
class GPUPluginTest : public testing::Test {
protected:
virtual void SetUp() {
memset(&npp_, 0, sizeof(npp_));
memset(&browser_funcs_, 0, sizeof(browser_funcs_));
memset(&plugin_funcs_, 0, sizeof(plugin_funcs_));
plugin_object_factory_ = new StrictMock<np_utils::MockPluginObjectFactory>;
np_class_ = np_utils::NPGetClass<StrictMock<np_utils::MockNPObject> >();
}
virtual void TearDown() {
delete plugin_object_factory_;
}
NPP_t npp_;
NPNetscapeFuncs browser_funcs_;
NPPluginFuncs plugin_funcs_;
np_utils::MockPluginObjectFactory* plugin_object_factory_;
const NPClass* np_class_;
};
TEST_F(GPUPluginTest, GetEntryPointsSetsNeededFunctionPointers) {
#if defined(OS_LINUX)
NPError error = gpu_plugin::NP_Initialize(&browser_funcs_,
&plugin_funcs_);
gpu_plugin::NP_Shutdown();
#else
NPError error = gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
#endif
EXPECT_EQ(NPERR_NO_ERROR, error);
EXPECT_TRUE(NULL != plugin_funcs_.newp);
EXPECT_TRUE(NULL != plugin_funcs_.destroy);
EXPECT_TRUE(NULL != plugin_funcs_.setwindow);
EXPECT_TRUE(NULL != plugin_funcs_.event);
EXPECT_TRUE(NULL != plugin_funcs_.getvalue);
EXPECT_TRUE(NULL != plugin_funcs_.setvalue);
}
TEST_F(GPUPluginTest, CanInitializeAndShutdownPlugin) {
EXPECT_EQ(NPERR_NO_ERROR,
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS));
EXPECT_EQ(NPERR_NO_ERROR, gpu_plugin::NP_Shutdown());
}
TEST_F(GPUPluginTest, InitializeFailsIfBrowserFuncsIsNull) {
EXPECT_EQ(NPERR_INVALID_FUNCTABLE_ERROR,
gpu_plugin::NP_Initialize(NULL INITIALIZE_PLUGIN_FUNCS));
}
TEST_F(GPUPluginTest, InitializeFailsIfAlreadyInitialized) {
EXPECT_EQ(NPERR_NO_ERROR,
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS));
EXPECT_EQ(NPERR_GENERIC_ERROR,
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS));
EXPECT_EQ(NPERR_NO_ERROR, gpu_plugin::NP_Shutdown());
}
TEST_F(GPUPluginTest, ShutdownFailsIfNotInitialized) {
EXPECT_EQ(NPERR_GENERIC_ERROR, gpu_plugin::NP_Shutdown());
}
TEST_F(GPUPluginTest, NewReturnsErrorForInvalidInstance) {
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(NPERR_INVALID_INSTANCE_ERROR, plugin_funcs_.newp(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
NULL, 0, 0, NULL, NULL, NULL));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, GetValueReturnsErrorForInvalidInstance) {
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
int* result = NULL;
EXPECT_EQ(NPERR_INVALID_INSTANCE_ERROR, plugin_funcs_.getvalue(
NULL, NPPVjavaClass, &result));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, DestroyReturnsErrorForInvalidInstance) {
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(NPERR_INVALID_INSTANCE_ERROR, plugin_funcs_.destroy(NULL, NULL));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, SetWindowReturnsErrorForInvalidInstance) {
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(NPERR_INVALID_INSTANCE_ERROR, plugin_funcs_.setwindow(NULL, NULL));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, HandleEventReturnsFalseForInvalidInstance) {
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(0, plugin_funcs_.event(NULL, NULL));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, NewCreatesAPluginObjectAndInitializesIt) {
StrictMock<np_utils::MockPluginObject> plugin_object;
EXPECT_CALL(*plugin_object_factory_, CreatePluginObject(
&npp_, const_cast<NPMIMEType>(GPUPluginObject::kPluginType)))
.WillOnce(Return(&plugin_object));
NPObject scriptable_object;
EXPECT_CALL(plugin_object, New(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
0, NULL, NULL, NULL))
.WillOnce(Return(NPERR_NO_ERROR));
EXPECT_CALL(plugin_object, GetScriptableNPObject())
.WillOnce(Return(&scriptable_object));
EXPECT_CALL(plugin_object, Destroy(static_cast<NPSavedData**>(NULL)))
.WillOnce(Return(NPERR_NO_ERROR));
EXPECT_CALL(plugin_object, Release());
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.newp(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
&npp_, 0, 0, NULL, NULL, NULL));
NPObject* result;
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.getvalue(
&npp_, NPPVpluginScriptableNPObject, &result));
EXPECT_EQ(&scriptable_object, result);
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.destroy(&npp_, NULL));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, NewFailsIfPluginObjectFactoryFails) {
EXPECT_CALL(*plugin_object_factory_, CreatePluginObject(
&npp_, const_cast<NPMIMEType>(GPUPluginObject::kPluginType)))
.WillOnce(Return(static_cast<PluginObject*>(NULL)));
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(NPERR_GENERIC_ERROR, plugin_funcs_.newp(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
&npp_, 0, 0, NULL, NULL, NULL));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, SetWindowForwardsToPluginObject) {
StrictMock<MockPluginObject> plugin_object;
EXPECT_CALL(*plugin_object_factory_, CreatePluginObject(
&npp_, const_cast<NPMIMEType>(GPUPluginObject::kPluginType)))
.WillOnce(Return(&plugin_object));
EXPECT_CALL(plugin_object, New(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
0, NULL, NULL, NULL))
.WillOnce(Return(NPERR_NO_ERROR));
NPWindow window = {0};
EXPECT_CALL(plugin_object, SetWindow(&window))
.WillOnce(Return(NPERR_NO_ERROR));
EXPECT_CALL(plugin_object, Destroy(static_cast<NPSavedData**>(NULL)))
.WillOnce(Return(NPERR_NO_ERROR));
EXPECT_CALL(plugin_object, Release());
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.newp(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
&npp_, 0, 0, NULL, NULL, NULL));
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.setwindow(&npp_, &window));
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.destroy(&npp_, NULL));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, HandleEventForwardsToPluginObject) {
StrictMock<MockPluginObject> plugin_object;
EXPECT_CALL(*plugin_object_factory_, CreatePluginObject(
&npp_, const_cast<NPMIMEType>(GPUPluginObject::kPluginType)))
.WillOnce(Return(&plugin_object));
EXPECT_CALL(plugin_object, New(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
0, NULL, NULL, NULL))
.WillOnce(Return(NPERR_NO_ERROR));
NPEvent event = {0};
EXPECT_CALL(plugin_object, HandleEvent(&event))
.WillOnce(Return(7));
EXPECT_CALL(plugin_object, Destroy(static_cast<NPSavedData**>(NULL)))
.WillOnce(Return(NPERR_NO_ERROR));
EXPECT_CALL(plugin_object, Release());
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.newp(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
&npp_, 0, 0, NULL, NULL, NULL));
EXPECT_EQ(7, plugin_funcs_.event(&npp_, &event));
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.destroy(&npp_, NULL));
gpu_plugin::NP_Shutdown();
}
TEST_F(GPUPluginTest, GetValueReturnsErrorForUnknownVariable) {
StrictMock<MockPluginObject> plugin_object;
EXPECT_CALL(*plugin_object_factory_, CreatePluginObject(
&npp_, const_cast<NPMIMEType>(GPUPluginObject::kPluginType)))
.WillOnce(Return(&plugin_object));
EXPECT_CALL(plugin_object, New(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
0, NULL, NULL, NULL))
.WillOnce(Return(NPERR_NO_ERROR));
EXPECT_CALL(plugin_object, Destroy(static_cast<NPSavedData**>(NULL)))
.WillOnce(Return(NPERR_NO_ERROR));
EXPECT_CALL(plugin_object, Release());
gpu_plugin::NP_GetEntryPoints(&plugin_funcs_);
gpu_plugin::NP_Initialize(&browser_funcs_ INITIALIZE_PLUGIN_FUNCS);
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.newp(
const_cast<NPMIMEType>(GPUPluginObject::kPluginType),
&npp_, 0, 0, NULL, NULL, NULL));
int* result = NULL;
EXPECT_EQ(NPERR_GENERIC_ERROR, plugin_funcs_.getvalue(
&npp_, NPPVjavaClass, &result));
EXPECT_EQ(NPERR_NO_ERROR, plugin_funcs_.destroy(&npp_, NULL));
gpu_plugin::NP_Shutdown();
}
} // namespace gpu_plugin