| Index: test/GlobalJsObject.cpp |
| =================================================================== |
| --- a/test/GlobalJsObject.cpp |
| +++ b/test/GlobalJsObject.cpp |
| @@ -16,6 +16,7 @@ |
| */ |
| #include "BaseJsTest.h" |
| +#include "JsLatch.h" |
| namespace |
| { |
| @@ -26,17 +27,19 @@ |
| TEST_F(GlobalJsObjectTest, SetTimeout) |
| { |
| - jsEngine->Evaluate("setTimeout(function() {foo = 'bar';}, 100)"); |
| - ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); |
| - std::this_thread::sleep_for(std::chrono::milliseconds(200)); |
| + JsTestingLatch latch(engine, "latch"); |
| + jsEngine->Evaluate("setTimeout(function() {foo = 'bar'; latch.Arrive();}, 100)"); |
| + ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); // RACE |
|
Eric
2017/01/19 18:38:07
The race condition in these timeout tests is mostl
|
| + latch.Wait(); |
| ASSERT_EQ("bar", jsEngine->Evaluate("this.foo")->AsString()); |
| } |
| TEST_F(GlobalJsObjectTest, SetTimeoutWithArgs) |
| { |
| - jsEngine->Evaluate("setTimeout(function(s) {foo = s;}, 100, 'foobar')"); |
| - ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); |
| - std::this_thread::sleep_for(std::chrono::milliseconds(200)); |
| + JsTestingLatch latch(engine, "latch"); |
| + jsEngine->Evaluate("setTimeout(function(s) {foo = s; latch.Arrive();}, 100, 'foobar')"); |
| + ASSERT_TRUE(jsEngine->Evaluate("this.foo")->IsUndefined()); // RACE |
| + latch.Wait(); |
| ASSERT_EQ("foobar", jsEngine->Evaluate("this.foo")->AsString()); |
| } |
| @@ -48,9 +51,10 @@ |
| TEST_F(GlobalJsObjectTest, SetMultipleTimeouts) |
| { |
| + JsTestingLatch latch(engine, "latch", 2); // two arrivals |
| jsEngine->Evaluate("foo = []"); |
| - jsEngine->Evaluate("setTimeout(function(s) {foo.push('1');}, 100)"); |
| - jsEngine->Evaluate("setTimeout(function(s) {foo.push('2');}, 150)"); |
| - std::this_thread::sleep_for(std::chrono::milliseconds(200)); |
| + jsEngine->Evaluate("setTimeout(function(s) {foo.push('1'); latch.Arrive();}, 100)"); |
| + jsEngine->Evaluate("setTimeout(function(s) {foo.push('2'); latch.Arrive();}, 150)"); |
| + latch.Wait(); |
| ASSERT_EQ("1,2", jsEngine->Evaluate("this.foo")->AsString()); |
| } |