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