Index: third_party/mojo/src/mojo/edk/system/channel_manager_unittest.cc |
diff --git a/third_party/mojo/src/mojo/edk/system/channel_manager_unittest.cc b/third_party/mojo/src/mojo/edk/system/channel_manager_unittest.cc |
index 86ab4a0adf1274fb762bfe395d2897008b989cf8..1a3176eec96370072ea1bb6d54fa3e6feface8b1 100644 |
--- a/third_party/mojo/src/mojo/edk/system/channel_manager_unittest.cc |
+++ b/third_party/mojo/src/mojo/edk/system/channel_manager_unittest.cc |
@@ -10,10 +10,7 @@ |
#include "base/message_loop/message_loop_proxy.h" |
#include "base/run_loop.h" |
#include "base/task_runner.h" |
-#include "base/test/test_timeouts.h" |
-#include "base/threading/platform_thread.h" |
#include "base/threading/simple_thread.h" |
-#include "base/time/time.h" |
#include "mojo/edk/embedder/platform_channel_pair.h" |
#include "mojo/edk/embedder/simple_platform_support.h" |
#include "mojo/edk/system/channel.h" |
@@ -27,42 +24,44 @@ namespace { |
class ChannelManagerTest : public testing::Test { |
public: |
- ChannelManagerTest() : message_loop_(base::MessageLoop::TYPE_IO) {} |
+ ChannelManagerTest() |
+ : message_loop_(base::MessageLoop::TYPE_IO), |
+ channel_manager_(&platform_support_, |
+ message_loop_.task_runner(), |
+ nullptr) {} |
~ChannelManagerTest() override {} |
protected: |
- embedder::SimplePlatformSupport* platform_support() { |
- return &platform_support_; |
- } |
- base::MessageLoop* message_loop() { return &message_loop_; } |
+ ChannelManager& channel_manager() { return channel_manager_; } |
private: |
embedder::SimplePlatformSupport platform_support_; |
base::MessageLoop message_loop_; |
+ // Note: This should be *after* the above, since they must be initialized |
+ // before it (and should outlive it). |
+ ChannelManager channel_manager_; |
DISALLOW_COPY_AND_ASSIGN(ChannelManagerTest); |
}; |
TEST_F(ChannelManagerTest, Basic) { |
- ChannelManager cm(platform_support()); |
- |
embedder::PlatformChannelPair channel_pair; |
const ChannelId id = 1; |
scoped_refptr<MessagePipeDispatcher> d = |
- cm.CreateChannelOnIOThread(id, channel_pair.PassServerHandle()); |
+ channel_manager().CreateChannelOnIOThread( |
+ id, channel_pair.PassServerHandle()); |
- scoped_refptr<Channel> ch = cm.GetChannel(id); |
+ scoped_refptr<Channel> ch = channel_manager().GetChannel(id); |
EXPECT_TRUE(ch); |
// |ChannelManager| should have a ref. |
EXPECT_FALSE(ch->HasOneRef()); |
- cm.WillShutdownChannel(id); |
+ channel_manager().WillShutdownChannel(id); |
// |ChannelManager| should still have a ref. |
EXPECT_FALSE(ch->HasOneRef()); |
- cm.ShutdownChannel(id); |
- // On the "I/O" thread, so shutdown should happen synchronously. |
+ channel_manager().ShutdownChannelOnIOThread(id); |
// |ChannelManager| should have given up its ref. |
EXPECT_TRUE(ch->HasOneRef()); |
@@ -70,33 +69,33 @@ TEST_F(ChannelManagerTest, Basic) { |
} |
TEST_F(ChannelManagerTest, TwoChannels) { |
- ChannelManager cm(platform_support()); |
- |
embedder::PlatformChannelPair channel_pair; |
const ChannelId id1 = 1; |
scoped_refptr<MessagePipeDispatcher> d1 = |
- cm.CreateChannelOnIOThread(id1, channel_pair.PassServerHandle()); |
+ channel_manager().CreateChannelOnIOThread( |
+ id1, channel_pair.PassServerHandle()); |
const ChannelId id2 = 2; |
scoped_refptr<MessagePipeDispatcher> d2 = |
- cm.CreateChannelOnIOThread(id2, channel_pair.PassClientHandle()); |
+ channel_manager().CreateChannelOnIOThread( |
+ id2, channel_pair.PassClientHandle()); |
- scoped_refptr<Channel> ch1 = cm.GetChannel(id1); |
+ scoped_refptr<Channel> ch1 = channel_manager().GetChannel(id1); |
EXPECT_TRUE(ch1); |
- scoped_refptr<Channel> ch2 = cm.GetChannel(id2); |
+ scoped_refptr<Channel> ch2 = channel_manager().GetChannel(id2); |
EXPECT_TRUE(ch2); |
// Calling |WillShutdownChannel()| multiple times (on |id1|) is okay. |
- cm.WillShutdownChannel(id1); |
- cm.WillShutdownChannel(id1); |
+ channel_manager().WillShutdownChannel(id1); |
+ channel_manager().WillShutdownChannel(id1); |
EXPECT_FALSE(ch1->HasOneRef()); |
// Not calling |WillShutdownChannel()| (on |id2|) is okay too. |
- cm.ShutdownChannel(id1); |
+ channel_manager().ShutdownChannelOnIOThread(id1); |
EXPECT_TRUE(ch1->HasOneRef()); |
- cm.ShutdownChannel(id2); |
+ channel_manager().ShutdownChannelOnIOThread(id2); |
EXPECT_TRUE(ch2->HasOneRef()); |
EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); |
@@ -110,7 +109,7 @@ class OtherThread : public base::SimpleThread { |
OtherThread(scoped_refptr<base::TaskRunner> task_runner, |
ChannelManager* channel_manager, |
ChannelId channel_id, |
- base::Closure quit_closure) |
+ const base::Closure& quit_closure) |
: base::SimpleThread("other_thread"), |
task_runner_(task_runner), |
channel_manager_(channel_manager), |
@@ -132,20 +131,12 @@ class OtherThread : public base::SimpleThread { |
// |ChannelManager| should still have a ref. |
EXPECT_FALSE(ch->HasOneRef()); |
- channel_manager_->ShutdownChannel(channel_id_); |
- // This doesn't happen synchronously, so we "wait" until it does. |
- // TODO(vtl): Probably |Channel| should provide some notification of being |
- // shut down. |
- base::TimeTicks start_time(base::TimeTicks::Now()); |
- for (;;) { |
- if (ch->HasOneRef()) |
- break; |
- |
- // Check, instead of assert, since if things go wrong, dying is more |
- // reliable than tearing down. |
- CHECK_LT(base::TimeTicks::Now() - start_time, |
- TestTimeouts::action_timeout()); |
- base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(20)); |
+ { |
+ base::MessageLoop message_loop; |
+ base::RunLoop run_loop; |
+ channel_manager_->ShutdownChannel(channel_id_, run_loop.QuitClosure(), |
+ message_loop.task_runner()); |
+ run_loop.Run(); |
} |
CHECK(task_runner_->PostTask(FROM_HERE, quit_closure_)); |
@@ -160,16 +151,15 @@ class OtherThread : public base::SimpleThread { |
}; |
TEST_F(ChannelManagerTest, CallsFromOtherThread) { |
- ChannelManager cm(platform_support()); |
- |
embedder::PlatformChannelPair channel_pair; |
const ChannelId id = 1; |
scoped_refptr<MessagePipeDispatcher> d = |
- cm.CreateChannelOnIOThread(id, channel_pair.PassServerHandle()); |
+ channel_manager().CreateChannelOnIOThread( |
+ id, channel_pair.PassServerHandle()); |
base::RunLoop run_loop; |
- OtherThread thread(base::MessageLoopProxy::current(), &cm, id, |
+ OtherThread thread(base::MessageLoopProxy::current(), &channel_manager(), id, |
run_loop.QuitClosure()); |
thread.Start(); |
run_loop.Run(); |