Chromium Code Reviews| Index: chrome/renderer/module_system_unittest.cc |
| diff --git a/chrome/renderer/module_system_unittest.cc b/chrome/renderer/module_system_unittest.cc |
| index 6b9b0206e4750e432ed405ae4c8c602bc18a3c03..222f76a6e7b215bb9d81456b9aba067f27333f15 100644 |
| --- a/chrome/renderer/module_system_unittest.cc |
| +++ b/chrome/renderer/module_system_unittest.cc |
| @@ -15,26 +15,49 @@ |
| class AssertNatives : public NativeHandler { |
| public: |
| AssertNatives() |
| - : native_function_called_(false), |
| + : assertion_made_(false), |
| failed_(false) { |
| RouteFunction("AssertTrue", base::Bind(&AssertNatives::AssertTrue, |
| base::Unretained(this))); |
| } |
| - bool native_function_called() { return native_function_called_; } |
| + bool assertion_made() { return assertion_made_; } |
| bool failed() { return failed_; } |
| v8::Handle<v8::Value> AssertTrue(const v8::Arguments& args) { |
| - native_function_called_ = true; |
| + assertion_made_ = true; |
| failed_ = failed_ || !args[0]->ToBoolean()->Value(); |
| return v8::Undefined(); |
| } |
| private: |
| - bool native_function_called_; |
| + bool assertion_made_; |
| bool failed_; |
| }; |
| +class CounterNatives : public NativeHandler { |
| + public: |
| + CounterNatives() |
| + : counter_(0) { |
|
not at google - send to devlin
2012/03/26 02:29:49
nit: on same line as CounterNatives()
koz (OOO until 15th September)
2012/03/26 03:58:59
Done.
|
| + RouteFunction("Get", base::Bind(&CounterNatives::Get, |
| + base::Unretained(this))); |
| + RouteFunction("Increment", base::Bind(&CounterNatives::Increment, |
| + base::Unretained(this))); |
| + } |
| + |
| + v8::Handle<v8::Value> Get(const v8::Arguments& args) { |
| + return v8::Integer::New(counter_); |
| + } |
| + |
| + v8::Handle<v8::Value> Increment(const v8::Arguments& args) { |
| + counter_++; |
| + return v8::Undefined(); |
| + } |
| + |
| + private: |
| + int counter_; |
| +}; |
| + |
| class StringSourceMap : public ModuleSystem::SourceMap { |
| public: |
| StringSourceMap() {} |
| @@ -58,30 +81,12 @@ class StringSourceMap : public ModuleSystem::SourceMap { |
| std::map<std::string, std::string> source_map_; |
| }; |
| -// Native JS functions for disabling injection in ModuleSystem. |
| -class DisableNativesHandler : public NativeHandler { |
| - public: |
| - explicit DisableNativesHandler(ModuleSystem* module_system) |
| - : module_system_(module_system) { |
| - RouteFunction("DisableNatives", |
| - base::Bind(&DisableNativesHandler::DisableNatives, |
| - base::Unretained(this))); |
| - } |
| - |
| - v8::Handle<v8::Value> DisableNatives(const v8::Arguments& args) { |
| - module_system_->set_natives_enabled(false); |
| - return v8::Undefined(); |
| - } |
| - |
| - private: |
| - ModuleSystem* module_system_; |
| -}; |
| - |
| class ModuleSystemTest : public testing::Test { |
| public: |
| ModuleSystemTest() |
| : context_(v8::Context::New()), |
| - source_map_(new StringSourceMap()) { |
| + source_map_(new StringSourceMap()), |
| + should_assertions_be_made_(true) { |
| context_->Enter(); |
| assert_natives_ = new AssertNatives(); |
| module_system_.reset(new ModuleSystem(source_map_.get())); |
| @@ -101,9 +106,22 @@ class ModuleSystemTest : public testing::Test { |
| virtual void TearDown() { |
| // All tests must call a native function at least once. |
| - ASSERT_TRUE(assert_natives_->native_function_called()); |
| - ASSERT_FALSE(assert_natives_->failed()); |
| ASSERT_FALSE(try_catch_.HasCaught()); |
| + ASSERT_EQ(should_assertions_be_made_, |
| + assert_natives_->assertion_made()); |
| + ASSERT_FALSE(assert_natives_->failed()); |
| + } |
| + |
| + void ExpectNoAssertionsMade() { |
|
not at google - send to devlin
2012/03/26 02:29:49
This is an unfortunate name in the context of gtes
koz (OOO until 15th September)
2012/03/26 03:58:59
Yeah. I can't think of a better name that's not su
|
| + should_assertions_be_made_ = false; |
| + } |
| + |
| + v8::Handle<v8::Object> CreateGlobal(const std::string& name) { |
| + v8::HandleScope handle_scope; |
| + v8::Handle<v8::Object> object = v8::Object::New(); |
| + v8::Context::GetCurrent()->Global()->Set(v8::String::New(name.c_str()), |
| + object); |
| + return handle_scope.Close(object); |
| } |
| v8::Persistent<v8::Context> context_; |
| @@ -112,9 +130,11 @@ class ModuleSystemTest : public testing::Test { |
| AssertNatives* assert_natives_; |
| scoped_ptr<StringSourceMap> source_map_; |
| scoped_ptr<ModuleSystem> module_system_; |
| + bool should_assertions_be_made_; |
| }; |
| TEST_F(ModuleSystemTest, TestRequire) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| RegisterModule("test", |
| "var Add = require('add').Add;" |
| "requireNative('assert').AssertTrue(Add(3, 5) == 8);"); |
| @@ -122,6 +142,7 @@ TEST_F(ModuleSystemTest, TestRequire) { |
| } |
| TEST_F(ModuleSystemTest, TestNestedRequire) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| RegisterModule("double", |
| "var Add = require('add').Add;" |
| "exports.Double = function(x) { return Add(x, x); };"); |
| @@ -132,6 +153,7 @@ TEST_F(ModuleSystemTest, TestNestedRequire) { |
| } |
| TEST_F(ModuleSystemTest, TestModuleInsulation) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| RegisterModule("x", |
| "var x = 10;" |
| "exports.X = function() { return x; };"); |
| @@ -149,30 +171,42 @@ TEST_F(ModuleSystemTest, TestModuleInsulation) { |
| module_system_->Require("test"); |
| } |
| -TEST_F(ModuleSystemTest, TestDisableNativesPreventsNativeModulesBeingLoaded) { |
| - module_system_->RegisterNativeHandler("disable", |
| - scoped_ptr<NativeHandler>( |
| - new DisableNativesHandler(module_system_.get()))); |
| +TEST_F(ModuleSystemTest, TestNativesAreDisabledOutsideANativesEnabledScope) { |
| RegisterModule("test", |
| - "var assert = requireNative('assert');" |
| - "var disable = requireNative('disable');" |
| - "disable.DisableNatives();" |
| - "var caught = false;" |
| + "var assert;" |
| "try {" |
| - " requireNative('assert');" |
| + " assert = requireNative('assert');" |
| "} catch (e) {" |
| " caught = true;" |
| "}" |
| - "assert.AssertTrue(caught);"); |
| + "if (assert) {" |
| + " assert.AssertTrue(true);" |
| + "}"); |
| module_system_->Require("test"); |
| + ExpectNoAssertionsMade(); |
| +} |
| + |
| +TEST_F(ModuleSystemTest, TestNativesAreEnabledWithinANativesEnabledScope) { |
| + RegisterModule("test", |
| + "var assert = requireNative('assert');" |
| + "assert.AssertTrue(true);"); |
| + |
| + { |
| + ModuleSystem::NativesEnabledScope natives_enabled(module_system_.get()); |
| + { |
| + ModuleSystem::NativesEnabledScope natives_enabled_inner( |
| + module_system_.get()); |
| + } |
| + module_system_->Require("test"); |
| + } |
| } |
| TEST_F(ModuleSystemTest, TestLazyField) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| RegisterModule("lazy", |
| "exports.x = 5;"); |
| - v8::Handle<v8::Object> object = v8::Object::New(); |
| - v8::Context::GetCurrent()->Global()->Set(v8::String::New("object"), object); |
| + v8::Handle<v8::Object> object = CreateGlobal("object"); |
| module_system_->SetLazyField(object, "blah", "lazy", "x"); |
| @@ -181,3 +215,99 @@ TEST_F(ModuleSystemTest, TestLazyField) { |
| "assert.AssertTrue(object.blah == 5);"); |
| module_system_->Require("test"); |
| } |
| + |
| +TEST_F(ModuleSystemTest, TestLazyFieldYieldingObject) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| + RegisterModule("lazy", |
| + "var object = {};" |
| + "object.__defineGetter__('z', function() { return 1; });" |
| + "object.x = 5;" |
| + "object.y = function() { return 10; };" |
| + "exports.object = object;"); |
| + |
| + v8::Handle<v8::Object> object = CreateGlobal("object"); |
| + |
| + module_system_->SetLazyField(object, "thing", "lazy", "object"); |
| + |
| + RegisterModule("test", |
| + "var assert = requireNative('assert');" |
| + "assert.AssertTrue(object.thing.x == 5);" |
| + "assert.AssertTrue(object.thing.y() == 10);" |
| + "assert.AssertTrue(object.thing.z == 1);" |
| + ); |
| + module_system_->Require("test"); |
| +} |
| + |
| +TEST_F(ModuleSystemTest, TestLazyFieldIsOnlyEvaledOnce) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| + module_system_->RegisterNativeHandler( |
| + "counter", |
| + scoped_ptr<NativeHandler>(new CounterNatives())); |
| + RegisterModule("lazy", |
| + "requireNative('counter').Increment();" |
| + "exports.x = 5;"); |
| + |
| + v8::Handle<v8::Object> object = CreateGlobal("object"); |
| + |
| + module_system_->SetLazyField(object, "x", "lazy", "x"); |
| + |
| + RegisterModule("test", |
| + "var assert = requireNative('assert');" |
| + "var counter = requireNative('counter');" |
| + "assert.AssertTrue(counter.Get() == 0);" |
| + "object.x;" |
| + "assert.AssertTrue(counter.Get() == 1);" |
| + "object.x;" |
| + "assert.AssertTrue(counter.Get() == 1);"); |
| + module_system_->Require("test"); |
| +} |
| + |
| +TEST_F(ModuleSystemTest, TestRequireNativesAfterLazyEvaluation) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| + RegisterModule("lazy", |
| + "exports.x = 5;"); |
| + v8::Handle<v8::Object> object = CreateGlobal("object"); |
| + |
| + module_system_->SetLazyField(object, "x", "lazy", "x"); |
| + RegisterModule("test", |
| + "object.x;" |
| + "requireNative('assert').AssertTrue(true);"); |
| + module_system_->Require("test"); |
| +} |
| + |
| +TEST_F(ModuleSystemTest, TestTransitiveRequire) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| + RegisterModule("dependency", |
| + "exports.x = 5;"); |
| + RegisterModule("lazy", |
| + "exports.output = require('dependency');"); |
| + |
| + v8::Handle<v8::Object> object = CreateGlobal("object"); |
| + |
| + module_system_->SetLazyField(object, "thing", "lazy", "output"); |
| + |
| + RegisterModule("test", |
| + "var assert = requireNative('assert');" |
| + "assert.AssertTrue(object.thing.x == 5);"); |
| + module_system_->Require("test"); |
| +} |
| + |
| +TEST_F(ModuleSystemTest, TestModulesOnlyGetEvaledOnce) { |
| + ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| + module_system_->RegisterNativeHandler( |
| + "counter", |
| + scoped_ptr<NativeHandler>(new CounterNatives())); |
| + |
| + RegisterModule("incrementsWhenEvaled", |
| + "requireNative('counter').Increment();"); |
| + RegisterModule("test", |
| + "var assert = requireNative('assert');" |
| + "var counter = requireNative('counter');" |
| + "assert.AssertTrue(counter.Get() == 0);" |
| + "require('incrementsWhenEvaled');" |
| + "assert.AssertTrue(counter.Get() == 1);" |
| + "require('incrementsWhenEvaled');" |
| + "assert.AssertTrue(counter.Get() == 1);"); |
| + |
| + module_system_->Require("test"); |
| +} |