Browse Source

Use test wrapper exit function

Chocobozzz 5 years ago
parent
commit
7c3b79768b
80 changed files with 425 additions and 383 deletions
  1. 1 1
      .travis.yml
  2. 4 4
      server/tests/api/check-params/config.ts
  3. 8 6
      server/tests/api/check-params/contact-form.ts
  4. 3 3
      server/tests/api/check-params/debug.ts
  5. 9 3
      server/tests/api/check-params/follows.ts
  6. 4 3
      server/tests/api/check-params/jobs.ts
  7. 4 3
      server/tests/api/check-params/logs.ts
  8. 7 6
      server/tests/api/check-params/redundancy.ts
  9. 3 3
      server/tests/api/check-params/search.ts
  10. 12 13
      server/tests/api/check-params/services.ts
  11. 7 8
      server/tests/api/check-params/user-notifications.ts
  12. 13 14
      server/tests/api/check-params/user-subscriptions.ts
  13. 4 4
      server/tests/api/check-params/users.ts
  14. 4 5
      server/tests/api/check-params/video-abuses.ts
  15. 3 2
      server/tests/api/check-params/video-blacklist.ts
  16. 4 5
      server/tests/api/check-params/video-captions.ts
  17. 4 8
      server/tests/api/check-params/video-channels.ts
  18. 3 3
      server/tests/api/check-params/video-comments.ts
  19. 4 5
      server/tests/api/check-params/video-imports.ts
  20. 6 6
      server/tests/api/check-params/video-playlists.ts
  21. 6 6
      server/tests/api/check-params/videos-filter.ts
  22. 4 5
      server/tests/api/check-params/videos-history.ts
  23. 36 24
      server/tests/api/check-params/videos.ts
  24. 3 3
      server/tests/api/notifications/user-notifications.ts
  25. 17 21
      server/tests/api/redundancy/redundancy.ts
  26. 3 3
      server/tests/api/search/search-activitypub-video-channels.ts
  27. 3 3
      server/tests/api/search/search-activitypub-videos.ts
  28. 4 3
      server/tests/api/search/search-videos.ts
  29. 6 6
      server/tests/api/server/config.ts
  30. 12 3
      server/tests/api/server/contact-form.ts
  31. 4 3
      server/tests/api/server/email.ts
  32. 3 3
      server/tests/api/server/follow-constraints.ts
  33. 3 3
      server/tests/api/server/follows-moderation.ts
  34. 3 3
      server/tests/api/server/follows.ts
  35. 3 2
      server/tests/api/server/handle-down.ts
  36. 3 3
      server/tests/api/server/jobs.ts
  37. 10 3
      server/tests/api/server/logs.ts
  38. 4 8
      server/tests/api/server/no-client.ts
  39. 5 23
      server/tests/api/server/reverse-proxy.ts
  40. 3 2
      server/tests/api/server/stats.ts
  41. 12 4
      server/tests/api/server/tracker.ts
  42. 3 2
      server/tests/api/users/blocklist.ts
  43. 3 2
      server/tests/api/users/user-subscriptions.ts
  44. 3 3
      server/tests/api/users/users-multiple-servers.ts
  45. 4 3
      server/tests/api/users/users-verification.ts
  46. 4 5
      server/tests/api/users/users.ts
  47. 3 3
      server/tests/api/videos/multiple-servers.ts
  48. 4 12
      server/tests/api/videos/services.ts
  49. 4 5
      server/tests/api/videos/single-server.ts
  50. 3 2
      server/tests/api/videos/video-abuse.ts
  51. 3 3
      server/tests/api/videos/video-blacklist.ts
  52. 3 3
      server/tests/api/videos/video-captions.ts
  53. 3 3
      server/tests/api/videos/video-change-ownership.ts
  54. 3 2
      server/tests/api/videos/video-channels.ts
  55. 3 5
      server/tests/api/videos/video-comments.ts
  56. 3 2
      server/tests/api/videos/video-description.ts
  57. 3 3
      server/tests/api/videos/video-hls.ts
  58. 3 2
      server/tests/api/videos/video-imports.ts
  59. 4 11
      server/tests/api/videos/video-nsfw.ts
  60. 3 3
      server/tests/api/videos/video-playlists.ts
  61. 3 2
      server/tests/api/videos/video-privacy.ts
  62. 3 2
      server/tests/api/videos/video-schedule-update.ts
  63. 3 3
      server/tests/api/videos/video-transcoder.ts
  64. 3 2
      server/tests/api/videos/videos-filter.ts
  65. 6 5
      server/tests/api/videos/videos-history.ts
  66. 3 3
      server/tests/api/videos/videos-overview.ts
  67. 3 3
      server/tests/api/videos/videos-views-cleaner.ts
  68. 3 2
      server/tests/cli/create-import-video-file-job.ts
  69. 3 2
      server/tests/cli/create-transcoding-job.ts
  70. 3 2
      server/tests/cli/optimize-old-videos.ts
  71. 2 2
      server/tests/cli/peertube.ts
  72. 4 5
      server/tests/cli/reset-password.ts
  73. 6 6
      server/tests/cli/update-host.ts
  74. 4 5
      server/tests/client.ts
  75. 3 2
      server/tests/feeds/feeds.ts
  76. 4 5
      server/tests/misc-endpoints.ts
  77. 7 0
      shared/core-utils/miscs/miscs.ts
  78. 1 1
      shared/extra-utils/miscs/email-child-process.js
  79. 8 4
      shared/extra-utils/miscs/email.ts
  80. 37 14
      shared/extra-utils/server/servers.ts

+ 1 - 1
.travis.yml

@@ -12,7 +12,7 @@ addons:
       - ubuntu-toolchain-r-test
     packages:
       - g++-4.9
-  postgresql: "9.4"
+  postgresql: "9.6"
 
 cache:
   directories:

+ 4 - 4
server/tests/api/check-params/config.ts

