From 3221ff79b07471067ad156077f70148f49b35ee2 Mon Sep 17 00:00:00 2001
From: Caleb Sander <caleb.sander@gmail.com>
Date: Sun, 29 Mar 2020 17:24:10 -0400
Subject: [PATCH] Concurrent tests no longer use phony targets

---
 .gitignore                   |   4 ++
 tests/concurrent-makefile.js |  28 ++++----
 tests/sleep.js               |   5 ++
 tests/test-concurrent.js     | 121 +++++++++++++++++++++++++++--------
 4 files changed, 119 insertions(+), 39 deletions(-)

diff --git a/.gitignore b/.gitignore
index 3aee52a..e589a1d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,10 @@ tests/dag-scratch
 tests/dag-rebuild
 tests/dag-touch
 tests/dag-b-and-d
+tests/sleep1
+tests/sleep2
+tests/sleep1-sleep2
+tests/sleep2-sleep1
 tests/tree-scratch
 tests/tree-none
 tests/tree-remove-*
diff --git a/tests/concurrent-makefile.js b/tests/concurrent-makefile.js
index 1234e98..1e97bd7 100644
--- a/tests/concurrent-makefile.js
+++ b/tests/concurrent-makefile.js
@@ -2,41 +2,41 @@ module.exports = [
   {
     target: 'sleep1',
     dependencies: ['sleep1-long', 'sleep1-short', 'sleep1-medium'],
-    command: ['node', 'sleep.js', '3.1']
+    command: ['node', '../sleep.js', '3', 'sleep1']
   },
   {
     target: 'sleep1-short',
-    dependencies: ['sleep.js'],
-    command: ['node', 'sleep.js', '1']
+    dependencies: ['../sleep.js'],
+    command: ['node', '../sleep.js', '1', 'sleep1-short']
   },
   {
     target: 'sleep1-medium',
-    dependencies: ['sleep.js'],
-    command: ['node', 'sleep.js', '3']
+    dependencies: ['../sleep.js'],
+    command: ['node', '../sleep.js', '3', 'sleep1-medium']
   },
   {
     target: 'sleep1-long',
-    dependencies: ['sleep.js'],
-    command: ['node', 'sleep.js', '5']
+    dependencies: ['../sleep.js'],
+    command: ['node', '../sleep.js', '5', 'sleep1-long']
   },
   {
     target: 'sleep2',
     dependencies: ['sleep2-medium', 'sleep2-short', 'sleep2-long'],
-    command: ['node', 'sleep.js', '1.1']
+    command: ['node', '../sleep.js', '1', 'sleep2']
   },
   {
     target: 'sleep2-short',
-    dependencies: ['sleep.js'],
-    command: ['node', 'sleep.js', '2']
+    dependencies: ['../sleep.js'],
+    command: ['node', '../sleep.js', '2', 'sleep2-short']
   },
   {
     target: 'sleep2-medium',
-    dependencies: ['sleep.js'],
-    command: ['node', 'sleep.js', '4']
+    dependencies: ['../sleep.js'],
+    command: ['node', '../sleep.js', '4', 'sleep2-medium']
   },
   {
     target: 'sleep2-long',
-    dependencies: ['sleep.js'],
-    command: ['node', 'sleep.js', '6']
+    dependencies: ['../sleep.js'],
+    command: ['node', '../sleep.js', '6', 'sleep2-long']
   }
 ]
diff --git a/tests/sleep.js b/tests/sleep.js
index fb13f8c..ec1bdb6 100644
--- a/tests/sleep.js
+++ b/tests/sleep.js
@@ -1,2 +1,7 @@
+const fs = require('fs')
+
 const seconds = Number(process.argv[2])
 setTimeout(_ => console.log(`Slept for ${seconds} seconds`), seconds * 1e3)
+fs.writeFile(process.argv[3], '', err => {
+  if (err) throw err
+})
diff --git a/tests/test-concurrent.js b/tests/test-concurrent.js
index 46c1890..6843292 100644
--- a/tests/test-concurrent.js
+++ b/tests/test-concurrent.js
@@ -1,22 +1,41 @@
+const fs = require('fs').promises
+const path = require('path')
 const test = require('ava')
 const {execFilePromise, matchOutput} = require('./util')
 
 process.chdir(__dirname)
 
