From ce09bc0435d1bdc848f43d80531a4f311d6faffb Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Wed, 30 May 2018 14:01:03 -0700 Subject: [PATCH 1/2] Enable browser tests with npm test (#108) * Enable browser tests with npm test * Add chrome-unit script * Add sudo: true to .travis.yml to support chrome testing * Add back a safe amount of parallelism * Fix bug in testserver * Run node tests in script * chrome-unit -> unit --- .scripts/unit.js | 64 +++++++++++++++++++++++++++++ .travis.yml | 4 +- package.json | 11 +++-- test/shared/axiosHttpClientTests.ts | 24 ++--------- testserver/index.ts | 5 +-- 5 files changed, 78 insertions(+), 30 deletions(-) create mode 100644 .scripts/unit.js diff --git a/.scripts/unit.js b/.scripts/unit.js new file mode 100644 index 0000000..d1e7bcd --- /dev/null +++ b/.scripts/unit.js @@ -0,0 +1,64 @@ +const { major } = require("semver"); +const { spawn, exec } = require("child_process"); +const { join } = require("path"); + +const webpackDevServer = spawn(join(__dirname, "../node_modules/.bin/ts-node"), [join(__dirname, "../testserver")], { shell: true }) +function cleanupDevServer() { + webpackDevServer.stderr.destroy(); + webpackDevServer.stdout.destroy(); + webpackDevServer.kill(); +}; + +let mochaRunning = false +const webpackDevServerHandler = (data) => { + if (!mochaRunning) { + mochaRunning = true + + const mochaChromePromise = new Promise((resolve, reject) => { + if (major(process.version) < 8) { + // Skip browser tests in pre-node 8 + resolve(); + } else { + const mochaChromeExecutable = join(__dirname, "../node_modules/.bin/mocha-chrome"); + exec(`${mochaChromeExecutable} http://localhost:3001`, (err, stdout, stderr) => { + if (err) { + reject(err); + } else { + console.log(stdout); + console.error(stderr); + resolve(); + } + }); + } + }); + + const mochaPromise = new Promise((resolve, reject) => { + const mochaExecutable = join(__dirname, "../node_modules/.bin/_mocha"); + const mocha = exec(mochaExecutable, (err, stdout, stderr) => { + if (err) { + reject(err); + } else { + console.log(stdout); + console.error(stderr); + resolve(); + } + }); + }); + + Promise.all([mochaPromise, mochaChromePromise]).then(res => { + cleanupDevServer(); + process.exit(0); + }).catch((err) => { + console.error(err); + cleanupDevServer(); + process.exit(1); + }); + } +} + +webpackDevServer.stderr.on('data', data => { + console.error("webpack dev server error:", data.toString()); +}); + +webpackDevServer.stdout.on('data', webpackDevServerHandler); +webpackDevServer.on('exit', webpackDevServerHandler); diff --git a/.travis.yml b/.travis.yml index 13ae1c3..ad532ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: node_js -sudo: false +sudo: true +addons: + chrome: stable node_js: - "6" - "8" \ No newline at end of file diff --git a/package.json b/package.json index 66e8a9a..f5dc3cb 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "mocha": "^5.1.1", "mocha-chrome": "^1.1.0", "npm-run-all": "^4.1.2", + "semver": "^5.5.0", "should": "5.2.0", "shx": "^0.2.2", "ts-loader": "^4.2.0", @@ -81,16 +82,14 @@ "build:browser": "webpack && node node_modules/uglify-es/bin/uglifyjs --source-map -c -m -o msRestBundle.min.js msRestBundle.js", "watch:node": "tsc -w", "watch:browser": "webpack -w", - "test": "run-p test:tslint test:nodejs-unit", - "test:server": "ts-node testserver", + "test": "run-p test:tslint test:unit", "test:tslint": "tslint -p . -c tslint.json --exclude \"./test/**/*.ts\"", - "test:nodejs-unit": "mocha", - "test:mocha-chrome": "sleep 0.5 && mocha-chrome http://localhost:3001", - "test:chrome-unit": "run-p -r test:server test:mocha-chrome", + "test:unit": "node ./.scripts/unit", + "test:server": "ts-node testserver", "prepare": "npm run build", "publish-preview": "npm test && shx rm -rf dist/test && node ./.scripts/publish", "local": "node ./.scripts/local.js", "preview": "node ./.scripts/preview.js", "latest": "node ./.scripts/latest.js" } -} \ No newline at end of file +} diff --git a/test/shared/axiosHttpClientTests.ts b/test/shared/axiosHttpClientTests.ts index 7e53375..c55f215 100644 --- a/test/shared/axiosHttpClientTests.ts +++ b/test/shared/axiosHttpClientTests.ts @@ -97,19 +97,11 @@ describe("axiosHttpClient", () => { }); it("should allow canceling requests", async function() { - // ensure that a large upload is actually cancelled - this.timeout(2000); - const controller = getAbortController(); - const request = new WebResource(`${baseURL}/fileupload`, "POST", new Uint8Array(1024*1024*100), undefined, undefined, true, controller.signal); + const request = new WebResource(`${baseURL}/fileupload`, "POST", new Uint8Array(1024*1024*10), undefined, undefined, true, controller.signal); const client = new AxiosHttpClient(); const promise = client.sendRequest(request); - await new Promise((resolve) => { - setTimeout(() => { - controller.abort(); - resolve(); - }); - }); + controller.abort(); try { await promise; assert.fail(''); @@ -139,23 +131,15 @@ describe("axiosHttpClient", () => { }); it("should allow canceling multiple requests with one token", async function () { - // ensure that a large upload is actually cancelled - this.timeout(4000); - const controller = getAbortController(); - const buf = new Uint8Array(1024*1024*100); + const buf = new Uint8Array(1024*1024*1); const requests = [ new WebResource(`${baseURL}/fileupload`, "POST", buf, undefined, undefined, true, controller.signal), new WebResource(`${baseURL}/fileupload`, "POST", buf, undefined, undefined, true, controller.signal) ]; const client = new AxiosHttpClient(); const promises = requests.map(r => client.sendRequest(r)); - await new Promise((resolve) => { - setTimeout(() => { - controller.abort(); - resolve(); - }); - }); + controller.abort(); // Ensure each promise is individually rejected for (const promise of promises) { try { diff --git a/testserver/index.ts b/testserver/index.ts index bcd2874..2c9c236 100644 --- a/testserver/index.ts +++ b/testserver/index.ts @@ -17,18 +17,17 @@ app.use(express.static(path.join(__dirname, "../"))); app.use(express.static(path.join(__dirname, "../test/resources/"))); app.post("/fileupload", function(req, res) { - res.status(200); req.pipe(res); }); app.get("/set-cookie", function(req, res) { res.setHeader("Set-Cookie", "data=123456"); - res.end(200); + res.end(); }); app.get("/cookie", function(req, res) { res.setHeader("Cookie", req.header("Cookie")); - res.end(200); + res.end(); }); app.listen(port, function() { From 64401093fc18ac2cc7d20be88bd53ca30db96889 Mon Sep 17 00:00:00 2001 From: Rikki Gibson Date: Wed, 30 May 2018 14:11:29 -0700 Subject: [PATCH 2/2] Show output when test process fails (#116) --- .scripts/unit.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.scripts/unit.js b/.scripts/unit.js index d1e7bcd..b101d6e 100644 --- a/.scripts/unit.js +++ b/.scripts/unit.js @@ -21,11 +21,11 @@ const webpackDevServerHandler = (data) => { } else { const mochaChromeExecutable = join(__dirname, "../node_modules/.bin/mocha-chrome"); exec(`${mochaChromeExecutable} http://localhost:3001`, (err, stdout, stderr) => { + console.log(stdout); + console.error(stderr); if (err) { reject(err); } else { - console.log(stdout); - console.error(stderr); resolve(); } }); @@ -35,11 +35,11 @@ const webpackDevServerHandler = (data) => { const mochaPromise = new Promise((resolve, reject) => { const mochaExecutable = join(__dirname, "../node_modules/.bin/_mocha"); const mocha = exec(mochaExecutable, (err, stdout, stderr) => { + console.log(stdout); + console.error(stderr); if (err) { reject(err); } else { - console.log(stdout); - console.error(stderr); resolve(); } }); @@ -49,7 +49,6 @@ const webpackDevServerHandler = (data) => { cleanupDevServer(); process.exit(0); }).catch((err) => { - console.error(err); cleanupDevServer(); process.exit(1); });