Chromium Code Reviews| 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" |
|
Ben Goodger (Google)
2014/07/30 16:53:18
You shouldn't need to include this here. If you do
msw
2014/08/06 22:34:40
Done.
|
| +#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 ... |
|
Ben Goodger (Google)
2014/07/30 16:53:18
// TODO(msw): Remove these once we can get Applica
msw
2014/08/06 22:34:40
Done, but what is TLS? :-/
|
| +mojo::ApplicationImpl* g_application_impl_hack = NULL; |
| +mojo::RunLoop* g_run_loop_hack = NULL; |
|
Ben Goodger (Google)
2014/07/30 16:53:18
I think this is fine.
msw
2014/08/06 22:34:40
Acknowledged, but I switched to RunLoop::current()
|
| + |
| +} // 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() {} |
|
Ben Goodger (Google)
2014/07/30 16:53:18
nit: newline after
msw
2014/08/06 22:34:40
Done.
|
| + int16_t last_pong_value() const { return last_pong_value_; } |
| + |
| + protected: |
|
Ben Goodger (Google)
2014/07/30 16:53:18
move to private
msw
2014/08/06 22:34:40
Done.
|
| + // 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; |
| + 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; |
| +} |