-async function make(...targets) {
+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]
+    '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')
+  const output = await make('sleep1', 'sleep1')
   matchOutput(output, [
-    {target: 'start-sleep-short', dependencies: [], lines: ['node sleep.js 1']},
-    {target: 'start-sleep-medium', dependencies: [], lines: ['node sleep.js 3']},
-    {target: 'start-sleep-long', dependencies: [], lines: ['node sleep.js 5']},
+    {
+      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'],
@@ -32,22 +51,38 @@ test('make sleep1', async t => {
       dependencies: ['finish-sleep-medium'],
       lines: ['Slept for 5 seconds']
     },
-    {target: 'start-sleep1', dependencies: ['finish-sleep-long'], lines: ['node sleep.js 3.1']},
+    {
+      target: 'start-sleep1',
+      dependencies: ['finish-sleep-long'],
+      lines: ['node ../sleep.js 3 sleep1']
+    },
     {
       target: 'finish-sleep1',
       dependencies: ['start-sleep1'],
-      lines: ['Slept for 3.1 seconds']
+      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')
+  const output = await make('sleep2', 'sleep2')
   matchOutput(output, [
-    {target: 'start-sleep-short', dependencies: [], lines: ['node sleep.js 2']},
-    {target: 'start-sleep-medium', dependencies: [], lines: ['node sleep.js 4']},
-    {target: 'start-sleep-long', dependencies: [], lines: ['node sleep.js 6']},
+    {
+      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'],
@@ -63,11 +98,15 @@ test('make sleep2', async t => {
       dependencies: ['finish-sleep-medium'],
       lines: ['Slept for 6 seconds']
     },
-    {target: 'start-sleep2', dependencies: ['finish-sleep-long'], lines: ['node sleep.js 1.1']},
+    {
+      target: 'start-sleep2',
+      dependencies: ['finish-sleep-long'],
+      lines: ['node ../sleep.js 1 sleep2']
+    },
     {
       target: 'finish-sleep2',
       dependencies: ['start-sleep2'],
-      lines: ['Slept for 1.1 seconds']
+      lines: ['Slept for 1 seconds']
     }
   ])
   t.pass()
@@ -75,14 +114,38 @@ test('make sleep2', async t => {
 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)
+    const output = await make(targets.join('-'), ...targets)
     matchOutput(output, [
-      {target: 'start-sleep1-short', dependencies: [], lines: ['node sleep.js 1']},
-      {target: 'start-sleep2-short', dependencies: [], lines: ['node sleep.js 2']},
-      {target: 'start-sleep1-medium', dependencies: [], lines: ['node sleep.js 3']},
-      {target: 'start-sleep2-medium', dependencies: [], lines: ['node sleep.js 4']},
-      {target: 'start-sleep1-long', dependencies: [], lines: ['node sleep.js 5']},
-      {target: 'start-sleep2-long', dependencies: [], lines: ['node sleep.js 6']},
+      {
+        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: [
@@ -115,22 +178,30 @@ for (const targets of [['sleep1', 'sleep2'], ['sleep2', 'sleep1']]) {
         dependencies: ['finish-sleep2-medium'],
         lines: ['Slept for 5 seconds']
       },
-      {target: 'start-sleep1', dependencies: ['finish-sleep1-long'], lines: ['node sleep.js 3.1']},
+      {
+        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.1']},
+      {
+        target: 'start-sleep2',
+        dependencies: ['finish-sleep2-long'],
+        lines: ['node ../sleep.js 1 sleep2']
+      },
       {
         target: 'finish-sleep2',
         dependencies: ['start-sleep2'],
-        lines: ['Slept for 1.1 seconds']
+        lines: ['Slept for 1 seconds']
       },
       {
         target: 'finish-sleep1',
         dependencies: ['finish-sleep2'],
-        lines: ['Slept for 3.1 seconds']
+        lines: ['Slept for 3 seconds']
       }
     ])
     t.pass()
-- 
GitLab