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