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