11cb0ef41Sopenharmony_ci// Flags: --expose-internals 21cb0ef41Sopenharmony_ci'use strict'; 31cb0ef41Sopenharmony_ciconst common = require('../common'); 41cb0ef41Sopenharmony_ciconst fixtures = require('../common/fixtures'); 51cb0ef41Sopenharmony_ciconst tmpdir = require('../common/tmpdir'); 61cb0ef41Sopenharmony_ciconst assert = require('assert'); 71cb0ef41Sopenharmony_ciconst fs = require('fs'); 81cb0ef41Sopenharmony_ciconst { internalBinding } = require('internal/test/binding'); 91cb0ef41Sopenharmony_ciconst { 101cb0ef41Sopenharmony_ci UV_ENOENT, 111cb0ef41Sopenharmony_ci UV_EEXIST 121cb0ef41Sopenharmony_ci} = internalBinding('uv'); 131cb0ef41Sopenharmony_ciconst path = require('path'); 141cb0ef41Sopenharmony_ciconst src = fixtures.path('a.js'); 151cb0ef41Sopenharmony_ciconst dest = path.join(tmpdir.path, 'copyfile.out'); 161cb0ef41Sopenharmony_ciconst { 171cb0ef41Sopenharmony_ci COPYFILE_EXCL, 181cb0ef41Sopenharmony_ci COPYFILE_FICLONE, 191cb0ef41Sopenharmony_ci COPYFILE_FICLONE_FORCE, 201cb0ef41Sopenharmony_ci UV_FS_COPYFILE_EXCL, 211cb0ef41Sopenharmony_ci UV_FS_COPYFILE_FICLONE, 221cb0ef41Sopenharmony_ci UV_FS_COPYFILE_FICLONE_FORCE 231cb0ef41Sopenharmony_ci} = fs.constants; 241cb0ef41Sopenharmony_ci 251cb0ef41Sopenharmony_cifunction verify(src, dest) { 261cb0ef41Sopenharmony_ci const srcData = fs.readFileSync(src, 'utf8'); 271cb0ef41Sopenharmony_ci const srcStat = fs.statSync(src); 281cb0ef41Sopenharmony_ci const destData = fs.readFileSync(dest, 'utf8'); 291cb0ef41Sopenharmony_ci const destStat = fs.statSync(dest); 301cb0ef41Sopenharmony_ci 311cb0ef41Sopenharmony_ci assert.strictEqual(srcData, destData); 321cb0ef41Sopenharmony_ci assert.strictEqual(srcStat.mode, destStat.mode); 331cb0ef41Sopenharmony_ci assert.strictEqual(srcStat.size, destStat.size); 341cb0ef41Sopenharmony_ci} 351cb0ef41Sopenharmony_ci 361cb0ef41Sopenharmony_citmpdir.refresh(); 371cb0ef41Sopenharmony_ci 381cb0ef41Sopenharmony_ci// Verify that flags are defined. 391cb0ef41Sopenharmony_ciassert.strictEqual(typeof COPYFILE_EXCL, 'number'); 401cb0ef41Sopenharmony_ciassert.strictEqual(typeof COPYFILE_FICLONE, 'number'); 411cb0ef41Sopenharmony_ciassert.strictEqual(typeof COPYFILE_FICLONE_FORCE, 'number'); 421cb0ef41Sopenharmony_ciassert.strictEqual(typeof UV_FS_COPYFILE_EXCL, 'number'); 431cb0ef41Sopenharmony_ciassert.strictEqual(typeof UV_FS_COPYFILE_FICLONE, 'number'); 441cb0ef41Sopenharmony_ciassert.strictEqual(typeof UV_FS_COPYFILE_FICLONE_FORCE, 'number'); 451cb0ef41Sopenharmony_ciassert.strictEqual(COPYFILE_EXCL, UV_FS_COPYFILE_EXCL); 461cb0ef41Sopenharmony_ciassert.strictEqual(COPYFILE_FICLONE, UV_FS_COPYFILE_FICLONE); 471cb0ef41Sopenharmony_ciassert.strictEqual(COPYFILE_FICLONE_FORCE, UV_FS_COPYFILE_FICLONE_FORCE); 481cb0ef41Sopenharmony_ci 491cb0ef41Sopenharmony_ci// Verify that files are overwritten when no flags are provided. 501cb0ef41Sopenharmony_cifs.writeFileSync(dest, '', 'utf8'); 511cb0ef41Sopenharmony_ciconst result = fs.copyFileSync(src, dest); 521cb0ef41Sopenharmony_ciassert.strictEqual(result, undefined); 531cb0ef41Sopenharmony_civerify(src, dest); 541cb0ef41Sopenharmony_ci 551cb0ef41Sopenharmony_ci// Verify that files are overwritten with default flags. 561cb0ef41Sopenharmony_cifs.copyFileSync(src, dest, 0); 571cb0ef41Sopenharmony_civerify(src, dest); 581cb0ef41Sopenharmony_ci 591cb0ef41Sopenharmony_ci// Verify that UV_FS_COPYFILE_FICLONE can be used. 601cb0ef41Sopenharmony_cifs.unlinkSync(dest); 611cb0ef41Sopenharmony_cifs.copyFileSync(src, dest, UV_FS_COPYFILE_FICLONE); 621cb0ef41Sopenharmony_civerify(src, dest); 631cb0ef41Sopenharmony_ci 641cb0ef41Sopenharmony_ci// Verify that COPYFILE_FICLONE_FORCE can be used. 651cb0ef41Sopenharmony_citry { 661cb0ef41Sopenharmony_ci fs.unlinkSync(dest); 671cb0ef41Sopenharmony_ci fs.copyFileSync(src, dest, COPYFILE_FICLONE_FORCE); 681cb0ef41Sopenharmony_ci verify(src, dest); 691cb0ef41Sopenharmony_ci} catch (err) { 701cb0ef41Sopenharmony_ci assert.strictEqual(err.syscall, 'copyfile'); 711cb0ef41Sopenharmony_ci assert(err.code === 'ENOTSUP' || err.code === 'ENOTTY' || 721cb0ef41Sopenharmony_ci err.code === 'ENOSYS' || err.code === 'EXDEV'); 731cb0ef41Sopenharmony_ci assert.strictEqual(err.path, src); 741cb0ef41Sopenharmony_ci assert.strictEqual(err.dest, dest); 751cb0ef41Sopenharmony_ci} 761cb0ef41Sopenharmony_ci 771cb0ef41Sopenharmony_ci// Copies asynchronously. 781cb0ef41Sopenharmony_citmpdir.refresh(); // Don't use unlinkSync() since the last test may fail. 791cb0ef41Sopenharmony_cifs.copyFile(src, dest, common.mustSucceed(() => { 801cb0ef41Sopenharmony_ci verify(src, dest); 811cb0ef41Sopenharmony_ci 821cb0ef41Sopenharmony_ci // Copy asynchronously with flags. 831cb0ef41Sopenharmony_ci fs.copyFile(src, dest, COPYFILE_EXCL, common.mustCall((err) => { 841cb0ef41Sopenharmony_ci if (err.code === 'ENOENT') { // Could be ENOENT or EEXIST 851cb0ef41Sopenharmony_ci assert.strictEqual(err.message, 861cb0ef41Sopenharmony_ci 'ENOENT: no such file or directory, copyfile ' + 871cb0ef41Sopenharmony_ci `'${src}' -> '${dest}'`); 881cb0ef41Sopenharmony_ci assert.strictEqual(err.errno, UV_ENOENT); 891cb0ef41Sopenharmony_ci assert.strictEqual(err.code, 'ENOENT'); 901cb0ef41Sopenharmony_ci assert.strictEqual(err.syscall, 'copyfile'); 911cb0ef41Sopenharmony_ci } else { 921cb0ef41Sopenharmony_ci assert.strictEqual(err.message, 931cb0ef41Sopenharmony_ci 'EEXIST: file already exists, copyfile ' + 941cb0ef41Sopenharmony_ci `'${src}' -> '${dest}'`); 951cb0ef41Sopenharmony_ci assert.strictEqual(err.errno, UV_EEXIST); 961cb0ef41Sopenharmony_ci assert.strictEqual(err.code, 'EEXIST'); 971cb0ef41Sopenharmony_ci assert.strictEqual(err.syscall, 'copyfile'); 981cb0ef41Sopenharmony_ci } 991cb0ef41Sopenharmony_ci })); 1001cb0ef41Sopenharmony_ci})); 1011cb0ef41Sopenharmony_ci 1021cb0ef41Sopenharmony_ci// Throws if callback is not a function. 1031cb0ef41Sopenharmony_ciassert.throws(() => { 1041cb0ef41Sopenharmony_ci fs.copyFile(src, dest, 0, 0); 1051cb0ef41Sopenharmony_ci}, { 1061cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE', 1071cb0ef41Sopenharmony_ci name: 'TypeError' 1081cb0ef41Sopenharmony_ci}); 1091cb0ef41Sopenharmony_ci 1101cb0ef41Sopenharmony_ci// Throws if the source path is not a string. 1111cb0ef41Sopenharmony_ci[false, 1, {}, [], null, undefined].forEach((i) => { 1121cb0ef41Sopenharmony_ci assert.throws( 1131cb0ef41Sopenharmony_ci () => fs.copyFile(i, dest, common.mustNotCall()), 1141cb0ef41Sopenharmony_ci { 1151cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE', 1161cb0ef41Sopenharmony_ci name: 'TypeError', 1171cb0ef41Sopenharmony_ci message: /src/ 1181cb0ef41Sopenharmony_ci } 1191cb0ef41Sopenharmony_ci ); 1201cb0ef41Sopenharmony_ci assert.throws( 1211cb0ef41Sopenharmony_ci () => fs.copyFile(src, i, common.mustNotCall()), 1221cb0ef41Sopenharmony_ci { 1231cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE', 1241cb0ef41Sopenharmony_ci name: 'TypeError', 1251cb0ef41Sopenharmony_ci message: /dest/ 1261cb0ef41Sopenharmony_ci } 1271cb0ef41Sopenharmony_ci ); 1281cb0ef41Sopenharmony_ci assert.throws( 1291cb0ef41Sopenharmony_ci () => fs.copyFileSync(i, dest), 1301cb0ef41Sopenharmony_ci { 1311cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE', 1321cb0ef41Sopenharmony_ci name: 'TypeError', 1331cb0ef41Sopenharmony_ci message: /src/ 1341cb0ef41Sopenharmony_ci } 1351cb0ef41Sopenharmony_ci ); 1361cb0ef41Sopenharmony_ci assert.throws( 1371cb0ef41Sopenharmony_ci () => fs.copyFileSync(src, i), 1381cb0ef41Sopenharmony_ci { 1391cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE', 1401cb0ef41Sopenharmony_ci name: 'TypeError', 1411cb0ef41Sopenharmony_ci message: /dest/ 1421cb0ef41Sopenharmony_ci } 1431cb0ef41Sopenharmony_ci ); 1441cb0ef41Sopenharmony_ci}); 1451cb0ef41Sopenharmony_ci 1461cb0ef41Sopenharmony_ciassert.throws(() => { 1471cb0ef41Sopenharmony_ci fs.copyFileSync(src, dest, 'r'); 1481cb0ef41Sopenharmony_ci}, { 1491cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE', 1501cb0ef41Sopenharmony_ci name: 'TypeError', 1511cb0ef41Sopenharmony_ci message: /mode/ 1521cb0ef41Sopenharmony_ci}); 1531cb0ef41Sopenharmony_ci 1541cb0ef41Sopenharmony_ciassert.throws(() => { 1551cb0ef41Sopenharmony_ci fs.copyFileSync(src, dest, 8); 1561cb0ef41Sopenharmony_ci}, { 1571cb0ef41Sopenharmony_ci code: 'ERR_OUT_OF_RANGE', 1581cb0ef41Sopenharmony_ci name: 'RangeError', 1591cb0ef41Sopenharmony_ci}); 1601cb0ef41Sopenharmony_ci 1611cb0ef41Sopenharmony_ciassert.throws(() => { 1621cb0ef41Sopenharmony_ci fs.copyFile(src, dest, 'r', common.mustNotCall()); 1631cb0ef41Sopenharmony_ci}, { 1641cb0ef41Sopenharmony_ci code: 'ERR_INVALID_ARG_TYPE', 1651cb0ef41Sopenharmony_ci name: 'TypeError', 1661cb0ef41Sopenharmony_ci message: /mode/ 1671cb0ef41Sopenharmony_ci}); 168