diff options
author | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-29 19:31:23 +0000 |
---|---|---|
committer | sky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-29 19:31:23 +0000 |
commit | 1124dea06ec4f030992f95ab653ab3759b694fde (patch) | |
tree | c0937830d343965eb1540010b22c8290b5c68c99 /mojo/shell/shell_test_helper.cc | |
parent | 6ba332af6e2c3b5039bbf3ecd7aac2df11e82217 (diff) | |
download | chromium_src-1124dea06ec4f030992f95ab653ab3759b694fde.zip chromium_src-1124dea06ec4f030992f95ab653ab3759b694fde.tar.gz chromium_src-1124dea06ec4f030992f95ab653ab3759b694fde.tar.bz2 |
Changes view manager test to connect via shell
Previously code was linking with ViewManager, now I'm connecting
through the shell. As part of this I'm adding a general class that
should make it easy to connect to any server through the shell.
For the time being I'm making the shell explicitly link with the
viewmanager. Eventually that'll have to change.
BUG=365012
TEST=covered by tests
R=davemoore@chromium.org
Review URL: https://codereview.chromium.org/256133002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266937 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo/shell/shell_test_helper.cc')
-rw-r--r-- | mojo/shell/shell_test_helper.cc | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/mojo/shell/shell_test_helper.cc b/mojo/shell/shell_test_helper.cc new file mode 100644 index 0000000..c530140 --- /dev/null +++ b/mojo/shell/shell_test_helper.cc @@ -0,0 +1,87 @@ +// 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/shell/shell_test_helper.h" + +#include "base/command_line.h" +#include "base/logging.h" +#include "base/message_loop/message_loop.h" +#include "mojo/shell/context.h" +#include "mojo/shell/init.h" + +namespace mojo { +namespace shell { + +// State used on the background thread. Be careful, this is created on the main +// thread than passed to the shell thread. Destruction happens on the shell +// thread. +struct ShellTestHelper::State { + scoped_ptr<Context> context; + scoped_ptr<ServiceManager::TestAPI> test_api; + ScopedShellHandle shell_handle; +}; + +namespace { + +void StartShellOnShellThread(ShellTestHelper::State* state) { + state->context.reset(new Context); + state->test_api.reset( + new ServiceManager::TestAPI(state->context->service_manager())); + state->shell_handle = state->test_api->GetShellHandle(); +} + +} // namespace + +class ShellTestHelper::TestShellClient : public ShellClient { + public: + TestShellClient() {} + virtual ~TestShellClient() {} + + // ShellClient: + virtual void AcceptConnection( + const mojo::String& url, + ScopedMessagePipeHandle client_handle) OVERRIDE { + } + + private: + DISALLOW_COPY_AND_ASSIGN(TestShellClient); +}; + +ShellTestHelper::ShellTestHelper() + : shell_thread_("Test Shell Thread"), + state_(NULL) { + CommandLine::Init(0, NULL); + mojo::shell::InitializeLogging(); +} + +ShellTestHelper::~ShellTestHelper() { + if (state_) { + // |state_| contains data created on the background thread. Destroy it + // there so that there aren't any race conditions. + shell_thread_.message_loop()->DeleteSoon(FROM_HERE, state_); + state_ = NULL; + } +} + +void ShellTestHelper::Init() { + DCHECK(!state_); + state_ = new State; + shell_thread_.Start(); + shell_thread_.message_loop()->message_loop_proxy()->PostTaskAndReply( + FROM_HERE, + base::Bind(&StartShellOnShellThread, state_), + base::Bind(&ShellTestHelper::OnShellStarted, base::Unretained(this))); + run_loop_.reset(new base::RunLoop); + run_loop_->Run(); +} + +void ShellTestHelper::OnShellStarted() { + DCHECK(state_); + shell_client_.reset(new TestShellClient); + shell_.reset(state_->shell_handle.Pass(), shell_client_.get()); + run_loop_->Quit(); +} + +} // namespace shell +} // namespace mojo |