1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef EXTENSIONS_RENDERER_MODULE_SYSTEM_TEST_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define EXTENSIONS_RENDERER_MODULE_SYSTEM_TEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/renderer/module_system.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/renderer/scoped_persistent.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/renderer/script_context.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "gin/public/context_holder.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "v8/include/v8.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace extensions {
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ModuleSystemTestEnvironment {
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class AssertNatives;
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class StringSourceMap;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit ModuleSystemTestEnvironment(v8::Isolate* isolate);
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ~ModuleSystemTestEnvironment();
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Register a named JS module in the module system.
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RegisterModule(const std::string& name, const std::string& code);
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Register a named JS module with source retrieved from a ResourceBundle.
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RegisterModule(const std::string& name, int resource_id);
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Register a named JS module in the module system and tell the module system
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // to use it to handle any requireNative() calls for native modules with that
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // name.
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void OverrideNativeHandler(const std::string& name, const std::string& code);
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Registers |file_name| from chrome/test/data/extensions as a module name
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // |module_name|.
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RegisterTestFile(const std::string& module_name,
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        const std::string& file_name);
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Create an empty object in the global scope with name |name|.
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  v8::Handle<v8::Object> CreateGlobal(const std::string& name);
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ShutdownGin();
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ShutdownModuleSystem();
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ModuleSystem* module_system() { return context_->module_system(); }
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ScriptContext* context() { return context_.get(); }
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  v8::Isolate* isolate() { return isolate_; }
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AssertNatives* assert_natives() { return assert_natives_; }
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  v8::Isolate* isolate_;
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<gin::ContextHolder> context_holder_;
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  v8::HandleScope handle_scope_;
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ScriptContext> context_;
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AssertNatives* assert_natives_;
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<StringSourceMap> source_map_;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ModuleSystemTestEnvironment);
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test fixture for testing JS that makes use of the module system.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Typically tests will look like:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TEST_F(MyModuleSystemTest, TestStuff) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   ModuleSystem::NativesEnabledScope natives_enabled(module_system_.get());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   RegisterModule("test", "requireNative('assert').AssertTrue(true);");
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   module_system_->Require("test");
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// By default a test will fail if no method in the native module 'assert' is
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// called. This behaviour can be overridden by calling ExpectNoAssertionsMade().
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ModuleSystemTest : public testing::Test {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ModuleSystemTest();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ModuleSystemTest();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUp() OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ModuleSystemTestEnvironment* env() { return env_.get(); }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ModuleSystemTestEnvironment> CreateEnvironment();
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the test fail if any asserts are called. By default a test will fail
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if no asserts are called.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectNoAssertionsMade();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Runs promises that have been resolved. Resolved promises will not run
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // until this is called.
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RunResolvedPromises();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  v8::Isolate* isolate_;
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<ModuleSystemTestEnvironment> env_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool should_assertions_be_made_;
104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private:
106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ModuleSystemTest);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace extensions
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // EXTENSIONS_RENDERER_MODULE_SYSTEM_TEST_H_
112