1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/shell/shell_test_base.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/bind.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/i18n/time_formatting.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/macros.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/message_loop/message_loop.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/error_handler.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/interface_ptr.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/system/core.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/test_service/test_request_tracker.mojom.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/test_service/test_service.mojom.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "url/gurl.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing mojo::test::ServiceReport;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing mojo::test::ServiceReportPtr;
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing mojo::test::TestService;
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing mojo::test::TestTimeService;
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing mojo::test::TestServicePtr;
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing mojo::test::TestTimeServicePtr;
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing mojo::test::TestTrackedRequestService;
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing mojo::test::TestTrackedRequestServicePtr;
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace mojo {
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace shell {
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace test {
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace {
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GetReportCallback(base::MessageLoop* loop,
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       std::vector<ServiceReport>* reports_out,
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                       mojo::Array<ServiceReportPtr> report) {
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (size_t i = 0; i < report.size(); i++)
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    reports_out->push_back(*report[i]);
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  loop->QuitWhenIdle();
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ShellTestBaseTest : public ShellTestBase {
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Convenience helpers for use as callbacks in tests.
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template <typename T>
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::Callback<void()> SetAndQuit(T* val, T result) {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return base::Bind(&ShellTestBaseTest::SetAndQuitImpl<T>,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Unretained(this), val, result);
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template <typename T>
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::Callback<void(T result)> SetAndQuit(T* val) {
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return base::Bind(&ShellTestBaseTest::SetAndQuitImpl<T>,
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          base::Unretained(this), val);
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static GURL test_app_url() {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return GURL("mojo:mojo_test_app");
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void GetReport(std::vector<ServiceReport>* report) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ConnectToService(GURL("mojo:mojo_test_request_tracker_app"),
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     &request_tracking_);
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    request_tracking_->GetReport(base::Bind(&GetReportCallback,
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Unretained(message_loop()),
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Unretained(report)));
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    message_loop()->Run();
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template<typename T>
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetAndQuitImpl(T* val, T result) {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *val = result;
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    message_loop()->QuitWhenIdle();
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestTrackedRequestServicePtr request_tracking_;
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class QuitMessageLoopErrorHandler : public ErrorHandler {
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public:
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  QuitMessageLoopErrorHandler() {}
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~QuitMessageLoopErrorHandler() {}
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |ErrorHandler| implementation:
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnConnectionError() OVERRIDE {
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::MessageLoop::current()->QuitWhenIdle();
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private:
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuitMessageLoopErrorHandler);
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that we can connect to a single service within a single app.
92116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ShellTestBaseTest, ConnectBasic) {
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InterfacePtr<TestService> service;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(test_app_url(), &service);
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool was_run = false;
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->Ping(SetAndQuit<bool>(&was_run, true));
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  message_loop()->Run();
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(was_run);
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service.encountered_error());
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service.reset();
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // This will run until the test app has actually quit (which it will,
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // since we killed the only connection to it).
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  message_loop()->Run();
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that trying to connect to a service fails properly if the service
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// doesn't exist. Implicit in this test is verification that the shell
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// terminates if no services are running.
112116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ShellTestBaseTest, ConnectInvalidService) {
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  InterfacePtr<TestService> test_service;
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(GURL("mojo:non_existent_service"), &test_service);
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool was_run = false;
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  test_service->Ping(SetAndQuit<bool>(&was_run, true));
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This will quit because there's nothing running.
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  message_loop()->Run();
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(was_run);
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // It may have quit before an error was processed.
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!test_service.encountered_error()) {
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    QuitMessageLoopErrorHandler quitter;
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    test_service.set_error_handler(&quitter);
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    message_loop()->Run();
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(test_service.encountered_error());
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  test_service.reset();
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Tests that we can connect to a single service within a single app using
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// a network based loader instead of local files.
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(tim): Disabled because network service leaks NSS at exit, meaning
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// subsequent tests can't init properly.
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ShellTestBaseTest, DISABLED_ConnectBasicNetwork) {
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InterfacePtr<TestService> service;
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(test_app_url(), &service);
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool was_run = false;
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  service->Ping(SetAndQuit<bool>(&was_run, true));
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  message_loop()->Run();
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(was_run);
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(service.encountered_error());
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Note that use of the network service is implicit in this test.
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Since TestService is not the only service in use, the shell won't auto
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // magically exit when TestService is destroyed (unlike ConnectBasic).
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Tearing down the shell context will kill connections. The shell loop will
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // exit as soon as no more apps are connected.
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(tim): crbug.com/392685.  Calling this explicitly shouldn't be
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // necessary once the shell terminates if the primordial app exits, which
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // we could enforce here by resetting |service|.
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  shell_context()->application_manager()->TerminateShellConnections();
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  message_loop()->Run();  // Waits for all connections to die.
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Tests that trying to connect to a service over network fails preoprly
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// if the service doesn't exist.
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(tim): Disabled because network service leaks NSS at exit, meaning
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// subsequent tests can't init properly.
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ShellTestBaseTest, DISABLED_ConnectInvalidServiceNetwork) {
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  InterfacePtr<TestService> test_service;
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToServiceViaNetwork(GURL("mojo:non_existent_service"), &test_service);
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  QuitMessageLoopErrorHandler quitter;
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test_service.set_error_handler(&quitter);
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool was_run = false;
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  test_service->Ping(SetAndQuit<bool>(&was_run, true));
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  message_loop()->Run();
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(test_service.encountered_error());
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // TODO(tim): crbug.com/392685.  Calling this explicitly shouldn't be
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // necessary once the shell terminates if the primordial app exits, which
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // we could enforce here by resetting |service|.
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  shell_context()->application_manager()->TerminateShellConnections();
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  message_loop()->Run();  // Waits for all connections to die.
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Similar to ConnectBasic, but causes the app to instantiate multiple
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// service implementation objects and verifies the shell can reach both.
183116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ShellTestBaseTest, ConnectMultipleInstancesPerApp) {
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    TestServicePtr service1, service2;
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ConnectToService(test_app_url(), &service1);
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ConnectToService(test_app_url(), &service2);
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool was_run1 = false;
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool was_run2 = false;
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service1->Ping(SetAndQuit<bool>(&was_run1, true));
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    message_loop()->Run();
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service2->Ping(SetAndQuit<bool>(&was_run2, true));
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    message_loop()->Run();
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(was_run1);
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(was_run2);
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_FALSE(service1.encountered_error());
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_FALSE(service2.encountered_error());
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that service A and service B, both in App 1, can talk to each other
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// and parameters are passed around properly.
205116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ShellTestBaseTest, ConnectDifferentServicesInSingleApp) {
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Have a TestService GetPartyTime on a TestTimeService in the same app.
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 time_message;
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestServicePtr service;
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(test_app_url(), &service);
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->ConnectToAppAndGetTime(test_app_url().spec(),
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  SetAndQuit<int64>(&time_message));
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify by hitting the TimeService directly.
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestTimeServicePtr time_service;
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(test_app_url(), &time_service);
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 party_time;
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  time_service->GetPartyTime(SetAndQuit<int64>(&party_time));
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(time_message, party_time);
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that a service A in App 1 can talk to service B in App 2 and
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// parameters are passed around properly.
226116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ShellTestBaseTest, ConnectDifferentServicesInDifferentApps) {
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 time_message;
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestServicePtr service;
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(test_app_url(), &service);
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->ConnectToAppAndGetTime("mojo:mojo_test_request_tracker_app",
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  SetAndQuit<int64>(&time_message));
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Verify by hitting the TimeService in the request tracker app directly.
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestTimeServicePtr time_service;
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(GURL("mojo:mojo_test_request_tracker_app"), &time_service);
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 party_time;
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  time_service->GetPartyTime(SetAndQuit<int64>(&party_time));
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(time_message, party_time);
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that service A in App 1 can be a client of service B in App 2.
245116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ShellTestBaseTest, ConnectServiceAsClientOfSeparateApp) {
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestServicePtr service;
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(test_app_url(), &service);
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->StartTrackingRequests(message_loop()->QuitWhenIdleClosure());
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->Ping(mojo::Callback<void()>());
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < 8; i++)
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service->Ping(mojo::Callback<void()>());
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->Ping(message_loop()->QuitWhenIdleClosure());
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If everything worked properly, the tracking service should report
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // 10 pings to TestService.
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<ServiceReport> reports;
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetReport(&reports);
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1U, reports.size());
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(TestService::Name_, reports[0].service_name);
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(10U, reports[0].total_requests);
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Connect several services together and use the tracking service to verify
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// communication.
268116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ShellTestBaseTest, ConnectManyClientsAndServices) {
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestServicePtr service;
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestTimeServicePtr time_service;
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Make a request to the TestService and have it contact TimeService in the
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // tracking app. Do all this with tracking enabled, meaning both services
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // are connected as clients of the TrackedRequestService.
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(test_app_url(), &service);
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->StartTrackingRequests(message_loop()->QuitWhenIdleClosure());
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < 5; i++)
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service->Ping(mojo::Callback<void()>());
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 time_result;
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->ConnectToAppAndGetTime("mojo:mojo_test_request_tracker_app",
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  SetAndQuit<int64>(&time_result));
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Also make a few requests to the TimeService in the test_app.
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ConnectToService(test_app_url(), &time_service);
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  time_service->StartTrackingRequests(message_loop()->QuitWhenIdleClosure());
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  time_service->GetPartyTime(mojo::Callback<void(uint64_t)>());
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (int i = 0; i < 18; i++)
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    time_service->GetPartyTime(mojo::Callback<void(uint64_t)>());
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Flush the tasks with one more to quit.
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 party_time = 0;
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  time_service->GetPartyTime(SetAndQuit<int64>(&party_time));
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  message_loop()->Run();
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<ServiceReport> reports;
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetReport(&reports);
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(3U, reports.size());
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(TestService::Name_, reports[0].service_name);
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(6U, reports[0].total_requests);
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(TestTimeService::Name_, reports[1].service_name);
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1U, reports[1].total_requests);
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(TestTimeService::Name_, reports[2].service_name);
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(20U, reports[2].total_requests);
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace
309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace test
310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace shell
311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace mojo
312