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.
|
+} |