This source file includes following definitions.
- FillMessageInfo
- ACTION_TEMPLATE
- CalledOnValidThread
- SetUpCommandLine
- SetUpMockCastSocket
- GetApi
- FillChannelInfoForOpenState
- FillChannelInfoForClosedState
- CallOnMessage
- DoCallOnMessage
- IN_PROC_BROWSER_TEST_F
- IN_PROC_BROWSER_TEST_F
#include "base/bind.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "chrome/browser/extensions/api/cast_channel/cast_channel_api.h"
#include "chrome/browser/extensions/api/cast_channel/cast_socket.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/common/extensions/api/cast_channel.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/common/switches.h"
#include "net/base/capturing_net_log.h"
#include "net/base/completion_callback.h"
#include "net/base/net_errors.h"
#include "testing/gmock/include/gmock/gmock.h"
namespace cast_channel = extensions::api::cast_channel;
using cast_channel::CastSocket;
using cast_channel::ChannelInfo;
using cast_channel::MessageInfo;
using ::testing::A;
using ::testing::_;
using ::testing::Invoke;
using ::testing::Return;
namespace {
const char kTestExtensionId[] = "ddchlicdkolnonkihahngkmmmjnjlkkf";
const char kTestUrl[] = "cast://192.168.1.1:8009";
static void FillMessageInfo(MessageInfo* message_info,
const std::string& message) {
message_info->namespace_ = "foo";
message_info->source_id = "src";
message_info->destination_id = "dest";
message_info->data.reset(new base::StringValue(message));
}
ACTION_TEMPLATE(InvokeCompletionCallback,
HAS_1_TEMPLATE_PARAMS(int, k),
AND_1_VALUE_PARAMS(result)) {
::std::tr1::get<k>(args).Run(result);
}
class MockCastSocket : public CastSocket {
public:
explicit MockCastSocket(CastSocket::Delegate* delegate,
net::NetLog* net_log)
: CastSocket(kTestExtensionId, GURL(kTestUrl), delegate, net_log) {}
virtual ~MockCastSocket() {}
virtual bool CalledOnValidThread() const OVERRIDE {
return true;
}
MOCK_CONST_METHOD1(FillChannelInfo, void(ChannelInfo*));
MOCK_METHOD1(Connect, void(const net::CompletionCallback& callback));
MOCK_METHOD2(SendMessage, void(const MessageInfo& message,
const net::CompletionCallback& callback));
MOCK_METHOD1(Close, void(const net::CompletionCallback& callback));
};
}
class CastChannelAPITest : public ExtensionApiTest {
public:
CastChannelAPITest() {}
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
ExtensionApiTest::SetUpCommandLine(command_line);
command_line->AppendSwitchASCII(
extensions::switches::kWhitelistedExtensionID,
kTestExtensionId);
}
void SetUpMockCastSocket() {
extensions::CastChannelAPI* api = GetApi();
mock_cast_socket_ = new MockCastSocket(api, &capturing_net_log_);
api->SetSocketForTest(
make_scoped_ptr<CastSocket>(mock_cast_socket_).Pass());
}
extensions::CastChannelAPI* GetApi() {
return extensions::CastChannelAPI::Get(profile());
}
static void FillChannelInfoForOpenState(ChannelInfo* channel_info) {
channel_info->channel_id = 1;
channel_info->url = kTestUrl;
channel_info->ready_state = cast_channel::READY_STATE_OPEN;
channel_info->error_state = cast_channel::CHANNEL_ERROR_NONE;
}
static void FillChannelInfoForClosedState(ChannelInfo* channel_info) {
channel_info->channel_id = 1;
channel_info->url = kTestUrl;
channel_info->ready_state = cast_channel::READY_STATE_CLOSED;
channel_info->error_state = cast_channel::CHANNEL_ERROR_NONE;
}
protected:
void CallOnMessage(const std::string& message) {
content::BrowserThread::PostTask(
content::BrowserThread::IO,
FROM_HERE,
base::Bind(&CastChannelAPITest::DoCallOnMessage, this,
GetApi(), mock_cast_socket_, message));
}
void DoCallOnMessage(extensions::CastChannelAPI* api,
MockCastSocket* cast_socket,
const std::string& message) {
MessageInfo message_info;
FillMessageInfo(&message_info, message);
api->OnMessage(cast_socket, message_info);
}
MockCastSocket* mock_cast_socket_;
ChannelInfo channel_info;
net::CapturingNetLog capturing_net_log_;
};
#if defined(OS_WIN) && !defined(NDEBUG)
#define MAYBE_TestOpenSendClose DISABLED_TestOpenSendClose
#else
#define MAYBE_TestOpenSendClose TestOpenSendClose
#endif
IN_PROC_BROWSER_TEST_F(CastChannelAPITest, MAYBE_TestOpenSendClose) {
SetUpMockCastSocket();
EXPECT_CALL(*mock_cast_socket_, Connect(_))
.WillOnce(InvokeCompletionCallback<0>(net::OK));
EXPECT_CALL(*mock_cast_socket_, FillChannelInfo(_))
.WillOnce(Invoke(FillChannelInfoForOpenState))
.WillOnce(Invoke(FillChannelInfoForOpenState))
.WillOnce(Invoke(FillChannelInfoForClosedState));
EXPECT_CALL(*mock_cast_socket_, SendMessage(A<const MessageInfo&>(), _)).
WillOnce(InvokeCompletionCallback<1>(net::OK));
EXPECT_CALL(*mock_cast_socket_, Close(_)).
WillOnce(InvokeCompletionCallback<0>(net::OK));
EXPECT_TRUE(RunExtensionSubtest("cast_channel/api",
"test_open_send_close.html"));
}
#if defined(OS_WIN) && !defined(NDEBUG)
#define MAYBE_TestOpenReceiveClose DISABLED_TestOpenReceiveClose
#else
#define MAYBE_TestOpenReceiveClose TestOpenReceiveClose
#endif
IN_PROC_BROWSER_TEST_F(CastChannelAPITest, MAYBE_TestOpenReceiveClose) {
SetUpMockCastSocket();
EXPECT_CALL(*mock_cast_socket_, Connect(_))
.WillOnce(InvokeCompletionCallback<0>(net::OK));
EXPECT_CALL(*mock_cast_socket_, FillChannelInfo(_))
.WillOnce(Invoke(FillChannelInfoForOpenState))
.WillOnce(Invoke(FillChannelInfoForOpenState))
.WillOnce(Invoke(FillChannelInfoForOpenState))
.WillOnce(Invoke(FillChannelInfoForClosedState));
EXPECT_CALL(*mock_cast_socket_, Close(_)).
WillOnce(InvokeCompletionCallback<0>(net::OK));
EXPECT_TRUE(RunExtensionSubtest("cast_channel/api",
"test_open_receive_close.html"));
ResultCatcher catcher;
CallOnMessage("some-message");
CallOnMessage("some-message");
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
}