summaryrefslogtreecommitdiffstats
path: root/mojo/shell/shell_test_helper.cc
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-29 19:31:23 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-29 19:31:23 +0000
commit1124dea06ec4f030992f95ab653ab3759b694fde (patch)
treec0937830d343965eb1540010b22c8290b5c68c99 /mojo/shell/shell_test_helper.cc
parent6ba332af6e2c3b5039bbf3ecd7aac2df11e82217 (diff)
downloadchromium_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.cc87
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