@@ -629,13 +629,14 @@ TEST_F(EnvironmentTest, NestedMicrotaskQueue) {
629
629
node::InitializeContext (context);
630
630
v8::Context::Scope context_scope (context);
631
631
632
- int callback_calls = 0 ;
632
+ using IntVec = std::vector<int >;
633
+ IntVec callback_calls;
633
634
v8::Local<v8::Function> must_call = v8::Function::New (
634
635
context,
635
636
[](const v8::FunctionCallbackInfo<v8::Value>& info) {
636
- int * callback_calls =
637
- static_cast < int *>( info.Data ().As <v8::External>()->Value ());
638
- * callback_calls |= info[0 ].As <v8::Int32>()->Value ();
637
+ IntVec * callback_calls = static_cast <IntVec*>(
638
+ info.Data ().As <v8::External>()->Value ());
639
+ callback_calls-> push_back ( info[0 ].As <v8::Int32>()->Value () );
639
640
},
640
641
v8::External::New (isolate_, static_cast <void *>(&callback_calls)))
641
642
.ToLocalChecked ();
@@ -652,23 +653,40 @@ TEST_F(EnvironmentTest, NestedMicrotaskQueue) {
652
653
isolate_data, context, {}, {});
653
654
CHECK_NE (nullptr , env);
654
655
655
- node::LoadEnvironment (
656
+ v8::Local<v8::Function> eval_in_env = node::LoadEnvironment (
656
657
env,
657
- " Promise.resolve().then(() => mustCall(1 << 0));\n "
658
+ " mustCall(1);\n "
659
+ " Promise.resolve().then(() => mustCall(2));\n "
658
660
" require('vm').runInNewContext("
659
- " 'Promise.resolve().then(() => mustCall(1 << 1 ))',"
661
+ " 'Promise.resolve().then(() => mustCall(3 ))',"
660
662
" { mustCall },"
661
663
" { microtaskMode: 'afterEvaluate' }"
662
- " );"
664
+ " );\n "
663
665
" require('vm').runInNewContext("
664
- " 'Promise.resolve().then(() => mustCall(1 << 2 ))',"
666
+ " 'Promise.resolve().then(() => mustCall(4 ))',"
665
667
" { mustCall }"
666
- " );" ).ToLocalChecked ();
667
- EXPECT_EQ (callback_calls, 1 << 1 );
668
+ " );\n "
669
+ " setTimeout(() => {"
670
+ " Promise.resolve().then(() => mustCall(5));"
671
+ " }, 10);\n "
672
+ " mustCall(6);\n "
673
+ " return eval;\n " ).ToLocalChecked ().As <v8::Function>();
674
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 }));
675
+ v8::Local<v8::Value> queue_microtask_code = v8::String::NewFromUtf8Literal (
676
+ isolate_, " queueMicrotask(() => mustCall(7));" );
677
+ eval_in_env->Call (context,
678
+ v8::Null (isolate_),
679
+ 1 ,
680
+ &queue_microtask_code).ToLocalChecked ();
681
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 }));
668
682
isolate_->PerformMicrotaskCheckpoint ();
669
- EXPECT_EQ (callback_calls, 1 << 1 );
683
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 }) );
670
684
queue->PerformCheckpoint (isolate_);
671
- EXPECT_EQ (callback_calls, (1 << 0 ) | (1 << 1 ) | (1 << 2 ));
685
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 , 7 }));
686
+
687
+ int exit_code = SpinEventLoop (env).FromJust ();
688
+ EXPECT_EQ (exit_code, 0 );
689
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 , 7 , 5 }));
672
690
673
691
node::FreeEnvironment (env);
674
692
node::FreeIsolateData (isolate_data);
0 commit comments