| 'use strict'; |
| |
| // Test that fs.copyFile() respects file permissions. |
| // Ref: https://github.com/nodejs/node/issues/26936 |
| |
| const common = require('../common'); |
| |
| if (!common.isWindows && process.getuid() === 0) |
| common.skip('as this test should not be run as `root`'); |
| |
| const tmpdir = require('../common/tmpdir'); |
| tmpdir.refresh(); |
| |
| const assert = require('assert'); |
| const fs = require('fs'); |
| const path = require('path'); |
| |
| let n = 0; |
| |
| function beforeEach() { |
| n++; |
| const source = path.join(tmpdir.path, `source${n}`); |
| const dest = path.join(tmpdir.path, `dest${n}`); |
| fs.writeFileSync(source, 'source'); |
| fs.writeFileSync(dest, 'dest'); |
| fs.chmodSync(dest, '444'); |
| |
| const check = (err) => { |
| const expected = ['EACCES', 'EPERM']; |
| assert(expected.includes(err.code), `${err.code} not in ${expected}`); |
| assert.strictEqual(fs.readFileSync(dest, 'utf8'), 'dest'); |
| return true; |
| }; |
| |
| return { source, dest, check }; |
| } |
| |
| // Test synchronous API. |
| { |
| const { source, dest, check } = beforeEach(); |
| assert.throws(() => { fs.copyFileSync(source, dest); }, check); |
| } |
| |
| // Test promises API. |
| { |
| const { source, dest, check } = beforeEach(); |
| (async () => { |
| await assert.rejects(fs.promises.copyFile(source, dest), check); |
| })(); |
| } |
| |
| // Test callback API. |
| { |
| const { source, dest, check } = beforeEach(); |
| fs.copyFile(source, dest, common.mustCall(check)); |
| } |