| Index: mojo/edk/system/channel_manager_unittest.cc
|
| diff --git a/mojo/edk/system/channel_manager_unittest.cc b/mojo/edk/system/channel_manager_unittest.cc
|
| deleted file mode 100644
|
| index 52f3f0ebfb03ab6d23ca670bfa6f85c851798975..0000000000000000000000000000000000000000
|
| --- a/mojo/edk/system/channel_manager_unittest.cc
|
| +++ /dev/null
|
| @@ -1,183 +0,0 @@
|
| -// Copyright 2014 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 "mojo/edk/system/channel_manager.h"
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/macros.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#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"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace mojo {
|
| -namespace system {
|
| -namespace {
|
| -
|
| -class ChannelManagerTest : public testing::Test {
|
| - public:
|
| - ChannelManagerTest() : message_loop_(base::MessageLoop::TYPE_IO) {}
|
| - ~ChannelManagerTest() override {}
|
| -
|
| - protected:
|
| - embedder::SimplePlatformSupport* platform_support() {
|
| - return &platform_support_;
|
| - }
|
| - base::MessageLoop* message_loop() { return &message_loop_; }
|
| -
|
| - private:
|
| - embedder::SimplePlatformSupport platform_support_;
|
| - base::MessageLoop message_loop_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ChannelManagerTest);
|
| -};
|
| -
|
| -TEST_F(ChannelManagerTest, Basic) {
|
| - ChannelManager cm;
|
| -
|
| - // Hang on to a ref to the |Channel|, so that we can check that the
|
| - // |ChannelManager| takes/releases refs to it.
|
| - scoped_refptr<Channel> ch(new Channel(platform_support()));
|
| - ASSERT_TRUE(ch->HasOneRef());
|
| -
|
| - embedder::PlatformChannelPair channel_pair;
|
| - ch->Init(RawChannel::Create(channel_pair.PassServerHandle()));
|
| -
|
| - ChannelId id = cm.AddChannel(ch, base::MessageLoopProxy::current());
|
| - EXPECT_NE(id, 0u);
|
| - // |ChannelManager| should take a ref.
|
| - EXPECT_FALSE(ch->HasOneRef());
|
| -
|
| - cm.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.
|
| - // |ChannelManager| should have given up its ref.
|
| - EXPECT_TRUE(ch->HasOneRef());
|
| -}
|
| -
|
| -TEST_F(ChannelManagerTest, TwoChannels) {
|
| - ChannelManager cm;
|
| -
|
| - // Hang on to a ref to each |Channel|, so that we can check that the
|
| - // |ChannelManager| takes/releases refs to them.
|
| - scoped_refptr<Channel> ch1(new Channel(platform_support()));
|
| - ASSERT_TRUE(ch1->HasOneRef());
|
| - scoped_refptr<Channel> ch2(new Channel(platform_support()));
|
| - ASSERT_TRUE(ch2->HasOneRef());
|
| -
|
| - embedder::PlatformChannelPair channel_pair;
|
| - ch1->Init(RawChannel::Create(channel_pair.PassServerHandle()));
|
| - ch2->Init(RawChannel::Create(channel_pair.PassClientHandle()));
|
| -
|
| - ChannelId id1 = cm.AddChannel(ch1, base::MessageLoopProxy::current());
|
| - EXPECT_NE(id1, 0u);
|
| - EXPECT_FALSE(ch1->HasOneRef());
|
| -
|
| - ChannelId id2 = cm.AddChannel(ch2, base::MessageLoopProxy::current());
|
| - EXPECT_NE(id2, 0u);
|
| - EXPECT_NE(id2, id1);
|
| - EXPECT_FALSE(ch2->HasOneRef());
|
| -
|
| - // Calling |WillShutdownChannel()| multiple times (on |id1|) is okay.
|
| - cm.WillShutdownChannel(id1);
|
| - cm.WillShutdownChannel(id1);
|
| - EXPECT_FALSE(ch1->HasOneRef());
|
| - // Not calling |WillShutdownChannel()| (on |id2|) is okay too.
|
| -
|
| - cm.ShutdownChannel(id1);
|
| - EXPECT_TRUE(ch1->HasOneRef());
|
| - cm.ShutdownChannel(id2);
|
| - EXPECT_TRUE(ch2->HasOneRef());
|
| -}
|
| -
|
| -class OtherThread : public base::SimpleThread {
|
| - public:
|
| - // Note: We rely on the main thread keeping *exactly one* reference to
|
| - // |channel|.
|
| - OtherThread(scoped_refptr<base::TaskRunner> task_runner,
|
| - ChannelManager* channel_manager,
|
| - Channel* channel,
|
| - base::Closure quit_closure)
|
| - : base::SimpleThread("other_thread"),
|
| - task_runner_(task_runner),
|
| - channel_manager_(channel_manager),
|
| - channel_(channel),
|
| - quit_closure_(quit_closure) {}
|
| - ~OtherThread() override {}
|
| -
|
| - private:
|
| - void Run() override {
|
| - // See comment above constructor.
|
| - ASSERT_TRUE(channel_->HasOneRef());
|
| -
|
| - ChannelId id = channel_manager_->AddChannel(make_scoped_refptr(channel_),
|
| - task_runner_);
|
| - EXPECT_NE(id, 0u);
|
| - // |ChannelManager| should take a ref.
|
| - EXPECT_FALSE(channel_->HasOneRef());
|
| -
|
| - channel_manager_->WillShutdownChannel(id);
|
| - // |ChannelManager| should still have a ref.
|
| - EXPECT_FALSE(channel_->HasOneRef());
|
| -
|
| - channel_manager_->ShutdownChannel(id);
|
| - // This doesn't happen synchronously, so we "wait" until it does.
|
| - // TODO(vtl): Possibly |Channel| should provide some notification of being
|
| - // shut down.
|
| - base::TimeTicks start_time(base::TimeTicks::Now());
|
| - for (;;) {
|
| - if (channel_->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));
|
| - }
|
| -
|
| - CHECK(task_runner_->PostTask(FROM_HERE, quit_closure_));
|
| - }
|
| -
|
| - scoped_refptr<base::TaskRunner> task_runner_;
|
| - ChannelManager* channel_manager_;
|
| - Channel* channel_;
|
| - base::Closure quit_closure_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(OtherThread);
|
| -};
|
| -
|
| -TEST_F(ChannelManagerTest, CallsFromOtherThread) {
|
| - ChannelManager cm;
|
| -
|
| - // Hang on to a ref to the |Channel|, so that we can check that the
|
| - // |ChannelManager| takes/releases refs to it.
|
| - scoped_refptr<Channel> ch(new Channel(platform_support()));
|
| - ASSERT_TRUE(ch->HasOneRef());
|
| -
|
| - embedder::PlatformChannelPair channel_pair;
|
| - ch->Init(RawChannel::Create(channel_pair.PassServerHandle()));
|
| -
|
| - base::RunLoop run_loop;
|
| - OtherThread thread(base::MessageLoopProxy::current(), &cm, ch.get(),
|
| - run_loop.QuitClosure());
|
| - thread.Start();
|
| - run_loop.Run();
|
| - thread.Join();
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace system
|
| -} // namespace mojo
|
|
|