OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/test/base/module_system_test.h" | |
6 #include "base/memory/scoped_ptr.h" | |
7 #include "chrome/renderer/module_system.h" | |
8 | |
9 class CounterNatives : public NativeHandler { | |
10 public: | |
11 CounterNatives() : counter_(0) { | |
12 RouteFunction("Get", base::Bind(&CounterNatives::Get, | |
13 base::Unretained(this))); | |
14 RouteFunction("Increment", base::Bind(&CounterNatives::Increment, | |
15 base::Unretained(this))); | |
16 } | |
17 | |
18 v8::Handle<v8::Value> Get(const v8::Arguments& args) { | |
19 return v8::Integer::New(counter_); | |
20 } | |
21 | |
22 v8::Handle<v8::Value> Increment(const v8::Arguments& args) { | |
23 counter_++; | |
24 return v8::Undefined(); | |
25 } | |
26 | |
27 private: | |
28 int counter_; | |
29 }; | |
30 | |
31 TEST_F(ModuleSystemTest, TestRequire) { | |
32 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
33 RegisterModule("add", "exports.Add = function(x, y) { return x + y; };"); | |
34 RegisterModule("test", | |
35 "var Add = require('add').Add;" | |
36 "requireNative('assert').AssertTrue(Add(3, 5) == 8);"); | |
37 module_system_->Require("test"); | |
38 } | |
39 | |
40 TEST_F(ModuleSystemTest, TestNestedRequire) { | |
41 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
42 RegisterModule("add", "exports.Add = function(x, y) { return x + y; };"); | |
43 RegisterModule("double", | |
44 "var Add = require('add').Add;" | |
45 "exports.Double = function(x) { return Add(x, x); };"); | |
46 RegisterModule("test", | |
47 "var Double = require('double').Double;" | |
48 "requireNative('assert').AssertTrue(Double(3) == 6);"); | |
49 module_system_->Require("test"); | |
50 } | |
51 | |
52 TEST_F(ModuleSystemTest, TestModuleInsulation) { | |
53 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
54 RegisterModule("x", | |
55 "var x = 10;" | |
56 "exports.X = function() { return x; };"); | |
57 RegisterModule("y", | |
58 "var x = 15;" | |
59 "require('x');" | |
60 "exports.Y = function() { return x; };"); | |
61 RegisterModule("test", | |
62 "var Y = require('y').Y;" | |
63 "var X = require('x').X;" | |
64 "var assert = requireNative('assert');" | |
65 "assert.AssertTrue(!this.hasOwnProperty('x'));" | |
66 "assert.AssertTrue(Y() == 15);" | |
67 "assert.AssertTrue(X() == 10);"); | |
68 module_system_->Require("test"); | |
69 } | |
70 | |
71 TEST_F(ModuleSystemTest, TestNativesAreDisabledOutsideANativesEnabledScope) { | |
72 RegisterModule("test", | |
73 "var assert;" | |
74 "try {" | |
75 " assert = requireNative('assert');" | |
76 "} catch (e) {" | |
77 " caught = true;" | |
78 "}" | |
79 "if (assert) {" | |
80 " assert.AssertTrue(true);" | |
81 "}"); | |
82 module_system_->Require("test"); | |
83 ExpectNoAssertionsMade(); | |
84 } | |
85 | |
86 TEST_F(ModuleSystemTest, TestNativesAreEnabledWithinANativesEnabledScope) { | |
87 RegisterModule("test", | |
88 "var assert = requireNative('assert');" | |
89 "assert.AssertTrue(true);"); | |
90 | |
91 { | |
92 ModuleSystem::NativesEnabledScope natives_enabled(module_system_.get()); | |
93 { | |
94 ModuleSystem::NativesEnabledScope natives_enabled_inner( | |
95 module_system_.get()); | |
96 } | |
97 module_system_->Require("test"); | |
98 } | |
99 } | |
100 | |
101 TEST_F(ModuleSystemTest, TestLazyField) { | |
102 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
103 RegisterModule("lazy", | |
104 "exports.x = 5;"); | |
105 | |
106 v8::Handle<v8::Object> object = CreateGlobal("object"); | |
107 | |
108 module_system_->SetLazyField(object, "blah", "lazy", "x"); | |
109 | |
110 RegisterModule("test", | |
111 "var assert = requireNative('assert');" | |
112 "assert.AssertTrue(object.blah == 5);"); | |
113 module_system_->Require("test"); | |
114 } | |
115 | |
116 TEST_F(ModuleSystemTest, TestLazyFieldYieldingObject) { | |
117 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
118 RegisterModule("lazy", | |
119 "var object = {};" | |
120 "object.__defineGetter__('z', function() { return 1; });" | |
121 "object.x = 5;" | |
122 "object.y = function() { return 10; };" | |
123 "exports.object = object;"); | |
124 | |
125 v8::Handle<v8::Object> object = CreateGlobal("object"); | |
126 | |
127 module_system_->SetLazyField(object, "thing", "lazy", "object"); | |
128 | |
129 RegisterModule("test", | |
130 "var assert = requireNative('assert');" | |
131 "assert.AssertTrue(object.thing.x == 5);" | |
132 "assert.AssertTrue(object.thing.y() == 10);" | |
133 "assert.AssertTrue(object.thing.z == 1);" | |
134 ); | |
135 module_system_->Require("test"); | |
136 } | |
137 | |
138 TEST_F(ModuleSystemTest, TestLazyFieldIsOnlyEvaledOnce) { | |
139 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
140 module_system_->RegisterNativeHandler( | |
141 "counter", | |
142 scoped_ptr<NativeHandler>(new CounterNatives())); | |
143 RegisterModule("lazy", | |
144 "requireNative('counter').Increment();" | |
145 "exports.x = 5;"); | |
146 | |
147 v8::Handle<v8::Object> object = CreateGlobal("object"); | |
148 | |
149 module_system_->SetLazyField(object, "x", "lazy", "x"); | |
150 | |
151 RegisterModule("test", | |
152 "var assert = requireNative('assert');" | |
153 "var counter = requireNative('counter');" | |
154 "assert.AssertTrue(counter.Get() == 0);" | |
155 "object.x;" | |
156 "assert.AssertTrue(counter.Get() == 1);" | |
157 "object.x;" | |
158 "assert.AssertTrue(counter.Get() == 1);"); | |
159 module_system_->Require("test"); | |
160 } | |
161 | |
162 TEST_F(ModuleSystemTest, TestRequireNativesAfterLazyEvaluation) { | |
163 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
164 RegisterModule("lazy", | |
165 "exports.x = 5;"); | |
166 v8::Handle<v8::Object> object = CreateGlobal("object"); | |
167 | |
168 module_system_->SetLazyField(object, "x", "lazy", "x"); | |
169 RegisterModule("test", | |
170 "object.x;" | |
171 "requireNative('assert').AssertTrue(true);"); | |
172 module_system_->Require("test"); | |
173 } | |
174 | |
175 TEST_F(ModuleSystemTest, TestTransitiveRequire) { | |
176 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
177 RegisterModule("dependency", | |
178 "exports.x = 5;"); | |
179 RegisterModule("lazy", | |
180 "exports.output = require('dependency');"); | |
181 | |
182 v8::Handle<v8::Object> object = CreateGlobal("object"); | |
183 | |
184 module_system_->SetLazyField(object, "thing", "lazy", "output"); | |
185 | |
186 RegisterModule("test", | |
187 "var assert = requireNative('assert');" | |
188 "assert.AssertTrue(object.thing.x == 5);"); | |
189 module_system_->Require("test"); | |
190 } | |
191 | |
192 TEST_F(ModuleSystemTest, TestModulesOnlyGetEvaledOnce) { | |
193 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
194 module_system_->RegisterNativeHandler( | |
195 "counter", | |
196 scoped_ptr<NativeHandler>(new CounterNatives())); | |
197 | |
198 RegisterModule("incrementsWhenEvaled", | |
199 "requireNative('counter').Increment();"); | |
200 RegisterModule("test", | |
201 "var assert = requireNative('assert');" | |
202 "var counter = requireNative('counter');" | |
203 "assert.AssertTrue(counter.Get() == 0);" | |
204 "require('incrementsWhenEvaled');" | |
205 "assert.AssertTrue(counter.Get() == 1);" | |
206 "require('incrementsWhenEvaled');" | |
207 "assert.AssertTrue(counter.Get() == 1);"); | |
208 | |
209 module_system_->Require("test"); | |
210 } | |
211 | |
212 TEST_F(ModuleSystemTest, TestOverrideNativeHandler) { | |
213 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
214 OverrideNativeHandler("assert", "exports.AssertTrue = function() {};"); | |
215 RegisterModule("test", "requireNative('assert').AssertTrue(true);"); | |
216 ExpectNoAssertionsMade(); | |
217 module_system_->Require("test"); | |
218 } | |
219 | |
220 TEST_F(ModuleSystemTest, TestOverrideNonExistentNativeHandler) { | |
221 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
222 OverrideNativeHandler("thing", "exports.x = 5;"); | |
223 RegisterModule("test", | |
224 "var assert = requireNative('assert');" | |
225 "assert.AssertTrue(requireNative('thing').x == 5);"); | |
226 module_system_->Require("test"); | |
227 } | |
OLD | NEW |