Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Unified Diff: mojo/application_manager/application_manager_unittest.cc

Issue 814273005: Move application_manager from /mojo to /shell. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Update include guards. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/application_manager/application_manager_export.h ('k') | mojo/application_manager/shell_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « mojo/application_manager/application_manager_export.h ('k') | mojo/application_manager/shell_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698