| Index: mojo/service_manager/service_manager_unittest.cc
|
| diff --git a/mojo/service_manager/service_manager_unittest.cc b/mojo/service_manager/service_manager_unittest.cc
|
| index a42dc5f0c91b4f1ed1cafae54f33c7ad4c1afbb1..b1abb79aa04bbc026eb3bafc61782a1a98084ab2 100644
|
| --- a/mojo/service_manager/service_manager_unittest.cc
|
| +++ b/mojo/service_manager/service_manager_unittest.cc
|
| @@ -10,6 +10,7 @@
|
| #include "mojo/public/cpp/application/application_impl.h"
|
| #include "mojo/public/cpp/application/interface_factory.h"
|
| #include "mojo/public/interfaces/service_provider/service_provider.mojom.h"
|
| +#include "mojo/service_manager/background_service_loader.h"
|
| #include "mojo/service_manager/service_loader.h"
|
| #include "mojo/service_manager/service_manager.h"
|
| #include "mojo/service_manager/test.mojom.h"
|
| @@ -148,22 +149,99 @@ class TestServiceLoader : public ServiceLoader,
|
| DISALLOW_COPY_AND_ASSIGN(TestServiceLoader);
|
| };
|
|
|
| -struct TesterContext {
|
| - TesterContext()
|
| - : 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) {}
|
| - 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;
|
| +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.
|
| @@ -173,7 +251,7 @@ class TestAImpl : public InterfaceImpl<TestA> {
|
| : test_context_(test_context) {
|
| connection->ConnectToApplication(kTestBURLString)->ConnectToService(&b_);
|
| }
|
| - virtual ~TestAImpl() { test_context_->num_a_deletes++; }
|
| + virtual ~TestAImpl() { test_context_->IncrementNumADeletes(); }
|
|
|
| private:
|
| virtual void CallB() OVERRIDE {
|
| @@ -185,8 +263,8 @@ class TestAImpl : public InterfaceImpl<TestA> {
|
| }
|
|
|
| void Quit() {
|
| - test_context_->a_called_quit = true;
|
| - base::MessageLoop::current()->Quit();
|
| + test_context_->set_a_called_quit();
|
| + test_context_->QuitSoon();
|
| }
|
|
|
| TesterContext* test_context_;
|
| @@ -201,20 +279,18 @@ class TestBImpl : public InterfaceImpl<TestB> {
|
| }
|
|
|
| virtual ~TestBImpl() {
|
| - test_context_->num_b_deletes++;
|
| - if (!base::MessageLoop::current()->is_running())
|
| - return;
|
| - base::MessageLoop::current()->Quit();
|
| + test_context_->IncrementNumBDeletes();
|
| + test_context_->QuitSoon();
|
| }
|
|
|
| private:
|
| virtual void B(const mojo::Callback<void()>& callback) OVERRIDE {
|
| - ++test_context_->num_b_calls;
|
| + test_context_->IncrementNumBCalls();
|
| callback.Run();
|
| }
|
|
|
| virtual void CallC(const mojo::Callback<void()>& callback) OVERRIDE {
|
| - ++test_context_->num_b_calls;
|
| + test_context_->IncrementNumBCalls();
|
| c_->C(callback);
|
| }
|
|
|
| @@ -227,11 +303,11 @@ class TestCImpl : public InterfaceImpl<TestC> {
|
| TestCImpl(ApplicationConnection* connection, TesterContext* test_context)
|
| : test_context_(test_context) {}
|
|
|
| - virtual ~TestCImpl() { test_context_->num_c_deletes++; }
|
| + virtual ~TestCImpl() { test_context_->IncrementNumCDeletes(); }
|
|
|
| private:
|
| virtual void C(const mojo::Callback<void()>& callback) OVERRIDE {
|
| - ++test_context_->num_c_calls;
|
| + test_context_->IncrementNumCCalls();
|
| callback.Run();
|
| }
|
| TesterContext* test_context_;
|
| @@ -263,8 +339,8 @@ class Tester : public ApplicationDelegate,
|
| ApplicationConnection* connection) OVERRIDE {
|
| if (!requestor_url_.empty() &&
|
| requestor_url_ != connection->GetRemoteApplicationURL()) {
|
| - context_->tester_called_quit = true;
|
| - base::MessageLoop::current()->Quit();
|
| + context_->set_tester_called_quit();
|
| + context_->QuitSoon();
|
| return false;
|
| }
|
| // If we're coming from A, then add B, otherwise A.
|
| @@ -334,7 +410,7 @@ class TestServiceInterceptor : public ServiceManager::Interceptor {
|
|
|
| class ServiceManagerTest : public testing::Test {
|
| public:
|
| - ServiceManagerTest() {}
|
| + ServiceManagerTest() : tester_context_(&loop_) {}
|
|
|
| virtual ~ServiceManagerTest() {}
|
|
|
| @@ -355,6 +431,15 @@ class ServiceManagerTest : public testing::Test {
|
| service_manager_.reset(NULL);
|
| }
|
|
|
| + void AddLoaderForURL(const GURL& url, const std::string& requestor_url) {
|
| + scoped_ptr<ServiceLoader> real_loader(
|
| + new Tester(&tester_context_, requestor_url));
|
| + service_manager_->SetLoaderForURL(
|
| + scoped_ptr<ServiceLoader>(new BackgroundServiceLoader(
|
| + real_loader.Pass(), "", base::MessageLoop::TYPE_DEFAULT)),
|
| + url);
|
| + }
|
| +
|
| bool HasFactoryForTestURL() {
|
| ServiceManager::TestAPI manager_test_api(service_manager_.get());
|
| return manager_test_api.HasFactoryForURL(GURL(kTestURLString));
|
| @@ -362,8 +447,9 @@ class ServiceManagerTest : public testing::Test {
|
|
|
| protected:
|
| base::ShadowingAtExitManager at_exit_;
|
| - base::MessageLoop loop_;
|
| + TesterContext tester_context_;
|
| TestContext context_;
|
| + base::MessageLoop loop_;
|
| scoped_ptr<TestClientImpl> test_client_;
|
| scoped_ptr<ServiceManager> service_manager_;
|
| DISALLOW_COPY_AND_ASSIGN(ServiceManagerTest);
|
| @@ -416,25 +502,28 @@ TEST_F(ServiceManagerTest, SetLoaders) {
|
| TestServiceLoader* default_loader = new TestServiceLoader;
|
| TestServiceLoader* url_loader = new TestServiceLoader;
|
| TestServiceLoader* scheme_loader = new TestServiceLoader;
|
| - sm.set_default_loader(scoped_ptr<ServiceLoader>(default_loader));
|
| - sm.SetLoaderForURL(scoped_ptr<ServiceLoader>(url_loader), GURL("test:test1"));
|
| - sm.SetLoaderForScheme(scoped_ptr<ServiceLoader>(scheme_loader), "test");
|
| + service_manager_->set_default_loader(
|
| + scoped_ptr<ServiceLoader>(default_loader));
|
| + service_manager_->SetLoaderForURL(scoped_ptr<ServiceLoader>(url_loader),
|
| + GURL("test:test1"));
|
| + service_manager_->SetLoaderForScheme(scoped_ptr<ServiceLoader>(scheme_loader),
|
| + "test");
|
|
|
| // test::test1 should go to url_loader.
|
| TestServicePtr test_service;
|
| - sm.ConnectToService(GURL("test:test1"), &test_service);
|
| + service_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.
|
| - sm.ConnectToService(GURL("test:test2"), &test_service);
|
| + service_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.
|
| - sm.ConnectToService(GURL("http:test1"), &test_service);
|
| + service_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());
|
| @@ -442,121 +531,83 @@ TEST_F(ServiceManagerTest, SetLoaders) {
|
|
|
| // Confirm that the url of a service is correctly passed to another service that
|
| // it loads.
|
| -// http://crbug.com/396300
|
| -TEST_F(ServiceManagerTest, DISABLED_ACallB) {
|
| - TesterContext context;
|
| - ServiceManager sm;
|
| -
|
| +TEST_F(ServiceManagerTest, ACallB) {
|
| // Any url can load a.
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
|
| - GURL(kTestAURLString));
|
| + AddLoaderForURL(GURL(kTestAURLString), std::string());
|
|
|
| // Only a can load b.
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>(
|
| - new Tester(&context, kTestAURLString)),
|
| - GURL(kTestBURLString));
|
| + AddLoaderForURL(GURL(kTestBURLString), kTestAURLString);
|
|
|
| TestAPtr a;
|
| - sm.ConnectToService(GURL(kTestAURLString), &a);
|
| + service_manager_->ConnectToService(GURL(kTestAURLString), &a);
|
| a->CallB();
|
| loop_.Run();
|
| - EXPECT_EQ(1, context.num_b_calls);
|
| - EXPECT_TRUE(context.a_called_quit);
|
| + EXPECT_EQ(1, tester_context_.num_b_calls());
|
| + EXPECT_TRUE(tester_context_.a_called_quit());
|
| }
|
|
|
| // A calls B which calls C.
|
| -// http://crbug.com/396300
|
| -TEST_F(ServiceManagerTest, DISABLED_BCallC) {
|
| - TesterContext context;
|
| - ServiceManager sm;
|
| -
|
| +TEST_F(ServiceManagerTest, BCallC) {
|
| // Any url can load a.
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
|
| - GURL(kTestAURLString));
|
| + AddLoaderForURL(GURL(kTestAURLString), std::string());
|
|
|
| // Only a can load b.
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>(
|
| - new Tester(&context, kTestAURLString)),
|
| - GURL(kTestBURLString));
|
| + AddLoaderForURL(GURL(kTestBURLString), kTestAURLString);
|
|
|
| TestAPtr a;
|
| - sm.ConnectToService(GURL(kTestAURLString), &a);
|
| + service_manager_->ConnectToService(GURL(kTestAURLString), &a);
|
| a->CallCFromB();
|
| loop_.Run();
|
|
|
| - EXPECT_EQ(1, context.num_b_calls);
|
| - EXPECT_EQ(1, context.num_c_calls);
|
| - EXPECT_TRUE(context.a_called_quit);
|
| + 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.
|
| -// http://crbug.com/396300
|
| -TEST_F(ServiceManagerTest, DISABLED_BDeleted) {
|
| - TesterContext context;
|
| - ServiceManager sm;
|
| -
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
|
| - GURL(kTestAURLString));
|
| -
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>( new Tester(&context, std::string())),
|
| - GURL(kTestBURLString));
|
| +TEST_F(ServiceManagerTest, BDeleted) {
|
| + AddLoaderForURL(GURL(kTestAURLString), std::string());
|
| + AddLoaderForURL(GURL(kTestBURLString), std::string());
|
|
|
| TestAPtr a;
|
| - sm.ConnectToService(GURL(kTestAURLString), &a);
|
| + service_manager_->ConnectToService(GURL(kTestAURLString), &a);
|
|
|
| a->CallB();
|
| loop_.Run();
|
|
|
| // Kills the a app.
|
| - sm.SetLoaderForURL(scoped_ptr<ServiceLoader>(), GURL(kTestAURLString));
|
| + service_manager_->SetLoaderForURL(scoped_ptr<ServiceLoader>(),
|
| + GURL(kTestAURLString));
|
| loop_.Run();
|
| - EXPECT_EQ(1, context.num_b_deletes);
|
| +
|
| + 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.
|
| -// http://crbug.com/396300
|
| -TEST_F(ServiceManagerTest, DISABLED_ANoLoadB) {
|
| - TesterContext context;
|
| - ServiceManager sm;
|
| -
|
| +TEST_F(ServiceManagerTest, ANoLoadB) {
|
| // Any url can load a.
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
|
| - GURL(kTestAURLString));
|
| + AddLoaderForURL(GURL(kTestAURLString), std::string());
|
|
|
| // Only c can load b, so this will fail.
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>(new Tester(&context, "test:TestC")),
|
| - GURL(kTestBURLString));
|
| + AddLoaderForURL(GURL(kTestBURLString), "test:TestC");
|
|
|
| TestAPtr a;
|
| - sm.ConnectToService(GURL(kTestAURLString), &a);
|
| + service_manager_->ConnectToService(GURL(kTestAURLString), &a);
|
| a->CallB();
|
| loop_.Run();
|
| - EXPECT_EQ(0, context.num_b_calls);
|
| - EXPECT_TRUE(context.tester_called_quit);
|
| + EXPECT_EQ(0, tester_context_.num_b_calls());
|
| + EXPECT_TRUE(tester_context_.tester_called_quit());
|
| }
|
|
|
| TEST_F(ServiceManagerTest, NoServiceNoLoad) {
|
| - TesterContext context;
|
| - ServiceManager sm;
|
| -
|
| - sm.SetLoaderForURL(
|
| - scoped_ptr<ServiceLoader>(new Tester(&context, std::string())),
|
| - GURL(kTestAURLString));
|
| + AddLoaderForURL(GURL(kTestAURLString), std::string());
|
|
|
| // There is no TestC service implementation registered with ServiceManager,
|
| // so this cannot succeed (but also shouldn't crash).
|
| TestCPtr c;
|
| - sm.ConnectToService(GURL(kTestAURLString), &c);
|
| + service_manager_->ConnectToService(GURL(kTestAURLString), &c);
|
| QuitMessageLoopErrorHandler quitter;
|
| c.set_error_handler(&quitter);
|
|
|
| @@ -565,15 +616,15 @@ TEST_F(ServiceManagerTest, NoServiceNoLoad) {
|
| }
|
|
|
| TEST_F(ServiceManagerTest, Interceptor) {
|
| - ServiceManager sm;
|
| TestServiceInterceptor interceptor;
|
| TestServiceLoader* default_loader = new TestServiceLoader;
|
| - sm.set_default_loader(scoped_ptr<ServiceLoader>(default_loader));
|
| - sm.SetInterceptor(&interceptor);
|
| + service_manager_->set_default_loader(
|
| + scoped_ptr<ServiceLoader>(default_loader));
|
| + service_manager_->SetInterceptor(&interceptor);
|
|
|
| std::string url("test:test3");
|
| TestServicePtr test_service;
|
| - sm.ConnectToService(GURL(url), &test_service);
|
| + service_manager_->ConnectToService(GURL(url), &test_service);
|
|
|
| EXPECT_EQ(1, interceptor.call_count());
|
| EXPECT_EQ(url, interceptor.url_spec());
|
|
|