@@ -660,13 +660,14 @@ TEST_F(EnvironmentTest, NestedMicrotaskQueue) {
660
660
node::InitializeContext (context);
661
661
v8::Context::Scope context_scope (context);
662
662
663
- int callback_calls = 0 ;
663
+ using IntVec = std::vector<int >;
664
+ IntVec callback_calls;
664
665
v8::Local<v8::Function> must_call = v8::Function::New (
665
666
context,
666
667
[](const v8::FunctionCallbackInfo<v8::Value>& info) {
667
- int * callback_calls =
668
- static_cast < int *>( info.Data ().As <v8::External>()->Value ());
669
- * callback_calls |= info[0 ].As <v8::Int32>()->Value ();
668
+ IntVec * callback_calls = static_cast <IntVec*>(
669
+ info.Data ().As <v8::External>()->Value ());
670
+ callback_calls-> push_back ( info[0 ].As <v8::Int32>()->Value () );
670
671
},
671
672
v8::External::New (isolate_, static_cast <void *>(&callback_calls)))
672
673
.ToLocalChecked ();
@@ -683,23 +684,40 @@ TEST_F(EnvironmentTest, NestedMicrotaskQueue) {
683
684
isolate_data, context, {}, {});
684
685
CHECK_NE (nullptr , env);
685
686
686
- node::LoadEnvironment (
687
+ v8::Local<v8::Function> eval_in_env = node::LoadEnvironment (
687
688
env,
688
- " Promise.resolve().then(() => mustCall(1 << 0));\n "
689
+ " mustCall(1);\n "
690
+ " Promise.resolve().then(() => mustCall(2));\n "
689
691
" require('vm').runInNewContext("
690
- " 'Promise.resolve().then(() => mustCall(1 << 1 ))',"
692
+ " 'Promise.resolve().then(() => mustCall(3 ))',"
691
693
" { mustCall },"
692
694
" { microtaskMode: 'afterEvaluate' }"
693
- " );"
695
+ " );\n "
694
696
" require('vm').runInNewContext("
695
- " 'Promise.resolve().then(() => mustCall(1 << 2 ))',"
697
+ " 'Promise.resolve().then(() => mustCall(4 ))',"
696
698
" { mustCall }"
697
- " );" ).ToLocalChecked ();
698
- EXPECT_EQ (callback_calls, 1 << 1 );
699
+ " );\n "
700
+ " setTimeout(() => {"
701
+ " Promise.resolve().then(() => mustCall(5));"
702
+ " }, 10);\n "
703
+ " mustCall(6);\n "
704
+ " return eval;\n " ).ToLocalChecked ().As <v8::Function>();
705
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 }));
706
+ v8::Local<v8::Value> queue_microtask_code = v8::String::NewFromUtf8Literal (
707
+ isolate_, " queueMicrotask(() => mustCall(7));" );
708
+ eval_in_env->Call (context,
709
+ v8::Null (isolate_),
710
+ 1 ,
711
+ &queue_microtask_code).ToLocalChecked ();
712
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 }));
699
713
isolate_->PerformMicrotaskCheckpoint ();
700
- EXPECT_EQ (callback_calls, 1 << 1 );
714
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 }) );
701
715
queue->PerformCheckpoint (isolate_);
702
- EXPECT_EQ (callback_calls, (1 << 0 ) | (1 << 1 ) | (1 << 2 ));
716
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 , 7 }));
717
+
718
+ int exit_code = SpinEventLoop (env).FromJust ();
719
+ EXPECT_EQ (exit_code, 0 );
720
+ EXPECT_EQ (callback_calls, (IntVec { 1 , 3 , 6 , 2 , 4 , 7 , 5 }));
703
721
704
722
node::FreeEnvironment (env);
705
723
node::FreeIsolateData (isolate_data);
0 commit comments