Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1388)

Unified Diff: mojo/examples/test/example_unittest.cc

Issue 399653004: Add a Mojo example apptest that runs in mojo_shell. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync and rebase. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/examples/test/example_unittest.cc
diff --git a/mojo/examples/test/example_unittest.cc b/mojo/examples/test/example_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..e894525a5ac926c07c6b6b17931b52377c74d944
--- /dev/null
+++ b/mojo/examples/test/example_unittest.cc
@@ -0,0 +1,123 @@
+// 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.
+
+// TODO(msw): Use mojo_main_chromium.cc mojo_environment_chromium for base/
+// not mojo_main_standalone.cc and mojo_environment_standalone ???
+// (a mojo_main_chromium app can test standalone services and apps)
+
+#include "mojo/examples/test/example_service.mojom.h"
+#include "mojo/examples/test/example_service_impl.h"
+#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/public/cpp/bindings/callback.h"
+#include "mojo/public/cpp/environment/environment.h"
+#include "mojo/public/cpp/system/macros.h"
+#include "mojo/public/cpp/utility/run_loop.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+// TODO(msw): Avoid globals ...
+mojo::ApplicationImpl* g_application_impl_hack = NULL;
+mojo::RunLoop* g_run_loop_hack = NULL;
+
+} // namespace
+
+namespace mojo {
+
+namespace {
+
+// TODO(msw): Split example_service_unittest and example_client_unittest ???
+class ExampleClientImpl : public InterfaceImpl<ExampleClient> {
+ public:
+ explicit ExampleClientImpl() : last_pong_value_(0) {}
+ virtual ~ExampleClientImpl() {}
+ int16_t last_pong_value() const { return last_pong_value_; }
+
+ protected:
+ // InterfaceImpl<ExampleClient> overrides.
+ virtual void Pong(uint16_t pong_value) MOJO_OVERRIDE {
+ last_pong_value_ = pong_value;
+ g_run_loop_hack->Quit();
+ }
+
+ private:
+ int16_t last_pong_value_;
+ MOJO_DISALLOW_COPY_AND_ASSIGN(ExampleClientImpl);
+};
+
+// TODO(msw): Split example_service_unittest and example_client_unittest ???
+class ExampleServiceTest : public testing::Test {
+ public:
+ ExampleServiceTest() {
+ g_application_impl_hack->ConnectToService("mojo:mojo_example_service",
+ &example_service_);
+ example_service_.set_client(&example_client_);
+ }
+
+ virtual ~ExampleServiceTest() MOJO_OVERRIDE {
+ example_service_.reset();
+ }
+
+ protected:
+ ExampleServicePtr example_service_;
+ ExampleClientImpl example_client_;
+
+ private:
+ MOJO_DISALLOW_COPY_AND_ASSIGN(ExampleServiceTest);
+};
+
+TEST_F(ExampleServiceTest, Ping) {
+ EXPECT_EQ(0, example_client_.last_pong_value());
+ example_service_->Ping(1);
+ g_run_loop_hack->Run();
+ EXPECT_EQ(1, example_client_.last_pong_value());
+}
+
+// TODO(msw): Attempt mojo::Callbacks without base::Bind ???
+template <typename T>
+struct SetAndQuit : public Callback<void()>::Runnable {
+ SetAndQuit(T* val, T result) : val_(val), result_(result) {}
+ virtual ~SetAndQuit() {}
+ virtual void Run() const MOJO_OVERRIDE{
+ *val_ = result_;
+ g_run_loop_hack->Quit();
+ }
+ T* val_;
+ T result_;
+};
+
+TEST_F(ExampleServiceTest, RunCallback) {
+ bool was_run = false;
+ example_service_->RunCallback(SetAndQuit<bool>(&was_run, true));
+ g_run_loop_hack->Run();
+ EXPECT_TRUE(was_run);
+}
+
+} // namespace
+
+} // namespace mojo
+
+extern "C" APPLICATION_EXPORT MojoResult CDECL MojoMain(
+ MojoHandle shell_handle) {
+ mojo::Environment env;
+ mojo::RunLoop loop;
+ g_run_loop_hack = &loop;
+
+ // TODO(msw): Use mojo::ApplicationDelegate::Create() ???
+ // Add a TestApplicationDelegate helper? What would it offer ???
+ mojo::ApplicationDelegate delegate;
Ben Goodger (Google) 2014/07/30 16:53:18 I think you can implement an ApplicationDelegate i
msw 2014/08/06 22:34:40 After moving the client service impl and applicati
+ mojo::ApplicationImpl app(&delegate);
+ app.BindShell(shell_handle);
+ g_application_impl_hack = &app;
+
+ // TODO(msw): Get actual commandline arguments ...
+ int argc = 0;
+ char** argv = NULL;
+ testing::InitGoogleTest(&argc, argv);
+
+ // TODO(msw): g_run_loop_hack->Quit(); or kill some KeepAlive ???
+ // See http://crbug.com/394477 and http://crbug.com/392685
+ return RUN_ALL_TESTS() == 0 ? MOJO_RESULT_OK : MOJO_RESULT_UNKNOWN;
Ben Goodger (Google) 2014/07/30 16:53:18 lifetime issues being handled by timsteele it seem
msw 2014/08/06 22:34:40 Done.
+}

Powered by Google App Engine
This is Rietveld 408576698