15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef EXTENSIONS_RENDERER_API_TEST_BASE_H_ 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define EXTENSIONS_RENDERER_API_TEST_BASE_H_ 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <map> 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string> 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <utility> 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/message_loop/message_loop.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/run_loop.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/renderer/module_system_test.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/renderer/v8_schema_registry.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "gin/handle.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "gin/modules/module_registry.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "gin/object_template_builder.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "gin/wrappable.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/bindings/js/handle.h" 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/bindings/interface_request.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/system/core.h" 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace extensions { 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class V8SchemaRegistry; 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// A ServiceProvider that provides access from JS modules to services registered 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// by AddService() calls. 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestServiceProvider : public gin::Wrappable<TestServiceProvider> { 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static gin::Handle<TestServiceProvider> Create(v8::Isolate* isolate); 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~TestServiceProvider(); 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder( 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v8::Isolate* isolate) OVERRIDE; 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) template <typename Interface> 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AddService(const base::Callback<void(mojo::InterfaceRequest<Interface>)> 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_factory) { 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_factories_.insert(std::make_pair( 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Interface::Name_, 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(ForwardToServiceFactory<Interface>, service_factory))); 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static gin::WrapperInfo kWrapperInfo; 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestServiceProvider(); 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::Handle ConnectToService(const std::string& service_name); 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) template <typename Interface> 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static void ForwardToServiceFactory( 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Callback<void(mojo::InterfaceRequest<Interface>)> 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_factory, 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::ScopedMessagePipeHandle handle) { 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_factory.Run(mojo::MakeRequest<Interface>(handle.Pass())); 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::map<std::string, base::Callback<void(mojo::ScopedMessagePipeHandle)> > 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_factories_; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// A base class for unit testing apps/extensions API custom bindings implemented 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// on Mojo services. To use: 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 1. Register test Mojo service implementations on service_provider(). 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 2. Write JS tests in extensions/test/data/test_file.js. 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 3. Write one C++ test function for each JS test containing 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// RunTest("test_file.js", "testFunctionName"). 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// See extensions/renderer/api_test_base_unittest.cc and 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// extensions/test/data/api_test_base_unittest.js for sample usage. 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ApiTestBase : public ModuleSystemTest { 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ApiTestBase(); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~ApiTestBase(); 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetUp() OVERRIDE; 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RunTest(const std::string& file_name, const std::string& test_name); 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestServiceProvider* service_provider() { return service_provider_; } 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RegisterModules(); 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void InitializeEnvironment(); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RunTestInner(const std::string& test_name, 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& quit_closure); 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RunPromisesAgain(); 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoop message_loop_; 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestServiceProvider* service_provider_; 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<V8SchemaRegistry> v8_schema_registry_; 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace extensions 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif // EXTENSIONS_RENDERER_API_TEST_BASE_H_ 95