From 9f5e54d3c38280bc1351e8eaae762862a09a6b60 Mon Sep 17 00:00:00 2001 From: Rodrigo Nascimento Date: Tue, 9 Apr 2019 08:54:35 -0300 Subject: [PATCH] Wait port release to finish tests --- .scripts/start.js | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/.scripts/start.js b/.scripts/start.js index 158c43b8a415..7248688c8b76 100644 --- a/.scripts/start.js +++ b/.scripts/start.js @@ -4,16 +4,37 @@ const path = require('path'); const fs = require('fs'); const extend = require('util')._extend; const { exec } = require('child_process'); +const net = require('net'); const processes = []; let exitCode; const baseDir = path.resolve(__dirname, '..'); const srcDir = path.resolve(baseDir); +const isPortTaken = (port) => new Promise((resolve, reject) => { + const tester = net.createServer() + .once('error', (err) => (err.code === 'EADDRINUSE' ? resolve(true) : reject(err))) + .once('listening', () => tester.once('close', () => resolve(false)).close()) + .listen(port); +}); + +const waitPortRelease = (port) => new Promise((resolve, reject) => { + isPortTaken(port).then((taken) => { + if (!taken) { + return resolve(); + } + setTimeout(() => { + waitPortRelease(port).then(resolve).catch(reject); + }, 1000); + }); +}); + const appOptions = { env: { PORT: 3000, ROOT_URL: 'http://localhost:3000', + // MONGO_URL: 'mongodb://localhost:27017/test', + // MONGO_OPLOG_URL: 'mongodb://localhost:27017/local', }, }; @@ -57,7 +78,14 @@ function startProcess(opts, callback) { processes.forEach((p) => p.kill()); if (processes.length === 0) { - process.exit(exitCode); + waitPortRelease(appOptions.env.PORT).then(() => { + console.log(`Port ${ appOptions.env.PORT } was released, exiting with code ${ exitCode }`); + process.exit(exitCode); + }).catch((error) => { + console.error(`Error waiting port ${ appOptions.env.PORT } to be released, exiting with code ${ exitCode }`); + console.error(error); + process.exit(exitCode); + }); } }); processes.push(proc); @@ -67,6 +95,7 @@ function startApp(callback) { startProcess({ name: 'Meteor App', command: 'node /tmp/build-test/bundle/main.js', + // command: 'node .meteor/local/build/main.js', waitForMessage: appOptions.waitForMessage, options: { cwd: srcDir, @@ -79,6 +108,7 @@ function startChimp() { startProcess({ name: 'Chimp', command: 'npm run chimp-test', + // command: 'exit 2', options: { env: Object.assign({}, process.env, { NODE_PATH: `${ process.env.NODE_PATH +