Index: content/browser/service_worker/embedded_worker_test_helper.cc |
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc |
index 2b05b9bb1c2c16538663d8c6c4a805a6ca229b21..da2c920cb4024626bb9f85f162af5ec3ad640f3d 100644 |
--- a/content/browser/service_worker/embedded_worker_test_helper.cc |
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc |
@@ -31,6 +31,10 @@ |
#include "services/shell/public/cpp/interface_registry.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using ::testing::_; |
+using ::testing::Invoke; |
+using ::testing::NiceMock; |
+ |
namespace content { |
namespace { |
@@ -53,6 +57,41 @@ class MockMessagePortMessageFilter : public MessagePortMessageFilter { |
ScopedVector<IPC::Message> message_queue_; |
}; |
+template <typename Interface> |
+void RecursiveAddInterfaces( |
+ shell::InterfaceRegistry* registry, |
+ base::Callback<void(mojo::InterfaceRequest<Interface>)> factory) { |
+ registry->AddInterface(factory); |
+} |
+ |
+template <typename Interface, typename... Factories> |
+void RecursiveAddInterfaces( |
+ shell::InterfaceRegistry* registry, |
+ base::Callback<void(mojo::InterfaceRequest<Interface>)> factory, |
+ Factories... factories) { |
+ registry->AddInterface(factory); |
+ RecursiveAddInterfaces(registry, factories...); |
+} |
+ |
+template <typename... Factories> |
+std::unique_ptr<shell::InterfaceRegistry> CreateInterfaceRegistry( |
+ base::WeakPtr<EmbeddedWorkerTestHelper> helper, |
+ MockRenderProcessHost* rph, |
+ Factories... factories) { |
dcheng
2016/09/07 07:51:09
I think it might be clearer to just write this out
shimazu
2016/09/12 06:28:19
Done.
|
+ std::unique_ptr<shell::InterfaceRegistry> registry( |
+ new shell::InterfaceRegistry); |
+ RecursiveAddInterfaces(registry.get(), factories...); |
+ |
+ shell::mojom::InterfaceProviderPtr interfaces; |
+ registry->Bind(mojo::GetProxy(&interfaces)); |
+ |
+ std::unique_ptr<shell::InterfaceProvider> remote_interfaces( |
+ new shell::InterfaceProvider); |
+ remote_interfaces->Bind(std::move(interfaces)); |
+ rph->SetRemoteInterfaces(std::move(remote_interfaces)); |
+ return registry; |
+} |
+ |
} // namespace |
class EmbeddedWorkerTestHelper::MockEmbeddedWorkerSetup |
@@ -84,13 +123,68 @@ class EmbeddedWorkerTestHelper::MockEmbeddedWorkerSetup |
mojo::StrongBinding<mojom::EmbeddedWorkerSetup> binding_; |
}; |
+EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient:: |
+ MockEmbeddedWorkerInstanceClient( |
+ base::WeakPtr<EmbeddedWorkerTestHelper> helper) |
+ : helper_(helper), binding_(this) { |
+ ON_CALL(*this, MockStartWorker(_)) |
+ .WillByDefault(Invoke( |
+ this, &EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient:: |
+ DefaultStartWorker)); |
+} |
+ |
+EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient:: |
+ ~MockEmbeddedWorkerInstanceClient() {} |
+ |
+void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient:: |
+ DefaultStartWorker(mojom::EmbeddedWorkerStartWorkerParams* params) { |
+ if (!helper_) |
+ return; |
+ |
+ embedded_worker_id_ = params->embedded_worker_id; |
+ |
+ EmbeddedWorkerInstance* worker = |
+ helper_->registry()->GetWorker(params->embedded_worker_id); |
+ ASSERT_TRUE(worker != NULL); |
+ EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status()); |
+ |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, |
+ helper_->weak_factory_.GetWeakPtr(), |
+ params->embedded_worker_id, |
+ params->service_worker_version_id, params->scope, |
+ params->script_url, params->pause_after_download)); |
+} |
+ |
+// static |
+void EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::Bind( |
+ const base::WeakPtr<EmbeddedWorkerTestHelper>& helper, |
+ mojom::EmbeddedWorkerInstanceClientRequest request) { |
+ ASSERT_GE(helper->mock_instance_clients()->size(), |
+ helper->mock_instance_clients_next_); |
+ if (helper->mock_instance_clients()->size() == |
+ helper->mock_instance_clients_next_) { |
+ helper->mock_instance_clients()->push_back( |
+ base::MakeUnique<NiceMock<MockEmbeddedWorkerInstanceClient>>(helper)); |
+ } |
+ |
+ auto& instance_client = |
+ helper->mock_instance_clients_[helper->mock_instance_clients_next_++]; |
+ if (instance_client) |
+ instance_client->binding_.Bind(std::move(request)); |
+} |
+ |
EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( |
const base::FilePath& user_data_directory) |
: browser_context_(new TestBrowserContext), |
render_process_host_(new MockRenderProcessHost(browser_context_.get())), |
+ new_render_process_host_( |
+ new MockRenderProcessHost(browser_context_.get())), |
wrapper_(new ServiceWorkerContextWrapper(browser_context_.get())), |
+ mock_instance_clients_next_(0), |
next_thread_id_(0), |
mock_render_process_id_(render_process_host_->GetID()), |
+ new_mock_render_process_id_(new_render_process_host_->GetID()), |
weak_factory_(this) { |
std::unique_ptr<MockServiceWorkerDatabaseTaskManager> database_task_manager( |
new MockServiceWorkerDatabaseTaskManager( |
@@ -103,16 +197,16 @@ EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper( |
NewMessagePortMessageFilter()); |
// Setup process level interface registry. |
- render_process_interface_registry_.reset(new shell::InterfaceRegistry); |
- render_process_interface_registry_->AddInterface( |
- base::Bind(&MockEmbeddedWorkerSetup::Create, weak_factory_.GetWeakPtr())); |
- shell::mojom::InterfaceProviderPtr interfaces; |
- render_process_interface_registry_->Bind(mojo::GetProxy(&interfaces)); |
- |
- std::unique_ptr<shell::InterfaceProvider> host_remote_interfaces( |
- new shell::InterfaceProvider); |
- host_remote_interfaces->Bind(std::move(interfaces)); |
- render_process_host_->SetRemoteInterfaces(std::move(host_remote_interfaces)); |
+ auto embedded_worker_setup_factory = |
+ base::Bind(&MockEmbeddedWorkerSetup::Create, weak_factory_.GetWeakPtr()); |
+ auto embedded_worker_instance_client_factory = base::Bind( |
+ &MockEmbeddedWorkerInstanceClient::Bind, weak_factory_.GetWeakPtr()); |
+ render_process_interface_registry_ = CreateInterfaceRegistry( |
+ weak_factory_.GetWeakPtr(), render_process_host_.get(), |
+ embedded_worker_setup_factory, embedded_worker_instance_client_factory); |
+ new_render_process_interface_registry_ = CreateInterfaceRegistry( |
+ weak_factory_.GetWeakPtr(), new_render_process_host_.get(), |
+ embedded_worker_setup_factory, embedded_worker_instance_client_factory); |
} |
EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() { |
@@ -153,6 +247,17 @@ bool EmbeddedWorkerTestHelper::OnMessageReceived(const IPC::Message& message) { |
return handled; |
} |
+void EmbeddedWorkerTestHelper::PrepareMockInstanceClients( |
+ int number_of_clients) { |
+ mock_instance_clients_.clear(); |
+ mock_instance_clients_next_ = 0; |
+ for (int i = 0; i < number_of_clients; i++) { |
+ mock_instance_clients_.push_back( |
+ base::MakeUnique<NiceMock<MockEmbeddedWorkerInstanceClient>>( |
+ weak_factory_.GetWeakPtr())); |
+ } |
+} |
+ |
ServiceWorkerContextCore* EmbeddedWorkerTestHelper::context() { |
return wrapper_->context(); |
} |