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