]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/extra-utils/server/servers.ts
Try to fix travis
[github/Chocobozzz/PeerTube.git] / shared / extra-utils / server / servers.ts
CommitLineData
89231874
C
1/* tslint:disable:no-unused-expression */
2
0e1dc3e7
C
3import { ChildProcess, exec, fork } from 'child_process'
4import { join } from 'path'
792e5b8e 5import { root, wait } from '../miscs/miscs'
89231874
C
6import { readdir, readFile } from 'fs-extra'
7import { existsSync } from 'fs'
8import { expect } from 'chai'
df0b219d 9import { VideoChannel } from '../../models/videos'
0e1dc3e7
C
10
11interface ServerInfo {
12 app: ChildProcess,
13 url: string
14 host: string
86ebdf8c
C
15
16 port: number
17 parallel: boolean
18 internalServerNumber: number
fdbda9e3 19 serverNumber: number
0e1dc3e7
C
20
21 client: {
22 id: string,
23 secret: string
24 }
25
26 user: {
27 username: string,
28 password: string,
29 email?: string
30 }
31
32 accessToken?: string
df0b219d 33 videoChannel?: VideoChannel
0e1dc3e7
C
34
35 video?: {
36 id: number
37 uuid: string
d8755eed 38 name: string
b64c950a
C
39 account: {
40 name: string
41 }
0e1dc3e7
C
42 }
43
44 remoteVideo?: {
45 id: number
46 uuid: string
47 }
df0b219d
C
48
49 videos?: { id: number, uuid: string }[]
0e1dc3e7
C
50}
51
b36f41ca 52function flushAndRunMultipleServers (totalServers: number, configOverride?: Object) {
0e1dc3e7
C
53 let apps = []
54 let i = 0
55
56 return new Promise<ServerInfo[]>(res => {
57 function anotherServerDone (serverNumber, app) {
58 apps[serverNumber - 1] = app
59 i++
60 if (i === totalServers) {
61 return res(apps)
62 }
63 }
64
210feb6c
C
65 for (let j = 1; j <= totalServers; j++) {
66 flushAndRunServer(j, configOverride).then(app => anotherServerDone(j, app))
67 }
0e1dc3e7
C
68 })
69}
70
210feb6c 71function flushTests (serverNumber?: number) {
0e1dc3e7 72 return new Promise<void>((res, rej) => {
210feb6c
C
73 const suffix = serverNumber ? ` -- ${serverNumber}` : ''
74
75 return exec('npm run clean:server:test' + suffix, err => {
0e1dc3e7
C
76 if (err) return rej(err)
77
78 return res()
79 })
80 })
81}
82
86ebdf8c
C
83function randomServer () {
84 const low = 10
85 const high = 10000
86
87 return Math.floor(Math.random() * (high - low) + low)
88}
89
42e1ec25 90async function flushAndRunServer (serverNumber: number, configOverrideArg?: Object, args = []) {
86ebdf8c
C
91 const parallel = process.env.MOCHA_PARALLEL === 'true'
92
93 const internalServerNumber = parallel ? randomServer() : serverNumber
94 const port = 9000 + internalServerNumber
95
42e1ec25
C
96 await flushTests(serverNumber)
97
0e1dc3e7
C
98 const server: ServerInfo = {
99 app: null,
86ebdf8c
C
100 port,
101 internalServerNumber,
102 parallel,
103 serverNumber: internalServerNumber,
104 url: `http://localhost:${port}`,
105 host: `localhost:${port}`,
0e1dc3e7
C
106 client: {
107 id: null,
108 secret: null
109 },
110 user: {
111 username: null,
112 password: null
113 }
114 }
115
116 // These actions are async so we need to be sure that they have both been done
117 const serverRunString = {
bf6e8e3e 118 'Server listening': false
0e1dc3e7 119 }
86ebdf8c 120 const key = 'Database peertube_test' + internalServerNumber + ' is ready'
0e1dc3e7
C
121 serverRunString[key] = false
122
123 const regexps = {
124 client_id: 'Client id: (.+)',
125 client_secret: 'Client secret: (.+)',
126 user_username: 'Username: (.+)',
127 user_password: 'User password: (.+)'
128 }
129
130 // Share the environment
131 const env = Object.create(process.env)
132 env['NODE_ENV'] = 'test'
133 env['NODE_APP_INSTANCE'] = serverNumber.toString()
fdbda9e3 134
86ebdf8c
C
135 let configOverride: any = {}
136
137 if (parallel) {
138 configOverride = {
139 listen: {
140 port: port
141 },
142 webserver: {
143 port: port
144 },
145 database: {
146 suffix: '_test' + internalServerNumber
147 },
148 storage: {
149 tmp: `test${internalServerNumber}/tmp/`,
150 avatars: `test${internalServerNumber}/avatars/`,
151 videos: `test${internalServerNumber}/videos/`,
152 streaming_playlists: `test${internalServerNumber}/streaming-playlists/`,
153 redundancy: `test${internalServerNumber}/redundancy/`,
154 logs: `test${internalServerNumber}/logs/`,
155 previews: `test${internalServerNumber}/previews/`,
156 thumbnails: `test${internalServerNumber}/thumbnails/`,
157 torrents: `test${internalServerNumber}/torrents/`,
158 captions: `test${internalServerNumber}/captions/`,
159 cache: `test${internalServerNumber}/cache/`
160 },
161 admin: {
162 email: `admin${internalServerNumber}@example.com`
163 }
164 }
165 }
166
167 if (configOverrideArg !== undefined) {
168 Object.assign(configOverride, configOverrideArg)
fdbda9e3
C
169 }
170
86ebdf8c
C
171 env['NODE_CONFIG'] = JSON.stringify(configOverride)
172
0e1dc3e7
C
173 const options = {
174 silent: true,
175 env: env,
176 detached: true
177 }
178
179 return new Promise<ServerInfo>(res => {
42e1ec25
C
180 server.app = fork(join(root(), 'dist', 'server.js'), args, options)
181 server.app.stdout.on('data', function onStdout (data) {
182 let dontContinue = false
183
184 // Capture things if we want to
185 for (const key of Object.keys(regexps)) {
186 const regexp = regexps[ key ]
187 const matches = data.toString().match(regexp)
188 if (matches !== null) {
189 if (key === 'client_id') server.client.id = matches[ 1 ]
190 else if (key === 'client_secret') server.client.secret = matches[ 1 ]
191 else if (key === 'user_username') server.user.username = matches[ 1 ]
192 else if (key === 'user_password') server.user.password = matches[ 1 ]
193 }
194 }
195
196 // Check if all required sentences are here
197 for (const key of Object.keys(serverRunString)) {
198 if (data.toString().indexOf(key) !== -1) serverRunString[ key ] = true
199 if (serverRunString[ key ] === false) dontContinue = true
200 }
201
202 // If no, there is maybe one thing not already initialized (client/user credentials generation...)
203 if (dontContinue === true) return
204
205 server.app.stdout.removeListener('data', onStdout)
206
207 process.on('exit', () => {
208 try {
209 process.kill(server.app.pid)
210 } catch { /* empty */ }
dc094603 211 })
42e1ec25
C
212
213 res(server)
214 })
0e1dc3e7
C
215 })
216}
217
e5565833 218async function reRunServer (server: ServerInfo, configOverride?: any) {
210feb6c 219 const newServer = await flushAndRunServer(server.serverNumber, configOverride)
7bc29171
C
220 server.app = newServer.app
221
222 return server
223}
224
89231874 225async function checkTmpIsEmpty (server: ServerInfo) {
09209296
C
226 return checkDirectoryIsEmpty(server, 'tmp')
227}
228
229async function checkDirectoryIsEmpty (server: ServerInfo, directory: string) {
89231874
C
230 const testDirectory = 'test' + server.serverNumber
231
09209296 232 const directoryPath = join(root(), testDirectory, directory)
89231874
C
233
234 const directoryExists = existsSync(directoryPath)
235 expect(directoryExists).to.be.true
236
237 const files = await readdir(directoryPath)
238 expect(files).to.have.lengthOf(0)
239}
240
0e1dc3e7
C
241function killallServers (servers: ServerInfo[]) {
242 for (const server of servers) {
243 process.kill(-server.app.pid)
244 }
245}
246
86ebdf8c
C
247function cleanupTests (servers: ServerInfo[]) {
248 killallServers(servers)
249
250 const p: Promise<any>[] = []
251 for (const server of servers) {
252 if (server.parallel) {
253 p.push(flushTests(server.internalServerNumber))
254 }
255 }
256
257 return Promise.all(p)
258}
259
792e5b8e
C
260async function waitUntilLog (server: ServerInfo, str: string, count = 1) {
261 const logfile = join(root(), 'test' + server.serverNumber, 'logs/peertube.log')
262
263 while (true) {
264 const buf = await readFile(logfile)
265
266 const matches = buf.toString().match(new RegExp(str, 'g'))
267 if (matches && matches.length === count) return
268
269 await wait(1000)
270 }
271}
272
0e1dc3e7
C
273// ---------------------------------------------------------------------------
274
275export {
09209296 276 checkDirectoryIsEmpty,
89231874 277 checkTmpIsEmpty,
0e1dc3e7 278 ServerInfo,
86ebdf8c 279 cleanupTests,
0e1dc3e7
C
280 flushAndRunMultipleServers,
281 flushTests,
210feb6c 282 flushAndRunServer,
7bc29171 283 killallServers,
792e5b8e
C
284 reRunServer,
285 waitUntilLog
0e1dc3e7 286}