// 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. #include "mojo/shell/shell_test_base.h" #include "base/bind.h" #include "base/macros.h" #include "base/message_loop/message_loop.h" #include "mojo/public/cpp/bindings/error_handler.h" #include "mojo/public/cpp/bindings/interface_ptr.h" #include "mojo/public/cpp/system/core.h" #include "mojo/services/test_service/test_service.mojom.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" namespace mojo { namespace shell { namespace test { namespace { typedef ShellTestBase ShellTestBaseTest; class QuitMessageLoopErrorHandler : public ErrorHandler { public: QuitMessageLoopErrorHandler() {} virtual ~QuitMessageLoopErrorHandler() {} // |ErrorHandler| implementation: virtual void OnConnectionError() OVERRIDE { base::MessageLoop::current()->QuitWhenIdle(); } private: DISALLOW_COPY_AND_ASSIGN(QuitMessageLoopErrorHandler); }; void PingCallback(base::MessageLoop* message_loop, bool* was_run) { *was_run = true; VLOG(2) << "Ping callback"; message_loop->QuitWhenIdle(); } TEST_F(ShellTestBaseTest, LaunchServiceInProcess) { InitMojo(); InterfacePtr test_service; { MessagePipe mp; test_service.Bind(mp.handle0.Pass()); LaunchServiceInProcess(GURL("mojo:mojo_test_service"), mojo::test::ITestService::Name_, mp.handle1.Pass()); } bool was_run = false; test_service->Ping(base::Bind(&PingCallback, base::Unretained(message_loop()), base::Unretained(&was_run))); message_loop()->Run(); EXPECT_TRUE(was_run); EXPECT_FALSE(test_service.encountered_error()); test_service.reset(); // This will run until the test service has actually quit (which it will, // since we killed the only connection to it). message_loop()->Run(); } // Tests that launching a service in process fails properly if the service // doesn't exist. TEST_F(ShellTestBaseTest, LaunchServiceInProcessInvalidService) { InitMojo(); InterfacePtr test_service; { MessagePipe mp; test_service.Bind(mp.handle0.Pass()); LaunchServiceInProcess(GURL("mojo:non_existent_service"), mojo::test::ITestService::Name_, mp.handle1.Pass()); } bool was_run = false; test_service->Ping(base::Bind(&PingCallback, base::Unretained(message_loop()), base::Unretained(&was_run))); // This will quit because there's nothing running. message_loop()->Run(); EXPECT_FALSE(was_run); // It may have quit before an error was processed. if (!test_service.encountered_error()) { QuitMessageLoopErrorHandler quitter; test_service.set_error_handler(&quitter); message_loop()->Run(); EXPECT_TRUE(test_service.encountered_error()); } test_service.reset(); } } // namespace } // namespace test } // namespace shell } // namespace mojo