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()); |
} |