From d4a5d813a3f31ca4de9557114f570a5c100de8a1 Mon Sep 17 00:00:00 2001 From: "Juan Picado @jotadeveloper" Date: Fri, 22 Jun 2018 18:58:40 +0200 Subject: [PATCH] refactor: race condition test --- test/functional/fixtures/package.js | 4 +- test/functional/performance/race.js | 131 +++++++++++++++------------- 2 files changed, 72 insertions(+), 63 deletions(-) diff --git a/test/functional/fixtures/package.js b/test/functional/fixtures/package.js index d794292e2..ad5a23019 100644 --- a/test/functional/fixtures/package.js +++ b/test/functional/fixtures/package.js @@ -1,4 +1,6 @@ -module.exports = function(name, version = '0.0.0', port = '55551', domain= `http://localhost:${port}`) { +import {PORT_SERVER_1} from "../../../src/lib/constants"; + +module.exports = function(name, version = '0.0.0', port = PORT_SERVER_1, domain= `http://localhost:${port}`) { return { name: name, version: version, diff --git a/test/functional/performance/race.js b/test/functional/performance/race.js index a10b463c5..529358698 100644 --- a/test/functional/performance/race.js +++ b/test/functional/performance/race.js @@ -1,115 +1,122 @@ -import assert from 'assert'; import async from 'async'; +import {HTTP_STATUS} from "../../../src/lib/constants"; -let _oksum = 0; +let okTotalSum = 0; const racePkg = require('../fixtures/package'); export default function(server) { - describe('race', () => { + describe('should test race condition on publish packages', () => { + const MAX_COUNT = 20; + const PKG_NAME = 'race'; + const PUBLISHED = 'published'; + const PRESENT = 'already present'; + const UNAVAILABLE = 'unavailable'; + beforeAll(function () { - return server.putPackage('race', racePkg('race')) - .status(201) + return server.putPackage(PKG_NAME, racePkg(PKG_NAME)) + .status(HTTP_STATUS.CREATED) .body_ok(/created new package/); }); test('creating new package', () => {}); - test('uploading 10 same versions', callback => { - let fns = []; - for (let i = 0; i < 10; i++) { - fns.push(function (cb_) { - let data = racePkg('race'); + test('should uploading 10 same versions and ignore 9', callback => { + let listOfRequest = []; + for (let i = 0; i < MAX_COUNT; i++) { + listOfRequest.push(function (callback) { + let data = racePkg(PKG_NAME); data.rand = Math.random(); let _res; - server.putVersion('race', '0.0.1', data) - .response(function (res) { + server.putVersion(PKG_NAME, '0.0.1', data).response(function (res) { _res = res; - }) - .then(function (body) { - cb_(null, [_res, body]); + }).then(function (body) { + callback(null, [_res, body]); }); }); } - async.parallel(fns, function (err, res) { - let okcount = 0; - let failcount = 0; + async.parallel(listOfRequest, function (err, response) { + let okCount = 0; + let failCount = 0; - assert.equal(err, null); + expect(err).toBeNull(); - res.forEach(function (arr) { - let resp = arr[0]; - let body = arr[1]; + response.forEach(function (payload) { + const [resp, body] = payload; - if (resp.statusCode === 201 && ~body.ok.indexOf('published')) { - okcount++; + if (resp.statusCode === HTTP_STATUS.CREATED && ~body.ok.indexOf(PUBLISHED)) { + okCount++; } - if (resp.statusCode === 409 && ~body.error.indexOf('already present')) { - failcount++; + + if (resp.statusCode === HTTP_STATUS.CONFLICT && ~body.error.indexOf(PRESENT)) { + failCount++; } - if (resp.statusCode === 503 && ~body.error.indexOf('unavailable')) { - failcount++; + + if (resp.statusCode === HTTP_STATUS.SERVICE_UNAVAILABLE && ~body.error.indexOf(UNAVAILABLE)) { + failCount++; } }); - assert.equal(okcount + failcount, 10); - assert.equal(okcount, 1); - _oksum += okcount; + expect(okCount + failCount).toEqual(MAX_COUNT); + expect(okCount).toEqual(1); + expect(failCount).toEqual(MAX_COUNT - 1); + okTotalSum += okCount; callback(); }); }); - test('uploading 10 diff versions', callback => { - let fns = []; - for (let i = 0; i < 10; i++) { - (function (i) { - fns.push(function (cb_) { - let _res; - server.putVersion('race', '0.1.' + String(i), require('../fixtures/package')('race')) - .response(function (res) { - _res = res; - }) - .then(function (body) { - cb_(null, [_res, body]); - }); - }); - })(i); + test('shoul uploading 10 diff versions and accept 10', callback => { + const listofRequest = []; + + for (let i = 0; i < MAX_COUNT; i++) { + listofRequest.push(function (callback) { + let _res; + server.putVersion(PKG_NAME, '0.1.' + String(i), racePkg(PKG_NAME)) + .response(function (res) { + _res = res; + }) + .then(function (body) { + callback(null, [_res, body]); + }); + }); } - async.parallel(fns, function (err, res) { + async.parallel(listofRequest, function (err, response) { let okcount = 0; let failcount = 0; - assert.equal(err, null); - res.forEach(function (arr) { - let resp = arr[0]; - let body = arr[1]; - if (resp.statusCode === 201 && ~body.ok.indexOf('published')) { + expect(err).toBeNull(); + response.forEach(function (payload) { + const [response, body] = payload; + + if (response.statusCode === HTTP_STATUS.CREATED && ~body.ok.indexOf(PUBLISHED)) { okcount++; } - if (resp.statusCode === 409 && ~body.error.indexOf('already present')) { + if (response.statusCode === HTTP_STATUS.CONFLICT && ~body.error.indexOf(PRESENT)) { failcount++; } - if (resp.statusCode === 503 && ~body.error.indexOf('unavailable')) { + if (response.statusCode === HTTP_STATUS.SERVICE_UNAVAILABLE && ~body.error.indexOf(UNAVAILABLE)) { failcount++; } }); - assert.equal(okcount + failcount, 10); - assert.notEqual(okcount, 1); - _oksum += okcount; + + expect(okcount + failcount).toEqual(MAX_COUNT); + expect(okcount).toEqual(MAX_COUNT); + expect(failcount).toEqual(0); + // should be more than 1 + expect(okcount).not.toEqual(1); + okTotalSum += okcount; callback(); }); }); - afterAll(function () { - return server.getPackage('race') - .status(200) - .then(function (body) { - assert.equal(Object.keys(body.versions).length, _oksum); + afterAll(function() { + return server.getPackage(PKG_NAME).status(HTTP_STATUS.OK).then(function (body) { + expect(Object.keys(body.versions)).toHaveLength(okTotalSum); }); }); });