node/test/known_issues/test-fs-cp-non-utf8.js
James M Snell 2022f832a9
test: add known issue tests for fs.cp
PR-URL: https://github.com/nodejs/node/pull/58883
Refs: https://github.com/nodejs/node/issues/58634
Refs: https://github.com/nodejs/node/issues/58869
Reviewed-By: LiviaMedeiros <livia@cirno.name>
Reviewed-By: Jason Zhang <xzha4350@gmail.com>
Reviewed-By: Dario Piotrowicz <dario.piotrowicz@gmail.com>
Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
2025-07-01 04:35:06 +00:00

54 lines
1.7 KiB
JavaScript

'use strict';
// Refs: https://github.com/nodejs/node/issues/58634
// Refs: https://github.com/nodejs/node/issues/58869
const common = require('../common');
if (!common.isLinux) {
common.skip('This test is only applicable to Linux');
}
const { ok, strictEqual } = require('assert');
const { join } = require('path');
const path = require('path');
const tmpdir = require('../common/tmpdir');
const {
cpSync,
existsSync,
mkdirSync,
writeFileSync,
readFileSync,
} = require('fs');
tmpdir.refresh();
const tmpdirPath = Buffer.from(join(tmpdir.path, 'a', 'c'));
const sepBuf = Buffer.from(path.sep);
mkdirSync(tmpdirPath, { recursive: true });
// The name is the Shift-JIS encoded version of こんにちは世界,
// or "Hello, World" in Japanese. On Linux systems, this name is
// a valid path name and should be handled correctly by the copy
// operation. However, the implementation of cp makes the assumption
// that the path names are UTF-8 encoded, so while we can create the
// file and check its existence using a Buffer, the recursive cp
// operation will fail because it tries to interpret every file name
// as UTF-8.
const name = Buffer.from([
0x82, 0xB1, 0x82, 0xF1, 0x82, 0xC9, 0x82,
0xBF, 0x82, 0xCD, 0x90, 0x6C, 0x8C, 0x8E,
]);
const testPath = Buffer.concat([tmpdirPath, sepBuf, name]);
writeFileSync(testPath, 'test content');
ok(existsSync(testPath));
strictEqual(readFileSync(testPath, 'utf8'), 'test content');
// The cpSync is expected to fail because the implementation does not
// properly handle non-UTF8 names in the path.
cpSync(join(tmpdir.path, 'a'), join(tmpdir.path, 'b'), {
recursive: true,
filter: common.mustCall(() => true, 1),
});