blob: c570cd05f6850b28bf0c5adae4d229d99f723d42 [file] [log] [blame]
// Copyright (c) 2011 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 "gtest/gtest.h"
#include "gmock/gmock.h"
#include "chrome_frame/chrome_frame_automation.h"
#include "chrome_frame/chrome_frame_npapi.h"
TEST(ChromeFrameNPAPI, DoesNotCrashOnConstruction) {
ChromeFrameNPAPI* api = new ChromeFrameNPAPI();
delete api;
}
// All mocks in the anonymous namespace.
namespace {
using ::testing::_;
using ::testing::Eq;
using ::testing::Field;
using ::testing::Invoke;
using ::testing::Return;
using ::testing::StrEq;
const char* kMimeType = "application/chromeframe";
// The default profile name is by default derived from the currently
// running executable's name.
const wchar_t* kDefaultProfileName = L"chrome_frame_unittests";
class MockNPAPI: public ChromeFrameNPAPI {
public:
MockNPAPI() : mock_automation_client_(NULL) {}
MOCK_METHOD0(GetLocation, std::string());
MOCK_METHOD0(GetBrowserIncognitoMode, bool());
MOCK_METHOD1(JavascriptToNPObject, virtual NPObject*(const std::string&));
// Make public for test purposes
void OnAutomationServerReady() {
ChromeFrameNPAPI::OnAutomationServerReady();
}
ChromeFrameAutomationClient* CreateAutomationClient() {
return mock_automation_client_;
}
ChromeFrameAutomationClient* mock_automation_client_;
};
class MockAutomationClient: public ChromeFrameAutomationClient {
public:
MOCK_METHOD2(Initialize, bool(ChromeFrameDelegate*,
ChromeFrameLaunchParams*));
};
namespace {
MATCHER_P4(LaunchParamEq, version_check, extra, incognito, widget,
"Basic check for ChromeFrameLaunchParams") {
return arg->version_check() == version_check &&
arg->extra_arguments().compare(extra) == 0 &&
arg->incognito() == incognito,
arg->widget_mode() == widget;
}
static const NPIdentifier kOnPrivateMessageId =
reinterpret_cast<NPIdentifier>(0x100);
static const NPIdentifier kPostPrivateMessageId =
reinterpret_cast<NPIdentifier>(0x100);
}
class MockNetscapeFuncs {
public:
MockNetscapeFuncs() {
CHECK(NULL == current_);
current_ = this;
}
~MockNetscapeFuncs() {
CHECK(this == current_);
current_ = NULL;
}
MOCK_METHOD3(GetValue, NPError(NPP, NPNVariable, void *));
MOCK_METHOD3(GetStringIdentifiers, void(const NPUTF8 **,
int32_t,
NPIdentifier *)); // NOLINT
MOCK_METHOD1(RetainObject, NPObject*(NPObject*)); // NOLINT
MOCK_METHOD1(ReleaseObject, void(NPObject*)); // NOLINT
static const NPNetscapeFuncs* netscape_funcs() {
return &netscape_funcs_;
}
private:
static NPError MockGetValue(NPP instance,
NPNVariable variable,
void *ret_value) {
DCHECK(current_);
return current_->GetValue(instance, variable, ret_value);
}
static void MockGetStringIdentifiers(const NPUTF8 **names,
int32_t name_count,
NPIdentifier *identifiers) {
DCHECK(current_);
return current_->GetStringIdentifiers(names, name_count, identifiers);
}
static NPObject* MockRetainObject(NPObject* obj) {
DCHECK(current_);
return current_->RetainObject(obj);
}
static void MockReleaseObject(NPObject* obj) {
DCHECK(current_);
current_->ReleaseObject(obj);
}
static MockNetscapeFuncs* current_;
static NPNetscapeFuncs netscape_funcs_;
};
// Test fixture to allow testing the privileged NPAPI APIs
class TestNPAPIPrivilegedApi: public ::testing::Test {
public:
virtual void SetUp() {
memset(&instance, 0, sizeof(instance));
npapi::InitializeBrowserFunctions(
const_cast<NPNetscapeFuncs*>(mock_funcs.netscape_funcs()));
// Gets owned & destroyed by mock_api (in the
// ChromeFramePlugin<T>::Uninitialize() function).
mock_automation = new MockAutomationClient;
mock_api.mock_automation_client_ = mock_automation;
}
virtual void TearDown() {
// Make sure to uninitialize the mock NPAPI before we uninitialize the
// browser function, otherwise we will get a DCHECK in the NPAPI dtor
// when it tries to perform the uninitialize there.
mock_api.Uninitialize();
npapi::UninitializeBrowserFunctions();
}
void SetupPrivilegeTest(bool is_incognito,
bool expect_privilege_check,
bool is_privileged,
const std::wstring& profile_name,
const std::wstring& language,
const std::wstring& extra_args) {
EXPECT_CALL(mock_api, GetLocation())
.WillOnce(Return(std::string("http://www.google.com")));
EXPECT_CALL(mock_api, GetBrowserIncognitoMode())
.WillOnce(Return(is_incognito));
scoped_refptr<ChromeFrameLaunchParams> launch_params(
new ChromeFrameLaunchParams(GURL(), GURL(), FilePath(), profile_name,
language, extra_args, is_incognito, true, false));
EXPECT_CALL(*mock_automation,
Initialize(_, LaunchParamEq(true, extra_args, is_incognito, true)))
.WillOnce(Return(true));
}
public:
MockNetscapeFuncs mock_funcs;
MockNPAPI mock_api;
MockAutomationClient* mock_automation;
NPP_t instance;
};
} // namespace