deno.land / std@0.166.0 / node / _tools / test / parallel / test-fs-mkdir.js
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380// deno-fmt-ignore-file// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.// Taken from Node 18.8.0// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
// Copyright Joyent, Inc. and other Node contributors.//// Permission is hereby granted, free of charge, to any person obtaining a// copy of this software and associated documentation files (the// "Software"), to deal in the Software without restriction, including// without limitation the rights to use, copy, modify, merge, publish,// distribute, sublicense, and/or sell copies of the Software, and to permit// persons to whom the Software is furnished to do so, subject to the// following conditions://// The above copyright notice and this permission notice shall be included// in all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE// USE OR OTHER DEALINGS IN THE SOFTWARE.
'use strict';const common = require('../common');const assert = require('assert');const fs = require('fs');const path = require('path');
const tmpdir = require('../common/tmpdir');tmpdir.refresh();
let dirc = 0;function nextdir() { return `test${++dirc}`;}
// fs.mkdir creates directory using assigned path{ const pathname = path.join(tmpdir.path, nextdir());
fs.mkdir(pathname, common.mustCall(function(err) { assert.strictEqual(err, null); assert.strictEqual(fs.existsSync(pathname), true); }));}
// fs.mkdir creates directory with assigned mode value{ const pathname = path.join(tmpdir.path, nextdir());
fs.mkdir(pathname, 0o777, common.mustCall(function(err) { assert.strictEqual(err, null); assert.strictEqual(fs.existsSync(pathname), true); }));}
// fs.mkdir creates directory with mode passed as an options object{ const pathname = path.join(tmpdir.path, nextdir());
fs.mkdir(pathname, common.mustNotMutateObjectDeep({ mode: 0o777 }), common.mustCall(function(err) { assert.strictEqual(err, null); assert.strictEqual(fs.existsSync(pathname), true); }));}
// fs.mkdirSync creates directory with mode passed as an options object{ const pathname = path.join(tmpdir.path, nextdir());
fs.mkdirSync(pathname, common.mustNotMutateObjectDeep({ mode: 0o777 }));
assert.strictEqual(fs.existsSync(pathname), true);}
// mkdirSync successfully creates directory from given path{ const pathname = path.join(tmpdir.path, nextdir());
fs.mkdirSync(pathname);
const exists = fs.existsSync(pathname); assert.strictEqual(exists, true);}
// mkdirSync and mkdir require path to be a string, buffer or url.// Anything else generates an error.[false, 1, {}, [], null, undefined].forEach((i) => { assert.throws( () => fs.mkdir(i, common.mustNotCall()), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } ); assert.throws( () => fs.mkdirSync(i), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } );});
// mkdirpSync when both top-level, and sub-folders do not exist.{ const pathname = path.join(tmpdir.path, nextdir(), nextdir());
fs.mkdirSync(pathname, common.mustNotMutateObjectDeep({ recursive: true }));
const exists = fs.existsSync(pathname); assert.strictEqual(exists, true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true);}
// mkdirpSync when folder already exists.{ const pathname = path.join(tmpdir.path, nextdir(), nextdir());
fs.mkdirSync(pathname, { recursive: true }); // Should not cause an error. fs.mkdirSync(pathname, { recursive: true });
const exists = fs.existsSync(pathname); assert.strictEqual(exists, true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true);}
// mkdirpSync ../{ const pathname = `${tmpdir.path}/${nextdir()}/../${nextdir()}/${nextdir()}`; fs.mkdirSync(pathname, { recursive: true }); const exists = fs.existsSync(pathname); assert.strictEqual(exists, true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true);}
// mkdirpSync when path is a file.{ const pathname = path.join(tmpdir.path, nextdir(), nextdir());
fs.mkdirSync(path.dirname(pathname)); fs.writeFileSync(pathname, '', 'utf8');
assert.throws( () => { fs.mkdirSync(pathname, common.mustNotMutateObjectDeep({ recursive: true })); }, { code: 'EEXIST', message: /EEXIST: .*mkdir/, name: 'Error', syscall: 'mkdir', } );}
// mkdirpSync when part of the path is a file.{ const filename = path.join(tmpdir.path, nextdir(), nextdir()); const pathname = path.join(filename, nextdir(), nextdir());
fs.mkdirSync(path.dirname(filename)); fs.writeFileSync(filename, '', 'utf8');
assert.throws( () => { fs.mkdirSync(pathname, { recursive: true }); }, { code: 'ENOTDIR', message: /ENOTDIR: .*mkdir/, name: 'Error', syscall: 'mkdir', path: pathname // See: https://github.com/nodejs/node/issues/28015 } );}
// `mkdirp` when folder does not yet exist.{ const pathname = path.join(tmpdir.path, nextdir(), nextdir());
fs.mkdir(pathname, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall(function(err) { assert.strictEqual(err, null); assert.strictEqual(fs.existsSync(pathname), true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true); }));}
// `mkdirp` when path is a file.{ const pathname = path.join(tmpdir.path, nextdir(), nextdir());
fs.mkdirSync(path.dirname(pathname)); fs.writeFileSync(pathname, '', 'utf8'); fs.mkdir(pathname, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall((err) => { assert.strictEqual(err.code, 'EEXIST'); // TODO(wafuwafu13): Enable this // assert.strictEqual(err.syscall, 'mkdir'); assert.strictEqual(fs.statSync(pathname).isDirectory(), false); }));}
// `mkdirp` when part of the path is a file.{ const filename = path.join(tmpdir.path, nextdir(), nextdir()); const pathname = path.join(filename, nextdir(), nextdir());
fs.mkdirSync(path.dirname(filename)); fs.writeFileSync(filename, '', 'utf8'); fs.mkdir(pathname, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall((err) => { // TODO(wafuwafu13): Enable this // assert.strictEqual(err.code, 'ENOTDIR'); // assert.strictEqual(err.syscall, 'mkdir'); assert.strictEqual(fs.existsSync(pathname), false); // See: https://github.com/nodejs/node/issues/28015 // The path field varies slightly in Windows errors, vs., other platforms // see: https://github.com/libuv/libuv/issues/2661, for this reason we // use startsWith() rather than comparing to the full "pathname". // TODO(wafuwafu13): Enable this // assert(err.path.startsWith(filename)); }));}
// mkdirpSync dirname loop// XXX: windows and smartos have issues removing a directory that you're in.if (common.isMainThread && (common.isLinux || common.isOSX)) { const pathname = path.join(tmpdir.path, nextdir()); fs.mkdirSync(pathname); process.chdir(pathname); fs.rmdirSync(pathname); assert.throws( () => { fs.mkdirSync('X', common.mustNotMutateObjectDeep({ recursive: true })); }, { code: 'ENOENT', message: /ENOENT: .*mkdir/, name: 'Error', syscall: 'mkdir', } ); fs.mkdir('X', common.mustNotMutateObjectDeep({ recursive: true }), (err) => { assert.strictEqual(err.code, 'ENOENT'); // TODO(wafuwafu13): Enable this // assert.strictEqual(err.syscall, 'mkdir'); });}
// mkdirSync and mkdir require options.recursive to be a boolean.// Anything else generates an error.{ const pathname = path.join(tmpdir.path, nextdir()); ['', 1, {}, [], null, Symbol('test'), () => {}].forEach((recursive) => { const received = common.invalidArgTypeHelper(recursive); assert.throws( () => fs.mkdir(pathname, common.mustNotMutateObjectDeep({ recursive }), common.mustNotCall()), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: 'The "options.recursive" property must be of type boolean.' + received } ); assert.throws( () => fs.mkdirSync(pathname, common.mustNotMutateObjectDeep({ recursive })), { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: 'The "options.recursive" property must be of type boolean.' + received } ); });}
// `mkdirp` returns first folder created, when all folders are new.{ const dir1 = nextdir(); const dir2 = nextdir(); const firstPathCreated = path.join(tmpdir.path, dir1); const pathname = path.join(tmpdir.path, dir1, dir2);
fs.mkdir(pathname, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall(function(err, path) { assert.strictEqual(err, null); assert.strictEqual(fs.existsSync(pathname), true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true); // TODO(wafuwafu13): Enable this // assert.strictEqual(path, firstPathCreated); }));}
// `mkdirp` returns first folder created, when last folder is new.{ const dir1 = nextdir(); const dir2 = nextdir(); const pathname = path.join(tmpdir.path, dir1, dir2); fs.mkdirSync(path.join(tmpdir.path, dir1)); fs.mkdir(pathname, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall(function(err, path) { assert.strictEqual(err, null); assert.strictEqual(fs.existsSync(pathname), true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true); // TODO(wafuwafu13): Enable this // assert.strictEqual(path, pathname); }));}
// `mkdirp` returns undefined, when no new folders are created.{ const dir1 = nextdir(); const dir2 = nextdir(); const pathname = path.join(tmpdir.path, dir1, dir2); fs.mkdirSync(path.join(tmpdir.path, dir1, dir2), common.mustNotMutateObjectDeep({ recursive: true })); fs.mkdir(pathname, common.mustNotMutateObjectDeep({ recursive: true }), common.mustCall(function(err, path) { assert.strictEqual(err, null); assert.strictEqual(fs.existsSync(pathname), true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true); assert.strictEqual(path, undefined); }));}
// `mkdirp.sync` returns first folder created, when all folders are new.{ const dir1 = nextdir(); const dir2 = nextdir(); const firstPathCreated = path.join(tmpdir.path, dir1); const pathname = path.join(tmpdir.path, dir1, dir2); const p = fs.mkdirSync(pathname, common.mustNotMutateObjectDeep({ recursive: true })); assert.strictEqual(fs.existsSync(pathname), true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true); // TODO(wafuwafu13): Enable this // assert.strictEqual(p, firstPathCreated);}
// `mkdirp.sync` returns first folder created, when last folder is new.{ const dir1 = nextdir(); const dir2 = nextdir(); const pathname = path.join(tmpdir.path, dir1, dir2); fs.mkdirSync(path.join(tmpdir.path, dir1), common.mustNotMutateObjectDeep({ recursive: true })); const p = fs.mkdirSync(pathname, common.mustNotMutateObjectDeep({ recursive: true })); assert.strictEqual(fs.existsSync(pathname), true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true); // TODO(wafuwafu13): Enable this // assert.strictEqual(p, pathname);}
// `mkdirp.sync` returns undefined, when no new folders are created.{ const dir1 = nextdir(); const dir2 = nextdir(); const pathname = path.join(tmpdir.path, dir1, dir2); fs.mkdirSync(path.join(tmpdir.path, dir1, dir2), common.mustNotMutateObjectDeep({ recursive: true })); const p = fs.mkdirSync(pathname, common.mustNotMutateObjectDeep({ recursive: true })); assert.strictEqual(fs.existsSync(pathname), true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true); assert.strictEqual(p, undefined);}
// `mkdirp.promises` returns first folder created, when all folders are new.{ const dir1 = nextdir(); const dir2 = nextdir(); const firstPathCreated = path.join(tmpdir.path, dir1); const pathname = path.join(tmpdir.path, dir1, dir2); async function testCase() { const p = await fs.promises.mkdir(pathname, common.mustNotMutateObjectDeep({ recursive: true })); assert.strictEqual(fs.existsSync(pathname), true); assert.strictEqual(fs.statSync(pathname).isDirectory(), true); // TODO(wafuwafu13): Enable this // assert.strictEqual(p, firstPathCreated); } testCase();}
// Keep the event loop alive so the async mkdir() requests// have a chance to run (since they don't ref the event loop).process.nextTick(() => {});
Version Info