Use parallel tests
authorChocobozzz <me@florianbigard.com>
Wed, 24 Apr 2019 09:54:23 +0000 (11:54 +0200)
committerChocobozzz <me@florianbigard.com>
Wed, 24 Apr 2019 14:26:24 +0000 (16:26 +0200)
server/tests/api/check-params/accounts.ts
server/tests/api/check-params/blocklist.ts
shared/extra-utils/server/servers.ts

index 08609053392ae634115c3af81868e77a69592fac..4f79685bdff306c8f7820727cff8ecbfe84cd354 100644 (file)
@@ -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 ])
   })
 })
index d815a83634bc91454fc1b58c120f8d28af8d4286..0661676ce6091bb7d36250767f79e02184d31023 100644 (file)
@@ -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)
   })
 })
index b0cb869f4893ba5561d341017bb72a73948395b6..480d1233083e20d714a83c499bf4bcd6b0132038 100644 (file)
@@ -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<ServerInfo>(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<any>[] = []
+  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,