Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7f55571

Browse files
authored
Stabilize watch tests (#4318)
* Use atomic file writes * Use atomic file writes for regular watch tests * Increase timeout
1 parent 2a899d5 commit 7f55571

File tree

9 files changed

+80
-61
lines changed

9 files changed

+80
-61
lines changed

test/cli/samples/wait-for-bundle-input-object/_config.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs');
22
const path = require('path');
3+
const { atomicWriteFileSync } = require('../../../utils');
34

45
let second;
56
let third;
@@ -17,9 +18,9 @@ module.exports = {
1718
},
1819
abortOnStderr(data) {
1920
if (data.includes('waiting for input second')) {
20-
fs.writeFileSync(second, "export default 'second'");
21+
atomicWriteFileSync(second, "export default 'second'");
2122
} else if (data.includes('waiting for input third')) {
22-
fs.writeFileSync(third, "export default 'third'");
23+
atomicWriteFileSync(third, "export default 'third'");
2324
}
2425
}
2526
};

test/cli/samples/wait-for-bundle-input/_config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs');
22
const path = require('path');
3+
const { atomicWriteFileSync } = require('../../../utils');
34

45
let mainFile;
56

@@ -15,7 +16,7 @@ module.exports = {
1516
abortOnStderr(data) {
1617
if (data.includes('waiting for input main.js')) {
1718
// wait longer than one polling interval
18-
setTimeout(() => fs.writeFileSync(mainFile, 'export default 42;'), 600);
19+
setTimeout(() => atomicWriteFileSync(mainFile, 'export default 42;'), 600);
1920
}
2021
}
2122
};

test/cli/samples/watch/bundle-error/_config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs');
22
const path = require('path');
3+
const { atomicWriteFileSync } = require('../../../../utils');
34

45
let mainFile;
56

@@ -16,7 +17,7 @@ module.exports = {
1617
},
1718
abortOnStderr(data) {
1819
if (data.includes('Error: Unexpected token')) {
19-
setTimeout(() => fs.writeFileSync(mainFile, 'export default 42;'), 500);
20+
setTimeout(() => atomicWriteFileSync(mainFile, 'export default 42;'), 500);
2021
return false;
2122
}
2223
if (data.includes('created _actual')) {

test/cli/samples/watch/watch-config-early-update/_config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs');
22
const path = require('path');
3+
const { atomicWriteFileSync } = require('../../../../utils');
34

45
let configFile;
56

@@ -34,7 +35,7 @@ module.exports = {
3435
},
3536
abortOnStderr(data) {
3637
if (data === 'initial\n') {
37-
fs.writeFileSync(
38+
atomicWriteFileSync(
3839
configFile,
3940
`
4041
console.error('updated');

test/cli/samples/watch/watch-config-error/_config.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs');
22
const path = require('path');
3+
const { atomicWriteFileSync } = require('../../../../utils');
34

45
let configFile;
56

@@ -25,12 +26,12 @@ module.exports = {
2526
},
2627
abortOnStderr(data) {
2728
if (data.includes(`created _actual${path.sep}main1.js`)) {
28-
fs.writeFileSync(configFile, 'throw new Error("Config contains errors");');
29+
atomicWriteFileSync(configFile, 'throw new Error("Config contains errors");');
2930
return false;
3031
}
3132
if (data.includes('Config contains errors')) {
3233
setTimeout(() => {
33-
fs.writeFileSync(
34+
atomicWriteFileSync(
3435
configFile,
3536
'export default {\n' +
3637
'\tinput: "main.js",\n' +

test/cli/samples/watch/watch-config-initial-error/_config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs');
22
const path = require('path');
3+
const { atomicWriteFileSync } = require('../../../../utils');
34

45
let configFile;
56

@@ -16,7 +17,7 @@ module.exports = {
1617
async abortOnStderr(data) {
1718
if (data.includes('Config contains initial errors')) {
1819
await new Promise(resolve => setTimeout(resolve, 100));
19-
fs.writeFileSync(
20+
atomicWriteFileSync(
2021
configFile,
2122
'export default {\n' +
2223
'\tinput: "main.js",\n' +

test/cli/samples/watch/watch-config-no-update/_config.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs');
22
const path = require('path');
3+
const { atomicWriteFileSync } = require('../../../../utils');
34

45
let configFile;
56
const configContent =
@@ -23,7 +24,7 @@ module.exports = {
2324
},
2425
abortOnStderr(data) {
2526
if (data.includes('created _actual/main.js')) {
26-
fs.writeFileSync(configFile, configContent);
27+
atomicWriteFileSync(configFile, configContent);
2728
return new Promise(resolve => setTimeout(() => resolve(true), 500));
2829
}
2930
},

test/utils.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const assert = require('assert');
2+
const fs = require('fs');
23
const path = require('path');
34
const fixturify = require('fixturify');
45
const sander = require('sander');
@@ -14,6 +15,7 @@ exports.runTestSuiteWithSamples = runTestSuiteWithSamples;
1415
exports.assertDirectoriesAreEqual = assertDirectoriesAreEqual;
1516
exports.assertFilesAreEqual = assertFilesAreEqual;
1617
exports.assertIncludes = assertIncludes;
18+
exports.atomicWriteFileSync = atomicWriteFileSync;
1719

1820
function normaliseError(error) {
1921
delete error.stack;
@@ -220,3 +222,12 @@ function assertIncludes(actual, expected) {
220222
throw err;
221223
}
222224
}
225+
226+
// Workaround a race condition in fs.writeFileSync that temporarily creates
227+
// an empty file for a brief moment which may be read by rollup watch - even
228+
// if the content being overwritten is identical.
229+
function atomicWriteFileSync(filePath, contents) {
230+
const stagingPath = filePath + '_';
231+
fs.writeFileSync(stagingPath, contents);
232+
fs.renameSync(stagingPath, filePath);
233+
}

0 commit comments

Comments
 (0)