Index: mojo/shell/shell_test_helper.cc |
diff --git a/mojo/shell/shell_test_helper.cc b/mojo/shell/shell_test_helper.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c530140b2b1e8bdda880ecb14cb5dc70a055bb0c |
--- /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 |