diff options
Diffstat (limited to 'deps/v8/test/cctest/test-modules.cc')
-rw-r--r-- | deps/v8/test/cctest/test-modules.cc | 185 |
1 files changed, 132 insertions, 53 deletions
diff --git a/deps/v8/test/cctest/test-modules.cc b/deps/v8/test/cctest/test-modules.cc index b61b10bcea..2523b83a16 100644 --- a/deps/v8/test/cctest/test-modules.cc +++ b/deps/v8/test/cctest/test-modules.cc @@ -27,87 +27,166 @@ ScriptOrigin ModuleOrigin(Local<v8::Value> resource_name, Isolate* isolate) { return origin; } -MaybeLocal<Module> FailAlwaysResolveCallback(Local<Context> context, - Local<String> specifier, - Local<Module> referrer) { - Isolate* isolate = context->GetIsolate(); - isolate->ThrowException(v8_str("boom")); - return MaybeLocal<Module>(); -} - -static int g_count = 0; -MaybeLocal<Module> FailOnSecondCallResolveCallback(Local<Context> context, - Local<String> specifier, - Local<Module> referrer) { +static Local<Module> dep1; +static Local<Module> dep2; +MaybeLocal<Module> ResolveCallback(Local<Context> context, + Local<String> specifier, + Local<Module> referrer) { Isolate* isolate = CcTest::isolate(); - if (g_count++ > 0) { - isolate->ThrowException(v8_str("booom")); + if (specifier->StrictEquals(v8_str("./dep1.js"))) { + return dep1; + } else if (specifier->StrictEquals(v8_str("./dep2.js"))) { + return dep2; + } else { + isolate->ThrowException(v8_str("boom")); return MaybeLocal<Module>(); } - Local<String> source_text = v8_str(""); - ScriptOrigin origin = ModuleOrigin(v8_str("module.js"), isolate); - ScriptCompiler::Source source(source_text, origin); - return ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); } -TEST(ModuleInstantiationFailures) { +TEST(ModuleInstantiationFailures1) { Isolate* isolate = CcTest::isolate(); HandleScope scope(isolate); LocalContext env; v8::TryCatch try_catch(isolate); - Local<String> source_text = v8_str( - "import './foo.js';\n" - "export {} from './bar.js';"); - ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate()); - ScriptCompiler::Source source(source_text, origin); - Local<Module> module = - ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); - CHECK_EQ(Module::kUninstantiated, module->GetStatus()); - CHECK_EQ(2, module->GetModuleRequestsLength()); - CHECK(v8_str("./foo.js")->StrictEquals(module->GetModuleRequest(0))); - v8::Location loc = module->GetModuleRequestLocation(0); - CHECK_EQ(0, loc.GetLineNumber()); - CHECK_EQ(7, loc.GetColumnNumber()); - - CHECK(v8_str("./bar.js")->StrictEquals(module->GetModuleRequest(1))); - loc = module->GetModuleRequestLocation(1); - CHECK_EQ(1, loc.GetLineNumber()); - CHECK_EQ(15, loc.GetColumnNumber()); + Local<Module> module; + { + Local<String> source_text = v8_str( + "import './foo.js';\n" + "export {} from './bar.js';"); + ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate()); + ScriptCompiler::Source source(source_text, origin); + module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); + CHECK_EQ(2, module->GetModuleRequestsLength()); + CHECK(v8_str("./foo.js")->StrictEquals(module->GetModuleRequest(0))); + v8::Location loc = module->GetModuleRequestLocation(0); + CHECK_EQ(0, loc.GetLineNumber()); + CHECK_EQ(7, loc.GetColumnNumber()); + CHECK(v8_str("./bar.js")->StrictEquals(module->GetModuleRequest(1))); + loc = module->GetModuleRequestLocation(1); + CHECK_EQ(1, loc.GetLineNumber()); + CHECK_EQ(15, loc.GetColumnNumber()); + } // Instantiation should fail. { v8::TryCatch inner_try_catch(isolate); - CHECK(module->InstantiateModule(env.local(), FailAlwaysResolveCallback) - .IsNothing()); + CHECK(module->InstantiateModule(env.local(), ResolveCallback).IsNothing()); CHECK(inner_try_catch.HasCaught()); CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom"))); - CHECK_EQ(Module::kErrored, module->GetStatus()); - Local<Value> exception = module->GetException(); - CHECK(exception->StrictEquals(v8_str("boom"))); - // TODO(neis): Check object identity. + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); } // Start over again... - module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + { + Local<String> source_text = v8_str( + "import './dep1.js';\n" + "export {} from './bar.js';"); + ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate()); + ScriptCompiler::Source source(source_text, origin); + module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + } + + // dep1.js + { + Local<String> source_text = v8_str(""); + ScriptOrigin origin = ModuleOrigin(v8_str("dep1.js"), CcTest::isolate()); + ScriptCompiler::Source source(source_text, origin); + dep1 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + } - // Instantiation should fail if a sub-module fails to resolve. - g_count = 0; + // Instantiation should fail because a sub-module fails to resolve. { v8::TryCatch inner_try_catch(isolate); - CHECK( - module->InstantiateModule(env.local(), FailOnSecondCallResolveCallback) - .IsNothing()); + CHECK(module->InstantiateModule(env.local(), ResolveCallback).IsNothing()); CHECK(inner_try_catch.HasCaught()); - CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("booom"))); - CHECK_EQ(Module::kErrored, module->GetStatus()); - Local<Value> exception = module->GetException(); - CHECK(exception->StrictEquals(v8_str("booom"))); + CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom"))); + CHECK_EQ(Module::kUninstantiated, module->GetStatus()); } CHECK(!try_catch.HasCaught()); } +TEST(ModuleInstantiationFailures2) { + Isolate* isolate = CcTest::isolate(); + HandleScope scope(isolate); + LocalContext env; + v8::TryCatch try_catch(isolate); + + // root1.js + Local<Module> root; + { + Local<String> source_text = + v8_str("import './dep1.js'; import './dep2.js'"); + ScriptOrigin origin = ModuleOrigin(v8_str("root1.js"), CcTest::isolate()); + ScriptCompiler::Source source(source_text, origin); + root = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + } + + // dep1.js + { + Local<String> source_text = v8_str("export let x = 42"); + ScriptOrigin origin = ModuleOrigin(v8_str("dep1.js"), CcTest::isolate()); + ScriptCompiler::Source source(source_text, origin); + dep1 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + } + + // dep2.js + { + Local<String> source_text = v8_str("import {foo} from './dep3.js'"); + ScriptOrigin origin = ModuleOrigin(v8_str("dep2.js"), CcTest::isolate()); + ScriptCompiler::Source source(source_text, origin); + dep2 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + } + + { + v8::TryCatch inner_try_catch(isolate); + CHECK(root->InstantiateModule(env.local(), ResolveCallback).IsNothing()); + CHECK(inner_try_catch.HasCaught()); + CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom"))); + CHECK_EQ(Module::kUninstantiated, root->GetStatus()); + CHECK_EQ(Module::kUninstantiated, dep1->GetStatus()); + CHECK_EQ(Module::kUninstantiated, dep2->GetStatus()); + } + + // Change dep2.js + { + Local<String> source_text = v8_str("import {foo} from './dep2.js'"); + ScriptOrigin origin = ModuleOrigin(v8_str("dep2.js"), CcTest::isolate()); + ScriptCompiler::Source source(source_text, origin); + dep2 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + } + + { + v8::TryCatch inner_try_catch(isolate); + CHECK(root->InstantiateModule(env.local(), ResolveCallback).IsNothing()); + CHECK(inner_try_catch.HasCaught()); + CHECK(!inner_try_catch.Exception()->StrictEquals(v8_str("boom"))); + CHECK_EQ(Module::kUninstantiated, root->GetStatus()); + CHECK_EQ(Module::kInstantiated, dep1->GetStatus()); + CHECK_EQ(Module::kUninstantiated, dep2->GetStatus()); + } + + // Change dep2.js again + { + Local<String> source_text = v8_str("import {foo} from './dep3.js'"); + ScriptOrigin origin = ModuleOrigin(v8_str("dep2.js"), CcTest::isolate()); + ScriptCompiler::Source source(source_text, origin); + dep2 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked(); + } + + { + v8::TryCatch inner_try_catch(isolate); + CHECK(root->InstantiateModule(env.local(), ResolveCallback).IsNothing()); + CHECK(inner_try_catch.HasCaught()); + CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom"))); + CHECK_EQ(Module::kUninstantiated, root->GetStatus()); + CHECK_EQ(Module::kInstantiated, dep1->GetStatus()); + CHECK_EQ(Module::kUninstantiated, dep2->GetStatus()); + } +} + static MaybeLocal<Module> CompileSpecifierAsModuleResolveCallback( Local<Context> context, Local<String> specifier, Local<Module> referrer) { ScriptOrigin origin = ModuleOrigin(v8_str("module.js"), CcTest::isolate()); |