diff options
Diffstat (limited to 'shared')
-rw-r--r-- | shared/core-utils/miscs/miscs.ts | 7 | ||||
-rw-r--r-- | shared/extra-utils/miscs/email-child-process.js | 2 | ||||
-rw-r--r-- | shared/extra-utils/miscs/email.ts | 12 | ||||
-rw-r--r-- | shared/extra-utils/server/servers.ts | 51 |
4 files changed, 53 insertions, 19 deletions
diff --git a/shared/core-utils/miscs/miscs.ts b/shared/core-utils/miscs/miscs.ts new file mode 100644 index 000000000..c668e44c1 --- /dev/null +++ b/shared/core-utils/miscs/miscs.ts | |||
@@ -0,0 +1,7 @@ | |||
1 | function randomInt (low: number, high: number) { | ||
2 | return Math.floor(Math.random() * (high - low) + low) | ||
3 | } | ||
4 | |||
5 | export { | ||
6 | randomInt | ||
7 | } | ||
diff --git a/shared/extra-utils/miscs/email-child-process.js b/shared/extra-utils/miscs/email-child-process.js index 40ae37d70..088a5a08c 100644 --- a/shared/extra-utils/miscs/email-child-process.js +++ b/shared/extra-utils/miscs/email-child-process.js | |||
@@ -6,7 +6,7 @@ process.on('message', (msg) => { | |||
6 | if (msg.start) { | 6 | if (msg.start) { |
7 | const maildev = new MailDev({ | 7 | const maildev = new MailDev({ |
8 | ip: '127.0.0.1', | 8 | ip: '127.0.0.1', |
9 | smtp: 1025, | 9 | smtp: msg.port, |
10 | disableWeb: true, | 10 | disableWeb: true, |
11 | silent: true | 11 | silent: true |
12 | }) | 12 | }) |
diff --git a/shared/extra-utils/miscs/email.ts b/shared/extra-utils/miscs/email.ts index f9f1bd95b..b2a1093da 100644 --- a/shared/extra-utils/miscs/email.ts +++ b/shared/extra-utils/miscs/email.ts | |||
@@ -1,4 +1,6 @@ | |||
1 | import { fork, ChildProcess } from 'child_process' | 1 | import { ChildProcess, fork } from 'child_process' |
2 | import { randomInt } from '../../core-utils/miscs/miscs' | ||
3 | import { parallelTests } from '../server/servers' | ||
2 | 4 | ||
3 | class MockSmtpServer { | 5 | class MockSmtpServer { |
4 | 6 | ||
@@ -20,7 +22,9 @@ class MockSmtpServer { | |||
20 | } | 22 | } |
21 | 23 | ||
22 | collectEmails (emailsCollection: object[]) { | 24 | collectEmails (emailsCollection: object[]) { |
23 | return new Promise((res, rej) => { | 25 | return new Promise<number>((res, rej) => { |
26 | const port = parallelTests() ? randomInt(1000, 2000) : 1025 | ||
27 | |||
24 | if (this.started) { | 28 | if (this.started) { |
25 | this.emails = emailsCollection | 29 | this.emails = emailsCollection |
26 | return res() | 30 | return res() |
@@ -28,7 +32,7 @@ class MockSmtpServer { | |||
28 | 32 | ||
29 | // ensure maildev isn't started until | 33 | // ensure maildev isn't started until |
30 | // unexpected exit can be reported to test runner | 34 | // unexpected exit can be reported to test runner |
31 | this.emailChildProcess.send({ start: true }) | 35 | this.emailChildProcess.send({ start: true, port }) |
32 | this.emailChildProcess.on('exit', () => { | 36 | this.emailChildProcess.on('exit', () => { |
33 | return rej(new Error('maildev exited unexpectedly, confirm port not in use')) | 37 | return rej(new Error('maildev exited unexpectedly, confirm port not in use')) |
34 | }) | 38 | }) |
@@ -38,7 +42,7 @@ class MockSmtpServer { | |||
38 | } | 42 | } |
39 | this.started = true | 43 | this.started = true |
40 | this.emails = emailsCollection | 44 | this.emails = emailsCollection |
41 | return res() | 45 | return res(port) |
42 | }) | 46 | }) |
43 | }) | 47 | }) |
44 | } | 48 | } |
diff --git a/shared/extra-utils/server/servers.ts b/shared/extra-utils/server/servers.ts index 3ef4b9746..ed41bfa48 100644 --- a/shared/extra-utils/server/servers.ts +++ b/shared/extra-utils/server/servers.ts | |||
@@ -3,10 +3,11 @@ | |||
3 | import { ChildProcess, exec, fork } from 'child_process' | 3 | import { ChildProcess, exec, fork } from 'child_process' |
4 | import { join } from 'path' | 4 | import { join } from 'path' |
5 | import { root, wait } from '../miscs/miscs' | 5 | import { root, wait } from '../miscs/miscs' |
6 | import { readdir, readFile } from 'fs-extra' | 6 | import { copy, readdir, readFile, remove } from 'fs-extra' |
7 | import { existsSync } from 'fs' | 7 | import { existsSync } from 'fs' |
8 | import { expect } from 'chai' | 8 | import { expect } from 'chai' |
9 | import { VideoChannel } from '../../models/videos' | 9 | import { VideoChannel } from '../../models/videos' |
10 | import { randomInt } from '../../core-utils/miscs/miscs' | ||
10 | 11 | ||
11 | interface ServerInfo { | 12 | interface ServerInfo { |
12 | app: ChildProcess, | 13 | app: ChildProcess, |
@@ -29,6 +30,8 @@ interface ServerInfo { | |||
29 | email?: string | 30 | email?: string |
30 | } | 31 | } |
31 | 32 | ||
33 | customConfigFile?: string | ||
34 | |||
32 | accessToken?: string | 35 | accessToken?: string |
33 | videoChannel?: VideoChannel | 36 | videoChannel?: VideoChannel |
34 | 37 | ||
@@ -49,6 +52,10 @@ interface ServerInfo { | |||
49 | videos?: { id: number, uuid: string }[] | 52 | videos?: { id: number, uuid: string }[] |
50 | } | 53 | } |
51 | 54 | ||
55 | function parallelTests () { | ||
56 | return process.env.MOCHA_PARALLEL === 'true' | ||
57 | } | ||
58 | |||
52 | function flushAndRunMultipleServers (totalServers: number, configOverride?: Object) { | 59 | function flushAndRunMultipleServers (totalServers: number, configOverride?: Object) { |
53 | let apps = [] | 60 | let apps = [] |
54 | let i = 0 | 61 | let i = 0 |
@@ -84,23 +91,23 @@ function randomServer () { | |||
84 | const low = 10 | 91 | const low = 10 |
85 | const high = 10000 | 92 | const high = 10000 |
86 | 93 | ||
87 | return Math.floor(Math.random() * (high - low) + low) | 94 | return randomInt(low, high) |
88 | } | 95 | } |
89 | 96 | ||
90 | async function flushAndRunServer (serverNumber: number, configOverride?: Object, args = []) { | 97 | async function flushAndRunServer (serverNumber: number, configOverride?: Object, args = []) { |
91 | const parallel = process.env.MOCHA_PARALLEL === 'true' | 98 | const parallel = parallelTests() |
92 | 99 | ||
93 | const internalServerNumber = parallel ? randomServer() : serverNumber | 100 | const internalServerNumber = parallel ? randomServer() : serverNumber |
94 | const port = 9000 + internalServerNumber | 101 | const port = 9000 + internalServerNumber |
95 | 102 | ||
96 | await flushTests(serverNumber) | 103 | await flushTests(internalServerNumber) |
97 | 104 | ||
98 | const server: ServerInfo = { | 105 | const server: ServerInfo = { |
99 | app: null, | 106 | app: null, |
100 | port, | 107 | port, |
101 | internalServerNumber, | 108 | internalServerNumber, |
102 | parallel, | 109 | parallel, |
103 | serverNumber: internalServerNumber, | 110 | serverNumber, |
104 | url: `http://localhost:${port}`, | 111 | url: `http://localhost:${port}`, |
105 | host: `localhost:${port}`, | 112 | host: `localhost:${port}`, |
106 | client: { | 113 | client: { |
@@ -116,7 +123,7 @@ async function flushAndRunServer (serverNumber: number, configOverride?: Object, | |||
116 | return runServer(server, configOverride, args) | 123 | return runServer(server, configOverride, args) |
117 | } | 124 | } |
118 | 125 | ||
119 | function runServer (server: ServerInfo, configOverrideArg?: any, args = []) { | 126 | async function runServer (server: ServerInfo, configOverrideArg?: any, args = []) { |
120 | // These actions are async so we need to be sure that they have both been done | 127 | // These actions are async so we need to be sure that they have both been done |
121 | const serverRunString = { | 128 | const serverRunString = { |
122 | 'Server listening': false | 129 | 'Server listening': false |
@@ -131,15 +138,19 @@ function runServer (server: ServerInfo, configOverrideArg?: any, args = []) { | |||
131 | user_password: 'User password: (.+)' | 138 | user_password: 'User password: (.+)' |
132 | } | 139 | } |
133 | 140 | ||
134 | // Share the environment | 141 | if (server.internalServerNumber !== server.serverNumber) { |
135 | const env = Object.create(process.env) | 142 | const basePath = join(root(), 'config') |
136 | env['NODE_ENV'] = 'test' | 143 | |
137 | env['NODE_APP_INSTANCE'] = server.serverNumber.toString() | 144 | const tmpConfigFile = join(basePath, `test-${server.internalServerNumber}.yaml`) |
145 | await copy(join(basePath, `test-${server.serverNumber}.yaml`), tmpConfigFile) | ||
146 | |||
147 | server.customConfigFile = tmpConfigFile | ||
148 | } | ||
138 | 149 | ||
139 | let configOverride: any = {} | 150 | const configOverride: any = {} |
140 | 151 | ||
141 | if (server.parallel) { | 152 | if (server.parallel) { |
142 | configOverride = { | 153 | Object.assign(configOverride, { |
143 | listen: { | 154 | listen: { |
144 | port: server.port | 155 | port: server.port |
145 | }, | 156 | }, |
@@ -165,18 +176,22 @@ function runServer (server: ServerInfo, configOverrideArg?: any, args = []) { | |||
165 | admin: { | 176 | admin: { |
166 | email: `admin${server.internalServerNumber}@example.com` | 177 | email: `admin${server.internalServerNumber}@example.com` |
167 | } | 178 | } |
168 | } | 179 | }) |
169 | } | 180 | } |
170 | 181 | ||
171 | if (configOverrideArg !== undefined) { | 182 | if (configOverrideArg !== undefined) { |
172 | Object.assign(configOverride, configOverrideArg) | 183 | Object.assign(configOverride, configOverrideArg) |
173 | } | 184 | } |
174 | 185 | ||
186 | // Share the environment | ||
187 | const env = Object.create(process.env) | ||
188 | env['NODE_ENV'] = 'test' | ||
189 | env['NODE_APP_INSTANCE'] = server.internalServerNumber.toString() | ||
175 | env['NODE_CONFIG'] = JSON.stringify(configOverride) | 190 | env['NODE_CONFIG'] = JSON.stringify(configOverride) |
176 | 191 | ||
177 | const options = { | 192 | const options = { |
178 | silent: true, | 193 | silent: true, |
179 | env: env, | 194 | env, |
180 | detached: true | 195 | detached: true |
181 | } | 196 | } |
182 | 197 | ||
@@ -244,7 +259,10 @@ async function checkDirectoryIsEmpty (server: ServerInfo, directory: string) { | |||
244 | 259 | ||
245 | function killallServers (servers: ServerInfo[]) { | 260 | function killallServers (servers: ServerInfo[]) { |
246 | for (const server of servers) { | 261 | for (const server of servers) { |
262 | if (!server.app) continue | ||
263 | |||
247 | process.kill(-server.app.pid) | 264 | process.kill(-server.app.pid) |
265 | server.app = null | ||
248 | } | 266 | } |
249 | } | 267 | } |
250 | 268 | ||
@@ -256,6 +274,10 @@ function cleanupTests (servers: ServerInfo[]) { | |||
256 | if (server.parallel) { | 274 | if (server.parallel) { |
257 | p.push(flushTests(server.internalServerNumber)) | 275 | p.push(flushTests(server.internalServerNumber)) |
258 | } | 276 | } |
277 | |||
278 | if (server.customConfigFile) { | ||
279 | p.push(remove(server.customConfigFile)) | ||
280 | } | ||
259 | } | 281 | } |
260 | 282 | ||
261 | return Promise.all(p) | 283 | return Promise.all(p) |
@@ -280,6 +302,7 @@ export { | |||
280 | checkDirectoryIsEmpty, | 302 | checkDirectoryIsEmpty, |
281 | checkTmpIsEmpty, | 303 | checkTmpIsEmpty, |
282 | ServerInfo, | 304 | ServerInfo, |
305 | parallelTests, | ||
283 | cleanupTests, | 306 | cleanupTests, |
284 | flushAndRunMultipleServers, | 307 | flushAndRunMultipleServers, |
285 | flushTests, | 308 | flushTests, |