Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1261)

Unified Diff: remoting/host/setup/native_messaging_host_unittest.cc

Issue 49113003: It2Me native messaging: GYP and source refactoring (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Max/Linux build break: remoting_native_messaging_host Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/host/setup/native_messaging_host_unittest.cc
diff --git a/remoting/host/setup/native_messaging_host_unittest.cc b/remoting/host/setup/native_messaging_host_unittest.cc
deleted file mode 100644
index 164b77d5c9dfb6dcd2dbf79edb657e9fc4c03f19..0000000000000000000000000000000000000000
--- a/remoting/host/setup/native_messaging_host_unittest.cc
+++ /dev/null
@@ -1,555 +0,0 @@
-// Copyright 2013 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 "remoting/host/setup/native_messaging_host.h"
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/stl_util.h"
-#include "base/strings/stringize_macros.h"
-#include "base/values.h"
-#include "google_apis/gaia/gaia_oauth_client.h"
-#include "net/base/file_stream.h"
-#include "net/base/net_util.h"
-#include "remoting/base/auto_thread_task_runner.h"
-#include "remoting/host/pin_hash.h"
-#include "remoting/host/setup/native_messaging_channel.h"
-#include "remoting/host/setup/test_util.h"
-#include "remoting/protocol/pairing_registry.h"
-#include "remoting/protocol/protocol_mock_objects.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using remoting::protocol::MockPairingRegistryDelegate;
-using remoting::protocol::PairingRegistry;
-using remoting::protocol::SynchronousPairingRegistry;
-
-namespace {
-
-void VerifyHelloResponse(scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("helloResponse", value);
- EXPECT_TRUE(response->GetString("version", &value));
- EXPECT_EQ(STRINGIZE(VERSION), value);
-}
-
-void VerifyGetHostNameResponse(scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("getHostNameResponse", value);
- EXPECT_TRUE(response->GetString("hostname", &value));
- EXPECT_EQ(net::GetHostName(), value);
-}
-
-void VerifyGetPinHashResponse(scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("getPinHashResponse", value);
- EXPECT_TRUE(response->GetString("hash", &value));
- EXPECT_EQ(remoting::MakeHostPinHash("my_host", "1234"), value);
-}
-
-void VerifyGenerateKeyPairResponse(scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("generateKeyPairResponse", value);
- EXPECT_TRUE(response->GetString("privateKey", &value));
- EXPECT_TRUE(response->GetString("publicKey", &value));
-}
-
-void VerifyGetDaemonConfigResponse(scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("getDaemonConfigResponse", value);
- const base::DictionaryValue* config = NULL;
- EXPECT_TRUE(response->GetDictionary("config", &config));
- EXPECT_TRUE(base::DictionaryValue().Equals(config));
-}
-
-void VerifyGetUsageStatsConsentResponse(
- scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("getUsageStatsConsentResponse", value);
- bool supported, allowed, set_by_policy;
- EXPECT_TRUE(response->GetBoolean("supported", &supported));
- EXPECT_TRUE(response->GetBoolean("allowed", &allowed));
- EXPECT_TRUE(response->GetBoolean("setByPolicy", &set_by_policy));
- EXPECT_TRUE(supported);
- EXPECT_TRUE(allowed);
- EXPECT_TRUE(set_by_policy);
-}
-
-void VerifyStopDaemonResponse(scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("stopDaemonResponse", value);
- EXPECT_TRUE(response->GetString("result", &value));
- EXPECT_EQ("OK", value);
-}
-
-void VerifyGetDaemonStateResponse(scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("getDaemonStateResponse", value);
- EXPECT_TRUE(response->GetString("state", &value));
- EXPECT_EQ("STARTED", value);
-}
-
-void VerifyUpdateDaemonConfigResponse(
- scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("updateDaemonConfigResponse", value);
- EXPECT_TRUE(response->GetString("result", &value));
- EXPECT_EQ("OK", value);
-}
-
-void VerifyStartDaemonResponse(scoped_ptr<base::DictionaryValue> response) {
- ASSERT_TRUE(response);
- std::string value;
- EXPECT_TRUE(response->GetString("type", &value));
- EXPECT_EQ("startDaemonResponse", value);
- EXPECT_TRUE(response->GetString("result", &value));
- EXPECT_EQ("OK", value);
-}
-
-} // namespace
-
-namespace remoting {
-
-class MockDaemonControllerDelegate : public DaemonController::Delegate {
- public:
- MockDaemonControllerDelegate();
- virtual ~MockDaemonControllerDelegate();
-
- // DaemonController::Delegate interface.
- virtual DaemonController::State GetState() OVERRIDE;
- virtual scoped_ptr<base::DictionaryValue> GetConfig() OVERRIDE;
- virtual void SetConfigAndStart(
- scoped_ptr<base::DictionaryValue> config,
- bool consent,
- const DaemonController::CompletionCallback& done) OVERRIDE;
- virtual void UpdateConfig(
- scoped_ptr<base::DictionaryValue> config,
- const DaemonController::CompletionCallback& done) OVERRIDE;
- virtual void Stop(const DaemonController::CompletionCallback& done) OVERRIDE;
- virtual void SetWindow(void* window_handle) OVERRIDE;
- virtual std::string GetVersion() OVERRIDE;
- virtual DaemonController::UsageStatsConsent GetUsageStatsConsent() OVERRIDE;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(MockDaemonControllerDelegate);
-};
-
-MockDaemonControllerDelegate::MockDaemonControllerDelegate() {}
-
-MockDaemonControllerDelegate::~MockDaemonControllerDelegate() {}
-
-DaemonController::State MockDaemonControllerDelegate::GetState() {
- return DaemonController::STATE_STARTED;
-}
-
-scoped_ptr<base::DictionaryValue> MockDaemonControllerDelegate::GetConfig() {
- return scoped_ptr<base::DictionaryValue>(new base::DictionaryValue());
-}
-
-void MockDaemonControllerDelegate::SetConfigAndStart(
- scoped_ptr<base::DictionaryValue> config,
- bool consent,
- const DaemonController::CompletionCallback& done) {
-
- // Verify parameters passed in.
- if (consent && config && config->HasKey("start")) {
- done.Run(DaemonController::RESULT_OK);
- } else {
- done.Run(DaemonController::RESULT_FAILED);
- }
-}
-
-void MockDaemonControllerDelegate::UpdateConfig(
- scoped_ptr<base::DictionaryValue> config,
- const DaemonController::CompletionCallback& done) {
- if (config && config->HasKey("update")) {
- done.Run(DaemonController::RESULT_OK);
- } else {
- done.Run(DaemonController::RESULT_FAILED);
- }
-}
-
-void MockDaemonControllerDelegate::Stop(
- const DaemonController::CompletionCallback& done) {
- done.Run(DaemonController::RESULT_OK);
-}
-
-void MockDaemonControllerDelegate::SetWindow(void* window_handle) {}
-
-std::string MockDaemonControllerDelegate::GetVersion() {
- // Unused - NativeMessagingHost returns the compiled-in version string
- // instead of calling this method.
- NOTREACHED();
- return std::string();
-}
-
-DaemonController::UsageStatsConsent
-MockDaemonControllerDelegate::GetUsageStatsConsent() {
- DaemonController::UsageStatsConsent consent;
- consent.supported = true;
- consent.allowed = true;
- consent.set_by_policy = true;
- return consent;
-}
-
-class NativeMessagingHostTest : public testing::Test {
- public:
- NativeMessagingHostTest();
- virtual ~NativeMessagingHostTest();
-
- virtual void SetUp() OVERRIDE;
- virtual void TearDown() OVERRIDE;
-
- void Run();
-
- // Deletes |host_|.
- void DeleteHost();
-
- scoped_ptr<base::DictionaryValue> ReadMessageFromOutputPipe();
-
- void WriteMessageToInputPipe(const base::Value& message);
-
- // The Host process should shut down when it receives a malformed request.
- // This is tested by sending a known-good request, followed by |message|,
- // followed by the known-good request again. The response file should only
- // contain a single response from the first good request.
- void TestBadRequest(const base::Value& message);
-
- protected:
- // Reference to the MockDaemonControllerDelegate, which is owned by
- // |channel_|.
- MockDaemonControllerDelegate* daemon_controller_delegate_;
-
- private:
- // Each test creates two unidirectional pipes: "input" and "output".
- // NativeMessagingHost reads from input_read_handle and writes to
- // output_write_handle. The unittest supplies data to input_write_handle, and
- // verifies output from output_read_handle.
- //
- // unittest -> [input] -> NativeMessagingHost -> [output] -> unittest
- base::PlatformFile input_write_handle_;
- base::PlatformFile output_read_handle_;
-
- base::MessageLoop message_loop_;
- base::RunLoop run_loop_;
- scoped_refptr<AutoThreadTaskRunner> task_runner_;
- scoped_ptr<remoting::NativeMessagingChannel> channel_;
-
- DISALLOW_COPY_AND_ASSIGN(NativeMessagingHostTest);
-};
-
-NativeMessagingHostTest::NativeMessagingHostTest()
- : message_loop_(base::MessageLoop::TYPE_IO) {}
-
-NativeMessagingHostTest::~NativeMessagingHostTest() {}
-
-void NativeMessagingHostTest::SetUp() {
- base::PlatformFile input_read_handle;
- base::PlatformFile output_write_handle;
-
- ASSERT_TRUE(MakePipe(&input_read_handle, &input_write_handle_));
- ASSERT_TRUE(MakePipe(&output_read_handle_, &output_write_handle));
-
- // Arrange to run |message_loop_| until no components depend on it.
- task_runner_ = new AutoThreadTaskRunner(
- message_loop_.message_loop_proxy(), run_loop_.QuitClosure());
-
- daemon_controller_delegate_ = new MockDaemonControllerDelegate();
- scoped_refptr<DaemonController> daemon_controller(
- new DaemonController(
- scoped_ptr<DaemonController::Delegate>(daemon_controller_delegate_)));
-
- scoped_refptr<PairingRegistry> pairing_registry =
- new SynchronousPairingRegistry(scoped_ptr<PairingRegistry::Delegate>(
- new MockPairingRegistryDelegate()));
- scoped_ptr<NativeMessagingChannel::Delegate> host(
- new NativeMessagingHost(daemon_controller,
- pairing_registry,
- scoped_ptr<remoting::OAuthClient>()));
- channel_.reset(
- new NativeMessagingChannel(host.Pass(),
- input_read_handle,
- output_write_handle));
-}
-
-void NativeMessagingHostTest::TearDown() {
- // DaemonController destroys its internals asynchronously. Let these and any
- // other pending tasks run to make sure we don't leak the memory owned by
- // them.
- message_loop_.RunUntilIdle();
-
- // The NativeMessagingHost dtor closes the handles that are passed to it.
- // |input_write_handle_| gets closed just before starting the host. So the
- // only handle left to close is |output_read_handle_|.
- base::ClosePlatformFile(output_read_handle_);
-}
-
-void NativeMessagingHostTest::Run() {
- // Close the write-end of input, so that the host sees EOF after reading
- // messages and won't block waiting for more input.
- base::ClosePlatformFile(input_write_handle_);
- channel_->Start(base::Bind(&NativeMessagingHostTest::DeleteHost,
- base::Unretained(this)));
- run_loop_.Run();
-}
-
-void NativeMessagingHostTest::DeleteHost() {
- // Destroy |channel_| so that it closes its end of the output pipe, so that
- // TestBadRequest() will see EOF and won't block waiting for more data.
- channel_.reset();
- task_runner_ = NULL;
-}
-
-scoped_ptr<base::DictionaryValue>
-NativeMessagingHostTest::ReadMessageFromOutputPipe() {
- uint32 length;
- int read_result = base::ReadPlatformFileAtCurrentPos(
- output_read_handle_, reinterpret_cast<char*>(&length), sizeof(length));
- if (read_result != sizeof(length)) {
- return scoped_ptr<base::DictionaryValue>();
- }
-
- std::string message_json(length, '\0');
- read_result = base::ReadPlatformFileAtCurrentPos(
- output_read_handle_, string_as_array(&message_json), length);
- if (read_result != static_cast<int>(length)) {
- return scoped_ptr<base::DictionaryValue>();
- }
-
- scoped_ptr<base::Value> message(base::JSONReader::Read(message_json));
- if (!message || !message->IsType(base::Value::TYPE_DICTIONARY)) {
- return scoped_ptr<base::DictionaryValue>();
- }
-
- return scoped_ptr<base::DictionaryValue>(
- static_cast<base::DictionaryValue*>(message.release()));
-}
-
-void NativeMessagingHostTest::WriteMessageToInputPipe(
- const base::Value& message) {
- std::string message_json;
- base::JSONWriter::Write(&message, &message_json);
-
- uint32 length = message_json.length();
- base::WritePlatformFileAtCurrentPos(input_write_handle_,
- reinterpret_cast<char*>(&length),
- sizeof(length));
- base::WritePlatformFileAtCurrentPos(input_write_handle_, message_json.data(),
- length);
-}
-
-void NativeMessagingHostTest::TestBadRequest(const base::Value& message) {
- base::DictionaryValue good_message;
- good_message.SetString("type", "hello");
-
- // This test currently relies on synchronous processing of hello messages and
- // message parameters verification.
- WriteMessageToInputPipe(good_message);
- WriteMessageToInputPipe(message);
- WriteMessageToInputPipe(good_message);
-
- Run();
-
- // Read from output pipe, and verify responses.
- scoped_ptr<base::DictionaryValue> response =
- ReadMessageFromOutputPipe();
- VerifyHelloResponse(response.Pass());
-
- response = ReadMessageFromOutputPipe();
- EXPECT_FALSE(response);
-}
-
-// Test all valid request-types.
-TEST_F(NativeMessagingHostTest, All) {
- int next_id = 0;
- base::DictionaryValue message;
- message.SetInteger("id", next_id++);
- message.SetString("type", "hello");
- WriteMessageToInputPipe(message);
-
- message.SetInteger("id", next_id++);
- message.SetString("type", "getHostName");
- WriteMessageToInputPipe(message);
-
- message.SetInteger("id", next_id++);
- message.SetString("type", "getPinHash");
- message.SetString("hostId", "my_host");
- message.SetString("pin", "1234");
- WriteMessageToInputPipe(message);
-
- message.Clear();
- message.SetInteger("id", next_id++);
- message.SetString("type", "generateKeyPair");
- WriteMessageToInputPipe(message);
-
- message.SetInteger("id", next_id++);
- message.SetString("type", "getDaemonConfig");
- WriteMessageToInputPipe(message);
-
- message.SetInteger("id", next_id++);
- message.SetString("type", "getUsageStatsConsent");
- WriteMessageToInputPipe(message);
-
- message.SetInteger("id", next_id++);
- message.SetString("type", "stopDaemon");
- WriteMessageToInputPipe(message);
-
- message.SetInteger("id", next_id++);
- message.SetString("type", "getDaemonState");
- WriteMessageToInputPipe(message);
-
- // Following messages require a "config" dictionary.
- base::DictionaryValue config;
- config.SetBoolean("update", true);
- message.Set("config", config.DeepCopy());
- message.SetInteger("id", next_id++);
- message.SetString("type", "updateDaemonConfig");
- WriteMessageToInputPipe(message);
-
- config.Clear();
- config.SetBoolean("start", true);
- message.Set("config", config.DeepCopy());
- message.SetBoolean("consent", true);
- message.SetInteger("id", next_id++);
- message.SetString("type", "startDaemon");
- WriteMessageToInputPipe(message);
-
- Run();
-
- void (*verify_routines[])(scoped_ptr<base::DictionaryValue>) = {
- &VerifyHelloResponse,
- &VerifyGetHostNameResponse,
- &VerifyGetPinHashResponse,
- &VerifyGenerateKeyPairResponse,
- &VerifyGetDaemonConfigResponse,
- &VerifyGetUsageStatsConsentResponse,
- &VerifyStopDaemonResponse,
- &VerifyGetDaemonStateResponse,
- &VerifyUpdateDaemonConfigResponse,
- &VerifyStartDaemonResponse,
- };
- ASSERT_EQ(arraysize(verify_routines), static_cast<size_t>(next_id));
-
- // Read all responses from output pipe, and verify them.
- for (int i = 0; i < next_id; ++i) {
- scoped_ptr<base::DictionaryValue> response = ReadMessageFromOutputPipe();
-
- // Make sure that id is available and is in the range.
- int id;
- ASSERT_TRUE(response->GetInteger("id", &id));
- ASSERT_TRUE(0 <= id && id < next_id);
-
- // Call the verification routine corresponding to the message id.
- ASSERT_TRUE(verify_routines[id]);
- verify_routines[id](response.Pass());
-
- // Clear the pointer so that the routine cannot be called the second time.
- verify_routines[id] = NULL;
- }
-}
-
-// Verify that response ID matches request ID.
-TEST_F(NativeMessagingHostTest, Id) {
- base::DictionaryValue message;
- message.SetString("type", "hello");
- WriteMessageToInputPipe(message);
- message.SetString("id", "42");
- WriteMessageToInputPipe(message);
-
- Run();
-
- scoped_ptr<base::DictionaryValue> response =
- ReadMessageFromOutputPipe();
- EXPECT_TRUE(response);
- std::string value;
- EXPECT_FALSE(response->GetString("id", &value));
-
- response = ReadMessageFromOutputPipe();
- EXPECT_TRUE(response);
- EXPECT_TRUE(response->GetString("id", &value));
- EXPECT_EQ("42", value);
-}
-
-// Verify non-Dictionary requests are rejected.
-TEST_F(NativeMessagingHostTest, WrongFormat) {
- base::ListValue message;
- TestBadRequest(message);
-}
-
-// Verify requests with no type are rejected.
-TEST_F(NativeMessagingHostTest, MissingType) {
- base::DictionaryValue message;
- TestBadRequest(message);
-}
-
-// Verify rejection if type is unrecognized.
-TEST_F(NativeMessagingHostTest, InvalidType) {
- base::DictionaryValue message;
- message.SetString("type", "xxx");
- TestBadRequest(message);
-}
-
-// Verify rejection if getPinHash request has no hostId.
-TEST_F(NativeMessagingHostTest, GetPinHashNoHostId) {
- base::DictionaryValue message;
- message.SetString("type", "getPinHash");
- message.SetString("pin", "1234");
- TestBadRequest(message);
-}
-
-// Verify rejection if getPinHash request has no pin.
-TEST_F(NativeMessagingHostTest, GetPinHashNoPin) {
- base::DictionaryValue message;
- message.SetString("type", "getPinHash");
- message.SetString("hostId", "my_host");
- TestBadRequest(message);
-}
-
-// Verify rejection if updateDaemonConfig request has invalid config.
-TEST_F(NativeMessagingHostTest, UpdateDaemonConfigInvalidConfig) {
- base::DictionaryValue message;
- message.SetString("type", "updateDaemonConfig");
- message.SetString("config", "xxx");
- TestBadRequest(message);
-}
-
-// Verify rejection if startDaemon request has invalid config.
-TEST_F(NativeMessagingHostTest, StartDaemonInvalidConfig) {
- base::DictionaryValue message;
- message.SetString("type", "startDaemon");
- message.SetString("config", "xxx");
- message.SetBoolean("consent", true);
- TestBadRequest(message);
-}
-
-// Verify rejection if startDaemon request has no "consent" parameter.
-TEST_F(NativeMessagingHostTest, StartDaemonNoConsent) {
- base::DictionaryValue message;
- message.SetString("type", "startDaemon");
- message.Set("config", base::DictionaryValue().DeepCopy());
- TestBadRequest(message);
-}
-
-} // namespace remoting
« no previous file with comments | « remoting/host/setup/native_messaging_host_main.cc ('k') | remoting/host/setup/native_messaging_manifest.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698