test-concurrent.js 5.42 KB
const fs = require('fs').promises
const path = require('path')
const test = require('ava')
const {execFilePromise, matchOutput} = require('./util')

process.chdir(__dirname)

async function make(dir, ...targets) {
  try { await fs.rmdir(dir, {recursive: true}) }
  catch {}
  await fs.mkdir(dir)

  const {stdout} = await execFilePromise(
    'node', ['../../make.js', '../concurrent-makefile.js', ...targets],
    {cwd: path.join(__dirname, dir)}
  )
  return stdout
}

test('make sleep1', async t => {
  // Test that the 3 sleeps happen at the same time
  const output = await make('sleep1', 'sleep1')
  matchOutput(output, [
    {
      target: 'start-sleep-short',
      dependencies: [],
      lines: ['node ../sleep.js 1 sleep1-short']
    },
    {
      target: 'start-sleep-medium',
      dependencies: [],
      lines: ['node ../sleep.js 3 sleep1-medium']
    },
    {
      target: 'start-sleep-long',
      dependencies: [],
      lines: ['node ../sleep.js 5 sleep1-long']
    },
    {
      target: 'finish-sleep-short',
      dependencies: ['start-sleep-short', 'start-sleep-medium', 'start-sleep-long'],
      lines: ['Slept for 1 seconds']
    },
    {
      target: 'finish-sleep-medium',
      dependencies: ['finish-sleep-short'],
      lines: ['Slept for 3 seconds']
    },
    {
      target: 'finish-sleep-long',
      dependencies: ['finish-sleep-medium'],
      lines: ['Slept for 5 seconds']
    },
    {
      target: 'start-sleep1',
      dependencies: ['finish-sleep-long'],
      lines: ['node ../sleep.js 3 sleep1']
    },
    {
      target: 'finish-sleep1',
      dependencies: ['start-sleep1'],
      lines: ['Slept for 3 seconds']
    }
  ])
  t.pass()
})
test('make sleep2', async t => {
  // Test that the 3 sleeps happen at the same time
  const output = await make('sleep2', 'sleep2')
  matchOutput(output, [
    {
      target: 'start-sleep-short',
      dependencies: [],
      lines: ['node ../sleep.js 2 sleep2-short']
    },
    {
      target: 'start-sleep-medium',
      dependencies: [],
      lines: ['node ../sleep.js 4 sleep2-medium']
    },
    {
      target: 'start-sleep-long',
      dependencies: [],
      lines: ['node ../sleep.js 6 sleep2-long']
    },
    {
      target: 'finish-sleep-short',
      dependencies: ['start-sleep-short', 'start-sleep-medium', 'start-sleep-long'],
      lines: ['Slept for 2 seconds']
    },
    {
      target: 'finish-sleep-medium',
      dependencies: ['finish-sleep-short'],
      lines: ['Slept for 4 seconds']
    },
    {
      target: 'finish-sleep-long',
      dependencies: ['finish-sleep-medium'],
      lines: ['Slept for 6 seconds']
    },
    {
      target: 'start-sleep2',
      dependencies: ['finish-sleep-long'],
      lines: ['node ../sleep.js 1 sleep2']
    },
    {
      target: 'finish-sleep2',
      dependencies: ['start-sleep2'],
      lines: ['Slept for 1 seconds']
    }
  ])
  t.pass()
})
for (const targets of [['sleep1', 'sleep2'], ['sleep2', 'sleep1']]) {
  test(`make ${targets.join(' ')}`, async t => {
    // Test that both targets are built at the same time
    const output = await make(targets.join('-'), ...targets)
    matchOutput(output, [
      {
        target: 'start-sleep1-short',
        dependencies: [],
        lines: ['node ../sleep.js 1 sleep1-short']
      },
      {
        target: 'start-sleep2-short',
        dependencies: [],
        lines: ['node ../sleep.js 2 sleep2-short']
      },
      {
        target: 'start-sleep1-medium',
        dependencies: [],
        lines: ['node ../sleep.js 3 sleep1-medium']
      },
      {
        target: 'start-sleep2-medium',
        dependencies: [],
        lines: ['node ../sleep.js 4 sleep2-medium']
      },
      {
        target: 'start-sleep1-long',
        dependencies: [],
        lines: ['node ../sleep.js 5 sleep1-long']
      },
      {
        target: 'start-sleep2-long',
        dependencies: [],
        lines: ['node ../sleep.js 6 sleep2-long']
      },
      {
        target: 'finish-sleep1-short',
        dependencies: [
          'start-sleep1-short',
          'start-sleep2-short',
          'start-sleep1-medium',
          'start-sleep2-medium',
          'start-sleep1-long',
          'start-sleep2-long'
        ],
        lines: ['Slept for 1 seconds']
      },
      {
        target: 'finish-sleep2-short',
        dependencies: ['finish-sleep1-short'],
        lines: ['Slept for 2 seconds']
      },
      {
        target: 'finish-sleep1-medium',
        dependencies: ['finish-sleep2-short'],
        lines: ['Slept for 3 seconds']
      },
      {
        target: 'finish-sleep2-medium',
        dependencies: ['finish-sleep1-medium'],
        lines: ['Slept for 4 seconds']
      },
      {
        target: 'finish-sleep1-long',
        dependencies: ['finish-sleep2-medium'],
        lines: ['Slept for 5 seconds']
      },
      {
        target: 'start-sleep1',
        dependencies: ['finish-sleep1-long'],
        lines: ['node ../sleep.js 3 sleep1']
      },
      {
        target: 'finish-sleep2-long',
        dependencies: ['start-sleep1'],
        lines: ['Slept for 6 seconds']
      },
      {
        target: 'start-sleep2',
        dependencies: ['finish-sleep2-long'],
        lines: ['node ../sleep.js 1 sleep2']
      },
      {
        target: 'finish-sleep2',
        dependencies: ['start-sleep2'],
        lines: ['Slept for 1 seconds']
      },
      {
        target: 'finish-sleep1',
        dependencies: ['finish-sleep2'],
        lines: ['Slept for 3 seconds']
      }
    ])
    t.pass()
  })
}