diff --git a/server/tests/api/check-params/accounts.ts b/server/tests/api/check-params/accounts.ts index 086090533..4f79685bd 100644 --- a/server/tests/api/check-params/accounts.ts +++ b/server/tests/api/check-params/accounts.ts @@ -2,7 +2,7 @@ import 'mocha' -import { flushTests, killallServers, flushAndRunServer, ServerInfo } from '../../../../shared/extra-utils' +import { cleanupTests, flushAndRunServer, ServerInfo } from '../../../../shared/extra-utils' import { checkBadCountPagination, checkBadSortPagination, @@ -42,7 +42,7 @@ describe('Test accounts API validators', function () { }) }) - after(function () { - killallServers([ server ]) + after(async function () { + await cleanupTests([ server ]) }) }) diff --git a/server/tests/api/check-params/blocklist.ts b/server/tests/api/check-params/blocklist.ts index d815a8363..0661676ce 100644 --- a/server/tests/api/check-params/blocklist.ts +++ b/server/tests/api/check-params/blocklist.ts @@ -3,16 +3,16 @@ import 'mocha' import { + cleanupTests, createUser, doubleFollow, flushAndRunMultipleServers, - flushTests, - killallServers, makeDeleteRequest, makeGetRequest, makePostBodyRequest, ServerInfo, - setAccessTokensToServers, userLogin + setAccessTokensToServers, + userLogin } from '../../../../shared/extra-utils' import { checkBadCountPagination, @@ -190,7 +190,7 @@ describe('Test blocklist API validators', function () { url: server.url, token: server.accessToken, path, - fields: { host: 'localhost:9001' }, + fields: { host: 'localhost:' + server.port }, statusCodeExpected: 409 }) }) @@ -200,7 +200,7 @@ describe('Test blocklist API validators', function () { url: server.url, token: server.accessToken, path, - fields: { host: 'localhost:9002' }, + fields: { host: 'localhost:' + servers[1].port }, statusCodeExpected: 204 }) }) @@ -210,7 +210,7 @@ describe('Test blocklist API validators', function () { it('Should fail with an unauthenticated user', async function () { await makeDeleteRequest({ url: server.url, - path: path + '/localhost:9002', + path: path + '/localhost:' + servers[1].port, statusCodeExpected: 401 }) }) @@ -227,7 +227,7 @@ describe('Test blocklist API validators', function () { it('Should succeed with the correct params', async function () { await makeDeleteRequest({ url: server.url, - path: path + '/localhost:9002', + path: path + '/localhost:' + servers[1].port, token: server.accessToken, statusCodeExpected: 204 }) @@ -400,7 +400,7 @@ describe('Test blocklist API validators', function () { await makePostBodyRequest({ url: server.url, path, - fields: { host: 'localhost:9002' }, + fields: { host: 'localhost:' + servers[1].port }, statusCodeExpected: 401 }) }) @@ -410,7 +410,7 @@ describe('Test blocklist API validators', function () { url: server.url, token: userAccessToken, path, - fields: { host: 'localhost:9002' }, + fields: { host: 'localhost:' + servers[1].port }, statusCodeExpected: 403 }) }) @@ -430,7 +430,7 @@ describe('Test blocklist API validators', function () { url: server.url, token: server.accessToken, path, - fields: { host: 'localhost:9001' }, + fields: { host: 'localhost:' + server.port }, statusCodeExpected: 409 }) }) @@ -440,7 +440,7 @@ describe('Test blocklist API validators', function () { url: server.url, token: server.accessToken, path, - fields: { host: 'localhost:9002' }, + fields: { host: 'localhost:' + servers[1].port }, statusCodeExpected: 204 }) }) @@ -450,7 +450,7 @@ describe('Test blocklist API validators', function () { it('Should fail with an unauthenticated user', async function () { await makeDeleteRequest({ url: server.url, - path: path + '/localhost:9002', + path: path + '/localhost:' + servers[1].port, statusCodeExpected: 401 }) }) @@ -458,7 +458,7 @@ describe('Test blocklist API validators', function () { it('Should fail with a user without the appropriate rights', async function () { await makeDeleteRequest({ url: server.url, - path: path + '/localhost:9002', + path: path + '/localhost:' + servers[1].port, token: userAccessToken, statusCodeExpected: 403 }) @@ -476,7 +476,7 @@ describe('Test blocklist API validators', function () { it('Should succeed with the correct params', async function () { await makeDeleteRequest({ url: server.url, - path: path + '/localhost:9002', + path: path + '/localhost:' + servers[1].port, token: server.accessToken, statusCodeExpected: 204 }) @@ -485,7 +485,7 @@ describe('Test blocklist API validators', function () { }) }) - after(function () { - killallServers(servers) + after(async function () { + await cleanupTests(servers) }) }) diff --git a/shared/extra-utils/server/servers.ts b/shared/extra-utils/server/servers.ts index b0cb869f4..480d12330 100644 --- a/shared/extra-utils/server/servers.ts +++ b/shared/extra-utils/server/servers.ts @@ -12,6 +12,10 @@ interface ServerInfo { app: ChildProcess, url: string host: string + + port: number + parallel: boolean + internalServerNumber: number serverNumber: number client: { @@ -76,12 +80,27 @@ function flushTests (serverNumber?: number) { }) } -function flushAndRunServer (serverNumber: number, configOverride?: Object, args = []) { +function randomServer () { + const low = 10 + const high = 10000 + + return Math.floor(Math.random() * (high - low) + low) +} + +function flushAndRunServer (serverNumber: number, configOverrideArg?: Object, args = []) { + const parallel = process.env.MOCHA_PARALLEL === 'true' + + const internalServerNumber = parallel ? randomServer() : serverNumber + const port = 9000 + internalServerNumber + const server: ServerInfo = { app: null, - serverNumber: serverNumber, - url: `http://localhost:${9000 + serverNumber}`, - host: `localhost:${9000 + serverNumber}`, + port, + internalServerNumber, + parallel, + serverNumber: internalServerNumber, + url: `http://localhost:${port}`, + host: `localhost:${port}`, client: { id: null, secret: null @@ -96,7 +115,7 @@ function flushAndRunServer (serverNumber: number, configOverride?: Object, args const serverRunString = { 'Server listening': false } - const key = 'Database peertube_test' + serverNumber + ' is ready' + const key = 'Database peertube_test' + internalServerNumber + ' is ready' serverRunString[key] = false const regexps = { @@ -111,10 +130,44 @@ function flushAndRunServer (serverNumber: number, configOverride?: Object, args env['NODE_ENV'] = 'test' env['NODE_APP_INSTANCE'] = serverNumber.toString() - if (configOverride !== undefined) { - env['NODE_CONFIG'] = JSON.stringify(configOverride) + let configOverride: any = {} + + if (parallel) { + configOverride = { + listen: { + port: port + }, + webserver: { + port: port + }, + database: { + suffix: '_test' + internalServerNumber + }, + storage: { + tmp: `test${internalServerNumber}/tmp/`, + avatars: `test${internalServerNumber}/avatars/`, + videos: `test${internalServerNumber}/videos/`, + streaming_playlists: `test${internalServerNumber}/streaming-playlists/`, + redundancy: `test${internalServerNumber}/redundancy/`, + logs: `test${internalServerNumber}/logs/`, + previews: `test${internalServerNumber}/previews/`, + thumbnails: `test${internalServerNumber}/thumbnails/`, + torrents: `test${internalServerNumber}/torrents/`, + captions: `test${internalServerNumber}/captions/`, + cache: `test${internalServerNumber}/cache/` + }, + admin: { + email: `admin${internalServerNumber}@example.com` + } + } } + if (configOverrideArg !== undefined) { + Object.assign(configOverride, configOverrideArg) + } + + env['NODE_CONFIG'] = JSON.stringify(configOverride) + const options = { silent: true, env: env, @@ -122,7 +175,7 @@ function flushAndRunServer (serverNumber: number, configOverride?: Object, args } return new Promise(res => { - flushTests(serverNumber) + flushTests(internalServerNumber) .then(() => { server.app = fork(join(root(), 'dist', 'server.js'), args, options) @@ -155,8 +208,7 @@ function flushAndRunServer (serverNumber: number, configOverride?: Object, args process.on('exit', () => { try { process.kill(server.app.pid) - } catch { /* empty */ - } + } catch { /* empty */ } }) res(server) @@ -194,6 +246,19 @@ function killallServers (servers: ServerInfo[]) { } } +function cleanupTests (servers: ServerInfo[]) { + killallServers(servers) + + const p: Promise[] = [] + for (const server of servers) { + if (server.parallel) { + p.push(flushTests(server.internalServerNumber)) + } + } + + return Promise.all(p) +} + async function waitUntilLog (server: ServerInfo, str: string, count = 1) { const logfile = join(root(), 'test' + server.serverNumber, 'logs/peertube.log') @@ -213,6 +278,7 @@ export { checkDirectoryIsEmpty, checkTmpIsEmpty, ServerInfo, + cleanupTests, flushAndRunMultipleServers, flushTests, flushAndRunServer,