js/core: Fix the flaky serve test by waiting for the removed name
to disappear from the mounttable before calling bind.

Fixes https://github.com/vanadium/issues/issues/518

Change-Id: Ib80b87e9f2f3b7fa67ad23ba6fcc076bf542d2d2
diff --git a/test/integration/test-server-serve.js b/test/integration/test-server-serve.js
index a350567..703efab 100644
--- a/test/integration/test-server-serve.js
+++ b/test/integration/test-server-serve.js
@@ -6,6 +6,8 @@
 var test = require('prova');
 var vanadium = require('../../');
 var config = require('./default-config');
+var Deferred = require('../../src/lib/deferred');
+var promiseWhile = require('../../src/lib/async-helper').promiseWhile;
 var service = {
   changeChannel: function(ctx, serverCall) {
     throw new Error('NotImplemented');
@@ -150,9 +152,33 @@
     .then(function removeSecondName() {
       return server.removeName('bedroom/tv');
     })
-    .then(function bindToRemovedSecondName() {
+    .then(function waitForNameToBeRemoved() {
+      var numTries = 0;
+      function tryBindTo() {
+        numTries++;
+        if (numTries > 5) {
+          return Promise.resolve(false);
+        }
+        var shortCtx = runtime.getContext().withTimeout(200);
+        return runtime.namespace().resolve(shortCtx, 'bedroom/tv')
+        .then(function() {
+          return true;
+        }).catch(function(err) {
+          return false;
+        });
+      }
+      // Resolve every 100ms until the name is removed, or 5 tries are
+      // attempted.
+      return promiseWhile(tryBindTo, function() {
+        var def = new Deferred();
+        setTimeout(function() {
+          def.resolve();
+        }, 100);
+        return def.promise;
+      });
+    }).then(function bindToRemovedSecondName() {
       var shortCtx = runtime.getContext().withTimeout(100);
-      return client.bindTo(shortCtx, 'bedroom/tv')
+      client.bindTo(shortCtx, 'bedroom/tv')
       .then(function verifyRemovedSecondName(a) {
         assert.fail('should not be able to bind to a removed name');
         runtime.close(assert.end);