diff --git a/test/api-visibility.ts b/test/api-visibility.ts index 5fbea02df6..c4ec321938 100644 --- a/test/api-visibility.ts +++ b/test/api-visibility.ts @@ -12,15 +12,15 @@ process.env.NODE_ENV = 'test'; import * as assert from 'assert'; import * as childProcess from 'child_process'; -import { async, signup, request, post, launchServer } from './utils'; +import { async, signup, request, post, launchServer, shutdownServer } from './utils'; describe('API visibility', () => { let p: childProcess.ChildProcess; before(launchServer(g => p = g)); - after(() => { - p.kill(); + after(async () => { + await shutdownServer(p); }); describe('Note visibility', async () => { diff --git a/test/fetch-resource.ts b/test/fetch-resource.ts index 79a5519ddb..e9d10d1ab3 100644 --- a/test/fetch-resource.ts +++ b/test/fetch-resource.ts @@ -12,7 +12,7 @@ process.env.NODE_ENV = 'test'; import * as assert from 'assert'; import * as childProcess from 'child_process'; -import { async, launchServer, signup, post, request, simpleGet, port } from './utils'; +import { async, launchServer, signup, post, request, simpleGet, port, shutdownServer } from './utils'; import * as openapi from '@redocly/openapi-core'; // Request Accept @@ -39,8 +39,8 @@ describe('Fetch resource', () => { }); })); - after(() => { - p.kill(); + after(async () => { + await shutdownServer(p); }); describe('Common', () => { diff --git a/test/mute.ts b/test/mute.ts index 37b4a23048..38911b6e16 100644 --- a/test/mute.ts +++ b/test/mute.ts @@ -12,7 +12,7 @@ process.env.NODE_ENV = 'test'; import * as assert from 'assert'; import * as childProcess from 'child_process'; -import { async, signup, request, post, react, connectStream, launchServer } from './utils'; +import { async, signup, request, post, react, connectStream, launchServer, shutdownServer } from './utils'; describe('Mute', () => { let p: childProcess.ChildProcess; @@ -28,8 +28,8 @@ describe('Mute', () => { carol = await signup({ username: 'carol' }); })); - after(() => { - p.kill(); + after(async () => { + await shutdownServer(p); }); it('ミュート作成', async(async () => { diff --git a/test/note.ts b/test/note.ts index 70ebecff1c..3f17005771 100644 --- a/test/note.ts +++ b/test/note.ts @@ -12,7 +12,7 @@ process.env.NODE_ENV = 'test'; import * as assert from 'assert'; import * as childProcess from 'child_process'; -import { async, signup, request, post, uploadFile, launchServer } from './utils'; +import { async, signup, request, post, uploadFile, launchServer, shutdownServer } from './utils'; import { Note } from '../src/models/entities/note'; import { initDb } from '../src/db/postgre'; @@ -30,8 +30,8 @@ describe('Note', () => { bob = await signup({ username: 'bob' }); })); - after(() => { - p.kill(); + after(async () => { + await shutdownServer(p); }); it('投稿できる', async(async () => { diff --git a/test/user-notes.ts b/test/user-notes.ts index 349d5fdb7c..4af8ce0cc7 100644 --- a/test/user-notes.ts +++ b/test/user-notes.ts @@ -12,7 +12,7 @@ process.env.NODE_ENV = 'test'; import * as assert from 'assert'; import * as childProcess from 'child_process'; -import { async, signup, request, post, uploadFile, launchServer } from './utils'; +import { async, signup, request, post, uploadFile, launchServer, shutdownServer } from './utils'; describe('users/notes', () => { let p: childProcess.ChildProcess; @@ -37,8 +37,8 @@ describe('users/notes', () => { }); })); - after(() => { - p.kill(); + after(async() => { + await shutdownServer(p); }); it('ファイルタイプ指定 (jpg)', async(async () => { diff --git a/test/utils.ts b/test/utils.ts index 193017e265..e4c96d0e15 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -5,6 +5,7 @@ const FormData = require('form-data'); import * as childProcess from 'child_process'; import * as http from 'http'; import loadConfig from '../src/config/load'; +import { SIGKILL } from 'constants'; export const port = loadConfig().port; @@ -145,3 +146,19 @@ export function launchServer(callbackSpawnedProcess: (p: childProcess.ChildProce }); }; } + +export function shutdownServer(p: childProcess.ChildProcess, timeout = 20 * 1000) { + return new Promise((res, rej) => { + const t = setTimeout(() => { + p.kill(SIGKILL); + res('force exit'); + }, timeout); + + p.once('exit', () => { + clearTimeout(t); + res('exited'); + }); + + p.kill(); + }); +}