Index: third_party/mojo/src/mojo/edk/system/connection_manager_unittest.cc |
diff --git a/third_party/mojo/src/mojo/edk/system/connection_manager_unittest.cc b/third_party/mojo/src/mojo/edk/system/connection_manager_unittest.cc |
deleted file mode 100644 |
index 905193c8f508fefc2751aca5f5fdfd1a66b48775..0000000000000000000000000000000000000000 |
--- a/third_party/mojo/src/mojo/edk/system/connection_manager_unittest.cc |
+++ /dev/null |
@@ -1,688 +0,0 @@ |
-// Copyright 2015 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. |
- |
-// This is really a unit test for |MasterConnectionManager| and |
-// |SlaveConnectionManager| (since they need to be tested together). |
- |
-#include "third_party/mojo/src/mojo/edk/system/connection_manager.h" |
- |
-#include <stdint.h> |
- |
-#include <string> |
- |
-#include "base/message_loop/message_loop.h" |
-#include "base/run_loop.h" |
-#include "base/threading/thread_checker.h" |
-#include "mojo/public/cpp/system/macros.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/mojo/src/mojo/edk/embedder/master_process_delegate.h" |
-#include "third_party/mojo/src/mojo/edk/embedder/platform_channel_pair.h" |
-#include "third_party/mojo/src/mojo/edk/embedder/simple_platform_support.h" |
-#include "third_party/mojo/src/mojo/edk/embedder/slave_process_delegate.h" |
-#include "third_party/mojo/src/mojo/edk/system/master_connection_manager.h" |
-#include "third_party/mojo/src/mojo/edk/system/slave_connection_manager.h" |
-#include "third_party/mojo/src/mojo/edk/test/test_utils.h" |
- |
-namespace mojo { |
-namespace system { |
-namespace { |
- |
-bool ArePlatformHandlesConnected(const embedder::PlatformHandle& h1, |
- const embedder::PlatformHandle& h2) { |
- const uint32_t w1 = 0xdeadbeef; |
- size_t num_bytes = 0; |
- if (!mojo::test::BlockingWrite(h1, &w1, sizeof(w1), &num_bytes) || |
- num_bytes != sizeof(w1)) |
- return false; |
- uint32_t r = 0; |
- num_bytes = 0; |
- if (!mojo::test::BlockingRead(h2, &r, sizeof(r), &num_bytes) || |
- num_bytes != sizeof(r)) |
- return false; |
- if (r != w1) |
- return false; |
- |
- const uint32_t w2 = 0xfeedface; |
- num_bytes = 0; |
- if (!mojo::test::BlockingWrite(h1, &w2, sizeof(w2), &num_bytes) || |
- num_bytes != sizeof(w2)) |
- return false; |
- r = 0; |
- num_bytes = 0; |
- if (!mojo::test::BlockingRead(h2, &r, sizeof(r), &num_bytes) || |
- num_bytes != sizeof(r)) |
- return false; |
- if (r != w2) |
- return false; |
- |
- return true; |
-} |
- |
-bool IsValidSlaveProcessIdentifier(ProcessIdentifier process_identifier) { |
- return process_identifier != kInvalidProcessIdentifier && |
- process_identifier != kMasterProcessIdentifier; |
-} |
- |
-class TestSlaveInfo { |
- public: |
- explicit TestSlaveInfo(const std::string& name) : name_(name) {} |
- ~TestSlaveInfo() { CHECK(thread_checker_.CalledOnValidThread()); } |
- |
- const std::string& name() const { return name_; } |
- |
- private: |
- base::ThreadChecker thread_checker_; |
- std::string name_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(TestSlaveInfo); |
-}; |
- |
-// Connects the given |slave| (with the given |slave_process_delegate|) to the |
-// given master, creating and using a |TestSlaveInfo| with the given |
-// |slave_name|, and returns the process identifier for the slave. |
-ProcessIdentifier ConnectSlave( |
- MasterConnectionManager* master, |
- embedder::SlaveProcessDelegate* slave_process_delegate, |
- SlaveConnectionManager* slave, |
- const std::string& slave_name) { |
- embedder::PlatformChannelPair platform_channel_pair; |
- ProcessIdentifier slave_process_identifier = master->AddSlave( |
- new TestSlaveInfo(slave_name), platform_channel_pair.PassServerHandle()); |
- slave->Init(slave_process_delegate, platform_channel_pair.PassClientHandle()); |
- return slave_process_identifier; |
-} |
- |
-class MockMasterProcessDelegate : public embedder::MasterProcessDelegate { |
- public: |
- MockMasterProcessDelegate() |
- : current_run_loop_(), on_slave_disconnect_calls_(0) {} |
- ~MockMasterProcessDelegate() override {} |
- |
- void RunUntilNotified() { |
- CHECK(!current_run_loop_); |
- base::RunLoop run_loop; |
- current_run_loop_ = &run_loop; |
- run_loop.Run(); |
- current_run_loop_ = nullptr; |
- } |
- |
- unsigned on_slave_disconnect_calls() const { |
- return on_slave_disconnect_calls_; |
- } |
- const std::string& last_slave_disconnect_name() const { |
- return last_slave_disconnect_name_; |
- } |
- |
- // |embedder::MasterProcessDelegate| implementation: |
- void OnShutdownComplete() override { NOTREACHED(); } |
- |
- void OnSlaveDisconnect(embedder::SlaveInfo slave_info) override { |
- CHECK(thread_checker_.CalledOnValidThread()); |
- on_slave_disconnect_calls_++; |
- last_slave_disconnect_name_ = |
- static_cast<TestSlaveInfo*>(slave_info)->name(); |
- DVLOG(1) << "Disconnected from slave process " |
- << last_slave_disconnect_name_; |
- delete static_cast<TestSlaveInfo*>(slave_info); |
- |
- if (current_run_loop_) |
- current_run_loop_->Quit(); |
- } |
- |
- private: |
- base::ThreadChecker thread_checker_; |
- base::RunLoop* current_run_loop_; |
- |
- unsigned on_slave_disconnect_calls_; |
- std::string last_slave_disconnect_name_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(MockMasterProcessDelegate); |
-}; |
- |
-class MockSlaveProcessDelegate : public embedder::SlaveProcessDelegate { |
- public: |
- MockSlaveProcessDelegate() |
- : current_run_loop_(), on_master_disconnect_calls_(0) {} |
- ~MockSlaveProcessDelegate() override {} |
- |
- void RunUntilNotified() { |
- CHECK(!current_run_loop_); |
- base::RunLoop run_loop; |
- current_run_loop_ = &run_loop; |
- run_loop.Run(); |
- current_run_loop_ = nullptr; |
- } |
- |
- unsigned on_master_disconnect_calls() const { |
- return on_master_disconnect_calls_; |
- } |
- |
- // |embedder::SlaveProcessDelegate| implementation: |
- void OnShutdownComplete() override { NOTREACHED(); } |
- |
- void OnMasterDisconnect() override { |
- CHECK(thread_checker_.CalledOnValidThread()); |
- on_master_disconnect_calls_++; |
- DVLOG(1) << "Disconnected from master process"; |
- |
- if (current_run_loop_) |
- current_run_loop_->Quit(); |
- } |
- |
- private: |
- base::ThreadChecker thread_checker_; |
- base::RunLoop* current_run_loop_; |
- |
- unsigned on_master_disconnect_calls_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(MockSlaveProcessDelegate); |
-}; |
- |
-class ConnectionManagerTest : public testing::Test { |
- protected: |
- ConnectionManagerTest() {} |
- ~ConnectionManagerTest() override {} |
- |
- embedder::PlatformSupport* platform_support() { return &platform_support_; } |
- |
- base::MessageLoop& message_loop() { return message_loop_; } |
- MockMasterProcessDelegate& master_process_delegate() { |
- return master_process_delegate_; |
- } |
- |
- private: |
- embedder::SimplePlatformSupport platform_support_; |
- base::MessageLoop message_loop_; |
- MockMasterProcessDelegate master_process_delegate_; |
- |
- MOJO_DISALLOW_COPY_AND_ASSIGN(ConnectionManagerTest); |
-}; |
- |
-TEST_F(ConnectionManagerTest, BasicConnectSlaves) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave1_process_delegate; |
- SlaveConnectionManager slave1(platform_support()); |
- ProcessIdentifier slave1_id = |
- ConnectSlave(&master, &slave1_process_delegate, &slave1, "slave1"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave1_id)); |
- |
- MockSlaveProcessDelegate slave2_process_delegate; |
- SlaveConnectionManager slave2(platform_support()); |
- ProcessIdentifier slave2_id = |
- ConnectSlave(&master, &slave2_process_delegate, &slave2, "slave2"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave2_id)); |
- // TODO(vtl): If/when I add the ability to get one's own process identifier, |
- // there'll be more we can check. |
- EXPECT_NE(slave1_id, slave2_id); |
- |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(slave1.AllowConnect(connection_id)); |
- EXPECT_TRUE(slave2.AllowConnect(connection_id)); |
- |
- ProcessIdentifier peer1 = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle h1; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- slave1.Connect(connection_id, &peer1, &is_first, &h1)); |
- EXPECT_EQ(slave2_id, peer1); |
- EXPECT_TRUE(is_first); |
- EXPECT_TRUE(h1.is_valid()); |
- ProcessIdentifier peer2 = kInvalidProcessIdentifier; |
- embedder::ScopedPlatformHandle h2; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- slave2.Connect(connection_id, &peer2, &is_first, &h2)); |
- EXPECT_EQ(slave1_id, peer2); |
- EXPECT_FALSE(is_first); |
- EXPECT_TRUE(h2.is_valid()); |
- |
- EXPECT_TRUE(ArePlatformHandlesConnected(h1.get(), h2.get())); |
- |
- // The process manager shouldn't have gotten any notifications yet. (Spin the |
- // message loop to make sure none were enqueued.) |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_EQ(0u, master_process_delegate().on_slave_disconnect_calls()); |
- |
- slave1.Shutdown(); |
- |
- // |OnSlaveDisconnect()| should be called once. |
- master_process_delegate().RunUntilNotified(); |
- EXPECT_EQ(1u, master_process_delegate().on_slave_disconnect_calls()); |
- EXPECT_EQ("slave1", master_process_delegate().last_slave_disconnect_name()); |
- |
- slave2.Shutdown(); |
- |
- // |OnSlaveDisconnect()| should be called again. |
- master_process_delegate().RunUntilNotified(); |
- EXPECT_EQ(2u, master_process_delegate().on_slave_disconnect_calls()); |
- EXPECT_EQ("slave2", master_process_delegate().last_slave_disconnect_name()); |
- |
- master.Shutdown(); |
- |
- // None of the above should result in |OnMasterDisconnect()| being called. |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_EQ(0u, slave1_process_delegate.on_master_disconnect_calls()); |
- EXPECT_EQ(0u, slave2_process_delegate.on_master_disconnect_calls()); |
-} |
- |
-TEST_F(ConnectionManagerTest, ShutdownMasterBeforeSlave) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave_process_delegate; |
- SlaveConnectionManager slave(platform_support()); |
- ProcessIdentifier slave_id = |
- ConnectSlave(&master, &slave_process_delegate, &slave, "slave"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave_id)); |
- |
- // The process manager shouldn't have gotten any notifications yet. (Spin the |
- // message loop to make sure none were enqueued.) |
- base::RunLoop().RunUntilIdle(); |
- EXPECT_EQ(0u, master_process_delegate().on_slave_disconnect_calls()); |
- |
- master.Shutdown(); |
- |
- // |OnSlaveDisconnect()| should be called. |
- master_process_delegate().RunUntilNotified(); |
- EXPECT_EQ(1u, master_process_delegate().on_slave_disconnect_calls()); |
- EXPECT_EQ("slave", master_process_delegate().last_slave_disconnect_name()); |
- |
- // |OnMasterDisconnect()| should also be (or have been) called. |
- slave_process_delegate.RunUntilNotified(); |
- EXPECT_EQ(1u, slave_process_delegate.on_master_disconnect_calls()); |
- |
- slave.Shutdown(); |
-} |
- |
-TEST_F(ConnectionManagerTest, SlaveCancelConnect) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave1_process_delegate; |
- SlaveConnectionManager slave1(platform_support()); |
- ProcessIdentifier slave1_id = |
- ConnectSlave(&master, &slave1_process_delegate, &slave1, "slave1"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave1_id)); |
- |
- MockSlaveProcessDelegate slave2_process_delegate; |
- SlaveConnectionManager slave2(platform_support()); |
- ProcessIdentifier slave2_id = |
- ConnectSlave(&master, &slave2_process_delegate, &slave2, "slave2"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave2_id)); |
- EXPECT_NE(slave1_id, slave2_id); |
- |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(slave1.AllowConnect(connection_id)); |
- EXPECT_TRUE(slave2.AllowConnect(connection_id)); |
- |
- EXPECT_TRUE(slave1.CancelConnect(connection_id)); |
- ProcessIdentifier peer2 = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle h2; |
- EXPECT_EQ(ConnectionManager::Result::FAILURE, |
- slave2.Connect(connection_id, &peer2, &is_first, &h2)); |
- EXPECT_EQ(kInvalidProcessIdentifier, peer2); |
- EXPECT_FALSE(is_first); |
- EXPECT_FALSE(h2.is_valid()); |
- |
- slave1.Shutdown(); |
- slave2.Shutdown(); |
- master.Shutdown(); |
-} |
- |
-// Tests that pending connections are removed on error. |
-TEST_F(ConnectionManagerTest, ErrorRemovePending) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave1_process_delegate; |
- SlaveConnectionManager slave1(platform_support()); |
- ProcessIdentifier slave1_id = |
- ConnectSlave(&master, &slave1_process_delegate, &slave1, "slave1"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave1_id)); |
- |
- MockSlaveProcessDelegate slave2_process_delegate; |
- SlaveConnectionManager slave2(platform_support()); |
- ProcessIdentifier slave2_id = |
- ConnectSlave(&master, &slave2_process_delegate, &slave2, "slave2"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave2_id)); |
- EXPECT_NE(slave1_id, slave2_id); |
- |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(slave1.AllowConnect(connection_id)); |
- EXPECT_TRUE(slave2.AllowConnect(connection_id)); |
- |
- slave1.Shutdown(); |
- |
- // |OnSlaveDisconnect()| should be called. After it's called, this means that |
- // the disconnect has been detected and handled, including the removal of the |
- // pending connection. |
- master_process_delegate().RunUntilNotified(); |
- EXPECT_EQ(1u, master_process_delegate().on_slave_disconnect_calls()); |
- |
- ProcessIdentifier peer2 = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle h2; |
- EXPECT_EQ(ConnectionManager::Result::FAILURE, |
- slave2.Connect(connection_id, &peer2, &is_first, &h2)); |
- EXPECT_EQ(kInvalidProcessIdentifier, peer2); |
- EXPECT_FALSE(is_first); |
- EXPECT_FALSE(h2.is_valid()); |
- |
- slave2.Shutdown(); |
- master.Shutdown(); |
-} |
- |
-TEST_F(ConnectionManagerTest, ConnectSlaveToSelf) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave_process_delegate; |
- SlaveConnectionManager slave(platform_support()); |
- ProcessIdentifier slave_id = |
- ConnectSlave(&master, &slave_process_delegate, &slave, "slave"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave_id)); |
- |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(slave.AllowConnect(connection_id)); |
- EXPECT_TRUE(slave.AllowConnect(connection_id)); |
- |
- ProcessIdentifier peer1 = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle h1; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_SAME_PROCESS, |
- slave.Connect(connection_id, &peer1, &is_first, &h1)); |
- EXPECT_EQ(slave_id, peer1); |
- EXPECT_TRUE(is_first); |
- EXPECT_FALSE(h1.is_valid()); |
- ProcessIdentifier peer2 = kInvalidProcessIdentifier; |
- embedder::ScopedPlatformHandle h2; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_SAME_PROCESS, |
- slave.Connect(connection_id, &peer2, &is_first, &h2)); |
- EXPECT_EQ(slave_id, peer2); |
- EXPECT_FALSE(is_first); |
- EXPECT_FALSE(h2.is_valid()); |
- |
- slave.Shutdown(); |
- master.Shutdown(); |
-} |
- |
-TEST_F(ConnectionManagerTest, ConnectSlavesTwice) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave1_process_delegate; |
- SlaveConnectionManager slave1(platform_support()); |
- ProcessIdentifier slave1_id = |
- ConnectSlave(&master, &slave1_process_delegate, &slave1, "slave1"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave1_id)); |
- |
- MockSlaveProcessDelegate slave2_process_delegate; |
- SlaveConnectionManager slave2(platform_support()); |
- ProcessIdentifier slave2_id = |
- ConnectSlave(&master, &slave2_process_delegate, &slave2, "slave2"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave2_id)); |
- EXPECT_NE(slave1_id, slave2_id); |
- |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(slave1.AllowConnect(connection_id)); |
- EXPECT_TRUE(slave2.AllowConnect(connection_id)); |
- |
- ProcessIdentifier peer1 = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle h1; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- slave1.Connect(connection_id, &peer1, &is_first, &h1)); |
- EXPECT_EQ(slave2_id, peer1); |
- EXPECT_TRUE(is_first); |
- ProcessIdentifier peer2 = kInvalidProcessIdentifier; |
- embedder::ScopedPlatformHandle h2; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- slave2.Connect(connection_id, &peer2, &is_first, &h2)); |
- EXPECT_EQ(slave1_id, peer2); |
- EXPECT_FALSE(is_first); |
- |
- EXPECT_TRUE(ArePlatformHandlesConnected(h1.get(), h2.get())); |
- |
- // TODO(vtl): Currently, the master doesn't detect the case of connecting a |
- // pair of slaves that are already connected. (Doing so would require more |
- // careful tracking and is prone to races -- especially if we want slaves to |
- // be able to tear down no-longer-needed connections.) But the slaves should |
- // be able to do the tracking themselves (using the peer process identifiers). |
- connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(slave1.AllowConnect(connection_id)); |
- EXPECT_TRUE(slave2.AllowConnect(connection_id)); |
- |
- h1.reset(); |
- h2.reset(); |
- ProcessIdentifier second_peer2 = kInvalidProcessIdentifier; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_REUSE_CONNECTION, |
- slave2.Connect(connection_id, &second_peer2, &is_first, &h2)); |
- EXPECT_EQ(peer2, second_peer2); |
- EXPECT_TRUE(is_first); |
- EXPECT_FALSE(h2.is_valid()); |
- ProcessIdentifier second_peer1 = kInvalidProcessIdentifier; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_REUSE_CONNECTION, |
- slave1.Connect(connection_id, &second_peer1, &is_first, &h1)); |
- EXPECT_EQ(peer1, second_peer1); |
- EXPECT_FALSE(is_first); |
- EXPECT_FALSE(h1.is_valid()); |
- |
- slave2.Shutdown(); |
- slave1.Shutdown(); |
- master.Shutdown(); |
-} |
- |
-TEST_F(ConnectionManagerTest, OverlappingSlaveConnects) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave1_process_delegate; |
- SlaveConnectionManager slave1(platform_support()); |
- ProcessIdentifier slave1_id = |
- ConnectSlave(&master, &slave1_process_delegate, &slave1, "slave1"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave1_id)); |
- |
- MockSlaveProcessDelegate slave2_process_delegate; |
- SlaveConnectionManager slave2(platform_support()); |
- ProcessIdentifier slave2_id = |
- ConnectSlave(&master, &slave2_process_delegate, &slave2, "slave2"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave2_id)); |
- EXPECT_NE(slave1_id, slave2_id); |
- |
- ConnectionIdentifier connection_id1 = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(slave1.AllowConnect(connection_id1)); |
- EXPECT_TRUE(slave2.AllowConnect(connection_id1)); |
- |
- ConnectionIdentifier connection_id2 = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(slave1.AllowConnect(connection_id2)); |
- EXPECT_TRUE(slave2.AllowConnect(connection_id2)); |
- |
- ProcessIdentifier peer1 = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle h1; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- slave1.Connect(connection_id1, &peer1, &is_first, &h1)); |
- EXPECT_EQ(slave2_id, peer1); |
- EXPECT_TRUE(is_first); |
- ProcessIdentifier peer2 = kInvalidProcessIdentifier; |
- embedder::ScopedPlatformHandle h2; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- slave2.Connect(connection_id2, &peer2, &is_first, &h2)); |
- EXPECT_EQ(slave1_id, peer2); |
- EXPECT_TRUE(is_first); |
- |
- EXPECT_TRUE(ArePlatformHandlesConnected(h1.get(), h2.get())); |
- |
- h1.reset(); |
- h2.reset(); |
- ProcessIdentifier second_peer1 = kInvalidProcessIdentifier; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_REUSE_CONNECTION, |
- slave1.Connect(connection_id2, &second_peer1, &is_first, &h1)); |
- EXPECT_EQ(peer1, second_peer1); |
- EXPECT_FALSE(is_first); |
- EXPECT_FALSE(h1.is_valid()); |
- ProcessIdentifier second_peer2 = kInvalidProcessIdentifier; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_REUSE_CONNECTION, |
- slave2.Connect(connection_id1, &second_peer2, &is_first, &h2)); |
- EXPECT_EQ(peer2, second_peer2); |
- EXPECT_FALSE(is_first); |
- EXPECT_FALSE(h2.is_valid()); |
- |
- slave2.Shutdown(); |
- slave1.Shutdown(); |
- master.Shutdown(); |
-} |
- |
-TEST_F(ConnectionManagerTest, ConnectMasterToSlave) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave_process_delegate; |
- SlaveConnectionManager slave(platform_support()); |
- ProcessIdentifier slave_id = |
- ConnectSlave(&master, &slave_process_delegate, &slave, "slave"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave_id)); |
- |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(master.AllowConnect(connection_id)); |
- EXPECT_TRUE(slave.AllowConnect(connection_id)); |
- |
- ProcessIdentifier master_peer = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle master_h; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- master.Connect(connection_id, &master_peer, &is_first, &master_h)); |
- EXPECT_EQ(slave_id, master_peer); |
- EXPECT_TRUE(is_first); |
- EXPECT_TRUE(master_h.is_valid()); |
- ProcessIdentifier slave_peer = kInvalidProcessIdentifier; |
- embedder::ScopedPlatformHandle slave_h; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- slave.Connect(connection_id, &slave_peer, &is_first, &slave_h)); |
- EXPECT_EQ(kMasterProcessIdentifier, slave_peer); |
- EXPECT_FALSE(is_first); |
- EXPECT_TRUE(slave_h.is_valid()); |
- |
- EXPECT_TRUE(ArePlatformHandlesConnected(master_h.get(), slave_h.get())); |
- |
- slave.Shutdown(); |
- master.Shutdown(); |
-} |
- |
-TEST_F(ConnectionManagerTest, ConnectMasterToSelf) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(master.AllowConnect(connection_id)); |
- EXPECT_TRUE(master.AllowConnect(connection_id)); |
- |
- ProcessIdentifier peer1 = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle h1; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_SAME_PROCESS, |
- master.Connect(connection_id, &peer1, &is_first, &h1)); |
- EXPECT_EQ(kMasterProcessIdentifier, peer1); |
- EXPECT_TRUE(is_first); |
- EXPECT_FALSE(h1.is_valid()); |
- ProcessIdentifier peer2 = kInvalidProcessIdentifier; |
- embedder::ScopedPlatformHandle h2; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_SAME_PROCESS, |
- master.Connect(connection_id, &peer2, &is_first, &h2)); |
- EXPECT_EQ(kMasterProcessIdentifier, peer2); |
- EXPECT_FALSE(is_first); |
- EXPECT_FALSE(h2.is_valid()); |
- |
- EXPECT_EQ(peer1, peer2); |
- |
- master.Shutdown(); |
-} |
- |
-TEST_F(ConnectionManagerTest, MasterCancelConnect) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave_process_delegate; |
- SlaveConnectionManager slave(platform_support()); |
- ProcessIdentifier slave_id = |
- ConnectSlave(&master, &slave_process_delegate, &slave, "slave"); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave_id)); |
- |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- EXPECT_TRUE(master.AllowConnect(connection_id)); |
- EXPECT_TRUE(slave.AllowConnect(connection_id)); |
- |
- EXPECT_TRUE(master.CancelConnect(connection_id)); |
- ProcessIdentifier peer = kInvalidProcessIdentifier; |
- bool is_first = false; |
- embedder::ScopedPlatformHandle h; |
- EXPECT_EQ(ConnectionManager::Result::FAILURE, |
- slave.Connect(connection_id, &peer, &is_first, &h)); |
- EXPECT_EQ(kInvalidProcessIdentifier, peer); |
- EXPECT_FALSE(is_first); |
- EXPECT_FALSE(h.is_valid()); |
- |
- slave.Shutdown(); |
- master.Shutdown(); |
-} |
- |
-TEST_F(ConnectionManagerTest, AddSlaveThenImmediateShutdown) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- MockSlaveProcessDelegate slave_process_delegate; |
- SlaveConnectionManager slave(platform_support()); |
- embedder::PlatformChannelPair platform_channel_pair; |
- ProcessIdentifier slave_id = master.AddSlave( |
- new TestSlaveInfo("slave"), platform_channel_pair.PassServerHandle()); |
- master.Shutdown(); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave_id)); |
- // Since we never initialized |slave|, we don't have to shut it down. |
-} |
- |
-TEST_F(ConnectionManagerTest, AddSlaveAndBootstrap) { |
- MasterConnectionManager master(platform_support()); |
- master.Init(&master_process_delegate()); |
- |
- embedder::PlatformChannelPair platform_channel_pair; |
- ConnectionIdentifier connection_id = master.GenerateConnectionIdentifier(); |
- ProcessIdentifier slave_id = master.AddSlaveAndBootstrap( |
- new TestSlaveInfo("slave"), platform_channel_pair.PassServerHandle(), |
- connection_id); |
- EXPECT_TRUE(IsValidSlaveProcessIdentifier(slave_id)); |
- |
- embedder::ScopedPlatformHandle h1; |
- ProcessIdentifier master_peer = kInvalidProcessIdentifier; |
- bool is_first = false; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- master.Connect(connection_id, &master_peer, &is_first, &h1)); |
- EXPECT_EQ(slave_id, master_peer); |
- EXPECT_TRUE(is_first); |
- EXPECT_TRUE(h1.is_valid()); |
- |
- // We can delay creating/initializing |slave| for quite a while. |
- MockSlaveProcessDelegate slave_process_delegate; |
- SlaveConnectionManager slave(platform_support()); |
- slave.Init(&slave_process_delegate, platform_channel_pair.PassClientHandle()); |
- |
- ProcessIdentifier slave_peer = kInvalidProcessIdentifier; |
- embedder::ScopedPlatformHandle h2; |
- EXPECT_EQ(ConnectionManager::Result::SUCCESS_CONNECT_NEW_CONNECTION, |
- slave.Connect(connection_id, &slave_peer, &is_first, &h2)); |
- EXPECT_EQ(kMasterProcessIdentifier, slave_peer); |
- EXPECT_FALSE(is_first); |
- |
- EXPECT_TRUE(ArePlatformHandlesConnected(h1.get(), h2.get())); |
- |
- slave.Shutdown(); |
- master.Shutdown(); |
-} |
- |
-// TODO(vtl): More shutdown cases for |AddSlaveAndBootstrap()|? |
- |
-} // namespace |
-} // namespace system |
-} // namespace mojo |