123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- /**
- * @author Toru Nagashima
- * @copyright 2016 Toru Nagashima. All rights reserved.
- * See LICENSE file in root directory for full license.
- */
- 'use strict'
- // ------------------------------------------------------------------------------
- // Requirements
- // ------------------------------------------------------------------------------
- const assert = require('assert').strict
- const nodeApi = require('../lib')
- const spawnWithKill = require('./lib/spawn-with-kill')
- const { delay, result, removeResult, runAll, runPar } = require('./lib/util')
- // ------------------------------------------------------------------------------
- // Test
- // ------------------------------------------------------------------------------
- describe('[parallel]', () => {
- before(() => process.chdir('test-workspace'))
- after(() => process.chdir('..'))
- beforeEach(() => delay(1000).then(removeResult))
- describe('should run tasks on parallel when was given --parallel option:', () => {
- it('Node API', async () => {
- const results = await nodeApi(['test-task:append a', 'test-task:append b'], { parallel: true })
- assert(results.length === 2)
- assert(results[0].name === 'test-task:append a')
- assert(results[0].code === 0)
- assert(results[1].name === 'test-task:append b')
- assert(results[1].code === 0)
- assert(
- result() === 'abab' ||
- result() === 'baba' ||
- result() === 'abba' ||
- result() === 'baab'
- )
- })
- it('npm-run-all command', async () => {
- await runAll(['--parallel', 'test-task:append a', 'test-task:append b'])
- assert(
- result() === 'abab' ||
- result() === 'baba' ||
- result() === 'abba' ||
- result() === 'baab'
- )
- })
- it('run-p command', async () => {
- await runPar(['test-task:append a', 'test-task:append b'])
- assert(
- result() === 'abab' ||
- result() === 'baba' ||
- result() === 'abba' ||
- result() === 'baab'
- )
- })
- })
- describe('should kill all tasks when was given --parallel option if a task exited with a non-zero code:', () => {
- it('Node API', async () => {
- try {
- await nodeApi(['test-task:append2 a', 'test-task:error'], { parallel: true })
- } catch (err) {
- assert(err.results.length === 2)
- assert(err.results[0].name === 'test-task:append2 a')
- assert(err.results[0].code === undefined)
- assert(err.results[1].name === 'test-task:error')
- assert(err.results[1].code === 1)
- assert(result() == null || result() === 'a')
- return
- }
- assert(false, 'should fail')
- })
- it('npm-run-all command', async () => {
- try {
- await runAll(['--parallel', 'test-task:append2 a', 'test-task:error'])
- } catch (_err) {
- assert(result() == null || result() === 'a')
- return
- }
- assert(false, 'should fail')
- })
- it('run-p command', async () => {
- try {
- await runPar(['test-task:append2 a', 'test-task:error'])
- } catch (_err) {
- assert(result() == null || result() === 'a')
- return
- }
- assert(false, 'should fail')
- })
- })
- describe('should remove intersected tasks from two or more patterns:', () => {
- it('Node API', async () => {
- await nodeApi(['test-task:*:a', '*:append:a'], { parallel: true })
- assert(result() === 'aa')
- })
- it('npm-run-all command', async () => {
- await runAll(['--parallel', 'test-task:*:a', '*:append:a'])
- assert(result() === 'aa')
- })
- it('run-p command', async () => {
- await runPar(['test-task:*:a', '*:append:a'])
- assert(result() === 'aa')
- })
- })
- describe('should not remove duplicate tasks from two or more the same pattern:', () => {
- it('Node API', async () => {
- await nodeApi(['test-task:*:a', 'test-task:*:a'], { parallel: true })
- assert(result() === 'aaaa')
- })
- it('npm-run-all command', async () => {
- await runAll(['--parallel', 'test-task:*:a', 'test-task:*:a'])
- assert(result() === 'aaaa')
- })
- it('run-p command', async () => {
- await runPar(['test-task:*:a', 'test-task:*:a'])
- assert(result() === 'aaaa')
- })
- })
- describe("should kill child processes when it's killed", () => {
- it('npm-run-all command', async () => {
- await spawnWithKill(
- 'node',
- ['../bin/npm-run-all/index.js', '--parallel', 'test-task:append2 a']
- )
- assert(result() == null || result() === 'a')
- })
- it('run-p command', async () => {
- await spawnWithKill(
- 'node',
- ['../bin/run-p/index.js', 'test-task:append2 a']
- )
- assert(result() == null || result() === 'a')
- })
- })
- describe('should continue on error when --continue-on-error option was specified:', () => {
- it('Node API', async () => {
- try {
- await nodeApi(['test-task:append a', 'test-task:error', 'test-task:append b'], { parallel: true, continueOnError: true })
- } catch (_err) {
- console.log(result()) // TODO: This is randomly failing
- assert(
- result() === 'abab' ||
- result() === 'baba' ||
- result() === 'abba' ||
- result() === 'baab'
- )
- return
- }
- assert(false, 'should fail.')
- })
- it('npm-run-all command (--continue-on-error)', async () => {
- try {
- await runAll(['--continue-on-error', '--parallel', 'test-task:append a', 'test-task:error', 'test-task:append b'])
- } catch (_err) {
- assert(
- result() === 'abab' ||
- result() === 'baba' ||
- result() === 'abba' ||
- result() === 'baab'
- )
- return
- }
- assert(false, 'should fail.')
- })
- it('npm-run-all command (-c)', async () => {
- try {
- await runAll(['-cp', 'test-task:append a', 'test-task:error', 'test-task:append b'])
- } catch (_err) {
- assert(
- result() === 'abab' ||
- result() === 'baba' ||
- result() === 'abba' ||
- result() === 'baab'
- )
- return
- }
- assert(false, 'should fail.')
- })
- it('run-p command (--continue-on-error)', async () => {
- try {
- await runPar(['--continue-on-error', 'test-task:append a', 'test-task:error', 'test-task:append b'])
- } catch (_err) {
- assert(
- result() === 'abab' ||
- result() === 'baba' ||
- result() === 'abba' ||
- result() === 'baab'
- )
- return
- }
- assert(false, 'should fail.')
- })
- it('run-p command (-c)', async () => {
- try {
- await runPar(['-c', 'test-task:append a', 'test-task:error', 'test-task:append b'])
- } catch (_err) {
- assert(
- result() === 'abab' ||
- result() === 'baba' ||
- result() === 'abba' ||
- result() === 'baab'
- )
- return
- }
- assert(false, 'should fail.')
- })
- })
- describe('should abort other tasks when a task finished, when --race option was specified:', () => {
- it('Node API', async () => {
- await nodeApi(['test-task:append1 a', 'test-task:append2 b'], { parallel: true, race: true })
- await delay(5000)
- assert(result() === 'a' || result() === 'ab' || result() === 'ba')
- })
- it('npm-run-all command (--race)', async () => {
- await runAll(['--race', '--parallel', 'test-task:append1 a', 'test-task:append2 b'])
- await delay(5000)
- assert(result() === 'a' || result() === 'ab' || result() === 'ba')
- })
- it('npm-run-all command (-r)', async () => {
- await runAll(['-rp', 'test-task:append1 a', 'test-task:append2 b'])
- await delay(5000)
- assert(result() === 'a' || result() === 'ab' || result() === 'ba')
- })
- it('run-p command (--race)', async () => {
- await runPar(['--race', 'test-task:append1 a', 'test-task:append2 b'])
- await delay(5000)
- assert(result() === 'a' || result() === 'ab' || result() === 'ba')
- })
- it('run-p command (-r)', async () => {
- await runPar(['-r', 'test-task:append1 a', 'test-task:append2 b'])
- await delay(5000)
- assert(result() === 'a' || result() === 'ab' || result() === 'ba')
- })
- it('run-p command (no -r)', async () => {
- await runPar(['test-task:append1 a', 'test-task:append2 b'])
- await delay(5000)
- assert(result() === 'abb' || result() === 'bab')
- })
- })
- describe('should run tasks in parallel-2 when was given --max-parallel 2 option:', () => {
- it('Node API', async () => {
- const results = await nodeApi(['test-task:append a', 'test-task:append b', 'test-task:append c'], { parallel: true, maxParallel: 2 })
- assert(results.length === 3)
- assert(results[0].name === 'test-task:append a')
- assert(results[0].code === 0)
- assert(results[1].name === 'test-task:append b')
- assert(results[1].code === 0)
- assert(results[2].name === 'test-task:append c')
- assert(results[2].code === 0)
- assert(
- result() === 'ababcc' ||
- result() === 'babacc' ||
- result() === 'abbacc' ||
- result() === 'baabcc'
- )
- })
- it('npm-run-all command', async () => {
- await runAll(['--parallel', 'test-task:append a', 'test-task:append b', 'test-task:append c', '--max-parallel', '2'])
- assert(
- result() === 'ababcc' ||
- result() === 'babacc' ||
- result() === 'abbacc' ||
- result() === 'baabcc'
- )
- })
- it('run-p command', async () => {
- await runPar(['test-task:append a', 'test-task:append b', 'test-task:append c', '--max-parallel', '2'])
- assert(
- result() === 'ababcc' ||
- result() === 'babacc' ||
- result() === 'abbacc' ||
- result() === 'baabcc'
- )
- })
- })
- })
|