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