Chromium Code Reviews| Index: mojo/examples/apptest/example_apptest.cc |
| diff --git a/mojo/examples/apptest/example_apptest.cc b/mojo/examples/apptest/example_apptest.cc |
| index c754c85e3b7b56dc959a8a357fe54dc7531593e7..af7ad53db5aa813fad8ce20eac07fa123b9fce3a 100644 |
| --- a/mojo/examples/apptest/example_apptest.cc |
| +++ b/mojo/examples/apptest/example_apptest.cc |
| @@ -20,8 +20,9 @@ |
| namespace { |
| -// TODO(msw): Remove this once we can get ApplicationImpl from TLS. |
| -mojo::ApplicationImpl* g_application_impl_hack = NULL; |
| +// A shell handle and command line args used for numerous application instances. |
| +mojo::ScopedMessagePipeHandle g_shell_scoped_message_pipe_handle_hack; |
| +mojo::Array<mojo::String> g_args_hack; |
|
viettrungluu
2014/10/15 20:15:50
I don't think the individual tests actually need t
msw
2014/10/16 00:34:09
Okay, I've removed this for now and added TODOs to
|
| } // namespace |
| @@ -29,21 +30,37 @@ namespace mojo { |
| namespace { |
| +// These GTESTs exemplify application testing executed within mojo_shell. |
| +// GTEST command line arguments are supported amid application arguments: |
| +// mojo_shell 'mojo:mojo_example_apptest arg1 --gtest_filter=foo arg2' |
| class ExampleApptest : public testing::Test { |
|
viettrungluu
2014/10/15 20:15:50
Maybe provide this as a test fixture base class. T
msw
2014/10/16 00:34:09
Done.
|
| public: |
| - ExampleApptest() { |
| - g_application_impl_hack->ConnectToService("mojo:mojo_example_service", |
| - &example_service_); |
| + ExampleApptest() : application_impl_(NULL) { |
| + // New applications are constructed for each test to avoid persisting state. |
| + application_impl_ = new mojo::ApplicationImpl( |
|
viettrungluu
2014/10/15 20:15:50
You may as well initialize this in the initializer
msw
2014/10/16 00:34:09
I'm not sure that's easily possible. ApplicationIm
|
| + &example_client_application, |
| + g_shell_scoped_message_pipe_handle_hack.Pass()); |
| + // Fake the application initialize call with actual command line arguments. |
| + application_impl_->Initialize(g_args_hack.Clone()); |
|
viettrungluu
2014/10/15 20:15:50
Arguably, since this is nontrivial work, this shou
msw
2014/10/16 00:34:09
Done.
|
| + application_impl_->ConnectToService("mojo:mojo_example_service", |
|
viettrungluu
2014/10/15 20:15:50
(And this wouldn't be in the base class, of course
msw
2014/10/16 00:34:09
Acknowledged.
|
| + &example_service_); |
| example_service_.set_client(&example_client_); |
| } |
| - virtual ~ExampleApptest() override {} |
| + virtual ~ExampleApptest() override { |
| + g_shell_scoped_message_pipe_handle_hack = application_impl_->UnbindShell(); |
| + delete application_impl_; |
| + } |
| protected: |
| ExampleServicePtr example_service_; |
| ExampleClientImpl example_client_; |
| private: |
| + mojo::RunLoop loop_; |
| + mojo::ExampleClientApplication example_client_application; |
| + mojo::ApplicationImpl* application_impl_; |
| + |
| MOJO_DISALLOW_COPY_AND_ASSIGN(ExampleApptest); |
| }; |
| @@ -86,29 +103,29 @@ TEST_F(ExampleApptest, RunCallbackViaService) { |
| MojoResult MojoMain(MojoHandle shell_handle) { |
| mojo::Environment env; |
| - // TODO(msw): Destroy this ambient RunLoop before running tests. |
| - // Need to CancelWait() / PassMessagePipe() from the ShellPtr? |
| - mojo::RunLoop loop; |
| - mojo::ApplicationDelegate* delegate = new mojo::ExampleClientApplication(); |
| - mojo::ApplicationImpl app(delegate, shell_handle); |
| - g_application_impl_hack = &app; |
| - MOJO_CHECK(app.WaitForInitialize()); |
| { |
| + // This RunLoop is used for init, and then destroyed before running tests. |
| + mojo::RunLoop loop; |
| + |
| + // Construct an ApplicationImpl just for the GTEST commandline arguments. |
| + mojo::ApplicationDelegate dummy_application_delegate; |
| + mojo::ApplicationImpl app(&dummy_application_delegate, shell_handle); |
| + MOJO_CHECK(app.WaitForInitialize()); |
| + |
| // InitGoogleTest expects (argc + 1) elements, including a terminating NULL. |
| // It also removes GTEST arguments from |argv| and updates the |argc| count. |
| - const mojo::Array<mojo::String>& args = app.args(); |
| - MOJO_CHECK(args.size() < INT_MAX); |
| - int argc = static_cast<int>(args.size()); |
| + g_args_hack = app.args().Clone(); |
| + MOJO_CHECK(g_args_hack.size() < INT_MAX); |
| + int argc = static_cast<int>(g_args_hack.size()); |
| std::vector<char*> argv(argc + 1); |
| for (int i = 0; i < argc; ++i) |
| - argv[i] = const_cast<char*>(args[i].data()); |
| + argv[i] = const_cast<char*>(g_args_hack[i].data()); |
| argv[argc] = NULL; |
| testing::InitGoogleTest(&argc, &argv[0]); |
| + g_shell_scoped_message_pipe_handle_hack = app.UnbindShell(); |
| } |
| mojo_ignore_result(RUN_ALL_TESTS()); |
| - |
| - delete delegate; |
| return MOJO_RESULT_OK; |
| } |