| Index: mojo/runner/about_fetcher_unittest.cc
|
| diff --git a/mojo/runner/about_fetcher_unittest.cc b/mojo/runner/about_fetcher_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2f5b2d91093531d43b558ce21d31a33572edb7f8
|
| --- /dev/null
|
| +++ b/mojo/runner/about_fetcher_unittest.cc
|
| @@ -0,0 +1,187 @@
|
| +// Copyright 2015 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/macros.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| +#include "mojo/application/public/cpp/application_connection.h"
|
| +#include "mojo/application/public/cpp/application_delegate.h"
|
| +#include "mojo/application/public/cpp/application_impl.h"
|
| +#include "mojo/application/public/cpp/interface_factory.h"
|
| +#include "mojo/application/public/interfaces/content_handler.mojom.h"
|
| +#include "mojo/common/weak_binding_set.h"
|
| +#include "mojo/runner/about_fetcher.h"
|
| +#include "mojo/runner/context.h"
|
| +#include "mojo/shell/application_loader.h"
|
| +#include "mojo/shell/application_manager.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace mojo {
|
| +namespace runner {
|
| +namespace {
|
| +
|
| +class TestContentHandler : public ApplicationDelegate,
|
| + public InterfaceFactory<ContentHandler>,
|
| + public ContentHandler {
|
| + public:
|
| + TestContentHandler() : response_number_(0) {}
|
| + ~TestContentHandler() override {}
|
| +
|
| + size_t response_number() const { return response_number_; }
|
| + const URLResponse* latest_response() const { return latest_response_.get(); }
|
| +
|
| + private:
|
| + // Overridden from ApplicationDelegate:
|
| + void Initialize(ApplicationImpl* app) override {}
|
| + bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
|
| + connection->AddService<ContentHandler>(this);
|
| + return true;
|
| + }
|
| +
|
| + // Overridden from InterfaceFactory<ContentHandler>:
|
| + void Create(ApplicationConnection* connection,
|
| + InterfaceRequest<ContentHandler> request) override {
|
| + bindings_.AddBinding(this, request.Pass());
|
| + }
|
| +
|
| + // Overridden from ContentHandler:
|
| + void StartApplication(InterfaceRequest<Application> application,
|
| + URLResponsePtr response) override {
|
| + response_number_++;
|
| + latest_response_ = response.Pass();
|
| +
|
| + // Drop |application| request. This results in the application manager
|
| + // dropping the ServiceProvider interface request provided by the client
|
| + // who made the ConnectToApplication() call. Therefore the client could
|
| + // listen for connection error of the ServiceProvider interface to learn
|
| + // that StartApplication() has been called.
|
| + }
|
| +
|
| + size_t response_number_;
|
| + URLResponsePtr latest_response_;
|
| + WeakBindingSet<ContentHandler> bindings_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestContentHandler);
|
| +};
|
| +
|
| +class TestApplicationManagerDelegate
|
| + : public shell::ApplicationManager::Delegate {
|
| + public:
|
| + TestApplicationManagerDelegate() {}
|
| + ~TestApplicationManagerDelegate() override {}
|
| +
|
| + private:
|
| + // Overridden from ApplicationManager::Delegate:
|
| + GURL ResolveMappings(const GURL& url) override { return url; }
|
| + GURL ResolveMojoURL(const GURL& url) override { return url; }
|
| + bool CreateFetcher(
|
| + const GURL& url,
|
| + const shell::Fetcher::FetchCallback& loader_callback) override {
|
| + if (url.SchemeIs(AboutFetcher::kAboutScheme)) {
|
| + AboutFetcher::Start(url, loader_callback);
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| + }
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestApplicationManagerDelegate);
|
| +};
|
| +
|
| +class TestLoader : public shell::ApplicationLoader {
|
| + public:
|
| + explicit TestLoader(ApplicationDelegate* delegate) : delegate_(delegate) {}
|
| + ~TestLoader() override {}
|
| +
|
| + private:
|
| + // Overridden from ApplicationLoader:
|
| + void Load(const GURL& url, InterfaceRequest<Application> request) override {
|
| + app_.reset(new ApplicationImpl(delegate_, request.Pass()));
|
| + }
|
| +
|
| + ApplicationDelegate* delegate_;
|
| + scoped_ptr<ApplicationImpl> app_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestLoader);
|
| +};
|
| +
|
| +class AboutFetcherTest : public testing::Test {
|
| + public:
|
| + AboutFetcherTest() {}
|
| + ~AboutFetcherTest() override {}
|
| +
|
| + protected:
|
| + const TestContentHandler* html_content_handler() const {
|
| + return &html_content_handler_;
|
| + }
|
| +
|
| + void ConnectAndWait(const std::string& url) {
|
| + base::RunLoop run_loop;
|
| +
|
| + ServiceProviderPtr service_provider;
|
| + InterfaceRequest<ServiceProvider> service_provider_request =
|
| + GetProxy(&service_provider);
|
| + // This connection error handler will be called when:
|
| + // - TestContentHandler::StartApplication() has been called (please see
|
| + // comments in that method); or
|
| + // - the application manager fails to fetch the requested URL.
|
| + service_provider.set_connection_error_handler(
|
| + [&run_loop]() { run_loop.Quit(); });
|
| +
|
| + URLRequestPtr request(URLRequest::New());
|
| + request->url = url;
|
| + application_manager_->ConnectToApplication(
|
| + nullptr, request.Pass(), std::string(), service_provider_request.Pass(),
|
| + nullptr, shell::CapabilityFilter(), base::Closure(),
|
| + shell::EmptyConnectCallback());
|
| +
|
| + run_loop.Run();
|
| + }
|
| +
|
| + // Overridden from testing::Test:
|
| + void SetUp() override {
|
| + Context::EnsureEmbedderIsInitialized();
|
| + application_manager_.reset(new shell::ApplicationManager(&test_delegate_));
|
| + application_manager_->SetLoaderForURL(
|
| + make_scoped_ptr(new TestLoader(&html_content_handler_)),
|
| + GURL("test:html_content_handler"));
|
| + application_manager_->RegisterContentHandler(
|
| + "text/html", GURL("test:html_content_handler"));
|
| + }
|
| +
|
| + void TearDown() override { application_manager_.reset(); }
|
| +
|
| + private:
|
| + base::ShadowingAtExitManager at_exit_;
|
| + TestApplicationManagerDelegate test_delegate_;
|
| + TestContentHandler html_content_handler_;
|
| + base::MessageLoop loop_;
|
| + scoped_ptr<shell::ApplicationManager> application_manager_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(AboutFetcherTest);
|
| +};
|
| +
|
| +TEST_F(AboutFetcherTest, AboutBlank) {
|
| + ConnectAndWait("about:blank");
|
| +
|
| + ASSERT_EQ(1u, html_content_handler()->response_number());
|
| +
|
| + const URLResponse* response = html_content_handler()->latest_response();
|
| + EXPECT_EQ("about:blank", response->url);
|
| + EXPECT_EQ(200u, response->status_code);
|
| + EXPECT_EQ("text/html", response->mime_type);
|
| + EXPECT_FALSE(response->body.is_valid());
|
| +}
|
| +
|
| +TEST_F(AboutFetcherTest, UnrecognizedURL) {
|
| + ConnectAndWait("about:some_unrecognized_url");
|
| +
|
| + ASSERT_EQ(0u, html_content_handler()->response_number());
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace runner
|
| +} // namespace mojo
|
|
|