Index: mojo/application_manager/application_manager_unittest.cc |
diff --git a/mojo/application_manager/application_manager_unittest.cc b/mojo/application_manager/application_manager_unittest.cc |
deleted file mode 100644 |
index c3b7d4854f173975f32bd32506f115fcf183f2eb..0000000000000000000000000000000000000000 |
--- a/mojo/application_manager/application_manager_unittest.cc |
+++ /dev/null |
@@ -1,673 +0,0 @@ |
-// 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 "base/at_exit.h" |
-#include "base/bind.h" |
-#include "base/macros.h" |
-#include "base/memory/scoped_vector.h" |
-#include "base/message_loop/message_loop.h" |
-#include "mojo/application_manager/application_loader.h" |
-#include "mojo/application_manager/application_manager.h" |
-#include "mojo/application_manager/test.mojom.h" |
-#include "mojo/public/cpp/application/application_connection.h" |
-#include "mojo/public/cpp/application/application_delegate.h" |
-#include "mojo/public/cpp/application/application_impl.h" |
-#include "mojo/public/cpp/application/interface_factory.h" |
-#include "mojo/public/interfaces/application/service_provider.mojom.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace mojo { |
-namespace { |
- |
-const char kTestURLString[] = "test:testService"; |
-const char kTestAURLString[] = "test:TestA"; |
-const char kTestBURLString[] = "test:TestB"; |
- |
-struct TestContext { |
- TestContext() : num_impls(0), num_loader_deletes(0) {} |
- std::string last_test_string; |
- int num_impls; |
- int num_loader_deletes; |
-}; |
- |
-class QuitMessageLoopErrorHandler : public ErrorHandler { |
- public: |
- QuitMessageLoopErrorHandler() {} |
- ~QuitMessageLoopErrorHandler() override {} |
- |
- // |ErrorHandler| implementation: |
- void OnConnectionError() override { |
- base::MessageLoop::current()->QuitWhenIdle(); |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(QuitMessageLoopErrorHandler); |
-}; |
- |
-class TestServiceImpl : public InterfaceImpl<TestService> { |
- public: |
- explicit TestServiceImpl(TestContext* context) : context_(context) { |
- ++context_->num_impls; |
- } |
- |
- ~TestServiceImpl() override { --context_->num_impls; } |
- |
- void OnConnectionError() override { |
- if (!base::MessageLoop::current()->is_running()) |
- return; |
- base::MessageLoop::current()->Quit(); |
- InterfaceImpl::OnConnectionError(); |
- } |
- |
- // TestService implementation: |
- void Test(const String& test_string) override { |
- context_->last_test_string = test_string; |
- client()->AckTest(); |
- } |
- |
- private: |
- TestContext* context_; |
-}; |
- |
-class TestClientImpl : public TestClient { |
- public: |
- explicit TestClientImpl(TestServicePtr service) |
- : service_(service.Pass()), quit_after_ack_(false) { |
- service_.set_client(this); |
- } |
- |
- ~TestClientImpl() override { service_.reset(); } |
- |
- void AckTest() override { |
- if (quit_after_ack_) |
- base::MessageLoop::current()->Quit(); |
- } |
- |
- void Test(const std::string& test_string) { |
- quit_after_ack_ = true; |
- service_->Test(test_string); |
- } |
- |
- private: |
- TestServicePtr service_; |
- bool quit_after_ack_; |
- DISALLOW_COPY_AND_ASSIGN(TestClientImpl); |
-}; |
- |
-class TestApplicationLoader : public ApplicationLoader, |
- public ApplicationDelegate, |
- public InterfaceFactory<TestService> { |
- public: |
- TestApplicationLoader() : context_(NULL), num_loads_(0) {} |
- |
- ~TestApplicationLoader() override { |
- if (context_) |
- ++context_->num_loader_deletes; |
- test_app_.reset(NULL); |
- } |
- |
- void set_context(TestContext* context) { context_ = context; } |
- int num_loads() const { return num_loads_; } |
- const std::vector<std::string>& GetArgs() const { return test_app_->args(); } |
- |
- private: |
- // ApplicationLoader implementation. |
- void Load(ApplicationManager* manager, |
- const GURL& url, |
- ScopedMessagePipeHandle shell_handle, |
- LoadCallback callback) override { |
- ++num_loads_; |
- test_app_.reset(new ApplicationImpl(this, shell_handle.Pass())); |
- } |
- |
- void OnApplicationError(ApplicationManager* manager, |
- const GURL& url) override {} |
- |
- // ApplicationDelegate implementation. |
- bool ConfigureIncomingConnection(ApplicationConnection* connection) override { |
- connection->AddService(this); |
- return true; |
- } |
- |
- // InterfaceFactory implementation. |
- void Create(ApplicationConnection* connection, |
- InterfaceRequest<TestService> request) override { |
- BindToRequest(new TestServiceImpl(context_), &request); |
- } |
- |
- scoped_ptr<ApplicationImpl> test_app_; |
- TestContext* context_; |
- int num_loads_; |
- DISALLOW_COPY_AND_ASSIGN(TestApplicationLoader); |
-}; |
- |
-class TesterContext { |
- public: |
- explicit TesterContext(base::MessageLoop* loop) |
- : num_b_calls_(0), |
- num_c_calls_(0), |
- num_a_deletes_(0), |
- num_b_deletes_(0), |
- num_c_deletes_(0), |
- tester_called_quit_(false), |
- a_called_quit_(false), |
- loop_(loop) {} |
- |
- void IncrementNumBCalls() { |
- base::AutoLock lock(lock_); |
- num_b_calls_++; |
- } |
- |
- void IncrementNumCCalls() { |
- base::AutoLock lock(lock_); |
- num_c_calls_++; |
- } |
- |
- void IncrementNumADeletes() { |
- base::AutoLock lock(lock_); |
- num_a_deletes_++; |
- } |
- |
- void IncrementNumBDeletes() { |
- base::AutoLock lock(lock_); |
- num_b_deletes_++; |
- } |
- |
- void IncrementNumCDeletes() { |
- base::AutoLock lock(lock_); |
- num_c_deletes_++; |
- } |
- |
- void set_tester_called_quit() { |
- base::AutoLock lock(lock_); |
- tester_called_quit_ = true; |
- } |
- |
- void set_a_called_quit() { |
- base::AutoLock lock(lock_); |
- a_called_quit_ = true; |
- } |
- |
- int num_b_calls() { |
- base::AutoLock lock(lock_); |
- return num_b_calls_; |
- } |
- int num_c_calls() { |
- base::AutoLock lock(lock_); |
- return num_c_calls_; |
- } |
- int num_a_deletes() { |
- base::AutoLock lock(lock_); |
- return num_a_deletes_; |
- } |
- int num_b_deletes() { |
- base::AutoLock lock(lock_); |
- return num_b_deletes_; |
- } |
- int num_c_deletes() { |
- base::AutoLock lock(lock_); |
- return num_c_deletes_; |
- } |
- bool tester_called_quit() { |
- base::AutoLock lock(lock_); |
- return tester_called_quit_; |
- } |
- bool a_called_quit() { |
- base::AutoLock lock(lock_); |
- return a_called_quit_; |
- } |
- |
- void QuitSoon() { |
- loop_->PostTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); |
- } |
- |
- private: |
- // lock_ protects all members except for loop_ which must be unchanged for the |
- // lifetime of this class. |
- base::Lock lock_; |
- int num_b_calls_; |
- int num_c_calls_; |
- int num_a_deletes_; |
- int num_b_deletes_; |
- int num_c_deletes_; |
- bool tester_called_quit_; |
- bool a_called_quit_; |
- |
- base::MessageLoop* loop_; |
-}; |
- |
-// Used to test that the requestor url will be correctly passed. |
-class TestAImpl : public TestA { |
- public: |
- TestAImpl(ApplicationConnection* connection, |
- TesterContext* test_context, |
- InterfaceRequest<TestA> request) |
- : test_context_(test_context), |
- binding_(this, request.Pass()) { |
- connection->ConnectToApplication(kTestBURLString)->ConnectToService(&b_); |
- } |
- ~TestAImpl() override { |
- test_context_->IncrementNumADeletes(); |
- if (base::MessageLoop::current()->is_running()) |
- Quit(); |
- } |
- |
- private: |
- void CallB() override { |
- b_->B(base::Bind(&TestAImpl::Quit, base::Unretained(this))); |
- } |
- |
- void CallCFromB() override { |
- b_->CallC(base::Bind(&TestAImpl::Quit, base::Unretained(this))); |
- } |
- |
- void Quit() { |
- base::MessageLoop::current()->Quit(); |
- test_context_->set_a_called_quit(); |
- test_context_->QuitSoon(); |
- } |
- |
- TesterContext* test_context_; |
- TestBPtr b_; |
- Binding<TestA> binding_; |
-}; |
- |
-class TestBImpl : public InterfaceImpl<TestB> { |
- public: |
- TestBImpl(ApplicationConnection* connection, TesterContext* test_context) |
- : test_context_(test_context) { |
- connection->ConnectToService(&c_); |
- } |
- |
- ~TestBImpl() override { |
- test_context_->IncrementNumBDeletes(); |
- if (base::MessageLoop::current()->is_running()) |
- base::MessageLoop::current()->Quit(); |
- test_context_->QuitSoon(); |
- } |
- |
- private: |
- void B(const mojo::Callback<void()>& callback) override { |
- test_context_->IncrementNumBCalls(); |
- callback.Run(); |
- } |
- |
- void CallC(const mojo::Callback<void()>& callback) override { |
- test_context_->IncrementNumBCalls(); |
- c_->C(callback); |
- } |
- |
- TesterContext* test_context_; |
- TestCPtr c_; |
-}; |
- |
-class TestCImpl : public InterfaceImpl<TestC> { |
- public: |
- TestCImpl(ApplicationConnection* connection, TesterContext* test_context) |
- : test_context_(test_context) {} |
- |
- ~TestCImpl() override { test_context_->IncrementNumCDeletes(); } |
- |
- private: |
- void C(const mojo::Callback<void()>& callback) override { |
- test_context_->IncrementNumCCalls(); |
- callback.Run(); |
- } |
- TesterContext* test_context_; |
-}; |
- |
-class Tester : public ApplicationDelegate, |
- public ApplicationLoader, |
- public InterfaceFactory<TestA>, |
- public InterfaceFactory<TestB>, |
- public InterfaceFactory<TestC> { |
- public: |
- Tester(TesterContext* context, const std::string& requestor_url) |
- : context_(context), requestor_url_(requestor_url) {} |
- ~Tester() override {} |
- |
- private: |
- void Load(ApplicationManager* manager, |
- const GURL& url, |
- ScopedMessagePipeHandle shell_handle, |
- LoadCallback callback) override { |
- app_.reset(new ApplicationImpl(this, shell_handle.Pass())); |
- } |
- |
- void OnApplicationError(ApplicationManager* manager, |
- const GURL& url) override {} |
- |
- bool ConfigureIncomingConnection(ApplicationConnection* connection) override { |
- if (!requestor_url_.empty() && |
- requestor_url_ != connection->GetRemoteApplicationURL()) { |
- context_->set_tester_called_quit(); |
- context_->QuitSoon(); |
- base::MessageLoop::current()->Quit(); |
- return false; |
- } |
- // If we're coming from A, then add B, otherwise A. |
- if (connection->GetRemoteApplicationURL() == kTestAURLString) |
- connection->AddService<TestB>(this); |
- else |
- connection->AddService<TestA>(this); |
- return true; |
- } |
- |
- bool ConfigureOutgoingConnection(ApplicationConnection* connection) override { |
- // If we're connecting to B, then add C. |
- if (connection->GetRemoteApplicationURL() == kTestBURLString) |
- connection->AddService<TestC>(this); |
- return true; |
- } |
- |
- void Create(ApplicationConnection* connection, |
- InterfaceRequest<TestA> request) override { |
- a_bindings_.push_back(new TestAImpl(connection, context_, request.Pass())); |
- } |
- |
- void Create(ApplicationConnection* connection, |
- InterfaceRequest<TestB> request) override { |
- BindToRequest(new TestBImpl(connection, context_), &request); |
- } |
- |
- void Create(ApplicationConnection* connection, |
- InterfaceRequest<TestC> request) override { |
- BindToRequest(new TestCImpl(connection, context_), &request); |
- } |
- |
- TesterContext* context_; |
- scoped_ptr<ApplicationImpl> app_; |
- std::string requestor_url_; |
- ScopedVector<TestAImpl> a_bindings_; |
-}; |
- |
-class TestDelegate : public ApplicationManager::Delegate { |
- public: |
- void AddMapping(const GURL& from, const GURL& to) { |
- mappings_[from] = to; |
- } |
- |
- // ApplicationManager::Delegate |
- virtual GURL ResolveURL(const GURL& url) override { |
- auto it = mappings_.find(url); |
- if (it != mappings_.end()) |
- return it->second; |
- return url; |
- } |
- |
- virtual void OnApplicationError(const GURL& url) override { |
- } |
- |
- private: |
- std::map<GURL, GURL> mappings_; |
-}; |
- |
-} // namespace |
- |
-class ApplicationManagerTest : public testing::Test { |
- public: |
- ApplicationManagerTest() : tester_context_(&loop_) {} |
- |
- ~ApplicationManagerTest() override {} |
- |
- void SetUp() override { |
- application_manager_.reset(new ApplicationManager(&test_delegate_)); |
- test_loader_ = new TestApplicationLoader; |
- test_loader_->set_context(&context_); |
- application_manager_->set_default_loader( |
- scoped_ptr<ApplicationLoader>(test_loader_)); |
- |
- TestServicePtr service_proxy; |
- application_manager_->ConnectToService(GURL(kTestURLString), |
- &service_proxy); |
- test_client_.reset(new TestClientImpl(service_proxy.Pass())); |
- } |
- |
- void TearDown() override { |
- test_client_.reset(NULL); |
- application_manager_.reset(NULL); |
- } |
- |
- void AddLoaderForURL(const GURL& url, const std::string& requestor_url) { |
- application_manager_->SetLoaderForURL( |
- make_scoped_ptr(new Tester(&tester_context_, requestor_url)), url); |
- } |
- |
- bool HasFactoryForTestURL() { |
- ApplicationManager::TestAPI manager_test_api(application_manager_.get()); |
- return manager_test_api.HasFactoryForURL(GURL(kTestURLString)); |
- } |
- |
- protected: |
- base::ShadowingAtExitManager at_exit_; |
- TestDelegate test_delegate_; |
- TestApplicationLoader* test_loader_; |
- TesterContext tester_context_; |
- TestContext context_; |
- base::MessageLoop loop_; |
- scoped_ptr<TestClientImpl> test_client_; |
- scoped_ptr<ApplicationManager> application_manager_; |
- DISALLOW_COPY_AND_ASSIGN(ApplicationManagerTest); |
-}; |
- |
-TEST_F(ApplicationManagerTest, Basic) { |
- test_client_->Test("test"); |
- loop_.Run(); |
- EXPECT_EQ(std::string("test"), context_.last_test_string); |
-} |
- |
-// Confirm that no arguments are sent to an application by default. |
-TEST_F(ApplicationManagerTest, NoArgs) { |
- ApplicationManager am(&test_delegate_); |
- GURL test_url("test:test"); |
- TestApplicationLoader* loader = new TestApplicationLoader; |
- loader->set_context(&context_); |
- am.SetLoaderForURL(scoped_ptr<ApplicationLoader>(loader), test_url); |
- TestServicePtr test_service; |
- am.ConnectToService(test_url, &test_service); |
- TestClientImpl test_client(test_service.Pass()); |
- test_client.Test("test"); |
- loop_.Run(); |
- std::vector<std::string> app_args = loader->GetArgs(); |
- EXPECT_EQ(0U, app_args.size()); |
-} |
- |
-// Confirm that arguments are sent to an application. |
-TEST_F(ApplicationManagerTest, Args) { |
- ApplicationManager am(&test_delegate_); |
- GURL test_url("test:test"); |
- std::vector<std::string> args; |
- args.push_back("test_arg1"); |
- args.push_back("test_arg2"); |
- am.SetArgsForURL(args, test_url); |
- TestApplicationLoader* loader = new TestApplicationLoader; |
- loader->set_context(&context_); |
- am.SetLoaderForURL(scoped_ptr<ApplicationLoader>(loader), test_url); |
- TestServicePtr test_service; |
- am.ConnectToService(test_url, &test_service); |
- TestClientImpl test_client(test_service.Pass()); |
- test_client.Test("test"); |
- loop_.Run(); |
- std::vector<std::string> app_args = loader->GetArgs(); |
- ASSERT_EQ(args.size(), app_args.size()); |
- EXPECT_EQ(args[0], app_args[0]); |
- EXPECT_EQ(args[1], app_args[1]); |
-} |
- |
-TEST_F(ApplicationManagerTest, ClientError) { |
- test_client_->Test("test"); |
- EXPECT_TRUE(HasFactoryForTestURL()); |
- loop_.Run(); |
- EXPECT_EQ(1, context_.num_impls); |
- test_client_.reset(NULL); |
- loop_.Run(); |
- EXPECT_EQ(0, context_.num_impls); |
- EXPECT_TRUE(HasFactoryForTestURL()); |
-} |
- |
-TEST_F(ApplicationManagerTest, Deletes) { |
- { |
- ApplicationManager am(&test_delegate_); |
- TestApplicationLoader* default_loader = new TestApplicationLoader; |
- default_loader->set_context(&context_); |
- TestApplicationLoader* url_loader1 = new TestApplicationLoader; |
- TestApplicationLoader* url_loader2 = new TestApplicationLoader; |
- url_loader1->set_context(&context_); |
- url_loader2->set_context(&context_); |
- TestApplicationLoader* scheme_loader1 = new TestApplicationLoader; |
- TestApplicationLoader* scheme_loader2 = new TestApplicationLoader; |
- scheme_loader1->set_context(&context_); |
- scheme_loader2->set_context(&context_); |
- am.set_default_loader(scoped_ptr<ApplicationLoader>(default_loader)); |
- am.SetLoaderForURL(scoped_ptr<ApplicationLoader>(url_loader1), |
- GURL("test:test1")); |
- am.SetLoaderForURL(scoped_ptr<ApplicationLoader>(url_loader2), |
- GURL("test:test1")); |
- am.SetLoaderForScheme(scoped_ptr<ApplicationLoader>(scheme_loader1), |
- "test"); |
- am.SetLoaderForScheme(scoped_ptr<ApplicationLoader>(scheme_loader2), |
- "test"); |
- } |
- EXPECT_EQ(5, context_.num_loader_deletes); |
-} |
- |
-// Confirm that both urls and schemes can have their loaders explicitly set. |
-TEST_F(ApplicationManagerTest, SetLoaders) { |
- TestApplicationLoader* default_loader = new TestApplicationLoader; |
- TestApplicationLoader* url_loader = new TestApplicationLoader; |
- TestApplicationLoader* scheme_loader = new TestApplicationLoader; |
- application_manager_->set_default_loader( |
- scoped_ptr<ApplicationLoader>(default_loader)); |
- application_manager_->SetLoaderForURL( |
- scoped_ptr<ApplicationLoader>(url_loader), GURL("test:test1")); |
- application_manager_->SetLoaderForScheme( |
- scoped_ptr<ApplicationLoader>(scheme_loader), "test"); |
- |
- // test::test1 should go to url_loader. |
- TestServicePtr test_service; |
- application_manager_->ConnectToService(GURL("test:test1"), &test_service); |
- EXPECT_EQ(1, url_loader->num_loads()); |
- EXPECT_EQ(0, scheme_loader->num_loads()); |
- EXPECT_EQ(0, default_loader->num_loads()); |
- |
- // test::test2 should go to scheme loader. |
- application_manager_->ConnectToService(GURL("test:test2"), &test_service); |
- EXPECT_EQ(1, url_loader->num_loads()); |
- EXPECT_EQ(1, scheme_loader->num_loads()); |
- EXPECT_EQ(0, default_loader->num_loads()); |
- |
- // http::test1 should go to default loader. |
- application_manager_->ConnectToService(GURL("http:test1"), &test_service); |
- EXPECT_EQ(1, url_loader->num_loads()); |
- EXPECT_EQ(1, scheme_loader->num_loads()); |
- EXPECT_EQ(1, default_loader->num_loads()); |
-} |
- |
-// Confirm that the url of a service is correctly passed to another service that |
-// it loads. |
-TEST_F(ApplicationManagerTest, ACallB) { |
- // Any url can load a. |
- AddLoaderForURL(GURL(kTestAURLString), std::string()); |
- |
- // Only a can load b. |
- AddLoaderForURL(GURL(kTestBURLString), kTestAURLString); |
- |
- TestAPtr a; |
- application_manager_->ConnectToService(GURL(kTestAURLString), &a); |
- a->CallB(); |
- loop_.Run(); |
- EXPECT_EQ(1, tester_context_.num_b_calls()); |
- EXPECT_TRUE(tester_context_.a_called_quit()); |
-} |
- |
-// A calls B which calls C. |
-TEST_F(ApplicationManagerTest, BCallC) { |
- // Any url can load a. |
- AddLoaderForURL(GURL(kTestAURLString), std::string()); |
- |
- // Only a can load b. |
- AddLoaderForURL(GURL(kTestBURLString), kTestAURLString); |
- |
- TestAPtr a; |
- application_manager_->ConnectToService(GURL(kTestAURLString), &a); |
- a->CallCFromB(); |
- loop_.Run(); |
- |
- EXPECT_EQ(1, tester_context_.num_b_calls()); |
- EXPECT_EQ(1, tester_context_.num_c_calls()); |
- EXPECT_TRUE(tester_context_.a_called_quit()); |
-} |
- |
-// Confirm that a service impl will be deleted if the app that connected to |
-// it goes away. |
-TEST_F(ApplicationManagerTest, BDeleted) { |
- AddLoaderForURL(GURL(kTestAURLString), std::string()); |
- AddLoaderForURL(GURL(kTestBURLString), std::string()); |
- |
- TestAPtr a; |
- application_manager_->ConnectToService(GURL(kTestAURLString), &a); |
- |
- a->CallB(); |
- loop_.Run(); |
- |
- // Kills the a app. |
- application_manager_->SetLoaderForURL(scoped_ptr<ApplicationLoader>(), |
- GURL(kTestAURLString)); |
- loop_.Run(); |
- |
- EXPECT_EQ(1, tester_context_.num_b_deletes()); |
-} |
- |
-// Confirm that the url of a service is correctly passed to another service that |
-// it loads, and that it can be rejected. |
-TEST_F(ApplicationManagerTest, ANoLoadB) { |
- // Any url can load a. |
- AddLoaderForURL(GURL(kTestAURLString), std::string()); |
- |
- // Only c can load b, so this will fail. |
- AddLoaderForURL(GURL(kTestBURLString), "test:TestC"); |
- |
- TestAPtr a; |
- application_manager_->ConnectToService(GURL(kTestAURLString), &a); |
- a->CallB(); |
- loop_.Run(); |
- EXPECT_EQ(0, tester_context_.num_b_calls()); |
- |
- EXPECT_FALSE(tester_context_.a_called_quit()); |
- EXPECT_TRUE(tester_context_.tester_called_quit()); |
-} |
- |
-TEST_F(ApplicationManagerTest, NoServiceNoLoad) { |
- AddLoaderForURL(GURL(kTestAURLString), std::string()); |
- |
- // There is no TestC service implementation registered with |
- // ApplicationManager, so this cannot succeed (but also shouldn't crash). |
- TestCPtr c; |
- application_manager_->ConnectToService(GURL(kTestAURLString), &c); |
- QuitMessageLoopErrorHandler quitter; |
- c.set_error_handler(&quitter); |
- |
- loop_.Run(); |
- EXPECT_TRUE(c.encountered_error()); |
-} |
- |
-TEST_F(ApplicationManagerTest, MappedURLsShouldNotCauseDuplicateLoad) { |
- test_delegate_.AddMapping(GURL("foo:foo2"), GURL("foo:foo")); |
- // 1 because ApplicationManagerTest connects once at startup. |
- EXPECT_EQ(1, test_loader_->num_loads()); |
- |
- TestServicePtr test_service; |
- application_manager_->ConnectToService(GURL("foo:foo"), &test_service); |
- EXPECT_EQ(2, test_loader_->num_loads()); |
- |
- TestServicePtr test_service2; |
- application_manager_->ConnectToService(GURL("foo:foo2"), &test_service2); |
- EXPECT_EQ(2, test_loader_->num_loads()); |
- |
- TestServicePtr test_service3; |
- application_manager_->ConnectToService(GURL("bar:bar"), &test_service2); |
- EXPECT_EQ(3, test_loader_->num_loads()); |
-} |
- |
-} // namespace mojo |