Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Side by Side Diff: test/cctest/test-modules.cc

Issue 2827733002: [modules] Allow resolve-callback to signal failure. (Closed)
Patch Set: Cleanup. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/flags.h" 5 #include "src/flags.h"
6 6
7 #include "test/cctest/cctest.h" 7 #include "test/cctest/cctest.h"
8 8
9 namespace { 9 namespace {
10 10
11 using v8::Context; 11 using v8::Context;
12 using v8::HandleScope; 12 using v8::HandleScope;
13 using v8::Isolate; 13 using v8::Isolate;
14 using v8::Local; 14 using v8::Local;
15 using v8::MaybeLocal; 15 using v8::MaybeLocal;
16 using v8::Module; 16 using v8::Module;
17 using v8::ScriptCompiler; 17 using v8::ScriptCompiler;
18 using v8::ScriptOrigin; 18 using v8::ScriptOrigin;
19 using v8::String; 19 using v8::String;
20 using v8::Value; 20 using v8::Value;
21 21
22 ScriptOrigin ModuleOrigin(Local<v8::Value> resource_name, Isolate* isolate) { 22 ScriptOrigin ModuleOrigin(Local<v8::Value> resource_name, Isolate* isolate) {
23 ScriptOrigin origin(resource_name, Local<v8::Integer>(), Local<v8::Integer>(), 23 ScriptOrigin origin(resource_name, Local<v8::Integer>(), Local<v8::Integer>(),
24 Local<v8::Boolean>(), Local<v8::Integer>(), 24 Local<v8::Boolean>(), Local<v8::Integer>(),
25 Local<v8::Value>(), Local<v8::Boolean>(), 25 Local<v8::Value>(), Local<v8::Boolean>(),
26 Local<v8::Boolean>(), True(isolate)); 26 Local<v8::Boolean>(), True(isolate));
27 return origin; 27 return origin;
28 } 28 }
29 29
30 MaybeLocal<Module> AlwaysEmptyResolveCallback(Local<Context> context, 30 MaybeLocal<Module> FailAlwaysResolveCallback(Local<Context> context,
31 Local<String> specifier, 31 Local<String> specifier,
32 Local<Module> referrer) { 32 Local<Module> referrer) {
33 Isolate* isolate = context->GetIsolate();
34 isolate->ThrowException(v8_str("boom"));
33 return MaybeLocal<Module>(); 35 return MaybeLocal<Module>();
34 } 36 }
35 37
36 static int g_count = 0; 38 static int g_count = 0;
37 MaybeLocal<Module> FailOnSecondCallResolveCallback(Local<Context> context, 39 MaybeLocal<Module> FailOnSecondCallResolveCallback(Local<Context> context,
38 Local<String> specifier, 40 Local<String> specifier,
39 Local<Module> referrer) { 41 Local<Module> referrer) {
40 if (g_count++ > 0) return MaybeLocal<Module>(); 42 Isolate* isolate = CcTest::isolate();
43 if (g_count++ > 0) {
44 isolate->ThrowException(v8_str("booom"));
45 return MaybeLocal<Module>();
46 }
41 Local<String> source_text = v8_str(""); 47 Local<String> source_text = v8_str("");
42 ScriptOrigin origin = ModuleOrigin(v8_str("module.js"), CcTest::isolate()); 48 ScriptOrigin origin = ModuleOrigin(v8_str("module.js"), isolate);
43 ScriptCompiler::Source source(source_text, origin); 49 ScriptCompiler::Source source(source_text, origin);
44 return ScriptCompiler::CompileModule(CcTest::isolate(), &source) 50 return ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
45 .ToLocalChecked();
46 } 51 }
47 52
48 TEST(ModuleInstantiationFailures) { 53 TEST(ModuleInstantiationFailures) {
49 Isolate* isolate = CcTest::isolate(); 54 Isolate* isolate = CcTest::isolate();
50 HandleScope scope(isolate); 55 HandleScope scope(isolate);
51 LocalContext env; 56 LocalContext env;
57 v8::TryCatch try_catch(isolate);
52 58
53 Local<String> source_text = v8_str( 59 Local<String> source_text = v8_str(
54 "import './foo.js';" 60 "import './foo.js';"
55 "export {} from './bar.js';"); 61 "export {} from './bar.js';");
56 ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate()); 62 ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate());
57 ScriptCompiler::Source source(source_text, origin); 63 ScriptCompiler::Source source(source_text, origin);
58 Local<Module> module = 64 Local<Module> module =
59 ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); 65 ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
60 CHECK_EQ(2, module->GetModuleRequestsLength()); 66 CHECK_EQ(2, module->GetModuleRequestsLength());
61 CHECK(v8_str("./foo.js")->StrictEquals(module->GetModuleRequest(0))); 67 CHECK(v8_str("./foo.js")->StrictEquals(module->GetModuleRequest(0)));
62 CHECK(v8_str("./bar.js")->StrictEquals(module->GetModuleRequest(1))); 68 CHECK(v8_str("./bar.js")->StrictEquals(module->GetModuleRequest(1)));
63 69
64 // Instantiation should fail. 70 // Instantiation should fail.
65 CHECK(!module->Instantiate(env.local(), AlwaysEmptyResolveCallback)); 71 {
72 v8::TryCatch inner_try_catch(isolate);
73 CHECK(!module->Instantiate(env.local(), FailAlwaysResolveCallback));
74 CHECK(inner_try_catch.HasCaught());
75 CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom")));
76 }
66 77
67 // Start over again... 78 // Start over again...
68 module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); 79 module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
69 80
70 // Instantiation should fail if a sub-module fails to resolve. 81 // Instantiation should fail if a sub-module fails to resolve.
71 g_count = 0; 82 g_count = 0;
72 CHECK(!module->Instantiate(env.local(), FailOnSecondCallResolveCallback)); 83 {
84 v8::TryCatch inner_try_catch(isolate);
85 CHECK(!module->Instantiate(env.local(), FailOnSecondCallResolveCallback));
86 CHECK(inner_try_catch.HasCaught());
87 CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("booom")));
88 }
89
90 CHECK(!try_catch.HasCaught());
73 } 91 }
74 92
75 static MaybeLocal<Module> CompileSpecifierAsModuleResolveCallback( 93 static MaybeLocal<Module> CompileSpecifierAsModuleResolveCallback(
76 Local<Context> context, Local<String> specifier, Local<Module> referrer) { 94 Local<Context> context, Local<String> specifier, Local<Module> referrer) {
77 ScriptOrigin origin = ModuleOrigin(v8_str("module.js"), CcTest::isolate()); 95 ScriptOrigin origin = ModuleOrigin(v8_str("module.js"), CcTest::isolate());
78 ScriptCompiler::Source source(specifier, origin); 96 ScriptCompiler::Source source(specifier, origin);
79 return ScriptCompiler::CompileModule(CcTest::isolate(), &source) 97 return ScriptCompiler::CompileModule(CcTest::isolate(), &source)
80 .ToLocalChecked(); 98 .ToLocalChecked();
81 } 99 }
82 100
83 TEST(ModuleEvaluation) { 101 TEST(ModuleEvaluation) {
84 Isolate* isolate = CcTest::isolate(); 102 Isolate* isolate = CcTest::isolate();
85 HandleScope scope(isolate); 103 HandleScope scope(isolate);
86 LocalContext env; 104 LocalContext env;
105 v8::TryCatch try_catch(isolate);
87 106
88 Local<String> source_text = v8_str( 107 Local<String> source_text = v8_str(
89 "import 'Object.expando = 5';" 108 "import 'Object.expando = 5';"
90 "import 'Object.expando *= 2';"); 109 "import 'Object.expando *= 2';");
91 ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate()); 110 ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate());
92 ScriptCompiler::Source source(source_text, origin); 111 ScriptCompiler::Source source(source_text, origin);
93 Local<Module> module = 112 Local<Module> module =
94 ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); 113 ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
95 CHECK(module->Instantiate(env.local(), 114 CHECK(module->Instantiate(env.local(),
96 CompileSpecifierAsModuleResolveCallback)); 115 CompileSpecifierAsModuleResolveCallback));
97 CHECK(!module->Evaluate(env.local()).IsEmpty()); 116 CHECK(!module->Evaluate(env.local()).IsEmpty());
98 ExpectInt32("Object.expando", 10); 117 ExpectInt32("Object.expando", 10);
118
119 CHECK(!try_catch.HasCaught());
99 } 120 }
100 121
101 TEST(ModuleEvaluationCompletion1) { 122 TEST(ModuleEvaluationCompletion1) {
102 Isolate* isolate = CcTest::isolate(); 123 Isolate* isolate = CcTest::isolate();
103 HandleScope scope(isolate); 124 HandleScope scope(isolate);
104 LocalContext env; 125 LocalContext env;
126 v8::TryCatch try_catch(isolate);
105 127
106 const char* sources[] = { 128 const char* sources[] = {
107 "", 129 "",
108 "var a = 1", 130 "var a = 1",
109 "import '42'", 131 "import '42'",
110 "export * from '42'", 132 "export * from '42'",
111 "export {} from '42'", 133 "export {} from '42'",
112 "export {}", 134 "export {}",
113 "var a = 1; export {a}", 135 "var a = 1; export {a}",
114 "export function foo() {}", 136 "export function foo() {}",
(...skipping 11 matching lines...) Expand all
126 for (auto src : sources) { 148 for (auto src : sources) {
127 Local<String> source_text = v8_str(src); 149 Local<String> source_text = v8_str(src);
128 ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate()); 150 ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate());
129 ScriptCompiler::Source source(source_text, origin); 151 ScriptCompiler::Source source(source_text, origin);
130 Local<Module> module = 152 Local<Module> module =
131 ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); 153 ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
132 CHECK(module->Instantiate(env.local(), 154 CHECK(module->Instantiate(env.local(),
133 CompileSpecifierAsModuleResolveCallback)); 155 CompileSpecifierAsModuleResolveCallback));
134 CHECK(module->Evaluate(env.local()).ToLocalChecked()->IsUndefined()); 156 CHECK(module->Evaluate(env.local()).ToLocalChecked()->IsUndefined());
135 } 157 }
158
159 CHECK(!try_catch.HasCaught());
136 } 160 }
137 161
138 TEST(ModuleEvaluationCompletion2) { 162 TEST(ModuleEvaluationCompletion2) {
139 Isolate* isolate = CcTest::isolate(); 163 Isolate* isolate = CcTest::isolate();
140 HandleScope scope(isolate); 164 HandleScope scope(isolate);
141 LocalContext env; 165 LocalContext env;
166 v8::TryCatch try_catch(isolate);
142 167
143 const char* sources[] = { 168 const char* sources[] = {
144 "'gaga'; ", 169 "'gaga'; ",
145 "'gaga'; var a = 1", 170 "'gaga'; var a = 1",
146 "'gaga'; import '42'", 171 "'gaga'; import '42'",
147 "'gaga'; export * from '42'", 172 "'gaga'; export * from '42'",
148 "'gaga'; export {} from '42'", 173 "'gaga'; export {} from '42'",
149 "'gaga'; export {}", 174 "'gaga'; export {}",
150 "'gaga'; var a = 1; export {a}", 175 "'gaga'; var a = 1; export {a}",
151 "'gaga'; export function foo() {}", 176 "'gaga'; export function foo() {}",
(...skipping 12 matching lines...) Expand all
164 ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate()); 189 ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate());
165 ScriptCompiler::Source source(source_text, origin); 190 ScriptCompiler::Source source(source_text, origin);
166 Local<Module> module = 191 Local<Module> module =
167 ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); 192 ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
168 CHECK(module->Instantiate(env.local(), 193 CHECK(module->Instantiate(env.local(),
169 CompileSpecifierAsModuleResolveCallback)); 194 CompileSpecifierAsModuleResolveCallback));
170 CHECK(module->Evaluate(env.local()) 195 CHECK(module->Evaluate(env.local())
171 .ToLocalChecked() 196 .ToLocalChecked()
172 ->StrictEquals(v8_str("gaga"))); 197 ->StrictEquals(v8_str("gaga")));
173 } 198 }
199
200 CHECK(!try_catch.HasCaught());
174 } 201 }
175 202
176 } // anonymous namespace 203 } // anonymous namespace
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698