Merge pull request #4316 from node-red/4221-handle-concurrent-write-file

Ensure storage/util.writeFile handles concurrent write attempts
This commit is contained in:
Nick O'Leary
2023-09-05 15:57:27 +01:00
committed by GitHub
2 changed files with 48 additions and 23 deletions

View File

@@ -14,11 +14,33 @@
* limitations under the License.
**/
var should = require("should");
var NR_TEST_UTILS = require("nr-test-utils");
var util = NR_TEST_UTILS.require("@node-red/runtime/lib/storage/localfilesystem/util");
const should = require("should");
const NR_TEST_UTILS = require("nr-test-utils");
const util = NR_TEST_UTILS.require("@node-red/runtime/lib/storage/localfilesystem/util");
const { mkdtemp, readFile } = require('fs/promises');
const { join } = require('path');
const { tmpdir } = require('os');
describe('storage/localfilesystem/util', function() {
describe('writeFile', function () {
it('manages concurrent calls to modify the same file', async function () {
const testDirectory = await mkdtemp(join(tmpdir(), 'nr-test-'));
const testFile = join(testDirectory, 'foo.txt')
const testBackupFile = testFile + '.$$$'
let counter = 0
const promises = [
util.writeFile(testFile, `update-${counter++}`, testBackupFile ),
util.writeFile(testFile, `update-${counter++}`, testBackupFile ),
util.writeFile(testFile, `update-${counter++}`, testBackupFile )
]
await Promise.all(promises)
const result = await readFile(testFile, { encoding: 'utf-8' })
result.should.equal('update-2')
})
})
describe('parseJSON', function() {
it('returns parsed JSON', function() {
var result = util.parseJSON('{"a":123}');