• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "mojo/shell/shell_test_base.h"
6 
7 #include "base/bind.h"
8 #include "base/macros.h"
9 #include "base/message_loop/message_loop.h"
10 #include "mojo/public/cpp/bindings/error_handler.h"
11 #include "mojo/public/cpp/bindings/interface_ptr.h"
12 #include "mojo/public/cpp/system/core.h"
13 #include "mojo/services/test_service/test_service.mojom.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "url/gurl.h"
16 
17 namespace mojo {
18 namespace shell {
19 namespace test {
20 namespace {
21 
22 typedef ShellTestBase ShellTestBaseTest;
23 
24 class QuitMessageLoopErrorHandler : public ErrorHandler {
25  public:
QuitMessageLoopErrorHandler()26   QuitMessageLoopErrorHandler() {}
~QuitMessageLoopErrorHandler()27   virtual ~QuitMessageLoopErrorHandler() {}
28 
29   // |ErrorHandler| implementation:
OnConnectionError()30   virtual void OnConnectionError() OVERRIDE {
31     base::MessageLoop::current()->QuitWhenIdle();
32   }
33 
34  private:
35   DISALLOW_COPY_AND_ASSIGN(QuitMessageLoopErrorHandler);
36 };
37 
PingCallback(base::MessageLoop * message_loop,bool * was_run)38 void PingCallback(base::MessageLoop* message_loop, bool* was_run) {
39   *was_run = true;
40   VLOG(2) << "Ping callback";
41   message_loop->QuitWhenIdle();
42 }
43 
TEST_F(ShellTestBaseTest,LaunchServiceInProcess)44 TEST_F(ShellTestBaseTest, LaunchServiceInProcess) {
45   InitMojo();
46 
47   InterfacePtr<mojo::test::ITestService> test_service;
48 
49   {
50     MessagePipe mp;
51     test_service.Bind(mp.handle0.Pass());
52     LaunchServiceInProcess(GURL("mojo:mojo_test_service"),
53                            mojo::test::ITestService::Name_,
54                            mp.handle1.Pass());
55   }
56 
57   bool was_run = false;
58   test_service->Ping(base::Bind(&PingCallback,
59                                 base::Unretained(message_loop()),
60                                 base::Unretained(&was_run)));
61   message_loop()->Run();
62   EXPECT_TRUE(was_run);
63   EXPECT_FALSE(test_service.encountered_error());
64 
65   test_service.reset();
66 
67   // This will run until the test service has actually quit (which it will,
68   // since we killed the only connection to it).
69   message_loop()->Run();
70 }
71 
72 // Tests that launching a service in process fails properly if the service
73 // doesn't exist.
TEST_F(ShellTestBaseTest,LaunchServiceInProcessInvalidService)74 TEST_F(ShellTestBaseTest, LaunchServiceInProcessInvalidService) {
75   InitMojo();
76 
77   InterfacePtr<mojo::test::ITestService> test_service;
78 
79   {
80     MessagePipe mp;
81     test_service.Bind(mp.handle0.Pass());
82     LaunchServiceInProcess(GURL("mojo:non_existent_service"),
83                            mojo::test::ITestService::Name_,
84                            mp.handle1.Pass());
85   }
86 
87   bool was_run = false;
88   test_service->Ping(base::Bind(&PingCallback,
89                                 base::Unretained(message_loop()),
90                                 base::Unretained(&was_run)));
91 
92   // This will quit because there's nothing running.
93   message_loop()->Run();
94   EXPECT_FALSE(was_run);
95 
96   // It may have quit before an error was processed.
97   if (!test_service.encountered_error()) {
98     QuitMessageLoopErrorHandler quitter;
99     test_service.set_error_handler(&quitter);
100     message_loop()->Run();
101     EXPECT_TRUE(test_service.encountered_error());
102   }
103 
104   test_service.reset();
105 }
106 
107 }  // namespace
108 }  // namespace test
109 }  // namespace shell
110 }  // namespace mojo
111