@@ -6,7 +6,7 @@ import { CustomConfig } from '../../../../shared/models/server/custom-config.mod
 
 import {
   createUser, flushTests, killallServers, makeDeleteRequest, makeGetRequest, makePutBodyRequest, flushAndRunServer, ServerInfo,
-  setAccessTokensToServers, userLogin, immutableAssign
+  setAccessTokensToServers, userLogin, immutableAssign, cleanupTests
 } from '../../../../shared/extra-utils'
 
 describe('Test config API validators', function () {
@@ -181,7 +181,7 @@ describe('Test config API validators', function () {
     })
 
     it('Should fail if email disabled and signup requires email verification', async function () {
-      // opposite scenario - succcess when enable enabled - covered via tests/api/users/user-verification.ts
+      // opposite scenario - success when enable enabled - covered via tests/api/users/user-verification.ts
       const newUpdateParams = immutableAssign(updateParams, {
         signup: {
           enabled: true,
@@ -229,7 +229,7 @@ describe('Test config API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 8 - 6
server/tests/api/check-params/contact-form.ts

@@ -9,7 +9,7 @@ import {
   reRunServer,
   flushAndRunServer,
   ServerInfo,
-  setAccessTokensToServers
+  setAccessTokensToServers, cleanupTests
 } from '../../../../shared/extra-utils'
 import {
   checkBadCountPagination,
@@ -28,13 +28,14 @@ describe('Test contact form API validators', function () {
     fromEmail: 'toto@example.com',
     body: 'Hello, how are you?'
   }
+  let emailPort: number
 
   // ---------------------------------------------------------------
 
   before(async function () {
     this.timeout(60000)
 
-    await MockSmtpServer.Instance.collectEmails(emails)
+    emailPort = await MockSmtpServer.Instance.collectEmails(emails)
 
     // Email is disabled
     server = await flushAndRunServer(1)
@@ -50,7 +51,7 @@ describe('Test contact form API validators', function () {
     killallServers([ server ])
 
     // Contact form is disabled
-    await reRunServer(server, { smtp: { hostname: 'localhost' }, contact_form: { enabled: false } })
+    await reRunServer(server, { smtp: { hostname: 'localhost', port: emailPort }, contact_form: { enabled: false } })
     await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 409 }))
   })
 
@@ -60,7 +61,7 @@ describe('Test contact form API validators', function () {
     killallServers([ server ])
 
     // Email & contact form enabled
-    await reRunServer(server, { smtp: { hostname: 'localhost' } })
+    await reRunServer(server, { smtp: { hostname: 'localhost', port: emailPort } })
 
     await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, fromEmail: 'badEmail' }))
     await sendContactForm(immutableAssign(defaultBody, { url: server.url, expectedStatus: 400, fromEmail: 'badEmail@' }))
@@ -83,8 +84,9 @@ describe('Test contact form API validators', function () {
     await sendContactForm(immutableAssign(defaultBody, { url: server.url }))
   })
 
-  after(function () {
+  after(async function () {
     MockSmtpServer.Instance.kill()
-    killallServers([ server ])
+
+    // await cleanupTests([ server ])
   })
 })

+ 3 - 3
server/tests/api/check-params/debug.ts

@@ -9,7 +9,7 @@ import {
   flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
-  userLogin
+  userLogin, cleanupTests
 } from '../../../../shared/extra-utils'
 import { makeGetRequest } from '../../../../shared/extra-utils/requests/requests'
 
@@ -65,7 +65,7 @@ describe('Test debug API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 9 - 3
server/tests/api/check-params/follows.ts

@@ -3,7 +3,13 @@
 import 'mocha'
 
 import {
-  createUser, flushTests, killallServers, makeDeleteRequest, makePostBodyRequest, flushAndRunServer, ServerInfo, setAccessTokensToServers,
+  cleanupTests,
+  createUser,
+  flushAndRunServer,
+  makeDeleteRequest,
+  makePostBodyRequest,
+  ServerInfo,
+  setAccessTokensToServers,
   userLogin
 } from '../../../../shared/extra-utils'
 import {
@@ -295,7 +301,7 @@ describe('Test server follows API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 3
server/tests/api/check-params/jobs.ts

@@ -9,7 +9,8 @@ import {
   flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
-  userLogin
+  userLogin,
+  cleanupTests
 } from '../../../../shared/extra-utils'
 import {
   checkBadCountPagination,
@@ -80,7 +81,7 @@ describe('Test jobs API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 3
server/tests/api/check-params/logs.ts

@@ -9,7 +9,8 @@ import {
   flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
-  userLogin
+  userLogin,
+  cleanupTests
 } from '../../../../shared/extra-utils'
 import { makeGetRequest } from '../../../../shared/extra-utils/requests/requests'
 
@@ -104,7 +105,7 @@ describe('Test logs API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 7 - 6
server/tests/api/check-params/redundancy.ts

@@ -3,6 +3,7 @@
 import 'mocha'
 
 import {
+  cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -43,7 +44,7 @@ describe('Test server redundancy API validators', function () {
     it('Should fail with an invalid token', async function () {
       await makePutBodyRequest({
         url: servers[0].url,
-        path: path + '/localhost:9002',
+        path: path + '/localhost:' + servers[1].port,
         fields: { redundancyAllowed: true },
         token: 'fake_token',
         statusCodeExpected: 401
@@ -53,7 +54,7 @@ describe('Test server redundancy API validators', function () {
     it('Should fail if the user is not an administrator', async function () {
       await makePutBodyRequest({
         url: servers[0].url,
-        path: path + '/localhost:9002',
+        path: path + '/localhost:' + servers[1].port,
         fields: { redundancyAllowed: true },
         token: userAccessToken,
         statusCodeExpected: 403
@@ -73,7 +74,7 @@ describe('Test server redundancy API validators', function () {
     it('Should fail without de redundancyAllowed param', async function () {
       await makePutBodyRequest({
         url: servers[0].url,
-        path: path + '/localhost:9002',
+        path: path + '/localhost:' + servers[1].port,
         fields: { blabla: true },
         token: servers[0].accessToken,
         statusCodeExpected: 400
@@ -83,7 +84,7 @@ describe('Test server redundancy API validators', function () {
     it('Should succeed with the correct parameters', async function () {
       await makePutBodyRequest({
         url: servers[0].url,
-        path: path + '/localhost:9002',
+        path: path + '/localhost:' + servers[1].port,
         fields: { redundancyAllowed: true },
         token: servers[0].accessToken,
         statusCodeExpected: 204
@@ -91,7 +92,7 @@ describe('Test server redundancy API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/check-params/search.ts

@@ -2,7 +2,7 @@
 
 import 'mocha'
 
-import { flushTests, immutableAssign, killallServers, makeGetRequest, flushAndRunServer, ServerInfo } from '../../../../shared/extra-utils'
+import { cleanupTests, flushAndRunServer, immutableAssign, makeGetRequest, ServerInfo } from '../../../../shared/extra-utils'
 import {
   checkBadCountPagination,
   checkBadSortPagination,
@@ -144,7 +144,7 @@ describe('Test videos API validator', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 12 - 13
server/tests/api/check-params/services.ts

@@ -3,10 +3,9 @@
 import 'mocha'
 
 import {
-  flushTests,
-  killallServers,
-  makeGetRequest,
+  cleanupTests,
   flushAndRunServer,
+  makeGetRequest,
   ServerInfo,
   setAccessTokensToServers,
   uploadVideo
@@ -40,47 +39,47 @@ describe('Test services API validators', function () {
     })
 
     it('Should fail with an invalid video id', async function () {
-      const embedUrl = 'http://localhost:9001/videos/watch/blabla'
+      const embedUrl = `http://localhost:${server.port}/videos/watch/blabla`
       await checkParamEmbed(server, embedUrl)
     })
 
     it('Should fail with an unknown video', async function () {
-      const embedUrl = 'http://localhost:9001/videos/watch/88fc0165-d1f0-4a35-a51a-3b47f668689c'
+      const embedUrl = `http://localhost:${server.port}/videos/watch/88fc0165-d1f0-4a35-a51a-3b47f668689c`
       await checkParamEmbed(server, embedUrl, 404)
     })
 
     it('Should fail with an invalid path', async function () {
-      const embedUrl = 'http://localhost:9001/videos/watchs/' + server.video.uuid
+      const embedUrl = `http://localhost:${server.port}/videos/watchs/${server.video.uuid}`
 
       await checkParamEmbed(server, embedUrl)
     })
 
     it('Should fail with an invalid max height', async function () {
-      const embedUrl = 'http://localhost:9001/videos/watch/' + server.video.uuid
+      const embedUrl = `http://localhost:${server.port}/videos/watch/${server.video.uuid}`
 
       await checkParamEmbed(server, embedUrl, 400, { maxheight: 'hello' })
     })
 
     it('Should fail with an invalid max width', async function () {
-      const embedUrl = 'http://localhost:9001/videos/watch/' + server.video.uuid
+      const embedUrl = `http://localhost:${server.port}/videos/watch/${server.video.uuid}`
 
       await checkParamEmbed(server, embedUrl, 400, { maxwidth: 'hello' })
     })
 
     it('Should fail with an invalid format', async function () {
-      const embedUrl = 'http://localhost:9001/videos/watch/' + server.video.uuid
+      const embedUrl = `http://localhost:${server.port}/videos/watch/${server.video.uuid}`
 
       await checkParamEmbed(server, embedUrl, 400, { format: 'blabla' })
     })
 
     it('Should fail with a non supported format', async function () {
-      const embedUrl = 'http://localhost:9001/videos/watch/' + server.video.uuid
+      const embedUrl = `http://localhost:${server.port}/videos/watch/${server.video.uuid}`
 
       await checkParamEmbed(server, embedUrl, 501, { format: 'xml' })
     })
 
     it('Should succeed with the correct params', async function () {
-      const embedUrl = 'http://localhost:9001/videos/watch/' + server.video.uuid
+      const embedUrl = `http://localhost:${server.port}/videos/watch/${server.video.uuid}`
       const query = {
         format: 'json',
         maxheight: 400,
@@ -91,8 +90,8 @@ describe('Test services API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })
 

+ 7 - 8
server/tests/api/check-params/user-notifications.ts

@@ -4,13 +4,12 @@ import 'mocha'
 import * as io from 'socket.io-client'
 
 import {
-  flushTests,
+  cleanupTests,
+  flushAndRunServer,
   immutableAssign,
-  killallServers,
   makeGetRequest,
   makePostBodyRequest,
   makePutBodyRequest,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
   wait
@@ -234,7 +233,7 @@ describe('Test user notifications API validators', function () {
 
   describe('When connecting to my notification socket', function () {
     it('Should fail with no token', function (next) {
-      const socket = io('http://localhost:9001/user-notifications', { reconnection: false })
+      const socket = io(`http://localhost:${server.port}/user-notifications`, { reconnection: false })
 
       socket.on('error', () => {
         socket.removeListener('error', this)
@@ -249,7 +248,7 @@ describe('Test user notifications API validators', function () {
     })
 
     it('Should fail with an invalid token', function (next) {
-      const socket = io('http://localhost:9001/user-notifications', {
+      const socket = io(`http://localhost:${server.port}/user-notifications`, {
         query: { accessToken: 'bad_access_token' },
         reconnection: false
       })
@@ -267,7 +266,7 @@ describe('Test user notifications API validators', function () {
     })
 
     it('Should success with the correct token', function (next) {
-      const socket = io('http://localhost:9001/user-notifications', {
+      const socket = io(`http://localhost:${server.port}/user-notifications`, {
         query: { accessToken: server.accessToken },
         reconnection: false
       })
@@ -286,7 +285,7 @@ describe('Test user notifications API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 13 - 14
server/tests/api/check-params/user-subscriptions.ts

@@ -3,13 +3,12 @@
 import 'mocha'
 
 import {
+  cleanupTests,
   createUser,
-  flushTests,
-  killallServers,
+  flushAndRunServer,
   makeDeleteRequest,
   makeGetRequest,
   makePostBodyRequest,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
   userLogin
@@ -113,7 +112,7 @@ describe('Test user subscriptions API validators', function () {
       await makePostBodyRequest({
         url: server.url,
         path,
-        fields: { uri: 'user1_channel@localhost:9001' },
+        fields: { uri: 'user1_channel@localhost:' + server.port },
         statusCodeExpected: 401
       })
     })
@@ -151,7 +150,7 @@ describe('Test user subscriptions API validators', function () {
         url: server.url,
         path,
         token: server.accessToken,
-        fields: { uri: 'user1_channel@localhost:9001' },
+        fields: { uri: 'user1_channel@localhost:' + server.port },
         statusCodeExpected: 204
       })
 
@@ -163,7 +162,7 @@ describe('Test user subscriptions API validators', function () {
     it('Should fail with a non authenticated user', async function () {
       await makeGetRequest({
         url: server.url,
-        path: path + '/user1_channel@localhost:9001',
+        path: path + '/user1_channel@localhost:' + server.port,
         statusCodeExpected: 401
       })
     })
@@ -194,7 +193,7 @@ describe('Test user subscriptions API validators', function () {
     it('Should fail with an unknown subscription', async function () {
       await makeGetRequest({
         url: server.url,
-        path: path + '/root1@localhost:9001',
+        path: path + '/root1@localhost:' + server.port,
         token: server.accessToken,
         statusCodeExpected: 404
       })
@@ -203,7 +202,7 @@ describe('Test user subscriptions API validators', function () {
     it('Should succeed with the correct parameters', async function () {
       await makeGetRequest({
         url: server.url,
-        path: path + '/user1_channel@localhost:9001',
+        path: path + '/user1_channel@localhost:' + server.port,
         token: server.accessToken,
         statusCodeExpected: 200
       })
@@ -243,7 +242,7 @@ describe('Test user subscriptions API validators', function () {
       await makeGetRequest({
         url: server.url,
         path: existPath,
-        query: { 'uris[]': 'coucou@localhost:9001' },
+        query: { 'uris[]': 'coucou@localhost:' + server.port },
         token: server.accessToken,
         statusCodeExpected: 200
       })
@@ -254,7 +253,7 @@ describe('Test user subscriptions API validators', function () {
     it('Should fail with a non authenticated user', async function () {
       await makeDeleteRequest({
         url: server.url,
-        path: path + '/user1_channel@localhost:9001',
+        path: path + '/user1_channel@localhost:' + server.port,
         statusCodeExpected: 401
       })
     })
@@ -285,7 +284,7 @@ describe('Test user subscriptions API validators', function () {
     it('Should fail with an unknown subscription', async function () {
       await makeDeleteRequest({
         url: server.url,
-        path: path + '/root1@localhost:9001',
+        path: path + '/root1@localhost:' + server.port,
         token: server.accessToken,
         statusCodeExpected: 404
       })
@@ -294,14 +293,14 @@ describe('Test user subscriptions API validators', function () {
     it('Should succeed with the correct parameters', async function () {
       await makeDeleteRequest({
         url: server.url,
-        path: path + '/user1_channel@localhost:9001',
+        path: path + '/user1_channel@localhost:' + server.port,
         token: server.accessToken,
         statusCodeExpected: 204
       })
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 4
server/tests/api/check-params/users.ts

@@ -7,6 +7,7 @@ import { UserRole, VideoImport, VideoImportState } from '../../../../shared'
 
 import {
   blockUser,
+  cleanupTests,
   createUser,
   deleteMe,
   flushAndRunServer,
@@ -14,7 +15,6 @@ import {
   getMyUserVideoRating,
   getUsersList,
   immutableAssign,
-  killallServers,
   makeGetRequest,
   makePostBodyRequest,
   makePutBodyRequest,
@@ -713,7 +713,7 @@ describe('Test users API validators', function () {
     })
 
     it('Should fail if we register a user with the same email', async function () {
-      const fields = immutableAssign(baseCorrectParams, { email: 'admin1@example.com' })
+      const fields = immutableAssign(baseCorrectParams, { email: 'admin' + server.internalServerNumber + '@example.com' })
 
       await makePostBodyRequest({
         url: server.url,
@@ -897,7 +897,7 @@ describe('Test users API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server, serverWithRegistrationDisabled ])
+  after(async function () {
+    await cleanupTests([ server, serverWithRegistrationDisabled ])
   })
 })

+ 4 - 5
server/tests/api/check-params/video-abuses.ts

@@ -3,13 +3,12 @@
 import 'mocha'
 
 import {
+  cleanupTests,
   createUser,
   deleteVideoAbuse,
-  flushTests,
-  killallServers,
+  flushAndRunServer,
   makeGetRequest,
   makePostBodyRequest,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
   updateVideoAbuse,
@@ -188,7 +187,7 @@ describe('Test video abuses API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 2
server/tests/api/check-params/video-blacklist.ts

@@ -3,6 +3,7 @@
 import 'mocha'
 
 import {
+  cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -247,7 +248,7 @@ describe('Test video blacklist API validators', function () {
     })
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 4 - 5
server/tests/api/check-params/video-captions.ts

@@ -2,13 +2,12 @@
 
 import 'mocha'
 import {
+  cleanupTests,
   createUser,
-  flushTests,
-  killallServers,
+  flushAndRunServer,
   makeDeleteRequest,
   makeGetRequest,
   makeUploadRequest,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
   uploadVideo,
@@ -269,7 +268,7 @@ describe('Test video captions API validator', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 8
server/tests/api/check-params/video-channels.ts

@@ -4,19 +4,16 @@ import * as chai from 'chai'
 import { omit } from 'lodash'
 import 'mocha'
 import {
+  cleanupTests,
   createUser,
   deleteVideoChannel,
-  flushTests,
+  flushAndRunServer,
   getAccountVideoChannelsList,
-  getMyUserInformation,
-  getVideoChannelsList,
   immutableAssign,
-  killallServers,
   makeGetRequest,
   makePostBodyRequest,
   makePutBodyRequest,
   makeUploadRequest,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
   userLogin
@@ -26,7 +23,6 @@ import {
   checkBadSortPagination,
   checkBadStartPagination
 } from '../../../../shared/extra-utils/requests/check-api-params'
-import { User } from '../../../../shared/models/users'
 import { join } from 'path'
 
 const expect = chai.expect
@@ -310,7 +306,7 @@ describe('Test video channels API validator', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 3
server/tests/api/check-params/video-comments.ts

@@ -3,9 +3,9 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
+  cleanupTests,
   createUser,
   flushAndRunServer,
-  killallServers,
   makeDeleteRequest,
   makeGetRequest,
   makePostBodyRequest,
@@ -258,7 +258,7 @@ describe('Test video comments API validator', function () {
     it('Should return conflict on comment thread add')
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 5
server/tests/api/check-params/video-imports.ts

@@ -5,15 +5,14 @@ import 'mocha'
 import { join } from 'path'
 import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enum'
 import {
+  cleanupTests,
   createUser,
-  flushTests,
+  flushAndRunServer,
   getMyUserInformation,
   immutableAssign,
-  killallServers,
   makeGetRequest,
   makePostBodyRequest,
   makeUploadRequest,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
   updateCustomSubConfig,
@@ -311,7 +310,7 @@ describe('Test video imports API validator', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 6 - 6
server/tests/api/check-params/video-playlists.ts

@@ -3,20 +3,20 @@
 import 'mocha'
 import {
   addVideoInPlaylist,
+  cleanupTests,
   createVideoPlaylist,
   deleteVideoPlaylist,
-  flushTests,
+  flushAndRunServer,
   generateUserAccessToken,
   getAccountPlaylistsListWithToken,
   getVideoPlaylist,
   immutableAssign,
-  killallServers,
   makeGetRequest,
   removeVideoFromPlaylist,
   reorderVideosPlaylist,
-  flushAndRunServer,
   ServerInfo,
-  setAccessTokensToServers, setDefaultVideoChannel,
+  setAccessTokensToServers,
+  setDefaultVideoChannel,
   updateVideoPlaylist,
   updateVideoPlaylistElement,
   uploadVideoAndGetId
@@ -668,7 +668,7 @@ describe('Test video playlists API validator', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 6 - 6
server/tests/api/check-params/videos-filter.ts

@@ -2,14 +2,14 @@
 
 import 'mocha'
 import {
+  cleanupTests,
   createUser,
   createVideoPlaylist,
-  flushTests,
-  killallServers,
-  makeGetRequest,
   flushAndRunServer,
+  makeGetRequest,
   ServerInfo,
-  setAccessTokensToServers, setDefaultVideoChannel,
+  setAccessTokensToServers,
+  setDefaultVideoChannel,
   userLogin
 } from '../../../../shared/extra-utils'
 import { UserRole } from '../../../../shared/models/users'
@@ -129,7 +129,7 @@ describe('Test videos filters', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 5
server/tests/api/check-params/videos-history.ts

@@ -5,12 +5,11 @@ import 'mocha'
 import {
   checkBadCountPagination,
   checkBadStartPagination,
-  flushTests,
-  killallServers,
+  cleanupTests,
+  flushAndRunServer,
   makeGetRequest,
   makePostBodyRequest,
   makePutBodyRequest,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
   uploadVideo
@@ -126,7 +125,7 @@ describe('Test videos history API validator', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 36 - 24
server/tests/api/check-params/videos.ts

@@ -6,16 +6,28 @@ import 'mocha'
 import { join } from 'path'
 import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enum'
 import {
-  createUser, flushTests, getMyUserInformation, getVideo, getVideosList, immutableAssign, killallServers, makeDeleteRequest,
-  makeGetRequest, makeUploadRequest, makePutBodyRequest, removeVideo, uploadVideo,
-  flushAndRunServer, ServerInfo, setAccessTokensToServers, userLogin, updateCustomSubConfig
+  cleanupTests,
+  createUser,
+  flushAndRunServer,
+  getMyUserInformation,
+  getVideo,
+  getVideosList,
+  immutableAssign,
+  makeDeleteRequest,
+  makeGetRequest,
+  makePutBodyRequest,
+  makeUploadRequest,
+  removeVideo,
+  ServerInfo,
+  setAccessTokensToServers,
+  userLogin,
+  root
 } from '../../../../shared/extra-utils'
 import {
   checkBadCountPagination,
   checkBadSortPagination,
   checkBadStartPagination
 } from '../../../../shared/extra-utils/requests/check-api-params'
-import { getAccountsList } from '../../../../shared/extra-utils/users/accounts'
 
 const expect = chai.expect
 
@@ -166,7 +178,7 @@ describe('Test videos API validator', function () {
   describe('When adding a video', function () {
     let baseCorrectParams
     const baseCorrectAttaches = {
-      'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.webm')
+      'videofile': join(root(), 'server', 'tests', 'fixtures', 'video_short.webm')
     }
 
     before(function () {
@@ -326,15 +338,15 @@ describe('Test videos API validator', function () {
       await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
     })
 
-    it('Should fail without an incorrect input file', async function () {
+    it('Should fail with an incorrect input file', async function () {
       const fields = baseCorrectParams
       let attaches = {
-        'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short_fake.webm')
+        'videofile': join(root(), 'server', 'tests', 'fixtures', 'video_short_fake.webm')
       }
       await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
 
       attaches = {
-        'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mkv')
+        'videofile': join(root(), 'server', 'tests', 'fixtures', 'video_short.mkv')
       }
       await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
     })
@@ -342,8 +354,8 @@ describe('Test videos API validator', function () {
     it('Should fail with an incorrect thumbnail file', async function () {
       const fields = baseCorrectParams
       const attaches = {
-        'thumbnailfile': join(__dirname, '..', '..', 'fixtures', 'avatar.png'),
-        'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+        'thumbnailfile': join(root(), 'server', 'tests', 'fixtures', 'avatar.png'),
+        'videofile': join(root(), 'server', 'tests', 'fixtures', 'video_short.mp4')
       }
 
       await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
@@ -352,8 +364,8 @@ describe('Test videos API validator', function () {
     it('Should fail with a big thumbnail file', async function () {
       const fields = baseCorrectParams
       const attaches = {
-        'thumbnailfile': join(__dirname, '..', '..', 'fixtures', 'avatar-big.png'),
-        'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+        'thumbnailfile': join(root(), 'server', 'tests', 'fixtures', 'avatar-big.png'),
+        'videofile': join(root(), 'server', 'tests', 'fixtures', 'video_short.mp4')
       }
 
       await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
@@ -362,8 +374,8 @@ describe('Test videos API validator', function () {
     it('Should fail with an incorrect preview file', async function () {
       const fields = baseCorrectParams
       const attaches = {
-        'previewfile': join(__dirname, '..', '..', 'fixtures', 'avatar.png'),
-        'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+        'previewfile': join(root(), 'server', 'tests', 'fixtures', 'avatar.png'),
+        'videofile': join(root(), 'server', 'tests', 'fixtures', 'video_short.mp4')
       }
 
       await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
@@ -372,8 +384,8 @@ describe('Test videos API validator', function () {
     it('Should fail with a big preview file', async function () {
       const fields = baseCorrectParams
       const attaches = {
-        'previewfile': join(__dirname, '..', '..', 'fixtures', 'avatar-big.png'),
-        'videofile': join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+        'previewfile': join(root(), 'server', 'tests', 'fixtures', 'avatar-big.png'),
+        'videofile': join(root(), 'server', 'tests', 'fixtures', 'video_short.mp4')
       }
 
       await makeUploadRequest({ url: server.url, path: path + '/upload', token: server.accessToken, fields, attaches })
@@ -398,7 +410,7 @@ describe('Test videos API validator', function () {
 
       {
         const attaches = immutableAssign(baseCorrectAttaches, {
-          videofile: join(__dirname, '..', '..', 'fixtures', 'video_short.mp4')
+          videofile: join(root(), 'server', 'tests', 'fixtures', 'video_short.mp4')
         })
 
         await makeUploadRequest({
@@ -413,7 +425,7 @@ describe('Test videos API validator', function () {
 
       {
         const attaches = immutableAssign(baseCorrectAttaches, {
-          videofile: join(__dirname, '..', '..', 'fixtures', 'video_short.ogv')
+          videofile: join(root(), 'server', 'tests', 'fixtures', 'video_short.ogv')
         })
 
         await makeUploadRequest({
@@ -550,7 +562,7 @@ describe('Test videos API validator', function () {
     it('Should fail with an incorrect thumbnail file', async function () {
       const fields = baseCorrectParams
       const attaches = {
-        'thumbnailfile': join(__dirname, '..', '..', 'fixtures', 'avatar.png')
+        'thumbnailfile': join(root(), 'server', 'tests', 'fixtures', 'avatar.png')
       }
 
       await makeUploadRequest({
@@ -566,7 +578,7 @@ describe('Test videos API validator', function () {
     it('Should fail with a big thumbnail file', async function () {
       const fields = baseCorrectParams
       const attaches = {
-        'thumbnailfile': join(__dirname, '..', '..', 'fixtures', 'avatar-big.png')
+        'thumbnailfile': join(root(), 'server', 'tests', 'fixtures', 'avatar-big.png')
       }
 
       await makeUploadRequest({
@@ -582,7 +594,7 @@ describe('Test videos API validator', function () {
     it('Should fail with an incorrect preview file', async function () {
       const fields = baseCorrectParams
       const attaches = {
-        'previewfile': join(__dirname, '..', '..', 'fixtures', 'avatar.png')
+        'previewfile': join(root(), 'server', 'tests', 'fixtures', 'avatar.png')
       }
 
       await makeUploadRequest({
@@ -598,7 +610,7 @@ describe('Test videos API validator', function () {
     it('Should fail with a big preview file', async function () {
       const fields = baseCorrectParams
       const attaches = {
-        'previewfile': join(__dirname, '..', '..', 'fixtures', 'avatar-big.png')
+        'previewfile': join(root(), 'server', 'tests', 'fixtures', 'avatar-big.png')
       }
 
       await makeUploadRequest({
@@ -728,7 +740,7 @@ describe('Test videos API validator', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 3
server/tests/api/notifications/user-notifications.ts

@@ -19,7 +19,7 @@ import {
   userLogin,
   wait,
   getCustomConfig,
-  updateCustomConfig, getVideoThreadComments, getVideoCommentThreads, follow
+  updateCustomConfig, getVideoThreadComments, getVideoCommentThreads, follow, cleanupTests
 } from '../../../../shared/extra-utils'
 import { killallServers, ServerInfo, uploadVideo } from '../../../../shared/extra-utils/index'
 import { setAccessTokensToServers } from '../../../../shared/extra-utils/users/login'
@@ -1295,9 +1295,9 @@ describe('Test users notifications', function () {
     })
   })
 
-  after(function () {
+  after(async function () {
     MockSmtpServer.Instance.kill()
 
-    killallServers(servers)
+    await cleanupTests(servers)
   })
 })

+ 17 - 21
server/tests/api/redundancy/redundancy.ts

@@ -5,7 +5,7 @@ import 'mocha'
 import { VideoDetails } from '../../../../shared/models/videos'
 import {
   checkSegmentHash,
-  checkVideoFilesWereRemoved,
+  checkVideoFilesWereRemoved, cleanupTests,
   doubleFollow,
   flushAndRunMultipleServers,
   getFollowingListPaginationAndSort,
@@ -52,7 +52,7 @@ function checkMagnetWebseeds (file: { magnetUri: string, resolution: { id: numbe
   expect(parsed.urlList).to.have.lengthOf(baseWebseeds.length)
 }
 
-async function runServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) {
+async function flushAndRunServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) {
   const config = {
     transcoding: {
       hls: {
@@ -264,10 +264,6 @@ async function disableRedundancyOnServer1 () {
   expect(server2.following.hostRedundancyAllowed).to.be.false
 }
 
-async function cleanServers () {
-  killallServers(servers)
-}
-
 describe('Test videos redundancy', function () {
 
   describe('With most-views strategy', function () {
@@ -276,7 +272,7 @@ describe('Test videos redundancy', function () {
     before(function () {
       this.timeout(120000)
 
-      return runServers(strategy)
+      return flushAndRunServers(strategy)
     })
 
     it('Should have 1 webseed on the first video', async function () {
@@ -315,8 +311,8 @@ describe('Test videos redundancy', function () {
       await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos', join('playlists', 'hls') ])
     })
 
-    after(function () {
-      return cleanServers()
+    after(async function () {
+      return cleanupTests(servers)
     })
   })
 
@@ -326,7 +322,7 @@ describe('Test videos redundancy', function () {
     before(function () {
       this.timeout(120000)
 
-      return runServers(strategy)
+      return flushAndRunServers(strategy)
     })
 
     it('Should have 1 webseed on the first video', async function () {
@@ -365,8 +361,8 @@ describe('Test videos redundancy', function () {
       await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
     })
 
-    after(function () {
-      return cleanServers()
+    after(async function () {
+      await cleanupTests(servers)
     })
   })
 
@@ -376,7 +372,7 @@ describe('Test videos redundancy', function () {
     before(function () {
       this.timeout(120000)
 
-      return runServers(strategy, { min_views: 3 })
+      return flushAndRunServers(strategy, { min_views: 3 })
     })
 
     it('Should have 1 webseed on the first video', async function () {
@@ -435,8 +431,8 @@ describe('Test videos redundancy', function () {
       }
     })
 
-    after(function () {
-      return cleanServers()
+    after(async function () {
+      await cleanupTests(servers)
     })
   })
 
@@ -468,7 +464,7 @@ describe('Test videos redundancy', function () {
     before(async function () {
       this.timeout(120000)
 
-      await runServers(strategy, { min_lifetime: '7 seconds', min_views: 0 })
+      await flushAndRunServers(strategy, { min_lifetime: '7 seconds', min_views: 0 })
 
       await enableRedundancyOnServer1()
     })
@@ -498,8 +494,8 @@ describe('Test videos redundancy', function () {
       await checkNotContains([ servers[1], servers[2] ], 'http%3A%2F%2Flocalhost%3A9001')
     })
 
-    after(function () {
-      return killallServers([ servers[1], servers[2] ])
+    after(async function () {
+      await cleanupTests(servers)
     })
   })
 
@@ -510,7 +506,7 @@ describe('Test videos redundancy', function () {
     before(async function () {
       this.timeout(120000)
 
-      await runServers(strategy, { min_lifetime: '7 seconds', min_views: 0 })
+      await flushAndRunServers(strategy, { min_lifetime: '7 seconds', min_views: 0 })
 
       await enableRedundancyOnServer1()
 
@@ -569,8 +565,8 @@ describe('Test videos redundancy', function () {
       await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ join('redundancy', 'hls') ])
     })
 
-    after(function () {
-      return cleanServers()
+    after(async function () {
+      await cleanupTests(servers)
     })
   })
 })

+ 3 - 3
server/tests/api/search/search-activitypub-video-channels.ts

@@ -3,7 +3,7 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
-  addVideoChannel,
+  addVideoChannel, cleanupTests,
   createUser,
   deleteVideoChannel,
   flushAndRunMultipleServers,
@@ -205,7 +205,7 @@ describe('Test a ActivityPub video channels search', function () {
     expect(res.body.data).to.have.lengthOf(0)
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/search/search-activitypub-videos.ts

@@ -15,7 +15,7 @@ import {
   updateVideo,
   uploadVideo,
   wait,
-  searchVideo
+  searchVideo, cleanupTests
 } from '../../../../shared/extra-utils'
 import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
 import { Video, VideoPrivacy } from '../../../../shared/models/videos'
@@ -149,7 +149,7 @@ describe('Test a ActivityPub videos search', function () {
     expect(res.body.data).to.have.lengthOf(0)
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 4 - 3
server/tests/api/search/search-videos.ts

@@ -12,7 +12,8 @@ import {
   setAccessTokensToServers,
   uploadVideo,
   wait,
-  immutableAssign
+  immutableAssign,
+  cleanupTests
 } from '../../../../shared/extra-utils'
 
 const expect = chai.expect
@@ -405,7 +406,7 @@ describe('Test a videos search', function () {
     }
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 6 - 6
server/tests/api/server/config.ts

@@ -5,15 +5,15 @@ import * as chai from 'chai'
 import { About } from '../../../../shared/models/server/about.model'
 import { CustomConfig } from '../../../../shared/models/server/custom-config.model'
 import {
+  cleanupTests,
   deleteCustomConfig,
+  flushAndRunServer,
   getAbout,
-  killallServers,
-  reRunServer,
-  flushTests,
   getConfig,
   getCustomConfig,
+  killallServers,
   registerUser,
-  flushAndRunServer,
+  reRunServer,
   setAccessTokensToServers,
   updateCustomConfig
 } from '../../../../shared/extra-utils'
@@ -300,7 +300,7 @@ describe('Test config', function () {
     checkInitialConfig(data)
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 12 - 3
server/tests/api/server/contact-form.ts

@@ -2,7 +2,15 @@
 
 import * as chai from 'chai'
 import 'mocha'
-import { flushTests, killallServers, flushAndRunServer, ServerInfo, setAccessTokensToServers, wait } from '../../../../shared/extra-utils'
+import {
+  flushTests,
+  killallServers,
+  flushAndRunServer,
+  ServerInfo,
+  setAccessTokensToServers,
+  wait,
+  cleanupTests
+} from '../../../../shared/extra-utils'
 import { MockSmtpServer } from '../../../../shared/extra-utils/miscs/email'
 import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
 import { sendContactForm } from '../../../../shared/extra-utils/server/contact-form'
@@ -78,8 +86,9 @@ describe('Test contact form', function () {
     })
   })
 
-  after(function () {
+  after(async function () {
     MockSmtpServer.Instance.kill()
-    killallServers([ server ])
+
+    await cleanupTests([ server ])
   })
 })

+ 4 - 3
server/tests/api/server/email.ts

@@ -18,7 +18,7 @@ import {
   flushTests,
   killallServers,
   ServerInfo,
-  setAccessTokensToServers
+  setAccessTokensToServers, cleanupTests
 } from '../../../../shared/extra-utils'
 import { MockSmtpServer } from '../../../../shared/extra-utils/miscs/email'
 import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
@@ -256,8 +256,9 @@ describe('Test emails', function () {
     })
   })
 
-  after(function () {
+  after(async function () {
     MockSmtpServer.Instance.kill()
-    killallServers([ server ])
+
+    await cleanupTests([ server ])
   })
 })

+ 3 - 3
server/tests/api/server/follow-constraints.ts

@@ -12,7 +12,7 @@ import {
   killallServers,
   ServerInfo,
   setAccessTokensToServers,
-  uploadVideo
+  uploadVideo, cleanupTests
 } from '../../../../shared/extra-utils'
 import { unfollow } from '../../../../shared/extra-utils/server/follows'
 import { userLogin } from '../../../../shared/extra-utils/users/login'
@@ -219,7 +219,7 @@ describe('Test follow constraints', function () {
     })
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/server/follows-moderation.ts

@@ -3,7 +3,7 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
-  acceptFollower,
+  acceptFollower, cleanupTests,
   flushAndRunMultipleServers,
   killallServers,
   ServerInfo,
@@ -189,7 +189,7 @@ describe('Test follows moderation', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/server/follows.ts

@@ -4,7 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import { Video, VideoPrivacy } from '../../../../shared/models/videos'
 import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
-import { completeVideoCheck } from '../../../../shared/extra-utils'
+import { cleanupTests, completeVideoCheck } from '../../../../shared/extra-utils'
 import {
   flushAndRunMultipleServers,
   getVideosList,
@@ -435,7 +435,7 @@ describe('Test follows', function () {
 
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/api/server/handle-down.ts

@@ -7,6 +7,7 @@ import { VideoPrivacy } from '../../../../shared/models/videos'
 import { VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
 
 import {
+  cleanupTests,
   completeVideoCheck,
   flushAndRunMultipleServers,
   getVideo,
@@ -296,7 +297,7 @@ describe('Test handle downs', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/server/jobs.ts

@@ -2,7 +2,7 @@
 
 import * as chai from 'chai'
 import 'mocha'
-import { killallServers, ServerInfo, setAccessTokensToServers } from '../../../../shared/extra-utils/index'
+import { cleanupTests, killallServers, ServerInfo, setAccessTokensToServers } from '../../../../shared/extra-utils/index'
 import { doubleFollow } from '../../../../shared/extra-utils/server/follows'
 import { getJobsList, getJobsListPaginationAndSort, waitJobs } from '../../../../shared/extra-utils/server/jobs'
 import { flushAndRunMultipleServers } from '../../../../shared/extra-utils/server/servers'
@@ -56,7 +56,7 @@ describe('Test jobs', function () {
     expect(dateIsValid(job.finishedOn)).to.be.true
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 10 - 3
server/tests/api/server/logs.ts

@@ -2,7 +2,14 @@
 
 import * as chai from 'chai'
 import 'mocha'
-import { flushTests, killallServers, flushAndRunServer, ServerInfo, setAccessTokensToServers } from '../../../../shared/extra-utils/index'
+import {
+  flushTests,
+  killallServers,
+  flushAndRunServer,
+  ServerInfo,
+  setAccessTokensToServers,
+  cleanupTests
+} from '../../../../shared/extra-utils/index'
 import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
 import { uploadVideo } from '../../../../shared/extra-utils/videos/videos'
 import { getLogs } from '../../../../shared/extra-utils/logs/logs'
@@ -84,7 +91,7 @@ describe('Test logs', function () {
     }
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 8
server/tests/api/server/no-client.ts

@@ -1,11 +1,7 @@
 import 'mocha'
 import * as request from 'supertest'
-import {
-  flushTests,
-  killallServers,
-  ServerInfo
-} from '../../../../shared/extra-utils'
-import { flushAndRunServer } from '../../../../shared/extra-utils/server/servers'
+import { ServerInfo } from '../../../../shared/extra-utils'
+import { cleanupTests, flushAndRunServer } from '../../../../shared/extra-utils/server/servers'
 
 describe('Start and stop server without web client routes', function () {
   let server: ServerInfo
@@ -23,7 +19,7 @@ describe('Start and stop server without web client routes', function () {
     return req.expect(404)
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 5 - 23
server/tests/api/server/reverse-proxy.ts

@@ -2,28 +2,10 @@
 
 import 'mocha'
 import * as chai from 'chai'
-import { About } from '../../../../shared/models/server/about.model'
-import { CustomConfig } from '../../../../shared/models/server/custom-config.model'
-import {
-  deleteCustomConfig,
-  getAbout,
-  getVideo,
-  killallServers,
-  login,
-  reRunServer,
-  uploadVideo,
-  userLogin,
-  viewVideo,
-  wait
-} from '../../../../shared/extra-utils'
-const expect = chai.expect
+import { cleanupTests, getVideo, uploadVideo, userLogin, viewVideo, wait } from '../../../../shared/extra-utils'
+import { flushAndRunServer, setAccessTokensToServers } from '../../../../shared/extra-utils/index'
 
-import {
-  getConfig,
-  flushTests,
-  flushAndRunServer,
-  registerUser, getCustomConfig, setAccessTokensToServers, updateCustomConfig
-} from '../../../../shared/extra-utils/index'
+const expect = chai.expect
 
 describe('Test application behind a reverse proxy', function () {
   let server = null
@@ -100,7 +82,7 @@ describe('Test application behind a reverse proxy', function () {
     await userLogin(server, user, 429)
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 2
server/tests/api/server/stats.ts

@@ -4,6 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import { ServerStats } from '../../../../shared/models/server/server-stats.model'
 import {
+  cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -95,7 +96,7 @@ describe('Test stats (excluding redundancy)', function () {
     expect(data.totalInstanceFollowers).to.equal(0)
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 12 - 4
server/tests/api/server/tracker.ts

@@ -2,8 +2,16 @@
 
 import * as magnetUtil from 'magnet-uri'
 import 'mocha'
-import { getVideo, killallServers, reRunServer, flushAndRunServer, ServerInfo, uploadVideo } from '../../../../shared/extra-utils'
-import { flushTests, setAccessTokensToServers } from '../../../../shared/extra-utils/index'
+import {
+  cleanupTests,
+  flushAndRunServer,
+  getVideo,
+  killallServers,
+  reRunServer,
+  ServerInfo,
+  uploadVideo
+} from '../../../../shared/extra-utils'
+import { setAccessTokensToServers } from '../../../../shared/extra-utils/index'
 import { VideoDetails } from '../../../../shared/models/videos'
 import * as WebTorrent from 'webtorrent'
 
@@ -82,7 +90,7 @@ describe('Test tracker', function () {
       })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 2
server/tests/api/users/blocklist.ts

@@ -4,6 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import { AccountBlock, ServerBlock, Video } from '../../../../shared/index'
 import {
+  cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -498,7 +499,7 @@ describe('Test blocklist', function () {
     })
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/api/users/user-subscriptions.ts

@@ -3,6 +3,7 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
+  cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -368,7 +369,7 @@ describe('Test users subscriptions', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/users/users-multiple-servers.ts

@@ -5,7 +5,7 @@ import 'mocha'
 import { Account } from '../../../../shared/models/actors'
 import {
   checkTmpIsEmpty,
-  checkVideoFilesWereRemoved,
+  checkVideoFilesWereRemoved, cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -235,7 +235,7 @@ describe('Test users with multiple servers', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 4 - 3
server/tests/api/users/users-verification.ts

@@ -4,7 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import {
   registerUser, flushTests, getUserInformation, getMyUserInformation, killallServers,
-  userLogin, login, flushAndRunServer, ServerInfo, verifyEmail, updateCustomSubConfig, wait
+  userLogin, login, flushAndRunServer, ServerInfo, verifyEmail, updateCustomSubConfig, wait, cleanupTests
 } from '../../../../shared/extra-utils'
 import { setAccessTokensToServers } from '../../../../shared/extra-utils/users/login'
 import { MockSmtpServer } from '../../../../shared/extra-utils/miscs/email'
@@ -120,8 +120,9 @@ describe('Test users account verification', function () {
     await userLogin(server, user2)
   })
 
-  after(function () {
+  after(async function () {
     MockSmtpServer.Instance.kill()
-    killallServers([ server ])
+
+    await cleanupTests([ server ])
   })
 })

+ 4 - 5
server/tests/api/users/users.ts

@@ -5,9 +5,10 @@ import 'mocha'
 import { User, UserRole } from '../../../../shared/index'
 import {
   blockUser,
+  cleanupTests,
   createUser,
   deleteMe,
-  flushTests,
+  flushAndRunServer,
   getAccountRatings,
   getBlacklistedVideosList,
   getMyUserInformation,
@@ -17,14 +18,12 @@ import {
   getUsersList,
   getUsersListPaginationAndSort,
   getVideosList,
-  killallServers,
   login,
   makePutBodyRequest,
   rateVideo,
   registerUser,
   removeUser,
   removeVideo,
-  flushAndRunServer,
   ServerInfo,
   testImage,
   unblockUser,
@@ -677,7 +676,7 @@ describe('Test users', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 3
server/tests/api/videos/multiple-servers.ts

@@ -9,7 +9,7 @@ import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/
 import {
   addVideoChannel,
   checkTmpIsEmpty,
-  checkVideoFilesWereRemoved,
+  checkVideoFilesWereRemoved, cleanupTests,
   completeVideoCheck,
   createUser,
   dateIsValid,
@@ -1029,7 +1029,7 @@ describe('Test multiple servers', function () {
     })
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 4 - 12
server/tests/api/videos/services.ts

@@ -2,16 +2,8 @@
 
 import * as chai from 'chai'
 import 'mocha'
-import {
-  flushTests,
-  getOEmbed,
-  getVideosList,
-  killallServers,
-  ServerInfo,
-  setAccessTokensToServers,
-  uploadVideo
-} from '../../../../shared/extra-utils/index'
-import { flushAndRunServer } from '../../../../shared/extra-utils/server/servers'
+import { getOEmbed, getVideosList, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../../../shared/extra-utils/index'
+import { cleanupTests, flushAndRunServer } from '../../../../shared/extra-utils/server/servers'
 
 const expect = chai.expect
 
@@ -74,7 +66,7 @@ describe('Test services', function () {
     expect(res.body).to.not.have.property('thumbnail_height')
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 5
server/tests/api/videos/single-server.ts

@@ -6,8 +6,9 @@ import 'mocha'
 import { VideoPrivacy } from '../../../../shared/models/videos'
 import {
   checkVideoFilesWereRemoved,
+  cleanupTests,
   completeVideoCheck,
-  flushTests,
+  flushAndRunServer,
   getVideo,
   getVideoCategories,
   getVideoLanguages,
@@ -17,10 +18,8 @@ import {
   getVideosListPagination,
   getVideosListSort,
   getVideosWithFilters,
-  killallServers,
   rateVideo,
   removeVideo,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
   testImage,
@@ -424,7 +423,7 @@ describe('Test a single server', function () {
     expect(video.dislikes).to.equal(1)
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 2
server/tests/api/videos/video-abuse.ts

@@ -4,6 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import { VideoAbuse, VideoAbuseState } from '../../../../shared/models/videos'
 import {
+  cleanupTests,
   deleteVideoAbuse,
   flushAndRunMultipleServers,
   getVideoAbusesList,
@@ -172,7 +173,7 @@ describe('Test video abuses', function () {
     expect(res.body.data.length).to.equal(0)
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/videos/video-blacklist.ts

@@ -4,7 +4,7 @@ import * as chai from 'chai'
 import { orderBy } from 'lodash'
 import 'mocha'
 import {
-  addVideoToBlacklist,
+  addVideoToBlacklist, cleanupTests,
   createUser,
   flushAndRunMultipleServers,
   getBlacklistedVideosList,
@@ -425,7 +425,7 @@ describe('Test video blacklist', function () {
     })
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/videos/video-captions.ts

@@ -3,7 +3,7 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
-  checkVideoFilesWereRemoved,
+  checkVideoFilesWereRemoved, cleanupTests,
   doubleFollow,
   flushAndRunMultipleServers,
   removeVideo,
@@ -195,7 +195,7 @@ describe('Test video captions', function () {
     await checkVideoFilesWereRemoved(videoUUID, 1)
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/videos/video-change-ownership.ts

@@ -4,7 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import {
   acceptChangeOwnership,
-  changeVideoOwnership,
+  changeVideoOwnership, cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -297,7 +297,7 @@ describe('Test video change ownership - quota too small', function () {
     await acceptChangeOwnership(server.url, secondUserAccessToken, lastRequestChangeOwnershipId, channelId, 403)
   })
 
-  after(function () {
-    killallServers([server])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 2
server/tests/api/videos/video-channels.ts

@@ -4,6 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import { User, Video } from '../../../../shared/index'
 import {
+  cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -277,7 +278,7 @@ describe('Test video channels', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 5
server/tests/api/videos/video-comments.ts

@@ -3,11 +3,9 @@
 import * as chai from 'chai'
 import 'mocha'
 import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model'
-import { testImage } from '../../../../shared/extra-utils'
+import { cleanupTests, testImage } from '../../../../shared/extra-utils'
 import {
   dateIsValid,
-  flushTests,
-  killallServers,
   flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
@@ -199,7 +197,7 @@ describe('Test video comments', function () {
     expect(res.body.data[1].totalReplies).to.equal(0)
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 2
server/tests/api/videos/video-description.ts

@@ -3,6 +3,7 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
+  cleanupTests,
   flushAndRunMultipleServers,
   getVideo,
   getVideoDescription,
@@ -99,7 +100,7 @@ describe('Test video description', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/videos/video-hls.ts

@@ -5,7 +5,7 @@ import 'mocha'
 import {
   checkDirectoryIsEmpty,
   checkSegmentHash,
-  checkTmpIsEmpty,
+  checkTmpIsEmpty, cleanupTests,
   doubleFollow,
   flushAndRunMultipleServers,
   flushTests,
@@ -128,7 +128,7 @@ describe('Test HLS videos', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/api/videos/video-imports.ts

@@ -4,6 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import { VideoDetails, VideoImport, VideoPrivacy } from '../../../../shared/models/videos'
 import {
+  cleanupTests,
   doubleFollow,
   flushAndRunMultipleServers,
   getMyUserInformation,
@@ -241,7 +242,7 @@ describe('Test video imports', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 4 - 11
server/tests/api/videos/video-nsfw.ts

@@ -2,25 +2,18 @@
 
 import * as chai from 'chai'
 import 'mocha'
-import {
-  flushTests,
-  getVideosList,
-  killallServers,
-  ServerInfo,
-  setAccessTokensToServers,
-  uploadVideo
-} from '../../../../shared/extra-utils/index'
+import { cleanupTests, getVideosList, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../../../shared/extra-utils/index'
 import { userLogin } from '../../../../shared/extra-utils/users/login'
 import { createUser } from '../../../../shared/extra-utils/users/users'
 import { getMyVideos } from '../../../../shared/extra-utils/videos/videos'
 import {
+  flushAndRunServer,
   getAccountVideos,
   getConfig,
   getCustomConfig,
   getMyUserInformation,
   getVideoChannelVideos,
   getVideosListWithToken,
-  flushAndRunServer,
   searchVideo,
   searchVideoWithToken,
   updateCustomConfig,
@@ -241,7 +234,7 @@ describe('Test video NSFW policy', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 3
server/tests/api/videos/video-playlists.ts

@@ -5,7 +5,7 @@ import 'mocha'
 import {
   addVideoChannel,
   addVideoInPlaylist,
-  checkPlaylistFilesWereRemoved,
+  checkPlaylistFilesWereRemoved, cleanupTests,
   createUser,
   createVideoPlaylist,
   deleteVideoChannel,
@@ -860,7 +860,7 @@ describe('Test video playlists', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/api/videos/video-privacy.ts

@@ -4,6 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enum'
 import {
+  cleanupTests,
   flushAndRunMultipleServers,
   getVideosList,
   killallServers,
@@ -152,7 +153,7 @@ describe('Test video privacy', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/api/videos/video-schedule-update.ts

@@ -4,6 +4,7 @@ import * as chai from 'chai'
 import 'mocha'
 import { VideoPrivacy } from '../../../../shared/models/videos'
 import {
+  cleanupTests,
   doubleFollow,
   flushAndRunMultipleServers,
   getMyVideos,
@@ -165,7 +166,7 @@ describe('Test video update scheduler', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 3
server/tests/api/videos/video-transcoder.ts

@@ -6,7 +6,7 @@ import { omit } from 'lodash'
 import { getMaxBitrate, VideoDetails, VideoResolution, VideoState } from '../../../../shared/models/videos'
 import { audio, getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils'
 import {
-  buildAbsoluteFixturePath,
+  buildAbsoluteFixturePath, cleanupTests,
   doubleFollow,
   flushAndRunMultipleServers,
   generateHighBitrateVideo,
@@ -349,7 +349,7 @@ describe('Test video transcoding', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/api/videos/videos-filter.ts

@@ -3,6 +3,7 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
+  cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -119,7 +120,7 @@ describe('Test videos filter validator', function () {
     })
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 6 - 5
server/tests/api/videos/videos-history.ts

@@ -3,12 +3,13 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
+  cleanupTests,
   createUser,
-  flushTests,
+  flushAndRunServer,
   getVideosListWithToken,
   getVideoWithToken,
-  killallServers, reRunServer,
-  flushAndRunServer,
+  killallServers,
+  reRunServer,
   searchVideoWithToken,
   ServerInfo,
   setAccessTokensToServers,
@@ -220,7 +221,7 @@ describe('Test videos history', function () {
     expect(res.body.total).to.equal(0)
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 3
server/tests/api/videos/videos-overview.ts

@@ -2,7 +2,7 @@
 
 import * as chai from 'chai'
 import 'mocha'
-import { flushAndRunServer, killallServers, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../../../shared/extra-utils'
+import { cleanupTests, flushAndRunServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../../../shared/extra-utils'
 import { getVideosOverview } from '../../../../shared/extra-utils/overviews/overviews'
 import { VideosOverview } from '../../../../shared/models/overviews'
 
@@ -87,7 +87,7 @@ describe('Test a videos overview', function () {
     expect(overview.channels[0].channel.name).to.equal('root_channel')
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 3
server/tests/api/videos/videos-views-cleaner.ts

@@ -10,7 +10,7 @@ import {
   flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers,
-  uploadVideo, uploadVideoAndGetId, viewVideo, wait, countVideoViewsOf, doubleFollow, waitJobs
+  uploadVideo, uploadVideoAndGetId, viewVideo, wait, countVideoViewsOf, doubleFollow, waitJobs, cleanupTests
 } from '../../../../shared/extra-utils'
 import { getVideosOverview } from '../../../../shared/extra-utils/overviews/overviews'
 import { VideosOverview } from '../../../../shared/models/overviews'
@@ -100,7 +100,7 @@ describe('Test video views cleaner', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/cli/create-import-video-file-job.ts

@@ -4,6 +4,7 @@ import 'mocha'
 import * as chai from 'chai'
 import { VideoDetails, VideoFile } from '../../../shared/models/videos'
 import {
+  cleanupTests,
   doubleFollow,
   execCLI,
   flushAndRunMultipleServers,
@@ -130,7 +131,7 @@ describe('Test create import video jobs', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/cli/create-transcoding-job.ts

@@ -4,6 +4,7 @@ import 'mocha'
 import * as chai from 'chai'
 import { VideoDetails } from '../../../shared/models/videos'
 import {
+  cleanupTests,
   doubleFollow,
   execCLI,
   flushAndRunMultipleServers,
@@ -124,7 +125,7 @@ describe('Test create transcoding jobs', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 3 - 2
server/tests/cli/optimize-old-videos.ts

@@ -4,6 +4,7 @@ import 'mocha'
 import * as chai from 'chai'
 import { getMaxBitrate, Video, VideoDetails, VideoResolution } from '../../../shared/models/videos'
 import {
+  cleanupTests,
   doubleFollow,
   execCLI,
   flushAndRunMultipleServers,
@@ -112,7 +113,7 @@ describe('Test optimize old videos', function () {
     }
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 2 - 2
server/tests/cli/peertube.ts

@@ -10,7 +10,7 @@ import {
   killallServers,
   flushAndRunServer,
   ServerInfo,
-  setAccessTokensToServers
+  setAccessTokensToServers, cleanupTests
 } from '../../../shared/extra-utils'
 
 describe('Test CLI wrapper', function () {
@@ -46,6 +46,6 @@ describe('Test CLI wrapper', function () {
 
     await execCLI(cmd + ` auth del ${server.url}`)
 
-    killallServers([ server ])
+    await cleanupTests([ server ])
   })
 })

+ 4 - 5
server/tests/cli/reset-password.ts

@@ -1,13 +1,12 @@
 import 'mocha'
 
 import {
+  cleanupTests,
   createUser,
   execCLI,
-  flushTests,
+  flushAndRunServer,
   getEnvCli,
-  killallServers,
   login,
-  flushAndRunServer,
   ServerInfo,
   setAccessTokensToServers
 } from '../../../shared/extra-utils'
@@ -32,7 +31,7 @@ describe('Test reset password scripts', function () {
     await login(server.url, server.client, { username: 'user_1', password: 'coucou' }, 200)
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 6 - 6
server/tests/cli/update-host.ts

@@ -7,17 +7,17 @@ import { waitJobs } from '../../../shared/extra-utils/server/jobs'
 import { addVideoCommentThread } from '../../../shared/extra-utils/videos/video-comments'
 import {
   addVideoChannel,
+  cleanupTests,
   createUser,
   execCLI,
-  flushTests,
+  flushAndRunServer,
   getEnvCli,
   getVideo,
   getVideoChannelsList,
   getVideosList,
   killallServers,
   makeActivityPubGetRequest,
-  parseTorrentVideo,
-  flushAndRunServer,
+  parseTorrentVideo, reRunServer,
   ServerInfo,
   setAccessTokensToServers,
   uploadVideo
@@ -70,7 +70,7 @@ describe('Test update host scripts', function () {
 
     killallServers([ server ])
     // Run server with standard configuration
-    server = await flushAndRunServer(2)
+    await reRunServer(server)
 
     const env = getEnvCli(server)
     await execCLI(`${env} npm run update-host`)
@@ -146,7 +146,7 @@ describe('Test update host scripts', function () {
     }
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 4 - 5
server/tests/client.ts

@@ -4,12 +4,11 @@ import 'mocha'
 import * as chai from 'chai'
 import * as request from 'supertest'
 import {
-  flushTests,
+  cleanupTests,
+  flushAndRunServer,
   getCustomConfig,
   getVideosList,
-  killallServers,
   makeHTMLRequest,
-  flushAndRunServer,
   ServerInfo,
   serverLogin,
   updateCustomConfig,
@@ -145,7 +144,7 @@ describe('Test a client controllers', function () {
     checkIndexTags(res.text, 'PeerTube updated', 'my short description', 'body { background-color: red; }')
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 3 - 2
server/tests/feeds/feeds.ts

@@ -3,6 +3,7 @@
 import * as chai from 'chai'
 import 'mocha'
 import {
+  cleanupTests,
   createUser,
   doubleFollow,
   flushAndRunMultipleServers,
@@ -207,7 +208,7 @@ describe('Test syndication feeds', () => {
     })
   })
 
-  after(function () {
-    killallServers(servers)
+  after(async function () {
+    await cleanupTests(servers)
   })
 })

+ 4 - 5
server/tests/misc-endpoints.ts

@@ -4,11 +4,10 @@ import 'mocha'
 import * as chai from 'chai'
 import {
   addVideoChannel,
+  cleanupTests,
   createUser,
-  flushTests,
-  killallServers,
-  makeGetRequest,
   flushAndRunServer,
+  makeGetRequest,
   ServerInfo,
   setAccessTokensToServers,
   uploadVideo
@@ -171,7 +170,7 @@ describe('Test misc endpoints', function () {
     })
   })
 
-  after(function () {
-    killallServers([ server ])
+  after(async function () {
+    await cleanupTests([ server ])
   })
 })

+ 7 - 0
shared/core-utils/miscs/miscs.ts

@@ -0,0 +1,7 @@
+function randomInt (low: number, high: number) {
+  return Math.floor(Math.random() * (high - low) + low)
+}
+
+export {
+  randomInt
+}

+ 1 - 1
shared/extra-utils/miscs/email-child-process.js

@@ -6,7 +6,7 @@ process.on('message', (msg) => {
   if (msg.start) {
     const maildev = new MailDev({
       ip: '127.0.0.1',
-      smtp: 1025,
+      smtp: msg.port,
       disableWeb: true,
       silent: true
     })

+ 8 - 4
shared/extra-utils/miscs/email.ts

@@ -1,4 +1,6 @@
-import { fork, ChildProcess } from 'child_process'
+import { ChildProcess, fork } from 'child_process'
+import { randomInt } from '../../core-utils/miscs/miscs'
+import { parallelTests } from '../server/servers'
 
 class MockSmtpServer {
 
@@ -20,7 +22,9 @@ class MockSmtpServer {
   }
 
   collectEmails (emailsCollection: object[]) {
-    return new Promise((res, rej) => {
+    return new Promise<number>((res, rej) => {
+      const port = parallelTests() ? randomInt(1000, 2000) : 1025
+
       if (this.started) {
         this.emails = emailsCollection
         return res()
@@ -28,7 +32,7 @@ class MockSmtpServer {
 
       // ensure maildev isn't started until
       // unexpected exit can be reported to test runner
-      this.emailChildProcess.send({ start: true })
+      this.emailChildProcess.send({ start: true, port })
       this.emailChildProcess.on('exit', () => {
         return rej(new Error('maildev exited unexpectedly, confirm port not in use'))
       })
@@ -38,7 +42,7 @@ class MockSmtpServer {
         }
         this.started = true
         this.emails = emailsCollection
-        return res()
+        return res(port)
       })
     })
   }

+ 37 - 14
shared/extra-utils/server/servers.ts

@@ -3,10 +3,11 @@
 import { ChildProcess, exec, fork } from 'child_process'
 import { join } from 'path'
 import { root, wait } from '../miscs/miscs'
-import { readdir, readFile } from 'fs-extra'
+import { copy, readdir, readFile, remove } from 'fs-extra'
 import { existsSync } from 'fs'
 import { expect } from 'chai'
 import { VideoChannel } from '../../models/videos'
+import { randomInt } from '../../core-utils/miscs/miscs'
 
 interface ServerInfo {
   app: ChildProcess,
@@ -29,6 +30,8 @@ interface ServerInfo {
     email?: string
   }
 
+  customConfigFile?: string
+
   accessToken?: string
   videoChannel?: VideoChannel
 
@@ -49,6 +52,10 @@ interface ServerInfo {
   videos?: { id: number, uuid: string }[]
 }
 
+function parallelTests () {
+  return process.env.MOCHA_PARALLEL === 'true'
+}
+
 function flushAndRunMultipleServers (totalServers: number, configOverride?: Object) {
   let apps = []
   let i = 0
@@ -84,23 +91,23 @@ function randomServer () {
   const low = 10
   const high = 10000
 
-  return Math.floor(Math.random() * (high - low) + low)
+  return randomInt(low, high)
 }
 
 async function flushAndRunServer (serverNumber: number, configOverride?: Object, args = []) {
-  const parallel = process.env.MOCHA_PARALLEL === 'true'
+  const parallel = parallelTests()
 
   const internalServerNumber = parallel ? randomServer() : serverNumber
   const port = 9000 + internalServerNumber
 
-  await flushTests(serverNumber)
+  await flushTests(internalServerNumber)
 
   const server: ServerInfo = {
     app: null,
     port,
     internalServerNumber,
     parallel,
-    serverNumber: internalServerNumber,
+    serverNumber,
     url: `http://localhost:${port}`,
     host: `localhost:${port}`,
     client: {
@@ -116,7 +123,7 @@ async function flushAndRunServer (serverNumber: number, configOverride?: Object,
   return runServer(server, configOverride, args)
 }
 
-function runServer (server: ServerInfo, configOverrideArg?: any, args = []) {
+async function runServer (server: ServerInfo, configOverrideArg?: any, args = []) {
   // These actions are async so we need to be sure that they have both been done
   const serverRunString = {
     'Server listening': false
@@ -131,15 +138,19 @@ function runServer (server: ServerInfo, configOverrideArg?: any, args = []) {
     user_password: 'User password: (.+)'
   }
 
-  // Share the environment
-  const env = Object.create(process.env)
-  env['NODE_ENV'] = 'test'
-  env['NODE_APP_INSTANCE'] = server.serverNumber.toString()
+  if (server.internalServerNumber !== server.serverNumber) {
+    const basePath = join(root(), 'config')
+
+    const tmpConfigFile = join(basePath, `test-${server.internalServerNumber}.yaml`)
+    await copy(join(basePath, `test-${server.serverNumber}.yaml`), tmpConfigFile)
+
+    server.customConfigFile = tmpConfigFile
+  }
 
-  let configOverride: any = {}
+  const configOverride: any = {}
 
   if (server.parallel) {
-    configOverride = {
+    Object.assign(configOverride, {
       listen: {
         port: server.port
       },
@@ -165,18 +176,22 @@ function runServer (server: ServerInfo, configOverrideArg?: any, args = []) {
       admin: {
         email: `admin${server.internalServerNumber}@example.com`
       }
-    }
+    })
   }
 
   if (configOverrideArg !== undefined) {
     Object.assign(configOverride, configOverrideArg)
   }
 
+  // Share the environment
+  const env = Object.create(process.env)
+  env['NODE_ENV'] = 'test'
+  env['NODE_APP_INSTANCE'] = server.internalServerNumber.toString()
   env['NODE_CONFIG'] = JSON.stringify(configOverride)
 
   const options = {
     silent: true,
-    env: env,
+    env,
     detached: true
   }
 
@@ -244,7 +259,10 @@ async function checkDirectoryIsEmpty (server: ServerInfo, directory: string) {
 
 function killallServers (servers: ServerInfo[]) {
   for (const server of servers) {
+    if (!server.app) continue
+
     process.kill(-server.app.pid)
+    server.app = null
   }
 }
 
@@ -256,6 +274,10 @@ function cleanupTests (servers: ServerInfo[]) {
     if (server.parallel) {
       p.push(flushTests(server.internalServerNumber))
     }
+
+    if (server.customConfigFile) {
+      p.push(remove(server.customConfigFile))
+    }
   }
 
   return Promise.all(p)
@@ -280,6 +302,7 @@ export {
   checkDirectoryIsEmpty,
   checkTmpIsEmpty,
   ServerInfo,
+  parallelTests,
   cleanupTests,
   flushAndRunMultipleServers,
   flushTests,