diff options
Diffstat (limited to 'cli/tests/node_compat/test')
589 files changed, 0 insertions, 58527 deletions
diff --git a/cli/tests/node_compat/test/common/child_process.js b/cli/tests/node_compat/test/common/child_process.js deleted file mode 100644 index b860d7697..000000000 --- a/cli/tests/node_compat/test/common/child_process.js +++ /dev/null @@ -1,56 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const assert = require('assert'); -const common = require('./'); - -// Workaround for Windows Server 2008R2 -// When CMD is used to launch a process and CMD is killed too quickly, the -// process can stay behind running in suspended state, never completing. -function cleanupStaleProcess(filename) { - if (!common.isWindows) { - return; - } - process.once('beforeExit', () => { - const basename = filename.replace(/.*[/\\]/g, ''); - try { - require('child_process') - .execFileSync(`${process.env.SystemRoot}\\System32\\wbem\\WMIC.exe`, [ - 'process', - 'where', - `commandline like '%${basename}%child'`, - 'delete', - '/nointeractive', - ]); - } catch { - // Ignore failures, there might not be any stale process to clean up. - } - }); -} - -// This should keep the child process running long enough to expire -// the timeout. -const kExpiringChildRunTime = common.platformTimeout(20 * 1000); -const kExpiringParentTimer = 1; -assert(kExpiringChildRunTime > kExpiringParentTimer); - -function logAfterTime(time) { - setTimeout(() => { - // The following console statements are part of the test. - console.log('child stdout'); - console.error('child stderr'); - }, time); -} - -module.exports = { - cleanupStaleProcess, - logAfterTime, - kExpiringChildRunTime, - kExpiringParentTimer, -}; diff --git a/cli/tests/node_compat/test/common/countdown.js b/cli/tests/node_compat/test/common/countdown.js deleted file mode 100644 index a7ae0d029..000000000 --- a/cli/tests/node_compat/test/common/countdown.js +++ /dev/null @@ -1,35 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const assert = require('assert'); -const kLimit = Symbol('limit'); -const kCallback = Symbol('callback'); -const common = require('./'); - -class Countdown { - constructor(limit, cb) { - assert.strictEqual(typeof limit, 'number'); - assert.strictEqual(typeof cb, 'function'); - this[kLimit] = limit; - this[kCallback] = common.mustCall(cb); - } - - dec() { - assert(this[kLimit] > 0, 'Countdown expired'); - if (--this[kLimit] === 0) - this[kCallback](); - return this[kLimit]; - } - - get remaining() { - return this[kLimit]; - } -} - -module.exports = Countdown; diff --git a/cli/tests/node_compat/test/common/dns.js b/cli/tests/node_compat/test/common/dns.js deleted file mode 100644 index 54df6a55e..000000000 --- a/cli/tests/node_compat/test/common/dns.js +++ /dev/null @@ -1,327 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const assert = require('assert'); -const os = require('os'); - -const types = { - A: 1, - AAAA: 28, - NS: 2, - CNAME: 5, - SOA: 6, - PTR: 12, - MX: 15, - TXT: 16, - ANY: 255, - CAA: 257, -}; - -const classes = { - IN: 1, -}; - -// Naïve DNS parser/serializer. - -function readDomainFromPacket(buffer, offset) { - assert.ok(offset < buffer.length); - const length = buffer[offset]; - if (length === 0) { - return { nread: 1, domain: '' }; - } else if ((length & 0xC0) === 0) { - offset += 1; - const chunk = buffer.toString('ascii', offset, offset + length); - // Read the rest of the domain. - const { nread, domain } = readDomainFromPacket(buffer, offset + length); - return { - nread: 1 + length + nread, - domain: domain ? `${chunk}.${domain}` : chunk, - }; - } - // Pointer to another part of the packet. - assert.strictEqual(length & 0xC0, 0xC0); - // eslint-disable-next-line space-infix-ops, space-unary-ops - const pointeeOffset = buffer.readUInt16BE(offset) &~ 0xC000; - return { - nread: 2, - domain: readDomainFromPacket(buffer, pointeeOffset), - }; -} - -function parseDNSPacket(buffer) { - assert.ok(buffer.length > 12); - - const parsed = { - id: buffer.readUInt16BE(0), - flags: buffer.readUInt16BE(2), - }; - - const counts = [ - ['questions', buffer.readUInt16BE(4)], - ['answers', buffer.readUInt16BE(6)], - ['authorityAnswers', buffer.readUInt16BE(8)], - ['additionalRecords', buffer.readUInt16BE(10)], - ]; - - let offset = 12; - for (const [ sectionName, count ] of counts) { - parsed[sectionName] = []; - for (let i = 0; i < count; ++i) { - const { nread, domain } = readDomainFromPacket(buffer, offset); - offset += nread; - - const type = buffer.readUInt16BE(offset); - - const rr = { - domain, - cls: buffer.readUInt16BE(offset + 2), - }; - offset += 4; - - for (const name in types) { - if (types[name] === type) - rr.type = name; - } - - if (sectionName !== 'questions') { - rr.ttl = buffer.readInt32BE(offset); - const dataLength = buffer.readUInt16BE(offset); - offset += 6; - - switch (type) { - case types.A: - assert.strictEqual(dataLength, 4); - rr.address = `${buffer[offset + 0]}.${buffer[offset + 1]}.` + - `${buffer[offset + 2]}.${buffer[offset + 3]}`; - break; - case types.AAAA: - assert.strictEqual(dataLength, 16); - rr.address = buffer.toString('hex', offset, offset + 16) - .replace(/(.{4}(?!$))/g, '$1:'); - break; - case types.TXT: - { - let position = offset; - rr.entries = []; - while (position < offset + dataLength) { - const txtLength = buffer[offset]; - rr.entries.push(buffer.toString('utf8', - position + 1, - position + 1 + txtLength)); - position += 1 + txtLength; - } - assert.strictEqual(position, offset + dataLength); - break; - } - case types.MX: - { - rr.priority = buffer.readInt16BE(buffer, offset); - offset += 2; - const { nread, domain } = readDomainFromPacket(buffer, offset); - rr.exchange = domain; - assert.strictEqual(nread, dataLength); - break; - } - case types.NS: - case types.CNAME: - case types.PTR: - { - const { nread, domain } = readDomainFromPacket(buffer, offset); - rr.value = domain; - assert.strictEqual(nread, dataLength); - break; - } - case types.SOA: - { - const mname = readDomainFromPacket(buffer, offset); - const rname = readDomainFromPacket(buffer, offset + mname.nread); - rr.nsname = mname.domain; - rr.hostmaster = rname.domain; - const trailerOffset = offset + mname.nread + rname.nread; - rr.serial = buffer.readUInt32BE(trailerOffset); - rr.refresh = buffer.readUInt32BE(trailerOffset + 4); - rr.retry = buffer.readUInt32BE(trailerOffset + 8); - rr.expire = buffer.readUInt32BE(trailerOffset + 12); - rr.minttl = buffer.readUInt32BE(trailerOffset + 16); - - assert.strictEqual(trailerOffset + 20, dataLength); - break; - } - default: - throw new Error(`Unknown RR type ${rr.type}`); - } - offset += dataLength; - } - - parsed[sectionName].push(rr); - - assert.ok(offset <= buffer.length); - } - } - - assert.strictEqual(offset, buffer.length); - return parsed; -} - -function writeIPv6(ip) { - const parts = ip.replace(/^:|:$/g, '').split(':'); - const buf = Buffer.alloc(16); - - let offset = 0; - for (const part of parts) { - if (part === '') { - offset += 16 - 2 * (parts.length - 1); - } else { - buf.writeUInt16BE(parseInt(part, 16), offset); - offset += 2; - } - } - - return buf; -} - -function writeDomainName(domain) { - return Buffer.concat(domain.split('.').map((label) => { - assert(label.length < 64); - return Buffer.concat([ - Buffer.from([label.length]), - Buffer.from(label, 'ascii'), - ]); - }).concat([Buffer.alloc(1)])); -} - -function writeDNSPacket(parsed) { - const buffers = []; - const kStandardResponseFlags = 0x8180; - - buffers.push(new Uint16Array([ - parsed.id, - parsed.flags === undefined ? kStandardResponseFlags : parsed.flags, - parsed.questions && parsed.questions.length, - parsed.answers && parsed.answers.length, - parsed.authorityAnswers && parsed.authorityAnswers.length, - parsed.additionalRecords && parsed.additionalRecords.length, - ])); - - for (const q of parsed.questions) { - assert(types[q.type]); - buffers.push(writeDomainName(q.domain)); - buffers.push(new Uint16Array([ - types[q.type], - q.cls === undefined ? classes.IN : q.cls, - ])); - } - - for (const rr of [].concat(parsed.answers, - parsed.authorityAnswers, - parsed.additionalRecords)) { - if (!rr) continue; - - assert(types[rr.type]); - buffers.push(writeDomainName(rr.domain)); - buffers.push(new Uint16Array([ - types[rr.type], - rr.cls === undefined ? classes.IN : rr.cls, - ])); - buffers.push(new Int32Array([rr.ttl])); - - const rdLengthBuf = new Uint16Array(1); - buffers.push(rdLengthBuf); - - switch (rr.type) { - case 'A': - rdLengthBuf[0] = 4; - buffers.push(new Uint8Array(rr.address.split('.'))); - break; - case 'AAAA': - rdLengthBuf[0] = 16; - buffers.push(writeIPv6(rr.address)); - break; - case 'TXT': { - const total = rr.entries.map((s) => s.length).reduce((a, b) => a + b); - // Total length of all strings + 1 byte each for their lengths. - rdLengthBuf[0] = rr.entries.length + total; - for (const txt of rr.entries) { - buffers.push(new Uint8Array([Buffer.byteLength(txt)])); - buffers.push(Buffer.from(txt)); - } - break; - } - case 'MX': - rdLengthBuf[0] = 2; - buffers.push(new Uint16Array([rr.priority])); - // fall through - case 'NS': - case 'CNAME': - case 'PTR': - { - const domain = writeDomainName(rr.exchange || rr.value); - rdLengthBuf[0] += domain.length; - buffers.push(domain); - break; - } - case 'SOA': - { - const mname = writeDomainName(rr.nsname); - const rname = writeDomainName(rr.hostmaster); - rdLengthBuf[0] = mname.length + rname.length + 20; - buffers.push(mname, rname); - buffers.push(new Uint32Array([ - rr.serial, rr.refresh, rr.retry, rr.expire, rr.minttl, - ])); - break; - } - case 'CAA': - { - rdLengthBuf[0] = 5 + rr.issue.length + 2; - buffers.push(Buffer.from([Number(rr.critical)])); - buffers.push(Buffer.from([Number(5)])); - buffers.push(Buffer.from('issue' + rr.issue)); - break; - } - default: - throw new Error(`Unknown RR type ${rr.type}`); - } - } - - return Buffer.concat(buffers.map((typedArray) => { - const buf = Buffer.from(typedArray.buffer, - typedArray.byteOffset, - typedArray.byteLength); - if (os.endianness() === 'LE') { - if (typedArray.BYTES_PER_ELEMENT === 2) buf.swap16(); - if (typedArray.BYTES_PER_ELEMENT === 4) buf.swap32(); - } - return buf; - })); -} - -const mockedErrorCode = 'ENOTFOUND'; -const mockedSysCall = 'getaddrinfo'; - -function errorLookupMock(code = mockedErrorCode, syscall = mockedSysCall) { - return function lookupWithError(hostname, dnsopts, cb) { - const err = new Error(`${syscall} ${code} ${hostname}`); - err.code = code; - err.errno = code; - err.syscall = syscall; - err.hostname = hostname; - cb(err); - }; -} - -module.exports = { - types, - classes, - writeDNSPacket, - parseDNSPacket, - errorLookupMock, - mockedErrorCode, - mockedSysCall, -}; diff --git a/cli/tests/node_compat/test/common/duplexpair.js b/cli/tests/node_compat/test/common/duplexpair.js deleted file mode 100644 index 6e5286cc8..000000000 --- a/cli/tests/node_compat/test/common/duplexpair.js +++ /dev/null @@ -1,55 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const { Duplex } = require('stream'); -const assert = require('assert'); - -const kCallback = Symbol('Callback'); -const kOtherSide = Symbol('Other'); - -class DuplexSocket extends Duplex { - constructor() { - super(); - this[kCallback] = null; - this[kOtherSide] = null; - } - - _read() { - const callback = this[kCallback]; - if (callback) { - this[kCallback] = null; - callback(); - } - } - - _write(chunk, encoding, callback) { - assert.notStrictEqual(this[kOtherSide], null); - assert.strictEqual(this[kOtherSide][kCallback], null); - if (chunk.length === 0) { - process.nextTick(callback); - } else { - this[kOtherSide].push(chunk); - this[kOtherSide][kCallback] = callback; - } - } - - _final(callback) { - this[kOtherSide].on('end', callback); - this[kOtherSide].push(null); - } -} - -function makeDuplexPair() { - const clientSide = new DuplexSocket(); - const serverSide = new DuplexSocket(); - clientSide[kOtherSide] = serverSide; - serverSide[kOtherSide] = clientSide; - return { clientSide, serverSide }; -} - -module.exports = makeDuplexPair; diff --git a/cli/tests/node_compat/test/common/fixtures.js b/cli/tests/node_compat/test/common/fixtures.js deleted file mode 100644 index 64b888eb6..000000000 --- a/cli/tests/node_compat/test/common/fixtures.js +++ /dev/null @@ -1,45 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const path = require('path'); -const fs = require('fs'); -const { pathToFileURL } = require('url'); - -const fixturesDir = path.join(__dirname, '..', 'fixtures'); - -function fixturesPath(...args) { - return path.join(fixturesDir, ...args); -} - -function fixturesFileURL(...args) { - return pathToFileURL(fixturesPath(...args)); -} - -function readFixtureSync(args, enc) { - if (Array.isArray(args)) - return fs.readFileSync(fixturesPath(...args), enc); - return fs.readFileSync(fixturesPath(args), enc); -} - -function readFixtureKey(name, enc) { - return fs.readFileSync(fixturesPath('keys', name), enc); -} - -function readFixtureKeys(enc, ...names) { - return names.map((name) => readFixtureKey(name, enc)); -} - -module.exports = { - fixturesDir, - path: fixturesPath, - fileURL: fixturesFileURL, - readSync: readFixtureSync, - readKey: readFixtureKey, - readKeys: readFixtureKeys, -}; diff --git a/cli/tests/node_compat/test/common/hijackstdio.js b/cli/tests/node_compat/test/common/hijackstdio.js deleted file mode 100644 index 38582ece2..000000000 --- a/cli/tests/node_compat/test/common/hijackstdio.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Hijack stdout and stderr -const stdWrite = {}; -function hijackStdWritable(name, listener) { - const stream = process[name]; - const _write = stdWrite[name] = stream.write; - - stream.writeTimes = 0; - stream.write = function(data, callback) { - try { - listener(data); - } catch (e) { - process.nextTick(() => { throw e; }); - } - - _write.call(stream, data, callback); - stream.writeTimes++; - }; -} - -function restoreWritable(name) { - process[name].write = stdWrite[name]; - delete process[name].writeTimes; -} - -module.exports = { - hijackStdout: hijackStdWritable.bind(null, 'stdout'), - hijackStderr: hijackStdWritable.bind(null, 'stderr'), - restoreStdout: restoreWritable.bind(null, 'stdout'), - restoreStderr: restoreWritable.bind(null, 'stderr'), -}; diff --git a/cli/tests/node_compat/test/common/index.js b/cli/tests/node_compat/test/common/index.js deleted file mode 100644 index 9f5b4814c..000000000 --- a/cli/tests/node_compat/test/common/index.js +++ /dev/null @@ -1,496 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. - -/** - * This file is meant as a replacement for the original common/index.js - * - * That file has a lot of node functionality not currently supported, so this is a lite - * version of that file, which most tests should be able to use - */ -'use strict'; -const assert = require("assert"); -const path = require("path"); -const util = require("util"); -const tmpdir = require("./tmpdir"); - -function platformTimeout(ms) { - return ms; -} - -let localhostIPv4 = null; - -let knownGlobals = [ - AbortSignal, - addEventListener, - alert, - atob, - btoa, - Buffer, - caches, - clearImmediate, - close, - closed, - confirm, - console, - createImageBitmap, - crypto, - Deno, - dispatchEvent, - EventSource, - fetch, - getParent, - global, - global.clearInterval, - global.clearTimeout, - global.setInterval, - global.setTimeout, - localStorage, - location, - name, - navigator, - onload, - onunload, - process, - prompt, - queueMicrotask, - removeEventListener, - reportError, - self, - sessionStorage, - setImmediate, - window, -]; - -if (global.AbortController) - knownGlobals.push(global.AbortController); - -if (global.gc) { - knownGlobals.push(global.gc); -} - -if (global.performance) { - knownGlobals.push(global.performance); -} -if (global.PerformanceMark) { - knownGlobals.push(global.PerformanceMark); -} -if (global.PerformanceMeasure) { - knownGlobals.push(global.PerformanceMeasure); -} - -if (global.structuredClone) { - knownGlobals.push(global.structuredClone); -} - -function allowGlobals(...allowlist) { - knownGlobals = knownGlobals.concat(allowlist); -} - -if (process.env.NODE_TEST_KNOWN_GLOBALS !== '0') { - if (process.env.NODE_TEST_KNOWN_GLOBALS) { - const knownFromEnv = process.env.NODE_TEST_KNOWN_GLOBALS.split(','); - allowGlobals(...knownFromEnv); - } - - function leakedGlobals() { - const leaked = []; - - for (const val in global) { - if (!knownGlobals.includes(global[val])) { - leaked.push(val); - } - } - - return leaked; - } - - process.on('exit', function() { - const leaked = leakedGlobals(); - if (leaked.length > 0) { - assert.fail(`Unexpected global(s) found: ${leaked.join(', ')}`); - } - }); -} - -function _expectWarning(name, expected, code) { - if (typeof expected === 'string') { - expected = [[expected, code]]; - } else if (!Array.isArray(expected)) { - expected = Object.entries(expected).map(([a, b]) => [b, a]); - } else if (!(Array.isArray(expected[0]))) { - expected = [[expected[0], expected[1]]]; - } - // Deprecation codes are mandatory, everything else is not. - if (name === 'DeprecationWarning') { - expected.forEach(([_, code]) => assert(code, expected)); - } - return mustCall((warning) => { - const [ message, code ] = expected.shift(); - assert.strictEqual(warning.name, name); - if (typeof message === 'string') { - assert.strictEqual(warning.message, message); - } else { - assert.match(warning.message, message); - } - assert.strictEqual(warning.code, code); - }, expected.length); -} - -let catchWarning; - -// Accepts a warning name and description or array of descriptions or a map of -// warning names to description(s) ensures a warning is generated for each -// name/description pair. -// The expected messages have to be unique per `expectWarning()` call. -function expectWarning(nameOrMap, expected, code) { - if (catchWarning === undefined) { - catchWarning = {}; - process.on('warning', (warning) => { - if (!catchWarning[warning.name]) { - throw new TypeError( - `"${warning.name}" was triggered without being expected.\n` + - util.inspect(warning) - ); - } - catchWarning[warning.name](warning); - }); - } - if (typeof nameOrMap === 'string') { - catchWarning[nameOrMap] = _expectWarning(nameOrMap, expected, code); - } else { - Object.keys(nameOrMap).forEach((name) => { - catchWarning[name] = _expectWarning(name, nameOrMap[name]); - }); - } -} - -/** - * Useful for testing expected internal/error objects - * - * @param {Error} error - */ -function expectsError(validator, exact) { - /** - * @param {Error} error - */ - return mustCall((...args) => { - if (args.length !== 1) { - // Do not use `assert.strictEqual()` to prevent `inspect` from - // always being called. - assert.fail(`Expected one argument, got ${util.inspect(args)}`); - } - const error = args.pop(); - const descriptor = Object.getOwnPropertyDescriptor(error, 'message'); - // The error message should be non-enumerable - assert.strictEqual(descriptor.enumerable, false); - - assert.throws(() => { throw error; }, validator); - return true; - }, exact); -} - -const noop = () => {}; - -/** - * @param {Function} fn - * @param {number} exact - */ -function mustCall(fn, exact) { - return _mustCallInner(fn, exact, "exact"); -} - -function mustCallAtLeast(fn, minimum) { - return _mustCallInner(fn, minimum, 'minimum'); -} - -function mustSucceed(fn, exact) { - return mustCall(function(err, ...args) { - assert.ifError(err); - if (typeof fn === 'function') - return fn.apply(this, args); - }, exact); -} - -const mustCallChecks = []; -/** - * @param {number} exitCode - */ -function runCallChecks(exitCode) { - if (exitCode !== 0) return; - - const failed = mustCallChecks.filter(function (context) { - if ("minimum" in context) { - context.messageSegment = `at least ${context.minimum}`; - return context.actual < context.minimum; - } - context.messageSegment = `exactly ${context.exact}`; - return context.actual !== context.exact; - }); - - failed.forEach(function (context) { - console.log( - "Mismatched %s function calls. Expected %s, actual %d.", - context.name, - context.messageSegment, - context.actual, - ); - console.log(context.stack.split("\n").slice(2).join("\n")); - }); - - if (failed.length) process.exit(1); -} - -/** - * @param {Function} fn - * @param {"exact" | "minimum"} field - */ -function _mustCallInner(fn, criteria = 1, field) { - // @ts-ignore - if (process._exiting) { - throw new Error("Cannot use common.mustCall*() in process exit handler"); - } - if (typeof fn === "number") { - criteria = fn; - fn = noop; - } else if (fn === undefined) { - fn = noop; - } - - if (typeof criteria !== "number") { - throw new TypeError(`Invalid ${field} value: ${criteria}`); - } - - let context; - if (field === "exact") { - context = { - exact: criteria, - actual: 0, - stack: util.inspect(new Error()), - name: fn.name || "<anonymous>", - }; - } else { - context = { - minimum: criteria, - actual: 0, - stack: util.inspect(new Error()), - name: fn.name || "<anonymous>", - }; - } - - // Add the exit listener only once to avoid listener leak warnings - if (mustCallChecks.length === 0) process.on("exit", runCallChecks); - - mustCallChecks.push(context); - - return function () { - context.actual++; - return fn.apply(this, arguments); - }; -} - -/** - * @param {string=} msg - */ -function mustNotCall(msg) { - /** - * @param {any[]} args - */ - return function mustNotCall(...args) { - const argsInfo = args.length > 0 - ? `\ncalled with arguments: ${args.map(util.inspect).join(", ")}` - : ""; - assert.fail( - `${msg || "function should not have been called"} at unknown` + - argsInfo, - ); - }; -} - -const _mustNotMutateObjectDeepProxies = new WeakMap(); - -function mustNotMutateObjectDeep(original) { - // Return primitives and functions directly. Primitives are immutable, and - // proxied functions are impossible to compare against originals, e.g. with - // `assert.deepEqual()`. - if (original === null || typeof original !== 'object') { - return original; - } - - const cachedProxy = _mustNotMutateObjectDeepProxies.get(original); - if (cachedProxy) { - return cachedProxy; - } - - const _mustNotMutateObjectDeepHandler = { - __proto__: null, - defineProperty(target, property, descriptor) { - assert.fail(`Expected no side effects, got ${inspect(property)} ` + - 'defined'); - }, - deleteProperty(target, property) { - assert.fail(`Expected no side effects, got ${inspect(property)} ` + - 'deleted'); - }, - get(target, prop, receiver) { - return mustNotMutateObjectDeep(Reflect.get(target, prop, receiver)); - }, - preventExtensions(target) { - assert.fail('Expected no side effects, got extensions prevented on ' + - inspect(target)); - }, - set(target, property, value, receiver) { - assert.fail(`Expected no side effects, got ${inspect(value)} ` + - `assigned to ${inspect(property)}`); - }, - setPrototypeOf(target, prototype) { - assert.fail(`Expected no side effects, got set prototype to ${prototype}`); - } - }; - - const proxy = new Proxy(original, _mustNotMutateObjectDeepHandler); - _mustNotMutateObjectDeepProxies.set(original, proxy); - return proxy; -} - -// A helper function to simplify checking for ERR_INVALID_ARG_TYPE output. -function invalidArgTypeHelper(input) { - if (input == null) { - return ` Received ${input}`; - } - if (typeof input === "function" && input.name) { - return ` Received function ${input.name}`; - } - if (typeof input === "object") { - if (input.constructor && input.constructor.name) { - return ` Received an instance of ${input.constructor.name}`; - } - return ` Received ${util.inspect(input, { depth: -1 })}`; - } - let inspected = util.inspect(input, { colors: false }); - if (inspected.length > 25) { - inspected = `${inspected.slice(0, 25)}...`; - } - return ` Received type ${typeof input} (${inspected})`; -} - -const isWindows = process.platform === 'win32'; -const isAIX = process.platform === 'aix'; -const isSunOS = process.platform === 'sunos'; -const isFreeBSD = process.platform === 'freebsd'; -const isOpenBSD = process.platform === 'openbsd'; -const isLinux = process.platform === 'linux'; -const isOSX = process.platform === 'darwin'; - -const isDumbTerminal = process.env.TERM === 'dumb'; - -function skipIfDumbTerminal() { - if (isDumbTerminal) { - skip('skipping - dumb terminal'); - } -} - -function printSkipMessage(msg) { - console.log(`1..0 # Skipped: ${msg}`); -} - -function skip(msg) { - printSkipMessage(msg); - process.exit(0); -} - -const PIPE = (() => { - const localRelative = path.relative(process.cwd(), `${tmpdir.path}/`); - const pipePrefix = isWindows ? "\\\\.\\pipe\\" : localRelative; - const pipeName = `node-test.${process.pid}.sock`; - return path.join(pipePrefix, pipeName); -})(); - -function getArrayBufferViews(buf) { - const { buffer, byteOffset, byteLength } = buf; - - const out = []; - - const arrayBufferViews = [ - Int8Array, - Uint8Array, - Uint8ClampedArray, - Int16Array, - Uint16Array, - Int32Array, - Uint32Array, - Float32Array, - Float64Array, - DataView, - ]; - - for (const type of arrayBufferViews) { - const { BYTES_PER_ELEMENT = 1 } = type; - if (byteLength % BYTES_PER_ELEMENT === 0) { - out.push(new type(buffer, byteOffset, byteLength / BYTES_PER_ELEMENT)); - } - } - return out; -} - -function getBufferSources(buf) { - return [...getArrayBufferViews(buf), new Uint8Array(buf).buffer]; -} - -const pwdCommand = isWindows ? - ['cmd.exe', ['/d', '/c', 'cd']] : - ['pwd', []]; - -module.exports = { - allowGlobals, - expectsError, - expectWarning, - getArrayBufferViews, - getBufferSources, - hasCrypto: true, - hasIntl: true, - hasMultiLocalhost() { - return false; - }, - invalidArgTypeHelper, - mustCall, - mustCallAtLeast, - mustNotCall, - mustNotMutateObjectDeep, - mustSucceed, - PIPE, - platformTimeout, - printSkipMessage, - pwdCommand, - skipIfDumbTerminal, - isDumbTerminal, - isWindows, - isAIX, - isSunOS, - isFreeBSD, - isOpenBSD, - isLinux, - isOSX, - isMainThread: true, // TODO(f3n67u): replace with `worker_thread.isMainThread` when `worker_thread` implemented - skip, - get hasIPv6() { - const iFaces = require('os').networkInterfaces(); - const re = isWindows ? /Loopback Pseudo-Interface/ : /lo/; - return Object.keys(iFaces).some((name) => { - return re.test(name) && - iFaces[name].some(({ family }) => family === 'IPv6'); - }); - }, - - get localhostIPv4() { - if (localhostIPv4 !== null) return localhostIPv4; - if (localhostIPv4 === null) localhostIPv4 = '127.0.0.1'; - - return localhostIPv4; - }, - - get PORT() { - return 12346; - }, -}; diff --git a/cli/tests/node_compat/test/common/index.mjs b/cli/tests/node_compat/test/common/index.mjs deleted file mode 100644 index 25fe5cbb0..000000000 --- a/cli/tests/node_compat/test/common/index.mjs +++ /dev/null @@ -1,115 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -import { createRequire } from 'module'; - -const require = createRequire(import.meta.url); -const common = require('./index.js'); - -const { - isMainThread, - isWindows, - isAIX, - isIBMi, - isLinuxPPCBE, - isSunOS, - isDumbTerminal, - isFreeBSD, - isOpenBSD, - isLinux, - isOSX, - enoughTestMem, - buildType, - localIPv6Hosts, - opensslCli, - PIPE, - hasCrypto, - hasIPv6, - childShouldThrowAndAbort, - checkoutEOL, - createZeroFilledFile, - platformTimeout, - allowGlobals, - mustCall, - mustCallAtLeast, - mustSucceed, - hasMultiLocalhost, - skipIfDumbTerminal, - skipIfEslintMissing, - canCreateSymLink, - getCallSite, - mustNotCall, - mustNotMutateObjectDeep, - parseTestFlags, - printSkipMessage, - skip, - nodeProcessAborted, - isAlive, - expectWarning, - expectsError, - skipIfInspectorDisabled, - skipIf32Bits, - getArrayBufferViews, - getBufferSources, - getTTYfd, - runWithInvalidFD, - spawnPromisified, -} = common; - -const getPort = () => common.PORT; - -export { - isMainThread, - isWindows, - isAIX, - isIBMi, - isLinuxPPCBE, - isSunOS, - isDumbTerminal, - isFreeBSD, - isOpenBSD, - isLinux, - isOSX, - enoughTestMem, - buildType, - localIPv6Hosts, - opensslCli, - PIPE, - hasCrypto, - hasIPv6, - childShouldThrowAndAbort, - checkoutEOL, - createZeroFilledFile, - platformTimeout, - allowGlobals, - mustCall, - mustCallAtLeast, - mustSucceed, - hasMultiLocalhost, - skipIfDumbTerminal, - skipIfEslintMissing, - canCreateSymLink, - getCallSite, - mustNotCall, - mustNotMutateObjectDeep, - parseTestFlags, - printSkipMessage, - skip, - nodeProcessAborted, - isAlive, - expectWarning, - expectsError, - skipIfInspectorDisabled, - skipIf32Bits, - getArrayBufferViews, - getBufferSources, - getTTYfd, - runWithInvalidFD, - createRequire, - spawnPromisified, - getPort, -}; diff --git a/cli/tests/node_compat/test/common/internet.js b/cli/tests/node_compat/test/common/internet.js deleted file mode 100644 index b42fda66c..000000000 --- a/cli/tests/node_compat/test/common/internet.js +++ /dev/null @@ -1,68 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -// Utilities for internet-related tests - -const addresses = { - // A generic host that has registered common DNS records, - // supports both IPv4 and IPv6, and provides basic HTTP/HTTPS services - INET_HOST: 'nodejs.org', - // A host that provides IPv4 services - INET4_HOST: 'nodejs.org', - // A host that provides IPv6 services - INET6_HOST: 'nodejs.org', - // An accessible IPv4 IP, - // defaults to the Google Public DNS IPv4 address - INET4_IP: '8.8.8.8', - // An accessible IPv6 IP, - // defaults to the Google Public DNS IPv6 address - INET6_IP: '2001:4860:4860::8888', - // An invalid host that cannot be resolved - // See https://tools.ietf.org/html/rfc2606#section-2 - INVALID_HOST: 'something.invalid', - // A host with MX records registered - MX_HOST: 'nodejs.org', - // On some systems, .invalid returns a server failure/try again rather than - // record not found. Use this to guarantee record not found. - NOT_FOUND: 'come.on.fhqwhgads.test', - // A host with SRV records registered - // TODO(kt3k): Temporarily use _caldav._tcp.google.com instead of - // _jabber._tcp.google.com, which currently doesn't respond - // SRV_HOST: '_jabber._tcp.google.com', - SRV_HOST: '_caldav._tcp.google.com', - // A host with PTR records registered - PTR_HOST: '8.8.8.8.in-addr.arpa', - // A host with NAPTR records registered - NAPTR_HOST: 'sip2sip.info', - // A host with SOA records registered - SOA_HOST: 'nodejs.org', - // A host with CAA record registered - CAA_HOST: 'google.com', - // A host with CNAME records registered - CNAME_HOST: 'blog.nodejs.org', - // A host with NS records registered - NS_HOST: 'nodejs.org', - // A host with TXT records registered - TXT_HOST: 'nodejs.org', - // An accessible IPv4 DNS server - DNS4_SERVER: '8.8.8.8', - // An accessible IPv4 DNS server - DNS6_SERVER: '2001:4860:4860::8888' -}; - -for (const key of Object.keys(addresses)) { - const envName = `NODE_TEST_${key}`; - if (process.env[envName]) { - addresses[key] = process.env[envName]; - } -} - -module.exports = { - addresses -}; diff --git a/cli/tests/node_compat/test/common/package.json b/cli/tests/node_compat/test/common/package.json deleted file mode 100644 index 0967ef424..000000000 --- a/cli/tests/node_compat/test/common/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/cli/tests/node_compat/test/common/tmpdir.js b/cli/tests/node_compat/test/common/tmpdir.js deleted file mode 100644 index 886c4a107..000000000 --- a/cli/tests/node_compat/test/common/tmpdir.js +++ /dev/null @@ -1,79 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const { isMainThread } = require('worker_threads'); - -function rmSync(pathname) { - fs.rmSync(pathname, { maxRetries: 3, recursive: true, force: true }); -} - -const testRoot = process.env.NODE_TEST_DIR ? - fs.realpathSync(process.env.NODE_TEST_DIR) : path.resolve(__dirname, '..'); - -// Using a `.` prefixed name, which is the convention for "hidden" on POSIX, -// gets tools to ignore it by default or by simple rules, especially eslint. -const tmpdirName = '.tmp.' + - (process.env.TEST_SERIAL_ID || process.env.TEST_THREAD_ID || '0'); -const tmpPath = path.join(testRoot, tmpdirName); - -let firstRefresh = true; -function refresh() { - rmSync(tmpPath); - fs.mkdirSync(tmpPath); - - if (firstRefresh) { - firstRefresh = false; - // Clean only when a test uses refresh. This allows for child processes to - // use the tmpdir and only the parent will clean on exit. - process.on('exit', onexit); - } -} - -function onexit() { - // Change directory to avoid possible EBUSY - if (isMainThread) - process.chdir(testRoot); - - try { - rmSync(tmpPath); - } catch (e) { - console.error('Can\'t clean tmpdir:', tmpPath); - - const files = fs.readdirSync(tmpPath); - console.error('Files blocking:', files); - - if (files.some((f) => f.startsWith('.nfs'))) { - // Warn about NFS "silly rename" - console.error('Note: ".nfs*" might be files that were open and ' + - 'unlinked but not closed.'); - console.error('See http://nfs.sourceforge.net/#faq_d2 for details.'); - } - - console.error(); - throw e; - } -} - -function resolve(...paths) { - return path.resolve(tmpPath, ...paths); -} - -function hasEnoughSpace(size) { - const { bavail, bsize } = fs.statfsSync(tmpPath); - return bavail >= Math.ceil(size / bsize); -} - -module.exports = { - path: tmpPath, - refresh, - hasEnoughSpace, - resolve, -}; diff --git a/cli/tests/node_compat/test/fixtures/GH-1899-output.js b/cli/tests/node_compat/test/fixtures/GH-1899-output.js deleted file mode 100644 index d647eb320..000000000 --- a/cli/tests/node_compat/test/fixtures/GH-1899-output.js +++ /dev/null @@ -1,30 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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. - -console.log('hello, world!'); - diff --git a/cli/tests/node_compat/test/fixtures/a.js b/cli/tests/node_compat/test/fixtures/a.js deleted file mode 100644 index 9f5a21a06..000000000 --- a/cli/tests/node_compat/test/fixtures/a.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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. - -const c = require('./b/c'); - -console.error('load fixtures/a.js'); - -var string = 'A'; - -exports.SomeClass = c.SomeClass; - -exports.A = function() { - return string; -}; - -exports.C = function() { - return c.C(); -}; - -exports.D = function() { - return c.D(); -}; - -exports.number = 42; - -process.on('exit', function() { - string = 'A done'; -}); diff --git a/cli/tests/node_compat/test/fixtures/child-process-spawn-node.js b/cli/tests/node_compat/test/fixtures/child-process-spawn-node.js deleted file mode 100644 index 589da4dab..000000000 --- a/cli/tests/node_compat/test/fixtures/child-process-spawn-node.js +++ /dev/null @@ -1,14 +0,0 @@ -const assert = require('assert'); -// TODO(kt3k): Uncomment this when util.debuglog is added -// const debug = require('util').debuglog('test'); -const debug = console.log; - -function onmessage(m) { - debug('CHILD got message:', m); - assert.ok(m.hello); - process.removeListener('message', onmessage); -} - -process.on('message', onmessage); -// TODO(kt3k): Uncomment the below when the ipc features are ready -// process.send({ foo: 'bar' }); diff --git a/cli/tests/node_compat/test/fixtures/child_process_should_emit_error.js b/cli/tests/node_compat/test/fixtures/child_process_should_emit_error.js deleted file mode 100644 index 5a56c312b..000000000 --- a/cli/tests/node_compat/test/fixtures/child_process_should_emit_error.js +++ /dev/null @@ -1,36 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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. - -const exec = require('child_process').exec; - -[0, 1].forEach(function(i) { - exec('ls', function(err, stdout, stderr) { - console.log(i); - throw new Error('hello world'); - }); -}); diff --git a/cli/tests/node_compat/test/fixtures/echo.js b/cli/tests/node_compat/test/fixtures/echo.js deleted file mode 100644 index 893099e9b..000000000 --- a/cli/tests/node_compat/test/fixtures/echo.js +++ /dev/null @@ -1,41 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -const common = require('../common'); -const assert = require('assert'); - -process.stdout.write('hello world\r\n'); - -// TODO(PolarETech): process.openStdin() is not yet implemented. -// Use process.stdin instead. -var stdin = process.stdin; -// var stdin = process.openStdin(); - -stdin.on('data', function(data) { - process.stdout.write(data.toString()); -}); diff --git a/cli/tests/node_compat/test/fixtures/elipses.txt b/cli/tests/node_compat/test/fixtures/elipses.txt deleted file mode 100644 index 610560050..000000000 --- a/cli/tests/node_compat/test/fixtures/elipses.txt +++ /dev/null @@ -1 +0,0 @@ -…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
\ No newline at end of file diff --git a/cli/tests/node_compat/test/fixtures/empty.txt b/cli/tests/node_compat/test/fixtures/empty.txt deleted file mode 100644 index e69de29bb..000000000 --- a/cli/tests/node_compat/test/fixtures/empty.txt +++ /dev/null diff --git a/cli/tests/node_compat/test/fixtures/exit.js b/cli/tests/node_compat/test/fixtures/exit.js deleted file mode 100644 index ca80f4828..000000000 --- a/cli/tests/node_compat/test/fixtures/exit.js +++ /dev/null @@ -1,31 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -// TODO(PolarETech): The process.argv[3] should be argv[2]. - -process.exit(process.argv[3] || 1); diff --git a/cli/tests/node_compat/test/fixtures/keys/agent1-cert.pem b/cli/tests/node_compat/test/fixtures/keys/agent1-cert.pem deleted file mode 100644 index bef645b0f..000000000 --- a/cli/tests/node_compat/test/fixtures/keys/agent1-cert.pem +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIID6DCCAtCgAwIBAgIUFH02wcL3Qgben6tfIibXitsApCYwDQYJKoZIhvcNAQEL -BQAwejELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJTRjEPMA0G -A1UECgwGSm95ZW50MRAwDgYDVQQLDAdOb2RlLmpzMQwwCgYDVQQDDANjYTExIDAe -BgkqhkiG9w0BCQEWEXJ5QHRpbnljbG91ZHMub3JnMCAXDTIyMDkwMzIxNDAzN1oY -DzIyOTYwNjE3MjE0MDM3WjB9MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExCzAJ -BgNVBAcMAlNGMQ8wDQYDVQQKDAZKb3llbnQxEDAOBgNVBAsMB05vZGUuanMxDzAN -BgNVBAMMBmFnZW50MTEgMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUVjIK+yDTgnCT3CxChO0E -37q9VuHdrlKeKLeQzUJW2yczSfNzX/0zfHpjY+zKWie39z3HCJqWxtiG2wxiOI8c -3WqWOvzVmdWADlh6EfkIlg+E7VC6JaKDA+zabmhPvnuu3JzogBMnsWl68lCXzuPx -deQAmEwNtqjrh74DtM+Ud0ulb//Ixjxo1q3rYKu+aaexSramuee6qJta2rjrB4l8 -B/bU+j1mDf9XQQfSjo9jRnp4hiTFdBl2k+lZzqE2L/rhu6EMjA2IhAq/7xA2MbLo -9cObVUin6lfoo5+JKRgT9Fp2xEgDOit+2EA/S6oUfPNeLSVUqmXOSWlXlwlb9Nxr -AgMBAAGjYTBfMF0GCCsGAQUFBwEBBFEwTzAjBggrBgEFBQcwAYYXaHR0cDovL29j -c3Aubm9kZWpzLm9yZy8wKAYIKwYBBQUHMAKGHGh0dHA6Ly9jYS5ub2RlanMub3Jn -L2NhLmNlcnQwDQYJKoZIhvcNAQELBQADggEBAMM0mBBjLMt9pYXePtUeNO0VTw9y -FWCM8nAcAO2kRNwkJwcsispNpkcsHZ5o8Xf5mpCotdvziEWG1hyxwU6nAWyNOLcN -G0a0KUfbMO3B6ZYe1GwPDjXaQnv75SkAdxgX5zOzca3xnhITcjUUGjQ0fbDfwFV5 -ix8mnzvfXjDONdEznVa7PFcN6QliFUMwR/h8pCRHtE5+a10OSPeJSrGG+FtrGnRW -G1IJUv6oiGF/MvWCr84REVgc1j78xomGANJIu2hN7bnD1nEMON6em8IfnDOUtynV -9wfWTqiQYD5Zifj6WcGa0aAHMuetyFG4lIfMAHmd3gaKpks7j9l26LwRPvI= ------END CERTIFICATE----- diff --git a/cli/tests/node_compat/test/fixtures/keys/agent1-key.pem b/cli/tests/node_compat/test/fixtures/keys/agent1-key.pem deleted file mode 100644 index 1bd840716..000000000 --- a/cli/tests/node_compat/test/fixtures/keys/agent1-key.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA1FYyCvsg04Jwk9wsQoTtBN+6vVbh3a5Snii3kM1CVtsnM0nz -c1/9M3x6Y2Psylont/c9xwialsbYhtsMYjiPHN1qljr81ZnVgA5YehH5CJYPhO1Q -uiWigwPs2m5oT757rtyc6IATJ7FpevJQl87j8XXkAJhMDbao64e+A7TPlHdLpW// -yMY8aNat62CrvmmnsUq2prnnuqibWtq46weJfAf21Po9Zg3/V0EH0o6PY0Z6eIYk -xXQZdpPpWc6hNi/64buhDIwNiIQKv+8QNjGy6PXDm1VIp+pX6KOfiSkYE/RadsRI -AzorfthAP0uqFHzzXi0lVKplzklpV5cJW/TcawIDAQABAoIBAAvbtHfAhpjJVBgt -15rvaX04MWmZjIugzKRgib/gdq/7FTlcC+iJl85kSUF7tyGl30n62MxgwqFhAX6m -hQ6HMhbelrFFIhGbwbyhEHfgwROlrcAysKt0pprCgVvBhrnNXYLqdyjU3jz9P3LK -TY3s0/YMK2uNFdI+PTjKH+Z9Foqn9NZUnUonEDepGyuRO7fLeccWJPv2L4CR4a/5 -ku4VbDgVpvVSVRG3PSVzbmxobnpdpl52og+T7tPx1cLnIknPtVljXPWtZdfekh2E -eAp2KxCCHOKzzG3ItBKsVu0woeqEpy8JcoO6LbgmEoVnZpgmtQClbBgef8+i+oGE -BgW9nmECgYEA8gA63QQuZOUC56N1QXURexN2PogF4wChPaCTFbQSJXvSBkQmbqfL -qRSD8P0t7GOioPrQK6pDwFf4BJB01AvkDf8Z6DxxOJ7cqIC7LOwDupXocWX7Q0Qk -O6cwclBVsrDZK00v60uRRpl/a39GW2dx7IiQDkKQndLh3/0TbMIWHNcCgYEA4J6r -yinZbLpKw2+ezhi4B4GT1bMLoKboJwpZVyNZZCzYR6ZHv+lS7HR/02rcYMZGoYbf -n7OHwF4SrnUS7vPhG4g2ZsOhKQnMvFSQqpGmK1ZTuoKGAevyvtouhK/DgtLWzGvX -9fSahiq/UvfXs/z4M11q9Rv9ztPCmG1cwSEHlo0CgYEAogQNZJK8DMhVnYcNpXke -7uskqtCeQE/Xo06xqkIYNAgloBRYNpUYAGa/vsOBz1UVN/kzDUi8ezVp0oRz8tLT -J5u2WIi+tE2HJTiqF3UbOfvK1sCT64DfUSCpip7GAQ/tFNRkVH8PD9kMOYfILsGe -v+DdsO5Xq5HXrwHb02BNNZkCgYBsl8lt33WiPx5OBfS8pu6xkk+qjPkeHhM2bKZs -nkZlS9j0KsudWGwirN/vkkYg8zrKdK5AQ0dqFRDrDuasZ3N5IA1M+V88u+QjWK7o -B6pSYVXxYZDv9OZSpqC+vUrEQLJf+fNakXrzSk9dCT1bYv2Lt6ox/epix7XYg2bI -Z/OHMQKBgQC2FUGhlndGeugTJaoJ8nhT/0VfRUX/h6sCgSerk5qFr/hNCBV4T022 -x0NDR2yLG6MXyqApJpG6rh3QIDElQoQCNlI3/KJ6JfEfmqrLLN2OigTvA5sE4fGU -Dp/ha8OQAx95EwXuaG7LgARduvOIK3x8qi8KsZoUGJcg2ywurUbkWA== ------END RSA PRIVATE KEY----- diff --git a/cli/tests/node_compat/test/fixtures/keys/ca1-cert.pem b/cli/tests/node_compat/test/fixtures/keys/ca1-cert.pem deleted file mode 100644 index e1a012c6b..000000000 --- a/cli/tests/node_compat/test/fixtures/keys/ca1-cert.pem +++ /dev/null @@ -1,22 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIUSrFsjf1qfQ0t/KvfnEsOksatAikwDQYJKoZIhvcNAQEL -BQAwejELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJTRjEPMA0G -A1UECgwGSm95ZW50MRAwDgYDVQQLDAdOb2RlLmpzMQwwCgYDVQQDDANjYTExIDAe -BgkqhkiG9w0BCQEWEXJ5QHRpbnljbG91ZHMub3JnMCAXDTIyMDkwMzIxNDAzN1oY -DzIyOTYwNjE3MjE0MDM3WjB6MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExCzAJ -BgNVBAcMAlNGMQ8wDQYDVQQKDAZKb3llbnQxEDAOBgNVBAsMB05vZGUuanMxDDAK -BgNVBAMMA2NhMTEgMB4GCSqGSIb3DQEJARYRcnlAdGlueWNsb3Vkcy5vcmcwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNvf4OGGep+ak+4DNjbuNgy0S/ -AZPxahEFp4gpbcvsi9YLOPZ31qpilQeQf7d27scIZ02Qx1YBAzljxELB8H/ZxuYS -cQK0s+DNP22xhmgwMWznO7TezkHP5ujN2UkbfbUpfUxGFgncXeZf9wR7yFWppeHi -RWNBOgsvY7sTrS12kXjWGjqntF7xcEDHc7h+KyF6ZjVJZJCnP6pJEQ+rUjd51eCZ -Xt4WjowLnQiCS1VKzXiP83a++Ma1BKKkUitTR112/Uwd5eGoiByhmLzb/BhxnHJN -07GXjhlMItZRm/jfbZsx1mwnNOO3tx4r08l+DaqkinIadvazs+1ugCaKQn8xAgMB -AAGjEDAOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFqG0RXURDam -56x5accdg9sY5zEGP5VQhkK3ZDc2NyNNa25rwvrjCpO+e0OSwKAmm4aX6iIf2woY -wF2f9swWYzxn9CG4fDlUA8itwlnHxupeL4fGMTYb72vf31plUXyBySRsTwHwBloc -F7KvAZpYYKN9EMH1S/267By6H2I33BT/Ethv//n8dSfmuCurR1kYRaiOC4PVeyFk -B3sj8TtolrN0y/nToWUhmKiaVFnDx3odQ00yhmxR3t21iB7yDkko6D8Vf2dVC4j/ -YYBVprXGlTP/hiYRLDoP20xKOYznx5cvHPJ9p+lVcOZUJsJj/Iy750+2n5UiBmXt -lz88C25ucKA= ------END CERTIFICATE----- diff --git a/cli/tests/node_compat/test/fixtures/loop.js b/cli/tests/node_compat/test/fixtures/loop.js deleted file mode 100644 index f9bcfc66e..000000000 --- a/cli/tests/node_compat/test/fixtures/loop.js +++ /dev/null @@ -1,17 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -var t = 1; -var k = 1; -console.log('A message', 5); -while (t > 0) { - if (t++ === 1000) { - t = 0; - console.log(`Outputted message #${k++}`); - } -} -process.exit(55); diff --git a/cli/tests/node_compat/test/fixtures/package.json b/cli/tests/node_compat/test/fixtures/package.json deleted file mode 100644 index 0967ef424..000000000 --- a/cli/tests/node_compat/test/fixtures/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/cli/tests/node_compat/test/fixtures/print-chars.js b/cli/tests/node_compat/test/fixtures/print-chars.js deleted file mode 100644 index 2519c77fd..000000000 --- a/cli/tests/node_compat/test/fixtures/print-chars.js +++ /dev/null @@ -1,35 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -// TODO(PolarETech): The process.argv[3] should be argv[2]. - -const assert = require('assert'); - -var n = parseInt(process.argv[3]); - -process.stdout.write('c'.repeat(n)); diff --git a/cli/tests/node_compat/test/fixtures/x.txt b/cli/tests/node_compat/test/fixtures/x.txt deleted file mode 100644 index cd470e619..000000000 --- a/cli/tests/node_compat/test/fixtures/x.txt +++ /dev/null @@ -1 +0,0 @@ -xyz diff --git a/cli/tests/node_compat/test/internet/package.json b/cli/tests/node_compat/test/internet/package.json deleted file mode 100644 index 0967ef424..000000000 --- a/cli/tests/node_compat/test/internet/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/cli/tests/node_compat/test/internet/test-dns-any.js b/cli/tests/node_compat/test/internet/test-dns-any.js deleted file mode 100644 index b8a70b8e2..000000000 --- a/cli/tests/node_compat/test/internet/test-dns-any.js +++ /dev/null @@ -1,194 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// TODO(cmorten): enable remaining tests once functionality is implemented. - -'use strict'; - -const common = require('../common'); - -const assert = require('assert'); -const dns = require('dns'); -const net = require('net'); - -let running = false; -const queue = []; - -const dnsPromises = dns.promises; -const isIPv4 = net.isIPv4; -const isIPv6 = net.isIPv6; - -dns.setServers([ '8.8.8.8', '8.8.4.4' ]); - -function checkWrap(req) { - assert.ok(typeof req === 'object'); -} - -const checkers = { - checkA(r) { - assert.ok(isIPv4(r.address)); - // assert.strictEqual(typeof r.ttl, 'number'); - assert.strictEqual(r.type, 'A'); - }, - checkAAAA(r) { - assert.ok(isIPv6(r.address)); - // assert.strictEqual(typeof r.ttl, 'number'); - assert.strictEqual(r.type, 'AAAA'); - }, - checkCNAME(r) { - assert.ok(r.value); - assert.strictEqual(typeof r.value, 'string'); - assert.strictEqual(r.type, 'CNAME'); - }, - checkMX(r) { - assert.strictEqual(typeof r.exchange, 'string'); - assert.strictEqual(typeof r.priority, 'number'); - assert.strictEqual(r.type, 'MX'); - }, - checkNAPTR(r) { - assert.strictEqual(typeof r.flags, 'string'); - assert.strictEqual(typeof r.service, 'string'); - assert.strictEqual(typeof r.regexp, 'string'); - assert.strictEqual(typeof r.replacement, 'string'); - assert.strictEqual(typeof r.order, 'number'); - assert.strictEqual(typeof r.preference, 'number'); - assert.strictEqual(r.type, 'NAPTR'); - }, - checkNS(r) { - assert.strictEqual(typeof r.value, 'string'); - assert.strictEqual(r.type, 'NS'); - }, - checkPTR(r) { - assert.strictEqual(typeof r.value, 'string'); - assert.strictEqual(r.type, 'PTR'); - }, - checkTXT(r) { - assert.ok(Array.isArray(r.entries)); - assert.ok(r.entries.length > 0); - assert.strictEqual(r.type, 'TXT'); - }, - checkSOA(r) { - assert.strictEqual(typeof r.nsname, 'string'); - assert.strictEqual(typeof r.hostmaster, 'string'); - assert.strictEqual(typeof r.serial, 'number'); - assert.strictEqual(typeof r.refresh, 'number'); - assert.strictEqual(typeof r.retry, 'number'); - assert.strictEqual(typeof r.expire, 'number'); - assert.strictEqual(typeof r.minttl, 'number'); - assert.strictEqual(r.type, 'SOA'); - }, - checkSRV(r) { - assert.strictEqual(typeof r.name, 'string'); - assert.strictEqual(typeof r.port, 'number'); - assert.strictEqual(typeof r.priority, 'number'); - assert.strictEqual(typeof r.weight, 'number'); - assert.strictEqual(r.type, 'SRV'); - } -}; - -function TEST(f) { - function next() { - const f = queue.shift(); - if (f) { - running = true; - f(done); - } - } - - function done() { - running = false; - process.nextTick(next); - } - - queue.push(f); - - if (!running) { - next(); - } -} - -function processResult(res) { - assert.ok(Array.isArray(res)); - assert.ok(res.length > 0); - - const types = {}; - res.forEach((obj) => { - types[obj.type] = true; - checkers[`check${obj.type}`](obj); - }); - - return types; -} - -TEST(async function test_sip2sip_for_naptr(done) { - function validateResult(res) { - const types = processResult(res); - assert.ok( - types.A && types.NS && types.NAPTR && types.SOA, - `Missing record type, found ${Object.keys(types)}` - ); - } - - validateResult(await dnsPromises.resolve('sip2sip.info', 'ANY')); - - const req = dns.resolve( - 'sip2sip.info', - 'ANY', - common.mustSucceed((ret) => { - validateResult(ret); - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_google_for_cname_and_srv(done) { - function validateResult(res) { - const types = processResult(res); - assert.ok(types.SRV); - } - - // TODO(kt3k): Temporarily use _caldav._tcp.google.com instead of - // _jabber._tcp.google.com, which currently doesn't respond - // validateResult(await dnsPromises.resolve('_jabber._tcp.google.com', 'ANY')); - validateResult(await dnsPromises.resolve('_caldav._tcp.google.com', 'ANY')); - - - // TODO(kt3k): Temporarily use _caldav._tcp.google.com instead of - // _jabber._tcp.google.com, which currently doesn't respond - const req = dns.resolve( - // '_jabber._tcp.google.com', - '_caldav._tcp.google.com', - 'ANY', - common.mustSucceed((ret) => { - validateResult(ret); - done(); - })); - - checkWrap(req); -}); - -// TODO(bartlomieju): this test started failing on CI on Dec 28th, 2023 returning -// ENOTFOUND. It's unclear what's going on, since `dig -x 8.8.8.8.in-addr.arpa` -// TEST(async function test_ptr(done) { -// function validateResult(res) { -// const types = processResult(res); -// assert.ok(types.PTR); -// } - -// validateResult(await dnsPromises.resolve('8.8.8.8.in-addr.arpa', 'ANY')); - -// const req = dns.resolve( -// '8.8.8.8.in-addr.arpa', -// 'ANY', -// common.mustSucceed((ret) => { -// validateResult(ret); -// done(); -// })); - -// checkWrap(req); -// }); diff --git a/cli/tests/node_compat/test/internet/test-dns-idna2008.js b/cli/tests/node_compat/test/internet/test-dns-idna2008.js deleted file mode 100644 index 7308f9deb..000000000 --- a/cli/tests/node_compat/test/internet/test-dns-idna2008.js +++ /dev/null @@ -1,76 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Verify that non-ASCII hostnames are handled correctly as IDNA 2008. -// -// * Tests will fail with NXDOMAIN when UTF-8 leaks through to a getaddrinfo() -// that doesn't support IDNA at all. -// -// * "straße.de" will resolve to the wrong address when the resolver supports -// only IDNA 2003 (e.g., glibc until 2.28) because it encodes it wrong. - -const { mustCall } = require('../common'); -const assert = require('assert'); -const dns = require('dns'); -const { addresses } = require('../common/internet'); - -const fixture = { - hostname: 'straße.de', - expectedAddress: '81.169.145.78', - dnsServer: addresses.DNS4_SERVER, - family: 4, -}; - -// Explicitly use well-behaved DNS servers that are known to be able to resolve -// the query (which is a.k.a xn--strae-oqa.de). -dns.setServers([fixture.dnsServer]); - -dns.lookup( - fixture.hostname, - { family: fixture.family }, - mustCall((err, address) => { - if (err && err.errno === 'ESERVFAIL') { - assert.ok(err.message.includes('queryA ESERVFAIL straße.de')); - return; - } - assert.ifError(err); - assert.strictEqual(address, fixture.expectedAddress); - }), -); - -dns.promises.lookup(fixture.hostname, { family: fixture.family }) - .then(({ address }) => { - assert.strictEqual(address, fixture.expectedAddress); - }, (err) => { - if (err && err.errno === 'ESERVFAIL') { - assert.ok(err.message.includes('queryA ESERVFAIL straße.de')); - } else { - throw err; - } - }).finally(mustCall()); - -dns.resolve4(fixture.hostname, mustCall((err, addresses) => { - if (err && err.errno === 'ESERVFAIL') { - assert.ok(err.message.includes('queryA ESERVFAIL straße.de')); - return; - } - assert.ifError(err); - assert.deepStrictEqual(addresses, [fixture.expectedAddress]); -})); - -const p = new dns.promises.Resolver().resolve4(fixture.hostname); -p.then((addresses) => { - assert.deepStrictEqual(addresses, [fixture.expectedAddress]); -}, (err) => { - if (err && err.errno === 'ESERVFAIL') { - assert.ok(err.message.includes('queryA ESERVFAIL straße.de')); - } else { - throw err; - } -}).finally(mustCall()); diff --git a/cli/tests/node_compat/test/internet/test-dns-ipv4.js b/cli/tests/node_compat/test/internet/test-dns-ipv4.js deleted file mode 100644 index 43b60950a..000000000 --- a/cli/tests/node_compat/test/internet/test-dns-ipv4.js +++ /dev/null @@ -1,257 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -// TODO: enable remaining tests once functionality is implemented. - -const common = require('../common'); -const { addresses } = require('../common/internet'); -const assert = require('assert'); -const dns = require('dns'); -const net = require('net'); -// const util = require('util'); -const isIPv4 = net.isIPv4; - -const dnsPromises = dns.promises; -let running = false; -const queue = []; - -function TEST(f) { - function next() { - const f = queue.shift(); - if (f) { - running = true; - console.log(f.name); - f(done); - } - } - - function done() { - running = false; - process.nextTick(next); - } - - queue.push(f); - - if (!running) { - next(); - } -} - -function checkWrap(req) { - assert.ok(typeof req === 'object'); -} - -TEST(async function test_resolve4(done) { - function validateResult(res) { - assert.ok(res.length > 0); - - for (let i = 0; i < res.length; i++) { - assert.ok(isIPv4(res[i])); - } - } - - validateResult(await dnsPromises.resolve4(addresses.INET4_HOST)); - - const req = dns.resolve4( - addresses.INET4_HOST, - common.mustSucceed((ips) => { - validateResult(ips); - done(); - })); - - checkWrap(req); -}); - -// TEST(async function test_reverse_ipv4(done) { -// function validateResult(res) { -// assert.ok(res.length > 0); - -// for (let i = 0; i < res.length; i++) { -// assert.ok(res[i]); -// assert.ok(typeof res[i] === 'string'); -// } -// } - -// validateResult(await dnsPromises.reverse(addresses.INET4_IP)); - -// const req = dns.reverse( -// addresses.INET4_IP, -// common.mustSucceed((domains) => { -// validateResult(domains); -// done(); -// })); - -// checkWrap(req); -// }); - -TEST(async function test_lookup_ipv4_explicit(done) { - function validateResult(res) { - assert.ok(net.isIPv4(res.address)); - assert.strictEqual(res.family, 4); - } - - validateResult(await dnsPromises.lookup(addresses.INET4_HOST, 4)); - - const req = dns.lookup( - addresses.INET4_HOST, 4, - common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_lookup_ipv4_implicit(done) { - function validateResult(res) { - assert.ok(net.isIPv4(res.address)); - assert.strictEqual(res.family, 4); - } - - validateResult(await dnsPromises.lookup(addresses.INET4_HOST)); - - const req = dns.lookup( - addresses.INET4_HOST, - common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_lookup_ipv4_explicit_object(done) { - function validateResult(res) { - assert.ok(net.isIPv4(res.address)); - assert.strictEqual(res.family, 4); - } - - validateResult(await dnsPromises.lookup(addresses.INET4_HOST, { family: 4 })); - - const req = dns.lookup(addresses.INET4_HOST, { - family: 4 - }, common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_lookup_ipv4_hint_addrconfig(done) { - function validateResult(res) { - assert.ok(net.isIPv4(res.address)); - assert.strictEqual(res.family, 4); - } - - validateResult(await dnsPromises.lookup(addresses.INET4_HOST, { - hints: dns.ADDRCONFIG - })); - - const req = dns.lookup(addresses.INET4_HOST, { - hints: dns.ADDRCONFIG - }, common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_lookup_ip_ipv4(done) { - function validateResult(res) { - assert.strictEqual(res.address, '127.0.0.1'); - assert.strictEqual(res.family, 4); - } - - validateResult(await dnsPromises.lookup('127.0.0.1')); - - const req = dns.lookup('127.0.0.1', - common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_lookup_localhost_ipv4(done) { - function validateResult(res) { - assert.strictEqual(res.address, '127.0.0.1'); - assert.strictEqual(res.family, 4); - } - - validateResult(await dnsPromises.lookup('localhost', 4)); - - const req = dns.lookup('localhost', 4, - common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_lookup_all_ipv4(done) { - function validateResult(res) { - assert.ok(Array.isArray(res)); - assert.ok(res.length > 0); - - res.forEach((ip) => { - assert.ok(isIPv4(ip.address)); - assert.strictEqual(ip.family, 4); - }); - } - - validateResult(await dnsPromises.lookup(addresses.INET4_HOST, { - all: true, - family: 4 - })); - - const req = dns.lookup( - addresses.INET4_HOST, - { all: true, family: 4 }, - common.mustSucceed((ips) => { - validateResult(ips); - done(); - }) - ); - - checkWrap(req); -}); - -// TEST(async function test_lookupservice_ip_ipv4(done) { -// function validateResult(res) { -// assert.strictEqual(typeof res.hostname, 'string'); -// assert(res.hostname); -// assert(['http', 'www', '80'].includes(res.service)); -// } - -// validateResult(await dnsPromises.lookupService('127.0.0.1', 80)); - -// const req = dns.lookupService( -// '127.0.0.1', 80, -// common.mustSucceed((hostname, service) => { -// validateResult({ hostname, service }); -// done(); -// }) -// ); - -// checkWrap(req); -// }); - -// TEST(function test_lookupservice_ip_ipv4_promise(done) { -// util.promisify(dns.lookupService)('127.0.0.1', 80) -// .then(common.mustCall(({ hostname, service }) => { -// assert.strictEqual(typeof hostname, 'string'); -// assert(hostname.length > 0); -// assert(['http', 'www', '80'].includes(service)); -// done(); -// })); -// }); diff --git a/cli/tests/node_compat/test/internet/test-dns-ipv6.js b/cli/tests/node_compat/test/internet/test-dns-ipv6.js deleted file mode 100644 index 4b94d6041..000000000 --- a/cli/tests/node_compat/test/internet/test-dns-ipv6.js +++ /dev/null @@ -1,250 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -// TODO: enable remaining tests once functionality is implemented. - -const common = require('../common'); -const { addresses } = require('../common/internet'); -if (!common.hasIPv6) - common.skip('this test, no IPv6 support'); - -const assert = require('assert'); -const dns = require('dns'); -const net = require('net'); -const dnsPromises = dns.promises; -const isIPv6 = net.isIPv6; - -let running = false; -const queue = []; - -function TEST(f) { - function next() { - const f = queue.shift(); - if (f) { - running = true; - console.log(f.name); - f(done); - } - } - - function done() { - running = false; - process.nextTick(next); - } - - queue.push(f); - - if (!running) { - next(); - } -} - -function checkWrap(req) { - assert.ok(typeof req === 'object'); -} - -TEST(async function test_resolve6(done) { - function validateResult(res) { - assert.ok(res.length > 0); - - for (let i = 0; i < res.length; i++) { - assert.ok(isIPv6(res[i])); - } - } - - validateResult(await dnsPromises.resolve6(addresses.INET6_HOST)); - - const req = dns.resolve6( - addresses.INET6_HOST, - common.mustSucceed((ips) => { - validateResult(ips); - done(); - })); - - checkWrap(req); -}); - -// TEST(async function test_reverse_ipv6(done) { -// function validateResult(res) { -// assert.ok(res.length > 0); - -// for (let i = 0; i < res.length; i++) { -// assert.ok(typeof res[i] === 'string'); -// } -// } - -// validateResult(await dnsPromises.reverse(addresses.INET6_IP)); - -// const req = dns.reverse( -// addresses.INET6_IP, -// common.mustSucceed((domains) => { -// validateResult(domains); -// done(); -// })); - -// checkWrap(req); -// }); - -TEST(async function test_lookup_ipv6_explicit(done) { - function validateResult(res) { - assert.ok(isIPv6(res.address)); - assert.strictEqual(res.family, 6); - } - - validateResult(await dnsPromises.lookup(addresses.INET6_HOST, 6)); - - const req = dns.lookup( - addresses.INET6_HOST, - 6, - common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -// This ends up just being too problematic to test -// TEST(function test_lookup_ipv6_implicit(done) { -// var req = dns.lookup(addresses.INET6_HOST, function(err, ip, family) { -// assert.ifError(err); -// assert.ok(net.isIPv6(ip)); -// assert.strictEqual(family, 6); - -// done(); -// }); - -// checkWrap(req); -// }); - -TEST(async function test_lookup_ipv6_explicit_object(done) { - function validateResult(res) { - assert.ok(isIPv6(res.address)); - assert.strictEqual(res.family, 6); - } - - validateResult(await dnsPromises.lookup(addresses.INET6_HOST, { family: 6 })); - - const req = dns.lookup(addresses.INET6_HOST, { - family: 6 - }, common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -TEST(function test_lookup_ipv6_hint(done) { - const req = dns.lookup(addresses.INET6_HOST, { - family: 6, - hints: dns.V4MAPPED - }, common.mustCall((err, ip, family) => { - if (err) { - // FreeBSD does not support V4MAPPED - if (common.isFreeBSD) { - assert(err instanceof Error); - assert.strictEqual(err.code, 'EAI_BADFLAGS'); - assert.strictEqual(err.hostname, addresses.INET_HOST); - assert.match(err.message, /getaddrinfo EAI_BADFLAGS/); - done(); - return; - } - - assert.ifError(err); - } - - assert.ok(isIPv6(ip)); - assert.strictEqual(family, 6); - - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_lookup_ip_ipv6(done) { - function validateResult(res) { - assert.ok(isIPv6(res.address)); - assert.strictEqual(res.family, 6); - } - - validateResult(await dnsPromises.lookup('::1')); - - const req = dns.lookup( - '::1', - common.mustSucceed((ip, family) => { - validateResult({ address: ip, family }); - done(); - })); - - checkWrap(req); -}); - -TEST(async function test_lookup_all_ipv6(done) { - function validateResult(res) { - assert.ok(Array.isArray(res)); - assert.ok(res.length > 0); - - res.forEach((ip) => { - assert.ok(isIPv6(ip.address), - `Invalid IPv6: ${ip.address.toString()}`); - assert.strictEqual(ip.family, 6); - }); - } - - validateResult(await dnsPromises.lookup(addresses.INET6_HOST, { - all: true, - family: 6 - })); - - const req = dns.lookup( - addresses.INET6_HOST, - { all: true, family: 6 }, - common.mustSucceed((ips) => { - validateResult(ips); - done(); - }) - ); - - checkWrap(req); -}); - -// TEST(function test_lookupservice_ip_ipv6(done) { -// const req = dns.lookupService( -// '::1', 80, -// common.mustCall((err, host, service) => { -// if (err) { -// // Not skipping the test, rather checking an alternative result, -// // i.e. that ::1 may not be configured (e.g. in /etc/hosts) -// assert.strictEqual(err.code, 'ENOTFOUND'); -// return done(); -// } -// assert.strictEqual(typeof host, 'string'); -// assert(host); -// assert(['http', 'www', '80'].includes(service)); -// done(); -// }) -// ); - -// checkWrap(req); -// }); - -// Disabled because it appears to be not working on Linux. -// TEST(function test_lookup_localhost_ipv6(done) { -// var req = dns.lookup('localhost', 6, function(err, ip, family) { -// assert.ifError(err); -// assert.ok(net.isIPv6(ip)); -// assert.strictEqual(family, 6); -// -// done(); -// }); -// -// checkWrap(req); -// }); diff --git a/cli/tests/node_compat/test/internet/test-dns-lookup.js b/cli/tests/node_compat/test/internet/test-dns-lookup.js deleted file mode 100644 index cfd3e758c..000000000 --- a/cli/tests/node_compat/test/internet/test-dns-lookup.js +++ /dev/null @@ -1,61 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const common = require('../common'); -const dns = require('dns'); -const dnsPromises = dns.promises; -const { addresses } = require('../common/internet'); -const assert = require('assert'); - -assert.rejects( - dnsPromises.lookup(addresses.NOT_FOUND, { - hints: 0, - family: 0, - all: false, - }), - { - code: 'ENOTFOUND', - message: `getaddrinfo ENOTFOUND ${addresses.NOT_FOUND}`, - }, -); - -assert.rejects( - dnsPromises.lookup(addresses.NOT_FOUND, { - hints: 0, - family: 0, - all: true, - }), - { - code: 'ENOTFOUND', - message: `getaddrinfo ENOTFOUND ${addresses.NOT_FOUND}`, - }, -); - -dns.lookup(addresses.NOT_FOUND, { - hints: 0, - family: 0, - all: true, -}, common.mustCall((error) => { - assert.strictEqual(error.code, 'ENOTFOUND'); - assert.strictEqual( - error.message, - `getaddrinfo ENOTFOUND ${addresses.NOT_FOUND}`, - ); - assert.strictEqual(error.syscall, 'getaddrinfo'); - assert.strictEqual(error.hostname, addresses.NOT_FOUND); -})); - -assert.throws( - () => dnsPromises.lookup(addresses.NOT_FOUND, { - family: 'ipv4', - all: 'all', - }), - { code: 'ERR_INVALID_ARG_VALUE' }, -); diff --git a/cli/tests/node_compat/test/internet/test-dns-promises-resolve.js b/cli/tests/node_compat/test/internet/test-dns-promises-resolve.js deleted file mode 100644 index e4ee5f782..000000000 --- a/cli/tests/node_compat/test/internet/test-dns-promises-resolve.js +++ /dev/null @@ -1,49 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const dnsPromises = require('dns').promises; - -// Error when rrtype is invalid. -{ - const rrtype = 'DUMMY'; - assert.throws( - () => dnsPromises.resolve('example.org', rrtype), - { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError', - message: `The argument 'rrtype' is invalid. Received '${rrtype}'`, - }, - ); -} - -// Error when rrtype is a number. -{ - const rrtype = 0; - assert.throws( - () => dnsPromises.resolve('example.org', rrtype), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "rrtype" argument must be of type string. ' + - `Received type ${typeof rrtype} (${rrtype})`, - }, - ); -} - -// Setting rrtype to undefined should work like resolve4. -{ - (async function() { - const rrtype = undefined; - const result = await dnsPromises.resolve('example.org', rrtype); - assert.ok(result !== undefined); - assert.ok(result.length > 0); - })().then(common.mustCall()); -} diff --git a/cli/tests/node_compat/test/internet/test-dns-regress-6244.js b/cli/tests/node_compat/test/internet/test-dns-regress-6244.js deleted file mode 100644 index 988cf21ee..000000000 --- a/cli/tests/node_compat/test/internet/test-dns-regress-6244.js +++ /dev/null @@ -1,35 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 dns = require('dns'); - -// Should not segfault. -// Ref: https://github.com/nodejs/node-v0.x-archive/issues/6244 -dns.resolve4('127.0.0.1', common.mustCall()); diff --git a/cli/tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js b/cli/tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js deleted file mode 100644 index b4360c205..000000000 --- a/cli/tests/node_compat/test/internet/test-dns-setserver-in-callback-of-resolve4.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// We don't care about `err` in the callback function of `dns.resolve4`. We just -// want to test whether `dns.setServers` that is run after `resolve4` will cause -// a crash or not. If it doesn't crash, the test succeeded. - -const common = require('../common'); -const { addresses } = require('../common/internet'); -const dns = require('dns'); - -dns.resolve4( - addresses.INET4_HOST, - common.mustCall(function(/* err, nameServers */) { - dns.setServers([ addresses.DNS4_SERVER ]); - })); - -// Test https://github.com/nodejs/node/issues/14734 -dns.resolve4(addresses.INET4_HOST, common.mustCall()); diff --git a/cli/tests/node_compat/test/internet/test-dns.js b/cli/tests/node_compat/test/internet/test-dns.js deleted file mode 100644 index 8aaeb728d..000000000 --- a/cli/tests/node_compat/test/internet/test-dns.js +++ /dev/null @@ -1,766 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --expose-internals -// 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'; - -// TODO(cmorten): enable remaining tests once functionality is implemented. - -const common = require('../common'); -const { addresses } = require('../common/internet'); -const { internalBinding } = require('internal/test/binding'); -// const { getSystemErrorName } = require('util'); -const assert = require('assert'); -const dns = require('dns'); -const net = require('net'); -const isIPv4 = net.isIPv4; -const isIPv6 = net.isIPv6; -const util = require('util'); -const dnsPromises = dns.promises; - -let expected = 0; -let completed = 0; -let running = false; -const queue = []; - - -function TEST(f) { - function next() { - const f = queue.shift(); - if (f) { - running = true; - console.log(f.name); - f(done); - } - } - - function done() { - running = false; - completed++; - process.nextTick(next); - } - - expected++; - queue.push(f); - - if (!running) { - next(); - } -} - - -function checkWrap(req) { - assert.strictEqual(typeof req, 'object'); -} - - -// TEST(function test_reverse_bogus(done) { -// dnsPromises.reverse('bogus ip') -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'EINVAL'); -// assert.strictEqual(getSystemErrorName(err.errno), 'EINVAL'); -// })); - -// assert.throws(() => { -// dns.reverse('bogus ip', common.mustNotCall()); -// }, /^Error: getHostByAddr EINVAL bogus ip$/); -// done(); -// }); - -// TEST(async function test_resolve4_ttl(done) { -// function validateResult(result) { -// assert.ok(result.length > 0); - -// for (const item of result) { -// assert.strictEqual(typeof item, 'object'); -// assert.strictEqual(typeof item.ttl, 'number'); -// assert.strictEqual(typeof item.address, 'string'); -// assert.ok(item.ttl >= 0); -// assert.ok(isIPv4(item.address)); -// } -// } - -// validateResult(await dnsPromises.resolve4(addresses.INET4_HOST, { -// ttl: true -// })); - -// const req = dns.resolve4(addresses.INET4_HOST, { -// ttl: true -// }, function(err, result) { -// assert.ifError(err); -// validateResult(result); -// done(); -// }); - -// checkWrap(req); -// }); - -// TEST(async function test_resolve6_ttl(done) { -// function validateResult(result) { -// assert.ok(result.length > 0); - -// for (const item of result) { -// assert.strictEqual(typeof item, 'object'); -// assert.strictEqual(typeof item.ttl, 'number'); -// assert.strictEqual(typeof item.address, 'string'); -// assert.ok(item.ttl >= 0); -// assert.ok(isIPv6(item.address)); -// } -// } - -// validateResult(await dnsPromises.resolve6(addresses.INET6_HOST, { -// ttl: true -// })); - -// const req = dns.resolve6(addresses.INET6_HOST, { -// ttl: true -// }, function(err, result) { -// assert.ifError(err); -// validateResult(result); -// done(); -// }); - -// checkWrap(req); -// }); - -TEST(async function test_resolveMx(done) { - function validateResult(result) { - assert.ok(result.length > 0); - - for (const item of result) { - assert.strictEqual(typeof item, 'object'); - assert.ok(item.exchange); - assert.strictEqual(typeof item.exchange, 'string'); - assert.strictEqual(typeof item.priority, 'number'); - } - } - - validateResult(await dnsPromises.resolveMx(addresses.MX_HOST)); - - const req = dns.resolveMx(addresses.MX_HOST, function(err, result) { - assert.ifError(err); - validateResult(result); - done(); - }); - - checkWrap(req); -}); - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolveMx_failure(done) { -// dnsPromises.resolveMx(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'ENOTFOUND'); -// })); - -// const req = dns.resolveMx(addresses.NOT_FOUND, function(err, result) { -// assert.ok(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); - -// assert.strictEqual(result, undefined); - -// done(); -// }); - -// checkWrap(req); -// }); - -TEST(async function test_resolveNs(done) { - function validateResult(result) { - assert.ok(result.length > 0); - - for (const item of result) { - assert.ok(item); - assert.strictEqual(typeof item, 'string'); - } - } - - validateResult(await dnsPromises.resolveNs(addresses.NS_HOST)); - - const req = dns.resolveNs(addresses.NS_HOST, function(err, names) { - assert.ifError(err); - validateResult(names); - done(); - }); - - checkWrap(req); -}); - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolveNs_failure(done) { -// dnsPromises.resolveNs(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'ENOTFOUND'); -// })); - -// const req = dns.resolveNs(addresses.NOT_FOUND, function(err, result) { -// assert.ok(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); - -// assert.strictEqual(result, undefined); - -// done(); -// }); - -// checkWrap(req); -// }); - -TEST(async function test_resolveSrv(done) { - function validateResult(result) { - assert.ok(result.length > 0); - - for (const item of result) { - assert.strictEqual(typeof item, 'object'); - assert.ok(item.name); - assert.strictEqual(typeof item.name, 'string'); - assert.strictEqual(typeof item.port, 'number'); - assert.strictEqual(typeof item.priority, 'number'); - assert.strictEqual(typeof item.weight, 'number'); - } - } - - validateResult(await dnsPromises.resolveSrv(addresses.SRV_HOST)); - - const req = dns.resolveSrv(addresses.SRV_HOST, function(err, result) { - assert.ifError(err); - validateResult(result); - done(); - }); - - checkWrap(req); -}); - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolveSrv_failure(done) { -// dnsPromises.resolveSrv(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'ENOTFOUND'); -// })); - -// const req = dns.resolveSrv(addresses.NOT_FOUND, function(err, result) { -// assert.ok(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); - -// assert.strictEqual(result, undefined); - -// done(); -// }); - -// checkWrap(req); -// }); - -// TODO(bartlomieju): this test started failing on CI on Dec 28th, 2023 returning -// ENOTFOUND. It's unclear what's going on, since `dig -x 8.8.8.8.in-addr.arpa` -// returns correct PTR record. -// TEST(async function test_resolvePtr(done) { -// function validateResult(result) { -// assert.ok(result.length > 0); - -// for (const item of result) { -// assert.ok(item); -// assert.strictEqual(typeof item, 'string'); -// } -// } - -// validateResult(await dnsPromises.resolvePtr(addresses.PTR_HOST)); - -// const req = dns.resolvePtr(addresses.PTR_HOST, function(err, result) { -// assert.ifError(err); -// validateResult(result); -// done(); -// }); - -// checkWrap(req); -// }); - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolvePtr_failure(done) { -// dnsPromises.resolvePtr(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'ENOTFOUND'); -// })); - -// const req = dns.resolvePtr(addresses.NOT_FOUND, function(err, result) { -// assert.ok(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); - -// assert.strictEqual(result, undefined); - -// done(); -// }); - -// checkWrap(req); -// }); - -TEST(async function test_resolveNaptr(done) { - function validateResult(result) { - assert.ok(result.length > 0); - - for (const item of result) { - assert.strictEqual(typeof item, 'object'); - assert.strictEqual(typeof item.flags, 'string'); - assert.strictEqual(typeof item.service, 'string'); - assert.strictEqual(typeof item.regexp, 'string'); - assert.strictEqual(typeof item.replacement, 'string'); - assert.strictEqual(typeof item.order, 'number'); - assert.strictEqual(typeof item.preference, 'number'); - } - } - - validateResult(await dnsPromises.resolveNaptr(addresses.NAPTR_HOST)); - - const req = dns.resolveNaptr(addresses.NAPTR_HOST, function(err, result) { - assert.ifError(err); - validateResult(result); - done(); - }); - - checkWrap(req); -}); - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolveNaptr_failure(done) { -// dnsPromises.resolveNaptr(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'ENOTFOUND'); -// })); - -// const req = dns.resolveNaptr(addresses.NOT_FOUND, function(err, result) { -// assert.ok(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); - -// assert.strictEqual(result, undefined); - -// done(); -// }); - -// checkWrap(req); -// }); - -TEST(async function test_resolveSoa(done) { - function validateResult(result) { - assert.strictEqual(typeof result, 'object'); - assert.strictEqual(typeof result.nsname, 'string'); - assert.ok(result.nsname.length > 0); - assert.strictEqual(typeof result.hostmaster, 'string'); - assert.ok(result.hostmaster.length > 0); - assert.strictEqual(typeof result.serial, 'number'); - assert.ok((result.serial > 0) && (result.serial < 4294967295)); - assert.strictEqual(typeof result.refresh, 'number'); - assert.ok((result.refresh > 0) && (result.refresh < 2147483647)); - assert.strictEqual(typeof result.retry, 'number'); - assert.ok((result.retry > 0) && (result.retry < 2147483647)); - assert.strictEqual(typeof result.expire, 'number'); - assert.ok((result.expire > 0) && (result.expire < 2147483647)); - assert.strictEqual(typeof result.minttl, 'number'); - assert.ok((result.minttl >= 0) && (result.minttl < 2147483647)); - } - - validateResult(await dnsPromises.resolveSoa(addresses.SOA_HOST)); - - const req = dns.resolveSoa(addresses.SOA_HOST, function(err, result) { - assert.ifError(err); - validateResult(result); - done(); - }); - - checkWrap(req); -}); - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolveSoa_failure(done) { -// dnsPromises.resolveSoa(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'ENOTFOUND'); -// })); - -// const req = dns.resolveSoa(addresses.NOT_FOUND, function(err, result) { -// assert.ok(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); - -// assert.strictEqual(result, undefined); - -// done(); -// }); - -// checkWrap(req); -// }); - -TEST(async function test_resolveCaa(done) { - function validateResult(result) { - assert.ok(Array.isArray(result), - `expected array, got ${util.inspect(result)}`); - assert.strictEqual(result.length, 1); - assert.strictEqual(typeof result[0].critical, 'number'); - assert.strictEqual(result[0].critical, 0); - assert.strictEqual(result[0].issue, 'pki.goog'); - } - - validateResult(await dnsPromises.resolveCaa(addresses.CAA_HOST)); - - const req = dns.resolveCaa(addresses.CAA_HOST, function(err, records) { - assert.ifError(err); - validateResult(records); - done(); - }); - - checkWrap(req); -}); - -// NOTE(bartlomieju): this test started failing around July 11th, 2023. -// TEST(async function test_resolveCname(done) { -// function validateResult(result) { -// assert.ok(result.length > 0); -// -// for (const item of result) { -// assert.ok(item); -// assert.strictEqual(typeof item, 'string'); -// } -// } -// -// validateResult(await dnsPromises.resolveCname(addresses.CNAME_HOST)); -// -// const req = dns.resolveCname(addresses.CNAME_HOST, function(err, names) { -// assert.ifError(err); -// validateResult(names); -// done(); -// }); -// -// checkWrap(req); -// }); - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolveCname_failure(done) { -// dnsPromises.resolveCname(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'ENOTFOUND'); -// })); - -// const req = dns.resolveCname(addresses.NOT_FOUND, function(err, result) { -// assert.ok(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); - -// assert.strictEqual(result, undefined); - -// done(); -// }); - -// checkWrap(req); -// }); - - -TEST(async function test_resolveTxt(done) { - function validateResult(result) { - assert.ok(Array.isArray(result[0])); - assert.strictEqual(result.length, 1); - assert(result[0][0].startsWith('v=spf1')); - } - - validateResult(await dnsPromises.resolveTxt(addresses.TXT_HOST)); - - const req = dns.resolveTxt(addresses.TXT_HOST, function(err, records) { - assert.ifError(err); - validateResult(records); - done(); - }); - - checkWrap(req); -}); - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolveTxt_failure(done) { -// dnsPromises.resolveTxt(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.mustCall((err) => { -// assert.strictEqual(err.code, 'ENOTFOUND'); -// })); - -// const req = dns.resolveTxt(addresses.NOT_FOUND, function(err, result) { -// assert.ok(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); - -// assert.strictEqual(result, undefined); - -// done(); -// }); - -// checkWrap(req); -// }); - - -TEST(function test_lookup_failure(done) { - dnsPromises.lookup(addresses.NOT_FOUND, 4) - .then(common.mustNotCall()) - .catch(common.expectsError({ code: dns.NOTFOUND })); - - const req = dns.lookup(addresses.NOT_FOUND, 4, (err) => { - assert.ok(err instanceof Error); - assert.strictEqual(err.code, dns.NOTFOUND); - assert.strictEqual(err.code, 'ENOTFOUND'); - assert.doesNotMatch(err.message, /ENOENT/); - assert.ok(err.message.includes(addresses.NOT_FOUND)); - - done(); - }); - - checkWrap(req); -}); - - -TEST(async function test_lookup_ip_all(done) { - function validateResult(result) { - assert.ok(Array.isArray(result)); - assert.ok(result.length > 0); - assert.strictEqual(result[0].address, '127.0.0.1'); - assert.strictEqual(result[0].family, 4); - } - - validateResult(await dnsPromises.lookup('127.0.0.1', { all: true })); - - const req = dns.lookup( - '127.0.0.1', - { all: true }, - function(err, ips, family) { - assert.ifError(err); - assert.strictEqual(family, undefined); - validateResult(ips); - done(); - } - ); - - checkWrap(req); -}); - - -TEST(function test_lookup_ip_all_promise(done) { - const req = util.promisify(dns.lookup)('127.0.0.1', { all: true }) - .then(function(ips) { - assert.ok(Array.isArray(ips)); - assert.ok(ips.length > 0); - assert.strictEqual(ips[0].address, '127.0.0.1'); - assert.strictEqual(ips[0].family, 4); - - done(); - }); - - checkWrap(req); -}); - - -TEST(function test_lookup_ip_promise(done) { - util.promisify(dns.lookup)('127.0.0.1') - .then(function({ address, family }) { - assert.strictEqual(address, '127.0.0.1'); - assert.strictEqual(family, 4); - - done(); - }); -}); - - -TEST(async function test_lookup_null_all(done) { - assert.deepStrictEqual(await dnsPromises.lookup(null, { all: true }), []); - - const req = dns.lookup(null, { all: true }, (err, ips) => { - assert.ifError(err); - assert.ok(Array.isArray(ips)); - assert.strictEqual(ips.length, 0); - - done(); - }); - - checkWrap(req); -}); - - -TEST(async function test_lookup_all_mixed(done) { - function validateResult(result) { - assert.ok(Array.isArray(result)); - assert.ok(result.length > 0); - - result.forEach(function(ip) { - if (isIPv4(ip.address)) - assert.strictEqual(ip.family, 4); - else if (isIPv6(ip.address)) - assert.strictEqual(ip.family, 6); - else - assert.fail('unexpected IP address'); - }); - } - - validateResult(await dnsPromises.lookup(addresses.INET_HOST, { all: true })); - - const req = dns.lookup(addresses.INET_HOST, { - all: true - }, function(err, ips) { - assert.ifError(err); - validateResult(ips); - done(); - }); - - checkWrap(req); -}); - - -// TEST(function test_lookupservice_invalid(done) { -// dnsPromises.lookupService('1.2.3.4', 80) -// .then(common.mustNotCall()) -// .catch(common.expectsError({ code: 'ENOTFOUND' })); - -// const req = dns.lookupService('1.2.3.4', 80, (err) => { -// assert(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); -// assert.match(err.message, /1\.2\.3\.4/); - -// done(); -// }); - -// checkWrap(req); -// }); - - -// TEST(function test_reverse_failure(done) { -// dnsPromises.reverse('203.0.113.0') -// .then(common.mustNotCall()) -// .catch(common.expectsError({ -// code: 'ENOTFOUND', -// hostname: '203.0.113.0' -// })); - -// // 203.0.113.0/24 are addresses reserved for (RFC) documentation use only -// const req = dns.reverse('203.0.113.0', function(err) { -// assert(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); // Silly error code... -// assert.strictEqual(err.hostname, '203.0.113.0'); -// assert.match(err.message, /203\.0\.113\.0/); - -// done(); -// }); - -// checkWrap(req); -// }); - - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_lookup_failure(done) { -// dnsPromises.lookup(addresses.NOT_FOUND) -// .then(common.mustNotCall()) -// .catch(common.expectsError({ -// code: 'ENOTFOUND', -// hostname: addresses.NOT_FOUND -// })); - -// const req = dns.lookup(addresses.NOT_FOUND, (err) => { -// assert(err instanceof Error); -// assert.strictEqual(err.code, 'ENOTFOUND'); // Silly error code... -// assert.strictEqual(err.hostname, addresses.NOT_FOUND); -// assert.ok(err.message.includes(addresses.NOT_FOUND)); - -// done(); -// }); - -// checkWrap(req); -// }); - - -// TODO(bartlomieju): this test became very flaky on CI, returning `UNKNOWN` -// instead of `ENOTFOUND`. -// TEST(function test_resolve_failure(done) { -// const req = dns.resolve4(addresses.NOT_FOUND, (err) => { -// assert(err instanceof Error); - -// switch (err.code) { -// case 'ENOTFOUND': -// case 'ESERVFAIL': -// break; -// default: -// assert.strictEqual(err.code, 'ENOTFOUND'); // Silly error code... -// break; -// } - -// assert.strictEqual(err.hostname, addresses.NOT_FOUND); -// assert.ok(err.message.includes(addresses.NOT_FOUND)); - -// done(); -// }); - -// checkWrap(req); -// }); - - -let getaddrinfoCallbackCalled = false; - -console.log(`looking up ${addresses.INET4_HOST}..`); - -const cares = internalBinding('cares_wrap'); -const req = new cares.GetAddrInfoReqWrap(); -cares.getaddrinfo(req, addresses.INET4_HOST, 4, - /* hints */ 0, /* verbatim */ true); - -req.oncomplete = function(err, domains) { - assert.strictEqual(err, 0); - console.log(`${addresses.INET4_HOST} = ${domains}`); - assert.ok(Array.isArray(domains)); - assert.ok(domains.length >= 1); - assert.strictEqual(typeof domains[0], 'string'); - getaddrinfoCallbackCalled = true; -}; - -process.on('exit', function() { - console.log(`${completed} tests completed`); - assert.strictEqual(running, false); - assert.strictEqual(completed, expected); - assert.ok(getaddrinfoCallbackCalled); -}); - -// Should not throw. -dns.lookup(addresses.INET6_HOST, 6, common.mustCall()); -dns.lookup(addresses.INET_HOST, {}, common.mustCall()); -// dns.lookupService('0.0.0.0', '0', common.mustCall()); -// dns.lookupService('0.0.0.0', 0, common.mustCall()); -(async function() { - await dnsPromises.lookup(addresses.INET6_HOST, 6); - await dnsPromises.lookup(addresses.INET_HOST, {}); -})().then(common.mustCall()); diff --git a/cli/tests/node_compat/test/internet/test-http-https-default-ports.js b/cli/tests/node_compat/test/internet/test-http-https-default-ports.js deleted file mode 100644 index ef3edd2fc..000000000 --- a/cli/tests/node_compat/test/internet/test-http-https-default-ports.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { addresses } = require('../common/internet'); - -if (!common.hasCrypto) - common.skip('missing crypto'); - -const https = require('https'); - -const http = require('http'); - -https.get(`https://${addresses.INET_HOST}/`, common.mustCall((res) => { - res.resume(); -})); - -http.get(`http://${addresses.INET_HOST}/`, common.mustCall((res) => { - res.resume(); -})); diff --git a/cli/tests/node_compat/test/parallel/package.json b/cli/tests/node_compat/test/parallel/package.json deleted file mode 100644 index 0967ef424..000000000 --- a/cli/tests/node_compat/test/parallel/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/cli/tests/node_compat/test/parallel/test-assert-async.js b/cli/tests/node_compat/test/parallel/test-assert-async.js deleted file mode 100644 index a2a8315d8..000000000 --- a/cli/tests/node_compat/test/parallel/test-assert-async.js +++ /dev/null @@ -1,244 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -// Run all tests in parallel and check their outcome at the end. -const promises = []; - -// Thenable object without `catch` method, -// shouldn't be considered as a valid Thenable -const invalidThenable = { - then: (fulfill, reject) => { - fulfill(); - }, -}; - -// Function that returns a Thenable function, -// a function with `catch` and `then` methods attached, -// shouldn't be considered as a valid Thenable. -const invalidThenableFunc = () => { - function f() {} - - f.then = (fulfill, reject) => { - fulfill(); - }; - f.catch = () => {}; - - return f; -}; - -// Test assert.rejects() and assert.doesNotReject() by checking their -// expected output and by verifying that they do not work sync - -// Check `assert.rejects`. -{ - const rejectingFn = async () => assert.fail(); - const errObj = { - code: 'ERR_ASSERTION', - name: 'AssertionError', - message: 'Failed' - }; - - // `assert.rejects` accepts a function or a promise - // or a thenable as first argument. - promises.push(assert.rejects(rejectingFn, errObj)); - promises.push(assert.rejects(rejectingFn(), errObj)); - - const validRejectingThenable = { - then: (fulfill, reject) => { - reject({ code: 'FAIL' }); - }, - catch: () => {} - }; - promises.push(assert.rejects(validRejectingThenable, { code: 'FAIL' })); - - // `assert.rejects` should not accept thenables that - // use a function as `obj` and that have no `catch` handler. - promises.push(assert.rejects( - assert.rejects(invalidThenable, {}), - { - code: 'ERR_INVALID_ARG_TYPE' - }) - ); - promises.push(assert.rejects( - assert.rejects(invalidThenableFunc, {}), - { - code: 'ERR_INVALID_RETURN_VALUE' - }) - ); - - const err = new Error('foobar'); - const validate = () => { return 'baz'; }; - promises.push(assert.rejects( - () => assert.rejects(Promise.reject(err), validate), - { - message: 'The "validate" validation function is expected to ' + - "return \"true\". Received 'baz'\n\nCaught error:\n\n" + - 'Error: foobar', - code: 'ERR_ASSERTION', - actual: err, - expected: validate, - name: 'AssertionError', - operator: 'rejects', - } - )); -} - -{ - const handler = (err) => { - assert(err instanceof assert.AssertionError, - `${err.name} is not instance of AssertionError`); - assert.strictEqual(err.code, 'ERR_ASSERTION'); - assert.strictEqual(err.message, - 'Missing expected rejection (mustNotCall).'); - assert.strictEqual(err.operator, 'rejects'); - assert.ok(!err.stack.includes('at Function.rejects')); - return true; - }; - - let promise = assert.rejects(async () => {}, common.mustNotCall()); - promises.push(assert.rejects(promise, common.mustCall(handler))); - - promise = assert.rejects(() => {}, common.mustNotCall()); - promises.push(assert.rejects(promise, { - name: 'TypeError', - code: 'ERR_INVALID_RETURN_VALUE', - // FIXME(JakobJingleheimer): This should match on key words, like /Promise/ and /undefined/. - message: 'Expected instance of Promise to be returned ' + - 'from the "promiseFn" function but got undefined.' - })); - - promise = assert.rejects(Promise.resolve(), common.mustNotCall()); - promises.push(assert.rejects(promise, common.mustCall(handler))); -} - -{ - const THROWN_ERROR = new Error(); - - promises.push(assert.rejects(() => { - throw THROWN_ERROR; - }, {}).catch(common.mustCall((err) => { - assert.strictEqual(err, THROWN_ERROR); - }))); -} - -promises.push(assert.rejects( - assert.rejects('fail', {}), - { - code: 'ERR_INVALID_ARG_TYPE', - message: 'The "promiseFn" argument must be of type function or an ' + - "instance of Promise. Received type string ('fail')" - } -)); - -{ - const handler = (generated, actual, err) => { - assert.strictEqual(err.generatedMessage, generated); - assert.strictEqual(err.code, 'ERR_ASSERTION'); - assert.strictEqual(err.actual, actual); - assert.strictEqual(err.operator, 'rejects'); - assert.match(err.stack, /rejects/); - return true; - }; - const err = new Error(); - promises.push(assert.rejects( - assert.rejects(Promise.reject(null), { code: 'FOO' }), - handler.bind(null, true, null) - )); - promises.push(assert.rejects( - assert.rejects(Promise.reject(5), { code: 'FOO' }, 'AAAAA'), - handler.bind(null, false, 5) - )); - promises.push(assert.rejects( - assert.rejects(Promise.reject(err), { code: 'FOO' }, 'AAAAA'), - handler.bind(null, false, err) - )); -} - -// Check `assert.doesNotReject`. -{ - // `assert.doesNotReject` accepts a function or a promise - // or a thenable as first argument. - /* eslint-disable no-restricted-syntax */ - let promise = assert.doesNotReject(() => new Map(), common.mustNotCall()); - promises.push(assert.rejects(promise, { - message: 'Expected instance of Promise to be returned ' + - 'from the "promiseFn" function but got an instance of Map.', - code: 'ERR_INVALID_RETURN_VALUE', - name: 'TypeError' - })); - promises.push(assert.doesNotReject(async () => {})); - promises.push(assert.doesNotReject(Promise.resolve())); - - // `assert.doesNotReject` should not accept thenables that - // use a function as `obj` and that have no `catch` handler. - const validFulfillingThenable = { - then: (fulfill, reject) => { - fulfill(); - }, - catch: () => {} - }; - promises.push(assert.doesNotReject(validFulfillingThenable)); - promises.push(assert.rejects( - assert.doesNotReject(invalidThenable), - { - code: 'ERR_INVALID_ARG_TYPE' - }) - ); - promises.push(assert.rejects( - assert.doesNotReject(invalidThenableFunc), - { - code: 'ERR_INVALID_RETURN_VALUE' - }) - ); - - const handler1 = (err) => { - assert(err instanceof assert.AssertionError, - `${err.name} is not instance of AssertionError`); - assert.strictEqual(err.code, 'ERR_ASSERTION'); - assert.strictEqual(err.message, 'Failed'); - return true; - }; - const handler2 = (err) => { - assert(err instanceof assert.AssertionError, - `${err.name} is not instance of AssertionError`); - assert.strictEqual(err.code, 'ERR_ASSERTION'); - assert.strictEqual(err.message, - 'Got unwanted rejection.\nActual message: "Failed"'); - assert.strictEqual(err.operator, 'doesNotReject'); - assert.ok(err.stack); - assert.ok(!err.stack.includes('at Function.doesNotReject')); - return true; - }; - - const rejectingFn = async () => assert.fail(); - - promise = assert.doesNotReject(rejectingFn, common.mustCall(handler1)); - promises.push(assert.rejects(promise, common.mustCall(handler2))); - - promise = assert.doesNotReject(rejectingFn(), common.mustCall(handler1)); - promises.push(assert.rejects(promise, common.mustCall(handler2))); - - promise = assert.doesNotReject(() => assert.fail(), common.mustNotCall()); - promises.push(assert.rejects(promise, common.mustCall(handler1))); - - promises.push(assert.rejects( - assert.doesNotReject(123), - { - code: 'ERR_INVALID_ARG_TYPE', - message: 'The "promiseFn" argument must be of type ' + - 'function or an instance of Promise. Received type number (123)' - } - )); - /* eslint-enable no-restricted-syntax */ -} - -// Make sure all async code gets properly executed. -Promise.all(promises).then(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-assert-fail.js b/cli/tests/node_compat/test/parallel/test-assert-fail.js deleted file mode 100644 index 03def3a88..000000000 --- a/cli/tests/node_compat/test/parallel/test-assert-fail.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); - -// No args -assert.throws( - () => { assert.fail(); }, - { - code: 'ERR_ASSERTION', - name: 'AssertionError', - message: 'Failed', - operator: 'fail', - actual: undefined, - expected: undefined, - generatedMessage: true, - stack: /Failed/ - } -); - -// One arg = message -assert.throws(() => { - assert.fail('custom message'); -}, { - code: 'ERR_ASSERTION', - name: 'AssertionError', - message: 'custom message', - operator: 'fail', - actual: undefined, - expected: undefined, - generatedMessage: false -}); - -// One arg = Error -assert.throws(() => { - assert.fail(new TypeError('custom message')); -}, { - name: 'TypeError', - message: 'custom message' -}); - -Object.prototype.get = common.mustNotCall(); -assert.throws(() => assert.fail(''), { code: 'ERR_ASSERTION' }); -delete Object.prototype.get; diff --git a/cli/tests/node_compat/test/parallel/test-assert-strict-exists.js b/cli/tests/node_compat/test/parallel/test-assert-strict-exists.js deleted file mode 100644 index 49499c3f6..000000000 --- a/cli/tests/node_compat/test/parallel/test-assert-strict-exists.js +++ /dev/null @@ -1,13 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -assert.strictEqual(require('assert/strict'), assert.strict); diff --git a/cli/tests/node_compat/test/parallel/test-assert.js b/cli/tests/node_compat/test/parallel/test-assert.js deleted file mode 100644 index 58b95068c..000000000 --- a/cli/tests/node_compat/test/parallel/test-assert.js +++ /dev/null @@ -1,1615 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 15.5.1 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --expose-internals -// 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 { inspect } = require('util'); -// TODO(kt3k): Enable these when "vm" is ready. -// const vm = require('vm'); -// TODO(kt3k): Enable these when "internal/test/binding" is ready. -// const { internalBinding } = require('internal/test/binding'); -const a = assert; - -// Disable colored output to prevent color codes from breaking assertion -// message comparisons. This should only be an issue when process.stdout -// is a TTY. -if (process.stdout.isTTY) - process.env.NODE_DISABLE_COLORS = '1'; - -const strictEqualMessageStart = 'Expected values to be strictly equal:\n'; -const start = 'Expected values to be strictly deep-equal:'; -const actExp = '+ actual - expected'; - -assert.ok(a.AssertionError.prototype instanceof Error, - 'a.AssertionError instanceof Error'); - -assert.throws(() => a(false), a.AssertionError, 'ok(false)'); -assert.throws(() => a.ok(false), a.AssertionError, 'ok(false)'); - -// Throw message if the message is instanceof Error. -{ - let threw = false; - try { - assert.ok(false, new Error('ok(false)')); - } catch (e) { - threw = true; - assert.ok(e instanceof Error); - } - assert.ok(threw, 'Error: ok(false)'); -} - - -a(true); -a('test', 'ok(\'test\')'); -a.ok(true); -a.ok('test'); - -assert.throws(() => a.equal(true, false), - a.AssertionError, 'equal(true, false)'); - -a.equal(null, null); -a.equal(undefined, undefined); -a.equal(null, undefined); -a.equal(true, true); -a.equal(2, '2'); -a.notEqual(true, false); - -assert.throws(() => a.notEqual(true, true), - a.AssertionError, 'notEqual(true, true)'); - -assert.throws(() => a.strictEqual(2, '2'), - a.AssertionError, 'strictEqual(2, \'2\')'); - -assert.throws(() => a.strictEqual(null, undefined), - a.AssertionError, 'strictEqual(null, undefined)'); - -assert.throws( - () => a.notStrictEqual(2, 2), - { - message: 'Expected "actual" to be strictly unequal to: 2\n', - name: 'AssertionError' - } -); - -assert.throws( - () => a.notStrictEqual('a '.repeat(30), 'a '.repeat(30)), - { - message: 'Expected "actual" to be strictly unequal to: ' + - `"${'a '.repeat(30)}"\n`, - name: 'AssertionError' - } -); - -assert.throws( - () => a.notEqual(1, 1), - { - message: '1 != 1', - operator: '!=' - } -); - -a.notStrictEqual(2, '2'); - -// Testing the throwing. -function thrower(errorConstructor) { - throw new errorConstructor({}); -} - -// The basic calls work. -assert.throws(() => thrower(a.AssertionError), a.AssertionError, 'message'); -assert.throws(() => thrower(a.AssertionError), a.AssertionError); -assert.throws(() => thrower(a.AssertionError)); - -// If not passing an error, catch all. -assert.throws(() => thrower(TypeError)); - -// When passing a type, only catch errors of the appropriate type. -assert.throws( - () => a.throws(() => thrower(TypeError), a.AssertionError), - { - // generatedMessage: true, - // actual: new TypeError({}), - expected: a.AssertionError, - code: 'ERR_ASSERTION', - name: 'AssertionError', - operator: 'throws', - message: 'The error is expected to be an instance of "AssertionError". ' + - 'Received "TypeError"\n\nError message:\n\n[object Object]' - } -); - -// doesNotThrow should pass through all errors. -{ - let threw = false; - try { - a.doesNotThrow(() => thrower(TypeError), a.AssertionError); - } catch (e) { - threw = true; - assert.ok(e instanceof TypeError); - } - assert(threw, 'a.doesNotThrow with an explicit error is eating extra errors'); -} - -// Key difference is that throwing our correct error makes an assertion error. -{ - let threw = false; - try { - a.doesNotThrow(() => thrower(TypeError), TypeError); - } catch (e) { - threw = true; - assert.ok(e instanceof a.AssertionError); - // Commented out the following assertion - // assert.ok(!e.stack.includes('at Function.doesNotThrow')); - } - assert.ok(threw, 'a.doesNotThrow is not catching type matching errors'); -} - -assert.throws( - () => a.doesNotThrow(() => thrower(Error), 'user message'), - { - name: 'AssertionError', - code: 'ERR_ASSERTION', - operator: 'doesNotThrow', - message: 'Got unwanted exception: user message\n' + - 'Actual message: "[object Object]"' - } -); - -assert.throws( - () => a.doesNotThrow(() => thrower(Error)), - { - code: 'ERR_ASSERTION', - message: 'Got unwanted exception.\nActual message: "[object Object]"' - } -); - -assert.throws( - () => a.doesNotThrow(() => thrower(Error), /\[[a-z]{6}\s[A-z]{6}\]/g, 'user message'), - { - name: 'AssertionError', - code: 'ERR_ASSERTION', - operator: 'doesNotThrow', - message: 'Got unwanted exception: user message\n' + - 'Actual message: "[object Object]"' - } -); - -// Make sure that validating using constructor really works. -{ - let threw = false; - try { - assert.throws( - () => { - throw ({}); - }, - Array - ); - } catch { - threw = true; - } - assert.ok(threw, 'wrong constructor validation'); -} - -// Use a RegExp to validate the error message. -{ - a.throws(() => thrower(TypeError), /\[object Object\]/); - - const symbol = Symbol('foo'); - a.throws(() => { - throw symbol; - }, /foo/); - - a.throws(() => { - a.throws(() => { - throw symbol; - }, /abc/); - }, { - message: 'The input did not match the regular expression /abc/. ' + - "Input:\n\n'Symbol(foo)'\n", - code: 'ERR_ASSERTION', - operator: 'throws', - actual: symbol, - expected: /abc/ - }); -} - -// Use a fn to validate the error object. -a.throws(() => thrower(TypeError), (err) => { - if ((err instanceof TypeError) && /\[object Object\]/.test(err)) { - return true; - } -}); - -// https://github.com/nodejs/node/issues/3188 -{ - let actual; - assert.throws( - () => { - const ES6Error = class extends Error {}; - const AnotherErrorType = class extends Error {}; - - assert.throws(() => { - actual = new AnotherErrorType('foo'); - throw actual; - }, ES6Error); - }, - (err) => { - assert.strictEqual( - err.message, - 'The error is expected to be an instance of "ES6Error". ' + - 'Received "AnotherErrorType"\n\nError message:\n\nfoo' - ); - assert.strictEqual(err.actual, actual); - return true; - } - ); -} - -// Check messages from assert.throws(). -{ - const noop = () => {}; - assert.throws( - () => { a.throws((noop)); }, - { - code: 'ERR_ASSERTION', - message: 'Missing expected exception.', - operator: 'throws', - actual: undefined, - expected: undefined - }); - - assert.throws( - () => { a.throws(noop, TypeError); }, - { - code: 'ERR_ASSERTION', - message: 'Missing expected exception (TypeError).', - actual: undefined, - expected: TypeError - }); - - assert.throws( - () => { a.throws(noop, 'fhqwhgads'); }, - { - code: 'ERR_ASSERTION', - message: 'Missing expected exception: fhqwhgads', - actual: undefined, - expected: undefined - }); - - assert.throws( - () => { a.throws(noop, TypeError, 'fhqwhgads'); }, - { - code: 'ERR_ASSERTION', - message: 'Missing expected exception (TypeError): fhqwhgads', - actual: undefined, - expected: TypeError - }); - - let threw = false; - try { - a.throws(noop); - } catch (e) { - threw = true; - assert.ok(e instanceof a.AssertionError); - // TODO(kt3k): enable this assertion - // assert.ok(!e.stack.includes('at Function.throws')); - } - assert.ok(threw); -} - -const circular = { y: 1 }; -circular.x = circular; - -function testAssertionMessage(actual, expected, msg) { - assert.throws( - () => assert.strictEqual(actual, ''), - { - generatedMessage: true, - message: msg || strictEqualMessageStart + - `+ actual - expected\n\n+ ${expected}\n- ''` - } - ); -} - -function testShortAssertionMessage(actual, expected) { - testAssertionMessage(actual, expected, strictEqualMessageStart + - `\n${inspect(actual)} !== ''\n`); -} - -// TODO(kt3k): Do we need completely simulate -// Node.js assertion error messages? -/* -testShortAssertionMessage(null, 'null'); -testShortAssertionMessage(true, 'true'); -testShortAssertionMessage(false, 'false'); -testShortAssertionMessage(100, '100'); -testShortAssertionMessage(NaN, 'NaN'); -testShortAssertionMessage(Infinity, 'Infinity'); -testShortAssertionMessage('a', '"a"'); -testShortAssertionMessage('foo', '\'foo\''); -testShortAssertionMessage(0, '0'); -testShortAssertionMessage(Symbol(), 'Symbol()'); -testShortAssertionMessage(undefined, 'undefined'); -testShortAssertionMessage(-Infinity, '-Infinity'); -testAssertionMessage([], '[]'); -testAssertionMessage(/a/, '/a/'); -testAssertionMessage(/abc/gim, '/abc/gim'); -testAssertionMessage({}, '{}'); -testAssertionMessage([1, 2, 3], '[\n+ 1,\n+ 2,\n+ 3\n+ ]'); -testAssertionMessage(function f() {}, '[Function: f]'); -testAssertionMessage(function() {}, '[Function (anonymous)]'); -testAssertionMessage(circular, - '<ref *1> {\n+ x: [Circular *1],\n+ y: 1\n+ }'); -testAssertionMessage({ a: undefined, b: null }, - '{\n+ a: undefined,\n+ b: null\n+ }'); -testAssertionMessage({ a: NaN, b: Infinity, c: -Infinity }, - '{\n+ a: NaN,\n+ b: Infinity,\n+ c: -Infinity\n+ }'); -*/ - -// https://github.com/nodejs/node-v0.x-archive/issues/5292 -assert.throws( - () => assert.strictEqual(1, 2), -/* Memo: Disabled this object assertion - { - message: `${strictEqualMessageStart}\n1 !== 2\n`, - generatedMessage: true - } -*/ -); - -assert.throws( - () => assert.strictEqual(1, 2, 'oh no'), - { - message: 'oh no', - generatedMessage: false - } -); - -{ - let threw = false; - const rangeError = new RangeError('my range'); - - // Verify custom errors. - try { - assert.strictEqual(1, 2, rangeError); - } catch (e) { - assert.strictEqual(e, rangeError); - threw = true; - assert.ok(e instanceof RangeError, 'Incorrect error type thrown'); - } - assert.ok(threw); - threw = false; - - // Verify AssertionError is the result from doesNotThrow with custom Error. - try { - a.doesNotThrow(() => { - throw new TypeError('wrong type'); - }, TypeError, rangeError); - } catch (e) { - threw = true; - assert.ok(e.message.includes(rangeError.message)); - assert.ok(e instanceof assert.AssertionError); - // TODO(kt3k): Enable this assertion - // assert.ok(!e.stack.includes('doesNotThrow'), e); - } - assert.ok(threw); -} - -{ - // Verify that throws() and doesNotThrow() throw on non-functions. - const testBlockTypeError = (method, fn) => { - assert.throws( - () => method(fn), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "fn" argument must be of type function.' + - common.invalidArgTypeHelper(fn) - } - ); - }; - - testBlockTypeError(assert.throws, 'string'); - testBlockTypeError(assert.doesNotThrow, 'string'); - testBlockTypeError(assert.throws, 1); - testBlockTypeError(assert.doesNotThrow, 1); - testBlockTypeError(assert.throws, true); - testBlockTypeError(assert.doesNotThrow, true); - testBlockTypeError(assert.throws, false); - testBlockTypeError(assert.doesNotThrow, false); - testBlockTypeError(assert.throws, []); - testBlockTypeError(assert.doesNotThrow, []); - testBlockTypeError(assert.throws, {}); - testBlockTypeError(assert.doesNotThrow, {}); - testBlockTypeError(assert.throws, /foo/); - testBlockTypeError(assert.doesNotThrow, /foo/); - testBlockTypeError(assert.throws, null); - testBlockTypeError(assert.doesNotThrow, null); - testBlockTypeError(assert.throws, undefined); - testBlockTypeError(assert.doesNotThrow, undefined); -} - -// https://github.com/nodejs/node/issues/3275 -assert.throws(() => { throw 'error'; }, (err) => err === 'error'); -assert.throws(() => { throw new Error(); }, (err) => err instanceof Error); - -// Long values should be truncated for display. -assert.throws(() => { - assert.strictEqual('A'.repeat(1000), ''); -}, (err) => { - assert.strictEqual(err.code, 'ERR_ASSERTION'); - /* TODO(kt3k): Enable this assertion - assert.strictEqual(err.message, - `${strictEqualMessageStart}+ actual - expected\n\n` + - `+ '${'A'.repeat(1000)}'\n- ''`); - */ - assert.strictEqual(err.actual.length, 1000); - // TODO(kt3k): Enable this after fixing 'inspect' - // assert.ok(inspect(err).includes(`actual: '${'A'.repeat(488)}...'`)); - return true; -}); - -// Output that extends beyond 10 lines should also be truncated for display. -{ - const multilineString = 'fhqwhgads\n'.repeat(15); - assert.throws(() => { - assert.strictEqual(multilineString, ''); - }, (err) => { - assert.strictEqual(err.code, 'ERR_ASSERTION'); - // TODO(kt3k): Enable these assertion when the strictEqual message is aligned - // to Node.js API. - // assert.strictEqual(err.message.split('\n').length, 19); - assert.strictEqual(err.actual.split('\n').length, 16); - // TODO(kt3k): inspect(err) causes Maximum call stack error. - /* - assert.ok(inspect(err).includes( - "actual: 'fhqwhgads\\n' +\n" + - " 'fhqwhgads\\n' +\n".repeat(9) + - " '...'")); - */ - return true; - }); -} - -{ - // Bad args to AssertionError constructor should throw TypeError. - const args = [1, true, false, '', null, Infinity, Symbol('test'), undefined]; - args.forEach((input) => { - assert.throws( - () => new assert.AssertionError(input), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "options" argument must be of type object.' + - common.invalidArgTypeHelper(input) - }); - }); -} - -assert.throws( - () => assert.strictEqual(new Error('foo'), new Error('foobar')), - { - code: 'ERR_ASSERTION', - name: 'AssertionError', - /* TODO(kt3k): Enable this assertion when the assertion error message is fixed. - message: 'Expected "actual" to be reference-equal to "expected":\n' + - '+ actual - expected\n\n' + - '+ [Error: foo]\n- [Error: foobar]' - */ - } -); - -a.equal(NaN, NaN); -a.throws( - () => a.notEqual(NaN, NaN), - a.AssertionError -); - -// Test strict assert. -{ - const a = require('assert'); - const assert = require('assert').strict; - assert.throws(() => assert.equal(1, true), assert.AssertionError); - assert.notEqual(0, false); - assert.throws(() => assert.deepEqual(1, true), assert.AssertionError); - assert.notDeepEqual(0, false); - assert.equal(assert.strict, assert.strict.strict); - assert.equal(assert.equal, assert.strictEqual); - assert.equal(assert.deepEqual, assert.deepStrictEqual); - assert.equal(assert.notEqual, assert.notStrictEqual); - assert.equal(assert.notDeepEqual, assert.notDeepStrictEqual); - assert.equal(Object.keys(assert).length, Object.keys(a).length); - assert(7); - assert.throws( - () => assert(...[]), - { - message: 'No value argument passed to `assert.ok()`', - name: 'AssertionError', - // TODO(kt3k): Enable this - // generatedMessage: true - } - ); - assert.throws( - () => a(), - { - message: 'No value argument passed to `assert.ok()`', - name: 'AssertionError' - } - ); - - // Test setting the limit to zero and that assert.strict works properly. - const tmpLimit = Error.stackTraceLimit; - Error.stackTraceLimit = 0; - assert.throws( - () => { - assert.ok( - typeof 123 === 'string' - ); - }, - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n ' + - "assert.ok(\n typeof 123 === 'string'\n )\n" - */ - } - ); - Error.stackTraceLimit = tmpLimit; - - // Test error diffs. - let message = [ - start, - `${actExp} ... Lines skipped`, - '', - ' [', - ' [', - ' [', - ' 1,', - ' 2,', - '+ 3', - "- '3'", - ' ]', - '...', - ' 4,', - ' 5', - ' ]'].join('\n'); - assert.throws( - () => assert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]), - /* TODO(kt3k): Enable this assertion - { message } - */ - ); - - message = [ - start, - `${actExp} ... Lines skipped`, - '', - ' [', - ' 1,', - '...', - ' 1,', - ' 0,', - '- 1,', - ' 1,', - '...', - ' 1,', - ' 1', - ' ]' - ].join('\n'); - assert.throws( - () => assert.deepEqual( - [1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1], - [1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1]), - /* TODO(kt3k): Enable this assertion - { message } - */ - ); - - message = [ - start, - `${actExp} ... Lines skipped`, - '', - ' [', - ' 1,', - '...', - ' 1,', - ' 0,', - '+ 1,', - ' 1,', - ' 1,', - ' 1', - ' ]' - ].join('\n'); - assert.throws( - () => assert.deepEqual( - [1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1], - [1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1]), - /* TODO(kt3k): Enable this assertion - { message } - */ - ); - - message = [ - start, - actExp, - '', - ' [', - ' 1,', - '+ 2,', - '- 1,', - ' 1,', - ' 1,', - ' 0,', - '+ 1,', - ' 1', - ' ]' - ].join('\n'); - assert.throws( - () => assert.deepEqual( - [1, 2, 1, 1, 0, 1, 1], - [1, 1, 1, 1, 0, 1]), - /* TODO(kt3k): Enable this assertion - { message } - */ - ); - - message = [ - start, - actExp, - '', - '+ [', - '+ 1,', - '+ 2,', - '+ 1', - '+ ]', - '- undefined', - ].join('\n'); - assert.throws( - () => assert.deepEqual([1, 2, 1], undefined), - /* TODO(kt3k): Enable this assertion - { message } - */ - ); - - message = [ - start, - actExp, - '', - ' [', - '+ 1,', - ' 2,', - ' 1', - ' ]' - ].join('\n'); - assert.throws( - () => assert.deepEqual([1, 2, 1], [2, 1]), - /* TODO(kt3k): Enable this assertion - { message } - */ - ); - - message = `${start}\n` + - `${actExp} ... Lines skipped\n` + - '\n' + - ' [\n' + - '+ 1,\n'.repeat(25) + - '...\n' + - '- 2,\n'.repeat(25) + - '...'; - assert.throws( - () => assert.deepEqual(Array(28).fill(1), Array(28).fill(2)), - /* TODO(kt3k): Enable this assertion - { message } - */ - ); - - const obj1 = {}; - const obj2 = { loop: 'forever' }; - obj2[inspect.custom] = () => '{}'; - // No infinite loop and no custom inspect. - assert.throws(() => assert.deepEqual(obj1, obj2), { - code: "ERR_ASSERTION", - /* TODO(kt3k): Enable this assertion - message: `${start}\n` + - `${actExp}\n` + - '\n' + - '+ {}\n' + - '- {\n' + - '- [Symbol(nodejs.util.inspect.custom)]: [Function (anonymous)],\n' + - "- loop: 'forever'\n" + - '- }' - */ - }); - - // notDeepEqual tests - assert.throws( - () => assert.notDeepEqual([1], [1]), - { - code: "ERR_ASSERTION", - /* TODO(kt3k): Enable this assertion - message: 'Expected "actual" not to be strictly deep-equal to:\n\n' + - '[\n 1\n]\n' - */ - } - ); - - message = 'Expected "actual" not to be strictly deep-equal to:' + - `\n\n[${'\n 1,'.repeat(45)}\n...\n`; - const data = Array(51).fill(1); - assert.throws( - () => assert.notDeepEqual(data, data), - /* TODO(kt3k): Enable this assertion - { message } - */ - ); -} - -assert.throws( - () => assert.ok(null), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - generatedMessage: true, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n ' + - 'assert.ok(null)\n' - */ - } -); -assert.throws( - () => assert(typeof 123n === 'string'), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - generatedMessage: true, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n ' + - "assert(typeof 123n === 'string')\n" - */ - } -); - -assert.throws( - () => assert(false, Symbol('foo')), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - generatedMessage: false, - message: 'Symbol(foo)' - */ - } -); - -// TODO(kt3k): Enable these when "internal/test/binding" is ready. -/* -{ - // Test caching. - const fs = internalBinding('fs'); - const tmp = fs.close; - fs.close = common.mustCall(tmp, 1); - function throwErr() { - assert( - (Buffer.from('test') instanceof Error) - ); - } - assert.throws( - () => throwErr(), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - message: 'The expression evaluated to a falsy value:\n\n ' + - "assert(\n (Buffer.from('test') instanceof Error)\n )\n" - } - ); - assert.throws( - () => throwErr(), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - message: 'The expression evaluated to a falsy value:\n\n ' + - "assert(\n (Buffer.from('test') instanceof Error)\n )\n" - } - ); - fs.close = tmp; -} -*/ - -assert.throws( - () => { - a( - (() => 'string')() - === - 123 instanceof - Buffer - ); - }, - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n' + - ' a(\n' + - ' (() => \'string\')()\n' + - ' ===\n' + - ' 123 instanceof\n' + - ' Buffer\n' + - ' )\n' - */ - } -); - -assert.throws( - () => { - a( - (() => 'string')() - === - 123 instanceof - Buffer - ); - }, - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n' + - ' a(\n' + - ' (() => \'string\')()\n' + - ' ===\n' + - ' 123 instanceof\n' + - ' Buffer\n' + - ' )\n' - */ - } -); - -assert.throws(() => { -a(( - () => 'string')() === -123 instanceof -Buffer -); -}, { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n' + - ' a((\n' + - ' () => \'string\')() ===\n' + - ' 123 instanceof\n' + - ' Buffer\n' + - ' )\n' - */ - } -); - -assert.throws( - () => { - assert(true); assert(null, undefined); - }, - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n ' + - 'assert(null, undefined)\n' - */ - } -); - -assert.throws( - () => { - assert - .ok(null, undefined); - }, - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n ' + - 'ok(null, undefined)\n' - */ - } -); - -assert.throws( - () => assert['ok']["apply"](null, [0]), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n ' + - 'assert[\'ok\']["apply"](null, [0])\n' - */ - } -); - -assert.throws( - () => { - const wrapper = (fn, value) => fn(value); - wrapper(assert, false); - }, - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n fn(value)\n' - */ - } -); - -assert.throws( - () => assert.ok.call(null, 0), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n ' + - 'assert.ok.call(null, 0)\n', - generatedMessage: true - */ - } -); - -assert.throws( - () => assert.ok.call(null, 0, 'test'), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - message: 'test', - generatedMessage: false - } -); - -// Works in eval. -assert.throws( - () => new Function('assert', 'assert(1 === 2);')(assert), - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n assert(1 === 2)\n' - */ - } -); - -assert.throws( - () => eval('console.log("FOO");\nassert.ok(1 === 2);'), - { - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - message: 'false == true' - */ - } -); - -assert.throws( - () => assert.throws(() => {}, 'Error message', 'message'), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - /* TODO(kt3k): Enable this assertion - message: 'The "error" argument must be of type function or ' + - 'an instance of Error, RegExp, or Object. Received type string ' + - "('Error message')" - */ - } -); - -[ - 1, - false, - Symbol() -].forEach((input) => { - assert.throws( - () => assert.throws(() => {}, input), - { - code: 'ERR_INVALID_ARG_TYPE', - /* TODO(kt3k): Enable this assertion - message: 'The "error" argument must be of type function or ' + - 'an instance of Error, RegExp, or Object.' + - common.invalidArgTypeHelper(input) - */ - } - ); -}); - -{ - - assert.throws(() => { - assert.ok((() => Boolean('' === false))()); - }, { - code: "ERR_ASSERTION", - /* TODO(kt3k): Enable this assertion - message: 'The expression evaluated to a falsy value:\n\n' + - " assert.ok((() => Boolean('\\u0001' === false))())\n" - */ - }); - - const errFn = () => { - const err = new TypeError('Wrong value'); - err.code = 404; - throw err; - }; - const errObj = { - name: 'TypeError', - message: 'Wrong value' - }; - assert.throws(errFn, errObj); - - errObj.code = 404; - assert.throws(errFn, errObj); - - // Fail in case a expected property is undefined and not existent on the - // error. - errObj.foo = undefined; - assert.throws( - () => assert.throws(errFn, errObj), - { - code: 'ERR_ASSERTION', - name: 'AssertionError', - /* TODO(kt3k): Enable this assertion - message: `${start}\n${actExp}\n\n` + - ' Comparison {\n' + - ' code: 404,\n' + - '- foo: undefined,\n' + - " message: 'Wrong value',\n" + - " name: 'TypeError'\n" + - ' }' - */ - } - ); - - // Show multiple wrong properties at the same time. - errObj.code = '404'; - assert.throws( - () => assert.throws(errFn, errObj), - { - code: 'ERR_ASSERTION', - name: 'AssertionError', - /* TODO(kt3k): Enable this assertion - message: `${start}\n${actExp}\n\n` + - ' Comparison {\n' + - '+ code: 404,\n' + - "- code: '404',\n" + - '- foo: undefined,\n' + - " message: 'Wrong value',\n" + - " name: 'TypeError'\n" + - ' }' - */ - } - ); - - assert.throws( - () => assert.throws(() => { throw new Error(); }, { foo: 'bar' }, 'foobar'), - { - constructor: assert.AssertionError, - code: 'ERR_ASSERTION', - message: 'foobar' - } - ); - - assert.throws( - () => a.doesNotThrow(() => { throw new Error(); }, { foo: 'bar' }), - { - name: 'TypeError', - code: 'ERR_INVALID_ARG_TYPE', - /* TODO(kt3k): Enable this assertion - message: 'The "expected" argument must be of type function or an ' + - 'instance of RegExp. Received an instance of Object' - */ - } - ); - - assert.throws(() => { throw new Error('e'); }, new Error('e')); - assert.throws( - () => assert.throws(() => { throw new TypeError('e'); }, new Error('e')), - { - name: 'AssertionError', - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - message: `${start}\n${actExp}\n\n` + - ' Comparison {\n' + - " message: 'e',\n" + - "+ name: 'TypeError'\n" + - "- name: 'Error'\n" + - ' }' - */ - } - ); - assert.throws( - () => assert.throws(() => { throw new Error('foo'); }, new Error('')), - { - name: 'AssertionError', - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - generatedMessage: true, - message: `${start}\n${actExp}\n\n` + - ' Comparison {\n' + - "+ message: 'foo',\n" + - "- message: '',\n" + - " name: 'Error'\n" + - ' }' - */ - } - ); - - assert.throws(() => { throw undefined; }, /undefined/); - assert.throws( - () => a.doesNotThrow(() => { throw undefined; }), - { - name: 'AssertionError', - code: 'ERR_ASSERTION', - message: 'Got unwanted exception.\nActual message: "undefined"' - } - ); -} - -assert.throws( - () => assert.throws(() => { throw new Error(); }, {}), - { - message: "The argument 'error' may not be an empty object. Received {}", - code: 'ERR_INVALID_ARG_VALUE' - } -); - -assert.throws( - () => a.throws( - () => { throw 'foo'; }, - 'foo' - ), - { - code: 'ERR_AMBIGUOUS_ARGUMENT', - message: 'The "error/message" argument is ambiguous. ' + - 'The error "foo" is identical to the message.' - } -); - -assert.throws( - () => a.throws( - () => { throw new TypeError('foo'); }, - 'foo' - ), - { - code: 'ERR_AMBIGUOUS_ARGUMENT', - message: 'The "error/message" argument is ambiguous. ' + - 'The error message "foo" is identical to the message.' - } -); - -// Should not throw. -assert.throws(() => { throw null; }, 'foo'); - -assert.throws( - () => assert.strictEqual([], []), - { - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - message: 'Values have same structure but are not reference-equal:\n\n[]\n' - */ - } -); - -{ - const args = (function() { return arguments; })('a'); - assert.throws( - () => assert.strictEqual(args, { 0: 'a' }), - { - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - message: 'Expected "actual" to be reference-equal to "expected":\n' + - '+ actual - expected\n\n' + - "+ [Arguments] {\n- {\n '0': 'a'\n }" - */ - } - ); -} - -assert.throws( - () => { throw new TypeError('foobar'); }, - { - message: /foo/, - name: /^TypeError$/ - } -); - -assert.throws( - () => assert.throws( - () => { throw new TypeError('foobar'); }, - { - message: /fooa/, - name: /^TypeError$/ - } - ), - { - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - message: `${start}\n${actExp}\n\n` + - ' Comparison {\n' + - "+ message: 'foobar',\n" + - '- message: /fooa/,\n' + - " name: 'TypeError'\n" + - ' }' - */ - } -); - -{ - let actual = null; - const expected = { message: 'foo' }; - assert.throws( - () => assert.throws( - () => { throw actual; }, - expected - ), - { - operator: 'throws', - actual, - expected, - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - generatedMessage: true, - message: `${start}\n${actExp}\n\n` + - '+ null\n' + - '- {\n' + - "- message: 'foo'\n" + - '- }' - */ - } - ); - - actual = 'foobar'; - const message = 'message'; - assert.throws( - () => assert.throws( - () => { throw actual; }, - { message: 'foobar' }, - message - ), - { - actual, - message, - operator: 'throws', - generatedMessage: false - } - ); -} - -// Indicate where the strings diverge. -assert.throws( - () => assert.strictEqual('test test', 'test foobar'), - { - code: 'ERR_ASSERTION', - name: 'AssertionError', - /* TODO(kt3k): Enable this assertion - message: strictEqualMessageStart + - '+ actual - expected\n\n' + - "+ 'test test'\n" + - "- 'test foobar'\n" + - ' ^' - */ - } -); - -// Check for reference-equal objects in `notStrictEqual()` -assert.throws( - () => { - const obj = {}; - assert.notStrictEqual(obj, obj); - }, - { - code: 'ERR_ASSERTION', - name: 'AssertionError', - /* TODO(kt3k): Enable this assertion - message: 'Expected "actual" not to be reference-equal to "expected": {}' - */ - } -); - -assert.throws( - () => { - const obj = { a: true }; - assert.notStrictEqual(obj, obj); - }, - { - code: 'ERR_ASSERTION', - name: 'AssertionError', - /* TODO(kt3k): Enable this assertion - message: 'Expected "actual" not to be reference-equal to "expected":\n\n' + - '{\n a: true\n}\n' - */ - } -); - -{ - let threw = false; - try { - assert.deepStrictEqual(Array(100).fill(1), 'foobar'); - } catch (err) { - threw = true; - /* TODO(kt3k): Enable this assertion - assert(/actual: \[Array],\n expected: 'foobar',/.test(inspect(err))); - */ - } - assert(threw); -} - -assert.throws( - () => a.equal(1), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.deepEqual(/a/), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.notEqual(null), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.notDeepEqual('test'), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.strictEqual({}), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.deepStrictEqual(Symbol()), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.notStrictEqual(5n), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.notDeepStrictEqual(undefined), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.strictEqual(), - { code: 'ERR_MISSING_ARGS' } -); - -assert.throws( - () => a.deepStrictEqual(), - { code: 'ERR_MISSING_ARGS' } -); - -// Verify that `stackStartFunction` works as alternative to `stackStartFn`. -{ - (function hidden() { - const err = new assert.AssertionError({ - actual: 'foo', - operator: 'strictEqual', - stackStartFunction: hidden - }); - const err2 = new assert.AssertionError({ - actual: 'foo', - operator: 'strictEqual', - stackStartFn: hidden - }); - assert(!err.stack.includes('hidden')); - assert(!err2.stack.includes('hidden')); - })(); -} - -assert.throws( - () => assert.throws(() => { throw Symbol('foo'); }, RangeError), - { - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - message: 'The error is expected to be an instance of "RangeError". ' + - 'Received "Symbol(foo)"' - */ - } -); - -assert.throws( - () => assert.throws(() => { throw [1, 2]; }, RangeError), - { - code: 'ERR_ASSERTION', - /* TODO(kt3k): Enable this assertion - message: 'The error is expected to be an instance of "RangeError". ' + - 'Received "[Array]"' - */ - } -); - -{ - const err = new TypeError('foo'); - const validate = (() => () => ({ a: true, b: [ 1, 2, 3 ] }))(); - assert.throws( - () => assert.throws(() => { throw err; }, validate), - { - message: 'The validation function is expected to ' + - `return "true". Received ${inspect(validate())}\n\nCaught ` + - `error:\n\n${err}`, - code: 'ERR_ASSERTION', - actual: err, - expected: validate, - name: 'AssertionError', - operator: 'throws', - } - ); -} - -// TODO(kt3k): Enable these when "vm" is ready. -/* -assert.throws( - () => { - const script = new vm.Script('new RangeError("foobar");'); - const context = vm.createContext(); - const err = script.runInContext(context); - assert.throws(() => { throw err; }, RangeError); - }, - { - message: 'The error is expected to be an instance of "RangeError". ' + - 'Received an error with identical name but a different ' + - 'prototype.\n\nError message:\n\nfoobar' - } -); -*/ - -// Multiple assert.match() tests. -{ - assert.throws( - () => assert.match(/abc/, 'string'), - { - code: 'ERR_INVALID_ARG_TYPE', - /* TODO(kt3k): Enable this assertion - message: 'The "regexp" argument must be an instance of RegExp. ' + - "Received type string ('string')" - */ - } - ); - assert.throws( - () => assert.match('string', /abc/), - { - actual: 'string', - expected: /abc/, - operator: 'match', - /* TODO(kt3k): Enable this assertion - message: 'The input did not match the regular expression /abc/. ' + - "Input:\n\n'string'\n", - generatedMessage: true - */ - } - ); - assert.throws( - () => assert.match('string', /abc/, 'foobar'), - { - actual: 'string', - expected: /abc/, - operator: 'match', - message: 'foobar', - generatedMessage: false - } - ); - const errorMessage = new RangeError('foobar'); - assert.throws( - () => assert.match('string', /abc/, errorMessage), - errorMessage - ); - assert.throws( - () => assert.match({ abc: 123 }, /abc/), - { - actual: { abc: 123 }, - expected: /abc/, - operator: 'match', - /* TODO(kt3k): Enable this assertion - message: 'The "string" argument must be of type string. ' + - 'Received type object ({ abc: 123 })', - generatedMessage: true - */ - } - ); - assert.match('I will pass', /pass$/); -} - -// Multiple assert.doesNotMatch() tests. -{ - assert.throws( - () => assert.doesNotMatch(/abc/, 'string'), - { - code: 'ERR_INVALID_ARG_TYPE', - /* TODO(kt3k): Enable this assertion - message: 'The "regexp" argument must be an instance of RegExp. ' + - "Received type string ('string')" - */ - } - ); - assert.throws( - () => assert.doesNotMatch('string', /string/), - { - actual: 'string', - expected: /string/, - operator: 'doesNotMatch', - /* TODO(kt3k): Enable this assertion - message: 'The input was expected to not match the regular expression ' + - "/string/. Input:\n\n'string'\n", - generatedMessage: true - */ - } - ); - assert.throws( - () => assert.doesNotMatch('string', /string/, 'foobar'), - { - actual: 'string', - expected: /string/, - operator: 'doesNotMatch', - message: 'foobar', - generatedMessage: false - } - ); - const errorMessage = new RangeError('foobar'); - assert.throws( - () => assert.doesNotMatch('string', /string/, errorMessage), - errorMessage - ); - assert.throws( - () => assert.doesNotMatch({ abc: 123 }, /abc/), - { - actual: { abc: 123 }, - expected: /abc/, - operator: 'doesNotMatch', - message: 'The "string" argument must be of type string. ' + - 'Received type object ({ abc: 123 })', - /* TODO(kt3k): Enable this assertion - generatedMessage: true - */ - } - ); - assert.doesNotMatch('I will pass', /different$/); -} - -{ - const tempColor = inspect.defaultOptions.colors; - assert.throws(() => { - inspect.defaultOptions.colors = true; - // Guarantee the position indicator is placed correctly. - assert.strictEqual(111554n, 11111115); - }, (err) => { - // TODO(kt3k): Enable this assertion - // assert.strictEqual(inspect(err).split('\n')[5], ' ^'); - inspect.defaultOptions.colors = tempColor; - return true; - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-bad-unicode.js b/cli/tests/node_compat/test/parallel/test-bad-unicode.js deleted file mode 100644 index b4188878d..000000000 --- a/cli/tests/node_compat/test/parallel/test-bad-unicode.js +++ /dev/null @@ -1,40 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -let exception = null; - -try { - eval('"\\uc/ef"'); -} catch (e) { - exception = e; -} - -assert(exception instanceof SyntaxError); diff --git a/cli/tests/node_compat/test/parallel/test-btoa-atob.js b/cli/tests/node_compat/test/parallel/test-btoa-atob.js deleted file mode 100644 index 3fd8d323c..000000000 --- a/cli/tests/node_compat/test/parallel/test-btoa-atob.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -const { strictEqual, throws } = require('assert'); -const buffer = require('buffer'); - -// Exported on the global object -strictEqual(globalThis.atob, buffer.atob); -strictEqual(globalThis.btoa, buffer.btoa); - -// Throws type error on no argument passed -throws(() => buffer.atob(), /TypeError/); -throws(() => buffer.btoa(), /TypeError/); - -strictEqual(atob(' '), ''); -strictEqual(atob(' Y\fW\tJ\njZ A=\r= '), 'abcd'); - -strictEqual(atob(null), '\x9Eée'); -strictEqual(atob(NaN), '5£'); -strictEqual(atob(Infinity), '"wâ\x9E+r'); -strictEqual(atob(true), '¶»\x9E'); -strictEqual(atob(1234), '×mø'); -strictEqual(atob([]), ''); -strictEqual(atob({ toString: () => '' }), ''); -strictEqual(atob({ [Symbol.toPrimitive]: () => '' }), ''); - -throws(() => atob(Symbol()), /TypeError/); -[ - undefined, false, () => {}, {}, [1], - 0, 1, 0n, 1n, -Infinity, - 'a', 'a\n\n\n', '\ra\r\r', ' a ', '\t\t\ta', 'a\f\f\f', '\ta\r \n\f', -].forEach((value) => - // See #2 - https://html.spec.whatwg.org/multipage/webappapis.html#dom-atob - throws(() => atob(value), { - constructor: DOMException, - name: 'InvalidCharacterError', - code: 5, - })); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-alloc.js b/cli/tests/node_compat/test/parallel/test-buffer-alloc.js deleted file mode 100644 index bb0af6456..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-alloc.js +++ /dev/null @@ -1,1200 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const assert = require('assert'); -const vm = require('vm'); - -const SlowBuffer = require('buffer').SlowBuffer; - -// Verify the maximum Uint8Array size. -// (see https://github.com/tc39/ecma262/pull/3052). -assert.throws( - () => new Uint8Array(2 ** 53), - { message: 'Invalid typed array length: 9007199254740992' } -); - -const b = Buffer.allocUnsafe(1024); -assert.strictEqual(b.length, 1024); - -b[0] = -1; -assert.strictEqual(b[0], 255); - -for (let i = 0; i < 1024; i++) { - b[i] = i % 256; -} - -for (let i = 0; i < 1024; i++) { - assert.strictEqual(i % 256, b[i]); -} - -const c = Buffer.allocUnsafe(512); -assert.strictEqual(c.length, 512); - -const d = Buffer.from([]); -assert.strictEqual(d.length, 0); - -// Test offset properties -{ - const b = Buffer.alloc(128); - assert.strictEqual(b.length, 128); - assert.strictEqual(b.byteOffset, 0); - assert.strictEqual(b.offset, 0); -} - -// Test creating a Buffer from a Uint8Array -{ - const ui8 = new Uint8Array(4).fill(42); - const e = Buffer.from(ui8); - for (const [index, value] of e.entries()) { - assert.strictEqual(value, ui8[index]); - } -} -// Test creating a Buffer from a Uint8Array (old constructor) -{ - const ui8 = new Uint8Array(4).fill(42); - const e = Buffer(ui8); - for (const [key, value] of e.entries()) { - assert.strictEqual(value, ui8[key]); - } -} - -// Test creating a Buffer from a Uint32Array -// Note: it is implicitly interpreted as Array of integers modulo 256 -{ - const ui32 = new Uint32Array(4).fill(42); - const e = Buffer.from(ui32); - for (const [index, value] of e.entries()) { - assert.strictEqual(value, ui32[index]); - } -} -// Test creating a Buffer from a Uint32Array (old constructor) -// Note: it is implicitly interpreted as Array of integers modulo 256 -{ - const ui32 = new Uint32Array(4).fill(42); - const e = Buffer(ui32); - for (const [key, value] of e.entries()) { - assert.strictEqual(value, ui32[key]); - } -} - -// Test invalid encoding for Buffer.toString -assert.throws(() => b.toString('invalid'), - /Unknown encoding: invalid/); -// Invalid encoding for Buffer.write -assert.throws(() => b.write('test string', 0, 5, 'invalid'), - /Unknown encoding: invalid/); -// Unsupported arguments for Buffer.write -assert.throws(() => b.write('test', 'utf8', 0), - { code: 'ERR_INVALID_ARG_TYPE' }); - -// Try to create 0-length buffers. Should not throw. -Buffer.from(''); -Buffer.from('', 'ascii'); -Buffer.from('', 'latin1'); -Buffer.alloc(0); -Buffer.allocUnsafe(0); -new Buffer(''); -new Buffer('', 'ascii'); -new Buffer('', 'latin1'); -new Buffer('', 'binary'); -Buffer(0); - -const outOfRangeError = { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError' -}; - -// Try to write a 0-length string beyond the end of b -assert.throws(() => b.write('', 2048), outOfRangeError); - -// Throw when writing to negative offset -assert.throws(() => b.write('a', -1), outOfRangeError); - -// Throw when writing past bounds from the pool -assert.throws(() => b.write('a', 2048), outOfRangeError); - -// Throw when writing to negative offset -assert.throws(() => b.write('a', -1), outOfRangeError); - -// Try to copy 0 bytes worth of data into an empty buffer -b.copy(Buffer.alloc(0), 0, 0, 0); - -// Try to copy 0 bytes past the end of the target buffer -b.copy(Buffer.alloc(0), 1, 1, 1); -b.copy(Buffer.alloc(1), 1, 1, 1); - -// Try to copy 0 bytes from past the end of the source buffer -b.copy(Buffer.alloc(1), 0, 1024, 1024); - -// Testing for smart defaults and ability to pass string values as offset -{ - const writeTest = Buffer.from('abcdes'); - writeTest.write('n', 'ascii'); - assert.throws( - () => writeTest.write('o', '1', 'ascii'), - { code: 'ERR_INVALID_ARG_TYPE' } - ); - writeTest.write('o', 1, 'ascii'); - writeTest.write('d', 2, 'ascii'); - writeTest.write('e', 3, 'ascii'); - writeTest.write('j', 4, 'ascii'); - assert.strictEqual(writeTest.toString(), 'nodejs'); -} - -// Offset points to the end of the buffer and does not throw. -// (see https://github.com/nodejs/node/issues/8127). -Buffer.alloc(1).write('', 1, 0); - -// ASCII slice test -{ - const asciiString = 'hello world'; - - for (let i = 0; i < asciiString.length; i++) { - b[i] = asciiString.charCodeAt(i); - } - const asciiSlice = b.toString('ascii', 0, asciiString.length); - assert.strictEqual(asciiString, asciiSlice); -} - -{ - const asciiString = 'hello world'; - const offset = 100; - - assert.strictEqual(asciiString.length, b.write(asciiString, offset, 'ascii')); - const asciiSlice = b.toString('ascii', offset, offset + asciiString.length); - assert.strictEqual(asciiString, asciiSlice); -} - -{ - const asciiString = 'hello world'; - const offset = 100; - - const sliceA = b.slice(offset, offset + asciiString.length); - const sliceB = b.slice(offset, offset + asciiString.length); - for (let i = 0; i < asciiString.length; i++) { - assert.strictEqual(sliceA[i], sliceB[i]); - } -} - -// UTF-8 slice test -{ - const utf8String = '¡hέlló wôrld!'; - const offset = 100; - - b.write(utf8String, 0, Buffer.byteLength(utf8String), 'utf8'); - let utf8Slice = b.toString('utf8', 0, Buffer.byteLength(utf8String)); - assert.strictEqual(utf8String, utf8Slice); - - assert.strictEqual(Buffer.byteLength(utf8String), - b.write(utf8String, offset, 'utf8')); - utf8Slice = b.toString('utf8', offset, - offset + Buffer.byteLength(utf8String)); - assert.strictEqual(utf8String, utf8Slice); - - const sliceA = b.slice(offset, offset + Buffer.byteLength(utf8String)); - const sliceB = b.slice(offset, offset + Buffer.byteLength(utf8String)); - for (let i = 0; i < Buffer.byteLength(utf8String); i++) { - assert.strictEqual(sliceA[i], sliceB[i]); - } -} - -{ - const slice = b.slice(100, 150); - assert.strictEqual(slice.length, 50); - for (let i = 0; i < 50; i++) { - assert.strictEqual(b[100 + i], slice[i]); - } -} - -{ - // Make sure only top level parent propagates from allocPool - const b = Buffer.allocUnsafe(5); - const c = b.slice(0, 4); - const d = c.slice(0, 2); - assert.strictEqual(b.parent, c.parent); - assert.strictEqual(b.parent, d.parent); -} - -{ - // Also from a non-pooled instance - const b = Buffer.allocUnsafeSlow(5); - const c = b.slice(0, 4); - const d = c.slice(0, 2); - assert.strictEqual(c.parent, d.parent); -} - -{ - // Bug regression test - const testValue = '\u00F6\u65E5\u672C\u8A9E'; // ö日本語 - const buffer = Buffer.allocUnsafe(32); - const size = buffer.write(testValue, 0, 'utf8'); - const slice = buffer.toString('utf8', 0, size); - assert.strictEqual(slice, testValue); -} - -{ - // Test triple slice - const a = Buffer.allocUnsafe(8); - for (let i = 0; i < 8; i++) a[i] = i; - const b = a.slice(4, 8); - assert.strictEqual(b[0], 4); - assert.strictEqual(b[1], 5); - assert.strictEqual(b[2], 6); - assert.strictEqual(b[3], 7); - const c = b.slice(2, 4); - assert.strictEqual(c[0], 6); - assert.strictEqual(c[1], 7); -} - -{ - const d = Buffer.from([23, 42, 255]); - assert.strictEqual(d.length, 3); - assert.strictEqual(d[0], 23); - assert.strictEqual(d[1], 42); - assert.strictEqual(d[2], 255); - assert.deepStrictEqual(d, Buffer.from(d)); -} - -{ - // Test for proper UTF-8 Encoding - const e = Buffer.from('über'); - assert.deepStrictEqual(e, Buffer.from([195, 188, 98, 101, 114])); -} - -{ - // Test for proper ascii Encoding, length should be 4 - const f = Buffer.from('über', 'ascii'); - assert.deepStrictEqual(f, Buffer.from([252, 98, 101, 114])); -} - -['ucs2', 'ucs-2', 'utf16le', 'utf-16le'].forEach((encoding) => { - { - // Test for proper UTF16LE encoding, length should be 8 - const f = Buffer.from('über', encoding); - assert.deepStrictEqual(f, Buffer.from([252, 0, 98, 0, 101, 0, 114, 0])); - } - - { - // Length should be 12 - const f = Buffer.from('привет', encoding); - assert.deepStrictEqual( - f, Buffer.from([63, 4, 64, 4, 56, 4, 50, 4, 53, 4, 66, 4]) - ); - assert.strictEqual(f.toString(encoding), 'привет'); - } - - { - const f = Buffer.from([0, 0, 0, 0, 0]); - assert.strictEqual(f.length, 5); - const size = f.write('あいうえお', encoding); - assert.strictEqual(size, 4); - assert.deepStrictEqual(f, Buffer.from([0x42, 0x30, 0x44, 0x30, 0x00])); - } -}); - -{ - const f = Buffer.from('\uD83D\uDC4D', 'utf-16le'); // THUMBS UP SIGN (U+1F44D) - assert.strictEqual(f.length, 4); - assert.deepStrictEqual(f, Buffer.from('3DD84DDC', 'hex')); -} - -// Test construction from arrayish object -{ - const arrayIsh = { 0: 0, 1: 1, 2: 2, 3: 3, length: 4 }; - let g = Buffer.from(arrayIsh); - assert.deepStrictEqual(g, Buffer.from([0, 1, 2, 3])); - const strArrayIsh = { 0: '0', 1: '1', 2: '2', 3: '3', length: 4 }; - g = Buffer.from(strArrayIsh); - assert.deepStrictEqual(g, Buffer.from([0, 1, 2, 3])); -} - -// -// Test toString('base64') -// -assert.strictEqual((Buffer.from('Man')).toString('base64'), 'TWFu'); -assert.strictEqual((Buffer.from('Woman')).toString('base64'), 'V29tYW4='); - -// -// Test toString('base64url') -// -assert.strictEqual((Buffer.from('Man')).toString('base64url'), 'TWFu'); -assert.strictEqual((Buffer.from('Woman')).toString('base64url'), 'V29tYW4'); - -{ - // Test that regular and URL-safe base64 both work both ways - const expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff]; - assert.deepStrictEqual(Buffer.from('//++/++/++//', 'base64'), - Buffer.from(expected)); - assert.deepStrictEqual(Buffer.from('__--_--_--__', 'base64'), - Buffer.from(expected)); - assert.deepStrictEqual(Buffer.from('//++/++/++//', 'base64url'), - Buffer.from(expected)); - assert.deepStrictEqual(Buffer.from('__--_--_--__', 'base64url'), - Buffer.from(expected)); -} - -const base64flavors = ['base64', 'base64url']; - -{ - // Test that regular and URL-safe base64 both work both ways with padding - const expected = [0xff, 0xff, 0xbe, 0xff, 0xef, 0xbf, 0xfb, 0xef, 0xff, 0xfb]; - assert.deepStrictEqual(Buffer.from('//++/++/++//+w==', 'base64'), - Buffer.from(expected)); - assert.deepStrictEqual(Buffer.from('//++/++/++//+w==', 'base64'), - Buffer.from(expected)); - assert.deepStrictEqual(Buffer.from('//++/++/++//+w==', 'base64url'), - Buffer.from(expected)); - assert.deepStrictEqual(Buffer.from('//++/++/++//+w==', 'base64url'), - Buffer.from(expected)); -} - -{ - // big example - const quote = 'Man is distinguished, not only by his reason, but by this ' + - 'singular passion from other animals, which is a lust ' + - 'of the mind, that by a perseverance of delight in the ' + - 'continued and indefatigable generation of knowledge, ' + - 'exceeds the short vehemence of any carnal pleasure.'; - const expected = 'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb' + - '24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlci' + - 'BhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQ' + - 'gYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu' + - 'dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZ' + - 'GdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm' + - '5hbCBwbGVhc3VyZS4='; - assert.strictEqual(Buffer.from(quote).toString('base64'), expected); - assert.strictEqual( - Buffer.from(quote).toString('base64url'), - expected.replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '') - ); - - base64flavors.forEach((encoding) => { - let b = Buffer.allocUnsafe(1024); - let bytesWritten = b.write(expected, 0, encoding); - assert.strictEqual(quote.length, bytesWritten); - assert.strictEqual(quote, b.toString('ascii', 0, quote.length)); - - // Check that the base64 decoder ignores whitespace - const expectedWhite = `${expected.slice(0, 60)} \n` + - `${expected.slice(60, 120)} \n` + - `${expected.slice(120, 180)} \n` + - `${expected.slice(180, 240)} \n` + - `${expected.slice(240, 300)}\n` + - `${expected.slice(300, 360)}\n`; - b = Buffer.allocUnsafe(1024); - bytesWritten = b.write(expectedWhite, 0, encoding); - assert.strictEqual(quote.length, bytesWritten); - assert.strictEqual(quote, b.toString('ascii', 0, quote.length)); - - // Check that the base64 decoder on the constructor works - // even in the presence of whitespace. - b = Buffer.from(expectedWhite, encoding); - assert.strictEqual(quote.length, b.length); - assert.strictEqual(quote, b.toString('ascii', 0, quote.length)); - - // Check that the base64 decoder ignores illegal chars - const expectedIllegal = expected.slice(0, 60) + ' \x80' + - expected.slice(60, 120) + ' \xff' + - expected.slice(120, 180) + ' \x00' + - expected.slice(180, 240) + ' \x98' + - expected.slice(240, 300) + '\x03' + - expected.slice(300, 360); - b = Buffer.from(expectedIllegal, encoding); - assert.strictEqual(quote.length, b.length); - assert.strictEqual(quote, b.toString('ascii', 0, quote.length)); - }); -} - -base64flavors.forEach((encoding) => { - assert.strictEqual(Buffer.from('', encoding).toString(), ''); - assert.strictEqual(Buffer.from('K', encoding).toString(), ''); - - // multiple-of-4 with padding - assert.strictEqual(Buffer.from('Kg==', encoding).toString(), '*'); - assert.strictEqual(Buffer.from('Kio=', encoding).toString(), '*'.repeat(2)); - assert.strictEqual(Buffer.from('Kioq', encoding).toString(), '*'.repeat(3)); - assert.strictEqual( - Buffer.from('KioqKg==', encoding).toString(), '*'.repeat(4)); - assert.strictEqual( - Buffer.from('KioqKio=', encoding).toString(), '*'.repeat(5)); - assert.strictEqual( - Buffer.from('KioqKioq', encoding).toString(), '*'.repeat(6)); - assert.strictEqual(Buffer.from('KioqKioqKg==', encoding).toString(), - '*'.repeat(7)); - assert.strictEqual(Buffer.from('KioqKioqKio=', encoding).toString(), - '*'.repeat(8)); - assert.strictEqual(Buffer.from('KioqKioqKioq', encoding).toString(), - '*'.repeat(9)); - assert.strictEqual(Buffer.from('KioqKioqKioqKg==', encoding).toString(), - '*'.repeat(10)); - assert.strictEqual(Buffer.from('KioqKioqKioqKio=', encoding).toString(), - '*'.repeat(11)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioq', encoding).toString(), - '*'.repeat(12)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioqKg==', encoding).toString(), - '*'.repeat(13)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioqKio=', encoding).toString(), - '*'.repeat(14)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioqKioq', encoding).toString(), - '*'.repeat(15)); - assert.strictEqual( - Buffer.from('KioqKioqKioqKioqKioqKg==', encoding).toString(), - '*'.repeat(16)); - assert.strictEqual( - Buffer.from('KioqKioqKioqKioqKioqKio=', encoding).toString(), - '*'.repeat(17)); - assert.strictEqual( - Buffer.from('KioqKioqKioqKioqKioqKioq', encoding).toString(), - '*'.repeat(18)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioqKioqKioqKg==', - encoding).toString(), - '*'.repeat(19)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioqKioqKioqKio=', - encoding).toString(), - '*'.repeat(20)); - - // No padding, not a multiple of 4 - assert.strictEqual(Buffer.from('Kg', encoding).toString(), '*'); - assert.strictEqual(Buffer.from('Kio', encoding).toString(), '*'.repeat(2)); - assert.strictEqual(Buffer.from('KioqKg', encoding).toString(), '*'.repeat(4)); - assert.strictEqual( - Buffer.from('KioqKio', encoding).toString(), '*'.repeat(5)); - assert.strictEqual(Buffer.from('KioqKioqKg', encoding).toString(), - '*'.repeat(7)); - assert.strictEqual(Buffer.from('KioqKioqKio', encoding).toString(), - '*'.repeat(8)); - assert.strictEqual(Buffer.from('KioqKioqKioqKg', encoding).toString(), - '*'.repeat(10)); - assert.strictEqual(Buffer.from('KioqKioqKioqKio', encoding).toString(), - '*'.repeat(11)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioqKg', encoding).toString(), - '*'.repeat(13)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioqKio', encoding).toString(), - '*'.repeat(14)); - assert.strictEqual(Buffer.from('KioqKioqKioqKioqKioqKg', encoding).toString(), - '*'.repeat(16)); - assert.strictEqual( - Buffer.from('KioqKioqKioqKioqKioqKio', encoding).toString(), - '*'.repeat(17)); - assert.strictEqual( - Buffer.from('KioqKioqKioqKioqKioqKioqKg', encoding).toString(), - '*'.repeat(19)); - assert.strictEqual( - Buffer.from('KioqKioqKioqKioqKioqKioqKio', encoding).toString(), - '*'.repeat(20)); -}); - -// Handle padding graciously, multiple-of-4 or not -assert.strictEqual( - Buffer.from('72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw==', 'base64').length, - 32 -); -assert.strictEqual( - Buffer.from('72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw==', 'base64url') - .length, - 32 -); -assert.strictEqual( - Buffer.from('72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw=', 'base64').length, - 32 -); -assert.strictEqual( - Buffer.from('72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw=', 'base64url') - .length, - 32 -); -assert.strictEqual( - Buffer.from('72INjkR5fchcxk9+VgdGPFJDxUBFR5/rMFsghgxADiw', 'base64').length, - 32 -); -assert.strictEqual( - Buffer.from('72INjkR5fchcxk9-VgdGPFJDxUBFR5_rMFsghgxADiw', 'base64url') - .length, - 32 -); -assert.strictEqual( - Buffer.from('w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg==', 'base64').length, - 31 -); -assert.strictEqual( - Buffer.from('w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg==', 'base64url') - .length, - 31 -); -assert.strictEqual( - Buffer.from('w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg=', 'base64').length, - 31 -); -assert.strictEqual( - Buffer.from('w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg=', 'base64url') - .length, - 31 -); -assert.strictEqual( - Buffer.from('w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg', 'base64').length, - 31 -); -assert.strictEqual( - Buffer.from('w69jACy6BgZmaFvv96HG6MYksWytuZu3T1FvGnulPg', 'base64url').length, - 31 -); - -{ -// This string encodes single '.' character in UTF-16 - const dot = Buffer.from('//4uAA==', 'base64'); - assert.strictEqual(dot[0], 0xff); - assert.strictEqual(dot[1], 0xfe); - assert.strictEqual(dot[2], 0x2e); - assert.strictEqual(dot[3], 0x00); - assert.strictEqual(dot.toString('base64'), '//4uAA=='); -} - -{ -// This string encodes single '.' character in UTF-16 - const dot = Buffer.from('//4uAA', 'base64url'); - assert.strictEqual(dot[0], 0xff); - assert.strictEqual(dot[1], 0xfe); - assert.strictEqual(dot[2], 0x2e); - assert.strictEqual(dot[3], 0x00); - assert.strictEqual(dot.toString('base64url'), '__4uAA'); -} - -{ - // Writing base64 at a position > 0 should not mangle the result. - // - // https://github.com/joyent/node/issues/402 - const segments = ['TWFkbmVzcz8h', 'IFRoaXM=', 'IGlz', 'IG5vZGUuanMh']; - const b = Buffer.allocUnsafe(64); - let pos = 0; - - for (let i = 0; i < segments.length; ++i) { - pos += b.write(segments[i], pos, 'base64'); - } - assert.strictEqual(b.toString('latin1', 0, pos), - 'Madness?! This is node.js!'); -} - -{ - // Writing base64url at a position > 0 should not mangle the result. - // - // https://github.com/joyent/node/issues/402 - const segments = ['TWFkbmVzcz8h', 'IFRoaXM', 'IGlz', 'IG5vZGUuanMh']; - const b = Buffer.allocUnsafe(64); - let pos = 0; - - for (let i = 0; i < segments.length; ++i) { - pos += b.write(segments[i], pos, 'base64url'); - } - assert.strictEqual(b.toString('latin1', 0, pos), - 'Madness?! This is node.js!'); -} - -// Regression test for https://github.com/nodejs/node/issues/3496. -assert.strictEqual(Buffer.from('=bad'.repeat(1e4), 'base64').length, 0); - -// Regression test for https://github.com/nodejs/node/issues/11987. -assert.deepStrictEqual(Buffer.from('w0 ', 'base64'), - Buffer.from('w0', 'base64')); - -// Regression test for https://github.com/nodejs/node/issues/13657. -assert.deepStrictEqual(Buffer.from(' YWJvcnVtLg', 'base64'), - Buffer.from('YWJvcnVtLg', 'base64')); - -{ - // Creating buffers larger than pool size. - const l = Buffer.poolSize + 5; - const s = 'h'.repeat(l); - const b = Buffer.from(s); - - for (let i = 0; i < l; i++) { - assert.strictEqual(b[i], 'h'.charCodeAt(0)); - } - - const sb = b.toString(); - assert.strictEqual(sb.length, s.length); - assert.strictEqual(sb, s); -} - -{ - // test hex toString - const hexb = Buffer.allocUnsafe(256); - for (let i = 0; i < 256; i++) { - hexb[i] = i; - } - const hexStr = hexb.toString('hex'); - assert.strictEqual(hexStr, - '000102030405060708090a0b0c0d0e0f' + - '101112131415161718191a1b1c1d1e1f' + - '202122232425262728292a2b2c2d2e2f' + - '303132333435363738393a3b3c3d3e3f' + - '404142434445464748494a4b4c4d4e4f' + - '505152535455565758595a5b5c5d5e5f' + - '606162636465666768696a6b6c6d6e6f' + - '707172737475767778797a7b7c7d7e7f' + - '808182838485868788898a8b8c8d8e8f' + - '909192939495969798999a9b9c9d9e9f' + - 'a0a1a2a3a4a5a6a7a8a9aaabacadaeaf' + - 'b0b1b2b3b4b5b6b7b8b9babbbcbdbebf' + - 'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf' + - 'd0d1d2d3d4d5d6d7d8d9dadbdcdddedf' + - 'e0e1e2e3e4e5e6e7e8e9eaebecedeeef' + - 'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'); - - const hexb2 = Buffer.from(hexStr, 'hex'); - for (let i = 0; i < 256; i++) { - assert.strictEqual(hexb2[i], hexb[i]); - } -} - -// Test single hex character is discarded. -assert.strictEqual(Buffer.from('A', 'hex').length, 0); - -// Test that if a trailing character is discarded, rest of string is processed. -assert.deepStrictEqual(Buffer.from('Abx', 'hex'), Buffer.from('Ab', 'hex')); - -// Test single base64 char encodes as 0. -assert.strictEqual(Buffer.from('A', 'base64').length, 0); - - -{ - // Test an invalid slice end. - const b = Buffer.from([1, 2, 3, 4, 5]); - const b2 = b.toString('hex', 1, 10000); - const b3 = b.toString('hex', 1, 5); - const b4 = b.toString('hex', 1); - assert.strictEqual(b2, b3); - assert.strictEqual(b2, b4); -} - -function buildBuffer(data) { - if (Array.isArray(data)) { - const buffer = Buffer.allocUnsafe(data.length); - data.forEach((v, k) => buffer[k] = v); - return buffer; - } - return null; -} - -const x = buildBuffer([0x81, 0xa3, 0x66, 0x6f, 0x6f, 0xa3, 0x62, 0x61, 0x72]); - -assert.strictEqual(x.inspect(), '<Buffer 81 a3 66 6f 6f a3 62 61 72>'); - -{ - const z = x.slice(4); - assert.strictEqual(z.length, 5); - assert.strictEqual(z[0], 0x6f); - assert.strictEqual(z[1], 0xa3); - assert.strictEqual(z[2], 0x62); - assert.strictEqual(z[3], 0x61); - assert.strictEqual(z[4], 0x72); -} - -{ - const z = x.slice(0); - assert.strictEqual(z.length, x.length); -} - -{ - const z = x.slice(0, 4); - assert.strictEqual(z.length, 4); - assert.strictEqual(z[0], 0x81); - assert.strictEqual(z[1], 0xa3); -} - -{ - const z = x.slice(0, 9); - assert.strictEqual(z.length, 9); -} - -{ - const z = x.slice(1, 4); - assert.strictEqual(z.length, 3); - assert.strictEqual(z[0], 0xa3); -} - -{ - const z = x.slice(2, 4); - assert.strictEqual(z.length, 2); - assert.strictEqual(z[0], 0x66); - assert.strictEqual(z[1], 0x6f); -} - -['ucs2', 'ucs-2', 'utf16le', 'utf-16le'].forEach((encoding) => { - const b = Buffer.allocUnsafe(10); - b.write('あいうえお', encoding); - assert.strictEqual(b.toString(encoding), 'あいうえお'); -}); - -['ucs2', 'ucs-2', 'utf16le', 'utf-16le'].forEach((encoding) => { - const b = Buffer.allocUnsafe(11); - b.write('あいうえお', 1, encoding); - assert.strictEqual(b.toString(encoding, 1), 'あいうえお'); -}); - -{ - // latin1 encoding should write only one byte per character. - const b = Buffer.from([0xde, 0xad, 0xbe, 0xef]); - let s = String.fromCharCode(0xffff); - b.write(s, 0, 'latin1'); - assert.strictEqual(b[0], 0xff); - assert.strictEqual(b[1], 0xad); - assert.strictEqual(b[2], 0xbe); - assert.strictEqual(b[3], 0xef); - s = String.fromCharCode(0xaaee); - b.write(s, 0, 'latin1'); - assert.strictEqual(b[0], 0xee); - assert.strictEqual(b[1], 0xad); - assert.strictEqual(b[2], 0xbe); - assert.strictEqual(b[3], 0xef); -} - -{ - // Binary encoding should write only one byte per character. - const b = Buffer.from([0xde, 0xad, 0xbe, 0xef]); - let s = String.fromCharCode(0xffff); - b.write(s, 0, 'latin1'); - assert.strictEqual(b[0], 0xff); - assert.strictEqual(b[1], 0xad); - assert.strictEqual(b[2], 0xbe); - assert.strictEqual(b[3], 0xef); - s = String.fromCharCode(0xaaee); - b.write(s, 0, 'latin1'); - assert.strictEqual(b[0], 0xee); - assert.strictEqual(b[1], 0xad); - assert.strictEqual(b[2], 0xbe); - assert.strictEqual(b[3], 0xef); -} - -{ - // https://github.com/nodejs/node-v0.x-archive/pull/1210 - // Test UTF-8 string includes null character - let buf = Buffer.from('\0'); - assert.strictEqual(buf.length, 1); - buf = Buffer.from('\0\0'); - assert.strictEqual(buf.length, 2); -} - -{ - const buf = Buffer.allocUnsafe(2); - assert.strictEqual(buf.write(''), 0); // 0bytes - assert.strictEqual(buf.write('\0'), 1); // 1byte (v8 adds null terminator) - assert.strictEqual(buf.write('a\0'), 2); // 1byte * 2 - assert.strictEqual(buf.write('あ'), 0); // 3bytes - assert.strictEqual(buf.write('\0あ'), 1); // 1byte + 3bytes - assert.strictEqual(buf.write('\0\0あ'), 2); // 1byte * 2 + 3bytes -} - -{ - const buf = Buffer.allocUnsafe(10); - assert.strictEqual(buf.write('あいう'), 9); // 3bytes * 3 (v8 adds null term.) - assert.strictEqual(buf.write('あいう\0'), 10); // 3bytes * 3 + 1byte -} - -{ - // https://github.com/nodejs/node-v0.x-archive/issues/243 - // Test write() with maxLength - const buf = Buffer.allocUnsafe(4); - buf.fill(0xFF); - assert.strictEqual(buf.write('abcd', 1, 2, 'utf8'), 2); - assert.strictEqual(buf[0], 0xFF); - assert.strictEqual(buf[1], 0x61); - assert.strictEqual(buf[2], 0x62); - assert.strictEqual(buf[3], 0xFF); - - buf.fill(0xFF); - assert.strictEqual(buf.write('abcd', 1, 4), 3); - assert.strictEqual(buf[0], 0xFF); - assert.strictEqual(buf[1], 0x61); - assert.strictEqual(buf[2], 0x62); - assert.strictEqual(buf[3], 0x63); - - buf.fill(0xFF); - assert.strictEqual(buf.write('abcd', 1, 2, 'utf8'), 2); - assert.strictEqual(buf[0], 0xFF); - assert.strictEqual(buf[1], 0x61); - assert.strictEqual(buf[2], 0x62); - assert.strictEqual(buf[3], 0xFF); - - buf.fill(0xFF); - assert.strictEqual(buf.write('abcdef', 1, 2, 'hex'), 2); - assert.strictEqual(buf[0], 0xFF); - assert.strictEqual(buf[1], 0xAB); - assert.strictEqual(buf[2], 0xCD); - assert.strictEqual(buf[3], 0xFF); - - ['ucs2', 'ucs-2', 'utf16le', 'utf-16le'].forEach((encoding) => { - buf.fill(0xFF); - assert.strictEqual(buf.write('abcd', 0, 2, encoding), 2); - assert.strictEqual(buf[0], 0x61); - assert.strictEqual(buf[1], 0x00); - assert.strictEqual(buf[2], 0xFF); - assert.strictEqual(buf[3], 0xFF); - }); -} - -{ - // Test offset returns are correct - const b = Buffer.allocUnsafe(16); - assert.strictEqual(b.writeUInt32LE(0, 0), 4); - assert.strictEqual(b.writeUInt16LE(0, 4), 6); - assert.strictEqual(b.writeUInt8(0, 6), 7); - assert.strictEqual(b.writeInt8(0, 7), 8); - assert.strictEqual(b.writeDoubleLE(0, 8), 16); -} - -{ - // Test unmatched surrogates not producing invalid utf8 output - // ef bf bd = utf-8 representation of unicode replacement character - // see https://codereview.chromium.org/121173009/ - const buf = Buffer.from('ab\ud800cd', 'utf8'); - assert.strictEqual(buf[0], 0x61); - assert.strictEqual(buf[1], 0x62); - assert.strictEqual(buf[2], 0xef); - assert.strictEqual(buf[3], 0xbf); - assert.strictEqual(buf[4], 0xbd); - assert.strictEqual(buf[5], 0x63); - assert.strictEqual(buf[6], 0x64); -} - -{ - // Test for buffer overrun - const buf = Buffer.from([0, 0, 0, 0, 0]); // length: 5 - const sub = buf.slice(0, 4); // length: 4 - assert.strictEqual(sub.write('12345', 'latin1'), 4); - assert.strictEqual(buf[4], 0); - assert.strictEqual(sub.write('12345', 'binary'), 4); - assert.strictEqual(buf[4], 0); -} - -{ - // Test alloc with fill option - const buf = Buffer.alloc(5, '800A', 'hex'); - assert.strictEqual(buf[0], 128); - assert.strictEqual(buf[1], 10); - assert.strictEqual(buf[2], 128); - assert.strictEqual(buf[3], 10); - assert.strictEqual(buf[4], 128); -} - - -// Check for fractional length args, junk length args, etc. -// https://github.com/joyent/node/issues/1758 - -// Call .fill() first, stops valgrind warning about uninitialized memory reads. -Buffer.allocUnsafe(3.3).fill().toString(); -// Throws bad argument error in commit 43cb4ec -Buffer.alloc(3.3).fill().toString(); -assert.strictEqual(Buffer.allocUnsafe(3.3).length, 3); -assert.strictEqual(Buffer.from({ length: 3.3 }).length, 3); -assert.strictEqual(Buffer.from({ length: 'BAM' }).length, 0); - -// Make sure that strings are not coerced to numbers. -assert.strictEqual(Buffer.from('99').length, 2); -assert.strictEqual(Buffer.from('13.37').length, 5); - -// Ensure that the length argument is respected. -['ascii', 'utf8', 'hex', 'base64', 'latin1', 'binary'].forEach((enc) => { - assert.strictEqual(Buffer.allocUnsafe(1).write('aaaaaa', 0, 1, enc), 1); -}); - -{ - // Regression test, guard against buffer overrun in the base64 decoder. - const a = Buffer.allocUnsafe(3); - const b = Buffer.from('xxx'); - a.write('aaaaaaaa', 'base64'); - assert.strictEqual(b.toString(), 'xxx'); -} - -// issue GH-3416 -Buffer.from(Buffer.allocUnsafe(0), 0, 0); - -// issue GH-5587 -assert.throws( - () => Buffer.alloc(8).writeFloatLE(0, 5), - outOfRangeError -); -assert.throws( - () => Buffer.alloc(16).writeDoubleLE(0, 9), - outOfRangeError -); - -// Attempt to overflow buffers, similar to previous bug in array buffers -assert.throws( - () => Buffer.allocUnsafe(8).writeFloatLE(0.0, 0xffffffff), - outOfRangeError -); -assert.throws( - () => Buffer.allocUnsafe(8).writeFloatLE(0.0, 0xffffffff), - outOfRangeError -); - -// Ensure negative values can't get past offset -assert.throws( - () => Buffer.allocUnsafe(8).writeFloatLE(0.0, -1), - outOfRangeError -); -assert.throws( - () => Buffer.allocUnsafe(8).writeFloatLE(0.0, -1), - outOfRangeError -); - -// Test for common write(U)IntLE/BE -{ - let buf = Buffer.allocUnsafe(3); - buf.writeUIntLE(0x123456, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0x56, 0x34, 0x12]); - assert.strictEqual(buf.readUIntLE(0, 3), 0x123456); - - buf.fill(0xFF); - buf.writeUIntBE(0x123456, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0x12, 0x34, 0x56]); - assert.strictEqual(buf.readUIntBE(0, 3), 0x123456); - - buf.fill(0xFF); - buf.writeIntLE(0x123456, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0x56, 0x34, 0x12]); - assert.strictEqual(buf.readIntLE(0, 3), 0x123456); - - buf.fill(0xFF); - buf.writeIntBE(0x123456, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0x12, 0x34, 0x56]); - assert.strictEqual(buf.readIntBE(0, 3), 0x123456); - - buf.fill(0xFF); - buf.writeIntLE(-0x123456, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0xaa, 0xcb, 0xed]); - assert.strictEqual(buf.readIntLE(0, 3), -0x123456); - - buf.fill(0xFF); - buf.writeIntBE(-0x123456, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0xed, 0xcb, 0xaa]); - assert.strictEqual(buf.readIntBE(0, 3), -0x123456); - - buf.fill(0xFF); - buf.writeIntLE(-0x123400, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0x00, 0xcc, 0xed]); - assert.strictEqual(buf.readIntLE(0, 3), -0x123400); - - buf.fill(0xFF); - buf.writeIntBE(-0x123400, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0xed, 0xcc, 0x00]); - assert.strictEqual(buf.readIntBE(0, 3), -0x123400); - - buf.fill(0xFF); - buf.writeIntLE(-0x120000, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0x00, 0x00, 0xee]); - assert.strictEqual(buf.readIntLE(0, 3), -0x120000); - - buf.fill(0xFF); - buf.writeIntBE(-0x120000, 0, 3); - assert.deepStrictEqual(buf.toJSON().data, [0xee, 0x00, 0x00]); - assert.strictEqual(buf.readIntBE(0, 3), -0x120000); - - buf = Buffer.allocUnsafe(5); - buf.writeUIntLE(0x1234567890, 0, 5); - assert.deepStrictEqual(buf.toJSON().data, [0x90, 0x78, 0x56, 0x34, 0x12]); - assert.strictEqual(buf.readUIntLE(0, 5), 0x1234567890); - - buf.fill(0xFF); - buf.writeUIntBE(0x1234567890, 0, 5); - assert.deepStrictEqual(buf.toJSON().data, [0x12, 0x34, 0x56, 0x78, 0x90]); - assert.strictEqual(buf.readUIntBE(0, 5), 0x1234567890); - - buf.fill(0xFF); - buf.writeIntLE(0x1234567890, 0, 5); - assert.deepStrictEqual(buf.toJSON().data, [0x90, 0x78, 0x56, 0x34, 0x12]); - assert.strictEqual(buf.readIntLE(0, 5), 0x1234567890); - - buf.fill(0xFF); - buf.writeIntBE(0x1234567890, 0, 5); - assert.deepStrictEqual(buf.toJSON().data, [0x12, 0x34, 0x56, 0x78, 0x90]); - assert.strictEqual(buf.readIntBE(0, 5), 0x1234567890); - - buf.fill(0xFF); - buf.writeIntLE(-0x1234567890, 0, 5); - assert.deepStrictEqual(buf.toJSON().data, [0x70, 0x87, 0xa9, 0xcb, 0xed]); - assert.strictEqual(buf.readIntLE(0, 5), -0x1234567890); - - buf.fill(0xFF); - buf.writeIntBE(-0x1234567890, 0, 5); - assert.deepStrictEqual(buf.toJSON().data, [0xed, 0xcb, 0xa9, 0x87, 0x70]); - assert.strictEqual(buf.readIntBE(0, 5), -0x1234567890); - - buf.fill(0xFF); - buf.writeIntLE(-0x0012000000, 0, 5); - assert.deepStrictEqual(buf.toJSON().data, [0x00, 0x00, 0x00, 0xee, 0xff]); - assert.strictEqual(buf.readIntLE(0, 5), -0x0012000000); - - buf.fill(0xFF); - buf.writeIntBE(-0x0012000000, 0, 5); - assert.deepStrictEqual(buf.toJSON().data, [0xff, 0xee, 0x00, 0x00, 0x00]); - assert.strictEqual(buf.readIntBE(0, 5), -0x0012000000); -} - -// Regression test for https://github.com/nodejs/node-v0.x-archive/issues/5482: -// should throw but not assert in C++ land. -assert.throws( - () => Buffer.from('', 'buffer'), - { - code: 'ERR_UNKNOWN_ENCODING', - name: 'TypeError', - message: 'Unknown encoding: buffer' - } -); - -// Regression test for https://github.com/nodejs/node-v0.x-archive/issues/6111. -// Constructing a buffer from another buffer should a) work, and b) not corrupt -// the source buffer. -{ - const a = [...Array(128).keys()]; // [0, 1, 2, 3, ... 126, 127] - const b = Buffer.from(a); - const c = Buffer.from(b); - assert.strictEqual(b.length, a.length); - assert.strictEqual(c.length, a.length); - for (let i = 0, k = a.length; i < k; ++i) { - assert.strictEqual(a[i], i); - assert.strictEqual(b[i], i); - assert.strictEqual(c[i], i); - } -} - -if (common.hasCrypto) { // eslint-disable-line node-core/crypto-check - // Test truncation after decode - const crypto = require('crypto'); - - const b1 = Buffer.from('YW55=======', 'base64'); - const b2 = Buffer.from('YW55', 'base64'); - - assert.strictEqual( - crypto.createHash('sha1').update(b1).digest('hex'), - crypto.createHash('sha1').update(b2).digest('hex') - ); -} else { - common.printSkipMessage('missing crypto'); -} - -const ps = Buffer.poolSize; -Buffer.poolSize = 0; -assert(Buffer.allocUnsafe(1).parent instanceof ArrayBuffer); -Buffer.poolSize = ps; - -assert.throws( - () => Buffer.allocUnsafe(10).copy(), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "target" argument must be an instance of Buffer or ' + - 'Uint8Array. Received undefined' - }); - -assert.throws(() => Buffer.from(), { - name: 'TypeError', - message: 'The first argument must be of type string or an instance of ' + - 'Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined' -}); -assert.throws(() => Buffer.from(null), { - name: 'TypeError', - message: 'The first argument must be of type string or an instance of ' + - 'Buffer, ArrayBuffer, or Array or an Array-like Object. Received null' -}); - -// Test prototype getters don't throw -assert.strictEqual(Buffer.prototype.parent, undefined); -assert.strictEqual(Buffer.prototype.offset, undefined); -assert.strictEqual(SlowBuffer.prototype.parent, undefined); -assert.strictEqual(SlowBuffer.prototype.offset, undefined); - - -{ - // Test that large negative Buffer length inputs don't affect the pool offset. - // Use the fromArrayLike() variant here because it's more lenient - // about its input and passes the length directly to allocate(). - assert.deepStrictEqual(Buffer.from({ length: -Buffer.poolSize }), - Buffer.from('')); - assert.deepStrictEqual(Buffer.from({ length: -100 }), - Buffer.from('')); - - // Check pool offset after that by trying to write string into the pool. - Buffer.from('abc'); -} - - -// Test that ParseArrayIndex handles full uint32 -{ - const errMsg = common.expectsError({ - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: '"offset" is outside of buffer bounds' - }); - assert.throws(() => Buffer.from(new ArrayBuffer(0), -1 >>> 0), errMsg); -} - -// ParseArrayIndex() should reject values that don't fit in a 32 bits size_t. -assert.throws(() => { - const a = Buffer.alloc(1); - const b = Buffer.alloc(1); - a.copy(b, 0, 0x100000000, 0x100000001); -}, outOfRangeError); - -// Unpooled buffer (replaces SlowBuffer) -{ - const ubuf = Buffer.allocUnsafeSlow(10); - assert(ubuf); - assert(ubuf.buffer); - assert.strictEqual(ubuf.buffer.byteLength, 10); -} - -// Regression test to verify that an empty ArrayBuffer does not throw. -Buffer.from(new ArrayBuffer()); - - -// Test that ArrayBuffer from a different context is detected correctly. -const arrayBuf = vm.runInNewContext('new ArrayBuffer()'); -Buffer.from(arrayBuf); -Buffer.from({ buffer: arrayBuf }); - -assert.throws(() => Buffer.alloc({ valueOf: () => 1 }), - /"size" argument must be of type number/); -assert.throws(() => Buffer.alloc({ valueOf: () => -1 }), - /"size" argument must be of type number/); - -assert.strictEqual(Buffer.prototype.toLocaleString, Buffer.prototype.toString); -{ - const buf = Buffer.from('test'); - assert.strictEqual(buf.toLocaleString(), buf.toString()); -} - -assert.throws(() => { - Buffer.alloc(0x1000, 'This is not correctly encoded', 'hex'); -}, { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError' -}); - -assert.throws(() => { - Buffer.alloc(0x1000, 'c', 'hex'); -}, { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError' -}); - -assert.throws(() => { - Buffer.alloc(1, Buffer.alloc(0)); -}, { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError' -}); - -assert.throws(() => { - Buffer.alloc(40, 'x', 20); -}, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-arraybuffer.js b/cli/tests/node_compat/test/parallel/test-buffer-arraybuffer.js deleted file mode 100644 index 286481758..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-arraybuffer.js +++ /dev/null @@ -1,159 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -const LENGTH = 16; - -const ab = new ArrayBuffer(LENGTH); -const dv = new DataView(ab); -const ui = new Uint8Array(ab); -const buf = Buffer.from(ab); - - -assert.ok(buf instanceof Buffer); -assert.strictEqual(buf.parent, buf.buffer); -assert.strictEqual(buf.buffer, ab); -assert.strictEqual(buf.length, ab.byteLength); - - -buf.fill(0xC); -for (let i = 0; i < LENGTH; i++) { - assert.strictEqual(ui[i], 0xC); - ui[i] = 0xF; - assert.strictEqual(buf[i], 0xF); -} - -buf.writeUInt32LE(0xF00, 0); -buf.writeUInt32BE(0xB47, 4); -buf.writeDoubleLE(3.1415, 8); - -assert.strictEqual(dv.getUint32(0, true), 0xF00); -assert.strictEqual(dv.getUint32(4), 0xB47); -assert.strictEqual(dv.getFloat64(8, true), 3.1415); - - -// Now test protecting users from doing stupid things - -assert.throws(function() { - function AB() { } - Object.setPrototypeOf(AB, ArrayBuffer); - Object.setPrototypeOf(AB.prototype, ArrayBuffer.prototype); - Buffer.from(new AB()); -}, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The first argument must be of type string or an instance of ' + - 'Buffer, ArrayBuffer, or Array or an Array-like Object. Received ' + - 'an instance of AB' -}); - -// Test the byteOffset and length arguments -{ - const ab = new Uint8Array(5); - ab[0] = 1; - ab[1] = 2; - ab[2] = 3; - ab[3] = 4; - ab[4] = 5; - const buf = Buffer.from(ab.buffer, 1, 3); - assert.strictEqual(buf.length, 3); - assert.strictEqual(buf[0], 2); - assert.strictEqual(buf[1], 3); - assert.strictEqual(buf[2], 4); - buf[0] = 9; - assert.strictEqual(ab[1], 9); - - assert.throws(() => Buffer.from(ab.buffer, 6), { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: '"offset" is outside of buffer bounds' - }); - assert.throws(() => Buffer.from(ab.buffer, 3, 6), { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: '"length" is outside of buffer bounds' - }); -} - -// Test the deprecated Buffer() version also -{ - const ab = new Uint8Array(5); - ab[0] = 1; - ab[1] = 2; - ab[2] = 3; - ab[3] = 4; - ab[4] = 5; - const buf = Buffer(ab.buffer, 1, 3); - assert.strictEqual(buf.length, 3); - assert.strictEqual(buf[0], 2); - assert.strictEqual(buf[1], 3); - assert.strictEqual(buf[2], 4); - buf[0] = 9; - assert.strictEqual(ab[1], 9); - - assert.throws(() => Buffer(ab.buffer, 6), { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: '"offset" is outside of buffer bounds' - }); - assert.throws(() => Buffer(ab.buffer, 3, 6), { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: '"length" is outside of buffer bounds' - }); -} - -{ - // If byteOffset is not numeric, it defaults to 0. - const ab = new ArrayBuffer(10); - const expected = Buffer.from(ab, 0); - assert.deepStrictEqual(Buffer.from(ab, 'fhqwhgads'), expected); - assert.deepStrictEqual(Buffer.from(ab, NaN), expected); - assert.deepStrictEqual(Buffer.from(ab, {}), expected); - assert.deepStrictEqual(Buffer.from(ab, []), expected); - - // If byteOffset can be converted to a number, it will be. - assert.deepStrictEqual(Buffer.from(ab, [1]), Buffer.from(ab, 1)); - - // If byteOffset is Infinity, throw. - assert.throws(() => { - Buffer.from(ab, Infinity); - }, { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: '"offset" is outside of buffer bounds' - }); -} - -{ - // If length is not numeric, it defaults to 0. - const ab = new ArrayBuffer(10); - const expected = Buffer.from(ab, 0, 0); - assert.deepStrictEqual(Buffer.from(ab, 0, 'fhqwhgads'), expected); - assert.deepStrictEqual(Buffer.from(ab, 0, NaN), expected); - assert.deepStrictEqual(Buffer.from(ab, 0, {}), expected); - assert.deepStrictEqual(Buffer.from(ab, 0, []), expected); - - // If length can be converted to a number, it will be. - assert.deepStrictEqual(Buffer.from(ab, 0, [1]), Buffer.from(ab, 0, 1)); - - // If length is Infinity, throw. - assert.throws(() => { - Buffer.from(ab, 0, Infinity); - }, { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: '"length" is outside of buffer bounds' - }); -} - -// Test an array like entry with the length set to NaN. -assert.deepStrictEqual(Buffer.from({ length: NaN }), Buffer.alloc(0)); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-ascii.js b/cli/tests/node_compat/test/parallel/test-buffer-ascii.js deleted file mode 100644 index 08e4e6543..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-ascii.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -// ASCII conversion in node.js simply masks off the high bits, -// it doesn't do transliteration. -assert.strictEqual(Buffer.from('hérité').toString('ascii'), 'hC)ritC)'); - -// 71 characters, 78 bytes. The ’ character is a triple-byte sequence. -const input = 'C’est, graphiquement, la réunion d’un accent aigu ' + - 'et d’un accent grave.'; - -const expected = 'Cb\u0000\u0019est, graphiquement, la rC)union ' + - 'db\u0000\u0019un accent aigu et db\u0000\u0019un ' + - 'accent grave.'; - -const buf = Buffer.from(input); - -for (let i = 0; i < expected.length; ++i) { - assert.strictEqual(buf.slice(i).toString('ascii'), expected.slice(i)); - - // Skip remainder of multi-byte sequence. - if (input.charCodeAt(i) > 65535) ++i; - if (input.charCodeAt(i) > 127) ++i; -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-badhex.js b/cli/tests/node_compat/test/parallel/test-buffer-badhex.js deleted file mode 100644 index cafaa0887..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-badhex.js +++ /dev/null @@ -1,55 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -// Test hex strings and bad hex strings -{ - const buf = Buffer.alloc(4); - assert.strictEqual(buf.length, 4); - assert.deepStrictEqual(buf, Buffer.from([0, 0, 0, 0])); - assert.strictEqual(buf.write('abcdxx', 0, 'hex'), 2); - assert.deepStrictEqual(buf, Buffer.from([0xab, 0xcd, 0x00, 0x00])); - assert.strictEqual(buf.toString('hex'), 'abcd0000'); - assert.strictEqual(buf.write('abcdef01', 0, 'hex'), 4); - assert.deepStrictEqual(buf, Buffer.from([0xab, 0xcd, 0xef, 0x01])); - assert.strictEqual(buf.toString('hex'), 'abcdef01'); - - const copy = Buffer.from(buf.toString('hex'), 'hex'); - assert.strictEqual(buf.toString('hex'), copy.toString('hex')); -} - -{ - const buf = Buffer.alloc(5); - assert.strictEqual(buf.write('abcdxx', 1, 'hex'), 2); - assert.strictEqual(buf.toString('hex'), '00abcd0000'); -} - -{ - const buf = Buffer.alloc(4); - assert.deepStrictEqual(buf, Buffer.from([0, 0, 0, 0])); - assert.strictEqual(buf.write('xxabcd', 0, 'hex'), 0); - assert.deepStrictEqual(buf, Buffer.from([0, 0, 0, 0])); - assert.strictEqual(buf.write('xxab', 1, 'hex'), 0); - assert.deepStrictEqual(buf, Buffer.from([0, 0, 0, 0])); - assert.strictEqual(buf.write('cdxxab', 0, 'hex'), 1); - assert.deepStrictEqual(buf, Buffer.from([0xcd, 0, 0, 0])); -} - -{ - const buf = Buffer.alloc(256); - for (let i = 0; i < 256; i++) - buf[i] = i; - - const hex = buf.toString('hex'); - assert.deepStrictEqual(Buffer.from(hex, 'hex'), buf); - - const badHex = `${hex.slice(0, 256)}xx${hex.slice(256, 510)}`; - assert.deepStrictEqual(Buffer.from(badHex, 'hex'), buf.slice(0, 128)); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-bigint64.js b/cli/tests/node_compat/test/parallel/test-buffer-bigint64.js deleted file mode 100644 index 7aa391f0a..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-bigint64.js +++ /dev/null @@ -1,62 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -const buf = Buffer.allocUnsafe(8); - -['LE', 'BE'].forEach(function(endianness) { - // Should allow simple BigInts to be written and read - let val = 123456789n; - buf[`writeBigInt64${endianness}`](val, 0); - let rtn = buf[`readBigInt64${endianness}`](0); - assert.strictEqual(val, rtn); - - // Should allow INT64_MAX to be written and read - val = 0x7fffffffffffffffn; - buf[`writeBigInt64${endianness}`](val, 0); - rtn = buf[`readBigInt64${endianness}`](0); - assert.strictEqual(val, rtn); - - // Should read and write a negative signed 64-bit integer - val = -123456789n; - buf[`writeBigInt64${endianness}`](val, 0); - assert.strictEqual(val, buf[`readBigInt64${endianness}`](0)); - - // Should read and write an unsigned 64-bit integer - val = 123456789n; - buf[`writeBigUInt64${endianness}`](val, 0); - assert.strictEqual(val, buf[`readBigUInt64${endianness}`](0)); - - // Should throw a RangeError upon INT64_MAX+1 being written - assert.throws(function() { - const val = 0x8000000000000000n; - buf[`writeBigInt64${endianness}`](val, 0); - }, RangeError); - - // Should throw a RangeError upon UINT64_MAX+1 being written - assert.throws(function() { - const val = 0x10000000000000000n; - buf[`writeBigUInt64${endianness}`](val, 0); - }, { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "value" is out of range. It must be ' + - '>= 0n and < 2n ** 64n. Received 18_446_744_073_709_551_616n' - }); - - // Should throw a TypeError upon invalid input - assert.throws(function() { - buf[`writeBigInt64${endianness}`]('bad', 0); - }, TypeError); - - // Should throw a TypeError upon invalid input - assert.throws(function() { - buf[`writeBigUInt64${endianness}`]('bad', 0); - }, TypeError); -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-bytelength.js b/cli/tests/node_compat/test/parallel/test-buffer-bytelength.js deleted file mode 100644 index 4f10596a2..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-bytelength.js +++ /dev/null @@ -1,139 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const SlowBuffer = require('buffer').SlowBuffer; -const vm = require('vm'); - -[ - [32, 'latin1'], - [NaN, 'utf8'], - [{}, 'latin1'], - [], -].forEach((args) => { - assert.throws( - () => Buffer.byteLength(...args), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "string" argument must be of type string or an instance ' + - 'of Buffer or ArrayBuffer.' + - common.invalidArgTypeHelper(args[0]) - } - ); -}); - -assert(ArrayBuffer.isView(new Buffer(10))); -assert(ArrayBuffer.isView(new SlowBuffer(10))); -assert(ArrayBuffer.isView(Buffer.alloc(10))); -assert(ArrayBuffer.isView(Buffer.allocUnsafe(10))); -assert(ArrayBuffer.isView(Buffer.allocUnsafeSlow(10))); -assert(ArrayBuffer.isView(Buffer.from(''))); - -// buffer -const incomplete = Buffer.from([0xe4, 0xb8, 0xad, 0xe6, 0x96]); -assert.strictEqual(Buffer.byteLength(incomplete), 5); -const ascii = Buffer.from('abc'); -assert.strictEqual(Buffer.byteLength(ascii), 3); - -// ArrayBuffer -const buffer = new ArrayBuffer(8); -assert.strictEqual(Buffer.byteLength(buffer), 8); - -// TypedArray -const int8 = new Int8Array(8); -assert.strictEqual(Buffer.byteLength(int8), 8); -const uint8 = new Uint8Array(8); -assert.strictEqual(Buffer.byteLength(uint8), 8); -const uintc8 = new Uint8ClampedArray(2); -assert.strictEqual(Buffer.byteLength(uintc8), 2); -const int16 = new Int16Array(8); -assert.strictEqual(Buffer.byteLength(int16), 16); -const uint16 = new Uint16Array(8); -assert.strictEqual(Buffer.byteLength(uint16), 16); -const int32 = new Int32Array(8); -assert.strictEqual(Buffer.byteLength(int32), 32); -const uint32 = new Uint32Array(8); -assert.strictEqual(Buffer.byteLength(uint32), 32); -const float32 = new Float32Array(8); -assert.strictEqual(Buffer.byteLength(float32), 32); -const float64 = new Float64Array(8); -assert.strictEqual(Buffer.byteLength(float64), 64); - -// DataView -const dv = new DataView(new ArrayBuffer(2)); -assert.strictEqual(Buffer.byteLength(dv), 2); - -// Special case: zero length string -assert.strictEqual(Buffer.byteLength('', 'ascii'), 0); -assert.strictEqual(Buffer.byteLength('', 'HeX'), 0); - -// utf8 -assert.strictEqual(Buffer.byteLength('∑éllö wørl∂!', 'utf-8'), 19); -assert.strictEqual(Buffer.byteLength('κλμνξο', 'utf8'), 12); -assert.strictEqual(Buffer.byteLength('挵挶挷挸挹', 'utf-8'), 15); -assert.strictEqual(Buffer.byteLength('𠝹𠱓𠱸', 'UTF8'), 12); -// Without an encoding, utf8 should be assumed -assert.strictEqual(Buffer.byteLength('hey there'), 9); -assert.strictEqual(Buffer.byteLength('𠱸挶νξ#xx :)'), 17); -assert.strictEqual(Buffer.byteLength('hello world', ''), 11); -// It should also be assumed with unrecognized encoding -assert.strictEqual(Buffer.byteLength('hello world', 'abc'), 11); -assert.strictEqual(Buffer.byteLength('ßœ∑≈', 'unkn0wn enc0ding'), 10); - -// base64 -assert.strictEqual(Buffer.byteLength('aGVsbG8gd29ybGQ=', 'base64'), 11); -assert.strictEqual(Buffer.byteLength('aGVsbG8gd29ybGQ=', 'BASE64'), 11); -assert.strictEqual(Buffer.byteLength('bm9kZS5qcyByb2NrcyE=', 'base64'), 14); -assert.strictEqual(Buffer.byteLength('aGkk', 'base64'), 3); -assert.strictEqual( - Buffer.byteLength('bHNrZGZsa3NqZmtsc2xrZmFqc2RsZmtqcw==', 'base64'), 25 -); -// base64url -assert.strictEqual(Buffer.byteLength('aGVsbG8gd29ybGQ', 'base64url'), 11); -assert.strictEqual(Buffer.byteLength('aGVsbG8gd29ybGQ', 'BASE64URL'), 11); -assert.strictEqual(Buffer.byteLength('bm9kZS5qcyByb2NrcyE', 'base64url'), 14); -assert.strictEqual(Buffer.byteLength('aGkk', 'base64url'), 3); -assert.strictEqual( - Buffer.byteLength('bHNrZGZsa3NqZmtsc2xrZmFqc2RsZmtqcw', 'base64url'), 25 -); -// special padding -assert.strictEqual(Buffer.byteLength('aaa=', 'base64'), 2); -assert.strictEqual(Buffer.byteLength('aaaa==', 'base64'), 3); -assert.strictEqual(Buffer.byteLength('aaa=', 'base64url'), 2); -assert.strictEqual(Buffer.byteLength('aaaa==', 'base64url'), 3); - -assert.strictEqual(Buffer.byteLength('Il était tué'), 14); -assert.strictEqual(Buffer.byteLength('Il était tué', 'utf8'), 14); - -['ascii', 'latin1', 'binary'] - .reduce((es, e) => es.concat(e, e.toUpperCase()), []) - .forEach((encoding) => { - assert.strictEqual(Buffer.byteLength('Il était tué', encoding), 12); - }); - -['ucs2', 'ucs-2', 'utf16le', 'utf-16le'] - .reduce((es, e) => es.concat(e, e.toUpperCase()), []) - .forEach((encoding) => { - assert.strictEqual(Buffer.byteLength('Il était tué', encoding), 24); - }); - -// Test that ArrayBuffer from a different context is detected correctly -const arrayBuf = vm.runInNewContext('new ArrayBuffer()'); -assert.strictEqual(Buffer.byteLength(arrayBuf), 0); - -// Verify that invalid encodings are treated as utf8 -for (let i = 1; i < 10; i++) { - const encoding = String(i).repeat(i); - - assert.ok(!Buffer.isEncoding(encoding)); - assert.strictEqual(Buffer.byteLength('foo', encoding), - Buffer.byteLength('foo', 'utf8')); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-compare-offset.js b/cli/tests/node_compat/test/parallel/test-buffer-compare-offset.js deleted file mode 100644 index bb7ba2998..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-compare-offset.js +++ /dev/null @@ -1,101 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -const a = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]); -const b = Buffer.from([5, 6, 7, 8, 9, 0, 1, 2, 3, 4]); - -assert.strictEqual(a.compare(b), -1); - -// Equivalent to a.compare(b). -assert.strictEqual(a.compare(b, 0), -1); -assert.throws(() => a.compare(b, '0'), { code: 'ERR_INVALID_ARG_TYPE' }); -assert.strictEqual(a.compare(b, undefined), -1); - -// Equivalent to a.compare(b). -assert.strictEqual(a.compare(b, 0, undefined, 0), -1); - -// Zero-length target, return 1 -assert.strictEqual(a.compare(b, 0, 0, 0), 1); -assert.throws( - () => a.compare(b, 0, '0', '0'), - { code: 'ERR_INVALID_ARG_TYPE' } -); - -// Equivalent to Buffer.compare(a, b.slice(6, 10)) -assert.strictEqual(a.compare(b, 6, 10), 1); - -// Zero-length source, return -1 -assert.strictEqual(a.compare(b, 6, 10, 0, 0), -1); - -// Zero-length source and target, return 0 -assert.strictEqual(a.compare(b, 0, 0, 0, 0), 0); -assert.strictEqual(a.compare(b, 1, 1, 2, 2), 0); - -// Equivalent to Buffer.compare(a.slice(4), b.slice(0, 5)) -assert.strictEqual(a.compare(b, 0, 5, 4), 1); - -// Equivalent to Buffer.compare(a.slice(1), b.slice(5)) -assert.strictEqual(a.compare(b, 5, undefined, 1), 1); - -// Equivalent to Buffer.compare(a.slice(2), b.slice(2, 4)) -assert.strictEqual(a.compare(b, 2, 4, 2), -1); - -// Equivalent to Buffer.compare(a.slice(4), b.slice(0, 7)) -assert.strictEqual(a.compare(b, 0, 7, 4), -1); - -// Equivalent to Buffer.compare(a.slice(4, 6), b.slice(0, 7)); -assert.strictEqual(a.compare(b, 0, 7, 4, 6), -1); - -// Null is ambiguous. -assert.throws( - () => a.compare(b, 0, null), - { code: 'ERR_INVALID_ARG_TYPE' } -); - -// Values do not get coerced. -assert.throws( - () => a.compare(b, 0, { valueOf: () => 5 }), - { code: 'ERR_INVALID_ARG_TYPE' } -); - -// Infinity should not be coerced. -assert.throws( - () => a.compare(b, Infinity, -Infinity), - { code: 'ERR_OUT_OF_RANGE' } -); - -// Zero length target because default for targetEnd <= targetSource -assert.strictEqual(a.compare(b, 0xff), 1); - -assert.throws( - () => a.compare(b, '0xff'), - { code: 'ERR_INVALID_ARG_TYPE' } -); -assert.throws( - () => a.compare(b, 0, '0xff'), - { code: 'ERR_INVALID_ARG_TYPE' } -); - -const oor = { code: 'ERR_OUT_OF_RANGE' }; - -assert.throws(() => a.compare(b, 0, 100, 0), oor); -assert.throws(() => a.compare(b, 0, 1, 0, 100), oor); -assert.throws(() => a.compare(b, -1), oor); -assert.throws(() => a.compare(b, 0, Infinity), oor); -assert.throws(() => a.compare(b, 0, 1, -1), oor); -assert.throws(() => a.compare(b, -Infinity, Infinity), oor); -assert.throws(() => a.compare(), { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "target" argument must be an instance of ' + - 'Buffer or Uint8Array. Received undefined' -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-concat.js b/cli/tests/node_compat/test/parallel/test-buffer-concat.js deleted file mode 100644 index 5d2e2c4a5..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-concat.js +++ /dev/null @@ -1,107 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 zero = []; -const one = [ Buffer.from('asdf') ]; -const long = []; -for (let i = 0; i < 10; i++) long.push(Buffer.from('asdf')); - -const flatZero = Buffer.concat(zero); -const flatOne = Buffer.concat(one); -const flatLong = Buffer.concat(long); -const flatLongLen = Buffer.concat(long, 40); - -assert.strictEqual(flatZero.length, 0); -assert.strictEqual(flatOne.toString(), 'asdf'); - -const check = 'asdf'.repeat(10); - -// A special case where concat used to return the first item, -// if the length is one. This check is to make sure that we don't do that. -assert.notStrictEqual(flatOne, one[0]); -assert.strictEqual(flatLong.toString(), check); -assert.strictEqual(flatLongLen.toString(), check); - -[undefined, null, Buffer.from('hello')].forEach((value) => { - assert.throws(() => { - Buffer.concat(value); - }, { - code: 'ERR_INVALID_ARG_TYPE', - message: 'The "list" argument must be an instance of Array.' + - `${common.invalidArgTypeHelper(value)}` - }); -}); - -[[42], ['hello', Buffer.from('world')]].forEach((value) => { - assert.throws(() => { - Buffer.concat(value); - }, { - code: 'ERR_INVALID_ARG_TYPE', - message: 'The "list[0]" argument must be an instance of Buffer ' + - `or Uint8Array.${common.invalidArgTypeHelper(value[0])}` - }); -}); - -assert.throws(() => { - Buffer.concat([Buffer.from('hello'), 3]); -}, { - code: 'ERR_INVALID_ARG_TYPE', - message: 'The "list[1]" argument must be an instance of Buffer ' + - 'or Uint8Array. Received type number (3)' -}); - -// eslint-disable-next-line node-core/crypto-check -const random10 = common.hasCrypto ? - require('crypto').randomBytes(10) : - Buffer.alloc(10, 1); -const empty = Buffer.alloc(0); - -assert.notDeepStrictEqual(random10, empty); -assert.notDeepStrictEqual(random10, Buffer.alloc(10)); - -assert.deepStrictEqual(Buffer.concat([], 100), empty); -assert.deepStrictEqual(Buffer.concat([random10], 0), empty); -assert.deepStrictEqual(Buffer.concat([random10], 10), random10); -assert.deepStrictEqual(Buffer.concat([random10, random10], 10), random10); -assert.deepStrictEqual(Buffer.concat([empty, random10]), random10); -assert.deepStrictEqual(Buffer.concat([random10, empty, empty]), random10); - -// The tail should be zero-filled -assert.deepStrictEqual(Buffer.concat([empty], 100), Buffer.alloc(100)); -assert.deepStrictEqual(Buffer.concat([empty], 4096), Buffer.alloc(4096)); -assert.deepStrictEqual( - Buffer.concat([random10], 40), - Buffer.concat([random10, Buffer.alloc(30)])); - -assert.deepStrictEqual(Buffer.concat([new Uint8Array([0x41, 0x42]), - new Uint8Array([0x43, 0x44])]), - Buffer.from('ABCD')); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-constants.js b/cli/tests/node_compat/test/parallel/test-buffer-constants.js deleted file mode 100644 index 0c4f6e21b..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-constants.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -const { kMaxLength, kStringMaxLength } = require('buffer'); -const { MAX_LENGTH, MAX_STRING_LENGTH } = require('buffer').constants; - -assert.strictEqual(typeof MAX_LENGTH, 'number'); -assert.strictEqual(typeof MAX_STRING_LENGTH, 'number'); -assert(MAX_STRING_LENGTH <= MAX_LENGTH); -assert.throws(() => ' '.repeat(MAX_STRING_LENGTH + 1), - /^RangeError: Invalid string length$/); - -' '.repeat(MAX_STRING_LENGTH); // Should not throw. - -// Legacy values match: -assert.strictEqual(kMaxLength, MAX_LENGTH); -assert.strictEqual(kStringMaxLength, MAX_STRING_LENGTH); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-copy.js b/cli/tests/node_compat/test/parallel/test-buffer-copy.js deleted file mode 100644 index a10bfebc5..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-copy.js +++ /dev/null @@ -1,243 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -const b = Buffer.allocUnsafe(1024); -const c = Buffer.allocUnsafe(512); - -let cntr = 0; - -{ - // copy 512 bytes, from 0 to 512. - b.fill(++cntr); - c.fill(++cntr); - const copied = b.copy(c, 0, 0, 512); - assert.strictEqual(copied, 512); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(c[i], b[i]); - } -} - -{ - // Current behavior is to coerce values to integers. - b.fill(++cntr); - c.fill(++cntr); - const copied = b.copy(c, '0', '0', '512'); - assert.strictEqual(copied, 512); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(c[i], b[i]); - } -} - -{ - // Floats will be converted to integers via `Math.floor` - b.fill(++cntr); - c.fill(++cntr); - const copied = b.copy(c, 0, 0, 512.5); - assert.strictEqual(copied, 512); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(c[i], b[i]); - } -} - -{ - // Copy c into b, without specifying sourceEnd - b.fill(++cntr); - c.fill(++cntr); - const copied = c.copy(b, 0, 0); - assert.strictEqual(copied, c.length); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(b[i], c[i]); - } -} - -{ - // Copy c into b, without specifying sourceStart - b.fill(++cntr); - c.fill(++cntr); - const copied = c.copy(b, 0); - assert.strictEqual(copied, c.length); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(b[i], c[i]); - } -} - -{ - // Copied source range greater than source length - b.fill(++cntr); - c.fill(++cntr); - const copied = c.copy(b, 0, 0, c.length + 1); - assert.strictEqual(copied, c.length); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(b[i], c[i]); - } -} - -{ - // Copy longer buffer b to shorter c without targetStart - b.fill(++cntr); - c.fill(++cntr); - const copied = b.copy(c); - assert.strictEqual(copied, c.length); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(c[i], b[i]); - } -} - -{ - // Copy starting near end of b to c - b.fill(++cntr); - c.fill(++cntr); - const copied = b.copy(c, 0, b.length - Math.floor(c.length / 2)); - assert.strictEqual(copied, Math.floor(c.length / 2)); - for (let i = 0; i < Math.floor(c.length / 2); i++) { - assert.strictEqual(c[i], b[b.length - Math.floor(c.length / 2) + i]); - } - for (let i = Math.floor(c.length / 2) + 1; i < c.length; i++) { - assert.strictEqual(c[c.length - 1], c[i]); - } -} - -{ - // Try to copy 513 bytes, and check we don't overrun c - b.fill(++cntr); - c.fill(++cntr); - const copied = b.copy(c, 0, 0, 513); - assert.strictEqual(copied, c.length); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(c[i], b[i]); - } -} - -{ - // copy 768 bytes from b into b - b.fill(++cntr); - b.fill(++cntr, 256); - const copied = b.copy(b, 0, 256, 1024); - assert.strictEqual(copied, 768); - for (let i = 0; i < b.length; i++) { - assert.strictEqual(b[i], cntr); - } -} - -// Copy string longer than buffer length (failure will segfault) -const bb = Buffer.allocUnsafe(10); -bb.fill('hello crazy world'); - - -// Try to copy from before the beginning of b. Should not throw. -b.copy(c, 0, 100, 10); - -// Throw with invalid source type -assert.throws( - () => Buffer.prototype.copy.call(0), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - } -); - -// Copy throws at negative targetStart -assert.throws( - () => Buffer.allocUnsafe(5).copy(Buffer.allocUnsafe(5), -1, 0), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "targetStart" is out of range. ' + - 'It must be >= 0. Received -1' - } -); - -// Copy throws at negative sourceStart -assert.throws( - () => Buffer.allocUnsafe(5).copy(Buffer.allocUnsafe(5), 0, -1), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - } -); - -// Copy throws if sourceStart is greater than length of source -assert.throws( - () => Buffer.allocUnsafe(5).copy(Buffer.allocUnsafe(5), 0, 100), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - } -); - -{ - // Check sourceEnd resets to targetEnd if former is greater than the latter - b.fill(++cntr); - c.fill(++cntr); - b.copy(c, 0, 0, 1025); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(c[i], b[i]); - } -} - -// Throw with negative sourceEnd -assert.throws( - () => b.copy(c, 0, 0, -1), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "sourceEnd" is out of range. ' + - 'It must be >= 0. Received -1' - } -); - -// When sourceStart is greater than sourceEnd, zero copied -assert.strictEqual(b.copy(c, 0, 100, 10), 0); - -// When targetStart > targetLength, zero copied -assert.strictEqual(b.copy(c, 512, 0, 10), 0); - -// Test that the `target` can be a Uint8Array. -{ - const d = new Uint8Array(c); - // copy 512 bytes, from 0 to 512. - b.fill(++cntr); - d.fill(++cntr); - const copied = b.copy(d, 0, 0, 512); - assert.strictEqual(copied, 512); - for (let i = 0; i < d.length; i++) { - assert.strictEqual(d[i], b[i]); - } -} - -// Test that the source can be a Uint8Array, too. -{ - const e = new Uint8Array(b); - // copy 512 bytes, from 0 to 512. - e.fill(++cntr); - c.fill(++cntr); - const copied = Buffer.prototype.copy.call(e, c, 0, 0, 512); - assert.strictEqual(copied, 512); - for (let i = 0; i < c.length; i++) { - assert.strictEqual(c[i], e[i]); - } -} - -// https://github.com/nodejs/node/issues/23668: Do not crash for invalid input. -c.fill('c'); -b.copy(c, 'not a valid offset'); -// Make sure this acted like a regular copy with `0` offset. -assert.deepStrictEqual(c, b.slice(0, c.length)); - -{ - c.fill('C'); - assert.throws(() => { - b.copy(c, { [Symbol.toPrimitive]() { throw new Error('foo'); } }); - }, /foo/); - // No copying took place: - assert.deepStrictEqual(c.toString(), 'C'.repeat(c.length)); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-equals.js b/cli/tests/node_compat/test/parallel/test-buffer-equals.js deleted file mode 100644 index 3d22fae84..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-equals.js +++ /dev/null @@ -1,32 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -const b = Buffer.from('abcdf'); -const c = Buffer.from('abcdf'); -const d = Buffer.from('abcde'); -const e = Buffer.from('abcdef'); - -assert.ok(b.equals(c)); -assert.ok(!c.equals(d)); -assert.ok(!d.equals(e)); -assert.ok(d.equals(d)); -assert.ok(d.equals(new Uint8Array([0x61, 0x62, 0x63, 0x64, 0x65]))); - -assert.throws( - () => Buffer.alloc(1).equals('abc'), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "otherBuffer" argument must be an instance of ' + - "Buffer or Uint8Array. Received type string ('abc')" - } -); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js b/cli/tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js deleted file mode 100644 index fc822ec86..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-failed-alloc-typed-arrays.js +++ /dev/null @@ -1,40 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const SlowBuffer = require('buffer').SlowBuffer; - -// Test failed or zero-sized Buffer allocations not affecting typed arrays. -// This test exists because of a regression that occurred. Because Buffer -// instances are allocated with the same underlying allocator as TypedArrays, -// but Buffer's can optional be non-zero filled, there was a regression that -// occurred when a Buffer allocated failed, the internal flag specifying -// whether or not to zero-fill was not being reset, causing TypedArrays to -// allocate incorrectly. -const zeroArray = new Uint32Array(10).fill(0); -const sizes = [1e10, 0, 0.1, -1, 'a', undefined, null, NaN]; -const allocators = [ - Buffer, - SlowBuffer, - Buffer.alloc, - Buffer.allocUnsafe, - Buffer.allocUnsafeSlow, -]; -for (const allocator of allocators) { - for (const size of sizes) { - try { - // Some of these allocations are known to fail. If they do, - // Uint32Array should still produce a zeroed out result. - allocator(size); - } catch { - assert.deepStrictEqual(zeroArray, new Uint32Array(10)); - } - } -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-fakes.js b/cli/tests/node_compat/test/parallel/test-buffer-fakes.js deleted file mode 100644 index 2e25d6219..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-fakes.js +++ /dev/null @@ -1,61 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -function FakeBuffer() { } -Object.setPrototypeOf(FakeBuffer, Buffer); -Object.setPrototypeOf(FakeBuffer.prototype, Buffer.prototype); - -const fb = new FakeBuffer(); - -assert.throws(function() { - Buffer.from(fb); -}, TypeError); - -assert.throws(function() { - +Buffer.prototype; // eslint-disable-line no-unused-expressions -}, TypeError); - -assert.throws(function() { - Buffer.compare(fb, Buffer.alloc(0)); -}, TypeError); - -assert.throws(function() { - fb.write('foo'); -}, TypeError); - -assert.throws(function() { - Buffer.concat([fb, fb]); -}, TypeError); - -assert.throws(function() { - fb.toString(); -}, TypeError); - -assert.throws(function() { - fb.equals(Buffer.alloc(0)); -}, TypeError); - -assert.throws(function() { - fb.indexOf(5); -}, TypeError); - -assert.throws(function() { - fb.readFloatLE(0); -}, TypeError); - -assert.throws(function() { - fb.writeFloatLE(0); -}, TypeError); - -assert.throws(function() { - fb.fill(0); -}, TypeError); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-from.js b/cli/tests/node_compat/test/parallel/test-buffer-from.js deleted file mode 100644 index 6483e2a63..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-from.js +++ /dev/null @@ -1,73 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { deepStrictEqual, throws } = require('assert'); -// const { runInNewContext } = require('vm'); - -const checkString = 'test'; - -const check = Buffer.from(checkString); - -class MyString extends String { - constructor() { - super(checkString); - } -} - -class MyPrimitive { - [Symbol.toPrimitive]() { - return checkString; - } -} - -class MyBadPrimitive { - [Symbol.toPrimitive]() { - return 1; - } -} - -deepStrictEqual(Buffer.from(new String(checkString)), check); -deepStrictEqual(Buffer.from(new MyString()), check); -deepStrictEqual(Buffer.from(new MyPrimitive()), check); -// TODO(Soremwar) -// Enable once again when vm works correctly -// deepStrictEqual( -// Buffer.from(runInNewContext('new String(checkString)', { checkString })), -// check -// ); - -[ - {}, - new Boolean(true), - { valueOf() { return null; } }, - { valueOf() { return undefined; } }, - { valueOf: null }, - Object.create(null), - new Number(true), - new MyBadPrimitive(), - Symbol(), - 5n, - (one, two, three) => {}, - undefined, - null, -].forEach((input) => { - const errObj = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The first argument must be of type string or an instance of ' + - 'Buffer, ArrayBuffer, or Array or an Array-like Object.' + - common.invalidArgTypeHelper(input) - }; - throws(() => Buffer.from(input), errObj); - throws(() => Buffer.from(input, 'hex'), errObj); -}); - -Buffer.allocUnsafe(10); // Should not throw. -Buffer.from('deadbeaf', 'hex'); // Should not throw. diff --git a/cli/tests/node_compat/test/parallel/test-buffer-includes.js b/cli/tests/node_compat/test/parallel/test-buffer-includes.js deleted file mode 100644 index 797ec8246..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-includes.js +++ /dev/null @@ -1,317 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const b = Buffer.from('abcdef'); -const buf_a = Buffer.from('a'); -const buf_bc = Buffer.from('bc'); -const buf_f = Buffer.from('f'); -const buf_z = Buffer.from('z'); -const buf_empty = Buffer.from(''); - -assert(b.includes('a')); -assert(!b.includes('a', 1)); -assert(!b.includes('a', -1)); -assert(!b.includes('a', -4)); -assert(b.includes('a', -b.length)); -assert(b.includes('a', NaN)); -assert(b.includes('a', -Infinity)); -assert(!b.includes('a', Infinity)); -assert(b.includes('bc')); -assert(!b.includes('bc', 2)); -assert(!b.includes('bc', -1)); -assert(!b.includes('bc', -3)); -assert(b.includes('bc', -5)); -assert(b.includes('bc', NaN)); -assert(b.includes('bc', -Infinity)); -assert(!b.includes('bc', Infinity)); -assert(b.includes('f'), b.length - 1); -assert(!b.includes('z')); -assert(b.includes('')); -assert(b.includes('', 1)); -assert(b.includes('', b.length + 1)); -assert(b.includes('', Infinity)); -assert(b.includes(buf_a)); -assert(!b.includes(buf_a, 1)); -assert(!b.includes(buf_a, -1)); -assert(!b.includes(buf_a, -4)); -assert(b.includes(buf_a, -b.length)); -assert(b.includes(buf_a, NaN)); -assert(b.includes(buf_a, -Infinity)); -assert(!b.includes(buf_a, Infinity)); -assert(b.includes(buf_bc)); -assert(!b.includes(buf_bc, 2)); -assert(!b.includes(buf_bc, -1)); -assert(!b.includes(buf_bc, -3)); -assert(b.includes(buf_bc, -5)); -assert(b.includes(buf_bc, NaN)); -assert(b.includes(buf_bc, -Infinity)); -assert(!b.includes(buf_bc, Infinity)); -assert(b.includes(buf_f), b.length - 1); -assert(!b.includes(buf_z)); -assert(b.includes(buf_empty)); -assert(b.includes(buf_empty, 1)); -assert(b.includes(buf_empty, b.length + 1)); -assert(b.includes(buf_empty, Infinity)); -assert(b.includes(0x61)); -assert(!b.includes(0x61, 1)); -assert(!b.includes(0x61, -1)); -assert(!b.includes(0x61, -4)); -assert(b.includes(0x61, -b.length)); -assert(b.includes(0x61, NaN)); -assert(b.includes(0x61, -Infinity)); -assert(!b.includes(0x61, Infinity)); -assert(!b.includes(0x0)); - -// test offsets -assert(b.includes('d', 2)); -assert(b.includes('f', 5)); -assert(b.includes('f', -1)); -assert(!b.includes('f', 6)); - -assert(b.includes(Buffer.from('d'), 2)); -assert(b.includes(Buffer.from('f'), 5)); -assert(b.includes(Buffer.from('f'), -1)); -assert(!b.includes(Buffer.from('f'), 6)); - -// TODO(Soremwar) -// Enable again once encoding is taking into account when evaluating indexOf -// assert(!Buffer.from('ff').includes(Buffer.from('f'), 1, 'ucs2')); - -// test hex encoding -assert.strictEqual( - Buffer.from(b.toString('hex'), 'hex') - .includes('64', 0, 'hex'), - true -); -assert.strictEqual( - Buffer.from(b.toString('hex'), 'hex') - .includes(Buffer.from('64', 'hex'), 0, 'hex'), - true -); - -// Test base64 encoding -assert.strictEqual( - Buffer.from(b.toString('base64'), 'base64') - .includes('ZA==', 0, 'base64'), - true -); -assert.strictEqual( - Buffer.from(b.toString('base64'), 'base64') - .includes(Buffer.from('ZA==', 'base64'), 0, 'base64'), - true -); - -// test ascii encoding -assert.strictEqual( - Buffer.from(b.toString('ascii'), 'ascii') - .includes('d', 0, 'ascii'), - true -); -assert.strictEqual( - Buffer.from(b.toString('ascii'), 'ascii') - .includes(Buffer.from('d', 'ascii'), 0, 'ascii'), - true -); - -// Test latin1 encoding -assert.strictEqual( - Buffer.from(b.toString('latin1'), 'latin1') - .includes('d', 0, 'latin1'), - true -); -assert.strictEqual( - Buffer.from(b.toString('latin1'), 'latin1') - .includes(Buffer.from('d', 'latin1'), 0, 'latin1'), - true -); - -// Test binary encoding -assert.strictEqual( - Buffer.from(b.toString('binary'), 'binary') - .includes('d', 0, 'binary'), - true -); -assert.strictEqual( - Buffer.from(b.toString('binary'), 'binary') - .includes(Buffer.from('d', 'binary'), 0, 'binary'), - true -); - - -// test ucs2 encoding -let twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2'); - -assert(twoByteString.includes('\u0395', 4, 'ucs2')); -assert(twoByteString.includes('\u03a3', -4, 'ucs2')); -assert(twoByteString.includes('\u03a3', -6, 'ucs2')); -assert(twoByteString.includes( - Buffer.from('\u03a3', 'ucs2'), -6, 'ucs2')); -assert(!twoByteString.includes('\u03a3', -2, 'ucs2')); - -const mixedByteStringUcs2 = - Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395', 'ucs2'); -assert(mixedByteStringUcs2.includes('bc', 0, 'ucs2')); -assert(mixedByteStringUcs2.includes('\u03a3', 0, 'ucs2')); -assert(!mixedByteStringUcs2.includes('\u0396', 0, 'ucs2')); - -assert.ok( - mixedByteStringUcs2.includes(Buffer.from('bc', 'ucs2'), 0, 'ucs2')); -assert.ok( - mixedByteStringUcs2.includes(Buffer.from('\u03a3', 'ucs2'), 0, 'ucs2')); -assert.ok( - !mixedByteStringUcs2.includes(Buffer.from('\u0396', 'ucs2'), 0, 'ucs2')); - -twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2'); - -// Test single char pattern -assert(twoByteString.includes('\u039a', 0, 'ucs2')); -assert(twoByteString.includes('\u0391', 0, 'ucs2'), 'Alpha'); -assert(twoByteString.includes('\u03a3', 0, 'ucs2'), 'First Sigma'); -assert(twoByteString.includes('\u03a3', 6, 'ucs2'), 'Second Sigma'); -assert(twoByteString.includes('\u0395', 0, 'ucs2'), 'Epsilon'); -assert(!twoByteString.includes('\u0392', 0, 'ucs2'), 'Not beta'); - -// Test multi-char pattern -assert(twoByteString.includes('\u039a\u0391', 0, 'ucs2'), 'Lambda Alpha'); -assert(twoByteString.includes('\u0391\u03a3', 0, 'ucs2'), 'Alpha Sigma'); -assert(twoByteString.includes('\u03a3\u03a3', 0, 'ucs2'), 'Sigma Sigma'); -assert(twoByteString.includes('\u03a3\u0395', 0, 'ucs2'), 'Sigma Epsilon'); - -const mixedByteStringUtf8 = Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395'); -assert(mixedByteStringUtf8.includes('bc')); -assert(mixedByteStringUtf8.includes('bc', 5)); -assert(mixedByteStringUtf8.includes('bc', -8)); -assert(mixedByteStringUtf8.includes('\u03a3')); -assert(!mixedByteStringUtf8.includes('\u0396')); - - -// Test complex string includes algorithms. Only trigger for long strings. -// Long string that isn't a simple repeat of a shorter string. -let longString = 'A'; -for (let i = 66; i < 76; i++) { // from 'B' to 'K' - longString = longString + String.fromCharCode(i) + longString; -} - -const longBufferString = Buffer.from(longString); - -// Pattern of 15 chars, repeated every 16 chars in long -let pattern = 'ABACABADABACABA'; -for (let i = 0; i < longBufferString.length - pattern.length; i += 7) { - const includes = longBufferString.includes(pattern, i); - assert(includes, `Long ABACABA...-string at index ${i}`); -} -assert(longBufferString.includes('AJABACA'), 'Long AJABACA, First J'); -assert(longBufferString.includes('AJABACA', 511), 'Long AJABACA, Second J'); - -pattern = 'JABACABADABACABA'; -assert(longBufferString.includes(pattern), 'Long JABACABA..., First J'); -assert(longBufferString.includes(pattern, 512), 'Long JABACABA..., Second J'); - -// Search for a non-ASCII string in a pure ASCII string. -const asciiString = Buffer.from( - 'arglebargleglopglyfarglebargleglopglyfarglebargleglopglyf'); -assert(!asciiString.includes('\x2061')); -assert(asciiString.includes('leb', 0)); - -// Search in string containing many non-ASCII chars. -const allCodePoints = []; -for (let i = 0; i < 65534; i++) allCodePoints[i] = i; -const allCharsString = String.fromCharCode.apply(String, allCodePoints) + - String.fromCharCode(65534, 65535); -const allCharsBufferUtf8 = Buffer.from(allCharsString); -const allCharsBufferUcs2 = Buffer.from(allCharsString, 'ucs2'); - -// Search for string long enough to trigger complex search with ASCII pattern -// and UC16 subject. -assert(!allCharsBufferUtf8.includes('notfound')); -assert(!allCharsBufferUcs2.includes('notfound')); - -// Find substrings in Utf8. -let lengths = [1, 3, 15]; // Single char, simple and complex. -let indices = [0x5, 0x60, 0x400, 0x680, 0x7ee, 0xFF02, 0x16610, 0x2f77b]; -for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) { - for (let i = 0; i < indices.length; i++) { - const index = indices[i]; - let length = lengths[lengthIndex]; - - if (index + length > 0x7F) { - length = 2 * length; - } - - if (index + length > 0x7FF) { - length = 3 * length; - } - - if (index + length > 0xFFFF) { - length = 4 * length; - } - - const patternBufferUtf8 = allCharsBufferUtf8.slice(index, index + length); - assert(index, allCharsBufferUtf8.includes(patternBufferUtf8)); - - const patternStringUtf8 = patternBufferUtf8.toString(); - assert(index, allCharsBufferUtf8.includes(patternStringUtf8)); - } -} - -// Find substrings in Usc2. -lengths = [2, 4, 16]; // Single char, simple and complex. -indices = [0x5, 0x65, 0x105, 0x205, 0x285, 0x2005, 0x2085, 0xfff0]; -for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) { - for (let i = 0; i < indices.length; i++) { - const index = indices[i] * 2; - const length = lengths[lengthIndex]; - - const patternBufferUcs2 = - allCharsBufferUcs2.slice(index, index + length); - assert.ok( - allCharsBufferUcs2.includes(patternBufferUcs2, 0, 'ucs2')); - - const patternStringUcs2 = patternBufferUcs2.toString('ucs2'); - assert.ok( - allCharsBufferUcs2.includes(patternStringUcs2, 0, 'ucs2')); - } -} - -[ - () => { }, - {}, - [], -].forEach((val) => { - assert.throws( - () => b.includes(val), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "value" argument must be one of type number or string ' + - 'or an instance of Buffer or Uint8Array.' + - common.invalidArgTypeHelper(val) - } - ); -}); - -// Test truncation of Number arguments to uint8 -// TODO(Soremwar) -// Enable once multi byte number search is available -// { -// const buf = Buffer.from('this is a test'); -// assert.ok(buf.includes(0x6973)); -// assert.ok(buf.includes(0x697320)); -// assert.ok(buf.includes(0x69732069)); -// assert.ok(buf.includes(0x697374657374)); -// assert.ok(buf.includes(0x69737374)); -// assert.ok(buf.includes(0x69737465)); -// assert.ok(buf.includes(0x69737465)); -// assert.ok(buf.includes(-140)); -// assert.ok(buf.includes(-152)); -// assert.ok(!buf.includes(0xff)); -// assert.ok(!buf.includes(0xffff)); -// } diff --git a/cli/tests/node_compat/test/parallel/test-buffer-indexof.js b/cli/tests/node_compat/test/parallel/test-buffer-indexof.js deleted file mode 100644 index 802e0208b..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-indexof.js +++ /dev/null @@ -1,646 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const b = Buffer.from('abcdef'); -const buf_a = Buffer.from('a'); -const buf_bc = Buffer.from('bc'); -const buf_f = Buffer.from('f'); -const buf_z = Buffer.from('z'); -const buf_empty = Buffer.from(''); - -const s = 'abcdef'; - -assert.strictEqual(b.indexOf('a'), 0); -assert.strictEqual(b.indexOf('a', 1), -1); -assert.strictEqual(b.indexOf('a', -1), -1); -assert.strictEqual(b.indexOf('a', -4), -1); -assert.strictEqual(b.indexOf('a', -b.length), 0); -assert.strictEqual(b.indexOf('a', NaN), 0); -assert.strictEqual(b.indexOf('a', -Infinity), 0); -assert.strictEqual(b.indexOf('a', Infinity), -1); -assert.strictEqual(b.indexOf('bc'), 1); -assert.strictEqual(b.indexOf('bc', 2), -1); -assert.strictEqual(b.indexOf('bc', -1), -1); -assert.strictEqual(b.indexOf('bc', -3), -1); -assert.strictEqual(b.indexOf('bc', -5), 1); -assert.strictEqual(b.indexOf('bc', NaN), 1); -assert.strictEqual(b.indexOf('bc', -Infinity), 1); -assert.strictEqual(b.indexOf('bc', Infinity), -1); -assert.strictEqual(b.indexOf('f'), b.length - 1); -assert.strictEqual(b.indexOf('z'), -1); -assert.strictEqual(b.indexOf(''), 0); -assert.strictEqual(b.indexOf('', 1), 1); -assert.strictEqual(b.indexOf('', b.length + 1), b.length); -assert.strictEqual(b.indexOf('', Infinity), b.length); -assert.strictEqual(b.indexOf(buf_a), 0); -assert.strictEqual(b.indexOf(buf_a, 1), -1); -assert.strictEqual(b.indexOf(buf_a, -1), -1); -assert.strictEqual(b.indexOf(buf_a, -4), -1); -assert.strictEqual(b.indexOf(buf_a, -b.length), 0); -assert.strictEqual(b.indexOf(buf_a, NaN), 0); -assert.strictEqual(b.indexOf(buf_a, -Infinity), 0); -assert.strictEqual(b.indexOf(buf_a, Infinity), -1); -assert.strictEqual(b.indexOf(buf_bc), 1); -assert.strictEqual(b.indexOf(buf_bc, 2), -1); -assert.strictEqual(b.indexOf(buf_bc, -1), -1); -assert.strictEqual(b.indexOf(buf_bc, -3), -1); -assert.strictEqual(b.indexOf(buf_bc, -5), 1); -assert.strictEqual(b.indexOf(buf_bc, NaN), 1); -assert.strictEqual(b.indexOf(buf_bc, -Infinity), 1); -assert.strictEqual(b.indexOf(buf_bc, Infinity), -1); -assert.strictEqual(b.indexOf(buf_f), b.length - 1); -assert.strictEqual(b.indexOf(buf_z), -1); -assert.strictEqual(b.indexOf(buf_empty), 0); -assert.strictEqual(b.indexOf(buf_empty, 1), 1); -assert.strictEqual(b.indexOf(buf_empty, b.length + 1), b.length); -assert.strictEqual(b.indexOf(buf_empty, Infinity), b.length); -assert.strictEqual(b.indexOf(0x61), 0); -assert.strictEqual(b.indexOf(0x61, 1), -1); -assert.strictEqual(b.indexOf(0x61, -1), -1); -assert.strictEqual(b.indexOf(0x61, -4), -1); -assert.strictEqual(b.indexOf(0x61, -b.length), 0); -assert.strictEqual(b.indexOf(0x61, NaN), 0); -assert.strictEqual(b.indexOf(0x61, -Infinity), 0); -assert.strictEqual(b.indexOf(0x61, Infinity), -1); -assert.strictEqual(b.indexOf(0x0), -1); - -// test offsets -assert.strictEqual(b.indexOf('d', 2), 3); -assert.strictEqual(b.indexOf('f', 5), 5); -assert.strictEqual(b.indexOf('f', -1), 5); -assert.strictEqual(b.indexOf('f', 6), -1); - -assert.strictEqual(b.indexOf(Buffer.from('d'), 2), 3); -assert.strictEqual(b.indexOf(Buffer.from('f'), 5), 5); -assert.strictEqual(b.indexOf(Buffer.from('f'), -1), 5); -assert.strictEqual(b.indexOf(Buffer.from('f'), 6), -1); - -// TODO(Soremwar) -// Enable again once encoding is taking into account when evaluating indexOf -// assert.strictEqual(Buffer.from('ff').indexOf(Buffer.from('f'), 1, 'ucs2'), -1); - -// Test invalid and uppercase encoding -assert.strictEqual(b.indexOf('b', 'utf8'), 1); -assert.strictEqual(b.indexOf('b', 'UTF8'), 1); -assert.strictEqual(b.indexOf('62', 'HEX'), 1); -assert.throws(() => b.indexOf('bad', 'enc'), /Unknown encoding: enc/); - -// test hex encoding -assert.strictEqual( - Buffer.from(b.toString('hex'), 'hex') - .indexOf('64', 0, 'hex'), - 3 -); -assert.strictEqual( - Buffer.from(b.toString('hex'), 'hex') - .indexOf(Buffer.from('64', 'hex'), 0, 'hex'), - 3 -); - -// Test base64 encoding -assert.strictEqual( - Buffer.from(b.toString('base64'), 'base64') - .indexOf('ZA==', 0, 'base64'), - 3 -); -assert.strictEqual( - Buffer.from(b.toString('base64'), 'base64') - .indexOf(Buffer.from('ZA==', 'base64'), 0, 'base64'), - 3 -); - -// Test base64url encoding -assert.strictEqual( - Buffer.from(b.toString('base64url'), 'base64url') - .indexOf('ZA==', 0, 'base64url'), - 3 -); - -// test ascii encoding -assert.strictEqual( - Buffer.from(b.toString('ascii'), 'ascii') - .indexOf('d', 0, 'ascii'), - 3 -); -assert.strictEqual( - Buffer.from(b.toString('ascii'), 'ascii') - .indexOf(Buffer.from('d', 'ascii'), 0, 'ascii'), - 3 -); - -// Test latin1 encoding -assert.strictEqual( - Buffer.from(b.toString('latin1'), 'latin1') - .indexOf('d', 0, 'latin1'), - 3 -); -assert.strictEqual( - Buffer.from(b.toString('latin1'), 'latin1') - .indexOf(Buffer.from('d', 'latin1'), 0, 'latin1'), - 3 -); -assert.strictEqual( - Buffer.from('aa\u00e8aa', 'latin1') - .indexOf('\u00e8', 'latin1'), - 2 -); -assert.strictEqual( - Buffer.from('\u00e8', 'latin1') - .indexOf('\u00e8', 'latin1'), - 0 -); -assert.strictEqual( - Buffer.from('\u00e8', 'latin1') - .indexOf(Buffer.from('\u00e8', 'latin1'), 'latin1'), - 0 -); - -// Test binary encoding -assert.strictEqual( - Buffer.from(b.toString('binary'), 'binary') - .indexOf('d', 0, 'binary'), - 3 -); -assert.strictEqual( - Buffer.from(b.toString('binary'), 'binary') - .indexOf(Buffer.from('d', 'binary'), 0, 'binary'), - 3 -); -assert.strictEqual( - Buffer.from('aa\u00e8aa', 'binary') - .indexOf('\u00e8', 'binary'), - 2 -); -assert.strictEqual( - Buffer.from('\u00e8', 'binary') - .indexOf('\u00e8', 'binary'), - 0 -); -assert.strictEqual( - Buffer.from('\u00e8', 'binary') - .indexOf(Buffer.from('\u00e8', 'binary'), 'binary'), - 0 -); - - -// Test optional offset with passed encoding -assert.strictEqual(Buffer.from('aaaa0').indexOf('30', 'hex'), 4); -assert.strictEqual(Buffer.from('aaaa00a').indexOf('3030', 'hex'), 4); - -{ - // Test usc2 and utf16le encoding - ['ucs2', 'utf16le'].forEach((encoding) => { - const twoByteString = Buffer.from( - '\u039a\u0391\u03a3\u03a3\u0395', encoding); - - assert.strictEqual(twoByteString.indexOf('\u0395', 4, encoding), 8); - assert.strictEqual(twoByteString.indexOf('\u03a3', -4, encoding), 6); - assert.strictEqual(twoByteString.indexOf('\u03a3', -6, encoding), 4); - assert.strictEqual(twoByteString.indexOf( - Buffer.from('\u03a3', encoding), -6, encoding), 4); - assert.strictEqual(-1, twoByteString.indexOf('\u03a3', -2, encoding)); - }); -} - -const mixedByteStringUcs2 = - Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395', 'ucs2'); -assert.strictEqual(mixedByteStringUcs2.indexOf('bc', 0, 'ucs2'), 6); -assert.strictEqual(mixedByteStringUcs2.indexOf('\u03a3', 0, 'ucs2'), 10); -assert.strictEqual(-1, mixedByteStringUcs2.indexOf('\u0396', 0, 'ucs2')); - -assert.strictEqual( - mixedByteStringUcs2.indexOf(Buffer.from('bc', 'ucs2'), 0, 'ucs2'), 6); -assert.strictEqual( - mixedByteStringUcs2.indexOf(Buffer.from('\u03a3', 'ucs2'), 0, 'ucs2'), 10); -assert.strictEqual( - -1, mixedByteStringUcs2.indexOf(Buffer.from('\u0396', 'ucs2'), 0, 'ucs2')); - -{ - const twoByteString = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2'); - - // Test single char pattern - assert.strictEqual(twoByteString.indexOf('\u039a', 0, 'ucs2'), 0); - let index = twoByteString.indexOf('\u0391', 0, 'ucs2'); - assert.strictEqual(index, 2, `Alpha - at index ${index}`); - index = twoByteString.indexOf('\u03a3', 0, 'ucs2'); - assert.strictEqual(index, 4, `First Sigma - at index ${index}`); - index = twoByteString.indexOf('\u03a3', 6, 'ucs2'); - assert.strictEqual(index, 6, `Second Sigma - at index ${index}`); - index = twoByteString.indexOf('\u0395', 0, 'ucs2'); - assert.strictEqual(index, 8, `Epsilon - at index ${index}`); - index = twoByteString.indexOf('\u0392', 0, 'ucs2'); - assert.strictEqual(-1, index, `Not beta - at index ${index}`); - - // Test multi-char pattern - index = twoByteString.indexOf('\u039a\u0391', 0, 'ucs2'); - assert.strictEqual(index, 0, `Lambda Alpha - at index ${index}`); - index = twoByteString.indexOf('\u0391\u03a3', 0, 'ucs2'); - assert.strictEqual(index, 2, `Alpha Sigma - at index ${index}`); - index = twoByteString.indexOf('\u03a3\u03a3', 0, 'ucs2'); - assert.strictEqual(index, 4, `Sigma Sigma - at index ${index}`); - index = twoByteString.indexOf('\u03a3\u0395', 0, 'ucs2'); - assert.strictEqual(index, 6, `Sigma Epsilon - at index ${index}`); -} - -const mixedByteStringUtf8 = Buffer.from('\u039a\u0391abc\u03a3\u03a3\u0395'); -assert.strictEqual(mixedByteStringUtf8.indexOf('bc'), 5); -assert.strictEqual(mixedByteStringUtf8.indexOf('bc', 5), 5); -assert.strictEqual(mixedByteStringUtf8.indexOf('bc', -8), 5); -assert.strictEqual(mixedByteStringUtf8.indexOf('\u03a3'), 7); -assert.strictEqual(mixedByteStringUtf8.indexOf('\u0396'), -1); - - -// Test complex string indexOf algorithms. Only trigger for long strings. -// Long string that isn't a simple repeat of a shorter string. -let longString = 'A'; -for (let i = 66; i < 76; i++) { // from 'B' to 'K' - longString = longString + String.fromCharCode(i) + longString; -} - -const longBufferString = Buffer.from(longString); - -// Pattern of 15 chars, repeated every 16 chars in long -let pattern = 'ABACABADABACABA'; -for (let i = 0; i < longBufferString.length - pattern.length; i += 7) { - const index = longBufferString.indexOf(pattern, i); - assert.strictEqual((i + 15) & ~0xf, index, - `Long ABACABA...-string at index ${i}`); -} - -let index = longBufferString.indexOf('AJABACA'); -assert.strictEqual(index, 510, `Long AJABACA, First J - at index ${index}`); -index = longBufferString.indexOf('AJABACA', 511); -assert.strictEqual(index, 1534, `Long AJABACA, Second J - at index ${index}`); - -pattern = 'JABACABADABACABA'; -index = longBufferString.indexOf(pattern); -assert.strictEqual(index, 511, `Long JABACABA..., First J - at index ${index}`); -index = longBufferString.indexOf(pattern, 512); -assert.strictEqual( - index, 1535, `Long JABACABA..., Second J - at index ${index}`); - -// Search for a non-ASCII string in a pure ASCII string. -const asciiString = Buffer.from( - 'arglebargleglopglyfarglebargleglopglyfarglebargleglopglyf'); -assert.strictEqual(-1, asciiString.indexOf('\x2061')); -assert.strictEqual(asciiString.indexOf('leb', 0), 3); - -// Search in string containing many non-ASCII chars. -const allCodePoints = []; -for (let i = 0; i < 65534; i++) allCodePoints[i] = i; -const allCharsString = String.fromCharCode.apply(String, allCodePoints) + - String.fromCharCode(65534, 65535); -const allCharsBufferUtf8 = Buffer.from(allCharsString); -const allCharsBufferUcs2 = Buffer.from(allCharsString, 'ucs2'); - -// Search for string long enough to trigger complex search with ASCII pattern -// and UC16 subject. -assert.strictEqual(-1, allCharsBufferUtf8.indexOf('notfound')); -assert.strictEqual(-1, allCharsBufferUcs2.indexOf('notfound')); - -// Needle is longer than haystack, but only because it's encoded as UTF-16 -assert.strictEqual(Buffer.from('aaaa').indexOf('a'.repeat(4), 'ucs2'), -1); - -assert.strictEqual(Buffer.from('aaaa').indexOf('a'.repeat(4), 'utf8'), 0); -assert.strictEqual(Buffer.from('aaaa').indexOf('你好', 'ucs2'), -1); - -// Haystack has odd length, but the needle is UCS2. -assert.strictEqual(Buffer.from('aaaaa').indexOf('b', 'ucs2'), -1); - -{ - // Find substrings in Utf8. - const lengths = [1, 3, 15]; // Single char, simple and complex. - const indices = [0x5, 0x60, 0x400, 0x680, 0x7ee, 0xFF02, 0x16610, 0x2f77b]; - for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) { - for (let i = 0; i < indices.length; i++) { - const index = indices[i]; - let length = lengths[lengthIndex]; - - if (index + length > 0x7F) { - length = 2 * length; - } - - if (index + length > 0x7FF) { - length = 3 * length; - } - - if (index + length > 0xFFFF) { - length = 4 * length; - } - - const patternBufferUtf8 = allCharsBufferUtf8.slice(index, index + length); - assert.strictEqual(index, allCharsBufferUtf8.indexOf(patternBufferUtf8)); - - const patternStringUtf8 = patternBufferUtf8.toString(); - assert.strictEqual(index, allCharsBufferUtf8.indexOf(patternStringUtf8)); - } - } -} - -// TODO(Soremwar) -// Enable again once encoding is taking into account when evaluating indexOf -// { -// // Find substrings in Usc2. -// const lengths = [2, 4, 16]; // Single char, simple and complex. -// const indices = [0x5, 0x65, 0x105, 0x205, 0x285, 0x2005, 0x2085, 0xfff0]; -// for (let lengthIndex = 0; lengthIndex < lengths.length; lengthIndex++) { -// for (let i = 0; i < indices.length; i++) { -// const index = indices[i] * 2; -// const length = lengths[lengthIndex]; - -// const patternBufferUcs2 = -// allCharsBufferUcs2.slice(index, index + length); -// assert.strictEqual( -// index, allCharsBufferUcs2.indexOf(patternBufferUcs2, 0, 'ucs2')); - -// const patternStringUcs2 = patternBufferUcs2.toString('ucs2'); -// assert.strictEqual( -// index, allCharsBufferUcs2.indexOf(patternStringUcs2, 0, 'ucs2')); -// } -// } -// } - -[ - () => {}, - {}, - [], -].forEach((val) => { - assert.throws( - () => b.indexOf(val), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "value" argument must be one of type number or string ' + - 'or an instance of Buffer or Uint8Array.' + - common.invalidArgTypeHelper(val) - } - ); -}); - -// Test weird offset arguments. -// The following offsets coerce to NaN or 0, searching the whole Buffer -assert.strictEqual(b.indexOf('b', undefined), 1); -assert.strictEqual(b.indexOf('b', {}), 1); -assert.strictEqual(b.indexOf('b', 0), 1); -assert.strictEqual(b.indexOf('b', null), 1); -assert.strictEqual(b.indexOf('b', []), 1); - -// The following offset coerces to 2, in other words +[2] === 2 -assert.strictEqual(b.indexOf('b', [2]), -1); - -// Behavior should match String.indexOf() -assert.strictEqual( - b.indexOf('b', undefined), - s.indexOf('b', undefined)); -assert.strictEqual( - b.indexOf('b', {}), - s.indexOf('b', {})); -assert.strictEqual( - b.indexOf('b', 0), - s.indexOf('b', 0)); -assert.strictEqual( - b.indexOf('b', null), - s.indexOf('b', null)); -assert.strictEqual( - b.indexOf('b', []), - s.indexOf('b', [])); -assert.strictEqual( - b.indexOf('b', [2]), - s.indexOf('b', [2])); - -// All code for handling encodings is shared between Buffer.indexOf and -// Buffer.lastIndexOf, so only testing the separate lastIndexOf semantics. - -// Test lastIndexOf basic functionality; Buffer b contains 'abcdef'. -// lastIndexOf string: -assert.strictEqual(b.lastIndexOf('a'), 0); -assert.strictEqual(b.lastIndexOf('a', 1), 0); -assert.strictEqual(b.lastIndexOf('b', 1), 1); -assert.strictEqual(b.lastIndexOf('c', 1), -1); -assert.strictEqual(b.lastIndexOf('a', -1), 0); -assert.strictEqual(b.lastIndexOf('a', -4), 0); -assert.strictEqual(b.lastIndexOf('a', -b.length), 0); -assert.strictEqual(b.lastIndexOf('a', -b.length - 1), -1); -assert.strictEqual(b.lastIndexOf('a', NaN), 0); -assert.strictEqual(b.lastIndexOf('a', -Infinity), -1); -assert.strictEqual(b.lastIndexOf('a', Infinity), 0); -// lastIndexOf Buffer: -assert.strictEqual(b.lastIndexOf(buf_a), 0); -assert.strictEqual(b.lastIndexOf(buf_a, 1), 0); -assert.strictEqual(b.lastIndexOf(buf_a, -1), 0); -assert.strictEqual(b.lastIndexOf(buf_a, -4), 0); -assert.strictEqual(b.lastIndexOf(buf_a, -b.length), 0); -assert.strictEqual(b.lastIndexOf(buf_a, -b.length - 1), -1); -assert.strictEqual(b.lastIndexOf(buf_a, NaN), 0); -assert.strictEqual(b.lastIndexOf(buf_a, -Infinity), -1); -assert.strictEqual(b.lastIndexOf(buf_a, Infinity), 0); -assert.strictEqual(b.lastIndexOf(buf_bc), 1); -assert.strictEqual(b.lastIndexOf(buf_bc, 2), 1); -assert.strictEqual(b.lastIndexOf(buf_bc, -1), 1); -assert.strictEqual(b.lastIndexOf(buf_bc, -3), 1); -assert.strictEqual(b.lastIndexOf(buf_bc, -5), 1); -assert.strictEqual(b.lastIndexOf(buf_bc, -6), -1); -assert.strictEqual(b.lastIndexOf(buf_bc, NaN), 1); -assert.strictEqual(b.lastIndexOf(buf_bc, -Infinity), -1); -assert.strictEqual(b.lastIndexOf(buf_bc, Infinity), 1); -assert.strictEqual(b.lastIndexOf(buf_f), b.length - 1); -assert.strictEqual(b.lastIndexOf(buf_z), -1); -assert.strictEqual(b.lastIndexOf(buf_empty), b.length); -assert.strictEqual(b.lastIndexOf(buf_empty, 1), 1); -assert.strictEqual(b.lastIndexOf(buf_empty, b.length + 1), b.length); -assert.strictEqual(b.lastIndexOf(buf_empty, Infinity), b.length); -// lastIndexOf number: -assert.strictEqual(b.lastIndexOf(0x61), 0); -assert.strictEqual(b.lastIndexOf(0x61, 1), 0); -assert.strictEqual(b.lastIndexOf(0x61, -1), 0); -assert.strictEqual(b.lastIndexOf(0x61, -4), 0); -assert.strictEqual(b.lastIndexOf(0x61, -b.length), 0); -assert.strictEqual(b.lastIndexOf(0x61, -b.length - 1), -1); -assert.strictEqual(b.lastIndexOf(0x61, NaN), 0); -assert.strictEqual(b.lastIndexOf(0x61, -Infinity), -1); -assert.strictEqual(b.lastIndexOf(0x61, Infinity), 0); -assert.strictEqual(b.lastIndexOf(0x0), -1); - -// Test weird offset arguments. -// The following offsets coerce to NaN, searching the whole Buffer -assert.strictEqual(b.lastIndexOf('b', undefined), 1); -assert.strictEqual(b.lastIndexOf('b', {}), 1); - -// The following offsets coerce to 0 -assert.strictEqual(b.lastIndexOf('b', 0), -1); -assert.strictEqual(b.lastIndexOf('b', null), -1); -assert.strictEqual(b.lastIndexOf('b', []), -1); - -// The following offset coerces to 2, in other words +[2] === 2 -assert.strictEqual(b.lastIndexOf('b', [2]), 1); - -// Behavior should match String.lastIndexOf() -assert.strictEqual( - b.lastIndexOf('b', undefined), - s.lastIndexOf('b', undefined)); -assert.strictEqual( - b.lastIndexOf('b', {}), - s.lastIndexOf('b', {})); -assert.strictEqual( - b.lastIndexOf('b', 0), - s.lastIndexOf('b', 0)); -assert.strictEqual( - b.lastIndexOf('b', null), - s.lastIndexOf('b', null)); -assert.strictEqual( - b.lastIndexOf('b', []), - s.lastIndexOf('b', [])); -assert.strictEqual( - b.lastIndexOf('b', [2]), - s.lastIndexOf('b', [2])); - -// Test needles longer than the haystack. -assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 'ucs2'), -1); -assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 'utf8'), -1); -assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 'latin1'), -1); -assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 'binary'), -1); -assert.strictEqual(b.lastIndexOf(Buffer.from('aaaaaaaaaaaaaaa')), -1); -assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 2, 'ucs2'), -1); -assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 3, 'utf8'), -1); -assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 5, 'latin1'), -1); -assert.strictEqual(b.lastIndexOf('aaaaaaaaaaaaaaa', 5, 'binary'), -1); -assert.strictEqual(b.lastIndexOf(Buffer.from('aaaaaaaaaaaaaaa'), 7), -1); - -// 你好 expands to a total of 6 bytes using UTF-8 and 4 bytes using UTF-16 -assert.strictEqual(buf_bc.lastIndexOf('你好', 'ucs2'), -1); -assert.strictEqual(buf_bc.lastIndexOf('你好', 'utf8'), -1); -assert.strictEqual(buf_bc.lastIndexOf('你好', 'latin1'), -1); -assert.strictEqual(buf_bc.lastIndexOf('你好', 'binary'), -1); -assert.strictEqual(buf_bc.lastIndexOf(Buffer.from('你好')), -1); -assert.strictEqual(buf_bc.lastIndexOf('你好', 2, 'ucs2'), -1); -assert.strictEqual(buf_bc.lastIndexOf('你好', 3, 'utf8'), -1); -assert.strictEqual(buf_bc.lastIndexOf('你好', 5, 'latin1'), -1); -assert.strictEqual(buf_bc.lastIndexOf('你好', 5, 'binary'), -1); -assert.strictEqual(buf_bc.lastIndexOf(Buffer.from('你好'), 7), -1); - -// Test lastIndexOf on a longer buffer: -const bufferString = Buffer.from('a man a plan a canal panama'); -assert.strictEqual(bufferString.lastIndexOf('canal'), 15); -assert.strictEqual(bufferString.lastIndexOf('panama'), 21); -assert.strictEqual(bufferString.lastIndexOf('a man a plan a canal panama'), 0); -assert.strictEqual(-1, bufferString.lastIndexOf('a man a plan a canal mexico')); -assert.strictEqual(-1, bufferString - .lastIndexOf('a man a plan a canal mexico city')); -assert.strictEqual(-1, bufferString.lastIndexOf(Buffer.from('a'.repeat(1000)))); -assert.strictEqual(bufferString.lastIndexOf('a man a plan', 4), 0); -assert.strictEqual(bufferString.lastIndexOf('a '), 13); -assert.strictEqual(bufferString.lastIndexOf('a ', 13), 13); -assert.strictEqual(bufferString.lastIndexOf('a ', 12), 6); -assert.strictEqual(bufferString.lastIndexOf('a ', 5), 0); -assert.strictEqual(bufferString.lastIndexOf('a ', -1), 13); -assert.strictEqual(bufferString.lastIndexOf('a ', -27), 0); -assert.strictEqual(-1, bufferString.lastIndexOf('a ', -28)); - -// Test lastIndexOf for the case that the first character can be found, -// but in a part of the buffer that does not make search to search -// due do length constraints. -const abInUCS2 = Buffer.from('ab', 'ucs2'); -assert.strictEqual(-1, Buffer.from('µaaaa¶bbbb', 'latin1').lastIndexOf('µ')); -assert.strictEqual(-1, Buffer.from('µaaaa¶bbbb', 'binary').lastIndexOf('µ')); -assert.strictEqual(-1, Buffer.from('bc').lastIndexOf('ab')); -assert.strictEqual(-1, Buffer.from('abc').lastIndexOf('qa')); -assert.strictEqual(-1, Buffer.from('abcdef').lastIndexOf('qabc')); -assert.strictEqual(-1, Buffer.from('bc').lastIndexOf(Buffer.from('ab'))); -assert.strictEqual(-1, Buffer.from('bc', 'ucs2').lastIndexOf('ab', 'ucs2')); -assert.strictEqual(-1, Buffer.from('bc', 'ucs2').lastIndexOf(abInUCS2)); - -assert.strictEqual(Buffer.from('abc').lastIndexOf('ab'), 0); -assert.strictEqual(Buffer.from('abc').lastIndexOf('ab', 1), 0); -assert.strictEqual(Buffer.from('abc').lastIndexOf('ab', 2), 0); -assert.strictEqual(Buffer.from('abc').lastIndexOf('ab', 3), 0); - -// The above tests test the LINEAR and SINGLE-CHAR strategies. -// Now, we test the BOYER-MOORE-HORSPOOL strategy. -// Test lastIndexOf on a long buffer w multiple matches: -pattern = 'JABACABADABACABA'; -assert.strictEqual(longBufferString.lastIndexOf(pattern), 1535); -assert.strictEqual(longBufferString.lastIndexOf(pattern, 1535), 1535); -assert.strictEqual(longBufferString.lastIndexOf(pattern, 1534), 511); - -// Finally, give it a really long input to trigger fallback from BMH to -// regular BOYER-MOORE (which has better worst-case complexity). - -// Generate a really long Thue-Morse sequence of 'yolo' and 'swag', -// "yolo swag swag yolo swag yolo yolo swag" ..., goes on for about 5MB. -// This is hard to search because it all looks similar, but never repeats. - -// countBits returns the number of bits in the binary representation of n. -function countBits(n) { - let count; - for (count = 0; n > 0; count++) { - n = n & (n - 1); // remove top bit - } - return count; -} -const parts = []; -for (let i = 0; i < 1000000; i++) { - parts.push((countBits(i) % 2 === 0) ? 'yolo' : 'swag'); -} -const reallyLong = Buffer.from(parts.join(' ')); -assert.strictEqual(reallyLong.slice(0, 19).toString(), 'yolo swag swag yolo'); - -// Expensive reverse searches. Stress test lastIndexOf: -pattern = reallyLong.slice(0, 100000); // First 1/50th of the pattern. -assert.strictEqual(reallyLong.lastIndexOf(pattern), 4751360); -assert.strictEqual(reallyLong.lastIndexOf(pattern, 4000000), 3932160); -assert.strictEqual(reallyLong.lastIndexOf(pattern, 3000000), 2949120); -pattern = reallyLong.slice(100000, 200000); // Second 1/50th. -assert.strictEqual(reallyLong.lastIndexOf(pattern), 4728480); -pattern = reallyLong.slice(0, 1000000); // First 1/5th. -assert.strictEqual(reallyLong.lastIndexOf(pattern), 3932160); -pattern = reallyLong.slice(0, 2000000); // first 2/5ths. -assert.strictEqual(reallyLong.lastIndexOf(pattern), 0); - -// Test truncation of Number arguments to uint8 -// TODO(Soremwar) -// Enable once multi byte number search is available -// { -// const buf = Buffer.from('this is a test'); -// assert.strictEqual(buf.indexOf(0x6973), 3); -// assert.strictEqual(buf.indexOf(0x697320), 4); -// assert.strictEqual(buf.indexOf(0x69732069), 2); -// assert.strictEqual(buf.indexOf(0x697374657374), 0); -// assert.strictEqual(buf.indexOf(0x69737374), 0); -// assert.strictEqual(buf.indexOf(0x69737465), 11); -// assert.strictEqual(buf.indexOf(0x69737465), 11); -// assert.strictEqual(buf.indexOf(-140), 0); -// assert.strictEqual(buf.indexOf(-152), 1); -// assert.strictEqual(buf.indexOf(0xff), -1); -// assert.strictEqual(buf.indexOf(0xffff), -1); -// } - -// Test that Uint8Array arguments are okay. -{ - const needle = new Uint8Array([ 0x66, 0x6f, 0x6f ]); - const haystack = Buffer.from('a foo b foo'); - assert.strictEqual(haystack.indexOf(needle), 2); - assert.strictEqual(haystack.lastIndexOf(needle), haystack.length - 3); -} - -// Avoid abort because of invalid usage -// see https://github.com/nodejs/node/issues/32753 -{ - assert.throws(() => { - const buffer = require('buffer'); - new buffer.Buffer.prototype.lastIndexOf(1, 'str'); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "buffer" argument must be an instance of Buffer, ' + - 'TypedArray, or DataView. ' + - 'Received an instance of lastIndexOf' - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-inheritance.js b/cli/tests/node_compat/test/parallel/test-buffer-inheritance.js deleted file mode 100644 index 6440a84cb..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-inheritance.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - - -function T(n) { - const ui8 = new Uint8Array(n); - Object.setPrototypeOf(ui8, T.prototype); - return ui8; -} -Object.setPrototypeOf(T.prototype, Buffer.prototype); -Object.setPrototypeOf(T, Buffer); - -T.prototype.sum = function sum() { - let cntr = 0; - for (let i = 0; i < this.length; i++) - cntr += this[i]; - return cntr; -}; - - -const vals = [new T(4), T(4)]; - -vals.forEach(function(t) { - assert.strictEqual(t.constructor, T); - assert.strictEqual(Object.getPrototypeOf(t), T.prototype); - assert.strictEqual(Object.getPrototypeOf(Object.getPrototypeOf(t)), - Buffer.prototype); - - t.fill(5); - let cntr = 0; - for (let i = 0; i < t.length; i++) - cntr += t[i]; - assert.strictEqual(cntr, t.length * 5); - - // Check this does not throw - t.toString(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-isencoding.js b/cli/tests/node_compat/test/parallel/test-buffer-isencoding.js deleted file mode 100644 index 439e6860a..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-isencoding.js +++ /dev/null @@ -1,45 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -[ - 'hex', - 'utf8', - 'utf-8', - 'ascii', - 'latin1', - 'binary', - 'base64', - 'base64url', - 'ucs2', - 'ucs-2', - 'utf16le', - 'utf-16le', -].forEach((enc) => { - assert.strictEqual(Buffer.isEncoding(enc), true); -}); - -[ - 'utf9', - 'utf-7', - 'Unicode-FTW', - 'new gnu gun', - false, - NaN, - {}, - Infinity, - [], - 1, - 0, - -1, -].forEach((enc) => { - assert.strictEqual(Buffer.isEncoding(enc), false); -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-iterator.js b/cli/tests/node_compat/test/parallel/test-buffer-iterator.js deleted file mode 100644 index 8ac97e259..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-iterator.js +++ /dev/null @@ -1,69 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -const buffer = Buffer.from([1, 2, 3, 4, 5]); -let arr; -let b; - -// Buffers should be iterable - -arr = []; - -for (b of buffer) - arr.push(b); - -assert.deepStrictEqual(arr, [1, 2, 3, 4, 5]); - - -// Buffer iterators should be iterable - -arr = []; - -for (b of buffer[Symbol.iterator]()) - arr.push(b); - -assert.deepStrictEqual(arr, [1, 2, 3, 4, 5]); - - -// buffer#values() should return iterator for values - -arr = []; - -for (b of buffer.values()) - arr.push(b); - -assert.deepStrictEqual(arr, [1, 2, 3, 4, 5]); - - -// buffer#keys() should return iterator for keys - -arr = []; - -for (b of buffer.keys()) - arr.push(b); - -assert.deepStrictEqual(arr, [0, 1, 2, 3, 4]); - - -// buffer#entries() should return iterator for entries - -arr = []; - -for (b of buffer.entries()) - arr.push(b); - -assert.deepStrictEqual(arr, [ - [0, 1], - [1, 2], - [2, 3], - [3, 4], - [4, 5], -]); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-new.js b/cli/tests/node_compat/test/parallel/test-buffer-new.js deleted file mode 100644 index d15138327..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-new.js +++ /dev/null @@ -1,18 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -assert.throws(() => new Buffer(42, 'utf8'), { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "string" argument must be of type string. Received type ' + - 'number (42)' -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js b/cli/tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js deleted file mode 100644 index df4a6cb52..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-no-negative-allocation.js +++ /dev/null @@ -1,45 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const { SlowBuffer } = require('buffer'); - -const msg = { - code: 'ERR_INVALID_ARG_VALUE', - name: 'RangeError', - message: /^The argument 'size' is invalid\. Received [^"]*$/ -}; - -// Test that negative Buffer length inputs throw errors. - -assert.throws(() => Buffer(-Buffer.poolSize), msg); -assert.throws(() => Buffer(-100), msg); -assert.throws(() => Buffer(-1), msg); -assert.throws(() => Buffer(NaN), msg); - -assert.throws(() => Buffer.alloc(-Buffer.poolSize), msg); -assert.throws(() => Buffer.alloc(-100), msg); -assert.throws(() => Buffer.alloc(-1), msg); -assert.throws(() => Buffer.alloc(NaN), msg); - -assert.throws(() => Buffer.allocUnsafe(-Buffer.poolSize), msg); -assert.throws(() => Buffer.allocUnsafe(-100), msg); -assert.throws(() => Buffer.allocUnsafe(-1), msg); -assert.throws(() => Buffer.allocUnsafe(NaN), msg); - -assert.throws(() => Buffer.allocUnsafeSlow(-Buffer.poolSize), msg); -assert.throws(() => Buffer.allocUnsafeSlow(-100), msg); -assert.throws(() => Buffer.allocUnsafeSlow(-1), msg); -assert.throws(() => Buffer.allocUnsafeSlow(NaN), msg); - -assert.throws(() => SlowBuffer(-Buffer.poolSize), msg); -assert.throws(() => SlowBuffer(-100), msg); -assert.throws(() => SlowBuffer(-1), msg); -assert.throws(() => SlowBuffer(NaN), msg); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js b/cli/tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js deleted file mode 100644 index a6320d0b0..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-nopendingdep-map.js +++ /dev/null @@ -1,20 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --no-warnings --pending-deprecation -'use strict'; - -const common = require('../common'); - -process.on('warning', common.mustNotCall('A warning should not be emitted')); - -// With the --pending-deprecation flag, the deprecation warning for -// new Buffer() should not be emitted when Uint8Array methods are called. - -Buffer.from('abc').map((i) => i); -Buffer.from('abc').filter((i) => i); -Buffer.from('abc').slice(1, 2); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js b/cli/tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js deleted file mode 100644 index b2b48d51d..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-of-no-deprecation.js +++ /dev/null @@ -1,14 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -process.on('warning', common.mustNotCall()); - -Buffer.of(0, 1); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-over-max-length.js b/cli/tests/node_compat/test/parallel/test-buffer-over-max-length.js deleted file mode 100644 index c10c1e9d1..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-over-max-length.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -const assert = require('assert'); - -const buffer = require('buffer'); -const SlowBuffer = buffer.SlowBuffer; - -const kMaxLength = buffer.kMaxLength; -const bufferMaxSizeMsg = { - code: 'ERR_INVALID_ARG_VALUE', - name: 'RangeError', - message: /^The argument 'size' is invalid\. Received [^"]*$/ -}; - -assert.throws(() => Buffer((-1 >>> 0) + 2), bufferMaxSizeMsg); -assert.throws(() => SlowBuffer((-1 >>> 0) + 2), bufferMaxSizeMsg); -assert.throws(() => Buffer.alloc((-1 >>> 0) + 2), bufferMaxSizeMsg); -assert.throws(() => Buffer.allocUnsafe((-1 >>> 0) + 2), bufferMaxSizeMsg); -assert.throws(() => Buffer.allocUnsafeSlow((-1 >>> 0) + 2), bufferMaxSizeMsg); - -assert.throws(() => Buffer(kMaxLength + 1), bufferMaxSizeMsg); -assert.throws(() => SlowBuffer(kMaxLength + 1), bufferMaxSizeMsg); -assert.throws(() => Buffer.alloc(kMaxLength + 1), bufferMaxSizeMsg); -assert.throws(() => Buffer.allocUnsafe(kMaxLength + 1), bufferMaxSizeMsg); -assert.throws(() => Buffer.allocUnsafeSlow(kMaxLength + 1), bufferMaxSizeMsg); - -// issue GH-4331 -assert.throws(() => Buffer.allocUnsafe(0x100000001), bufferMaxSizeMsg); -assert.throws(() => Buffer.allocUnsafe(0xFFFFFFFFF), bufferMaxSizeMsg); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-parent-property.js b/cli/tests/node_compat/test/parallel/test-buffer-parent-property.js deleted file mode 100644 index 6efc42d06..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-parent-property.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Fix for https://github.com/nodejs/node/issues/8266 -// -// Zero length Buffer objects should expose the `buffer` property of the -// TypedArrays, via the `parent` property. -require('../common'); -const assert = require('assert'); - -// If the length of the buffer object is zero -assert((new Buffer(0)).parent instanceof ArrayBuffer); - -// If the length of the buffer object is equal to the underlying ArrayBuffer -assert((new Buffer(Buffer.poolSize)).parent instanceof ArrayBuffer); - -// Same as the previous test, but with user created buffer -const arrayBuffer = new ArrayBuffer(0); -assert.strictEqual(new Buffer(arrayBuffer).parent, arrayBuffer); -assert.strictEqual(new Buffer(arrayBuffer).buffer, arrayBuffer); -assert.strictEqual(Buffer.from(arrayBuffer).parent, arrayBuffer); -assert.strictEqual(Buffer.from(arrayBuffer).buffer, arrayBuffer); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-read.js b/cli/tests/node_compat/test/parallel/test-buffer-read.js deleted file mode 100644 index 391b309a8..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-read.js +++ /dev/null @@ -1,113 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -// Testing basic buffer read functions -const buf = Buffer.from([0xa4, 0xfd, 0x48, 0xea, 0xcf, 0xff, 0xd9, 0x01, 0xde]); - -function read(buff, funx, args, expected) { - assert.strictEqual(buff[funx](...args), expected); - assert.throws( - () => buff[funx](-1, args[1]), - { code: 'ERR_OUT_OF_RANGE' } - ); -} - -// Testing basic functionality of readDoubleBE() and readDoubleLE() -read(buf, 'readDoubleBE', [1], -3.1827727774563287e+295); -read(buf, 'readDoubleLE', [1], -6.966010051009108e+144); - -// Testing basic functionality of readFloatBE() and readFloatLE() -read(buf, 'readFloatBE', [1], -1.6691549692541768e+37); -read(buf, 'readFloatLE', [1], -7861303808); - -// Testing basic functionality of readInt8() -read(buf, 'readInt8', [1], -3); - -// Testing basic functionality of readInt16BE() and readInt16LE() -read(buf, 'readInt16BE', [1], -696); -read(buf, 'readInt16LE', [1], 0x48fd); - -// Testing basic functionality of readInt32BE() and readInt32LE() -read(buf, 'readInt32BE', [1], -45552945); -read(buf, 'readInt32LE', [1], -806729475); - -// Testing basic functionality of readIntBE() and readIntLE() -read(buf, 'readIntBE', [1, 1], -3); -read(buf, 'readIntLE', [2, 1], 0x48); - -// Testing basic functionality of readUInt8() -read(buf, 'readUInt8', [1], 0xfd); - -// Testing basic functionality of readUInt16BE() and readUInt16LE() -read(buf, 'readUInt16BE', [2], 0x48ea); -read(buf, 'readUInt16LE', [2], 0xea48); - -// Testing basic functionality of readUInt32BE() and readUInt32LE() -read(buf, 'readUInt32BE', [1], 0xfd48eacf); -read(buf, 'readUInt32LE', [1], 0xcfea48fd); - -// Testing basic functionality of readUIntBE() and readUIntLE() -read(buf, 'readUIntBE', [2, 2], 0x48ea); -read(buf, 'readUIntLE', [2, 2], 0xea48); - -// Error name and message -const OOR_ERROR = -{ - name: 'RangeError' -}; - -const OOB_ERROR = -{ - name: 'RangeError', - message: 'Attempt to access memory outside buffer bounds' -}; - -// Attempt to overflow buffers, similar to previous bug in array buffers -assert.throws( - () => Buffer.allocUnsafe(8).readFloatBE(0xffffffff), OOR_ERROR); - -assert.throws( - () => Buffer.allocUnsafe(8).readFloatLE(0xffffffff), OOR_ERROR); - -// Ensure negative values can't get past offset -assert.throws( - () => Buffer.allocUnsafe(8).readFloatBE(-1), OOR_ERROR); -assert.throws( - () => Buffer.allocUnsafe(8).readFloatLE(-1), OOR_ERROR); - -// Offset checks -{ - const buf = Buffer.allocUnsafe(0); - - assert.throws( - () => buf.readUInt8(0), OOB_ERROR); - assert.throws( - () => buf.readInt8(0), OOB_ERROR); -} - -[16, 32].forEach((bit) => { - const buf = Buffer.allocUnsafe(bit / 8 - 1); - [`Int${bit}B`, `Int${bit}L`, `UInt${bit}B`, `UInt${bit}L`].forEach((fn) => { - assert.throws( - () => buf[`read${fn}E`](0), OOB_ERROR); - }); -}); - -[16, 32].forEach((bits) => { - const buf = Buffer.from([0xFF, 0xFF, 0xFF, 0xFF]); - ['LE', 'BE'].forEach((endian) => { - assert.strictEqual(buf[`readUInt${bits}${endian}`](0), - (0xFFFFFFFF >>> (32 - bits))); - - assert.strictEqual(buf[`readInt${bits}${endian}`](0), - (0xFFFFFFFF >> (32 - bits))); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-readdouble.js b/cli/tests/node_compat/test/parallel/test-buffer-readdouble.js deleted file mode 100644 index f4ab9ba88..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-readdouble.js +++ /dev/null @@ -1,151 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -// Test (64 bit) double -const buffer = Buffer.allocUnsafe(8); - -buffer[0] = 0x55; -buffer[1] = 0x55; -buffer[2] = 0x55; -buffer[3] = 0x55; -buffer[4] = 0x55; -buffer[5] = 0x55; -buffer[6] = 0xd5; -buffer[7] = 0x3f; -assert.strictEqual(buffer.readDoubleBE(0), 1.1945305291680097e+103); -assert.strictEqual(buffer.readDoubleLE(0), 0.3333333333333333); - -buffer[0] = 1; -buffer[1] = 0; -buffer[2] = 0; -buffer[3] = 0; -buffer[4] = 0; -buffer[5] = 0; -buffer[6] = 0xf0; -buffer[7] = 0x3f; -assert.strictEqual(buffer.readDoubleBE(0), 7.291122019655968e-304); -assert.strictEqual(buffer.readDoubleLE(0), 1.0000000000000002); - -buffer[0] = 2; -assert.strictEqual(buffer.readDoubleBE(0), 4.778309726801735e-299); -assert.strictEqual(buffer.readDoubleLE(0), 1.0000000000000004); - -buffer[0] = 1; -buffer[6] = 0; -buffer[7] = 0; -// eslint-disable-next-line no-loss-of-precision -assert.strictEqual(buffer.readDoubleBE(0), 7.291122019556398e-304); -assert.strictEqual(buffer.readDoubleLE(0), 5e-324); - -buffer[0] = 0xff; -buffer[1] = 0xff; -buffer[2] = 0xff; -buffer[3] = 0xff; -buffer[4] = 0xff; -buffer[5] = 0xff; -buffer[6] = 0x0f; -buffer[7] = 0x00; -assert.ok(Number.isNaN(buffer.readDoubleBE(0))); -assert.strictEqual(buffer.readDoubleLE(0), 2.225073858507201e-308); - -buffer[6] = 0xef; -buffer[7] = 0x7f; -assert.ok(Number.isNaN(buffer.readDoubleBE(0))); -assert.strictEqual(buffer.readDoubleLE(0), 1.7976931348623157e+308); - -buffer[0] = 0; -buffer[1] = 0; -buffer[2] = 0; -buffer[3] = 0; -buffer[4] = 0; -buffer[5] = 0; -buffer[6] = 0xf0; -buffer[7] = 0x3f; -assert.strictEqual(buffer.readDoubleBE(0), 3.03865e-319); -assert.strictEqual(buffer.readDoubleLE(0), 1); - -buffer[6] = 0; -buffer[7] = 0x40; -assert.strictEqual(buffer.readDoubleBE(0), 3.16e-322); -assert.strictEqual(buffer.readDoubleLE(0), 2); - -buffer[7] = 0xc0; -assert.strictEqual(buffer.readDoubleBE(0), 9.5e-322); -assert.strictEqual(buffer.readDoubleLE(0), -2); - -buffer[6] = 0x10; -buffer[7] = 0; -assert.strictEqual(buffer.readDoubleBE(0), 2.0237e-320); -assert.strictEqual(buffer.readDoubleLE(0), 2.2250738585072014e-308); - -buffer[6] = 0; -assert.strictEqual(buffer.readDoubleBE(0), 0); -assert.strictEqual(buffer.readDoubleLE(0), 0); -assert.ok(1 / buffer.readDoubleLE(0) >= 0); - -buffer[7] = 0x80; -assert.strictEqual(buffer.readDoubleBE(0), 6.3e-322); -assert.strictEqual(buffer.readDoubleLE(0), -0); -assert.ok(1 / buffer.readDoubleLE(0) < 0); - -buffer[6] = 0xf0; -buffer[7] = 0x7f; -assert.strictEqual(buffer.readDoubleBE(0), 3.0418e-319); -assert.strictEqual(buffer.readDoubleLE(0), Infinity); - -buffer[7] = 0xff; -assert.strictEqual(buffer.readDoubleBE(0), 3.04814e-319); -assert.strictEqual(buffer.readDoubleLE(0), -Infinity); - -['readDoubleLE', 'readDoubleBE'].forEach((fn) => { - - // Verify that default offset works fine. - buffer[fn](undefined); - buffer[fn](); - - ['', '0', null, {}, [], () => {}, true, false].forEach((off) => { - assert.throws( - () => buffer[fn](off), - { code: 'ERR_INVALID_ARG_TYPE' } - ); - }); - - [Infinity, -1, 1].forEach((offset) => { - assert.throws( - () => buffer[fn](offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be >= 0 and <= 0. Received ${offset}` - }); - }); - - assert.throws( - () => Buffer.alloc(1)[fn](1), - { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: 'Attempt to access memory outside buffer bounds' - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => buffer[fn](offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-readfloat.js b/cli/tests/node_compat/test/parallel/test-buffer-readfloat.js deleted file mode 100644 index 780d3a6ac..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-readfloat.js +++ /dev/null @@ -1,113 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -// Test 32 bit float -const buffer = Buffer.alloc(4); - -buffer[0] = 0; -buffer[1] = 0; -buffer[2] = 0x80; -buffer[3] = 0x3f; -assert.strictEqual(buffer.readFloatBE(0), 4.600602988224807e-41); -assert.strictEqual(buffer.readFloatLE(0), 1); - -buffer[0] = 0; -buffer[1] = 0; -buffer[2] = 0; -buffer[3] = 0xc0; -assert.strictEqual(buffer.readFloatBE(0), 2.6904930515036488e-43); -assert.strictEqual(buffer.readFloatLE(0), -2); - -buffer[0] = 0xff; -buffer[1] = 0xff; -buffer[2] = 0x7f; -buffer[3] = 0x7f; -assert.ok(Number.isNaN(buffer.readFloatBE(0))); -assert.strictEqual(buffer.readFloatLE(0), 3.4028234663852886e+38); - -buffer[0] = 0xab; -buffer[1] = 0xaa; -buffer[2] = 0xaa; -buffer[3] = 0x3e; -assert.strictEqual(buffer.readFloatBE(0), -1.2126478207002966e-12); -assert.strictEqual(buffer.readFloatLE(0), 0.3333333432674408); - -buffer[0] = 0; -buffer[1] = 0; -buffer[2] = 0; -buffer[3] = 0; -assert.strictEqual(buffer.readFloatBE(0), 0); -assert.strictEqual(buffer.readFloatLE(0), 0); -assert.ok(1 / buffer.readFloatLE(0) >= 0); - -buffer[3] = 0x80; -assert.strictEqual(buffer.readFloatBE(0), 1.793662034335766e-43); -assert.strictEqual(buffer.readFloatLE(0), -0); -assert.ok(1 / buffer.readFloatLE(0) < 0); - -buffer[0] = 0; -buffer[1] = 0; -buffer[2] = 0x80; -buffer[3] = 0x7f; -assert.strictEqual(buffer.readFloatBE(0), 4.609571298396486e-41); -assert.strictEqual(buffer.readFloatLE(0), Infinity); - -buffer[0] = 0; -buffer[1] = 0; -buffer[2] = 0x80; -buffer[3] = 0xff; -assert.strictEqual(buffer.readFloatBE(0), 4.627507918739843e-41); -assert.strictEqual(buffer.readFloatLE(0), -Infinity); - -['readFloatLE', 'readFloatBE'].forEach((fn) => { - - // Verify that default offset works fine. - buffer[fn](undefined); - buffer[fn](); - - ['', '0', null, {}, [], () => {}, true, false].forEach((off) => { - assert.throws( - () => buffer[fn](off), - { code: 'ERR_INVALID_ARG_TYPE' } - ); - }); - - [Infinity, -1, 1].forEach((offset) => { - assert.throws( - () => buffer[fn](offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be >= 0 and <= 0. Received ${offset}` - }); - }); - - assert.throws( - () => Buffer.alloc(1)[fn](1), - { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: 'Attempt to access memory outside buffer bounds' - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => buffer[fn](offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-readint.js b/cli/tests/node_compat/test/parallel/test-buffer-readint.js deleted file mode 100644 index 0c865eb92..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-readint.js +++ /dev/null @@ -1,204 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -// Test OOB -{ - const buffer = Buffer.alloc(4); - - ['Int8', 'Int16BE', 'Int16LE', 'Int32BE', 'Int32LE'].forEach((fn) => { - - // Verify that default offset works fine. - buffer[`read${fn}`](undefined); - buffer[`read${fn}`](); - - ['', '0', null, {}, [], () => {}, true, false].forEach((o) => { - assert.throws( - () => buffer[`read${fn}`](o), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - }); - - [Infinity, -1, -4294967295].forEach((offset) => { - assert.throws( - () => buffer[`read${fn}`](offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError' - }); - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => buffer[`read${fn}`](offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); - }); -} - -// Test 8 bit signed integers -{ - const data = Buffer.from([0x23, 0xab, 0x7c, 0xef]); - - assert.strictEqual(data.readInt8(0), 0x23); - - data[0] = 0xff; - assert.strictEqual(data.readInt8(0), -1); - - data[0] = 0x87; - assert.strictEqual(data.readInt8(0), -121); - assert.strictEqual(data.readInt8(1), -85); - assert.strictEqual(data.readInt8(2), 124); - assert.strictEqual(data.readInt8(3), -17); -} - -// Test 16 bit integers -{ - const buffer = Buffer.from([0x16, 0x79, 0x65, 0x6e, 0x69, 0x78]); - - assert.strictEqual(buffer.readInt16BE(0), 0x1679); - assert.strictEqual(buffer.readInt16LE(0), 0x7916); - - buffer[0] = 0xff; - buffer[1] = 0x80; - assert.strictEqual(buffer.readInt16BE(0), -128); - assert.strictEqual(buffer.readInt16LE(0), -32513); - - buffer[0] = 0x77; - buffer[1] = 0x65; - assert.strictEqual(buffer.readInt16BE(0), 0x7765); - assert.strictEqual(buffer.readInt16BE(1), 0x6565); - assert.strictEqual(buffer.readInt16BE(2), 0x656e); - assert.strictEqual(buffer.readInt16BE(3), 0x6e69); - assert.strictEqual(buffer.readInt16BE(4), 0x6978); - assert.strictEqual(buffer.readInt16LE(0), 0x6577); - assert.strictEqual(buffer.readInt16LE(1), 0x6565); - assert.strictEqual(buffer.readInt16LE(2), 0x6e65); - assert.strictEqual(buffer.readInt16LE(3), 0x696e); - assert.strictEqual(buffer.readInt16LE(4), 0x7869); -} - -// Test 32 bit integers -{ - const buffer = Buffer.from([0x43, 0x53, 0x16, 0x79, 0x36, 0x17]); - - assert.strictEqual(buffer.readInt32BE(0), 0x43531679); - assert.strictEqual(buffer.readInt32LE(0), 0x79165343); - - buffer[0] = 0xff; - buffer[1] = 0xfe; - buffer[2] = 0xef; - buffer[3] = 0xfa; - assert.strictEqual(buffer.readInt32BE(0), -69638); - assert.strictEqual(buffer.readInt32LE(0), -84934913); - - buffer[0] = 0x42; - buffer[1] = 0xc3; - buffer[2] = 0x95; - buffer[3] = 0xa9; - assert.strictEqual(buffer.readInt32BE(0), 0x42c395a9); - assert.strictEqual(buffer.readInt32BE(1), -1013601994); - assert.strictEqual(buffer.readInt32BE(2), -1784072681); - assert.strictEqual(buffer.readInt32LE(0), -1449802942); - assert.strictEqual(buffer.readInt32LE(1), 917083587); - assert.strictEqual(buffer.readInt32LE(2), 389458325); -} - -// Test Int -{ - const buffer = Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]); - - assert.strictEqual(buffer.readIntLE(0, 1), 0x01); - assert.strictEqual(buffer.readIntBE(0, 1), 0x01); - assert.strictEqual(buffer.readIntLE(0, 3), 0x030201); - assert.strictEqual(buffer.readIntBE(0, 3), 0x010203); - assert.strictEqual(buffer.readIntLE(0, 5), 0x0504030201); - assert.strictEqual(buffer.readIntBE(0, 5), 0x0102030405); - assert.strictEqual(buffer.readIntLE(0, 6), 0x060504030201); - assert.strictEqual(buffer.readIntBE(0, 6), 0x010203040506); - assert.strictEqual(buffer.readIntLE(1, 6), 0x070605040302); - assert.strictEqual(buffer.readIntBE(1, 6), 0x020304050607); - assert.strictEqual(buffer.readIntLE(2, 6), 0x080706050403); - assert.strictEqual(buffer.readIntBE(2, 6), 0x030405060708); - - // Check byteLength. - ['readIntBE', 'readIntLE'].forEach((fn) => { - ['', '0', null, {}, [], () => {}, true, false, undefined].forEach((len) => { - assert.throws( - () => buffer[fn](0, len), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [Infinity, -1].forEach((byteLength) => { - assert.throws( - () => buffer[fn](0, byteLength), - { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "byteLength" is out of range. ' + - `It must be >= 1 and <= 6. Received ${byteLength}` - }); - }); - - [NaN, 1.01].forEach((byteLength) => { - assert.throws( - () => buffer[fn](0, byteLength), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "byteLength" is out of range. ' + - `It must be an integer. Received ${byteLength}` - }); - }); - }); - - // Test 1 to 6 bytes. - for (let i = 1; i <= 6; i++) { - ['readIntBE', 'readIntLE'].forEach((fn) => { - ['', '0', null, {}, [], () => {}, true, false, undefined].forEach((o) => { - assert.throws( - () => buffer[fn](o, i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - }); - - [Infinity, -1, -4294967295].forEach((offset) => { - assert.throws( - () => buffer[fn](offset, i), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be >= 0 and <= ${8 - i}. Received ${offset}` - }); - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => buffer[fn](offset, i), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); - }); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-readuint.js b/cli/tests/node_compat/test/parallel/test-buffer-readuint.js deleted file mode 100644 index bbef6f49a..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-readuint.js +++ /dev/null @@ -1,172 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -// Test OOB -{ - const buffer = Buffer.alloc(4); - - ['UInt8', 'UInt16BE', 'UInt16LE', 'UInt32BE', 'UInt32LE'].forEach((fn) => { - - // Verify that default offset works fine. - buffer[`read${fn}`](undefined); - buffer[`read${fn}`](); - - ['', '0', null, {}, [], () => {}, true, false].forEach((o) => { - assert.throws( - () => buffer[`read${fn}`](o), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - }); - - [Infinity, -1, -4294967295].forEach((offset) => { - assert.throws( - () => buffer[`read${fn}`](offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError' - }); - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => buffer[`read${fn}`](offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); - }); -} - -// Test 8 bit unsigned integers -{ - const data = Buffer.from([0xff, 0x2a, 0x2a, 0x2a]); - assert.strictEqual(data.readUInt8(0), 255); - assert.strictEqual(data.readUInt8(1), 42); - assert.strictEqual(data.readUInt8(2), 42); - assert.strictEqual(data.readUInt8(3), 42); -} - -// Test 16 bit unsigned integers -{ - const data = Buffer.from([0x00, 0x2a, 0x42, 0x3f]); - assert.strictEqual(data.readUInt16BE(0), 0x2a); - assert.strictEqual(data.readUInt16BE(1), 0x2a42); - assert.strictEqual(data.readUInt16BE(2), 0x423f); - assert.strictEqual(data.readUInt16LE(0), 0x2a00); - assert.strictEqual(data.readUInt16LE(1), 0x422a); - assert.strictEqual(data.readUInt16LE(2), 0x3f42); - - data[0] = 0xfe; - data[1] = 0xfe; - assert.strictEqual(data.readUInt16BE(0), 0xfefe); - assert.strictEqual(data.readUInt16LE(0), 0xfefe); -} - -// Test 32 bit unsigned integers -{ - const data = Buffer.from([0x32, 0x65, 0x42, 0x56, 0x23, 0xff]); - assert.strictEqual(data.readUInt32BE(0), 0x32654256); - assert.strictEqual(data.readUInt32BE(1), 0x65425623); - assert.strictEqual(data.readUInt32BE(2), 0x425623ff); - assert.strictEqual(data.readUInt32LE(0), 0x56426532); - assert.strictEqual(data.readUInt32LE(1), 0x23564265); - assert.strictEqual(data.readUInt32LE(2), 0xff235642); -} - -// Test UInt -{ - const buffer = Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]); - - assert.strictEqual(buffer.readUIntLE(0, 1), 0x01); - assert.strictEqual(buffer.readUIntBE(0, 1), 0x01); - assert.strictEqual(buffer.readUIntLE(0, 3), 0x030201); - assert.strictEqual(buffer.readUIntBE(0, 3), 0x010203); - assert.strictEqual(buffer.readUIntLE(0, 5), 0x0504030201); - assert.strictEqual(buffer.readUIntBE(0, 5), 0x0102030405); - assert.strictEqual(buffer.readUIntLE(0, 6), 0x060504030201); - assert.strictEqual(buffer.readUIntBE(0, 6), 0x010203040506); - assert.strictEqual(buffer.readUIntLE(1, 6), 0x070605040302); - assert.strictEqual(buffer.readUIntBE(1, 6), 0x020304050607); - assert.strictEqual(buffer.readUIntLE(2, 6), 0x080706050403); - assert.strictEqual(buffer.readUIntBE(2, 6), 0x030405060708); - - // Check byteLength. - ['readUIntBE', 'readUIntLE'].forEach((fn) => { - ['', '0', null, {}, [], () => {}, true, false, undefined].forEach((len) => { - assert.throws( - () => buffer[fn](0, len), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [Infinity, -1].forEach((byteLength) => { - assert.throws( - () => buffer[fn](0, byteLength), - { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "byteLength" is out of range. ' + - `It must be >= 1 and <= 6. Received ${byteLength}` - }); - }); - - [NaN, 1.01].forEach((byteLength) => { - assert.throws( - () => buffer[fn](0, byteLength), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "byteLength" is out of range. ' + - `It must be an integer. Received ${byteLength}` - }); - }); - }); - - // Test 1 to 6 bytes. - for (let i = 1; i <= 6; i++) { - ['readUIntBE', 'readUIntLE'].forEach((fn) => { - ['', '0', null, {}, [], () => {}, true, false, undefined].forEach((o) => { - assert.throws( - () => buffer[fn](o, i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - }); - - [Infinity, -1, -4294967295].forEach((offset) => { - assert.throws( - () => buffer[fn](offset, i), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be >= 0 and <= ${8 - i}. Received ${offset}` - }); - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => buffer[fn](offset, i), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); - }); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-safe-unsafe.js b/cli/tests/node_compat/test/parallel/test-buffer-safe-unsafe.js deleted file mode 100644 index 180af8993..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-safe-unsafe.js +++ /dev/null @@ -1,31 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -const safe = Buffer.alloc(10); - -function isZeroFilled(buf) { - for (let n = 0; n < buf.length; n++) - if (buf[n] !== 0) return false; - return true; -} - -assert(isZeroFilled(safe)); - -// Test that unsafe allocations doesn't affect subsequent safe allocations -Buffer.allocUnsafe(10); -assert(isZeroFilled(new Float64Array(10))); - -new Buffer(10); -assert(isZeroFilled(new Float64Array(10))); - -Buffer.allocUnsafe(10); -assert(isZeroFilled(Buffer.alloc(10))); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-slice.js b/cli/tests/node_compat/test/parallel/test-buffer-slice.js deleted file mode 100644 index 518618d8d..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-slice.js +++ /dev/null @@ -1,136 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -require('../common'); -const assert = require('assert'); - -assert.strictEqual(Buffer.from('hello', 'utf8').slice(0, 0).length, 0); -assert.strictEqual(Buffer('hello', 'utf8').slice(0, 0).length, 0); - -const buf = Buffer.from('0123456789', 'utf8'); -const expectedSameBufs = [ - [buf.slice(-10, 10), Buffer.from('0123456789', 'utf8')], - [buf.slice(-20, 10), Buffer.from('0123456789', 'utf8')], - [buf.slice(-20, -10), Buffer.from('', 'utf8')], - [buf.slice(), Buffer.from('0123456789', 'utf8')], - [buf.slice(0), Buffer.from('0123456789', 'utf8')], - [buf.slice(0, 0), Buffer.from('', 'utf8')], - [buf.slice(undefined), Buffer.from('0123456789', 'utf8')], - [buf.slice('foobar'), Buffer.from('0123456789', 'utf8')], - [buf.slice(undefined, undefined), Buffer.from('0123456789', 'utf8')], - [buf.slice(2), Buffer.from('23456789', 'utf8')], - [buf.slice(5), Buffer.from('56789', 'utf8')], - [buf.slice(10), Buffer.from('', 'utf8')], - [buf.slice(5, 8), Buffer.from('567', 'utf8')], - [buf.slice(8, -1), Buffer.from('8', 'utf8')], - [buf.slice(-10), Buffer.from('0123456789', 'utf8')], - [buf.slice(0, -9), Buffer.from('0', 'utf8')], - [buf.slice(0, -10), Buffer.from('', 'utf8')], - [buf.slice(0, -1), Buffer.from('012345678', 'utf8')], - [buf.slice(2, -2), Buffer.from('234567', 'utf8')], - [buf.slice(0, 65536), Buffer.from('0123456789', 'utf8')], - [buf.slice(65536, 0), Buffer.from('', 'utf8')], - [buf.slice(-5, -8), Buffer.from('', 'utf8')], - [buf.slice(-5, -3), Buffer.from('56', 'utf8')], - [buf.slice(-10, 10), Buffer.from('0123456789', 'utf8')], - [buf.slice('0', '1'), Buffer.from('0', 'utf8')], - [buf.slice('-5', '10'), Buffer.from('56789', 'utf8')], - [buf.slice('-10', '10'), Buffer.from('0123456789', 'utf8')], - [buf.slice('-10', '-5'), Buffer.from('01234', 'utf8')], - [buf.slice('-10', '-0'), Buffer.from('', 'utf8')], - [buf.slice('111'), Buffer.from('', 'utf8')], - [buf.slice('0', '-111'), Buffer.from('', 'utf8')], -]; - -for (let i = 0, s = buf.toString(); i < buf.length; ++i) { - expectedSameBufs.push( - [buf.slice(i), Buffer.from(s.slice(i))], - [buf.slice(0, i), Buffer.from(s.slice(0, i))], - [buf.slice(-i), Buffer.from(s.slice(-i))], - [buf.slice(0, -i), Buffer.from(s.slice(0, -i))] - ); -} - -expectedSameBufs.forEach(([buf1, buf2]) => { - assert.strictEqual(Buffer.compare(buf1, buf2), 0); -}); - -const utf16Buf = Buffer.from('0123456789', 'utf16le'); -assert.deepStrictEqual(utf16Buf.slice(0, 6), Buffer.from('012', 'utf16le')); -// Try to slice a zero length Buffer. -// See https://github.com/joyent/node/issues/5881 -assert.strictEqual(Buffer.alloc(0).slice(0, 1).length, 0); - -{ - // Single argument slice - assert.strictEqual(Buffer.from('abcde', 'utf8').slice(1).toString('utf8'), - 'bcde'); -} - -// slice(0,0).length === 0 -assert.strictEqual(Buffer.from('hello', 'utf8').slice(0, 0).length, 0); - -{ - // Regression tests for https://github.com/nodejs/node/issues/9096 - const buf = Buffer.from('abcd', 'utf8'); - assert.strictEqual(buf.slice(buf.length / 3).toString('utf8'), 'bcd'); - assert.strictEqual( - buf.slice(buf.length / 3, buf.length).toString(), - 'bcd' - ); -} - -{ - const buf = Buffer.from('abcdefg', 'utf8'); - assert.strictEqual(buf.slice(-(-1 >>> 0) - 1).toString('utf8'), - buf.toString('utf8')); -} - -{ - const buf = Buffer.from('abc', 'utf8'); - assert.strictEqual(buf.slice(-0.5).toString('utf8'), buf.toString('utf8')); -} - -{ - const buf = Buffer.from([ - 1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0, - 0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0, - ]); - const chunk1 = Buffer.from([ - 1, 29, 0, 0, 1, 143, 216, 162, 92, 254, 248, 63, 0, - ]); - const chunk2 = Buffer.from([ - 0, 0, 18, 184, 6, 0, 175, 29, 0, 8, 11, 1, 0, 0, - ]); - const middle = buf.length / 2; - - assert.deepStrictEqual(buf.slice(0, middle), chunk1); - assert.deepStrictEqual(buf.slice(middle), chunk2); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-slow.js b/cli/tests/node_compat/test/parallel/test-buffer-slow.js deleted file mode 100644 index eed2898c5..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-slow.js +++ /dev/null @@ -1,69 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const buffer = require('buffer'); -const SlowBuffer = buffer.SlowBuffer; - -const ones = [1, 1, 1, 1]; - -// Should create a Buffer -let sb = SlowBuffer(4); -assert(sb instanceof Buffer); -assert.strictEqual(sb.length, 4); -sb.fill(1); -for (const [key, value] of sb.entries()) { - assert.deepStrictEqual(value, ones[key]); -} - -// underlying ArrayBuffer should have the same length -assert.strictEqual(sb.buffer.byteLength, 4); - -// Should work without new -sb = SlowBuffer(4); -assert(sb instanceof Buffer); -assert.strictEqual(sb.length, 4); -sb.fill(1); -for (const [key, value] of sb.entries()) { - assert.deepStrictEqual(value, ones[key]); -} - -// Should work with edge cases -assert.strictEqual(SlowBuffer(0).length, 0); -try { - assert.strictEqual( - SlowBuffer(buffer.kMaxLength).length, buffer.kMaxLength); -} catch (e) { - // Don't match on message as it is from the JavaScript engine. V8 and - // ChakraCore provide different messages. - assert.strictEqual(e.name, 'RangeError'); -} - -// Should throw with invalid length type -const bufferInvalidTypeMsg = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /^The "size" argument must be of type number/, -}; -assert.throws(() => SlowBuffer(), bufferInvalidTypeMsg); -assert.throws(() => SlowBuffer({}), bufferInvalidTypeMsg); -assert.throws(() => SlowBuffer('6'), bufferInvalidTypeMsg); -assert.throws(() => SlowBuffer(true), bufferInvalidTypeMsg); - -// Should throw with invalid length value -const bufferMaxSizeMsg = { - code: 'ERR_INVALID_ARG_VALUE', - name: 'RangeError', - message: /^The argument 'size' is invalid\. Received [^"]*$/ -}; -assert.throws(() => SlowBuffer(NaN), bufferMaxSizeMsg); -assert.throws(() => SlowBuffer(Infinity), bufferMaxSizeMsg); -assert.throws(() => SlowBuffer(-1), bufferMaxSizeMsg); -assert.throws(() => SlowBuffer(buffer.kMaxLength + 1), bufferMaxSizeMsg); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-swap.js b/cli/tests/node_compat/test/parallel/test-buffer-swap.js deleted file mode 100644 index 8e1315601..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-swap.js +++ /dev/null @@ -1,159 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -// Test buffers small enough to use the JS implementation -{ - const buf = Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10]); - - assert.strictEqual(buf, buf.swap16()); - assert.deepStrictEqual(buf, Buffer.from([0x02, 0x01, 0x04, 0x03, 0x06, 0x05, - 0x08, 0x07, 0x0a, 0x09, 0x0c, 0x0b, - 0x0e, 0x0d, 0x10, 0x0f])); - buf.swap16(); // restore - - assert.strictEqual(buf, buf.swap32()); - assert.deepStrictEqual(buf, Buffer.from([0x04, 0x03, 0x02, 0x01, 0x08, 0x07, - 0x06, 0x05, 0x0c, 0x0b, 0x0a, 0x09, - 0x10, 0x0f, 0x0e, 0x0d])); - buf.swap32(); // restore - - assert.strictEqual(buf, buf.swap64()); - assert.deepStrictEqual(buf, Buffer.from([0x08, 0x07, 0x06, 0x05, 0x04, 0x03, - 0x02, 0x01, 0x10, 0x0f, 0x0e, 0x0d, - 0x0c, 0x0b, 0x0a, 0x09])); -} - -// Operates in-place -{ - const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7]); - buf.slice(1, 5).swap32(); - assert.deepStrictEqual(buf, Buffer.from([0x1, 0x5, 0x4, 0x3, 0x2, 0x6, 0x7])); - buf.slice(1, 5).swap16(); - assert.deepStrictEqual(buf, Buffer.from([0x1, 0x4, 0x5, 0x2, 0x3, 0x6, 0x7])); - - // Length assertions - const re16 = /Buffer size must be a multiple of 16-bits/; - const re32 = /Buffer size must be a multiple of 32-bits/; - const re64 = /Buffer size must be a multiple of 64-bits/; - - assert.throws(() => Buffer.from(buf).swap16(), re16); - assert.throws(() => Buffer.alloc(1025).swap16(), re16); - assert.throws(() => Buffer.from(buf).swap32(), re32); - assert.throws(() => buf.slice(1, 3).swap32(), re32); - assert.throws(() => Buffer.alloc(1025).swap32(), re32); - assert.throws(() => buf.slice(1, 3).swap64(), re64); - assert.throws(() => Buffer.alloc(1025).swap64(), re64); -} - -{ - const buf = Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10]); - - buf.slice(2, 18).swap64(); - - assert.deepStrictEqual(buf, Buffer.from([0x01, 0x02, 0x0a, 0x09, 0x08, 0x07, - 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, - 0x10, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, - 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, - 0x0f, 0x10])); -} - -// Force use of native code (Buffer size above threshold limit for js impl) -{ - const bufData = new Uint32Array(256).fill(0x04030201); - const buf = Buffer.from(bufData.buffer, bufData.byteOffset); - const otherBufData = new Uint32Array(256).fill(0x03040102); - const otherBuf = Buffer.from(otherBufData.buffer, otherBufData.byteOffset); - buf.swap16(); - assert.deepStrictEqual(buf, otherBuf); -} - -{ - const bufData = new Uint32Array(256).fill(0x04030201); - const buf = Buffer.from(bufData.buffer); - const otherBufData = new Uint32Array(256).fill(0x01020304); - const otherBuf = Buffer.from(otherBufData.buffer, otherBufData.byteOffset); - buf.swap32(); - assert.deepStrictEqual(buf, otherBuf); -} - -{ - const bufData = new Uint8Array(256 * 8); - const otherBufData = new Uint8Array(256 * 8); - for (let i = 0; i < bufData.length; i++) { - bufData[i] = i % 8; - otherBufData[otherBufData.length - i - 1] = i % 8; - } - const buf = Buffer.from(bufData.buffer, bufData.byteOffset); - const otherBuf = Buffer.from(otherBufData.buffer, otherBufData.byteOffset); - buf.swap64(); - assert.deepStrictEqual(buf, otherBuf); -} - -// Test native code with buffers that are not memory-aligned -{ - const bufData = new Uint8Array(256 * 8); - const otherBufData = new Uint8Array(256 * 8 - 2); - for (let i = 0; i < bufData.length; i++) { - bufData[i] = i % 2; - } - for (let i = 1; i < otherBufData.length; i++) { - otherBufData[otherBufData.length - i] = (i + 1) % 2; - } - const buf = Buffer.from(bufData.buffer, bufData.byteOffset); - // 0|1 0|1 0|1... - const otherBuf = Buffer.from(otherBufData.buffer, otherBufData.byteOffset); - // 0|0 1|0 1|0... - - buf.slice(1, buf.length - 1).swap16(); - assert.deepStrictEqual(buf.slice(0, otherBuf.length), otherBuf); -} - -{ - const bufData = new Uint8Array(256 * 8); - const otherBufData = new Uint8Array(256 * 8 - 4); - for (let i = 0; i < bufData.length; i++) { - bufData[i] = i % 4; - } - for (let i = 1; i < otherBufData.length; i++) { - otherBufData[otherBufData.length - i] = (i + 1) % 4; - } - const buf = Buffer.from(bufData.buffer, bufData.byteOffset); - // 0|1 2 3 0|1 2 3... - const otherBuf = Buffer.from(otherBufData.buffer, otherBufData.byteOffset); - // 0|0 3 2 1|0 3 2... - - buf.slice(1, buf.length - 3).swap32(); - assert.deepStrictEqual(buf.slice(0, otherBuf.length), otherBuf); -} - -{ - const bufData = new Uint8Array(256 * 8); - const otherBufData = new Uint8Array(256 * 8 - 8); - for (let i = 0; i < bufData.length; i++) { - bufData[i] = i % 8; - } - for (let i = 1; i < otherBufData.length; i++) { - otherBufData[otherBufData.length - i] = (i + 1) % 8; - } - const buf = Buffer.from(bufData.buffer, bufData.byteOffset); - // 0|1 2 3 4 5 6 7 0|1 2 3 4... - const otherBuf = Buffer.from(otherBufData.buffer, otherBufData.byteOffset); - // 0|0 7 6 5 4 3 2 1|0 7 6 5... - - buf.slice(1, buf.length - 7).swap64(); - assert.deepStrictEqual(buf.slice(0, otherBuf.length), otherBuf); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-tojson.js b/cli/tests/node_compat/test/parallel/test-buffer-tojson.js deleted file mode 100644 index d21786c37..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-tojson.js +++ /dev/null @@ -1,42 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -{ - assert.strictEqual(JSON.stringify(Buffer.alloc(0)), - '{"type":"Buffer","data":[]}'); - assert.strictEqual(JSON.stringify(Buffer.from([1, 2, 3, 4])), - '{"type":"Buffer","data":[1,2,3,4]}'); -} - -// issue GH-7849 -{ - const buf = Buffer.from('test'); - const json = JSON.stringify(buf); - const obj = JSON.parse(json); - const copy = Buffer.from(obj); - - assert.deepStrictEqual(buf, copy); -} - -// GH-5110 -{ - const buffer = Buffer.from('test'); - const string = JSON.stringify(buffer); - - assert.strictEqual(string, '{"type":"Buffer","data":[116,101,115,116]}'); - - function receiver(key, value) { - return value && value.type === 'Buffer' ? Buffer.from(value.data) : value; - } - - assert.deepStrictEqual(buffer, JSON.parse(string, receiver)); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-tostring-range.js b/cli/tests/node_compat/test/parallel/test-buffer-tostring-range.js deleted file mode 100644 index 9fa199bd5..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-tostring-range.js +++ /dev/null @@ -1,107 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -const rangeBuffer = Buffer.from('abc'); - -// If start >= buffer's length, empty string will be returned -assert.strictEqual(rangeBuffer.toString('ascii', 3), ''); -assert.strictEqual(rangeBuffer.toString('ascii', +Infinity), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 3.14, 3), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 'Infinity', 3), ''); - -// If end <= 0, empty string will be returned -assert.strictEqual(rangeBuffer.toString('ascii', 1, 0), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 1, -1.2), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 1, -100), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 1, -Infinity), ''); - -// If start < 0, start will be taken as zero -assert.strictEqual(rangeBuffer.toString('ascii', -1, 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', -1.99, 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', -Infinity, 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', '-1', 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', '-1.99', 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', '-Infinity', 3), 'abc'); - -// If start is an invalid integer, start will be taken as zero -assert.strictEqual(rangeBuffer.toString('ascii', 'node.js', 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', {}, 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', [], 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', NaN, 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', null, 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', undefined, 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', false, 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', '', 3), 'abc'); - -// But, if start is an integer when coerced, then it will be coerced and used. -assert.strictEqual(rangeBuffer.toString('ascii', '-1', 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', '1', 3), 'bc'); -assert.strictEqual(rangeBuffer.toString('ascii', '-Infinity', 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', '3', 3), ''); -assert.strictEqual(rangeBuffer.toString('ascii', Number(3), 3), ''); -assert.strictEqual(rangeBuffer.toString('ascii', '3.14', 3), ''); -assert.strictEqual(rangeBuffer.toString('ascii', '1.99', 3), 'bc'); -assert.strictEqual(rangeBuffer.toString('ascii', '-1.99', 3), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 1.99, 3), 'bc'); -assert.strictEqual(rangeBuffer.toString('ascii', true, 3), 'bc'); - -// If end > buffer's length, end will be taken as buffer's length -assert.strictEqual(rangeBuffer.toString('ascii', 0, 5), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, 6.99), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, Infinity), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, '5'), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, '6.99'), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, 'Infinity'), 'abc'); - -// If end is an invalid integer, end will be taken as buffer's length -assert.strictEqual(rangeBuffer.toString('ascii', 0, 'node.js'), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, {}), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, NaN), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, undefined), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, null), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, []), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, false), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, ''), ''); - -// But, if end is an integer when coerced, then it will be coerced and used. -assert.strictEqual(rangeBuffer.toString('ascii', 0, '-1'), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, '1'), 'a'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, '-Infinity'), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, '3'), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, Number(3)), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, '3.14'), 'abc'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, '1.99'), 'a'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, '-1.99'), ''); -assert.strictEqual(rangeBuffer.toString('ascii', 0, 1.99), 'a'); -assert.strictEqual(rangeBuffer.toString('ascii', 0, true), 'a'); - -// Try toString() with an object as an encoding -assert.strictEqual(rangeBuffer.toString({ toString: function() { - return 'ascii'; -} }), 'abc'); - -// Try toString() with 0 and null as the encoding -assert.throws(() => { - rangeBuffer.toString(0, 1, 2); -}, { - code: 'ERR_UNKNOWN_ENCODING', - name: 'TypeError', - message: 'Unknown encoding: 0' -}); -assert.throws(() => { - rangeBuffer.toString(null, 1, 2); -}, { - code: 'ERR_UNKNOWN_ENCODING', - name: 'TypeError', - message: 'Unknown encoding: null' -}); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js b/cli/tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js deleted file mode 100644 index 793d2d891..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-tostring-rangeerror.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test ensures that Node.js throws a RangeError when trying to convert a -// gigantic buffer into a string. -// Regression test for https://github.com/nodejs/node/issues/649. - -const assert = require('assert'); -const SlowBuffer = require('buffer').SlowBuffer; - -const len = 1422561062959; -const message = { - code: 'ERR_INVALID_ARG_VALUE', - name: 'RangeError', - message: /^The argument 'size' is invalid\. Received [^"]*$/ -}; -assert.throws(() => Buffer(len).toString('utf8'), message); -assert.throws(() => SlowBuffer(len).toString('utf8'), message); -assert.throws(() => Buffer.alloc(len).toString('utf8'), message); -assert.throws(() => Buffer.allocUnsafe(len).toString('utf8'), message); -assert.throws(() => Buffer.allocUnsafeSlow(len).toString('utf8'), message); diff --git a/cli/tests/node_compat/test/parallel/test-buffer-tostring.js b/cli/tests/node_compat/test/parallel/test-buffer-tostring.js deleted file mode 100644 index a6f5cabe0..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-tostring.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); - -// utf8, ucs2, ascii, latin1, utf16le -const encodings = ['utf8', 'utf-8', 'ucs2', 'ucs-2', 'ascii', 'latin1', - 'binary', 'utf16le', 'utf-16le']; - -encodings - .reduce((es, e) => es.concat(e, e.toUpperCase()), []) - .forEach((encoding) => { - assert.strictEqual(Buffer.from('foo', encoding).toString(encoding), 'foo'); - }); - -// base64 -['base64', 'BASE64'].forEach((encoding) => { - assert.strictEqual(Buffer.from('Zm9v', encoding).toString(encoding), 'Zm9v'); -}); - -// hex -['hex', 'HEX'].forEach((encoding) => { - assert.strictEqual(Buffer.from('666f6f', encoding).toString(encoding), - '666f6f'); -}); - -// Invalid encodings -for (let i = 1; i < 10; i++) { - const encoding = String(i).repeat(i); - const error = common.expectsError({ - code: 'ERR_UNKNOWN_ENCODING', - name: 'TypeError', - message: `Unknown encoding: ${encoding}` - }); - assert.ok(!Buffer.isEncoding(encoding)); - assert.throws(() => Buffer.from('foo').toString(encoding), error); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-writedouble.js b/cli/tests/node_compat/test/parallel/test-buffer-writedouble.js deleted file mode 100644 index 3e4d4e676..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-writedouble.js +++ /dev/null @@ -1,140 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Tests to verify doubles are correctly written - -require('../common'); -const assert = require('assert'); - -const buffer = Buffer.allocUnsafe(16); - -buffer.writeDoubleBE(2.225073858507201e-308, 0); -buffer.writeDoubleLE(2.225073858507201e-308, 8); -assert.ok(buffer.equals(new Uint8Array([ - 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, -]))); - -buffer.writeDoubleBE(1.0000000000000004, 0); -buffer.writeDoubleLE(1.0000000000000004, 8); -assert.ok(buffer.equals(new Uint8Array([ - 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, -]))); - -buffer.writeDoubleBE(-2, 0); -buffer.writeDoubleLE(-2, 8); -assert.ok(buffer.equals(new Uint8Array([ - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, -]))); - -buffer.writeDoubleBE(1.7976931348623157e+308, 0); -buffer.writeDoubleLE(1.7976931348623157e+308, 8); -assert.ok(buffer.equals(new Uint8Array([ - 0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, -]))); - -buffer.writeDoubleBE(0 * -1, 0); -buffer.writeDoubleLE(0 * -1, 8); -assert.ok(buffer.equals(new Uint8Array([ - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -]))); - -buffer.writeDoubleBE(Infinity, 0); -buffer.writeDoubleLE(Infinity, 8); - -assert.ok(buffer.equals(new Uint8Array([ - 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, -]))); - -assert.strictEqual(buffer.readDoubleBE(0), Infinity); -assert.strictEqual(buffer.readDoubleLE(8), Infinity); - -buffer.writeDoubleBE(-Infinity, 0); -buffer.writeDoubleLE(-Infinity, 8); - -assert.ok(buffer.equals(new Uint8Array([ - 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, -]))); - -assert.strictEqual(buffer.readDoubleBE(0), -Infinity); -assert.strictEqual(buffer.readDoubleLE(8), -Infinity); - -buffer.writeDoubleBE(NaN, 0); -buffer.writeDoubleLE(NaN, 8); - -// JS only knows a single NaN but there exist two platform specific -// implementations. Therefore, allow both quiet and signalling NaNs. -if (buffer[1] === 0xF7) { - assert.ok(buffer.equals(new Uint8Array([ - 0x7F, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x7F, - ]))); -} else { - assert.ok(buffer.equals(new Uint8Array([ - 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7F, - ]))); -} - -assert.ok(Number.isNaN(buffer.readDoubleBE(0))); -assert.ok(Number.isNaN(buffer.readDoubleLE(8))); - -// OOB in writeDouble{LE,BE} should throw. -{ - const small = Buffer.allocUnsafe(1); - - ['writeDoubleLE', 'writeDoubleBE'].forEach((fn) => { - - // Verify that default offset works fine. - buffer[fn](23, undefined); - buffer[fn](23); - - assert.throws( - () => small[fn](11.11, 0), - { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: 'Attempt to access memory outside buffer bounds' - }); - - ['', '0', null, {}, [], () => {}, true, false].forEach((off) => { - assert.throws( - () => small[fn](23, off), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [Infinity, -1, 9].forEach((offset) => { - assert.throws( - () => buffer[fn](23, offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be >= 0 and <= 8. Received ${offset}` - }); - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => buffer[fn](42, offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-writefloat.js b/cli/tests/node_compat/test/parallel/test-buffer-writefloat.js deleted file mode 100644 index 4dd75f83e..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-writefloat.js +++ /dev/null @@ -1,124 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Tests to verify floats are correctly written - -require('../common'); -const assert = require('assert'); - -const buffer = Buffer.allocUnsafe(8); - -buffer.writeFloatBE(1, 0); -buffer.writeFloatLE(1, 4); -assert.ok(buffer.equals( - new Uint8Array([ 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f ]))); - -buffer.writeFloatBE(1 / 3, 0); -buffer.writeFloatLE(1 / 3, 4); -assert.ok(buffer.equals( - new Uint8Array([ 0x3e, 0xaa, 0xaa, 0xab, 0xab, 0xaa, 0xaa, 0x3e ]))); - -buffer.writeFloatBE(3.4028234663852886e+38, 0); -buffer.writeFloatLE(3.4028234663852886e+38, 4); -assert.ok(buffer.equals( - new Uint8Array([ 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f ]))); - -buffer.writeFloatLE(1.1754943508222875e-38, 0); -buffer.writeFloatBE(1.1754943508222875e-38, 4); -assert.ok(buffer.equals( - new Uint8Array([ 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00 ]))); - -buffer.writeFloatBE(0 * -1, 0); -buffer.writeFloatLE(0 * -1, 4); -assert.ok(buffer.equals( - new Uint8Array([ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80 ]))); - -buffer.writeFloatBE(Infinity, 0); -buffer.writeFloatLE(Infinity, 4); -assert.ok(buffer.equals( - new Uint8Array([ 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F ]))); - -assert.strictEqual(buffer.readFloatBE(0), Infinity); -assert.strictEqual(buffer.readFloatLE(4), Infinity); - -buffer.writeFloatBE(-Infinity, 0); -buffer.writeFloatLE(-Infinity, 4); -assert.ok(buffer.equals( - new Uint8Array([ 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF ]))); - -assert.strictEqual(buffer.readFloatBE(0), -Infinity); -assert.strictEqual(buffer.readFloatLE(4), -Infinity); - -buffer.writeFloatBE(NaN, 0); -buffer.writeFloatLE(NaN, 4); - -// JS only knows a single NaN but there exist two platform specific -// implementations. Therefore, allow both quiet and signalling NaNs. -if (buffer[1] === 0xBF) { - assert.ok( - buffer.equals(new Uint8Array( - [ 0x7F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x7F ]))); -} else { - assert.ok( - buffer.equals(new Uint8Array( - [ 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x7F ]))); -} - -assert.ok(Number.isNaN(buffer.readFloatBE(0))); -assert.ok(Number.isNaN(buffer.readFloatLE(4))); - -// OOB in writeFloat{LE,BE} should throw. -{ - const small = Buffer.allocUnsafe(1); - - ['writeFloatLE', 'writeFloatBE'].forEach((fn) => { - - // Verify that default offset works fine. - buffer[fn](23, undefined); - buffer[fn](23); - - assert.throws( - () => small[fn](11.11, 0), - { - code: 'ERR_BUFFER_OUT_OF_BOUNDS', - name: 'RangeError', - message: 'Attempt to access memory outside buffer bounds' - }); - - ['', '0', null, {}, [], () => {}, true, false].forEach((off) => { - assert.throws( - () => small[fn](23, off), - { code: 'ERR_INVALID_ARG_TYPE' } - ); - }); - - [Infinity, -1, 5].forEach((offset) => { - assert.throws( - () => buffer[fn](23, offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be >= 0 and <= 4. Received ${offset}` - } - ); - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => buffer[fn](42, offset), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-writeint.js b/cli/tests/node_compat/test/parallel/test-buffer-writeint.js deleted file mode 100644 index 117ba47c0..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-writeint.js +++ /dev/null @@ -1,277 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Tests to verify signed integers are correctly written - -require('../common'); -const assert = require('assert'); -const errorOutOfBounds = { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: new RegExp('^The value of "value" is out of range\\. ' + - 'It must be >= -\\d+ and <= \\d+\\. Received .+$') -}; - -// Test 8 bit -{ - const buffer = Buffer.alloc(2); - - buffer.writeInt8(0x23, 0); - buffer.writeInt8(-5, 1); - assert.ok(buffer.equals(new Uint8Array([ 0x23, 0xfb ]))); - - /* Make sure we handle min/max correctly */ - buffer.writeInt8(0x7f, 0); - buffer.writeInt8(-0x80, 1); - assert.ok(buffer.equals(new Uint8Array([ 0x7f, 0x80 ]))); - - assert.throws(() => { - buffer.writeInt8(0x7f + 1, 0); - }, errorOutOfBounds); - assert.throws(() => { - buffer.writeInt8(-0x80 - 1, 0); - }, errorOutOfBounds); - - // Verify that default offset works fine. - buffer.writeInt8(23, undefined); - buffer.writeInt8(23); - - ['', '0', null, {}, [], () => {}, true, false].forEach((off) => { - assert.throws( - () => buffer.writeInt8(23, off), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [NaN, Infinity, -1, 1.01].forEach((off) => { - assert.throws( - () => buffer.writeInt8(23, off), - { code: 'ERR_OUT_OF_RANGE' }); - }); -} - -// Test 16 bit -{ - const buffer = Buffer.alloc(4); - - buffer.writeInt16BE(0x0023, 0); - buffer.writeInt16LE(0x0023, 2); - assert.ok(buffer.equals(new Uint8Array([ 0x00, 0x23, 0x23, 0x00 ]))); - - buffer.writeInt16BE(-5, 0); - buffer.writeInt16LE(-5, 2); - assert.ok(buffer.equals(new Uint8Array([ 0xff, 0xfb, 0xfb, 0xff ]))); - - buffer.writeInt16BE(-1679, 0); - buffer.writeInt16LE(-1679, 2); - assert.ok(buffer.equals(new Uint8Array([ 0xf9, 0x71, 0x71, 0xf9 ]))); - - /* Make sure we handle min/max correctly */ - buffer.writeInt16BE(0x7fff, 0); - buffer.writeInt16BE(-0x8000, 2); - assert.ok(buffer.equals(new Uint8Array([ 0x7f, 0xff, 0x80, 0x00 ]))); - - buffer.writeInt16LE(0x7fff, 0); - buffer.writeInt16LE(-0x8000, 2); - assert.ok(buffer.equals(new Uint8Array([ 0xff, 0x7f, 0x00, 0x80 ]))); - - ['writeInt16BE', 'writeInt16LE'].forEach((fn) => { - - // Verify that default offset works fine. - buffer[fn](23, undefined); - buffer[fn](23); - - assert.throws(() => { - buffer[fn](0x7fff + 1, 0); - }, errorOutOfBounds); - assert.throws(() => { - buffer[fn](-0x8000 - 1, 0); - }, errorOutOfBounds); - - ['', '0', null, {}, [], () => {}, true, false].forEach((off) => { - assert.throws( - () => buffer[fn](23, off), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [NaN, Infinity, -1, 1.01].forEach((off) => { - assert.throws( - () => buffer[fn](23, off), - { code: 'ERR_OUT_OF_RANGE' }); - }); - }); -} - -// Test 32 bit -{ - const buffer = Buffer.alloc(8); - - buffer.writeInt32BE(0x23, 0); - buffer.writeInt32LE(0x23, 4); - assert.ok(buffer.equals(new Uint8Array([ - 0x00, 0x00, 0x00, 0x23, 0x23, 0x00, 0x00, 0x00, - ]))); - - buffer.writeInt32BE(-5, 0); - buffer.writeInt32LE(-5, 4); - assert.ok(buffer.equals(new Uint8Array([ - 0xff, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff, - ]))); - - buffer.writeInt32BE(-805306713, 0); - buffer.writeInt32LE(-805306713, 4); - assert.ok(buffer.equals(new Uint8Array([ - 0xcf, 0xff, 0xfe, 0xa7, 0xa7, 0xfe, 0xff, 0xcf, - ]))); - - /* Make sure we handle min/max correctly */ - buffer.writeInt32BE(0x7fffffff, 0); - buffer.writeInt32BE(-0x80000000, 4); - assert.ok(buffer.equals(new Uint8Array([ - 0x7f, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, - ]))); - - buffer.writeInt32LE(0x7fffffff, 0); - buffer.writeInt32LE(-0x80000000, 4); - assert.ok(buffer.equals(new Uint8Array([ - 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x80, - ]))); - - ['writeInt32BE', 'writeInt32LE'].forEach((fn) => { - - // Verify that default offset works fine. - buffer[fn](23, undefined); - buffer[fn](23); - - assert.throws(() => { - buffer[fn](0x7fffffff + 1, 0); - }, errorOutOfBounds); - assert.throws(() => { - buffer[fn](-0x80000000 - 1, 0); - }, errorOutOfBounds); - - ['', '0', null, {}, [], () => {}, true, false].forEach((off) => { - assert.throws( - () => buffer[fn](23, off), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [NaN, Infinity, -1, 1.01].forEach((off) => { - assert.throws( - () => buffer[fn](23, off), - { code: 'ERR_OUT_OF_RANGE' }); - }); - }); -} - -// Test 48 bit -{ - const value = 0x1234567890ab; - const buffer = Buffer.allocUnsafe(6); - buffer.writeIntBE(value, 0, 6); - assert.ok(buffer.equals(new Uint8Array([ - 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, - ]))); - - buffer.writeIntLE(value, 0, 6); - assert.ok(buffer.equals(new Uint8Array([ - 0xab, 0x90, 0x78, 0x56, 0x34, 0x12, - ]))); -} - -// Test Int -{ - const data = Buffer.alloc(8); - - // Check byteLength. - ['writeIntBE', 'writeIntLE'].forEach((fn) => { - ['', '0', null, {}, [], () => {}, true, false, undefined].forEach((bl) => { - assert.throws( - () => data[fn](23, 0, bl), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [Infinity, -1].forEach((byteLength) => { - assert.throws( - () => data[fn](23, 0, byteLength), - { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "byteLength" is out of range. ' + - `It must be >= 1 and <= 6. Received ${byteLength}` - } - ); - }); - - [NaN, 1.01].forEach((byteLength) => { - assert.throws( - () => data[fn](42, 0, byteLength), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "byteLength" is out of range. ' + - `It must be an integer. Received ${byteLength}` - }); - }); - }); - - // Test 1 to 6 bytes. - for (let i = 1; i <= 6; i++) { - ['writeIntBE', 'writeIntLE'].forEach((fn) => { - const min = -(2 ** (i * 8 - 1)); - const max = 2 ** (i * 8 - 1) - 1; - let range = `>= ${min} and <= ${max}`; - if (i > 4) { - range = `>= -(2 ** ${i * 8 - 1}) and < 2 ** ${i * 8 - 1}`; - } - [min - 1, max + 1].forEach((val) => { - const received = i > 4 ? - String(val).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1_') : - val; - assert.throws(() => { - data[fn](val, 0, i); - }, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "value" is out of range. ' + - `It must be ${range}. Received ${received}` - }); - }); - - ['', '0', null, {}, [], () => {}, true, false, undefined].forEach((o) => { - assert.throws( - () => data[fn](min, o, i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - }); - - [Infinity, -1, -4294967295].forEach((offset) => { - assert.throws( - () => data[fn](min, offset, i), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be >= 0 and <= ${8 - i}. Received ${offset}` - }); - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => data[fn](max, offset, i), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); - }); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-writeuint.js b/cli/tests/node_compat/test/parallel/test-buffer-writeuint.js deleted file mode 100644 index 1c954bb9f..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-writeuint.js +++ /dev/null @@ -1,237 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -// We need to check the following things: -// - We are correctly resolving big endian (doesn't mean anything for 8 bit) -// - Correctly resolving little endian (doesn't mean anything for 8 bit) -// - Correctly using the offsets -// - Correctly interpreting values that are beyond the signed range as unsigned - -{ // OOB - const data = Buffer.alloc(8); - ['UInt8', 'UInt16BE', 'UInt16LE', 'UInt32BE', 'UInt32LE'].forEach((fn) => { - - // Verify that default offset works fine. - data[`write${fn}`](23, undefined); - data[`write${fn}`](23); - - ['', '0', null, {}, [], () => {}, true, false].forEach((o) => { - assert.throws( - () => data[`write${fn}`](23, o), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [NaN, Infinity, -1, 1.01].forEach((o) => { - assert.throws( - () => data[`write${fn}`](23, o), - { code: 'ERR_OUT_OF_RANGE' }); - }); - }); -} - -{ // Test 8 bit - const data = Buffer.alloc(4); - - data.writeUInt8(23, 0); - data.writeUInt8(23, 1); - data.writeUInt8(23, 2); - data.writeUInt8(23, 3); - assert.ok(data.equals(new Uint8Array([23, 23, 23, 23]))); - - data.writeUInt8(23, 0); - data.writeUInt8(23, 1); - data.writeUInt8(23, 2); - data.writeUInt8(23, 3); - assert.ok(data.equals(new Uint8Array([23, 23, 23, 23]))); - - data.writeUInt8(255, 0); - assert.strictEqual(data[0], 255); - - data.writeUInt8(255, 0); - assert.strictEqual(data[0], 255); -} - -// Test 16 bit -{ - let value = 0x2343; - const data = Buffer.alloc(4); - - data.writeUInt16BE(value, 0); - assert.ok(data.equals(new Uint8Array([0x23, 0x43, 0, 0]))); - - data.writeUInt16BE(value, 1); - assert.ok(data.equals(new Uint8Array([0x23, 0x23, 0x43, 0]))); - - data.writeUInt16BE(value, 2); - assert.ok(data.equals(new Uint8Array([0x23, 0x23, 0x23, 0x43]))); - - data.writeUInt16LE(value, 0); - assert.ok(data.equals(new Uint8Array([0x43, 0x23, 0x23, 0x43]))); - - data.writeUInt16LE(value, 1); - assert.ok(data.equals(new Uint8Array([0x43, 0x43, 0x23, 0x43]))); - - data.writeUInt16LE(value, 2); - assert.ok(data.equals(new Uint8Array([0x43, 0x43, 0x43, 0x23]))); - - value = 0xff80; - data.writeUInt16LE(value, 0); - assert.ok(data.equals(new Uint8Array([0x80, 0xff, 0x43, 0x23]))); - - data.writeUInt16BE(value, 0); - assert.ok(data.equals(new Uint8Array([0xff, 0x80, 0x43, 0x23]))); - - value = 0xfffff; - ['writeUInt16BE', 'writeUInt16LE'].forEach((fn) => { - assert.throws( - () => data[fn](value, 0), - { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "value" is out of range. ' + - `It must be >= 0 and <= 65535. Received ${value}` - } - ); - }); -} - -// Test 32 bit -{ - const data = Buffer.alloc(6); - const value = 0xe7f90a6d; - - data.writeUInt32BE(value, 0); - assert.ok(data.equals(new Uint8Array([0xe7, 0xf9, 0x0a, 0x6d, 0, 0]))); - - data.writeUInt32BE(value, 1); - assert.ok(data.equals(new Uint8Array([0xe7, 0xe7, 0xf9, 0x0a, 0x6d, 0]))); - - data.writeUInt32BE(value, 2); - assert.ok(data.equals(new Uint8Array([0xe7, 0xe7, 0xe7, 0xf9, 0x0a, 0x6d]))); - - data.writeUInt32LE(value, 0); - assert.ok(data.equals(new Uint8Array([0x6d, 0x0a, 0xf9, 0xe7, 0x0a, 0x6d]))); - - data.writeUInt32LE(value, 1); - assert.ok(data.equals(new Uint8Array([0x6d, 0x6d, 0x0a, 0xf9, 0xe7, 0x6d]))); - - data.writeUInt32LE(value, 2); - assert.ok(data.equals(new Uint8Array([0x6d, 0x6d, 0x6d, 0x0a, 0xf9, 0xe7]))); -} - -// Test 48 bit -{ - const value = 0x1234567890ab; - const data = Buffer.allocUnsafe(6); - data.writeUIntBE(value, 0, 6); - assert.ok(data.equals(new Uint8Array([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]))); - - data.writeUIntLE(value, 0, 6); - assert.ok(data.equals(new Uint8Array([0xab, 0x90, 0x78, 0x56, 0x34, 0x12]))); -} - -// Test UInt -{ - const data = Buffer.alloc(8); - let val = 0x100; - - // Check byteLength. - ['writeUIntBE', 'writeUIntLE'].forEach((fn) => { - ['', '0', null, {}, [], () => {}, true, false, undefined].forEach((bl) => { - assert.throws( - () => data[fn](23, 0, bl), - { code: 'ERR_INVALID_ARG_TYPE' }); - }); - - [Infinity, -1].forEach((byteLength) => { - assert.throws( - () => data[fn](23, 0, byteLength), - { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "byteLength" is out of range. ' + - `It must be >= 1 and <= 6. Received ${byteLength}` - } - ); - }); - - [NaN, 1.01].forEach((byteLength) => { - assert.throws( - () => data[fn](42, 0, byteLength), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "byteLength" is out of range. ' + - `It must be an integer. Received ${byteLength}` - }); - }); - }); - - // Test 1 to 6 bytes. - for (let i = 1; i <= 6; i++) { - const range = i < 5 ? `= ${val - 1}` : ` 2 ** ${i * 8}`; - const received = i > 4 ? - String(val).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1_') : - val; - ['writeUIntBE', 'writeUIntLE'].forEach((fn) => { - assert.throws(() => { - data[fn](val, 0, i); - }, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "value" is out of range. ' + - `It must be >= 0 and <${range}. Received ${received}` - }); - - ['', '0', null, {}, [], () => {}, true, false].forEach((o) => { - assert.throws( - () => data[fn](23, o, i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - }); - - [Infinity, -1, -4294967295].forEach((offset) => { - assert.throws( - () => data[fn](val - 1, offset, i), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be >= 0 and <= ${8 - i}. Received ${offset}` - }); - }); - - [NaN, 1.01].forEach((offset) => { - assert.throws( - () => data[fn](val - 1, offset, i), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - `It must be an integer. Received ${offset}` - }); - }); - }); - - val *= 0x100; - } -} - -for (const fn of [ - 'UInt8', 'UInt16LE', 'UInt16BE', 'UInt32LE', 'UInt32BE', 'UIntLE', 'UIntBE', - 'BigUInt64LE', 'BigUInt64BE', -]) { - const p = Buffer.prototype; - const lowerFn = fn.replace(/UInt/, 'Uint'); - assert.strictEqual(p[`write${fn}`], p[`write${lowerFn}`]); - assert.strictEqual(p[`read${fn}`], p[`read${lowerFn}`]); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js b/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js deleted file mode 100644 index c3250b870..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-cli.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// Flags: --zero-fill-buffers - -// when using --zero-fill-buffers, every Buffer and SlowBuffer -// instance must be zero filled upon creation - -require('../common'); -const SlowBuffer = require('buffer').SlowBuffer; -const assert = require('assert'); - -function isZeroFilled(buf) { - for (const n of buf) - if (n > 0) return false; - return true; -} - -// This can be somewhat unreliable because the -// allocated memory might just already happen to -// contain all zeroes. The test is run multiple -// times to improve the reliability. -for (let i = 0; i < 50; i++) { - const bufs = [ - Buffer.alloc(20), - Buffer.allocUnsafe(20), - SlowBuffer(20), - Buffer(20), - new SlowBuffer(20), - ]; - for (const buf of bufs) { - assert(isZeroFilled(buf)); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js b/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js deleted file mode 100644 index 1f1baed66..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill-reset.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - - -function testUint8Array(ui) { - const length = ui.length; - for (let i = 0; i < length; i++) - if (ui[i] !== 0) return false; - return true; -} - - -for (let i = 0; i < 100; i++) { - Buffer.alloc(0); - const ui = new Uint8Array(65); - assert.ok(testUint8Array(ui), `Uint8Array is not zero-filled: ${ui}`); -} diff --git a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill.js b/cli/tests/node_compat/test/parallel/test-buffer-zero-fill.js deleted file mode 100644 index be8ce1412..000000000 --- a/cli/tests/node_compat/test/parallel/test-buffer-zero-fill.js +++ /dev/null @@ -1,21 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -// Tests deprecated Buffer API on purpose -const buf1 = Buffer(100); -const buf2 = new Buffer(100); - -for (let n = 0; n < buf1.length; n++) - assert.strictEqual(buf1[n], 0); - -for (let n = 0; n < buf2.length; n++) - assert.strictEqual(buf2[n], 0); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-default-options.js b/cli/tests/node_compat/test/parallel/test-child-process-default-options.js deleted file mode 100644 index 265cfe22f..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-default-options.js +++ /dev/null @@ -1,58 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { isWindows } = require('../common'); -const assert = require('assert'); - -const spawn = require('child_process').spawn; -const debug = require('util').debuglog('test'); - -process.env.HELLO = 'WORLD'; - -let child; -if (isWindows) { - child = spawn('cmd.exe', ['/c', 'set'], {}); -} else { - child = spawn('/usr/bin/env', [], {}); -} - -let response = ''; - -child.stdout.setEncoding('utf8'); - -child.stdout.on('data', function(chunk) { - debug(`stdout: ${chunk}`); - response += chunk; -}); - -process.on('exit', function() { - assert.ok(response.includes('HELLO=WORLD'), - 'spawn did not use process.env as default ' + - `(process.env.HELLO = ${process.env.HELLO})`); -}); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-double-pipe.js b/cli/tests/node_compat/test/parallel/test-child-process-double-pipe.js deleted file mode 100644 index bd31d1038..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-double-pipe.js +++ /dev/null @@ -1,129 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { - isWindows, - mustCall, - mustCallAtLeast, -} = require('../common'); -const assert = require('assert'); -const os = require('os'); -const spawn = require('child_process').spawn; -const debug = require('util').debuglog('test'); - -// We're trying to reproduce: -// $ echo "hello\nnode\nand\nworld" | grep o | sed s/o/a/ - -let grep, sed, echo; - -if (isWindows) { - grep = spawn('grep', ['--binary', 'o']); - sed = spawn('sed', ['--binary', 's/o/O/']); - echo = spawn('cmd.exe', - ['/c', 'echo', 'hello&&', 'echo', - 'node&&', 'echo', 'and&&', 'echo', 'world']); -} else { - grep = spawn('grep', ['o']); - sed = spawn('sed', ['s/o/O/']); - echo = spawn('echo', ['hello\nnode\nand\nworld\n']); -} - -// If the spawn function leaks file descriptors to subprocesses, grep and sed -// hang. -// This happens when calling pipe(2) and then forgetting to set the -// FD_CLOEXEC flag on the resulting file descriptors. -// -// This test checks child processes exit, meaning they don't hang like -// explained above. - - -// pipe echo | grep -echo.stdout.on('data', mustCallAtLeast((data) => { - debug(`grep stdin write ${data.length}`); - if (!grep.stdin.write(data)) { - echo.stdout.pause(); - } -})); - -// TODO(@jasnell): This does not appear to ever be -// emitted. It's not clear if it is necessary. -grep.stdin.on('drain', (data) => { - echo.stdout.resume(); -}); - -// Propagate end from echo to grep -echo.stdout.on('end', mustCall((code) => { - grep.stdin.end(); -})); - -echo.on('exit', mustCall(() => { - debug('echo exit'); -})); - -grep.on('exit', mustCall(() => { - debug('grep exit'); -})); - -sed.on('exit', mustCall(() => { - debug('sed exit'); -})); - - -// pipe grep | sed -grep.stdout.on('data', mustCallAtLeast((data) => { - debug(`grep stdout ${data.length}`); - if (!sed.stdin.write(data)) { - grep.stdout.pause(); - } -})); - -// TODO(@jasnell): This does not appear to ever be -// emitted. It's not clear if it is necessary. -sed.stdin.on('drain', (data) => { - grep.stdout.resume(); -}); - -// Propagate end from grep to sed -grep.stdout.on('end', mustCall((code) => { - debug('grep stdout end'); - sed.stdin.end(); -})); - - -let result = ''; - -// print sed's output -sed.stdout.on('data', mustCallAtLeast((data) => { - result += data.toString('utf8', 0, data.length); - debug(data); -})); - -sed.stdout.on('end', mustCall((code) => { - assert.strictEqual(result, `hellO${os.EOL}nOde${os.EOL}wOrld${os.EOL}`); -})); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js deleted file mode 100644 index 4ba699ba4..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-abortcontroller-promisified.js +++ /dev/null @@ -1,54 +0,0 @@ -// 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 - -// TODO(PolarETech): The "eval" subcommand passed to execPromisifed() should be the "-e" option. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const exec = require('child_process').exec; -const { promisify } = require('util'); - -const execPromisifed = promisify(exec); -const invalidArgTypeError = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' -}; - -const waitCommand = common.isLinux ? - 'sleep 2m' : - `${process.execPath} eval "setInterval(()=>{}, 99)"`; - -{ - const ac = new AbortController(); - const signal = ac.signal; - const promise = execPromisifed(waitCommand, { signal }); - assert.rejects(promise, /AbortError/, 'post aborted sync signal failed') - .then(common.mustCall()); - ac.abort(); -} - -{ - assert.throws(() => { - execPromisifed(waitCommand, { signal: {} }); - }, invalidArgTypeError); -} - -{ - function signal() {} - assert.throws(() => { - execPromisifed(waitCommand, { signal }); - }, invalidArgTypeError); -} - -{ - const signal = AbortSignal.abort(); // Abort in advance - const promise = execPromisifed(waitCommand, { signal }); - - assert.rejects(promise, /AbortError/, 'pre aborted signal failed') - .then(common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-cwd.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-cwd.js deleted file mode 100644 index 4bd394cca..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-cwd.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 exec = require('child_process').exec; - -let pwdcommand, dir; - -if (common.isWindows) { - pwdcommand = 'echo %cd%'; - dir = 'c:\\windows'; -} else { - pwdcommand = 'pwd'; - dir = '/dev'; -} - -exec(pwdcommand, { cwd: dir }, common.mustSucceed((stdout, stderr) => { - assert(stdout.toLowerCase().startsWith(dir)); -})); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-encoding.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-encoding.js deleted file mode 100644 index fe03e98d0..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-encoding.js +++ /dev/null @@ -1,59 +0,0 @@ -// 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 - -// TODO(PolarETech): The process.argv[3] check should be argv[2], and the -// command passed to exec() should not need to include "run", "-A", -// and "require.ts". - -'use strict'; -const common = require('../common'); -const stdoutData = 'foo'; -const stderrData = 'bar'; - -if (process.argv[3] === 'child') { - // The following console calls are part of the test. - console.log(stdoutData); - console.error(stderrData); -} else { - const assert = require('assert'); - const cp = require('child_process'); - const expectedStdout = `${stdoutData}\n`; - const expectedStderr = `${stderrData}\n`; - function run(options, callback) { - const cmd = `"${process.execPath}" run -A require.ts "${__filename}" child`; - - cp.exec(cmd, options, common.mustSucceed((stdout, stderr) => { - callback(stdout, stderr); - })); - } - - // Test default encoding, which should be utf8. - run({}, (stdout, stderr) => { - assert.strictEqual(typeof stdout, 'string'); - assert.strictEqual(typeof stderr, 'string'); - assert.strictEqual(stdout, expectedStdout); - assert.strictEqual(stderr, expectedStderr); - }); - - // Test explicit utf8 encoding. - run({ encoding: 'utf8' }, (stdout, stderr) => { - assert.strictEqual(typeof stdout, 'string'); - assert.strictEqual(typeof stderr, 'string'); - assert.strictEqual(stdout, expectedStdout); - assert.strictEqual(stderr, expectedStderr); - }); - - // Test cases that result in buffer encodings. - [undefined, null, 'buffer', 'invalid'].forEach((encoding) => { - run({ encoding }, (stdout, stderr) => { - assert(stdout instanceof Buffer); - assert(stdout instanceof Buffer); - assert.strictEqual(stdout.toString(), expectedStdout); - assert.strictEqual(stderr.toString(), expectedStderr); - }); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-env.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-env.js deleted file mode 100644 index 2797b8761..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-env.js +++ /dev/null @@ -1,71 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { isWindows } = require('../common'); -const assert = require('assert'); -const exec = require('child_process').exec; -const debug = require('util').debuglog('test'); - -let success_count = 0; -let error_count = 0; -let response = ''; -let child; - -function after(err, stdout, stderr) { - if (err) { - error_count++; - debug(`error!: ${err.code}`); - debug(`stdout: ${JSON.stringify(stdout)}`); - debug(`stderr: ${JSON.stringify(stderr)}`); - assert.strictEqual(err.killed, false); - } else { - success_count++; - assert.notStrictEqual(stdout, ''); - } -} - -if (!isWindows) { - child = exec('/usr/bin/env', { env: { 'HELLO': 'WORLD' } }, after); -} else { - child = exec('set', - { env: { ...process.env, 'HELLO': 'WORLD' } }, - after); -} - -child.stdout.setEncoding('utf8'); -child.stdout.on('data', function(chunk) { - response += chunk; -}); - -process.on('exit', function() { - debug('response: ', response); - assert.strictEqual(success_count, 1); - assert.strictEqual(error_count, 0); - assert.ok(response.includes('HELLO=WORLD')); -}); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-error.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-error.js deleted file mode 100644 index 3f809ed18..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-error.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 child_process = require('child_process'); - -function test(fn, code, expectPidType = 'number') { - const child = fn('does-not-exist', common.mustCall(function(err) { - assert.strictEqual(err.code, code); - assert(err.cmd.includes('does-not-exist')); - })); - - assert.strictEqual(typeof child.pid, expectPidType); -} - -// With `shell: true`, expect pid (of the shell) -if (common.isWindows) { - test(child_process.exec, 1, 'number'); // Exit code of cmd.exe -} else { - test(child_process.exec, 127, 'number'); // Exit code of /bin/sh -} - -// With `shell: false`, expect no pid -test(child_process.execFile, 'ENOENT', 'undefined'); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js deleted file mode 100644 index 6a28c2a18..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-kill-throws.js +++ /dev/null @@ -1,42 +0,0 @@ -// 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 - -// TODO(PolarETech): The process.argv[3] check should be argv[2], and the -// command passed to exec() should not need to include "run", "-A", -// and "require.ts". - -'use strict'; -// Flags: --expose-internals -const common = require('../common'); -const assert = require('assert'); -const cp = require('child_process'); - -if (process.argv[3] === 'child') { - // Since maxBuffer is 0, this should trigger an error. - console.log('foo'); -} else { - const internalCp = require('internal/child_process'); - - // Monkey patch ChildProcess#kill() to kill the process and then throw. - const kill = internalCp.ChildProcess.prototype.kill; - - internalCp.ChildProcess.prototype.kill = function() { - kill.apply(this, arguments); - throw new Error('mock error'); - }; - - const cmd = `"${process.execPath}" run -A require.ts "${__filename}" child`; - const options = { maxBuffer: 0, killSignal: 'SIGKILL' }; - - const child = cp.exec(cmd, options, common.mustCall((err, stdout, stderr) => { - // Verify that if ChildProcess#kill() throws, the error is reported. - assert.strictEqual(err.message, 'mock error', err); - assert.strictEqual(stdout, ''); - assert.strictEqual(stderr, ''); - assert.strictEqual(child.killed, true); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js deleted file mode 100644 index 2e99855c0..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-maxbuf.js +++ /dev/null @@ -1,161 +0,0 @@ -// 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 - -// TODO(PolarETech): The "eval" subcommand passed to exec() should be the "-e" option. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const cp = require('child_process'); - -function runChecks(err, stdio, streamName, expected) { - assert.strictEqual(err.message, `${streamName} maxBuffer length exceeded`); - assert(err instanceof RangeError); - assert.strictEqual(err.code, 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'); - assert.deepStrictEqual(stdio[streamName], expected); -} - -// default value -{ - const cmd = - `"${process.execPath}" eval "console.log('a'.repeat(1024 * 1024))"`; - - cp.exec(cmd, common.mustCall((err) => { - assert(err instanceof RangeError); - assert.strictEqual(err.message, 'stdout maxBuffer length exceeded'); - assert.strictEqual(err.code, 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'); - })); -} - -// default value -{ - const cmd = - `${process.execPath} eval "console.log('a'.repeat(1024 * 1024 - 1))"`; - - cp.exec(cmd, common.mustSucceed((stdout, stderr) => { - assert.strictEqual(stdout.trim(), 'a'.repeat(1024 * 1024 - 1)); - assert.strictEqual(stderr, ''); - })); -} - -{ - const cmd = `"${process.execPath}" eval "console.log('hello world');"`; - const options = { maxBuffer: Infinity }; - - cp.exec(cmd, options, common.mustSucceed((stdout, stderr) => { - assert.strictEqual(stdout.trim(), 'hello world'); - assert.strictEqual(stderr, ''); - })); -} - -{ - const cmd = 'echo hello world'; - - cp.exec( - cmd, - { maxBuffer: 5 }, - common.mustCall((err, stdout, stderr) => { - runChecks(err, { stdout, stderr }, 'stdout', 'hello'); - }) - ); -} - -// default value -{ - const cmd = - `"${process.execPath}" eval "console.log('a'.repeat(1024 * 1024))"`; - - cp.exec( - cmd, - common.mustCall((err, stdout, stderr) => { - runChecks( - err, - { stdout, stderr }, - 'stdout', - 'a'.repeat(1024 * 1024) - ); - }) - ); -} - -// default value -{ - const cmd = - `"${process.execPath}" eval "console.log('a'.repeat(1024 * 1024 - 1))"`; - - cp.exec(cmd, common.mustSucceed((stdout, stderr) => { - assert.strictEqual(stdout.trim(), 'a'.repeat(1024 * 1024 - 1)); - assert.strictEqual(stderr, ''); - })); -} - -const unicode = '中文测试'; // length = 4, byte length = 12 - -{ - const cmd = `"${process.execPath}" eval "console.log('${unicode}');"`; - - cp.exec( - cmd, - { maxBuffer: 10 }, - common.mustCall((err, stdout, stderr) => { - runChecks(err, { stdout, stderr }, 'stdout', '中文测试\n'); - }) - ); -} - -{ - const cmd = `"${process.execPath}" eval "console.error('${unicode}');"`; - - cp.exec( - cmd, - { maxBuffer: 3 }, - common.mustCall((err, stdout, stderr) => { - runChecks(err, { stdout, stderr }, 'stderr', '中文测'); - }) - ); -} - -{ - const cmd = `"${process.execPath}" eval "console.log('${unicode}');"`; - - const child = cp.exec( - cmd, - { encoding: null, maxBuffer: 10 }, - common.mustCall((err, stdout, stderr) => { - runChecks(err, { stdout, stderr }, 'stdout', '中文测试\n'); - }) - ); - - child.stdout.setEncoding('utf-8'); -} - -{ - const cmd = `"${process.execPath}" eval "console.error('${unicode}');"`; - - const child = cp.exec( - cmd, - { encoding: null, maxBuffer: 3 }, - common.mustCall((err, stdout, stderr) => { - runChecks(err, { stdout, stderr }, 'stderr', '中文测'); - }) - ); - - child.stderr.setEncoding('utf-8'); -} - -{ - const cmd = `"${process.execPath}" eval "console.error('${unicode}');"`; - - cp.exec( - cmd, - { encoding: null, maxBuffer: 5 }, - common.mustCall((err, stdout, stderr) => { - const buf = Buffer.from(unicode).slice(0, 5); - runChecks(err, { stdout, stderr }, 'stderr', buf); - }) - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js deleted file mode 100644 index 85f3ec2bf..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-std-encoding.js +++ /dev/null @@ -1,33 +0,0 @@ -// 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 - -// TODO(PolarETech): The process.argv[3] check should be argv[2], and the -// command passed to exec() should not need to include "run", "-A", -// and "require.ts". - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const cp = require('child_process'); -const stdoutData = 'foo'; -const stderrData = 'bar'; -const expectedStdout = `${stdoutData}\n`; -const expectedStderr = `${stderrData}\n`; - -if (process.argv[3] === 'child') { - // The following console calls are part of the test. - console.log(stdoutData); - console.error(stderrData); -} else { - const cmd = `"${process.execPath}" run -A require.ts "${__filename}" child`; - const child = cp.exec(cmd, common.mustSucceed((stdout, stderr) => { - assert.strictEqual(stdout, expectedStdout); - assert.strictEqual(stderr, expectedStderr); - })); - child.stdout.setEncoding('utf-8'); - child.stderr.setEncoding('utf-8'); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js deleted file mode 100644 index 0e5453926..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-stdout-stderr-data-string.js +++ /dev/null @@ -1,20 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// Refs: https://github.com/nodejs/node/issues/7342 -const common = require('../common'); -const assert = require('assert'); -const exec = require('child_process').exec; - -const command = common.isWindows ? 'dir' : 'ls'; - -exec(command).stdout.on('data', common.mustCallAtLeast()); - -exec('fhqwhgads').stderr.on('data', common.mustCallAtLeast((data) => { - assert.strictEqual(typeof data, 'string'); -})); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js b/cli/tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js deleted file mode 100644 index 31fa1f725..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exec-timeout-not-expired.js +++ /dev/null @@ -1,45 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// TODO(PolarETech): The process.argv[3] check should be argv[2], and the -// command passed to exec() should not need to include "run", "-A", -// and "require.ts". - -'use strict'; - -// Test exec() when a timeout is set, but not expired. - -const common = require('../common'); -const assert = require('assert'); -const cp = require('child_process'); - -const { - cleanupStaleProcess, - logAfterTime -} = require('../common/child_process'); - -const kTimeoutNotSupposedToExpire = 2 ** 30; -const childRunTime = common.platformTimeout(100); - -// The time spent in the child should be smaller than the timeout below. -assert(childRunTime < kTimeoutNotSupposedToExpire); - -if (process.argv[3] === 'child') { - logAfterTime(childRunTime); - return; -} - -const cmd = `"${process.execPath}" run -A require.ts "${__filename}" child`; - -cp.exec(cmd, { - timeout: kTimeoutNotSupposedToExpire -}, common.mustSucceed((stdout, stderr) => { - assert.strictEqual(stdout.trim(), 'child stdout'); - assert.strictEqual(stderr.trim(), 'child stderr'); -})); - -cleanupStaleProcess(__filename); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js b/cli/tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js deleted file mode 100644 index 729929c78..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-execfile-maxbuf.js +++ /dev/null @@ -1,99 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { execFile } = require('child_process'); - -function checkFactory(streamName) { - return common.mustCall((err) => { - assert(err instanceof RangeError); - assert.strictEqual(err.message, `${streamName} maxBuffer length exceeded`); - assert.strictEqual(err.code, 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'); - }); -} - -// default value -{ - execFile( - process.execPath, - ['-e', 'console.log("a".repeat(1024 * 1024))'], - checkFactory('stdout') - ); -} - -// default value -{ - execFile( - process.execPath, - ['-e', 'console.log("a".repeat(1024 * 1024 - 1))'], - common.mustSucceed((stdout, stderr) => { - assert.strictEqual(stdout.trim(), 'a'.repeat(1024 * 1024 - 1)); - assert.strictEqual(stderr, ''); - }) - ); -} - -{ - const options = { maxBuffer: Infinity }; - - execFile( - process.execPath, - ['-e', 'console.log("hello world");'], - options, - common.mustSucceed((stdout, stderr) => { - assert.strictEqual(stdout.trim(), 'hello world'); - assert.strictEqual(stderr, ''); - }) - ); -} - -{ - execFile('echo', ['hello world'], { maxBuffer: 5 }, checkFactory('stdout')); -} - -const unicode = '中文测试'; // length = 4, byte length = 12 - -{ - execFile( - process.execPath, - ['-e', `console.log('${unicode}');`], - { maxBuffer: 10 }, - checkFactory('stdout')); -} - -{ - execFile( - process.execPath, - ['-e', `console.error('${unicode}');`], - { maxBuffer: 10 }, - checkFactory('stderr') - ); -} - -{ - const child = execFile( - process.execPath, - ['-e', `console.log('${unicode}');`], - { encoding: null, maxBuffer: 10 }, - checkFactory('stdout') - ); - - child.stdout.setEncoding('utf-8'); -} - -{ - const child = execFile( - process.execPath, - ['-e', `console.error('${unicode}');`], - { encoding: null, maxBuffer: 10 }, - checkFactory('stderr') - ); - - child.stderr.setEncoding('utf-8'); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-execfile.js b/cli/tests/node_compat/test/parallel/test-child-process-execfile.js deleted file mode 100644 index 9f9268407..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-execfile.js +++ /dev/null @@ -1,135 +0,0 @@ -// 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 - -// TODO(PolarETech): The args passed to execFile() should not need to -// include "require.ts". - -// TODO(cjihrig): See inline TODO comments below. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { execFile, execFileSync } = require('child_process'); -const { getSystemErrorName } = require('util'); -const fixtures = require('../common/fixtures'); -const os = require('os'); - -const fixture = fixtures.path('exit.js'); -const echoFixture = fixtures.path('echo.js'); -const execOpts = { encoding: 'utf8', shell: true }; - -{ - execFile( - process.execPath, - ['require.ts', fixture, 42], - common.mustCall((e) => { - // Check that arguments are included in message - assert.strictEqual(e.message.trim(), - `Command failed: ${process.execPath} require.ts ${fixture} 42`); - assert.strictEqual(e.code, 42); - }) - ); -} - -{ - // Verify that negative exit codes can be translated to UV error names. - const errorString = `Error: Command failed: ${process.execPath}`; - const code = -1; - const callback = common.mustCall((err, stdout, stderr) => { - assert.strictEqual(err.toString().trim(), errorString); - assert.strictEqual(err.code, getSystemErrorName(code)); - assert.strictEqual(err.killed, true); - assert.strictEqual(err.signal, null); - assert.strictEqual(err.cmd, process.execPath); - assert.strictEqual(stdout.trim(), ''); - assert.strictEqual(stderr.trim(), ''); - }); - const child = execFile(process.execPath, callback); - - child.kill(); - child.emit('close', code, null); -} - -{ - // Verify the shell option works properly - execFile(process.execPath, ['require.ts', fixture, 0], execOpts, common.mustSucceed()); -} - -{ - // Verify that the signal option works properly - const ac = new AbortController(); - const { signal } = ac; - - const test = () => { - const check = common.mustCall((err) => { - assert.strictEqual(err.code, 'ABORT_ERR'); - assert.strictEqual(err.name, 'AbortError'); - assert.strictEqual(err.signal, undefined); - }); - execFile(process.execPath, ['require.ts', echoFixture, 0], { signal }, check); - }; - - // Verify that it still works the same way now that the signal is aborted. - test(); - ac.abort(); -} - -{ - // Verify that does not spawn a child if already aborted - const signal = AbortSignal.abort(); - - const check = common.mustCall((err) => { - assert.strictEqual(err.code, 'ABORT_ERR'); - assert.strictEqual(err.name, 'AbortError'); - assert.strictEqual(err.signal, undefined); - }); - execFile(process.execPath, ['require.ts', echoFixture, 0], { signal }, check); -} - -{ - // Verify that if something different than Abortcontroller.signal - // is passed, ERR_INVALID_ARG_TYPE is thrown - assert.throws(() => { - const callback = common.mustNotCall(() => {}); - - execFile(process.execPath, ['require.ts', echoFixture, 0], { signal: 'hello' }, callback); - }, { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }); -} -{ - // Verify that the process completing removes the abort listener - const ac = new AbortController(); - const { signal } = ac; - - const callback = common.mustCall((err) => { - // TODO(cjihrig): The assertion on the next line currently fails because - // kEvents is not defined. See TODO comment in _events.mjs. - // assert.strictEqual(getEventListeners(ac.signal).length, 0); - assert.strictEqual(err, null); - }); - execFile(process.execPath, ['require.ts', fixture, 0], { signal }, callback); -} - -// Verify the execFile() stdout is the same as execFileSync(). -{ - const file = 'echo'; - const args = ['foo', 'bar']; - - // Test with and without `{ shell: true }` - [ - // Skipping shell-less test on Windows because its echo command is a shell built-in command. - ...(common.isWindows ? [] : [{ encoding: 'utf8' }]), - { shell: true, encoding: 'utf8' }, - ].forEach((options) => { - const execFileSyncStdout = execFileSync(file, args, options); - assert.strictEqual(execFileSyncStdout, `foo bar${os.EOL}`); - - execFile(file, args, options, common.mustCall((_, stdout) => { - assert.strictEqual(stdout, execFileSyncStdout); - })); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js b/cli/tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js deleted file mode 100644 index 7ad857a18..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-execfilesync-maxbuf.js +++ /dev/null @@ -1,60 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test checks that the maxBuffer option for child_process.execFileSync() -// works as expected. - -const assert = require('assert'); -const { getSystemErrorName } = require('util'); -const { execFileSync } = require('child_process'); -const msgOut = 'this is stdout'; -const msgOutBuf = Buffer.from(`${msgOut}\n`); - -const args = [ - '-e', - `console.log("${msgOut}");`, -]; - -// Verify that an error is returned if maxBuffer is surpassed. -{ - assert.throws(() => { - execFileSync(process.execPath, args, { maxBuffer: 1 }); - }, (e) => { - assert.ok(e, 'maxBuffer should error'); - assert.strictEqual(e.code, 'ENOBUFS'); - assert.strictEqual(getSystemErrorName(e.errno), 'ENOBUFS'); - // We can have buffers larger than maxBuffer because underneath we alloc 64k - // that matches our read sizes. - assert.deepStrictEqual(e.stdout, msgOutBuf); - return true; - }); -} - -// Verify that a maxBuffer size of Infinity works. -{ - const ret = execFileSync(process.execPath, args, { maxBuffer: Infinity }); - - assert.deepStrictEqual(ret, msgOutBuf); -} - -// Default maxBuffer size is 1024 * 1024. -{ - assert.throws(() => { - execFileSync( - process.execPath, - ['-e', "console.log('a'.repeat(1024 * 1024))"] - ); - }, (e) => { - assert.ok(e, 'maxBuffer should error'); - assert.strictEqual(e.code, 'ENOBUFS'); - assert.strictEqual(getSystemErrorName(e.errno), 'ENOBUFS'); - return true; - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js b/cli/tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js deleted file mode 100644 index 703896ef1..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-execsync-maxbuf.js +++ /dev/null @@ -1,76 +0,0 @@ -// 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 - -// TODO(cjihrig): This should use Node's -e instead of Deno's eval CLI arg. - -'use strict'; -require('../common'); - -// This test checks that the maxBuffer option for child_process.spawnSync() -// works as expected. - -const assert = require('assert'); -const { getSystemErrorName } = require('util'); -const { execSync } = require('child_process'); -const msgOut = 'this is stdout'; -const msgOutBuf = Buffer.from(`${msgOut}\n`); - -const args = [ - 'eval', - `"console.log('${msgOut}')";`, -]; - -// Verify that an error is returned if maxBuffer is surpassed. -{ - assert.throws(() => { - execSync(`"${process.execPath}" ${args.join(' ')}`, { maxBuffer: 1 }); - }, (e) => { - assert.ok(e, 'maxBuffer should error'); - assert.strictEqual(e.code, 'ENOBUFS'); - assert.strictEqual(getSystemErrorName(e.errno), 'ENOBUFS'); - // We can have buffers larger than maxBuffer because underneath we alloc 64k - // that matches our read sizes. - assert.deepStrictEqual(e.stdout, msgOutBuf); - return true; - }); -} - -// Verify that a maxBuffer size of Infinity works. -{ - const ret = execSync( - `"${process.execPath}" ${args.join(' ')}`, - { maxBuffer: Infinity } - ); - - assert.deepStrictEqual(ret, msgOutBuf); -} - -// Default maxBuffer size is 1024 * 1024. -{ - assert.throws(() => { - execSync( - `"${process.execPath}" eval "console.log('a'.repeat(1024 * 1024))"` - ); - }, (e) => { - assert.ok(e, 'maxBuffer should error'); - assert.strictEqual(e.code, 'ENOBUFS'); - assert.strictEqual(getSystemErrorName(e.errno), 'ENOBUFS'); - return true; - }); -} - -// Default maxBuffer size is 1024 * 1024. -{ - const ret = execSync( - `"${process.execPath}" eval "console.log('a'.repeat(1024 * 1024 - 1))"` - ); - - assert.deepStrictEqual( - ret.toString().trim(), - 'a'.repeat(1024 * 1024 - 1) - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-exit-code.js b/cli/tests/node_compat/test/parallel/test-child-process-exit-code.js deleted file mode 100644 index caa57986b..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-exit-code.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -// TODO(PolarETech): The args passed to spawn() should not need to -// include "require.ts". - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const spawn = require('child_process').spawn; -const fixtures = require('../common/fixtures'); - -const exitScript = fixtures.path('exit.js'); -const exitChild = spawn(process.argv[0], ['require.ts', exitScript, 23]); -exitChild.on('exit', common.mustCall(function(code, signal) { - assert.strictEqual(code, 23); - assert.strictEqual(signal, null); -})); - - -const errorScript = fixtures.path('child_process_should_emit_error.js'); -const errorChild = spawn(process.argv[0], ['require.ts', errorScript]); -errorChild.on('exit', common.mustCall(function(code, signal) { - assert.ok(code !== 0); - assert.strictEqual(signal, null); -})); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-flush-stdio.js b/cli/tests/node_compat/test/parallel/test-child-process-flush-stdio.js deleted file mode 100644 index c39bcbdbe..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-flush-stdio.js +++ /dev/null @@ -1,40 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const cp = require('child_process'); -const assert = require('assert'); - -// Windows' `echo` command is a built-in shell command and not an external -// executable like on *nix -const opts = { shell: common.isWindows }; - -const p = cp.spawn('echo', [], opts); - -p.on('close', common.mustCall((code, signal) => { - assert.strictEqual(code, 0); - assert.strictEqual(signal, null); - spawnWithReadable(); -})); - -p.stdout.read(); - -const spawnWithReadable = () => { - const buffer = []; - const p = cp.spawn('echo', ['123'], opts); - p.on('close', common.mustCall((code, signal) => { - assert.strictEqual(code, 0); - assert.strictEqual(signal, null); - assert.strictEqual(Buffer.concat(buffer).toString().trim(), '123'); - })); - p.stdout.on('readable', () => { - let buf; - while ((buf = p.stdout.read()) !== null) - buffer.push(buf); - }); -}; diff --git a/cli/tests/node_compat/test/parallel/test-child-process-fork-ref.js b/cli/tests/node_compat/test/parallel/test-child-process-fork-ref.js deleted file mode 100644 index 37c186af8..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-fork-ref.js +++ /dev/null @@ -1,72 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -// Ignore on Windows. -if (process.platform === 'win32') { - process.exit(0); -} - -require('../common'); -const assert = require('assert'); -const fork = require('child_process').fork; - -if (process.argv[2] === 'child') { - process.send('1'); - - // Check that child don't instantly die - setTimeout(function() { - process.send('2'); - }, 200); - - process.on('disconnect', function() { - process.stdout.write('3'); - }); - -} else { - const child = fork(__filename, ['child'], { silent: true }); - - const ipc = []; - let stdout = ''; - - child.on('message', function(msg) { - ipc.push(msg); - - if (msg === '2') child.disconnect(); - }); - - child.stdout.on('data', function(chunk) { - stdout += chunk; - }); - - child.once('exit', function() { - assert.deepStrictEqual(ipc, ['1', '2']); - assert.strictEqual(stdout, '3'); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-fork-ref2.js b/cli/tests/node_compat/test/parallel/test-child-process-fork-ref2.js deleted file mode 100644 index da59d9378..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-fork-ref2.js +++ /dev/null @@ -1,63 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -// Ignore on Windows. -if (process.platform === 'win32') { - process.exit(0); -} - -const { - mustCall, - mustNotCall, - platformTimeout, -} = require('../common'); -const fork = require('child_process').fork; -const debug = require('util').debuglog('test'); - -if (process.argv[2] === 'child') { - debug('child -> call disconnect'); - process.disconnect(); - - setTimeout(() => { - debug('child -> will this keep it alive?'); - process.on('message', mustNotCall()); - }, platformTimeout(400)); - -} else { - const child = fork(__filename, ['child']); - - child.on('disconnect', mustCall(() => { - debug('parent -> disconnect'); - })); - - child.once('exit', mustCall(() => { - debug('parent -> exit'); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js b/cli/tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js deleted file mode 100644 index d255a0a64..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-ipc-next-tick.js +++ /dev/null @@ -1,52 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Ignore on Windows. -if (process.platform === 'win32') { - process.exit(0); -} - -const common = require('../common'); -const assert = require('assert'); -const cp = require('child_process'); -const NUM_MESSAGES = 10; -const values = []; - -for (let i = 0; i < NUM_MESSAGES; ++i) { - values[i] = i; -} - -if (process.argv[2] === 'child') { - const received = values.map(() => { return false; }); - - process.on('uncaughtException', common.mustCall((err) => { - received[err] = true; - const done = received.every((element) => { return element === true; }); - - if (done) - process.disconnect(); - }, NUM_MESSAGES)); - - process.on('message', (msg) => { - // If messages are handled synchronously, throwing should break the IPC - // message processing. - throw msg; - }); - - process.send('ready'); -} else { - const child = cp.fork(__filename, ['child']); - - child.on('message', common.mustCall((msg) => { - assert.strictEqual(msg, 'ready'); - values.forEach((value) => { - child.send(value); - }); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-ipc.js b/cli/tests/node_compat/test/parallel/test-child-process-ipc.js deleted file mode 100644 index c1d7bc2b6..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-ipc.js +++ /dev/null @@ -1,73 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -// TODO(PolarETech): The args passed to spawn() should not need to -// include "require.ts". - -'use strict'; - -const { - mustCall, - mustNotCall, -} = require('../common'); -const assert = require('assert'); -const debug = require('util').debuglog('test'); - -const { spawn } = require('child_process'); -const fixtures = require('../common/fixtures'); - -const sub = fixtures.path('echo.js'); - -const child = spawn(process.argv[0], ['require.ts', sub]); - -child.stderr.on('data', mustNotCall()); - -child.stdout.setEncoding('utf8'); - -const messages = [ - 'hello world\r\n', - 'echo me\r\n', -]; - -child.stdout.on('data', mustCall((data) => { - debug(`child said: ${JSON.stringify(data)}`); - const test = messages.shift(); - debug(`testing for '${test}'`); - assert.strictEqual(data, test); - if (messages.length) { - debug(`writing '${messages[0]}'`); - child.stdin.write(messages[0]); - } else { - assert.strictEqual(messages.length, 0); - child.stdin.end(); - } -}, messages.length)); - -child.stdout.on('end', mustCall((data) => { - debug('child end'); -})); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-kill.js b/cli/tests/node_compat/test/parallel/test-child-process-kill.js deleted file mode 100644 index 4d4ac3033..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-kill.js +++ /dev/null @@ -1,48 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 spawn = require('child_process').spawn; -const cat = spawn(common.isWindows ? 'cmd' : 'cat'); - -cat.stdout.on('end', common.mustCall()); -cat.stderr.on('data', common.mustNotCall()); -cat.stderr.on('end', common.mustCall()); - -cat.on('exit', common.mustCall((code, signal) => { - assert.strictEqual(code, null); - assert.strictEqual(signal, 'SIGTERM'); - assert.strictEqual(cat.signalCode, 'SIGTERM'); -})); - -assert.strictEqual(cat.signalCode, null); -assert.strictEqual(cat.killed, false); -cat.kill(); -assert.strictEqual(cat.killed, true); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-set-blocking.js b/cli/tests/node_compat/test/parallel/test-child-process-set-blocking.js deleted file mode 100644 index b43d9ba9c..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-set-blocking.js +++ /dev/null @@ -1,43 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 ch = require('child_process'); - -const SIZE = 100000; -const python = process.env.PYTHON || (common.isWindows ? 'python' : 'python3'); - -const cp = ch.spawn(python, ['-c', `print(${SIZE} * "C")`], { - stdio: 'inherit' -}); - -cp.on('exit', common.mustCall(function(code) { - assert.strictEqual(code, 0); -})); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawn-args.js b/cli/tests/node_compat/test/parallel/test-child-process-spawn-args.js deleted file mode 100644 index e2597c921..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-spawn-args.js +++ /dev/null @@ -1,62 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// This test confirms that `undefined`, `null`, and `[]` -// can be used as a placeholder for the second argument (`args`) of `spawn()`. -// Previously, there was a bug where using `undefined` for the second argument -// caused the third argument (`options`) to be ignored. -// See https://github.com/nodejs/node/issues/24912. - -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); - -const assert = require('assert'); -const { spawn } = require('child_process'); - -tmpdir.refresh(); - -const command = common.isWindows ? 'cd' : 'pwd'; -const options = { cwd: tmpdir.path }; - -if (common.isWindows) { - // This test is not the case for Windows based systems - // unless the `shell` options equals to `true` - - options.shell = true; -} - -const testCases = [ - undefined, - null, - [], -]; - -const expectedResult = tmpdir.path.trim().toLowerCase(); - -(async () => { - const results = await Promise.all( - testCases.map((testCase) => { - return new Promise((resolve) => { - const subprocess = spawn(command, testCase, options); - - let accumulatedData = Buffer.alloc(0); - - subprocess.stdout.on('data', common.mustCall((data) => { - accumulatedData = Buffer.concat([accumulatedData, data]); - })); - - subprocess.stdout.on('end', () => { - resolve(accumulatedData.toString().trim().toLowerCase()); - }); - }); - }) - ); - - assert.deepStrictEqual([...new Set(results)], [expectedResult]); -})().then(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawn-event.js b/cli/tests/node_compat/test/parallel/test-child-process-spawn-event.js deleted file mode 100644 index 315644fd1..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-spawn-event.js +++ /dev/null @@ -1,34 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const spawn = require('child_process').spawn; -const assert = require('assert'); - -const subprocess = spawn('echo', ['ok']); - -let didSpawn = false; -subprocess.on('spawn', function() { - didSpawn = true; -}); -function mustCallAfterSpawn() { - return common.mustCall(function() { - assert.ok(didSpawn); - }); -} - -subprocess.on('error', common.mustNotCall()); -subprocess.on('spawn', common.mustCall()); -subprocess.stdout.on('data', mustCallAfterSpawn()); -subprocess.stdout.on('end', mustCallAfterSpawn()); -subprocess.stdout.on('close', mustCallAfterSpawn()); -subprocess.stderr.on('data', common.mustNotCall()); -subprocess.stderr.on('end', mustCallAfterSpawn()); -subprocess.stderr.on('close', mustCallAfterSpawn()); -subprocess.on('exit', mustCallAfterSpawn()); -subprocess.on('close', mustCallAfterSpawn()); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-args.js b/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-args.js deleted file mode 100644 index 05e04a92e..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-args.js +++ /dev/null @@ -1,55 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// This test confirms that `undefined`, `null`, and `[]` can be used -// as a placeholder for the second argument (`args`) of `spawnSync()`. -// Previously, there was a bug where using `undefined` for the second argument -// caused the third argument (`options`) to be ignored. -// See https://github.com/nodejs/node/issues/24912. - -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); - -const assert = require('assert'); -const { spawnSync } = require('child_process'); - -const command = common.isWindows ? 'cd' : 'pwd'; -const options = { cwd: tmpdir.path }; - -tmpdir.refresh(); - -if (common.isWindows) { - // This test is not the case for Windows based systems - // unless the `shell` options equals to `true` - - options.shell = true; -} - -const testCases = [ - undefined, - null, - [], -]; - -const expectedResult = tmpdir.path.trim().toLowerCase(); - -const results = testCases.map((testCase) => { - const { stdout, stderr, error } = spawnSync( - command, - testCase, - options - ); - - assert.ifError(error); - assert.deepStrictEqual(stderr, Buffer.alloc(0)); - - return stdout.toString().trim().toLowerCase(); -}); - -assert.deepStrictEqual([...new Set(results)], [expectedResult]); diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-env.js b/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-env.js deleted file mode 100644 index d08ed48d9..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-env.js +++ /dev/null @@ -1,47 +0,0 @@ -// 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. - -// TODO(cjihrig): The process.argv[3] check should be argv[2], and the -// arguments array passed to spawnSync() should not need to include -// "require.ts". - -'use strict'; -require('../common'); -const assert = require('assert'); -const cp = require('child_process'); - -if (process.argv[3] === 'child') { - console.log(process.env.foo); -} else { - const expected = 'bar'; - const child = cp.spawnSync(process.execPath, ["require.ts", __filename, 'child'], { - env: Object.assign(process.env, { foo: expected }) - }); - - assert.strictEqual(child.stdout.toString().trim(), expected); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js b/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js deleted file mode 100644 index 62b71c729..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-maxbuf.js +++ /dev/null @@ -1,65 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test checks that the maxBuffer option for child_process.spawnSync() -// works as expected. - -const assert = require('assert'); -const spawnSync = require('child_process').spawnSync; -const { getSystemErrorName } = require('util'); -const msgOut = 'this is stdout'; -const msgOutBuf = Buffer.from(`${msgOut}\n`); - -const args = [ - '-e', - `console.log("${msgOut}");`, -]; - -// Verify that an error is returned if maxBuffer is surpassed. -{ - const ret = spawnSync(process.execPath, args, { maxBuffer: 1 }); - - assert.ok(ret.error, 'maxBuffer should error'); - assert.strictEqual(ret.error.code, 'ENOBUFS'); - assert.strictEqual(getSystemErrorName(ret.error.errno), 'ENOBUFS'); - // We can have buffers larger than maxBuffer because underneath we alloc 64k - // that matches our read sizes. - assert.deepStrictEqual(ret.stdout, msgOutBuf); -} - -// Verify that a maxBuffer size of Infinity works. -{ - const ret = spawnSync(process.execPath, args, { maxBuffer: Infinity }); - - assert.ifError(ret.error); - assert.deepStrictEqual(ret.stdout, msgOutBuf); -} - -// Default maxBuffer size is 1024 * 1024. -{ - const args = ['-e', "console.log('a'.repeat(1024 * 1024))"]; - const ret = spawnSync(process.execPath, args); - - assert.ok(ret.error, 'maxBuffer should error'); - assert.strictEqual(ret.error.code, 'ENOBUFS'); - assert.strictEqual(getSystemErrorName(ret.error.errno), 'ENOBUFS'); -} - -// Default maxBuffer size is 1024 * 1024. -{ - const args = ['-e', "console.log('a'.repeat(1024 * 1024 - 1))"]; - const ret = spawnSync(process.execPath, args); - - assert.ifError(ret.error); - assert.deepStrictEqual( - ret.stdout.toString().trim(), - 'a'.repeat(1024 * 1024 - 1) - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js b/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js deleted file mode 100644 index 89ff02260..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync-validation-errors.js +++ /dev/null @@ -1,223 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const spawnSync = require('child_process').spawnSync; -const signals = require('os').constants.signals; -const rootUser = common.isWindows ? false : - common.isIBMi ? true : process.getuid() === 0; - -const invalidArgTypeError = { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }; -const invalidRangeError = { code: 'ERR_OUT_OF_RANGE', name: 'RangeError' }; - -function pass(option, value) { - // Run the command with the specified option. Since it's not a real command, - // spawnSync() should run successfully but return an ENOENT error. - const child = spawnSync('not_a_real_command', { [option]: value }); - - assert.strictEqual(child.error.code, 'ENOENT'); -} - -function fail(option, value, message) { - assert.throws(() => { - spawnSync('not_a_real_command', { [option]: value }); - }, message); -} - -{ - // Validate the cwd option - pass('cwd', undefined); - pass('cwd', null); - pass('cwd', __dirname); - fail('cwd', 0, invalidArgTypeError); - fail('cwd', 1, invalidArgTypeError); - fail('cwd', true, invalidArgTypeError); - fail('cwd', false, invalidArgTypeError); - fail('cwd', [], invalidArgTypeError); - fail('cwd', {}, invalidArgTypeError); - fail('cwd', common.mustNotCall(), invalidArgTypeError); -} - -{ - // Validate the detached option - pass('detached', undefined); - pass('detached', null); - pass('detached', true); - pass('detached', false); - fail('detached', 0, invalidArgTypeError); - fail('detached', 1, invalidArgTypeError); - fail('detached', __dirname, invalidArgTypeError); - fail('detached', [], invalidArgTypeError); - fail('detached', {}, invalidArgTypeError); - fail('detached', common.mustNotCall(), invalidArgTypeError); -} - -if (!common.isWindows) { - { - // Validate the uid option - if (!rootUser) { - pass('uid', undefined); - pass('uid', null); - pass('uid', process.getuid()); - fail('uid', __dirname, invalidArgTypeError); - fail('uid', true, invalidArgTypeError); - fail('uid', false, invalidArgTypeError); - fail('uid', [], invalidArgTypeError); - fail('uid', {}, invalidArgTypeError); - fail('uid', common.mustNotCall(), invalidArgTypeError); - fail('uid', NaN, invalidArgTypeError); - fail('uid', Infinity, invalidArgTypeError); - fail('uid', 3.1, invalidArgTypeError); - fail('uid', -3.1, invalidArgTypeError); - } - } - - { - // Validate the gid option - if (process.getgid() !== 0) { - pass('gid', undefined); - pass('gid', null); - pass('gid', process.getgid()); - fail('gid', __dirname, invalidArgTypeError); - fail('gid', true, invalidArgTypeError); - fail('gid', false, invalidArgTypeError); - fail('gid', [], invalidArgTypeError); - fail('gid', {}, invalidArgTypeError); - fail('gid', common.mustNotCall(), invalidArgTypeError); - fail('gid', NaN, invalidArgTypeError); - fail('gid', Infinity, invalidArgTypeError); - fail('gid', 3.1, invalidArgTypeError); - fail('gid', -3.1, invalidArgTypeError); - } - } -} - -{ - // Validate the shell option - pass('shell', undefined); - pass('shell', null); - pass('shell', false); - fail('shell', 0, invalidArgTypeError); - fail('shell', 1, invalidArgTypeError); - fail('shell', [], invalidArgTypeError); - fail('shell', {}, invalidArgTypeError); - fail('shell', common.mustNotCall(), invalidArgTypeError); -} - -{ - // Validate the argv0 option - pass('argv0', undefined); - pass('argv0', null); - pass('argv0', 'myArgv0'); - fail('argv0', 0, invalidArgTypeError); - fail('argv0', 1, invalidArgTypeError); - fail('argv0', true, invalidArgTypeError); - fail('argv0', false, invalidArgTypeError); - fail('argv0', [], invalidArgTypeError); - fail('argv0', {}, invalidArgTypeError); - fail('argv0', common.mustNotCall(), invalidArgTypeError); -} - -{ - // Validate the windowsHide option - pass('windowsHide', undefined); - pass('windowsHide', null); - pass('windowsHide', true); - pass('windowsHide', false); - fail('windowsHide', 0, invalidArgTypeError); - fail('windowsHide', 1, invalidArgTypeError); - fail('windowsHide', __dirname, invalidArgTypeError); - fail('windowsHide', [], invalidArgTypeError); - fail('windowsHide', {}, invalidArgTypeError); - fail('windowsHide', common.mustNotCall(), invalidArgTypeError); -} - -{ - // Validate the windowsVerbatimArguments option - pass('windowsVerbatimArguments', undefined); - pass('windowsVerbatimArguments', null); - pass('windowsVerbatimArguments', true); - pass('windowsVerbatimArguments', false); - fail('windowsVerbatimArguments', 0, invalidArgTypeError); - fail('windowsVerbatimArguments', 1, invalidArgTypeError); - fail('windowsVerbatimArguments', __dirname, invalidArgTypeError); - fail('windowsVerbatimArguments', [], invalidArgTypeError); - fail('windowsVerbatimArguments', {}, invalidArgTypeError); - fail('windowsVerbatimArguments', common.mustNotCall(), invalidArgTypeError); -} - -{ - // Validate the timeout option - pass('timeout', undefined); - pass('timeout', null); - pass('timeout', 1); - pass('timeout', 0); - fail('timeout', -1, invalidRangeError); - fail('timeout', true, invalidRangeError); - fail('timeout', false, invalidRangeError); - fail('timeout', __dirname, invalidRangeError); - fail('timeout', [], invalidRangeError); - fail('timeout', {}, invalidRangeError); - fail('timeout', common.mustNotCall(), invalidRangeError); - fail('timeout', NaN, invalidRangeError); - fail('timeout', Infinity, invalidRangeError); - fail('timeout', 3.1, invalidRangeError); - fail('timeout', -3.1, invalidRangeError); -} - -{ - // Validate the maxBuffer option - pass('maxBuffer', undefined); - pass('maxBuffer', null); - pass('maxBuffer', 1); - pass('maxBuffer', 0); - pass('maxBuffer', Infinity); - pass('maxBuffer', 3.14); - fail('maxBuffer', -1, invalidRangeError); - fail('maxBuffer', NaN, invalidRangeError); - fail('maxBuffer', -Infinity, invalidRangeError); - fail('maxBuffer', true, invalidRangeError); - fail('maxBuffer', false, invalidRangeError); - fail('maxBuffer', __dirname, invalidRangeError); - fail('maxBuffer', [], invalidRangeError); - fail('maxBuffer', {}, invalidRangeError); - fail('maxBuffer', common.mustNotCall(), invalidRangeError); -} - -{ - // Validate the killSignal option - const unknownSignalErr = { code: 'ERR_UNKNOWN_SIGNAL', name: 'TypeError' }; - - pass('killSignal', undefined); - pass('killSignal', null); - pass('killSignal', 'SIGKILL'); - fail('killSignal', 'SIGNOTAVALIDSIGNALNAME', unknownSignalErr); - fail('killSignal', true, invalidArgTypeError); - fail('killSignal', false, invalidArgTypeError); - fail('killSignal', [], invalidArgTypeError); - fail('killSignal', {}, invalidArgTypeError); - fail('killSignal', common.mustNotCall(), invalidArgTypeError); - - // Invalid signal names and numbers should fail - fail('killSignal', 500, unknownSignalErr); - fail('killSignal', 0, unknownSignalErr); - fail('killSignal', -200, unknownSignalErr); - fail('killSignal', 3.14, unknownSignalErr); - - Object.getOwnPropertyNames(Object.prototype).forEach((property) => { - fail('killSignal', property, unknownSignalErr); - }); - - // Valid signal names and numbers should pass - for (const signalName in signals) { - pass('killSignal', signals[signalName]); - pass('killSignal', signalName); - pass('killSignal', signalName.toLowerCase()); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync.js b/cli/tests/node_compat/test/parallel/test-child-process-spawnsync.js deleted file mode 100644 index bb60f3bef..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-spawnsync.js +++ /dev/null @@ -1,74 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -const assert = require('assert'); -const { spawnSync } = require('child_process'); -const { getSystemErrorName } = require('util'); - -// `sleep` does different things on Windows and Unix, but in both cases, it does -// more-or-less nothing if there are no parameters -const ret = spawnSync('sleep', ['0']); -assert.strictEqual(ret.status, 0); - -// Error test when command does not exist -const ret_err = spawnSync('command_does_not_exist', ['bar']).error; - -assert.strictEqual(ret_err.code, 'ENOENT'); -assert.strictEqual(getSystemErrorName(ret_err.errno), 'ENOENT'); -assert.strictEqual(ret_err.syscall, 'spawnSync command_does_not_exist'); -assert.strictEqual(ret_err.path, 'command_does_not_exist'); -assert.deepStrictEqual(ret_err.spawnargs, ['bar']); - -{ - // Test the cwd option - const cwd = tmpdir.path; - const response = spawnSync(...common.pwdCommand, { cwd }); - - assert.strictEqual(response.stdout.toString().trim(), cwd); -} - - -{ - // Assert Buffer is the default encoding - const retDefault = spawnSync(...common.pwdCommand); - const retBuffer = spawnSync(...common.pwdCommand, { encoding: 'buffer' }); - assert.deepStrictEqual(retDefault.output, retBuffer.output); - - const retUTF8 = spawnSync(...common.pwdCommand, { encoding: 'utf8' }); - const stringifiedDefault = [ - null, - retDefault.stdout.toString(), - retDefault.stderr.toString(), - ]; - assert.deepStrictEqual(retUTF8.output, stringifiedDefault); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-stdio-inherit.js b/cli/tests/node_compat/test/parallel/test-child-process-stdio-inherit.js deleted file mode 100644 index e213dd6b8..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-stdio-inherit.js +++ /dev/null @@ -1,66 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -// TODO(PolarETech): The process.argv[3] check should be argv[2], and -// the args passed to spawn() should not need to include "require.ts". - -'use strict'; -require('../common'); -const assert = require('assert'); -const spawn = require('child_process').spawn; - -if (process.argv[3] === 'parent') - parent(); -else - grandparent(); - -function grandparent() { - const child = spawn(process.execPath, ['require.ts', __filename, 'parent']); - child.stderr.pipe(process.stderr); - let output = ''; - const input = 'asdfasdf'; - - child.stdout.on('data', function(chunk) { - output += chunk; - }); - child.stdout.setEncoding('utf8'); - - child.stdin.end(input); - - child.on('close', function(code, signal) { - assert.strictEqual(code, 0); - assert.strictEqual(signal, null); - // 'cat' on windows adds a \r\n at the end. - assert.strictEqual(output.trim(), input.trim()); - }); -} - -function parent() { - // Should not immediately exit. - spawn('cat', [], { stdio: 'inherit' }); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js b/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js deleted file mode 100644 index 585cc6084..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush-exit.js +++ /dev/null @@ -1,67 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -// TODO(PolarETech): The process.argv[3] check should be argv[2], -// the args passed to spawn() should not need to include "require.ts", -// and the process.argv[2] passed to spawn() should be argv[1]. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -// If child process output to console and exit -// The console.log statements here are part of the test. -if (process.argv[3] === 'child') { - console.log('hello'); - for (let i = 0; i < 200; i++) { - console.log('filler'); - } - console.log('goodbye'); - process.exit(0); -} else { - // parent process - const spawn = require('child_process').spawn; - - // spawn self as child - const child = spawn(process.argv[0], ['require.ts', process.argv[2], 'child']); - - let stdout = ''; - - child.stderr.on('data', common.mustNotCall()); - - // Check if we receive both 'hello' at start and 'goodbye' at end - child.stdout.setEncoding('utf8'); - child.stdout.on('data', common.mustCallAtLeast((data) => { - stdout += data; - })); - - child.on('close', common.mustCall(() => { - assert.strictEqual(stdout.slice(0, 6), 'hello\n'); - assert.strictEqual(stdout.slice(stdout.length - 8), 'goodbye\n'); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush.js b/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush.js deleted file mode 100644 index 4054d2189..000000000 --- a/cli/tests/node_compat/test/parallel/test-child-process-stdout-flush.js +++ /dev/null @@ -1,58 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -// TODO(PolarETech): The args passed to spawn() should not need to -// include "require.ts". - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const spawn = require('child_process').spawn; -const fixtures = require('../common/fixtures'); - -const sub = fixtures.path('print-chars.js'); - -const n = 500000; - -const child = spawn(process.argv[0], ['require.ts', sub, n]); - -let count = 0; - -child.stderr.setEncoding('utf8'); -child.stderr.on('data', common.mustNotCall()); - -child.stdout.setEncoding('utf8'); -child.stdout.on('data', (data) => { - count += data.length; -}); - -child.on('close', common.mustCall((code, signal) => { - assert.strictEqual(code, 0); - assert.strictEqual(signal, null); - assert.strictEqual(n, count); -})); diff --git a/cli/tests/node_compat/test/parallel/test-console-async-write-error.js b/cli/tests/node_compat/test/parallel/test-console-async-write-error.js deleted file mode 100644 index e7591cb9b..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-async-write-error.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Console } = require('console'); -const { Writable } = require('stream'); - -for (const method of ['dir', 'log', 'warn']) { - const out = new Writable({ - write: common.mustCall((chunk, enc, callback) => { - process.nextTick(callback, new Error('foobar')); - }) - }); - - const c = new Console(out, out, true); - c[method]('abc'); // Should not throw. -} diff --git a/cli/tests/node_compat/test/parallel/test-console-group.js b/cli/tests/node_compat/test/parallel/test-console-group.js deleted file mode 100644 index f07107cec..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-group.js +++ /dev/null @@ -1,248 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const { - hijackStdout, - hijackStderr, - restoreStdout, - restoreStderr -} = require('../common/hijackstdio'); - -const assert = require('assert'); -const Console = require('console').Console; - -let c, stdout, stderr; - -function setup(groupIndentation) { - stdout = ''; - hijackStdout(function(data) { - stdout += data; - }); - - stderr = ''; - hijackStderr(function(data) { - stderr += data; - }); - - c = new Console({ stdout: process.stdout, - stderr: process.stderr, - colorMode: false, - groupIndentation: groupIndentation }); -} - -function teardown() { - restoreStdout(); - restoreStderr(); -} - -// Basic group() functionality -{ - setup(); - const expectedOut = 'This is the outer level\n' + - ' Level 2\n' + - ' Level 3\n' + - ' Back to level 2\n' + - 'Back to the outer level\n' + - 'Still at the outer level\n'; - - - const expectedErr = ' More of level 3\n'; - - c.log('This is the outer level'); - c.group(); - c.log('Level 2'); - c.group(); - c.log('Level 3'); - c.warn('More of level 3'); - c.groupEnd(); - c.log('Back to level 2'); - c.groupEnd(); - c.log('Back to the outer level'); - c.groupEnd(); - c.log('Still at the outer level'); - - assert.strictEqual(stdout, expectedOut); - assert.strictEqual(stderr, expectedErr); - teardown(); -} - -// Group indentation is tracked per Console instance. -{ - setup(); - const expectedOut = 'No indentation\n' + - 'None here either\n' + - ' Now the first console is indenting\n' + - 'But the second one does not\n'; - const expectedErr = ''; - - const c2 = new Console(process.stdout, process.stderr); - c.log('No indentation'); - c2.log('None here either'); - c.group(); - c.log('Now the first console is indenting'); - c2.log('But the second one does not'); - - assert.strictEqual(stdout, expectedOut); - assert.strictEqual(stderr, expectedErr); - teardown(); -} - -// Make sure labels work. -{ - setup(); - const expectedOut = 'This is a label\n' + - ' And this is the data for that label\n'; - const expectedErr = ''; - - c.group('This is a label'); - c.log('And this is the data for that label'); - - assert.strictEqual(stdout, expectedOut); - assert.strictEqual(stderr, expectedErr); - teardown(); -} - -// Check that console.groupCollapsed() is an alias of console.group() -{ - setup(); - const expectedOut = 'Label\n' + - ' Level 2\n' + - ' Level 3\n'; - const expectedErr = ''; - - c.groupCollapsed('Label'); - c.log('Level 2'); - c.groupCollapsed(); - c.log('Level 3'); - - assert.strictEqual(stdout, expectedOut); - assert.strictEqual(stderr, expectedErr); - teardown(); -} - -// Check that multiline strings and object output are indented properly. -{ - setup(); - const expectedOut = 'not indented\n' + - ' indented\n' + - ' also indented\n' + - ' {\n' + - " also: 'a',\n" + - " multiline: 'object',\n" + - " should: 'be',\n" + - " indented: 'properly',\n" + - " kthx: 'bai'\n" + - ' }\n'; - const expectedErr = ''; - - c.log('not indented'); - c.group(); - c.log('indented\nalso indented'); - c.log({ also: 'a', - multiline: 'object', - should: 'be', - indented: 'properly', - kthx: 'bai' }); - - assert.strictEqual(stdout, expectedOut); - assert.strictEqual(stderr, expectedErr); - teardown(); -} - -// Check that the kGroupIndent symbol property is not enumerable -{ - const keys = Reflect.ownKeys(console) - .filter((val) => Object.prototype.propertyIsEnumerable.call(console, val)) - .map((val) => val.toString()); - assert(!keys.includes('Symbol(groupIndent)'), - 'groupIndent should not be enumerable'); -} - -// Check custom groupIndentation. -{ - setup(3); - const expectedOut = 'Set the groupIndentation parameter to 3\n' + - 'This is the outer level\n' + - ' Level 2\n' + - ' Level 3\n' + - ' Back to level 2\n' + - 'Back to the outer level\n' + - 'Still at the outer level\n'; - - - const expectedErr = ' More of level 3\n'; - - c.log('Set the groupIndentation parameter to 3'); - c.log('This is the outer level'); - c.group(); - c.log('Level 2'); - c.group(); - c.log('Level 3'); - c.warn('More of level 3'); - c.groupEnd(); - c.log('Back to level 2'); - c.groupEnd(); - c.log('Back to the outer level'); - c.groupEnd(); - c.log('Still at the outer level'); - - assert.strictEqual(stdout, expectedOut); - assert.strictEqual(stderr, expectedErr); - teardown(); -} - -// Check the correctness of the groupIndentation parameter. -{ - // TypeError - [null, 'str', [], false, true, {}].forEach((e) => { - assert.throws( - () => { - new Console({ stdout: process.stdout, - stderr: process.stderr, - groupIndentation: e }); - }, - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - }); - - // RangeError for integer - [NaN, 1.01].forEach((e) => { - assert.throws( - () => { - new Console({ stdout: process.stdout, - stderr: process.stderr, - groupIndentation: e }); - }, - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: /an integer/, - } - ); - }); - - // RangeError - [-1, 1001].forEach((e) => { - assert.throws( - () => { - new Console({ stdout: process.stdout, - stderr: process.stderr, - groupIndentation: e }); - }, - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: />= 0 && <= 1000/, - } - ); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-console-instance.js b/cli/tests/node_compat/test/parallel/test-console-instance.js deleted file mode 100644 index ee561564f..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-instance.js +++ /dev/null @@ -1,156 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 Stream = require('stream'); -const requiredConsole = require('console'); -const Console = requiredConsole.Console; - -const out = new Stream(); -const err = new Stream(); - -// Ensure the Console instance doesn't write to the -// process' "stdout" or "stderr" streams. -process.stdout.write = process.stderr.write = common.mustNotCall(); - -// Make sure that the "Console" function exists. -assert.strictEqual(typeof Console, 'function'); - -// Note: We don't replace global console with node.js console -// assert.strictEqual(requiredConsole, global.console); -// Make sure the custom instanceof of Console works -assert.ok(global.console instanceof Console); -assert.ok(!({} instanceof Console)); - -// Make sure that the Console constructor throws -// when not given a writable stream instance. -assert.throws( - () => { new Console(); }, - { - code: 'ERR_CONSOLE_WRITABLE_STREAM', - name: 'TypeError', - message: /stdout/ - } -); - -// Console constructor should throw if stderr exists but is not writable. -assert.throws( - () => { - out.write = () => {}; - err.write = undefined; - new Console(out, err); - }, - { - code: 'ERR_CONSOLE_WRITABLE_STREAM', - name: 'TypeError', - message: /stderr/ - } -); - -out.write = err.write = (d) => {}; - -{ - const c = new Console(out, err); - assert.ok(c instanceof Console); - - out.write = err.write = common.mustCall((d) => { - assert.strictEqual(d, 'test\n'); - }, 2); - - c.log('test'); - c.error('test'); - - out.write = common.mustCall((d) => { - assert.strictEqual(d, '{ foo: 1 }\n'); - }); - - c.dir({ foo: 1 }); - - // Ensure that the console functions are bound to the console instance. - let called = 0; - out.write = common.mustCall((d) => { - called++; - assert.strictEqual(d, `${called} ${called - 1} [ 1, 2, 3 ]\n`); - }, 3); - - [1, 2, 3].forEach(c.log); -} - -// Test calling Console without the `new` keyword. -{ - const withoutNew = Console(out, err); - assert.ok(withoutNew instanceof Console); -} - -// Test extending Console -{ - class MyConsole extends Console { - hello() {} - // See if the methods on Console.prototype are overridable. - log() { return 'overridden'; } - } - const myConsole = new MyConsole(process.stdout); - assert.strictEqual(typeof myConsole.hello, 'function'); - assert.ok(myConsole instanceof Console); - assert.strictEqual(myConsole.log(), 'overridden'); - - const log = myConsole.log; - assert.strictEqual(log(), 'overridden'); -} - -// Instance that does not ignore the stream errors. -{ - const c2 = new Console(out, err, false); - - out.write = () => { throw new Error('out'); }; - err.write = () => { throw new Error('err'); }; - - assert.throws(() => c2.log('foo'), /^Error: out$/); - assert.throws(() => c2.warn('foo'), /^Error: err$/); - assert.throws(() => c2.dir('foo'), /^Error: out$/); -} - -// Console constructor throws if inspectOptions is not an object. -[null, true, false, 'foo', 5, Symbol()].forEach((inspectOptions) => { - assert.throws( - () => { - new Console({ - stdout: out, - stderr: err, - inspectOptions - }); - }, - { - message: 'The "options.inspectOptions" property must be of type object.' + - common.invalidArgTypeHelper(inspectOptions), - code: 'ERR_INVALID_ARG_TYPE' - } - ); -}); diff --git a/cli/tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js b/cli/tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js deleted file mode 100644 index 832e1a510..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-log-stdio-broken-dest.js +++ /dev/null @@ -1,31 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Writable } = require('stream'); -const { Console } = require('console'); -const { EventEmitter } = require('events'); - -const stream = new Writable({ - write(chunk, enc, cb) { - cb(); - }, - writev(chunks, cb) { - setTimeout(cb, 10, new Error('kaboom')); - } -}); -const myConsole = new Console(stream, stream); - -process.on('warning', common.mustNotCall()); - -stream.cork(); -for (let i = 0; i < EventEmitter.defaultMaxListeners + 1; i++) { - myConsole.log('a message'); -} -stream.uncork(); diff --git a/cli/tests/node_compat/test/parallel/test-console-log-throw-primitive.js b/cli/tests/node_compat/test/parallel/test-console-log-throw-primitive.js deleted file mode 100644 index 760c96399..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-log-throw-primitive.js +++ /dev/null @@ -1,21 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const { Writable } = require('stream'); -const { Console } = require('console'); - -const stream = new Writable({ - write() { - throw null; // eslint-disable-line no-throw-literal - } -}); - -const console = new Console({ stdout: stream }); - -console.log('test'); // Should not throw diff --git a/cli/tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js b/cli/tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js deleted file mode 100644 index 98621b3ce..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-no-swallow-stack-overflow.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { Console } = require('console'); -const { Writable } = require('stream'); - -for (const method of ['dir', 'log', 'warn']) { - assert.throws(() => { - const out = new Writable({ - write: common.mustCall(function write(...args) { - // Exceeds call stack. - return write(...args); - }), - }); - const c = new Console(out, out, true); - - c[method]('Hello, world!'); - }, { name: 'RangeError' }); -} diff --git a/cli/tests/node_compat/test/parallel/test-console-sync-write-error.js b/cli/tests/node_compat/test/parallel/test-console-sync-write-error.js deleted file mode 100644 index 1018a3b54..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-sync-write-error.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Console } = require('console'); -const { Writable } = require('stream'); - -for (const method of ['dir', 'log', 'warn']) { - { - const out = new Writable({ - write: common.mustCall((chunk, enc, callback) => { - callback(new Error('foobar')); - }) - }); - - const c = new Console(out, out, true); - c[method]('abc'); // Should not throw. - } - - { - const out = new Writable({ - write: common.mustCall((chunk, enc, callback) => { - throw new Error('foobar'); - }) - }); - - const c = new Console(out, out, true); - c[method]('abc'); // Should not throw. - } - - { - const out = new Writable({ - write: common.mustCall((chunk, enc, callback) => { - setImmediate(() => callback(new Error('foobar'))); - }) - }); - - const c = new Console(out, out, true); - c[method]('abc'); // Should not throw. - } -} diff --git a/cli/tests/node_compat/test/parallel/test-console-table.js b/cli/tests/node_compat/test/parallel/test-console-table.js deleted file mode 100644 index a7fddac1e..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-table.js +++ /dev/null @@ -1,300 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -const assert = require('assert'); -const { Console } = require('console'); - -const queue = []; - -const console = new Console({ write: (x) => { - queue.push(x); -}, removeListener: () => {} }, process.stderr, false); - -function test(data, only, expected) { - if (arguments.length === 2) { - expected = only; - only = undefined; - } - console.table(data, only); - assert.deepStrictEqual( - queue.shift().split('\n'), - expected.trimLeft().split('\n') - ); -} - -assert.throws(() => console.table([], false), { - code: 'ERR_INVALID_ARG_TYPE', -}); - -test(null, 'null\n'); -test(undefined, 'undefined\n'); -test(false, 'false\n'); -test('hi', 'hi\n'); -test(Symbol(), 'Symbol()\n'); -test(function() {}, '[Function (anonymous)]\n'); - -test([1, 2, 3], ` -┌─────────┬────────┐ -│ (index) │ Values │ -├─────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ -└─────────┴────────┘ -`); - -test([Symbol(), 5, [10]], ` -┌─────────┬────┬──────────┐ -│ (index) │ 0 │ Values │ -├─────────┼────┼──────────┤ -│ 0 │ │ Symbol() │ -│ 1 │ │ 5 │ -│ 2 │ 10 │ │ -└─────────┴────┴──────────┘ -`); - -test([null, 5], ` -┌─────────┬────────┐ -│ (index) │ Values │ -├─────────┼────────┤ -│ 0 │ null │ -│ 1 │ 5 │ -└─────────┴────────┘ -`); - -test([undefined, 5], ` -┌─────────┬───────────┐ -│ (index) │ Values │ -├─────────┼───────────┤ -│ 0 │ undefined │ -│ 1 │ 5 │ -└─────────┴───────────┘ -`); - -test({ a: 1, b: Symbol(), c: [10] }, ` -┌─────────┬────┬──────────┐ -│ (index) │ 0 │ Values │ -├─────────┼────┼──────────┤ -│ a │ │ 1 │ -│ b │ │ Symbol() │ -│ c │ 10 │ │ -└─────────┴────┴──────────┘ -`); - -test(new Map([ ['a', 1], [Symbol(), [2]] ]), ` -┌───────────────────┬──────────┬────────┐ -│ (iteration index) │ Key │ Values │ -├───────────────────┼──────────┼────────┤ -│ 0 │ 'a' │ 1 │ -│ 1 │ Symbol() │ [ 2 ] │ -└───────────────────┴──────────┴────────┘ -`); - -test(new Set([1, 2, Symbol()]), ` -┌───────────────────┬──────────┐ -│ (iteration index) │ Values │ -├───────────────────┼──────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ Symbol() │ -└───────────────────┴──────────┘ -`); - -test({ a: 1, b: 2 }, ['a'], ` -┌─────────┬───┐ -│ (index) │ a │ -├─────────┼───┤ -│ a │ │ -│ b │ │ -└─────────┴───┘ -`); - -test([{ a: 1, b: 2 }, { a: 3, c: 4 }], ['a'], ` -┌─────────┬───┐ -│ (index) │ a │ -├─────────┼───┤ -│ 0 │ 1 │ -│ 1 │ 3 │ -└─────────┴───┘ -`); - -test(new Map([[1, 1], [2, 2], [3, 3]]).entries(), ` -┌───────────────────┬─────┬────────┐ -│ (iteration index) │ Key │ Values │ -├───────────────────┼─────┼────────┤ -│ 0 │ 1 │ 1 │ -│ 1 │ 2 │ 2 │ -│ 2 │ 3 │ 3 │ -└───────────────────┴─────┴────────┘ -`); - -test(new Map([[1, 1], [2, 2], [3, 3]]).values(), ` -┌───────────────────┬────────┐ -│ (iteration index) │ Values │ -├───────────────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ -└───────────────────┴────────┘ -`); - -test(new Map([[1, 1], [2, 2], [3, 3]]).keys(), ` -┌───────────────────┬────────┐ -│ (iteration index) │ Values │ -├───────────────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ -└───────────────────┴────────┘ -`); - -test(new Set([1, 2, 3]).values(), ` -┌───────────────────┬────────┐ -│ (iteration index) │ Values │ -├───────────────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ -└───────────────────┴────────┘ -`); - - -test({ a: { a: 1, b: 2, c: 3 } }, ` -┌─────────┬───┬───┬───┐ -│ (index) │ a │ b │ c │ -├─────────┼───┼───┼───┤ -│ a │ 1 │ 2 │ 3 │ -└─────────┴───┴───┴───┘ -`); - -test({ a: { a: { a: 1, b: 2, c: 3 } } }, ` -┌─────────┬──────────┐ -│ (index) │ a │ -├─────────┼──────────┤ -│ a │ [Object] │ -└─────────┴──────────┘ -`); - -test({ a: [1, 2] }, ` -┌─────────┬───┬───┐ -│ (index) │ 0 │ 1 │ -├─────────┼───┼───┤ -│ a │ 1 │ 2 │ -└─────────┴───┴───┘ -`); - -test({ a: [1, 2, 3, 4, 5], b: 5, c: { e: 5 } }, ` -┌─────────┬───┬───┬───┬───┬───┬───┬────────┐ -│ (index) │ 0 │ 1 │ 2 │ 3 │ 4 │ e │ Values │ -├─────────┼───┼───┼───┼───┼───┼───┼────────┤ -│ a │ 1 │ 2 │ 3 │ 4 │ 5 │ │ │ -│ b │ │ │ │ │ │ │ 5 │ -│ c │ │ │ │ │ │ 5 │ │ -└─────────┴───┴───┴───┴───┴───┴───┴────────┘ -`); - -test(new Uint8Array([1, 2, 3]), ` -┌─────────┬────────┐ -│ (index) │ Values │ -├─────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ -└─────────┴────────┘ -`); - -test(Buffer.from([1, 2, 3]), ` -┌─────────┬────────┐ -│ (index) │ Values │ -├─────────┼────────┤ -│ 0 │ 1 │ -│ 1 │ 2 │ -│ 2 │ 3 │ -└─────────┴────────┘ -`); - -test({ a: undefined }, ['x'], ` -┌─────────┬───┐ -│ (index) │ x │ -├─────────┼───┤ -│ a │ │ -└─────────┴───┘ -`); - -test([], ` -┌─────────┐ -│ (index) │ -├─────────┤ -└─────────┘ -`); - -test(new Map(), ` -┌───────────────────┬─────┬────────┐ -│ (iteration index) │ Key │ Values │ -├───────────────────┼─────┼────────┤ -└───────────────────┴─────┴────────┘ -`); - -test([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }], ` -┌─────────┬─────┬─────┐ -│ (index) │ a │ b │ -├─────────┼─────┼─────┤ -│ 0 │ 1 │ 'Y' │ -│ 1 │ 'Z' │ 2 │ -└─────────┴─────┴─────┘ -`); - -{ - const line = '─'.repeat(79); - const header = `${' '.repeat(37)}name${' '.repeat(40)}`; - const name = 'very long long long long long long long long long long long ' + - 'long long long long'; - test([{ name }], ` -┌─────────┬──${line}──┐ -│ (index) │ ${header}│ -├─────────┼──${line}──┤ -│ 0 │ '${name}' │ -└─────────┴──${line}──┘ -`); -} - -test({ foo: '¥', bar: '¥' }, ` -┌─────────┬────────┐ -│ (index) │ Values │ -├─────────┼────────┤ -│ foo │ '¥' │ -│ bar │ '¥' │ -└─────────┴────────┘ -`); - -test({ foo: '你好', bar: 'hello' }, ` -┌─────────┬─────────┐ -│ (index) │ Values │ -├─────────┼─────────┤ -│ foo │ '你好' │ -│ bar │ 'hello' │ -└─────────┴─────────┘ -`); - -// Regression test for prototype pollution via console.table. Earlier versions -// of Node.js created an object with a non-null prototype within console.table -// and then wrote to object[column][index], which lead to an error as well as -// modifications to Object.prototype. -test([{ foo: 10 }, { foo: 20 }], ['__proto__'], ` -┌─────────┬───────────┐ -│ (index) │ __proto__ │ -├─────────┼───────────┤ -│ 0 │ │ -│ 1 │ │ -└─────────┴───────────┘ -`); -assert.strictEqual('0' in Object.prototype, false); -assert.strictEqual('1' in Object.prototype, false); diff --git a/cli/tests/node_compat/test/parallel/test-console-tty-colors.js b/cli/tests/node_compat/test/parallel/test-console-tty-colors.js deleted file mode 100644 index 6b6886d1f..000000000 --- a/cli/tests/node_compat/test/parallel/test-console-tty-colors.js +++ /dev/null @@ -1,102 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const util = require('util'); -const { Writable } = require('stream'); -const { Console } = require('console'); - -function check(isTTY, colorMode, expectedColorMode, inspectOptions) { - const items = [ - 1, - { a: 2 }, - [ 'foo' ], - { '\\a': '\\bar' }, - ]; - - let i = 0; - const stream = new Writable({ - write: common.mustCall((chunk, enc, cb) => { - assert.strictEqual(chunk.trim(), - util.inspect(items[i++], { - colors: expectedColorMode, - ...inspectOptions - })); - cb(); - }, items.length), - decodeStrings: false - }); - stream.isTTY = isTTY; - - // Set ignoreErrors to `false` here so that we see assertion failures - // from the `write()` call happen. - const testConsole = new Console({ - stdout: stream, - ignoreErrors: false, - colorMode, - inspectOptions - }); - for (const item of items) { - testConsole.log(item); - } -} - -check(true, 'auto', true); -check(false, 'auto', false); -check(false, undefined, true, { colors: true, compact: false }); -check(true, 'auto', true, { compact: false }); -check(true, undefined, false, { colors: false }); -check(true, true, true); -check(false, true, true); -check(true, false, false); -check(false, false, false); - -// Check invalid options. -{ - const stream = new Writable({ - write: common.mustNotCall() - }); - - [0, 'true', null, {}, [], () => {}].forEach((colorMode) => { - const received = util.inspect(colorMode); - assert.throws( - () => { - new Console({ - stdout: stream, - ignoreErrors: false, - colorMode: colorMode - }); - }, - { - message: `The argument 'colorMode' is invalid. Received ${received}`, - code: 'ERR_INVALID_ARG_VALUE' - } - ); - }); - - [true, false, 'auto'].forEach((colorMode) => { - assert.throws( - () => { - new Console({ - stdout: stream, - ignoreErrors: false, - colorMode: colorMode, - inspectOptions: { - colors: false - } - }); - }, - { - message: 'Option "options.inspectOptions.color" cannot be used in ' + - 'combination with option "colorMode"', - code: 'ERR_INCOMPATIBLE_OPTION_PAIR' - } - ); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-crypto-dh-shared.js b/cli/tests/node_compat/test/parallel/test-crypto-dh-shared.js deleted file mode 100644 index 7266b00b9..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-dh-shared.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); -const crypto = require('crypto'); - -const alice = crypto.createDiffieHellmanGroup('modp5'); -const bob = crypto.createDiffieHellmanGroup('modp5'); -alice.generateKeys(); -bob.generateKeys(); -const aSecret = alice.computeSecret(bob.getPublicKey()).toString('hex'); -const bSecret = bob.computeSecret(alice.getPublicKey()).toString('hex'); -assert.strictEqual(aSecret, bSecret); diff --git a/cli/tests/node_compat/test/parallel/test-crypto-dh.js b/cli/tests/node_compat/test/parallel/test-crypto-dh.js deleted file mode 100644 index bcf0c6764..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-dh.js +++ /dev/null @@ -1,214 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); -const crypto = require('crypto'); - -const size = common.hasFipsCrypto || common.hasOpenSSL3 ? 1024 : 256; -const dh1 = crypto.createDiffieHellman(size); -const p1 = dh1.getPrime('buffer'); -const dh2 = crypto.createDiffieHellman(p1, 'buffer'); -const key1 = dh1.generateKeys(); -const key2 = dh2.generateKeys('hex'); -const secret1 = dh1.computeSecret(key2, 'hex', 'base64'); -const secret2 = dh2.computeSecret(key1, 'latin1', 'buffer'); - -// Test Diffie-Hellman with two parties sharing a secret, -// using various encodings as we go along -assert.strictEqual(secret2.toString('base64'), secret1); -assert.strictEqual(dh1.verifyError, 0); -assert.strictEqual(dh2.verifyError, 0); - -// https://github.com/nodejs/node/issues/32738 -// XXX(bnoordhuis) validateInt32() throwing ERR_OUT_OF_RANGE and RangeError -// instead of ERR_INVALID_ARG_TYPE and TypeError is questionable, IMO. -assert.throws(() => crypto.createDiffieHellman(13.37), { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "sizeOrKey" is out of range. ' + - 'It must be an integer. Received 13.37', -}); - -assert.throws(() => crypto.createDiffieHellman('abcdef', 13.37), { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "generator" is out of range. ' + - 'It must be an integer. Received 13.37', -}); - -for (const bits of [-1, 0, 1]) { - if (common.hasOpenSSL3) { - assert.throws(() => crypto.createDiffieHellman(bits), { - code: 'ERR_OSSL_DH_MODULUS_TOO_SMALL', - name: 'Error', - message: /modulus too small/, - }); - } else { - assert.throws(() => crypto.createDiffieHellman(bits), { - code: 'ERR_OSSL_BN_BITS_TOO_SMALL', - name: 'Error', - message: /bits too small/, - }); - } -} - -// Through a fluke of history, g=0 defaults to DH_GENERATOR (2). -{ - const g = 0; - crypto.createDiffieHellman('abcdef', g); - crypto.createDiffieHellman('abcdef', 'hex', g); -} - -for (const g of [-1, 1]) { - const ex = { - code: 'ERR_OSSL_DH_BAD_GENERATOR', - name: 'Error', - message: /bad generator/, - }; - assert.throws(() => crypto.createDiffieHellman('abcdef', g), ex); - assert.throws(() => crypto.createDiffieHellman('abcdef', 'hex', g), ex); -} - -crypto.createDiffieHellman('abcdef', Buffer.from([2])); // OK - -for (const g of [Buffer.from([]), - Buffer.from([0]), - Buffer.from([1])]) { - const ex = { - code: 'ERR_OSSL_DH_BAD_GENERATOR', - name: 'Error', - message: /bad generator/, - }; - assert.throws(() => crypto.createDiffieHellman('abcdef', g), ex); - assert.throws(() => crypto.createDiffieHellman('abcdef', 'hex', g), ex); -} - -[ - [0x1, 0x2], - () => { }, - /abc/, - {}, -].forEach((input) => { - assert.throws( - () => crypto.createDiffieHellman(input), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - } - ); -}); - -// Create "another dh1" using generated keys from dh1, -// and compute secret again -const dh3 = crypto.createDiffieHellman(p1, 'buffer'); -const privkey1 = dh1.getPrivateKey(); -dh3.setPublicKey(key1); -dh3.setPrivateKey(privkey1); - -assert.deepStrictEqual(dh1.getPrime(), dh3.getPrime()); -assert.deepStrictEqual(dh1.getGenerator(), dh3.getGenerator()); -assert.deepStrictEqual(dh1.getPublicKey(), dh3.getPublicKey()); -assert.deepStrictEqual(dh1.getPrivateKey(), dh3.getPrivateKey()); -assert.strictEqual(dh3.verifyError, 0); - -const secret3 = dh3.computeSecret(key2, 'hex', 'base64'); - -assert.strictEqual(secret1, secret3); - -// computeSecret works without a public key set at all. -const dh4 = crypto.createDiffieHellman(p1, 'buffer'); -dh4.setPrivateKey(privkey1); - -assert.deepStrictEqual(dh1.getPrime(), dh4.getPrime()); -assert.deepStrictEqual(dh1.getGenerator(), dh4.getGenerator()); -assert.deepStrictEqual(dh1.getPrivateKey(), dh4.getPrivateKey()); -assert.strictEqual(dh4.verifyError, 0); - -const secret4 = dh4.computeSecret(key2, 'hex', 'base64'); - -assert.strictEqual(secret1, secret4); - - -if (false) { - let wrongBlockLength; - if (common.hasOpenSSL3) { - wrongBlockLength = { - message: 'error:1C80006B:Provider routines::wrong final block length', - code: 'ERR_OSSL_WRONG_FINAL_BLOCK_LENGTH', - library: 'Provider routines', - reason: 'wrong final block length' - }; - } else { - wrongBlockLength = { - message: 'error:0606506D:digital envelope' + - ' routines:EVP_DecryptFinal_ex:wrong final block length', - code: 'ERR_OSSL_EVP_WRONG_FINAL_BLOCK_LENGTH', - library: 'digital envelope routines', - reason: 'wrong final block length' - }; - } - - // Run this one twice to make sure that the dh3 clears its error properly - { - const c = crypto.createDecipheriv('aes-128-ecb', crypto.randomBytes(16), ''); - assert.throws(() => { - c.final('utf8'); - }, wrongBlockLength); - } - - { - const c = crypto.createDecipheriv('aes-128-ecb', crypto.randomBytes(16), ''); - assert.throws(() => { - c.final('utf8'); - }, wrongBlockLength); - } - - assert.throws(() => { - dh3.computeSecret(''); - }, { message: common.hasOpenSSL3 ? - 'error:02800080:Diffie-Hellman routines::invalid secret' : - 'Supplied key is too small' }); - - // Invalid test: curve argument is undefined - assert.throws( - () => crypto.createECDH(), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "curve" argument must be of type string. ' + - 'Received undefined' - }); -} - -assert.throws( - function() { - crypto.getDiffieHellman('unknown-group'); - }, - { - name: 'Error', - code: 'ERR_CRYPTO_UNKNOWN_DH_GROUP', - message: 'Unknown DH group' - }, - 'crypto.getDiffieHellman(\'unknown-group\') ' + - 'failed to throw the expected error.' -); - -assert.throws( - () => crypto.createDiffieHellman('', true), - { - code: 'ERR_INVALID_ARG_TYPE' - } -); -[true, Symbol(), {}, () => {}, []].forEach((generator) => assert.throws( - () => crypto.createDiffieHellman('', 'base64', generator), - { code: 'ERR_INVALID_ARG_TYPE' } -)); diff --git a/cli/tests/node_compat/test/parallel/test-crypto-hkdf.js b/cli/tests/node_compat/test/parallel/test-crypto-hkdf.js deleted file mode 100644 index b5b35e3ce..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-hkdf.js +++ /dev/null @@ -1,203 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. - -'use strict'; - -const common = require('../common'); - -if (!common.hasCrypto) - common.skip('missing crypto'); - -const { kMaxLength } = require('buffer'); -const assert = require('assert'); -const { - createSecretKey, - hkdf, - hkdfSync -} = require('crypto'); - -{ - assert.throws(() => hkdf(), { - code: 'ERR_INVALID_ARG_TYPE', - message: /The "digest" argument must be of type string/ - }); - - [1, {}, [], false, Infinity].forEach((i) => { - assert.throws(() => hkdf(i, 'a'), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "digest" argument must be of type string/ - }); - assert.throws(() => hkdfSync(i, 'a'), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "digest" argument must be of type string/ - }); - }); - - [1, {}, [], false, Infinity].forEach((i) => { - assert.throws(() => hkdf('sha256', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "ikm" argument must be / - }); - assert.throws(() => hkdfSync('sha256', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "ikm" argument must be / - }); - }); - - [1, {}, [], false, Infinity].forEach((i) => { - assert.throws(() => hkdf('sha256', 'secret', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "salt" argument must be / - }); - assert.throws(() => hkdfSync('sha256', 'secret', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "salt" argument must be / - }); - }); - - [1, {}, [], false, Infinity].forEach((i) => { - assert.throws(() => hkdf('sha256', 'secret', 'salt', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "info" argument must be / - }); - assert.throws(() => hkdfSync('sha256', 'secret', 'salt', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "info" argument must be / - }); - }); - - ['test', {}, [], false].forEach((i) => { - assert.throws(() => hkdf('sha256', 'secret', 'salt', 'info', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "length" argument must be of type number/ - }); - assert.throws(() => hkdfSync('sha256', 'secret', 'salt', 'info', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /^The "length" argument must be of type number/ - }); - }); - - assert.throws(() => hkdf('sha256', 'secret', 'salt', 'info', -1), { - code: 'ERR_OUT_OF_RANGE' - }); - assert.throws(() => hkdfSync('sha256', 'secret', 'salt', 'info', -1), { - code: 'ERR_OUT_OF_RANGE' - }); - assert.throws(() => hkdf('sha256', 'secret', 'salt', 'info', - kMaxLength + 1), { - code: 'ERR_OUT_OF_RANGE' - }); - assert.throws(() => hkdfSync('sha256', 'secret', 'salt', 'info', - kMaxLength + 1), { - code: 'ERR_OUT_OF_RANGE' - }); - - assert.throws(() => hkdfSync('unknown', 'a', '', '', 10), { - code: 'ERR_CRYPTO_INVALID_DIGEST' - }); - - assert.throws(() => hkdf('unknown', 'a', '', Buffer.alloc(1025), 10, - common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE' - }); - - assert.throws(() => hkdfSync('unknown', 'a', '', Buffer.alloc(1025), 10), { - code: 'ERR_OUT_OF_RANGE' - }); -} - -const algorithms = [ - ['sha256', 'secret', 'salt', 'info', 10], - ['sha256', '', '', '', 10], - ['sha256', '', 'salt', '', 10], - ['sha512', 'secret', 'salt', '', 15], -]; - -algorithms.forEach(([ hash, secret, salt, info, length ]) => { - { - const syncResult = hkdfSync(hash, secret, salt, info, length); - assert(syncResult instanceof ArrayBuffer); - let is_async = false; - hkdf(hash, secret, salt, info, length, - common.mustSucceed((asyncResult) => { - assert(is_async); - assert(asyncResult instanceof ArrayBuffer); - assert.deepStrictEqual(syncResult, asyncResult); - })); - // Keep this after the hkdf call above. This verifies - // that the callback is invoked asynchronously. - is_async = true; - } - - { - const buf_secret = Buffer.from(secret); - const buf_salt = Buffer.from(salt); - const buf_info = Buffer.from(info); - - const syncResult = hkdfSync(hash, buf_secret, buf_salt, buf_info, length); - hkdf(hash, buf_secret, buf_salt, buf_info, length, - common.mustSucceed((asyncResult) => { - assert.deepStrictEqual(syncResult, asyncResult); - })); - } - - { - const key_secret = createSecretKey(Buffer.from(secret)); - const buf_salt = Buffer.from(salt); - const buf_info = Buffer.from(info); - - const syncResult = hkdfSync(hash, key_secret, buf_salt, buf_info, length); - hkdf(hash, key_secret, buf_salt, buf_info, length, - common.mustSucceed((asyncResult) => { - assert.deepStrictEqual(syncResult, asyncResult); - })); - } - - { - const ta_secret = new Uint8Array(Buffer.from(secret)); - const ta_salt = new Uint16Array(Buffer.from(salt)); - const ta_info = new Uint32Array(Buffer.from(info)); - - const syncResult = hkdfSync(hash, ta_secret, ta_salt, ta_info, length); - hkdf(hash, ta_secret, ta_salt, ta_info, length, - common.mustSucceed((asyncResult) => { - assert.deepStrictEqual(syncResult, asyncResult); - })); - } - - { - const ta_secret = new Uint8Array(Buffer.from(secret)); - const ta_salt = new Uint16Array(Buffer.from(salt)); - const ta_info = new Uint32Array(Buffer.from(info)); - - const syncResult = hkdfSync( - hash, - ta_secret.buffer, - ta_salt.buffer, - ta_info.buffer, - length); - hkdf(hash, ta_secret, ta_salt, ta_info, length, - common.mustSucceed((asyncResult) => { - assert.deepStrictEqual(syncResult, asyncResult); - })); - } - - { - const ta_secret = new Uint8Array(Buffer.from(secret)); - const sa_salt = new ArrayBuffer(0); - const sa_info = new ArrayBuffer(1); - - const syncResult = hkdfSync( - hash, - ta_secret.buffer, - sa_salt, - sa_info, - length); - hkdf(hash, ta_secret, sa_salt, sa_info, length, - common.mustSucceed((asyncResult) => { - assert.deepStrictEqual(syncResult, asyncResult); - })); - } -}); diff --git a/cli/tests/node_compat/test/parallel/test-crypto-hmac.js b/cli/tests/node_compat/test/parallel/test-crypto-hmac.js deleted file mode 100644 index 174457a63..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-hmac.js +++ /dev/null @@ -1,483 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); -const crypto = require('crypto'); - -{ - const Hmac = crypto.Hmac; - const instance = crypto.Hmac('sha256', 'Node'); - assert(instance instanceof Hmac, 'Hmac is expected to return a new instance' + - ' when called without `new`'); -} - -assert.throws( - () => crypto.createHmac(null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "hmac" argument must be of type string. Received null' - }); - -// This used to segfault. See: https://github.com/nodejs/node/issues/9819 -assert.throws( - () => crypto.createHmac('sha256', 'key').digest({ - toString: () => { throw new Error('boom'); }, - }), - { - name: 'Error', - message: 'boom' - }); - -assert.throws( - () => crypto.createHmac('sha1', null), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - }); - -function testHmac(algo, key, data, expected) { - // TODO(kt3k): Skip non-string key for now. - // Enable this when we implement crypto.createSecretKey - if (typeof key !== "string") { - return; - } - // FIPS does not support MD5. - if (common.hasFipsCrypto && algo === 'md5') - return; - - if (!Array.isArray(data)) - data = [data]; - - // If the key is a Buffer, test Hmac with a key object as well. - const keyWrappers = [ - (key) => key, - ...(typeof key === 'string' ? [] : [crypto.createSecretKey]), - ]; - - for (const keyWrapper of keyWrappers) { - const hmac = crypto.createHmac(algo, keyWrapper(key)); - for (const chunk of data) - hmac.update(chunk); - const actual = hmac.digest('hex'); - assert.strictEqual(actual, expected); - } -} - -{ - // Test HMAC with multiple updates. - testHmac('sha1', 'Node', ['some data', 'to hmac'], - '19fd6e1ba73d9ed2224dd5094a71babe85d9a892'); -} - -// Test HMAC (Wikipedia Test Cases) -const wikipedia = [ - { - key: 'key', data: 'The quick brown fox jumps over the lazy dog', - hmac: { // HMACs lifted from Wikipedia. - md5: '80070713463e7749b90c2dc24911e275', - sha1: 'de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9', - sha256: - 'f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc' + - '2d1a3cd8' - } - }, - { - key: 'key', data: '', - hmac: { // Intermediate test to help debugging. - md5: '63530468a04e386459855da0063b6596', - sha1: 'f42bb0eeb018ebbd4597ae7213711ec60760843f', - sha256: - '5d5d139563c95b5967b9bd9a8c9b233a9dedb45072794cd232dc1b74' + - '832607d0' - } - }, - { - key: '', data: 'The quick brown fox jumps over the lazy dog', - hmac: { // Intermediate test to help debugging. - md5: 'ad262969c53bc16032f160081c4a07a0', - sha1: '2ba7f707ad5f187c412de3106583c3111d668de8', - sha256: - 'fb011e6154a19b9a4c767373c305275a5a69e8b68b0b4c9200c383dc' + - 'ed19a416' - } - }, - { - key: '', data: '', - hmac: { // HMACs lifted from Wikipedia. - md5: '74e6f7298a9c2d168935f58c001bad88', - sha1: 'fbdb1d1b18aa6c08324b7d64b71fb76370690e1d', - sha256: - 'b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c71214' + - '4292c5ad' - } - }, -]; - -for (const { key, data, hmac } of wikipedia) { - for (const hash in hmac) - testHmac(hash, key, data, hmac[hash]); -} - -// Test HMAC-SHA-* (rfc 4231 Test Cases) -const rfc4231 = [ - { - key: Buffer.from('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'), - data: Buffer.from('4869205468657265', 'hex'), // 'Hi There' - hmac: { - sha224: '896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22', - sha256: - 'b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c' + - '2e32cff7', - sha384: - 'afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c' + - '7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6', - sha512: - '87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b305' + - '45e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f170' + - '2e696c203a126854' - } - }, - { - key: Buffer.from('4a656665', 'hex'), // 'Jefe' - data: Buffer.from('7768617420646f2079612077616e7420666f72206e6f74686' + - '96e673f', 'hex'), // 'what do ya want for nothing?' - hmac: { - sha224: 'a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44', - sha256: - '5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b9' + - '64ec3843', - sha384: - 'af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec373' + - '6322445e8e2240ca5e69e2c78b3239ecfab21649', - sha512: - '164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7' + - 'ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b' + - '636e070a38bce737' - } - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'), - data: Buffer.from('ddddddddddddddddddddddddddddddddddddddddddddddddd' + - 'ddddddddddddddddddddddddddddddddddddddddddddddddddd', - 'hex'), - hmac: { - sha224: '7fb3cb3588c6c1f6ffa9694d7d6ad2649365b0c1f65d69d1ec8333ea', - sha256: - '773ea91e36800e46854db8ebd09181a72959098b3ef8c122d9635514' + - 'ced565fe', - sha384: - '88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe83ef4e5' + - '5966144b2a5ab39dc13814b94e3ab6e101a34f27', - sha512: - 'fa73b0089d56a284efb0f0756c890be9b1b5dbdd8ee81a3655f83e33' + - 'b2279d39bf3e848279a722c806b485a47e67c807b946a337bee89426' + - '74278859e13292fb' - } - }, - { - key: Buffer.from('0102030405060708090a0b0c0d0e0f10111213141516171819', - 'hex'), - data: Buffer.from('cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc' + - 'dcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd', - 'hex'), - hmac: { - sha224: '6c11506874013cac6a2abc1bb382627cec6a90d86efc012de7afec5a', - sha256: - '82558a389a443c0ea4cc819899f2083a85f0faa3e578f8077a2e3ff4' + - '6729665b', - sha384: - '3e8a69b7783c25851933ab6290af6ca77a9981480850009cc5577c6e' + - '1f573b4e6801dd23c4a7d679ccf8a386c674cffb', - sha512: - 'b0ba465637458c6990e5a8c5f61d4af7e576d97ff94b872de76f8050' + - '361ee3dba91ca5c11aa25eb4d679275cc5788063a5f19741120c4f2d' + - 'e2adebeb10a298dd' - } - }, - - { - key: Buffer.from('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'), - // 'Test With Truncation' - data: Buffer.from('546573742057697468205472756e636174696f6e', 'hex'), - hmac: { - sha224: '0e2aea68a90c8d37c988bcdb9fca6fa8', - sha256: 'a3b6167473100ee06e0c796c2955552b', - sha384: '3abf34c3503b2a23a46efc619baef897', - sha512: '415fad6271580a531d4179bc891d87a6' - }, - truncate: true - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaa', 'hex'), - // 'Test Using Larger Than Block-Size Key - Hash Key First' - data: Buffer.from('54657374205573696e67204c6172676572205468616e20426' + - 'c6f636b2d53697a65204b6579202d2048617368204b657920' + - '4669727374', 'hex'), - hmac: { - sha224: '95e9a0db962095adaebe9b2d6f0dbce2d499f112f2d2b7273fa6870e', - sha256: - '60e431591ee0b67f0d8a26aacbf5b77f8e0bc6213728c5140546040f' + - '0ee37f54', - sha384: - '4ece084485813e9088d2c63a041bc5b44f9ef1012a2b588f3cd11f05' + - '033ac4c60c2ef6ab4030fe8296248df163f44952', - sha512: - '80b24263c7c1a3ebb71493c1dd7be8b49b46d1f41b4aeec1121b0137' + - '83f8f3526b56d037e05f2598bd0fd2215d6a1e5295e64f73f63f0aec' + - '8b915a985d786598' - } - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaa', 'hex'), - // 'This is a test using a larger than block-size key and a larger ' + - // 'than block-size data. The key needs to be hashed before being ' + - // 'used by the HMAC algorithm.' - data: Buffer.from('5468697320697320612074657374207573696e672061206c6' + - '172676572207468616e20626c6f636b2d73697a65206b6579' + - '20616e642061206c6172676572207468616e20626c6f636b2' + - 'd73697a6520646174612e20546865206b6579206e65656473' + - '20746f20626520686173686564206265666f7265206265696' + - 'e6720757365642062792074686520484d414320616c676f72' + - '6974686d2e', 'hex'), - hmac: { - sha224: '3a854166ac5d9f023f54d517d0b39dbd946770db9c2b95c9f6f565d1', - sha256: - '9b09ffa71b942fcb27635fbcd5b0e944bfdc63644f0713938a7f5153' + - '5c3a35e2', - sha384: - '6617178e941f020d351e2f254e8fd32c602420feb0b8fb9adccebb82' + - '461e99c5a678cc31e799176d3860e6110c46523e', - sha512: - 'e37b6a775dc87dbaa4dfa9f96e5e3ffddebd71f8867289865df5a32d' + - '20cdc944b6022cac3c4982b10d5eeb55c3e4de15134676fb6de04460' + - '65c97440fa8c6a58' - } - }, -]; - -for (let i = 0, l = rfc4231.length; i < l; i++) { - for (const hash in rfc4231[i].hmac) { - const str = crypto.createHmac(hash, rfc4231[i].key); - str.end(rfc4231[i].data); - let strRes = str.read().toString('hex'); - let actual = crypto.createHmac(hash, rfc4231[i].key) - .update(rfc4231[i].data) - .digest('hex'); - if (rfc4231[i].truncate) { - actual = actual.slice(0, 32); // first 128 bits == 32 hex chars - strRes = strRes.slice(0, 32); - } - const expected = rfc4231[i].hmac[hash]; - assert.strictEqual( - actual, - expected, - `Test HMAC-${hash} rfc 4231 case ${i + 1}: ${actual} must be ${expected}` - ); - assert.strictEqual( - actual, - strRes, - `Should get same result from stream (hash: ${hash} and case: ${i + 1})` + - ` => ${actual} must be ${strRes}` - ); - } -} - -// Test HMAC-MD5/SHA1 (rfc 2202 Test Cases) -const rfc2202_md5 = [ - { - key: Buffer.from('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'), - data: 'Hi There', - hmac: '9294727a3638bb1c13f48ef8158bfc9d' - }, - { - key: 'Jefe', - data: 'what do ya want for nothing?', - hmac: '750c783e6ab0b503eaa86e310a5db738' - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'), - data: Buffer.from('ddddddddddddddddddddddddddddddddddddddddddddddddd' + - 'ddddddddddddddddddddddddddddddddddddddddddddddddddd', - 'hex'), - hmac: '56be34521d144c88dbb8c733f0e8b3f6' - }, - { - key: Buffer.from('0102030405060708090a0b0c0d0e0f10111213141516171819', - 'hex'), - data: Buffer.from('cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc' + - 'dcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + - 'cdcdcdcdcd', - 'hex'), - hmac: '697eaf0aca3a3aea3a75164746ffaa79' - }, - { - key: Buffer.from('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'), - data: 'Test With Truncation', - hmac: '56461ef2342edc00f9bab995690efd4c' - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaa', - 'hex'), - data: 'Test Using Larger Than Block-Size Key - Hash Key First', - hmac: '6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd' - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaa', - 'hex'), - data: - 'Test Using Larger Than Block-Size Key and Larger Than One ' + - 'Block-Size Data', - hmac: '6f630fad67cda0ee1fb1f562db3aa53e' - }, -]; - -for (const { key, data, hmac } of rfc2202_md5) - testHmac('md5', key, data, hmac); - -const rfc2202_sha1 = [ - { - key: Buffer.from('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b', 'hex'), - data: 'Hi There', - hmac: 'b617318655057264e28bc0b6fb378c8ef146be00' - }, - { - key: 'Jefe', - data: 'what do ya want for nothing?', - hmac: 'effcdf6ae5eb2fa2d27416d5f184df9c259a7c79' - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 'hex'), - data: Buffer.from('ddddddddddddddddddddddddddddddddddddddddddddd' + - 'ddddddddddddddddddddddddddddddddddddddddddddd' + - 'dddddddddd', - 'hex'), - hmac: '125d7342b9ac11cd91a39af48aa17b4f63f175d3' - }, - { - key: Buffer.from('0102030405060708090a0b0c0d0e0f10111213141516171819', - 'hex'), - data: Buffer.from('cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdc' + - 'dcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd' + - 'cdcdcdcdcd', - 'hex'), - hmac: '4c9007f4026250c6bc8414f9bf50c86c2d7235da' - }, - { - key: Buffer.from('0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c', 'hex'), - data: 'Test With Truncation', - hmac: '4c1a03424b55e07fe7f27be1d58bb9324a9a5a04' - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaa', - 'hex'), - data: 'Test Using Larger Than Block-Size Key - Hash Key First', - hmac: 'aa4ae5e15272d00e95705637ce8a3b55ed402112' - }, - { - key: Buffer.from('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + - 'aaaaaaaaaaaaaaaaaaaaaa', - 'hex'), - data: - 'Test Using Larger Than Block-Size Key and Larger Than One ' + - 'Block-Size Data', - hmac: 'e8e99d0f45237d786d6bbaa7965c7808bbff1a91' - }, -]; - -for (const { key, data, hmac } of rfc2202_sha1) - testHmac('sha1', key, data, hmac); - -assert.strictEqual( - crypto.createHmac('sha256', 'w00t').digest('ucs2'), - crypto.createHmac('sha256', 'w00t').digest().toString('ucs2')); - -// Check initialized -> uninitialized state transition after calling digest(). -{ - const expected = - '\u0010\u0041\u0052\u00c5\u00bf\u00dc\u00a0\u007b\u00c6\u0033' + - '\u00ee\u00bd\u0046\u0019\u009f\u0002\u0055\u00c9\u00f4\u009d'; - { - const h = crypto.createHmac('sha1', 'key').update('data'); - assert.deepStrictEqual(h.digest('buffer'), Buffer.from(expected, 'latin1')); - // TODO(kt3k): Enable this assertion - // assert.deepStrictEqual(h.digest('buffer'), Buffer.from('')); - } - { - const h = crypto.createHmac('sha1', 'key').update('data'); - assert.strictEqual(h.digest('latin1'), expected); - // TODO(kt3k): Enable this assertion - // assert.strictEqual(h.digest('latin1'), ''); - } -} - -// Check initialized -> uninitialized state transition after calling digest(). -// Calls to update() omitted intentionally. -{ - const expected = - '\u00f4\u002b\u00b0\u00ee\u00b0\u0018\u00eb\u00bd\u0045\u0097' + - '\u00ae\u0072\u0013\u0071\u001e\u00c6\u0007\u0060\u0084\u003f'; - { - const h = crypto.createHmac('sha1', 'key'); - assert.deepStrictEqual(h.digest('buffer'), Buffer.from(expected, 'latin1')); - // TODO(kt3k): Enable this assertion - // assert.deepStrictEqual(h.digest('buffer'), Buffer.from('')); - } - { - const h = crypto.createHmac('sha1', 'key'); - assert.strictEqual(h.digest('latin1'), expected); - // TODO(kt3k): Enable this assertion - // assert.strictEqual(h.digest('latin1'), ''); - } -} - -/* -TODO(kt3k): Enable this test. -{ - assert.throws( - () => crypto.createHmac('sha7', 'key'), - /Invalid digest/); -} -*/ - -/* - TODO(kt3k): enable this case when we implemented crypto.createSecretKey -{ - const buf = Buffer.alloc(0); - const keyObject = crypto.createSecretKey(Buffer.alloc(0)); - assert.deepStrictEqual( - crypto.createHmac('sha256', buf).update('foo').digest(), - crypto.createHmac('sha256', keyObject).update('foo').digest(), - ); -} -*/ diff --git a/cli/tests/node_compat/test/parallel/test-crypto-prime.js b/cli/tests/node_compat/test/parallel/test-crypto-prime.js deleted file mode 100644 index fc2218c2a..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-prime.js +++ /dev/null @@ -1,302 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. - -'use strict'; - -const common = require('../common'); -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); - -const { - generatePrime, - generatePrimeSync, - checkPrime, - checkPrimeSync, -} = require('crypto'); - -const { promisify } = require('util'); -const pgeneratePrime = promisify(generatePrime); -const pCheckPrime = promisify(checkPrime); - -assert(!checkPrimeSync(Buffer.from([0x1]))); -assert(checkPrimeSync(Buffer.from([0x2]))); -assert(checkPrimeSync(Buffer.from([0x3]))); -assert(!checkPrimeSync(Buffer.from([0x4]))); - -assert( - !checkPrimeSync( - Buffer.from([0x1]), - { - fast: true, - trialDivision: true, - checks: 10 - })); - -(async function() { - const prime = await pgeneratePrime(36); - assert(await pCheckPrime(prime)); -})().then(common.mustCall()); - -assert.throws(() => { - generatePrimeSync(32, { bigint: '' }); -}, { code: 'ERR_INVALID_ARG_TYPE' }); - -assert.throws(() => { - generatePrime(32, { bigint: '' }, common.mustNotCall()); -}, { code: 'ERR_INVALID_ARG_TYPE' }); - -{ - const prime = generatePrimeSync(3, { bigint: true }); - assert.strictEqual(typeof prime, 'bigint'); - assert.strictEqual(prime, 7n); - assert(checkPrimeSync(prime)); - checkPrime(prime, common.mustSucceed(assert)); -} - -{ - generatePrime(3, { bigint: true }, common.mustSucceed((prime) => { - assert.strictEqual(typeof prime, 'bigint'); - assert.strictEqual(prime, 7n); - assert(checkPrimeSync(prime)); - checkPrime(prime, common.mustSucceed(assert)); - })); -} - - -['hello', false, {}, []].forEach((i) => { - assert.throws(() => generatePrime(i), { - code: 'ERR_INVALID_ARG_TYPE' - }); - assert.throws(() => generatePrimeSync(i), { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -['hello', false, 123].forEach((i) => { - assert.throws(() => generatePrime(80, i, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_TYPE' - }); - assert.throws(() => generatePrimeSync(80, i), { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -['hello', false, 123].forEach((i) => { - assert.throws(() => generatePrime(80, {}), { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -[-1, 0, 2 ** 31, 2 ** 31 + 1, 2 ** 32 - 1, 2 ** 32].forEach((size) => { - assert.throws(() => generatePrime(size, common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE', - message: />= 1 && <= 2147483647/ - }); - assert.throws(() => generatePrimeSync(size), { - code: 'ERR_OUT_OF_RANGE', - message: />= 1 && <= 2147483647/ - }); -}); - -['test', -1, {}, []].forEach((i) => { - assert.throws(() => generatePrime(8, { safe: i }, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_TYPE' - }); - assert.throws(() => generatePrime(8, { rem: i }, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_TYPE' - }); - assert.throws(() => generatePrime(8, { add: i }, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_TYPE' - }); - assert.throws(() => generatePrimeSync(8, { safe: i }), { - code: 'ERR_INVALID_ARG_TYPE' - }); - assert.throws(() => generatePrimeSync(8, { rem: i }), { - code: 'ERR_INVALID_ARG_TYPE' - }); - assert.throws(() => generatePrimeSync(8, { add: i }), { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -{ - // Negative BigInts should not be converted to 0 silently. - - assert.throws(() => generatePrime(20, { add: -1n }, common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "options.add" is out of range. It must be >= 0. ' + - 'Received -1n' - }); - - assert.throws(() => generatePrime(20, { rem: -1n }, common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "options.rem" is out of range. It must be >= 0. ' + - 'Received -1n' - }); - - // assert.throws(() => checkPrime(-1n, common.mustNotCall()), { - // code: 'ERR_OUT_OF_RANGE', - // message: 'The value of "candidate" is out of range. It must be >= 0. ' + - // 'Received -1n' - // }); -} - -generatePrime(80, common.mustSucceed((prime) => { - assert(checkPrimeSync(prime)); - checkPrime(prime, common.mustSucceed((result) => { - assert(result); - })); -})); - -assert(checkPrimeSync(generatePrimeSync(80))); - -generatePrime(80, {}, common.mustSucceed((prime) => { - assert(checkPrimeSync(prime)); -})); - -assert(checkPrimeSync(generatePrimeSync(80, {}))); - -// generatePrime(32, { safe: true }, common.mustSucceed((prime) => { -// assert(checkPrimeSync(prime)); -// const buf = Buffer.from(prime); -// const val = buf.readUInt32BE(); -// const check = (val - 1) / 2; -// buf.writeUInt32BE(check); -// assert(checkPrimeSync(buf)); -// })); - -// { -// const prime = generatePrimeSync(32, { safe: true }); -// assert(checkPrimeSync(prime)); -// const buf = Buffer.from(prime); -// const val = buf.readUInt32BE(); -// const check = (val - 1) / 2; -// buf.writeUInt32BE(check); -// assert(checkPrimeSync(buf)); -// } - -// const add = 12; -// const rem = 11; -// const add_buf = Buffer.from([add]); -// const rem_buf = Buffer.from([rem]); -// generatePrime( -// 32, -// { add: add_buf, rem: rem_buf }, -// common.mustSucceed((prime) => { -// assert(checkPrimeSync(prime)); -// const buf = Buffer.from(prime); -// const val = buf.readUInt32BE(); -// assert.strictEqual(val % add, rem); -// })); - -// { -// const prime = generatePrimeSync(32, { add: add_buf, rem: rem_buf }); -// assert(checkPrimeSync(prime)); -// const buf = Buffer.from(prime); -// const val = buf.readUInt32BE(); -// assert.strictEqual(val % add, rem); -// } - -// { -// const prime = generatePrimeSync(32, { add: BigInt(add), rem: BigInt(rem) }); -// assert(checkPrimeSync(prime)); -// const buf = Buffer.from(prime); -// const val = buf.readUInt32BE(); -// assert.strictEqual(val % add, rem); -// } - -// { -// // The behavior when specifying only add without rem should depend on the -// // safe option. - -// if (process.versions.openssl >= '1.1.1f') { -// generatePrime(128, { -// bigint: true, -// add: 5n -// }, common.mustSucceed((prime) => { -// assert(checkPrimeSync(prime)); -// assert.strictEqual(prime % 5n, 1n); -// })); - -// generatePrime(128, { -// bigint: true, -// safe: true, -// add: 5n -// }, common.mustSucceed((prime) => { -// assert(checkPrimeSync(prime)); -// assert.strictEqual(prime % 5n, 3n); -// })); -// } -// } - -// { -// // This is impossible because it implies (prime % 2**64) == 1 and -// // prime < 2**64, meaning prime = 1, but 1 is not prime. -// for (const add of [2n ** 64n, 2n ** 65n]) { -// assert.throws(() => { -// generatePrimeSync(64, { add }); -// }, { -// code: 'ERR_OUT_OF_RANGE', -// message: 'invalid options.add' -// }); -// } - -// // Any parameters with rem >= add lead to an impossible condition. -// for (const rem of [7n, 8n, 3000n]) { -// assert.throws(() => { -// generatePrimeSync(64, { add: 7n, rem }); -// }, { -// code: 'ERR_OUT_OF_RANGE', -// message: 'invalid options.rem' -// }); -// } - -// // This is possible, but not allowed. It implies prime == 7, which means that -// // we did not actually generate a random prime. -// assert.throws(() => { -// generatePrimeSync(3, { add: 8n, rem: 7n }); -// }, { -// code: 'ERR_OUT_OF_RANGE' -// }); - -// if (process.versions.openssl >= '1.1.1f') { -// // This is possible and allowed (but makes little sense). -// assert.strictEqual(generatePrimeSync(4, { -// add: 15n, -// rem: 13n, -// bigint: true -// }), 13n); -// } -// } - -[1, 'hello', {}, []].forEach((i) => { - assert.throws(() => checkPrime(i), { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -for (const checks of ['hello', {}, []]) { - assert.throws(() => checkPrime(2n, { checks }, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_TYPE', - message: /checks/ - }); - assert.throws(() => checkPrimeSync(2n, { checks }), { - code: 'ERR_INVALID_ARG_TYPE', - message: /checks/ - }); -} - -for (const checks of [-(2 ** 31), -1, 2 ** 31, 2 ** 32 - 1, 2 ** 32, 2 ** 50]) { - assert.throws(() => checkPrime(2n, { checks }, common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE', - message: /<= 2147483647/ - }); - assert.throws(() => checkPrimeSync(2n, { checks }), { - code: 'ERR_OUT_OF_RANGE', - message: /<= 2147483647/ - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-crypto-secret-keygen.js b/cli/tests/node_compat/test/parallel/test-crypto-secret-keygen.js deleted file mode 100644 index b108269d3..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-secret-keygen.js +++ /dev/null @@ -1,144 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); - -const { - generateKey, - generateKeySync -} = require('crypto'); - -[1, true, [], {}, Infinity, null, undefined].forEach((i) => { - assert.throws(() => generateKey(i, 1, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_TYPE', - message: /The "type" argument must be / - }); - assert.throws(() => generateKeySync(i, 1), { - code: 'ERR_INVALID_ARG_TYPE', - message: /The "type" argument must be / - }); -}); - -['', true, [], null, undefined].forEach((i) => { - assert.throws(() => generateKey('aes', i, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_TYPE', - message: /The "options" argument must be / - }); - assert.throws(() => generateKeySync('aes', i), { - code: 'ERR_INVALID_ARG_TYPE', - message: /The "options" argument must be / - }); -}); - -['', true, {}, [], null, undefined].forEach((length) => { - assert.throws(() => generateKey('hmac', { length }, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_TYPE', - message: /The "options\.length" property must be / - }); - assert.throws(() => generateKeySync('hmac', { length }), { - code: 'ERR_INVALID_ARG_TYPE', - message: /The "options\.length" property must be / - }); -}); - -assert.throws(() => generateKey('aes', { length: 256 }), { - code: 'ERR_INVALID_ARG_TYPE' -}); - -assert.throws(() => generateKey('hmac', { length: -1 }, common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE' -}); - -assert.throws(() => generateKey('hmac', { length: 4 }, common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE' -}); - -assert.throws(() => generateKey('hmac', { length: 7 }, common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE' -}); - -assert.throws( - () => generateKey('hmac', { length: 2 ** 31 }, common.mustNotCall()), { - code: 'ERR_OUT_OF_RANGE' - }); - -assert.throws(() => generateKeySync('hmac', { length: -1 }), { - code: 'ERR_OUT_OF_RANGE' -}); - -assert.throws(() => generateKeySync('hmac', { length: 4 }), { - code: 'ERR_OUT_OF_RANGE' -}); - -assert.throws(() => generateKeySync('hmac', { length: 7 }), { - code: 'ERR_OUT_OF_RANGE' -}); - -assert.throws( - () => generateKeySync('hmac', { length: 2 ** 31 }), { - code: 'ERR_OUT_OF_RANGE' - }); - -assert.throws(() => generateKeySync('aes', { length: 123 }), { - code: 'ERR_INVALID_ARG_VALUE', - message: /The property 'options\.length' must be one of: 128, 192, 256/ -}); - -{ - const key = generateKeySync('aes', { length: 128 }); - assert(key); - const keybuf = key.export(); - assert.strictEqual(keybuf.byteLength, 128 / 8); - - generateKey('aes', { length: 128 }, common.mustSucceed((key) => { - assert(key); - const keybuf = key.export(); - assert.strictEqual(keybuf.byteLength, 128 / 8); - })); -} - -{ - const key = generateKeySync('aes', { length: 256 }); - assert(key); - const keybuf = key.export(); - assert.strictEqual(keybuf.byteLength, 256 / 8); - - generateKey('aes', { length: 256 }, common.mustSucceed((key) => { - assert(key); - const keybuf = key.export(); - assert.strictEqual(keybuf.byteLength, 256 / 8); - })); -} - -{ - const key = generateKeySync('hmac', { length: 123 }); - assert(key); - const keybuf = key.export(); - assert.strictEqual(keybuf.byteLength, Math.floor(123 / 8)); - - generateKey('hmac', { length: 123 }, common.mustSucceed((key) => { - assert(key); - const keybuf = key.export(); - assert.strictEqual(keybuf.byteLength, Math.floor(123 / 8)); - })); -} - -assert.throws( - () => generateKey('unknown', { length: 123 }, common.mustNotCall()), { - code: 'ERR_INVALID_ARG_VALUE', - message: /The argument 'type' must be a supported key type/ - }); - -assert.throws(() => generateKeySync('unknown', { length: 123 }), { - code: 'ERR_INVALID_ARG_VALUE', - message: /The argument 'type' must be a supported key type/ -}); diff --git a/cli/tests/node_compat/test/parallel/test-crypto-stream.js b/cli/tests/node_compat/test/parallel/test-crypto-stream.js deleted file mode 100644 index 07d3c5c6d..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-stream.js +++ /dev/null @@ -1,96 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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'); -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); -const stream = require('stream'); -const crypto = require('crypto'); - -if (!common.hasFipsCrypto) { - // Small stream to buffer converter - class Stream2buffer extends stream.Writable { - constructor(callback) { - super(); - - this._buffers = []; - this.once('finish', function() { - callback(null, Buffer.concat(this._buffers)); - }); - } - - _write(data, encoding, done) { - this._buffers.push(data); - return done(null); - } - } - - // Create an md5 hash of "Hallo world" - const hasher1 = crypto.createHash('md5'); - hasher1.pipe(new Stream2buffer(common.mustCall(function end(err, hash) { - assert.strictEqual(err, null); - assert.strictEqual( - hash.toString('hex'), '06460dadb35d3d503047ce750ceb2d07' - ); - }))); - hasher1.end('Hallo world'); - - // Simpler check for unpipe, setEncoding, pause and resume - crypto.createHash('md5').unpipe({}); - crypto.createHash('md5').setEncoding('utf8'); - crypto.createHash('md5').pause(); - crypto.createHash('md5').resume(); -} - -// Decipher._flush() should emit an error event, not an exception. -const key = Buffer.from('48fb56eb10ffeb13fc0ef551bbca3b1b', 'hex'); -const badkey = Buffer.from('12341234123412341234123412341234', 'hex'); -const iv = Buffer.from('6d358219d1f488f5f4eb12820a66d146', 'hex'); -const cipher = crypto.createCipheriv('aes-128-cbc', key, iv); -const decipher = crypto.createDecipheriv('aes-128-cbc', badkey, iv); - -// TODO(kt3k): Align error message of decipher with wrong padding and -// enable the below test case. -/* -cipher.pipe(decipher) - .on('error', common.expectsError(common.hasOpenSSL3 ? { - message: /bad decrypt/, - library: 'Provider routines', - reason: 'bad decrypt', - } : { - message: /bad decrypt/, - function: 'EVP_DecryptFinal_ex', - library: 'digital envelope routines', - reason: 'bad decrypt', - })); -*/ - -cipher.end('Papaya!'); // Should not cause an unhandled exception. diff --git a/cli/tests/node_compat/test/parallel/test-crypto-update-encoding.js b/cli/tests/node_compat/test/parallel/test-crypto-update-encoding.js deleted file mode 100644 index deb3c17c3..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-update-encoding.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -if (!common.hasCrypto) - common.skip('missing crypto'); - -const crypto = require('crypto'); - -const zeros = Buffer.alloc; -const key = zeros(16); -const iv = zeros(16); - -const cipher = () => crypto.createCipheriv('aes-128-cbc', key, iv); -const decipher = () => crypto.createDecipheriv('aes-128-cbc', key, iv); -const hash = () => crypto.createSign('sha256'); -const hmac = () => crypto.createHmac('sha256', key); -const sign = () => crypto.createSign('sha256'); -const verify = () => crypto.createVerify('sha256'); - -for (const f of [cipher, decipher, hash, hmac, sign, verify]) - for (const n of [15, 16]) - f().update(zeros(n), 'hex'); // Should ignore inputEncoding. diff --git a/cli/tests/node_compat/test/parallel/test-crypto-x509.js b/cli/tests/node_compat/test/parallel/test-crypto-x509.js deleted file mode 100644 index eeee2f7d7..000000000 --- a/cli/tests/node_compat/test/parallel/test-crypto-x509.js +++ /dev/null @@ -1,109 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. - -'use strict'; -const common = require('../common'); - -if (!common.hasCrypto) - common.skip('missing crypto'); - -const { - X509Certificate, -} = require('crypto'); - -const assert = require('assert'); -const fixtures = require('../common/fixtures'); -const { readFileSync } = require('fs'); - -const cert = readFileSync(fixtures.path('keys', 'agent1-cert.pem')); -const ca = readFileSync(fixtures.path('keys', 'ca1-cert.pem')); - -[1, {}, false, null].forEach((i) => { - assert.throws(() => new X509Certificate(i), { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -const subjectCheck = `C=US -ST=CA -L=SF -O=Joyent -OU=Node.js -CN=agent1 -Email=ry@tinyclouds.org`; - -const issuerCheck = `C=US -ST=CA -L=SF -O=Joyent -OU=Node.js -CN=ca1 -Email=ry@tinyclouds.org`; - -let infoAccessCheck = `OCSP - URI:http://ocsp.nodejs.org/ -CA Issuers - URI:http://ca.nodejs.org/ca.cert`; -if (!common.hasOpenSSL3) - infoAccessCheck += '\n'; - -const der = Buffer.from( - '308203e8308202d0a0030201020214147d36c1c2f74206de9fab5f2226d78adb00a42630' + - '0d06092a864886f70d01010b0500307a310b3009060355040613025553310b3009060355' + - '04080c024341310b300906035504070c025346310f300d060355040a0c064a6f79656e74' + - '3110300e060355040b0c074e6f64652e6a73310c300a06035504030c036361313120301e' + - '06092a864886f70d010901161172794074696e79636c6f7564732e6f72673020170d3232' + - '303930333231343033375a180f32323936303631373231343033375a307d310b30090603' + - '55040613025553310b300906035504080c024341310b300906035504070c025346310f30' + - '0d060355040a0c064a6f79656e743110300e060355040b0c074e6f64652e6a73310f300d' + - '06035504030c066167656e74313120301e06092a864886f70d010901161172794074696e' + - '79636c6f7564732e6f726730820122300d06092a864886f70d01010105000382010f0030' + - '82010a0282010100d456320afb20d3827093dc2c4284ed04dfbabd56e1ddae529e28b790' + - 'cd4256db273349f3735ffd337c7a6363ecca5a27b7f73dc7089a96c6d886db0c62388f1c' + - 'dd6a963afcd599d5800e587a11f908960f84ed50ba25a28303ecda6e684fbe7baedc9ce8' + - '801327b1697af25097cee3f175e400984c0db6a8eb87be03b4cf94774ba56fffc8c63c68' + - 'd6adeb60abbe69a7b14ab6a6b9e7baa89b5adab8eb07897c07f6d4fa3d660dff574107d2' + - '8e8f63467a788624c574197693e959cea1362ffae1bba10c8c0d88840abfef103631b2e8' + - 'f5c39b5548a7ea57e8a39f89291813f45a76c448033a2b7ed8403f4baa147cf35e2d2554' + - 'aa65ce49695797095bf4dc6b0203010001a361305f305d06082b06010505070101045130' + - '4f302306082b060105050730018617687474703a2f2f6f6373702e6e6f64656a732e6f72' + - '672f302806082b06010505073002861c687474703a2f2f63612e6e6f64656a732e6f7267' + - '2f63612e63657274300d06092a864886f70d01010b05000382010100c3349810632ccb7d' + - 'a585de3ed51e34ed154f0f7215608cf2701c00eda444dc2427072c8aca4da6472c1d9e68' + - 'f177f99a90a8b5dbf3884586d61cb1c14ea7016c8d38b70d1b46b42947db30edc1e9961e' + - 'd46c0f0e35da427bfbe52900771817e733b371adf19e12137235141a34347db0dfc05579' + - '8b1f269f3bdf5e30ce35d1339d56bb3c570de9096215433047f87ca42447b44e7e6b5d0e' + - '48f7894ab186f85b6b1a74561b520952fea888617f32f582afce1111581cd63efcc68986' + - '00d248bb684dedb9c3d6710c38de9e9bc21f9c3394b729d5f707d64ea890603e5989f8fa' + - '59c19ad1a00732e7adc851b89487cc00799dde068aa64b3b8fd976e8bc113ef2', - 'hex'); - -{ - const x509 = new X509Certificate(cert); - - assert(!x509.ca); - assert.strictEqual(x509.subject, subjectCheck); - assert.strictEqual(x509.subjectAltName, undefined); - assert.strictEqual(x509.issuer, issuerCheck); - assert.strictEqual(x509.validFrom, 'Sep 3 21:40:37 2022 +00:00'); - assert.strictEqual(x509.validTo, 'Jun 17 21:40:37 2296 +00:00'); - assert.strictEqual( - x509.fingerprint, - '8B:89:16:C4:99:87:D2:13:1A:64:94:36:38:A5:32:01:F0:95:3B:53'); - assert.strictEqual( - x509.fingerprint256, - '2C:62:59:16:91:89:AB:90:6A:3E:98:88:A6:D3:C5:58:58:6C:AE:FF:9C:33:' + - '22:7C:B6:77:D3:34:E7:53:4B:05' - ); - assert.strictEqual( - x509.fingerprint512, - '0B:6F:D0:4D:6B:22:53:99:66:62:51:2D:2C:96:F2:58:3F:95:1C:CC:4C:44:' + - '9D:B5:59:AA:AD:A8:F6:2A:24:8A:BB:06:A5:26:42:52:30:A3:37:61:30:A9:' + - '5A:42:63:E0:21:2F:D6:70:63:07:96:6F:27:A7:78:12:08:02:7A:8B' - ); - assert.strictEqual(x509.keyUsage, undefined); - assert.strictEqual(x509.serialNumber, '147D36C1C2F74206DE9FAB5F2226D78ADB00A426'); - - assert.strictEqual(x509.checkEmail('ry@tinyclouds.org'), 'ry@tinyclouds.org'); - assert.strictEqual(x509.checkEmail('sally@example.com'), undefined); -}
\ No newline at end of file diff --git a/cli/tests/node_compat/test/parallel/test-dgram-close-during-bind.js b/cli/tests/node_compat/test/parallel/test-dgram-close-during-bind.js deleted file mode 100644 index fd1fe523e..000000000 --- a/cli/tests/node_compat/test/parallel/test-dgram-close-during-bind.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; -const common = require('../common'); -const dgram = require('dgram'); -const { kStateSymbol } = require('internal/dgram'); -const socket = dgram.createSocket('udp4'); -const { handle } = socket[kStateSymbol]; -const lookup = handle.lookup; - -// Test the scenario where the socket is closed during a bind operation. -handle.bind = common.mustNotCall('bind() should not be called.'); - -handle.lookup = common.mustCall(function(address, callback) { - socket.close(common.mustCall(() => { - lookup.call(this, address, callback); - })); -}); - -socket.bind(common.mustNotCall('Socket should not bind.')); diff --git a/cli/tests/node_compat/test/parallel/test-dgram-close-signal.js b/cli/tests/node_compat/test/parallel/test-dgram-close-signal.js deleted file mode 100644 index ef6ac3a32..000000000 --- a/cli/tests/node_compat/test/parallel/test-dgram-close-signal.js +++ /dev/null @@ -1,38 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const dgram = require('dgram'); - -{ - // Test bad signal. - assert.throws( - () => dgram.createSocket({ type: 'udp4', signal: {} }), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); -} - -{ - // Test close. - const controller = new AbortController(); - const { signal } = controller; - const server = dgram.createSocket({ type: 'udp4', signal }); - server.on('close', common.mustCall()); - controller.abort(); -} - -{ - // Test close with pre-aborted signal. - const signal = AbortSignal.abort(); - const server = dgram.createSocket({ type: 'udp4', signal }); - server.on('close', common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-dgram-custom-lookup.js b/cli/tests/node_compat/test/parallel/test-dgram-custom-lookup.js deleted file mode 100644 index ca3bd3df3..000000000 --- a/cli/tests/node_compat/test/parallel/test-dgram-custom-lookup.js +++ /dev/null @@ -1,56 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const dgram = require('dgram'); -const dns = require('dns'); - -{ - // Verify that the provided lookup function is called. - const lookup = common.mustCall((host, family, callback) => { - dns.lookup(host, family, callback); - }); - - const socket = dgram.createSocket({ type: 'udp4', lookup }); - - socket.bind(common.mustCall(() => { - socket.close(); - })); -} - -// TODO: unable to overwrite imports with spies -// { -// // Verify that lookup defaults to dns.lookup(). -// const originalLookup = dns.lookup; - -// dns.lookup = common.mustCall((host, family, callback) => { -// dns.lookup = originalLookup; -// originalLookup(host, family, callback); -// }); - -// const socket = dgram.createSocket({ type: 'udp4' }); - -// socket.bind(common.mustCall(() => { -// socket.close(); -// })); -// } - -{ - // Verify that non-functions throw. - [null, true, false, 0, 1, NaN, '', 'foo', {}, Symbol()].forEach((value) => { - assert.throws(() => { - dgram.createSocket({ type: 'udp4', lookup: value }); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "lookup" argument must be of type function.' + - common.invalidArgTypeHelper(value) - }); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-dgram-ipv6only.js b/cli/tests/node_compat/test/parallel/test-dgram-ipv6only.js deleted file mode 100644 index 31f4e1fd9..000000000 --- a/cli/tests/node_compat/test/parallel/test-dgram-ipv6only.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// TODO(cmorten): Deno.listenDatagram is currently `0.0.0.0` when you listen to `::`. - -'use strict'; - -const common = require('../common'); -if (!common.hasIPv6) - common.skip('no IPv6 support'); - -const dgram = require('dgram'); - -// This test ensures that dual-stack support is disabled when -// we specify the `ipv6Only` option in `dgram.createSocket()`. -const socket = dgram.createSocket({ - type: 'udp6', - ipv6Only: true, -}); - -socket.bind({ - port: 0, - address: '::', -}, common.mustCall(() => { - const { port } = socket.address(); - const client = dgram.createSocket('udp4'); - - // We can still bind to '0.0.0.0'. - // TODO: uncomment out when Deno allows IPv4 and IPv6 to be bound - // independently - // client.bind({ - // port, - // address: '0.0.0.0', - // }, common.mustCall(() => { - client.close(); - socket.close(); - // })); - - client.on('error', common.mustNotCall()); -})); diff --git a/cli/tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js b/cli/tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js deleted file mode 100644 index d2fd5af50..000000000 --- a/cli/tests/node_compat/test/parallel/test-dgram-send-cb-quelches-error.js +++ /dev/null @@ -1,47 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// TODO(cmorten): uncomment dns module code once dns.setServer() has been -// implemented - -'use strict'; -const common = require('../common'); -const mustCall = common.mustCall; -const assert = require('assert'); -const dgram = require('dgram'); -// const dns = require('dns'); - -const socket = dgram.createSocket('udp4'); -const buffer = Buffer.from('gary busey'); - -// dns.setServers([]); - -socket.once('error', onEvent); - -// assert that: -// * callbacks act as "error" listeners if given. -// * error is never emitter for missing dns entries -// if a callback that handles error is present -// * error is emitted if a callback with no argument is passed -socket.send(buffer, 0, buffer.length, 100, - 'dne.example.com', mustCall(callbackOnly)); - -function callbackOnly(err) { - assert.ok(err); - socket.removeListener('error', onEvent); - socket.on('error', mustCall(onError)); - socket.send(buffer, 0, buffer.length, 100, 'dne.invalid'); -} - -function onEvent(err) { - assert.fail(`Error should not be emitted if there is callback: ${err}`); -} - -function onError(err) { - assert.ok(err); - socket.close(); -} diff --git a/cli/tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js b/cli/tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js deleted file mode 100644 index b2fc33262..000000000 --- a/cli/tests/node_compat/test/parallel/test-dgram-socket-buffer-size.js +++ /dev/null @@ -1,178 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --expose-internals -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const dgram = require('dgram'); -const { inspect } = require('util'); -const { internalBinding } = require('internal/test/binding'); -const { - UV_EBADF, - UV_EINVAL, - UV_ENOTSOCK -} = internalBinding('uv'); - -// Note error test amendments from Node due to Deno formatting errors slightly -// differently. -function getExpectedError(type) { - const code = common.isWindows ? 'ENOTSOCK' : 'EBADF'; - const message = common.isWindows ? - 'socket operation on non-socket' : 'bad file descriptor'; - const errno = common.isWindows ? UV_ENOTSOCK : UV_EBADF; - const syscall = `uv_${type}_buffer_size`; - const suffix = common.isWindows ? - 'ENOTSOCK (socket operation on non-socket)' : 'EBADF (bad file descriptor)'; - const error = { - code: 'ERR_SOCKET_BUFFER_SIZE', - name: 'SystemError', - message: `Could not get or set buffer size: ${syscall} returned ${suffix}`, - info: { - code, - message, - errno, - syscall - } - }; - return error; -} - -{ - // Should throw error if the socket is never bound. - const errorObj = getExpectedError('send'); - - const socket = dgram.createSocket('udp4'); - - assert.throws(() => { - socket.setSendBufferSize(8192); - }, (err) => { - assert.strictEqual( - inspect(err).replace(/^ +at .*\n/gm, ""), - `ERR_SOCKET_BUFFER_SIZE [SystemError]: ${errorObj.message}\n` + - " code: 'ERR_SOCKET_BUFFER_SIZE',\n" + - " info: {\n" + - ` errno: ${errorObj.info.errno},\n` + - ` code: '${errorObj.info.code}',\n` + - ` message: '${errorObj.info.message}',\n` + - ` syscall: '${errorObj.info.syscall}'\n` + - " },\n" + - ` errno: [Getter/Setter],\n` + - ` syscall: [Getter/Setter]\n` + - "}" - ); - return true; - }); - - assert.throws(() => { - socket.getSendBufferSize(); - }, errorObj); -} - -{ - const socket = dgram.createSocket('udp4'); - - // Should throw error if the socket is never bound. - const errorObj = getExpectedError('recv'); - - assert.throws(() => { - socket.setRecvBufferSize(8192); - }, errorObj); - - assert.throws(() => { - socket.getRecvBufferSize(); - }, errorObj); -} - -{ - // Should throw error if invalid buffer size is specified - const errorObj = { - code: 'ERR_SOCKET_BAD_BUFFER_SIZE', - name: 'TypeError', - message: /^Buffer size must be a positive integer$/ - }; - - const badBufferSizes = [-1, Infinity, 'Doh!']; - - const socket = dgram.createSocket('udp4'); - - socket.bind(common.mustCall(() => { - badBufferSizes.forEach((badBufferSize) => { - assert.throws(() => { - socket.setRecvBufferSize(badBufferSize); - }, errorObj); - - assert.throws(() => { - socket.setSendBufferSize(badBufferSize); - }, errorObj); - }); - socket.close(); - })); -} - -{ - // Can set and get buffer sizes after binding the socket. - const socket = dgram.createSocket('udp4'); - - socket.bind(common.mustCall(() => { - socket.setRecvBufferSize(10000); - socket.setSendBufferSize(10000); - - // note: linux will double the buffer size - const expectedBufferSize = common.isLinux ? 20000 : 10000; - assert.strictEqual(socket.getRecvBufferSize(), expectedBufferSize); - assert.strictEqual(socket.getSendBufferSize(), expectedBufferSize); - socket.close(); - })); -} - -{ - const info = { - code: 'EINVAL', - message: 'invalid argument', - errno: UV_EINVAL, - syscall: 'uv_recv_buffer_size' - }; - const errorObj = { - code: 'ERR_SOCKET_BUFFER_SIZE', - name: 'SystemError', - message: 'Could not get or set buffer size: uv_recv_buffer_size ' + - 'returned EINVAL (invalid argument)', - info - }; - const socket = dgram.createSocket('udp4'); - socket.bind(common.mustCall(() => { - assert.throws(() => { - socket.setRecvBufferSize(2147483648); - }, errorObj); - socket.close(); - })); -} - -{ - const info = { - code: 'EINVAL', - message: 'invalid argument', - errno: UV_EINVAL, - syscall: 'uv_send_buffer_size' - }; - const errorObj = { - code: 'ERR_SOCKET_BUFFER_SIZE', - name: 'SystemError', - message: 'Could not get or set buffer size: uv_send_buffer_size ' + - 'returned EINVAL (invalid argument)', - info - }; - const socket = dgram.createSocket('udp4'); - socket.bind(common.mustCall(() => { - assert.throws(() => { - socket.setSendBufferSize(2147483648); - }, errorObj); - socket.close(); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js b/cli/tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js deleted file mode 100644 index c828413a2..000000000 --- a/cli/tests/node_compat/test/parallel/test-dgram-udp6-link-local-address.js +++ /dev/null @@ -1,61 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -if (!common.hasIPv6) - common.skip('no IPv6 support'); - -const assert = require('assert'); -const dgram = require('dgram'); -const os = require('os'); - -const { isWindows } = common; - -function linklocal() { - for (const [ifname, entries] of Object.entries(os.networkInterfaces())) { - for (const { address, family, scopeid } of entries) { - if (family === 'IPv6' && address.startsWith('fe80:')) { - return { address, ifname, scopeid }; - } - } - } -} -const iface = linklocal(); - -if (!iface) - common.skip('cannot find any IPv6 interfaces with a link local address'); - -const address = isWindows ? iface.address : `${iface.address}%${iface.ifname}`; -const message = 'Hello, local world!'; - -// Create a client socket for sending to the link-local address. -const client = dgram.createSocket('udp6'); - -// Create the server socket listening on the link-local address. -const server = dgram.createSocket('udp6'); - -server.on('listening', common.mustCall(() => { - const port = server.address().port; - client.send(message, 0, message.length, port, address); -})); - -server.on('message', common.mustCall((buf, info) => { - const received = buf.toString(); - assert.strictEqual(received, message); - // Check that the sender address is the one bound, - // including the link local scope identifier. - // TODO(cmorten): info.address is missing the link local scope identifier - // assert.strictEqual( - // info.address, - // isWindows ? `${iface.address}%${iface.scopeid}` : address - // ); - server.close(); - client.close(); -}, 1)); - -server.bind({ address }); diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js b/cli/tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js deleted file mode 100644 index 66a548c37..000000000 --- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-has-subscribers.js +++ /dev/null @@ -1,17 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const { channel, hasSubscribers } = require('diagnostics_channel'); - -const dc = channel('test'); -assert.ok(!hasSubscribers('test')); - -dc.subscribe(() => {}); -assert.ok(hasSubscribers('test')); diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js b/cli/tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js deleted file mode 100644 index 00b786582..000000000 --- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-object-channel-pub-sub.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const dc = require('diagnostics_channel'); -const assert = require('assert'); -const { Channel } = dc; - -const input = { - foo: 'bar' -}; - -// Should not have named channel -assert.ok(!dc.hasSubscribers('test')); - -// Individual channel objects can be created to avoid future lookups -const channel = dc.channel('test'); -assert.ok(channel instanceof Channel); - -// No subscribers yet, should not publish -assert.ok(!channel.hasSubscribers); - -const subscriber = common.mustCall((message, name) => { - assert.strictEqual(name, channel.name); - assert.deepStrictEqual(message, input); -}); - -// Now there's a subscriber, should publish -channel.subscribe(subscriber); -assert.ok(channel.hasSubscribers); - -// The ActiveChannel prototype swap should not fail instanceof -assert.ok(channel instanceof Channel); - -// Should trigger the subscriber once -channel.publish(input); - -// Should not publish after subscriber is unsubscribed -assert.ok(channel.unsubscribe(subscriber)); -assert.ok(!channel.hasSubscribers); - -// unsubscribe() should return false when subscriber is not found -assert.ok(!channel.unsubscribe(subscriber)); - -assert.throws(() => { - channel.subscribe(null); -}, { code: 'ERR_INVALID_ARG_TYPE' }); diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js b/cli/tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js deleted file mode 100644 index 378cf051e..000000000 --- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-pub-sub.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const dc = require('diagnostics_channel'); -const assert = require('assert'); -const { Channel } = dc; - -const name = 'test'; -const input = { - foo: 'bar' -}; - -// Individual channel objects can be created to avoid future lookups -const channel = dc.channel(name); -assert.ok(channel instanceof Channel); - -// No subscribers yet, should not publish -assert.ok(!channel.hasSubscribers); - -const subscriber = common.mustCall((message, name) => { - assert.strictEqual(name, channel.name); - assert.deepStrictEqual(message, input); -}); - -// Now there's a subscriber, should publish -dc.subscribe(name, subscriber); -assert.ok(channel.hasSubscribers); - -// The ActiveChannel prototype swap should not fail instanceof -assert.ok(channel instanceof Channel); - -// Should trigger the subscriber once -channel.publish(input); - -// Should not publish after subscriber is unsubscribed -assert.ok(dc.unsubscribe(name, subscriber)); -assert.ok(!channel.hasSubscribers); - -// unsubscribe() should return false when subscriber is not found -assert.ok(!dc.unsubscribe(name, subscriber)); - -assert.throws(() => { - dc.subscribe(name, null); -}, { code: 'ERR_INVALID_ARG_TYPE' }); diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js b/cli/tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js deleted file mode 100644 index 3067c78e9..000000000 --- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-symbol-named.js +++ /dev/null @@ -1,35 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const dc = require('diagnostics_channel'); -const assert = require('assert'); - -const input = { - foo: 'bar' -}; - -const symbol = Symbol('test'); - -// Individual channel objects can be created to avoid future lookups -const channel = dc.channel(symbol); - -// Expect two successful publishes later -channel.subscribe(common.mustCall((message, name) => { - assert.strictEqual(name, symbol); - assert.deepStrictEqual(message, input); -})); - -channel.publish(input); - -{ - assert.throws(() => { - dc.channel(null); - }, /ERR_INVALID_ARG_TYPE/); -} diff --git a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-udp.js b/cli/tests/node_compat/test/parallel/test-diagnostics-channel-udp.js deleted file mode 100644 index ddf757a12..000000000 --- a/cli/tests/node_compat/test/parallel/test-diagnostics-channel-udp.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const dgram = require('dgram'); -const dc = require('diagnostics_channel'); - -const udpSocketChannel = dc.channel('udp.socket'); - -const isUDPSocket = (socket) => socket instanceof dgram.Socket; - -udpSocketChannel.subscribe(common.mustCall(({ socket }) => { - assert.strictEqual(isUDPSocket(socket), true); -})); -const socket = dgram.createSocket('udp4'); -socket.close(); diff --git a/cli/tests/node_compat/test/parallel/test-dns-lookup.js b/cli/tests/node_compat/test/parallel/test-dns-lookup.js deleted file mode 100644 index d137586d2..000000000 --- a/cli/tests/node_compat/test/parallel/test-dns-lookup.js +++ /dev/null @@ -1,179 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --expose-internals -'use strict'; - -// TODO: enable remaining tests once functionality is implemented. - -const common = require('../common'); -const assert = require('assert'); -// const { internalBinding } = require('internal/test/binding'); -// const cares = internalBinding('cares_wrap'); - -// Stub `getaddrinfo` to *always* error. This has to be done before we load the -// `dns` module to guarantee that the `dns` module uses the stub. -// cares.getaddrinfo = () => internalBinding('uv').UV_ENOMEM; - -const dns = require('dns'); -const dnsPromises = dns.promises; - -{ - const err = { - code: "ERR_INVALID_ARG_TYPE", - name: "TypeError", - message: - /^The "hostname" argument must be of type string\. Received type number/, - }; - - assert.throws(() => dns.lookup(1, {}), err); - assert.throws(() => dnsPromises.lookup(1, {}), err); -} - -// This also verifies different expectWarning notations. -// common.expectWarning({ -// // For 'internal/test/binding' module. -// 'internal/test/binding': [ -// 'These APIs are for internal testing only. Do not use them.', -// ], -// // For calling `dns.lookup` with falsy `hostname`. -// 'DeprecationWarning': { -// DEP0118: 'The provided hostname "false" is not a valid ' + -// 'hostname, and is supported in the dns module solely for compatibility.' -// } -// }); - -assert.throws( - () => { - dns.lookup(false, "cb"); - }, - { - code: "ERR_INVALID_ARG_TYPE", - name: "TypeError", - } -); - -assert.throws( - () => { - dns.lookup(false, "options", "cb"); - }, - { - code: "ERR_INVALID_ARG_TYPE", - name: "TypeError", - } -); - -{ - const err = { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError', - message: "The argument 'hints' is invalid. Received 100" - }; - const options = { - hints: 100, - family: 0, - all: false - }; - - assert.throws(() => { dnsPromises.lookup(false, options); }, err); - assert.throws(() => { - dns.lookup(false, options, common.mustNotCall()); - }, err); -} - -{ - const family = 20; - const err = { - code: "ERR_INVALID_ARG_VALUE", - name: "TypeError", - message: `The property 'options.family' must be one of: 0, 4, 6. Received ${family}`, - }; - const options = { - hints: 0, - family, - all: false - }; - - assert.throws(() => { dnsPromises.lookup(false, options); }, err); - assert.throws(() => { - dns.lookup(false, options, common.mustNotCall()); - }, err); -} - -(async function() { - let res; - - res = await dnsPromises.lookup(false, { - hints: 0, - family: 0, - all: true - }); - assert.deepStrictEqual(res, []); - - res = await dnsPromises.lookup('127.0.0.1', { - hints: 0, - family: 4, - all: true - }); - assert.deepStrictEqual(res, [{ address: '127.0.0.1', family: 4 }]); - - res = await dnsPromises.lookup('127.0.0.1', { - hints: 0, - family: 4, - all: false - }); - assert.deepStrictEqual(res, { address: '127.0.0.1', family: 4 }); -})().then(common.mustCall()); - -dns.lookup(false, { - hints: 0, - family: 0, - all: true -}, common.mustSucceed((result, addressType) => { - assert.deepStrictEqual(result, []); - assert.strictEqual(addressType, undefined); -})); - -dns.lookup('127.0.0.1', { - hints: 0, - family: 4, - all: true -}, common.mustSucceed((result, addressType) => { - assert.deepStrictEqual(result, [{ - address: '127.0.0.1', - family: 4 - }]); - assert.strictEqual(addressType, undefined); -})); - -dns.lookup('127.0.0.1', { - hints: 0, - family: 4, - all: false -}, common.mustSucceed((result, addressType) => { - assert.deepStrictEqual(result, '127.0.0.1'); - assert.strictEqual(addressType, 4); -})); - -// let tickValue = 0; - -// Should fail due to stub. -// dns.lookup('example.com', common.mustCall((error, result, addressType) => { -// assert(error); -// assert.strictEqual(tickValue, 1); -// assert.strictEqual(error.code, 'ENOMEM'); -// const descriptor = Object.getOwnPropertyDescriptor(error, 'message'); -// // The error message should be non-enumerable. -// assert.strictEqual(descriptor.enumerable, false); -// })); - -// Make sure that the error callback is called on next tick. -// tickValue = 1; - -// Should fail due to stub. -// assert.rejects(dnsPromises.lookup('example.com'), -// { code: 'ENOMEM', hostname: 'example.com' }); diff --git a/cli/tests/node_compat/test/parallel/test-dns-memory-error.js b/cli/tests/node_compat/test/parallel/test-dns-memory-error.js deleted file mode 100644 index 6ef6968be..000000000 --- a/cli/tests/node_compat/test/parallel/test-dns-memory-error.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; - -// Check that if libuv reports a memory error on a DNS query, that the memory -// error is passed through and not replaced with ENOTFOUND. - -require('../common'); - -const assert = require('assert'); -const errors = require('internal/errors'); -const { internalBinding } = require('internal/test/binding'); - -const { UV_EAI_MEMORY } = internalBinding('uv'); -const memoryError = errors.dnsException(UV_EAI_MEMORY, 'fhqwhgads'); - -assert.strictEqual(memoryError.code, 'EAI_MEMORY'); diff --git a/cli/tests/node_compat/test/parallel/test-dns-promises-exists.js b/cli/tests/node_compat/test/parallel/test-dns-promises-exists.js deleted file mode 100644 index 10f9f81df..000000000 --- a/cli/tests/node_compat/test/parallel/test-dns-promises-exists.js +++ /dev/null @@ -1,40 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const dnsPromises = require('dns/promises'); -const dns = require('dns'); - -assert.strictEqual(dnsPromises, dns.promises); - -assert.strictEqual(dnsPromises.NODATA, dns.NODATA); -assert.strictEqual(dnsPromises.FORMERR, dns.FORMERR); -assert.strictEqual(dnsPromises.SERVFAIL, dns.SERVFAIL); -assert.strictEqual(dnsPromises.NOTFOUND, dns.NOTFOUND); -assert.strictEqual(dnsPromises.NOTIMP, dns.NOTIMP); -assert.strictEqual(dnsPromises.REFUSED, dns.REFUSED); -assert.strictEqual(dnsPromises.BADQUERY, dns.BADQUERY); -assert.strictEqual(dnsPromises.BADNAME, dns.BADNAME); -assert.strictEqual(dnsPromises.BADFAMILY, dns.BADFAMILY); -assert.strictEqual(dnsPromises.BADRESP, dns.BADRESP); -assert.strictEqual(dnsPromises.CONNREFUSED, dns.CONNREFUSED); -assert.strictEqual(dnsPromises.TIMEOUT, dns.TIMEOUT); -assert.strictEqual(dnsPromises.EOF, dns.EOF); -assert.strictEqual(dnsPromises.FILE, dns.FILE); -assert.strictEqual(dnsPromises.NOMEM, dns.NOMEM); -assert.strictEqual(dnsPromises.DESTRUCTION, dns.DESTRUCTION); -assert.strictEqual(dnsPromises.BADSTR, dns.BADSTR); -assert.strictEqual(dnsPromises.BADFLAGS, dns.BADFLAGS); -assert.strictEqual(dnsPromises.NONAME, dns.NONAME); -assert.strictEqual(dnsPromises.BADHINTS, dns.BADHINTS); -assert.strictEqual(dnsPromises.NOTINITIALIZED, dns.NOTINITIALIZED); -assert.strictEqual(dnsPromises.LOADIPHLPAPI, dns.LOADIPHLPAPI); -assert.strictEqual(dnsPromises.ADDRGETNETWORKPARAMS, dns.ADDRGETNETWORKPARAMS); -assert.strictEqual(dnsPromises.CANCELLED, dns.CANCELLED); diff --git a/cli/tests/node_compat/test/parallel/test-dns-resolveany.js b/cli/tests/node_compat/test/parallel/test-dns-resolveany.js deleted file mode 100644 index 56d533ad9..000000000 --- a/cli/tests/node_compat/test/parallel/test-dns-resolveany.js +++ /dev/null @@ -1,78 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// TODO: enable remaining tests once functionality is implemented. - -'use strict'; -const common = require('../common'); -const dnstools = require('../common/dns'); -const dns = require('dns'); -const assert = require('assert'); -const dgram = require('dgram'); -const dnsPromises = dns.promises; - -const answers = [ - { type: 'A', address: '1.2.3.4', /*ttl: 123*/ }, - { type: 'AAAA', address: '::42', /*ttl: 123*/ }, - { - type: 'CAA', - critical: 128, - issue: 'platynum.ch' - }, - { type: 'MX', priority: 42, exchange: 'foobar.com', ttl: 124 }, - { type: 'NS', value: 'foobar.org', ttl: 457 }, - { type: 'PTR', value: 'baz.org', ttl: 987 }, - { - type: 'SOA', - nsname: 'ns1.example.com', - hostmaster: 'admin.example.com', - serial: 156696742, - refresh: 900, - retry: 900, - expire: 1800, - minttl: 60 - }, - { type: 'TXT', entries: [ 'v=spf1 ~all', 'xyz\x00foo' ] }, -]; - -const server = dgram.createSocket('udp4'); - -server.on('message', common.mustCall((msg, { address, port }) => { - const parsed = dnstools.parseDNSPacket(msg); - const domain = parsed.questions[0].domain; - assert.strictEqual(domain, 'example.org'); - - server.send(dnstools.writeDNSPacket({ - id: parsed.id, - questions: parsed.questions, - answers: answers.map((answer) => Object.assign({ domain }, answer)), - }), port, address); -}, /*2*/ 30)); - -server.bind(0, common.mustCall(async () => { - const address = server.address(); - dns.setServers([`127.0.0.1:${address.port}`]); - - validateResults(await dnsPromises.resolveAny('example.org')); - - dns.resolveAny('example.org', common.mustSucceed((res) => { - validateResults(res); - server.close(); - })); -})); - -function validateResults(res) { - // TTL values are only provided for A and AAAA entries. - assert.deepStrictEqual(res.map(maybeRedactTTL), answers.map(maybeRedactTTL)); -} - -function maybeRedactTTL(r) { - const ret = { ...r }; - if (!['A', 'AAAA'].includes(r.type)) - delete ret.ttl; - return ret; -} diff --git a/cli/tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js b/cli/tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js deleted file mode 100644 index f4b0770fd..000000000 --- a/cli/tests/node_compat/test/parallel/test-dns-resolvens-typeerror.js +++ /dev/null @@ -1,62 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); - -// This test ensures `dns.resolveNs()` does not raise a C++-land assertion error -// and throw a JavaScript TypeError instead. -// Issue https://github.com/nodejs/node-v0.x-archive/issues/7070 - -const assert = require('assert'); -const dns = require('dns'); -const dnsPromises = dns.promises; - -assert.throws( - () => dnsPromises.resolveNs([]), // bad name - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /^The "name" argument must be of type string/ - } -); -assert.throws( - () => dns.resolveNs([]), // bad name - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /^The "name" argument must be of type string/ - } -); -assert.throws( - () => dns.resolveNs(''), // bad callback - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } -); diff --git a/cli/tests/node_compat/test/parallel/test-dns-setservers-type-check.js b/cli/tests/node_compat/test/parallel/test-dns-setservers-type-check.js deleted file mode 100644 index e4e65b35a..000000000 --- a/cli/tests/node_compat/test/parallel/test-dns-setservers-type-check.js +++ /dev/null @@ -1,127 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { addresses } = require('../common/internet'); -const assert = require('assert'); -const dns = require('dns'); -const resolver = new dns.promises.Resolver(); -const dnsPromises = dns.promises; -const promiseResolver = new dns.promises.Resolver(); - -{ - [ - null, - undefined, - Number(addresses.DNS4_SERVER), - addresses.DNS4_SERVER, - { - address: addresses.DNS4_SERVER - }, - ].forEach((val) => { - const errObj = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "servers" argument must be an instance of Array.' + - common.invalidArgTypeHelper(val) - }; - assert.throws( - () => { - dns.setServers(val); - }, errObj - ); - assert.throws( - () => { - resolver.setServers(val); - }, errObj - ); - assert.throws( - () => { - dnsPromises.setServers(val); - }, errObj - ); - assert.throws( - () => { - promiseResolver.setServers(val); - }, errObj - ); - }); -} - -{ - [ - [null], - [undefined], - [Number(addresses.DNS4_SERVER)], - [ - { - address: addresses.DNS4_SERVER - }, - ], - ].forEach((val) => { - const errObj = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "servers[0]" argument must be of type string.' + - common.invalidArgTypeHelper(val[0]) - }; - assert.throws( - () => { - dns.setServers(val); - }, errObj - ); - assert.throws( - () => { - resolver.setServers(val); - }, errObj - ); - assert.throws( - () => { - dnsPromises.setServers(val); - }, errObj - ); - assert.throws( - () => { - promiseResolver.setServers(val); - }, errObj - ); - }); -} - -// This test for 'dns/promises' -{ - const { - setServers - } = require('dns/promises'); - - // This should not throw any error. - (async () => { - setServers([ '127.0.0.1' ]); - })().then(common.mustCall()); - - [ - [null], - [undefined], - [Number(addresses.DNS4_SERVER)], - [ - { - address: addresses.DNS4_SERVER - }, - ], - ].forEach((val) => { - const errObj = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "servers[0]" argument must be of type string.' + - common.invalidArgTypeHelper(val[0]) - }; - assert.throws(() => { - setServers(val); - }, errObj); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-dns.js b/cli/tests/node_compat/test/parallel/test-dns.js deleted file mode 100644 index e56f7ca40..000000000 --- a/cli/tests/node_compat/test/parallel/test-dns.js +++ /dev/null @@ -1,471 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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'; - -// TODO: enable remaining tests once functionality is implemented. - -const common = require('../common'); -const dnstools = require('../common/dns'); -const assert = require('assert'); - -const dns = require('dns'); -const dnsPromises = dns.promises; -const dgram = require('dgram'); - -// TODO(cmorten): currently don't expose defaults -// const existing = dns.getServers(); -// assert(existing.length > 0); - -// Verify that setServers() handles arrays with holes and other oddities -{ - const servers = []; - - servers[0] = '127.0.0.1'; - servers[2] = '0.0.0.0'; - dns.setServers(servers); - - assert.deepStrictEqual(dns.getServers(), ['127.0.0.1', '0.0.0.0']); -} - -{ - const servers = ['127.0.0.1', '192.168.1.1']; - - servers[3] = '127.1.0.1'; - servers[4] = '127.1.0.1'; - servers[5] = '127.1.1.1'; - - Object.defineProperty(servers, 2, { - enumerable: true, - get: () => { - servers.length = 3; - return '0.0.0.0'; - } - }); - - dns.setServers(servers); - assert.deepStrictEqual(dns.getServers(), [ - '127.0.0.1', - '192.168.1.1', - '0.0.0.0', - ]); -} - -{ - // Various invalidities, all of which should throw a clean error. - const invalidServers = [ - ' ', - '\n', - '\0', - '1'.repeat(3 * 4), - // Check for REDOS issues. - ':'.repeat(100000), - '['.repeat(100000), - '['.repeat(100000) + ']'.repeat(100000) + 'a', - ]; - invalidServers.forEach((serv) => { - assert.throws( - () => { - dns.setServers([serv]); - }, - { - name: 'TypeError', - code: 'ERR_INVALID_IP_ADDRESS' - } - ); - }); -} - -const goog = [ - '8.8.8.8', - '8.8.4.4', -]; -dns.setServers(goog); -assert.deepStrictEqual(dns.getServers(), goog); -assert.throws(() => dns.setServers(['foobar']), { - code: 'ERR_INVALID_IP_ADDRESS', - name: 'TypeError', - message: 'Invalid IP address: foobar' -}); -assert.throws(() => dns.setServers(['127.0.0.1:va']), { - code: 'ERR_INVALID_IP_ADDRESS', - name: 'TypeError', - message: 'Invalid IP address: 127.0.0.1:va' -}); -assert.deepStrictEqual(dns.getServers(), goog); - -const goog6 = [ - '2001:4860:4860::8888', - '2001:4860:4860::8844', -]; -dns.setServers(goog6); -assert.deepStrictEqual(dns.getServers(), goog6); - -goog6.push('4.4.4.4'); -dns.setServers(goog6); -assert.deepStrictEqual(dns.getServers(), goog6); - -const ports = [ - '4.4.4.4:53', - '[2001:4860:4860::8888]:53', - '103.238.225.181:666', - '[fe80::483a:5aff:fee6:1f04]:666', - '[fe80::483a:5aff:fee6:1f04]', -]; -const portsExpected = [ - '4.4.4.4', - '2001:4860:4860::8888', - '103.238.225.181:666', - '[fe80::483a:5aff:fee6:1f04]:666', - 'fe80::483a:5aff:fee6:1f04', -]; -dns.setServers(ports); -assert.deepStrictEqual(dns.getServers(), portsExpected); - -dns.setServers([]); -assert.deepStrictEqual(dns.getServers(), []); - -{ - const errObj = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "rrtype" argument must be of type string. ' + - 'Received an instance of Array' - }; - assert.throws(() => { - dns.resolve('example.com', [], common.mustNotCall()); - }, errObj); - assert.throws(() => { - dnsPromises.resolve('example.com', []); - }, errObj); -} -{ - const errObj = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "name" argument must be of type string. ' + - 'Received undefined' - }; - assert.throws(() => { - dnsPromises.resolve(); - }, errObj); -} - -// dns.lookup should accept only falsey and string values -{ - const errorReg = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /^The "hostname" argument must be of type string\. Received .*/ - }; - - assert.throws(() => dns.lookup({}, common.mustNotCall()), errorReg); - - assert.throws(() => dns.lookup([], common.mustNotCall()), errorReg); - - assert.throws(() => dns.lookup(true, common.mustNotCall()), errorReg); - - assert.throws(() => dns.lookup(1, common.mustNotCall()), errorReg); - - assert.throws(() => dns.lookup(common.mustNotCall(), common.mustNotCall()), - errorReg); - - assert.throws(() => dnsPromises.lookup({}), errorReg); - assert.throws(() => dnsPromises.lookup([]), errorReg); - assert.throws(() => dnsPromises.lookup(true), errorReg); - assert.throws(() => dnsPromises.lookup(1), errorReg); - assert.throws(() => dnsPromises.lookup(common.mustNotCall()), errorReg); -} - -// dns.lookup should accept falsey values -{ - const checkCallback = (err, address, family) => { - assert.ifError(err); - assert.strictEqual(address, null); - assert.strictEqual(family, 4); - }; - - ['', null, undefined, 0, NaN].forEach(async (value) => { - const res = await dnsPromises.lookup(value); - assert.deepStrictEqual(res, { address: null, family: 4 }); - dns.lookup(value, common.mustCall(checkCallback)); - }); -} - -{ - // Make sure that dns.lookup throws if hints does not represent a valid flag. - // (dns.V4MAPPED | dns.ADDRCONFIG | dns.ALL) + 1 is invalid because: - // - it's different from dns.V4MAPPED and dns.ADDRCONFIG and dns.ALL. - // - it's different from any subset of them bitwise ored. - // - it's different from 0. - // - it's an odd number different than 1, and thus is invalid, because - // flags are either === 1 or even. - const hints = (dns.V4MAPPED | dns.ADDRCONFIG | dns.ALL) + 1; - const err = { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError', - message: /The argument 'hints' is invalid\. Received \d+/ - }; - - assert.throws(() => { - dnsPromises.lookup('nodejs.org', { hints }); - }, err); - assert.throws(() => { - dns.lookup('nodejs.org', { hints }, common.mustNotCall()); - }, err); -} - -assert.throws(() => dns.lookup("nodejs.org"), { - code: "ERR_INVALID_ARG_TYPE", - name: "TypeError", -}); - -assert.throws(() => dns.lookup("nodejs.org", 4), { - code: "ERR_INVALID_ARG_TYPE", - name: "TypeError", -}); - -dns.lookup('', { family: 4, hints: 0 }, common.mustCall()); - -dns.lookup('', { - family: 6, - hints: dns.ADDRCONFIG -}, common.mustCall()); - -dns.lookup('', { hints: dns.V4MAPPED }, common.mustCall()); - -dns.lookup('', { - hints: dns.ADDRCONFIG | dns.V4MAPPED -}, common.mustCall()); - -dns.lookup('', { - hints: dns.ALL -}, common.mustCall()); - -dns.lookup('', { - hints: dns.V4MAPPED | dns.ALL -}, common.mustCall()); - -dns.lookup('', { - hints: dns.ADDRCONFIG | dns.V4MAPPED | dns.ALL -}, common.mustCall()); - -(async function() { - await dnsPromises.lookup('', { family: 4, hints: 0 }); - await dnsPromises.lookup('', { family: 6, hints: dns.ADDRCONFIG }); - await dnsPromises.lookup('', { hints: dns.V4MAPPED }); - await dnsPromises.lookup('', { hints: dns.ADDRCONFIG | dns.V4MAPPED }); - await dnsPromises.lookup('', { hints: dns.ALL }); - await dnsPromises.lookup('', { hints: dns.V4MAPPED | dns.ALL }); - await dnsPromises.lookup('', { - hints: dns.ADDRCONFIG | dns.V4MAPPED | dns.ALL - }); -})().then(common.mustCall()); - -// { -// const err = { -// code: 'ERR_MISSING_ARGS', -// name: 'TypeError', -// message: 'The "address", "port", and "callback" arguments must be ' + -// 'specified' -// }; - -// assert.throws(() => dns.lookupService('0.0.0.0'), err); -// err.message = 'The "address" and "port" arguments must be specified'; -// assert.throws(() => dnsPromises.lookupService('0.0.0.0'), err); -// } - -// { -// const invalidAddress = 'fasdfdsaf'; -// const err = { -// code: 'ERR_INVALID_ARG_VALUE', -// name: 'TypeError', -// message: `The argument 'address' is invalid. Received '${invalidAddress}'` -// }; - -// assert.throws(() => { -// dnsPromises.lookupService(invalidAddress, 0); -// }, err); - -// assert.throws(() => { -// dns.lookupService(invalidAddress, 0, common.mustNotCall()); -// }, err); -// } - -// const portErr = (port) => { -// const err = { -// code: 'ERR_SOCKET_BAD_PORT', -// message: -// `Port should be >= 0 and < 65536. Received ${port}.`, -// name: 'RangeError' -// }; - -// assert.throws(() => { -// dnsPromises.lookupService('0.0.0.0', port); -// }, err); - -// assert.throws(() => { -// dns.lookupService('0.0.0.0', port, common.mustNotCall()); -// }, err); -// }; -// portErr(null); -// portErr(undefined); -// portErr(65538); -// portErr('test'); - -// assert.throws(() => { -// dns.lookupService('0.0.0.0', 80, null); -// }, { -// code: 'ERR_INVALID_ARG_TYPE', -// name: 'TypeError' -// }); - -{ - dns.resolveMx('foo.onion', function(err) { - assert.deepStrictEqual(err.code, 'ENOTFOUND'); - assert.deepStrictEqual(err.syscall, 'queryMx'); - assert.deepStrictEqual(err.hostname, 'foo.onion'); - assert.deepStrictEqual(err.message, 'queryMx ENOTFOUND foo.onion'); - }); -} - -{ - const cases = [ - { - method: "resolveAny", - answers: [ - { type: "A", address: "1.2.3.4" /*ttl: 3333333333*/ }, - { type: "AAAA", address: "::42" /*ttl: 3333333333*/ }, - { type: "MX", priority: 42, exchange: "foobar.com", ttl: 3333333333 }, - { type: "NS", value: "foobar.org", ttl: 3333333333 }, - { type: "PTR", value: "baz.org", ttl: 3333333333 }, - { - type: "SOA", - nsname: "ns1.example.com", - hostmaster: "admin.example.com", - serial: 3210987654, - refresh: 900, - retry: 900, - expire: 1800, - minttl: 3333333333, - }, - ], - }, - - // TODO(cmorten): support ttl option - // { - // method: "resolve4", - // options: { ttl: true }, - // answers: [{ type: "A", address: "1.2.3.4", ttl: 3333333333 }], - // }, - - // { - // method: "resolve6", - // options: { ttl: true }, - // answers: [{ type: "AAAA", address: "::42", ttl: 3333333333 }], - // }, - - { - method: "resolveSoa", - answers: [ - { - type: "SOA", - nsname: "ns1.example.com", - hostmaster: "admin.example.com", - serial: 3210987654, - refresh: 900, - retry: 900, - expire: 1800, - minttl: 3333333333, - }, - ], - }, - ]; - - const server = dgram.createSocket('udp4'); - - server.on('message', common.mustCall((msg, { address, port }) => { - const parsed = dnstools.parseDNSPacket(msg); - const domain = parsed.questions[0].domain; - assert.strictEqual(domain, 'example.org'); - - server.send(dnstools.writeDNSPacket({ - id: parsed.id, - questions: parsed.questions, - answers: cases[0].answers.map( - (answer) => Object.assign({ domain }, answer) - ), - }), port, address); - // Don't have "ANY" query type available so calls greatly increased with - // polyfill method. - }, /*cases.length * 2*/ 32)); - - server.bind(0, common.mustCall(() => { - const address = server.address(); - dns.setServers([`127.0.0.1:${address.port}`]); - - function validateResults(res) { - if (!Array.isArray(res)) - res = [res]; - - assert.deepStrictEqual(res.map(tweakEntry), - cases[0].answers.map(tweakEntry)); - } - - function tweakEntry(r) { - const ret = { ...r }; - - const { method } = cases[0]; - - // TTL values are only provided for A and AAAA entries. - if (!['A', 'AAAA'].includes(ret.type) && !/^resolve(4|6)?$/.test(method)) - delete ret.ttl; - - if (method !== 'resolveAny') - delete ret.type; - - return ret; - } - - (async function nextCase() { - if (cases.length === 0) - return server.close(); - - const { method, options } = cases[0]; - - validateResults(await dnsPromises[method]('example.org', options)); - - dns[method]('example.org', options, common.mustSucceed((res) => { - validateResults(res); - cases.shift(); - nextCase(); - })); - })().then(common.mustCall()); - - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-eval-strict-referenceerror.js b/cli/tests/node_compat/test/parallel/test-eval-strict-referenceerror.js deleted file mode 100644 index b521b17ba..000000000 --- a/cli/tests/node_compat/test/parallel/test-eval-strict-referenceerror.js +++ /dev/null @@ -1,34 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -/* eslint-disable strict */ -require('../common'); - -// In Node.js 0.10, a bug existed that caused strict functions to not capture -// their environment when evaluated. When run in 0.10 `test()` fails with a -// `ReferenceError`. See https://github.com/nodejs/node/issues/2245 for details. - -const assert = require('assert'); - -function test() { - - const code = [ - 'var foo = {m: 1};', - '', - 'function bar() {', - '\'use strict\';', - 'return foo; // foo isn\'t captured in 0.10', - '};', - ].join('\n'); - - eval(code); - - return bar(); // eslint-disable-line no-undef - -} - -assert.deepStrictEqual(test(), { m: 1 }); diff --git a/cli/tests/node_compat/test/parallel/test-eval.js b/cli/tests/node_compat/test/parallel/test-eval.js deleted file mode 100644 index 78254a377..000000000 --- a/cli/tests/node_compat/test/parallel/test-eval.js +++ /dev/null @@ -1,14 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -// Verify that eval is allowed by default. -assert.strictEqual(eval('"eval"'), 'eval'); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-add-listeners.js b/cli/tests/node_compat/test/parallel/test-event-emitter-add-listeners.js deleted file mode 100644 index 8ad798021..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-add-listeners.js +++ /dev/null @@ -1,93 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 EventEmitter = require('events'); - -{ - const ee = new EventEmitter(); - const events_new_listener_emitted = []; - const listeners_new_listener_emitted = []; - - // Sanity check - assert.strictEqual(ee.addListener, ee.on); - - ee.on('newListener', function(event, listener) { - // Don't track newListener listeners. - if (event === 'newListener') - return; - - events_new_listener_emitted.push(event); - listeners_new_listener_emitted.push(listener); - }); - - const hello = common.mustCall(function(a, b) { - assert.strictEqual(a, 'a'); - assert.strictEqual(b, 'b'); - }); - - ee.once('newListener', function(name, listener) { - assert.strictEqual(name, 'hello'); - assert.strictEqual(listener, hello); - assert.deepStrictEqual(this.listeners('hello'), []); - }); - - ee.on('hello', hello); - ee.once('foo', assert.fail); - assert.deepStrictEqual(['hello', 'foo'], events_new_listener_emitted); - assert.deepStrictEqual([hello, assert.fail], listeners_new_listener_emitted); - - ee.emit('hello', 'a', 'b'); -} - -// Just make sure that this doesn't throw: -{ - const f = new EventEmitter(); - - f.setMaxListeners(0); -} - -{ - const listen1 = () => {}; - const listen2 = () => {}; - const ee = new EventEmitter(); - - ee.once('newListener', function() { - assert.deepStrictEqual(ee.listeners('hello'), []); - ee.once('newListener', function() { - assert.deepStrictEqual(ee.listeners('hello'), []); - }); - ee.on('hello', listen2); - }); - ee.on('hello', listen1); - // The order of listeners on an event is not always the order in which the - // listeners were added. - assert.deepStrictEqual(ee.listeners('hello'), [listen2, listen1]); -} diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-emit-context.js b/cli/tests/node_compat/test/parallel/test-event-emitter-emit-context.js deleted file mode 100644 index d3673827f..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-emit-context.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const EventEmitter = require('events'); - -// Test emit called by other context -const EE = new EventEmitter(); - -// Works as expected if the context has no `constructor.name` -{ - const ctx = Object.create(null); - assert.throws( - () => EE.emit.call(ctx, 'error', new Error('foo')), - common.expectsError({ name: 'Error', message: 'foo' }) - ); -} - -assert.strictEqual(EE.emit.call({}, 'foo'), false); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-error-monitor.js b/cli/tests/node_compat/test/parallel/test-event-emitter-error-monitor.js deleted file mode 100644 index 714a47e59..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-error-monitor.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const EventEmitter = require('events'); - -const EE = new EventEmitter(); -const theErr = new Error('MyError'); - -EE.on( - EventEmitter.errorMonitor, - common.mustCall(function onErrorMonitor(e) { - assert.strictEqual(e, theErr); - }, 3) -); - -// Verify with no error listener -assert.throws( - () => EE.emit('error', theErr), theErr -); - -// Verify with error listener -EE.once('error', common.mustCall((e) => assert.strictEqual(e, theErr))); -EE.emit('error', theErr); - - -// Verify it works with once -process.nextTick(() => EE.emit('error', theErr)); -assert.rejects(EventEmitter.once(EE, 'notTriggered'), theErr); - -// Only error events trigger error monitor -EE.on('aEvent', common.mustCall()); -EE.emit('aEvent'); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-errors.js b/cli/tests/node_compat/test/parallel/test-event-emitter-errors.js deleted file mode 100644 index 39a896b05..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-errors.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const EventEmitter = require('events'); -const util = require('util'); - -const EE = new EventEmitter(); - -assert.throws( - () => EE.emit('error', 'Accepts a string'), - { - code: 'ERR_UNHANDLED_ERROR', - name: 'Error', - message: "Unhandled error. ('Accepts a string')", - } -); - -assert.throws( - () => EE.emit('error', { message: 'Error!' }), - { - code: 'ERR_UNHANDLED_ERROR', - name: 'Error', - message: "Unhandled error. ({ message: 'Error!' })", - } -); - -assert.throws( - () => EE.emit('error', { - message: 'Error!', - [util.inspect.custom]() { throw new Error(); }, - }), - { - code: 'ERR_UNHANDLED_ERROR', - name: 'Error', - message: 'Unhandled error. ([object Object])', - } -); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js b/cli/tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js deleted file mode 100644 index 9eeb5ecf9..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-get-max-listeners.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const EventEmitter = require('events'); - -const emitter = new EventEmitter(); - -assert.strictEqual(emitter.getMaxListeners(), EventEmitter.defaultMaxListeners); - -emitter.setMaxListeners(0); -assert.strictEqual(emitter.getMaxListeners(), 0); - -emitter.setMaxListeners(3); -assert.strictEqual(emitter.getMaxListeners(), 3); - -// https://github.com/nodejs/node/issues/523 - second call should not throw. -const recv = {}; -EventEmitter.prototype.on.call(recv, 'event', () => {}); -EventEmitter.prototype.on.call(recv, 'event', () => {}); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js b/cli/tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js deleted file mode 100644 index 604110a5e..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-invalid-listener.js +++ /dev/null @@ -1,27 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const EventEmitter = require('events'); - -const eventsMethods = ['on', 'once', 'removeListener', 'prependOnceListener']; - -// Verify that the listener must be a function for events methods -for (const method of eventsMethods) { - assert.throws(() => { - const ee = new EventEmitter(); - ee[method]('foo', null); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "listener" argument must be of type function. ' + - 'Received null', - }, `event.${method}('foo', null) should throw the proper error`); -} diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-listener-count.js b/cli/tests/node_compat/test/parallel/test-event-emitter-listener-count.js deleted file mode 100644 index e86a9512f..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-listener-count.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const EventEmitter = require('events'); - -const emitter = new EventEmitter(); -emitter.on('foo', () => {}); -emitter.on('foo', () => {}); -emitter.on('baz', () => {}); -// Allow any type -emitter.on(123, () => {}); - -assert.strictEqual(EventEmitter.listenerCount(emitter, 'foo'), 2); -assert.strictEqual(emitter.listenerCount('foo'), 2); -assert.strictEqual(emitter.listenerCount('bar'), 0); -assert.strictEqual(emitter.listenerCount('baz'), 1); -assert.strictEqual(emitter.listenerCount(123), 1); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js b/cli/tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js deleted file mode 100644 index 3daa73b21..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-listeners-side-effects.js +++ /dev/null @@ -1,67 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -require('../common'); -const assert = require('assert'); - -const EventEmitter = require('events').EventEmitter; - -const e = new EventEmitter(); -let fl; // foo listeners - -fl = e.listeners('foo'); -assert(Array.isArray(fl)); -assert.strictEqual(fl.length, 0); -assert(!(e._events instanceof Object)); -assert.deepStrictEqual(Object.keys(e._events), []); - -e.on('foo', assert.fail); -fl = e.listeners('foo'); -assert.strictEqual(e._events.foo, assert.fail); -assert(Array.isArray(fl)); -assert.strictEqual(fl.length, 1); -assert.strictEqual(fl[0], assert.fail); - -e.listeners('bar'); - -e.on('foo', assert.ok); -fl = e.listeners('foo'); - -assert(Array.isArray(e._events.foo)); -assert.strictEqual(e._events.foo.length, 2); -assert.strictEqual(e._events.foo[0], assert.fail); -assert.strictEqual(e._events.foo[1], assert.ok); - -assert(Array.isArray(fl)); -assert.strictEqual(fl.length, 2); -assert.strictEqual(fl[0], assert.fail); -assert.strictEqual(fl[1], assert.ok); - -console.log('ok'); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-listeners.js b/cli/tests/node_compat/test/parallel/test-event-emitter-listeners.js deleted file mode 100644 index ddb52da1a..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-listeners.js +++ /dev/null @@ -1,131 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -require('../common'); -const assert = require('assert'); -const events = require('events'); - -function listener() {} - -function listener2() {} - -function listener3() { - return 0; -} - -function listener4() { - return 1; -} - -{ - const ee = new events.EventEmitter(); - ee.on('foo', listener); - const fooListeners = ee.listeners('foo'); - assert.deepStrictEqual(ee.listeners('foo'), [listener]); - ee.removeAllListeners('foo'); - assert.deepStrictEqual(ee.listeners('foo'), []); - assert.deepStrictEqual(fooListeners, [listener]); -} - -{ - const ee = new events.EventEmitter(); - ee.on('foo', listener); - const eeListenersCopy = ee.listeners('foo'); - assert.deepStrictEqual(eeListenersCopy, [listener]); - assert.deepStrictEqual(ee.listeners('foo'), [listener]); - eeListenersCopy.push(listener2); - assert.deepStrictEqual(ee.listeners('foo'), [listener]); - assert.deepStrictEqual(eeListenersCopy, [listener, listener2]); -} - -{ - const ee = new events.EventEmitter(); - ee.on('foo', listener); - const eeListenersCopy = ee.listeners('foo'); - ee.on('foo', listener2); - assert.deepStrictEqual(ee.listeners('foo'), [listener, listener2]); - assert.deepStrictEqual(eeListenersCopy, [listener]); -} - -{ - const ee = new events.EventEmitter(); - ee.once('foo', listener); - assert.deepStrictEqual(ee.listeners('foo'), [listener]); -} - -{ - const ee = new events.EventEmitter(); - ee.on('foo', listener); - ee.once('foo', listener2); - assert.deepStrictEqual(ee.listeners('foo'), [listener, listener2]); -} - -{ - const ee = new events.EventEmitter(); - ee._events = undefined; - assert.deepStrictEqual(ee.listeners('foo'), []); -} - -{ - class TestStream extends events.EventEmitter {} - const s = new TestStream(); - assert.deepStrictEqual(s.listeners('foo'), []); -} - -{ - const ee = new events.EventEmitter(); - ee.on('foo', listener); - const wrappedListener = ee.rawListeners('foo'); - assert.strictEqual(wrappedListener.length, 1); - assert.strictEqual(wrappedListener[0], listener); - assert.notStrictEqual(wrappedListener, ee.rawListeners('foo')); - ee.once('foo', listener); - const wrappedListeners = ee.rawListeners('foo'); - assert.strictEqual(wrappedListeners.length, 2); - assert.strictEqual(wrappedListeners[0], listener); - assert.notStrictEqual(wrappedListeners[1], listener); - assert.strictEqual(wrappedListeners[1].listener, listener); - assert.notStrictEqual(wrappedListeners, ee.rawListeners('foo')); - ee.emit('foo'); - assert.strictEqual(wrappedListeners.length, 2); - assert.strictEqual(wrappedListeners[1].listener, listener); -} - -{ - const ee = new events.EventEmitter(); - ee.once('foo', listener3); - ee.on('foo', listener4); - const rawListeners = ee.rawListeners('foo'); - assert.strictEqual(rawListeners.length, 2); - assert.strictEqual(rawListeners[0](), 0); - const rawListener = ee.rawListeners('foo'); - assert.strictEqual(rawListener.length, 1); - assert.strictEqual(rawListener[0](), 1); -} diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-max-listeners.js b/cli/tests/node_compat/test/parallel/test-event-emitter-max-listeners.js deleted file mode 100644 index 1245c6b92..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-max-listeners.js +++ /dev/null @@ -1,80 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 events = require('events'); -const { inspect } = require('util'); -const e = new events.EventEmitter(); - -e.on('maxListeners', common.mustCall()); - -// Should not corrupt the 'maxListeners' queue. -e.setMaxListeners(42); - -const throwsObjs = [NaN, -1, 'and even this']; - -for (const obj of throwsObjs) { - assert.throws( - () => e.setMaxListeners(obj), - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "n" is out of range. ' + - `It must be a non-negative number. Received ${inspect(obj)}` - } - ); - - assert.throws( - () => events.defaultMaxListeners = obj, - { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "defaultMaxListeners" is out of range. ' + - `It must be a non-negative number. Received ${inspect(obj)}` - } - ); -} - -e.emit('maxListeners'); - -{ - const { EventEmitter, defaultMaxListeners } = events; - for (const obj of throwsObjs) { - assert.throws(() => EventEmitter.setMaxListeners(obj), { - code: 'ERR_OUT_OF_RANGE', - }); - } - - // FIXME(bartlomieju): - // assert.throws( - // () => EventEmitter.setMaxListeners(defaultMaxListeners, 'INVALID_EMITTER'), - // { code: 'ERR_INVALID_ARG_TYPE' } - // ); -} diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-method-names.js b/cli/tests/node_compat/test/parallel/test-event-emitter-method-names.js deleted file mode 100644 index 7b7822fe1..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-method-names.js +++ /dev/null @@ -1,42 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const events = require('events'); - -const E = events.EventEmitter.prototype; -assert.strictEqual(E.constructor.name, 'EventEmitter'); -assert.strictEqual(E.on, E.addListener); // Same method. -assert.strictEqual(E.off, E.removeListener); // Same method. -Object.getOwnPropertyNames(E).forEach(function(name) { - if (name === 'constructor' || name === 'on' || name === 'off') return; - if (typeof E[name] !== 'function') return; - assert.strictEqual(E[name].name, name); -}); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js b/cli/tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js deleted file mode 100644 index 4953241ba..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-modify-in-emit.js +++ /dev/null @@ -1,87 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const events = require('events'); - -let callbacks_called = []; - -const e = new events.EventEmitter(); - -function callback1() { - callbacks_called.push('callback1'); - e.on('foo', callback2); - e.on('foo', callback3); - e.removeListener('foo', callback1); -} - -function callback2() { - callbacks_called.push('callback2'); - e.removeListener('foo', callback2); -} - -function callback3() { - callbacks_called.push('callback3'); - e.removeListener('foo', callback3); -} - -e.on('foo', callback1); -assert.strictEqual(e.listeners('foo').length, 1); - -e.emit('foo'); -assert.strictEqual(e.listeners('foo').length, 2); -assert.deepStrictEqual(['callback1'], callbacks_called); - -e.emit('foo'); -assert.strictEqual(e.listeners('foo').length, 0); -assert.deepStrictEqual(['callback1', 'callback2', 'callback3'], - callbacks_called); - -e.emit('foo'); -assert.strictEqual(e.listeners('foo').length, 0); -assert.deepStrictEqual(['callback1', 'callback2', 'callback3'], - callbacks_called); - -e.on('foo', callback1); -e.on('foo', callback2); -assert.strictEqual(e.listeners('foo').length, 2); -e.removeAllListeners('foo'); -assert.strictEqual(e.listeners('foo').length, 0); - -// Verify that removing callbacks while in emit allows emits to propagate to -// all listeners -callbacks_called = []; - -e.on('foo', callback2); -e.on('foo', callback3); -assert.strictEqual(e.listeners('foo').length, 2); -e.emit('foo'); -assert.deepStrictEqual(['callback2', 'callback3'], callbacks_called); -assert.strictEqual(e.listeners('foo').length, 0); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js b/cli/tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js deleted file mode 100644 index 8ab7aec44..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-no-error-provided-to-error-event.js +++ /dev/null @@ -1,65 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 events = require('events'); -/* TODO(uki00a): Uncomment this block when the 'domain' module is implemented. -const domain = require('domain'); - -{ - const e = new events.EventEmitter(); - const d = domain.create(); - d.add(e); - d.on('error', common.mustCall((er) => { - assert(er instanceof Error, 'error created'); - })); - e.emit('error'); -} - -for (const arg of [false, null, undefined]) { - const e = new events.EventEmitter(); - const d = domain.create(); - d.add(e); - d.on('error', common.mustCall((er) => { - assert(er instanceof Error, 'error created'); - })); - e.emit('error', arg); -} - -for (const arg of [42, 'fortytwo', true]) { - const e = new events.EventEmitter(); - const d = domain.create(); - d.add(e); - d.on('error', common.mustCall((er) => { - assert.strictEqual(er, arg); - })); - e.emit('error', arg); -} -*/ diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-num-args.js b/cli/tests/node_compat/test/parallel/test-event-emitter-num-args.js deleted file mode 100644 index 05ed54cb6..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-num-args.js +++ /dev/null @@ -1,61 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const events = require('events'); - -const e = new events.EventEmitter(); -const num_args_emitted = []; - -e.on('numArgs', function() { - const numArgs = arguments.length; - num_args_emitted.push(numArgs); -}); - -e.on('foo', function() { - num_args_emitted.push(arguments.length); -}); - -e.on('foo', function() { - num_args_emitted.push(arguments.length); -}); - -e.emit('numArgs'); -e.emit('numArgs', null); -e.emit('numArgs', null, null); -e.emit('numArgs', null, null, null); -e.emit('numArgs', null, null, null, null); -e.emit('numArgs', null, null, null, null, null); - -e.emit('foo', null, null, null, null); - -process.on('exit', function() { - assert.deepStrictEqual(num_args_emitted, [0, 1, 2, 3, 4, 5, 4, 4]); -}); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-once.js b/cli/tests/node_compat/test/parallel/test-event-emitter-once.js deleted file mode 100644 index 1d02a639e..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-once.js +++ /dev/null @@ -1,77 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 EventEmitter = require('events'); - -const e = new EventEmitter(); - -e.once('hello', common.mustCall()); - -e.emit('hello', 'a', 'b'); -e.emit('hello', 'a', 'b'); -e.emit('hello', 'a', 'b'); -e.emit('hello', 'a', 'b'); - -function remove() { - assert.fail('once->foo should not be emitted'); -} - -e.once('foo', remove); -e.removeListener('foo', remove); -e.emit('foo'); - -e.once('e', common.mustCall(function() { - e.emit('e'); -})); - -e.once('e', common.mustCall()); - -e.emit('e'); - -{ - // once() has different code paths based on the number of arguments being - // emitted. Verify that all of the cases are covered. - const maxArgs = 4; - - for (let i = 0; i <= maxArgs; ++i) { - const ee = new EventEmitter(); - const args = ['foo']; - - for (let j = 0; j < i; ++j) - args.push(j); - - ee.once('foo', common.mustCall((...params) => { - assert.deepStrictEqual(params, args.slice(1)); - })); - - EventEmitter.prototype.emit.apply(ee, args); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-prepend.js b/cli/tests/node_compat/test/parallel/test-event-emitter-prepend.js deleted file mode 100644 index b06722742..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-prepend.js +++ /dev/null @@ -1,50 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -const common = require('../common'); -const EventEmitter = require('events'); -const assert = require('assert'); - -const myEE = new EventEmitter(); -let m = 0; -// This one comes last. -myEE.on('foo', common.mustCall(() => assert.strictEqual(m, 2))); - -// This one comes second. -myEE.prependListener('foo', common.mustCall(() => assert.strictEqual(m++, 1))); - -// This one comes first. -myEE.prependOnceListener('foo', - common.mustCall(() => assert.strictEqual(m++, 0))); - -myEE.emit('foo'); - -// Test fallback if prependListener is undefined. -const stream = require('stream'); - -delete EventEmitter.prototype.prependListener; - -function Writable() { - this.writable = true; - stream.Stream.call(this); -} -Object.setPrototypeOf(Writable.prototype, stream.Stream.prototype); -Object.setPrototypeOf(Writable, stream.Stream); - -function Readable() { - this.readable = true; - stream.Stream.call(this); -} -Object.setPrototypeOf(Readable.prototype, stream.Stream.prototype); -Object.setPrototypeOf(Readable, stream.Stream); - -// FIXME(bartlomieju): -// const w = new Writable(); -// const r = new Readable(); -// r.pipe(w); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js b/cli/tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js deleted file mode 100644 index 576c02aa0..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-remove-all-listeners.js +++ /dev/null @@ -1,130 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 events = require('events'); - - -function expect(expected) { - const actual = []; - process.on('exit', function() { - assert.deepStrictEqual(actual.sort(), expected.sort()); - }); - function listener(name) { - actual.push(name); - } - return common.mustCall(listener, expected.length); -} - -{ - const ee = new events.EventEmitter(); - const noop = common.mustNotCall(); - ee.on('foo', noop); - ee.on('bar', noop); - ee.on('baz', noop); - ee.on('baz', noop); - const fooListeners = ee.listeners('foo'); - const barListeners = ee.listeners('bar'); - const bazListeners = ee.listeners('baz'); - ee.on('removeListener', expect(['bar', 'baz', 'baz'])); - ee.removeAllListeners('bar'); - ee.removeAllListeners('baz'); - assert.deepStrictEqual(ee.listeners('foo'), [noop]); - assert.deepStrictEqual(ee.listeners('bar'), []); - assert.deepStrictEqual(ee.listeners('baz'), []); - // After calling removeAllListeners(), - // the old listeners array should stay unchanged. - assert.deepStrictEqual(fooListeners, [noop]); - assert.deepStrictEqual(barListeners, [noop]); - assert.deepStrictEqual(bazListeners, [noop, noop]); - // After calling removeAllListeners(), - // new listeners arrays is different from the old. - assert.notStrictEqual(ee.listeners('bar'), barListeners); - assert.notStrictEqual(ee.listeners('baz'), bazListeners); -} - -{ - const ee = new events.EventEmitter(); - ee.on('foo', common.mustNotCall()); - ee.on('bar', common.mustNotCall()); - // Expect LIFO order - ee.on('removeListener', expect(['foo', 'bar', 'removeListener'])); - ee.on('removeListener', expect(['foo', 'bar'])); - ee.removeAllListeners(); - assert.deepStrictEqual([], ee.listeners('foo')); - assert.deepStrictEqual([], ee.listeners('bar')); -} - -{ - const ee = new events.EventEmitter(); - ee.on('removeListener', common.mustNotCall()); - // Check for regression where removeAllListeners() throws when - // there exists a 'removeListener' listener, but there exists - // no listeners for the provided event type. - ee.removeAllListeners.bind(ee, 'foo'); -} - -{ - const ee = new events.EventEmitter(); - let expectLength = 2; - ee.on('removeListener', function(name, noop) { - assert.strictEqual(expectLength--, this.listeners('baz').length); - }); - ee.on('baz', common.mustNotCall()); - ee.on('baz', common.mustNotCall()); - ee.on('baz', common.mustNotCall()); - assert.strictEqual(ee.listeners('baz').length, expectLength + 1); - ee.removeAllListeners('baz'); - assert.strictEqual(ee.listeners('baz').length, 0); -} - -{ - const ee = new events.EventEmitter(); - assert.deepStrictEqual(ee, ee.removeAllListeners()); -} - -{ - const ee = new events.EventEmitter(); - ee._events = undefined; - assert.strictEqual(ee, ee.removeAllListeners()); -} - -{ - const ee = new events.EventEmitter(); - const symbol = Symbol('symbol'); - const noop = common.mustNotCall(); - ee.on(symbol, noop); - - ee.on('removeListener', common.mustCall((...args) => { - assert.deepStrictEqual(args, [symbol, noop]); - })); - - ee.removeAllListeners(); -} diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js b/cli/tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js deleted file mode 100644 index 8ee09c30a..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-remove-listeners.js +++ /dev/null @@ -1,177 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 EventEmitter = require('events'); - -function listener1() {} - -function listener2() {} - -{ - const ee = new EventEmitter(); - ee.on('hello', listener1); - ee.on('removeListener', common.mustCall((name, cb) => { - assert.strictEqual(name, 'hello'); - assert.strictEqual(cb, listener1); - })); - ee.removeListener('hello', listener1); - assert.deepStrictEqual([], ee.listeners('hello')); -} - -{ - const ee = new EventEmitter(); - ee.on('hello', listener1); - ee.on('removeListener', common.mustNotCall()); - ee.removeListener('hello', listener2); - assert.deepStrictEqual([listener1], ee.listeners('hello')); -} - -{ - const ee = new EventEmitter(); - ee.on('hello', listener1); - ee.on('hello', listener2); - ee.once('removeListener', common.mustCall((name, cb) => { - assert.strictEqual(name, 'hello'); - assert.strictEqual(cb, listener1); - assert.deepStrictEqual([listener2], ee.listeners('hello')); - })); - ee.removeListener('hello', listener1); - assert.deepStrictEqual([listener2], ee.listeners('hello')); - ee.once('removeListener', common.mustCall((name, cb) => { - assert.strictEqual(name, 'hello'); - assert.strictEqual(cb, listener2); - assert.deepStrictEqual([], ee.listeners('hello')); - })); - ee.removeListener('hello', listener2); - assert.deepStrictEqual([], ee.listeners('hello')); -} - -{ - const ee = new EventEmitter(); - - function remove1() { - assert.fail('remove1 should not have been called'); - } - - function remove2() { - assert.fail('remove2 should not have been called'); - } - - ee.on('removeListener', common.mustCall(function(name, cb) { - if (cb !== remove1) return; - this.removeListener('quux', remove2); - this.emit('quux'); - }, 2)); - ee.on('quux', remove1); - ee.on('quux', remove2); - ee.removeListener('quux', remove1); -} - -{ - const ee = new EventEmitter(); - ee.on('hello', listener1); - ee.on('hello', listener2); - ee.once('removeListener', common.mustCall((name, cb) => { - assert.strictEqual(name, 'hello'); - assert.strictEqual(cb, listener1); - assert.deepStrictEqual([listener2], ee.listeners('hello')); - ee.once('removeListener', common.mustCall((name, cb) => { - assert.strictEqual(name, 'hello'); - assert.strictEqual(cb, listener2); - assert.deepStrictEqual([], ee.listeners('hello')); - })); - ee.removeListener('hello', listener2); - assert.deepStrictEqual([], ee.listeners('hello')); - })); - ee.removeListener('hello', listener1); - assert.deepStrictEqual([], ee.listeners('hello')); -} - -{ - const ee = new EventEmitter(); - const listener3 = common.mustCall(() => { - ee.removeListener('hello', listener4); - }, 2); - const listener4 = common.mustCall(); - - ee.on('hello', listener3); - ee.on('hello', listener4); - - // listener4 will still be called although it is removed by listener 3. - ee.emit('hello'); - // This is so because the internal listener array at time of emit - // was [listener3,listener4] - - // Internal listener array [listener3] - ee.emit('hello'); -} - -{ - const ee = new EventEmitter(); - - ee.once('hello', listener1); - ee.on('removeListener', common.mustCall((eventName, listener) => { - assert.strictEqual(eventName, 'hello'); - assert.strictEqual(listener, listener1); - })); - ee.emit('hello'); -} - -{ - const ee = new EventEmitter(); - - assert.deepStrictEqual(ee, ee.removeListener('foo', () => {})); -} - -{ - const ee = new EventEmitter(); - const listener = () => {}; - ee._events = undefined; - const e = ee.removeListener('foo', listener); - assert.strictEqual(e, ee); -} - -{ - const ee = new EventEmitter(); - - ee.on('foo', listener1); - ee.on('foo', listener2); - assert.deepStrictEqual(ee.listeners('foo'), [listener1, listener2]); - - ee.removeListener('foo', listener1); - assert.strictEqual(ee._events.foo, listener2); - - ee.on('foo', listener1); - assert.deepStrictEqual(ee.listeners('foo'), [listener2, listener1]); - - ee.removeListener('foo', listener1); - assert.strictEqual(ee._events.foo, listener2); -} diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js b/cli/tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js deleted file mode 100644 index 431876fbd..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-set-max-listeners-side-effects.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const events = require('events'); - -const e = new events.EventEmitter(); - -assert(!(e._events instanceof Object)); -assert.deepStrictEqual(Object.keys(e._events), []); -e.setMaxListeners(5); -assert.deepStrictEqual(Object.keys(e._events), []); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-special-event-names.js b/cli/tests/node_compat/test/parallel/test-event-emitter-special-event-names.js deleted file mode 100644 index 067b557f1..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-special-event-names.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const EventEmitter = require('events'); -const assert = require('assert'); - -const ee = new EventEmitter(); -const handler = () => {}; - -assert.deepStrictEqual(ee.eventNames(), []); - -assert.strictEqual(ee._events.hasOwnProperty, undefined); -assert.strictEqual(ee._events.toString, undefined); - -ee.on('__proto__', handler); -ee.on('__defineGetter__', handler); -ee.on('toString', handler); - -assert.deepStrictEqual(ee.eventNames(), [ - '__proto__', - '__defineGetter__', - 'toString', -]); - -assert.deepStrictEqual(ee.listeners('__proto__'), [handler]); -assert.deepStrictEqual(ee.listeners('__defineGetter__'), [handler]); -assert.deepStrictEqual(ee.listeners('toString'), [handler]); - -ee.on('__proto__', common.mustCall(function(val) { - assert.strictEqual(val, 1); -})); -ee.emit('__proto__', 1); - -process.on('__proto__', common.mustCall(function(val) { - assert.strictEqual(val, 1); -})); -process.emit('__proto__', 1); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-subclass.js b/cli/tests/node_compat/test/parallel/test-event-emitter-subclass.js deleted file mode 100644 index 02442c489..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-subclass.js +++ /dev/null @@ -1,74 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 EventEmitter = require('events').EventEmitter; - -Object.setPrototypeOf(MyEE.prototype, EventEmitter.prototype); -Object.setPrototypeOf(MyEE, EventEmitter); - -function MyEE(cb) { - this.once(1, cb); - this.emit(1); - this.removeAllListeners(); - EventEmitter.call(this); -} - -const myee = new MyEE(common.mustCall()); - -Object.setPrototypeOf(ErrorEE.prototype, EventEmitter.prototype); -Object.setPrototypeOf(ErrorEE, EventEmitter); -function ErrorEE() { - this.emit('error', new Error('blerg')); -} - -assert.throws(function() { - new ErrorEE(); -}, /blerg/); - -process.on('exit', function() { - assert(!(myee._events instanceof Object)); - assert.deepStrictEqual(Object.keys(myee._events), []); - console.log('ok'); -}); - - -function MyEE2() { - EventEmitter.call(this); -} - -MyEE2.prototype = new EventEmitter(); - -const ee1 = new MyEE2(); -const ee2 = new MyEE2(); - -ee1.on('x', () => {}); - -assert.strictEqual(ee2.listenerCount('x'), 0); diff --git a/cli/tests/node_compat/test/parallel/test-event-emitter-symbols.js b/cli/tests/node_compat/test/parallel/test-event-emitter-symbols.js deleted file mode 100644 index 8f95d52bd..000000000 --- a/cli/tests/node_compat/test/parallel/test-event-emitter-symbols.js +++ /dev/null @@ -1,30 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const EventEmitter = require('events'); -const assert = require('assert'); - -const ee = new EventEmitter(); -const foo = Symbol('foo'); -const listener = common.mustCall(); - -ee.on(foo, listener); -assert.deepStrictEqual(ee.listeners(foo), [listener]); - -ee.emit(foo); - -ee.removeAllListeners(); -assert.deepStrictEqual(ee.listeners(foo), []); - -ee.on(foo, listener); -assert.deepStrictEqual(ee.listeners(foo), [listener]); - -ee.removeListener(foo, listener); -assert.deepStrictEqual(ee.listeners(foo), []); diff --git a/cli/tests/node_compat/test/parallel/test-events-list.js b/cli/tests/node_compat/test/parallel/test-events-list.js deleted file mode 100644 index c66da1602..000000000 --- a/cli/tests/node_compat/test/parallel/test-events-list.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const EventEmitter = require('events'); -const assert = require('assert'); - -const EE = new EventEmitter(); -const m = () => {}; -EE.on('foo', () => {}); -assert.deepStrictEqual(['foo'], EE.eventNames()); -EE.on('bar', m); -assert.deepStrictEqual(['foo', 'bar'], EE.eventNames()); -EE.removeListener('bar', m); -assert.deepStrictEqual(['foo'], EE.eventNames()); -const s = Symbol('s'); -EE.on(s, m); -assert.deepStrictEqual(['foo', s], EE.eventNames()); -EE.removeListener(s, m); -assert.deepStrictEqual(['foo'], EE.eventNames()); diff --git a/cli/tests/node_compat/test/parallel/test-events-on-async-iterator.js b/cli/tests/node_compat/test/parallel/test-events-on-async-iterator.js deleted file mode 100644 index 87efeb842..000000000 --- a/cli/tests/node_compat/test/parallel/test-events-on-async-iterator.js +++ /dev/null @@ -1,399 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals --no-warnings -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { on, EventEmitter } = require('events'); -const { - NodeEventTarget, -} = require('internal/event_target'); - -async function basic() { - const ee = new EventEmitter(); - process.nextTick(() => { - ee.emit('foo', 'bar'); - // 'bar' is a spurious event, we are testing - // that it does not show up in the iterable - ee.emit('bar', 24); - ee.emit('foo', 42); - }); - - const iterable = on(ee, 'foo'); - - const expected = [['bar'], [42]]; - - for await (const event of iterable) { - const current = expected.shift(); - - assert.deepStrictEqual(current, event); - - if (expected.length === 0) { - break; - } - } - assert.strictEqual(ee.listenerCount('foo'), 0); - assert.strictEqual(ee.listenerCount('error'), 0); -} - -async function invalidArgType() { - assert.throws(() => on({}, 'foo'), common.expectsError({ - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - })); -} - -async function error() { - const ee = new EventEmitter(); - const _err = new Error('kaboom'); - process.nextTick(() => { - ee.emit('error', _err); - }); - - const iterable = on(ee, 'foo'); - let looped = false; - let thrown = false; - - try { - // eslint-disable-next-line no-unused-vars - for await (const event of iterable) { - looped = true; - } - } catch (err) { - thrown = true; - assert.strictEqual(err, _err); - } - assert.strictEqual(thrown, true); - assert.strictEqual(looped, false); -} - -async function errorDelayed() { - const ee = new EventEmitter(); - const _err = new Error('kaboom'); - process.nextTick(() => { - ee.emit('foo', 42); - ee.emit('error', _err); - }); - - const iterable = on(ee, 'foo'); - const expected = [[42]]; - let thrown = false; - - try { - for await (const event of iterable) { - const current = expected.shift(); - assert.deepStrictEqual(current, event); - } - } catch (err) { - thrown = true; - assert.strictEqual(err, _err); - } - assert.strictEqual(thrown, true); - assert.strictEqual(ee.listenerCount('foo'), 0); - assert.strictEqual(ee.listenerCount('error'), 0); -} - -async function throwInLoop() { - const ee = new EventEmitter(); - const _err = new Error('kaboom'); - - process.nextTick(() => { - ee.emit('foo', 42); - }); - - try { - for await (const event of on(ee, 'foo')) { - assert.deepStrictEqual(event, [42]); - throw _err; - } - } catch (err) { - assert.strictEqual(err, _err); - } - - assert.strictEqual(ee.listenerCount('foo'), 0); - assert.strictEqual(ee.listenerCount('error'), 0); -} - -async function next() { - const ee = new EventEmitter(); - const iterable = on(ee, 'foo'); - - process.nextTick(function() { - ee.emit('foo', 'bar'); - ee.emit('foo', 42); - iterable.return(); - }); - - const results = await Promise.all([ - iterable.next(), - iterable.next(), - iterable.next(), - ]); - - assert.deepStrictEqual(results, [{ - value: ['bar'], - done: false, - }, { - value: [42], - done: false, - }, { - value: undefined, - done: true, - }]); - - assert.deepStrictEqual(await iterable.next(), { - value: undefined, - done: true, - }); -} - -async function nextError() { - const ee = new EventEmitter(); - const iterable = on(ee, 'foo'); - const _err = new Error('kaboom'); - process.nextTick(function() { - ee.emit('error', _err); - }); - const results = await Promise.allSettled([ - iterable.next(), - iterable.next(), - iterable.next(), - ]); - assert.deepStrictEqual(results, [{ - status: 'rejected', - reason: _err, - }, { - status: 'fulfilled', - value: { - value: undefined, - done: true, - }, - }, { - status: 'fulfilled', - value: { - value: undefined, - done: true, - }, - }]); - assert.strictEqual(ee.listeners('error').length, 0); -} - -async function iterableThrow() { - const ee = new EventEmitter(); - const iterable = on(ee, 'foo'); - - process.nextTick(() => { - ee.emit('foo', 'bar'); - ee.emit('foo', 42); // lost in the queue - iterable.throw(_err); - }); - - const _err = new Error('kaboom'); - let thrown = false; - - assert.throws(() => { - // No argument - iterable.throw(); - }, { - message: 'The "EventEmitter.AsyncIterator" property must be' + - ' an instance of Error. Received undefined', - name: 'TypeError', - }); - - const expected = [['bar'], [42]]; - - try { - for await (const event of iterable) { - assert.deepStrictEqual(event, expected.shift()); - } - } catch (err) { - thrown = true; - assert.strictEqual(err, _err); - } - assert.strictEqual(thrown, true); - assert.strictEqual(expected.length, 0); - assert.strictEqual(ee.listenerCount('foo'), 0); - assert.strictEqual(ee.listenerCount('error'), 0); -} - -async function eventTarget() { - const et = new EventTarget(); - const tick = () => et.dispatchEvent(new Event('tick')); - const interval = setInterval(tick, 0); - let count = 0; - for await (const [ event ] of on(et, 'tick')) { - count++; - assert.strictEqual(event.type, 'tick'); - if (count >= 5) { - break; - } - } - assert.strictEqual(count, 5); - clearInterval(interval); -} - -async function errorListenerCount() { - const et = new EventEmitter(); - on(et, 'foo'); - assert.strictEqual(et.listenerCount('error'), 1); -} - -async function nodeEventTarget() { - const et = new NodeEventTarget(); - const tick = () => et.dispatchEvent(new Event('tick')); - const interval = setInterval(tick, 0); - let count = 0; - for await (const [ event] of on(et, 'tick')) { - count++; - assert.strictEqual(event.type, 'tick'); - if (count >= 5) { - break; - } - } - assert.strictEqual(count, 5); - clearInterval(interval); -} - -async function abortableOnBefore() { - const ee = new EventEmitter(); - const abortedSignal = AbortSignal.abort(); - [1, {}, null, false, 'hi'].forEach((signal) => { - assert.throws(() => on(ee, 'foo', { signal }), { - code: 'ERR_INVALID_ARG_TYPE', - }); - }); - assert.throws(() => on(ee, 'foo', { signal: abortedSignal }), { - name: 'AbortError', - }); -} - -async function eventTargetAbortableOnBefore() { - const et = new EventTarget(); - const abortedSignal = AbortSignal.abort(); - [1, {}, null, false, 'hi'].forEach((signal) => { - assert.throws(() => on(et, 'foo', { signal }), { - code: 'ERR_INVALID_ARG_TYPE', - }); - }); - assert.throws(() => on(et, 'foo', { signal: abortedSignal }), { - name: 'AbortError', - }); -} - -async function abortableOnAfter() { - const ee = new EventEmitter(); - const ac = new AbortController(); - - const i = setInterval(() => ee.emit('foo', 'foo'), 10); - - async function foo() { - for await (const f of on(ee, 'foo', { signal: ac.signal })) { - assert.strictEqual(f, 'foo'); - } - } - - foo().catch(common.mustCall((error) => { - assert.strictEqual(error.name, 'AbortError'); - })).finally(() => { - clearInterval(i); - }); - - process.nextTick(() => ac.abort()); -} - -async function eventTargetAbortableOnAfter() { - const et = new EventTarget(); - const ac = new AbortController(); - - const i = setInterval(() => et.dispatchEvent(new Event('foo')), 10); - - async function foo() { - for await (const f of on(et, 'foo', { signal: ac.signal })) { - assert(f); - } - } - - foo().catch(common.mustCall((error) => { - assert.strictEqual(error.name, 'AbortError'); - })).finally(() => { - clearInterval(i); - }); - - process.nextTick(() => ac.abort()); -} - -async function eventTargetAbortableOnAfter2() { - const et = new EventTarget(); - const ac = new AbortController(); - - const i = setInterval(() => et.dispatchEvent(new Event('foo')), 10); - - async function foo() { - for await (const f of on(et, 'foo', { signal: ac.signal })) { - assert(f); - // Cancel after a single event has been triggered. - ac.abort(); - } - } - - foo().catch(common.mustCall((error) => { - assert.strictEqual(error.name, 'AbortError'); - })).finally(() => { - clearInterval(i); - }); -} - -async function abortableOnAfterDone() { - const ee = new EventEmitter(); - const ac = new AbortController(); - - const i = setInterval(() => ee.emit('foo', 'foo'), 1); - let count = 0; - - async function foo() { - for await (const f of on(ee, 'foo', { signal: ac.signal })) { - assert.strictEqual(f[0], 'foo'); - if (++count === 5) - break; - } - ac.abort(); // No error will occur - } - - foo().finally(() => { - clearInterval(i); - }); -} - -async function run() { - const funcs = [ - basic, - invalidArgType, - error, - errorDelayed, - throwInLoop, - next, - nextError, - iterableThrow, - eventTarget, - errorListenerCount, - nodeEventTarget, - abortableOnBefore, - abortableOnAfter, - eventTargetAbortableOnBefore, - eventTargetAbortableOnAfter, - eventTargetAbortableOnAfter2, - abortableOnAfterDone, - ]; - - for (const fn of funcs) { - await fn(); - } -} - -run().then(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-events-once.js b/cli/tests/node_compat/test/parallel/test-events-once.js deleted file mode 100644 index 7236f9830..000000000 --- a/cli/tests/node_compat/test/parallel/test-events-once.js +++ /dev/null @@ -1,272 +0,0 @@ -// 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 - -// TODO(cjihrig): kEvents is an internally used symbol in Node.js. It is not -// implemented in Deno, so parts of this test must be removed in order to pass. - -'use strict'; -// Flags: --no-warnings - -const common = require('../common'); -const { once, EventEmitter } = require('events'); -const { - strictEqual, - deepStrictEqual, - fail, - rejects, -} = require('assert'); - -async function onceAnEvent() { - const ee = new EventEmitter(); - - process.nextTick(() => { - ee.emit('myevent', 42); - }); - - const [value] = await once(ee, 'myevent'); - strictEqual(value, 42); - strictEqual(ee.listenerCount('error'), 0); - strictEqual(ee.listenerCount('myevent'), 0); -} - -async function onceAnEventWithNullOptions() { - const ee = new EventEmitter(); - - process.nextTick(() => { - ee.emit('myevent', 42); - }); - - const [value] = await once(ee, 'myevent', null); - strictEqual(value, 42); -} - - -async function onceAnEventWithTwoArgs() { - const ee = new EventEmitter(); - - process.nextTick(() => { - ee.emit('myevent', 42, 24); - }); - - const value = await once(ee, 'myevent'); - deepStrictEqual(value, [42, 24]); -} - -async function catchesErrors() { - const ee = new EventEmitter(); - - const expected = new Error('kaboom'); - let err; - process.nextTick(() => { - ee.emit('error', expected); - }); - - try { - await once(ee, 'myevent'); - } catch (_e) { - err = _e; - } - strictEqual(err, expected); - strictEqual(ee.listenerCount('error'), 0); - strictEqual(ee.listenerCount('myevent'), 0); -} - -async function catchesErrorsWithAbortSignal() { - const ee = new EventEmitter(); - const ac = new AbortController(); - const signal = ac.signal; - - const expected = new Error('boom'); - let err; - process.nextTick(() => { - ee.emit('error', expected); - }); - - try { - const promise = once(ee, 'myevent', { signal }); - strictEqual(ee.listenerCount('error'), 1); - - await promise; - } catch (e) { - err = e; - } - strictEqual(err, expected); - strictEqual(ee.listenerCount('error'), 0); - strictEqual(ee.listenerCount('myevent'), 0); -} - -async function stopListeningAfterCatchingError() { - const ee = new EventEmitter(); - - const expected = new Error('kaboom'); - let err; - process.nextTick(() => { - ee.emit('error', expected); - ee.emit('myevent', 42, 24); - }); - - try { - await once(ee, 'myevent'); - } catch (_e) { - err = _e; - } - process.removeAllListeners('multipleResolves'); - strictEqual(err, expected); - strictEqual(ee.listenerCount('error'), 0); - strictEqual(ee.listenerCount('myevent'), 0); -} - -async function onceError() { - const ee = new EventEmitter(); - - const expected = new Error('kaboom'); - process.nextTick(() => { - ee.emit('error', expected); - }); - - const promise = once(ee, 'error'); - strictEqual(ee.listenerCount('error'), 1); - const [ err ] = await promise; - strictEqual(err, expected); - strictEqual(ee.listenerCount('error'), 0); - strictEqual(ee.listenerCount('myevent'), 0); -} - -async function onceWithEventTarget() { - const et = new EventTarget(); - const event = new Event('myevent'); - process.nextTick(() => { - et.dispatchEvent(event); - }); - const [ value ] = await once(et, 'myevent'); - strictEqual(value, event); -} - -async function onceWithEventTargetError() { - const et = new EventTarget(); - const error = new Event('error'); - process.nextTick(() => { - et.dispatchEvent(error); - }); - - const [ err ] = await once(et, 'error'); - strictEqual(err, error); -} - -async function prioritizesEventEmitter() { - const ee = new EventEmitter(); - ee.addEventListener = fail; - ee.removeAllListeners = fail; - process.nextTick(() => ee.emit('foo')); - await once(ee, 'foo'); -} - -async function abortSignalBefore() { - const ee = new EventEmitter(); - ee.on('error', common.mustNotCall()); - const abortedSignal = AbortSignal.abort(); - - await Promise.all([1, {}, 'hi', null, false].map((signal) => { - return rejects(once(ee, 'foo', { signal }), { - code: 'ERR_INVALID_ARG_TYPE' - }); - })); - - return rejects(once(ee, 'foo', { signal: abortedSignal }), { - name: 'AbortError' - }); -} - -async function abortSignalAfter() { - const ee = new EventEmitter(); - const ac = new AbortController(); - ee.on('error', common.mustNotCall()); - const r = rejects(once(ee, 'foo', { signal: ac.signal }), { - name: 'AbortError' - }); - process.nextTick(() => ac.abort()); - return r; -} - -async function abortSignalAfterEvent() { - const ee = new EventEmitter(); - const ac = new AbortController(); - process.nextTick(() => { - ee.emit('foo'); - ac.abort(); - }); - const promise = once(ee, 'foo', { signal: ac.signal }); - await promise; -} - -async function abortSignalRemoveListener() { - const ee = new EventEmitter(); - const ac = new AbortController(); - - try { - process.nextTick(() => ac.abort()); - await once(ee, 'test', { signal: ac.signal }); - } catch { - strictEqual(ee.listeners('test').length, 0); - strictEqual(ee.listeners('error').length, 0); - } -} - -async function eventTargetAbortSignalBefore() { - const et = new EventTarget(); - const abortedSignal = AbortSignal.abort(); - - await Promise.all([1, {}, 'hi', null, false].map((signal) => { - return rejects(once(et, 'foo', { signal }), { - code: 'ERR_INVALID_ARG_TYPE' - }); - })); - - return rejects(once(et, 'foo', { signal: abortedSignal }), { - name: 'AbortError' - }); -} - -async function eventTargetAbortSignalAfter() { - const et = new EventTarget(); - const ac = new AbortController(); - const r = rejects(once(et, 'foo', { signal: ac.signal }), { - name: 'AbortError' - }); - process.nextTick(() => ac.abort()); - return r; -} - -async function eventTargetAbortSignalAfterEvent() { - const et = new EventTarget(); - const ac = new AbortController(); - process.nextTick(() => { - et.dispatchEvent(new Event('foo')); - ac.abort(); - }); - await once(et, 'foo', { signal: ac.signal }); -} - -Promise.all([ - onceAnEvent(), - onceAnEventWithNullOptions(), - onceAnEventWithTwoArgs(), - catchesErrors(), - catchesErrorsWithAbortSignal(), - stopListeningAfterCatchingError(), - onceError(), - onceWithEventTarget(), - onceWithEventTargetError(), - prioritizesEventEmitter(), - abortSignalBefore(), - abortSignalAfter(), - abortSignalAfterEvent(), - abortSignalRemoveListener(), - eventTargetAbortSignalBefore(), - eventTargetAbortSignalAfter(), - eventTargetAbortSignalAfterEvent(), -]).then(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js b/cli/tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js deleted file mode 100644 index d5b39c203..000000000 --- a/cli/tests/node_compat/test/parallel/test-events-uncaught-exception-stack.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const EventEmitter = require('events'); - -// Tests that the error stack where the exception was thrown is *not* appended. - -process.on('uncaughtException', common.mustCall((err) => { - const lines = err.stack.split('\n'); - assert.strictEqual(lines[0], 'Error'); - lines.slice(1).forEach((line) => { - assert.match(line, /^ {4}at/); - }); -})); - -new EventEmitter().emit('error', new Error()); diff --git a/cli/tests/node_compat/test/parallel/test-eventtarget-brandcheck.js b/cli/tests/node_compat/test/parallel/test-eventtarget-brandcheck.js deleted file mode 100644 index db5cd53f6..000000000 --- a/cli/tests/node_compat/test/parallel/test-eventtarget-brandcheck.js +++ /dev/null @@ -1,104 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; - -require('../common'); -const assert = require('assert'); - -const { - Event, - CustomEvent, - EventTarget, - NodeEventTarget, -} = require('internal/event_target'); - -[ - 'target', - 'currentTarget', - 'srcElement', - 'type', - 'cancelable', - 'defaultPrevented', - 'timeStamp', - 'returnValue', - 'bubbles', - 'composed', - 'eventPhase', -].forEach((i) => { - assert.throws(() => Reflect.get(Event.prototype, i, {}), { - code: 'ERR_INVALID_THIS', - }); -}); - -[ - 'stopImmediatePropagation', - 'preventDefault', - 'composedPath', - 'cancelBubble', - 'stopPropagation', -].forEach((i) => { - assert.throws(() => Reflect.apply(Event.prototype[i], [], {}), { - code: 'ERR_INVALID_THIS', - }); -}); - -[ - 'target', - 'currentTarget', - 'srcElement', - 'type', - 'cancelable', - 'defaultPrevented', - 'timeStamp', - 'returnValue', - 'bubbles', - 'composed', - 'eventPhase', - 'detail', -].forEach((i) => { - assert.throws(() => Reflect.get(CustomEvent.prototype, i, {}), { - code: 'ERR_INVALID_THIS', - }); -}); - -[ - 'stopImmediatePropagation', - 'preventDefault', - 'composedPath', - 'cancelBubble', - 'stopPropagation', -].forEach((i) => { - assert.throws(() => Reflect.apply(CustomEvent.prototype[i], [], {}), { - code: 'ERR_INVALID_THIS', - }); -}); - -['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach((i) => { - assert.throws(() => Reflect.apply(EventTarget.prototype[i], [], {}), { - code: 'ERR_INVALID_THIS', - }); -}); - -[ - 'setMaxListeners', - 'getMaxListeners', - 'eventNames', - 'listenerCount', - 'off', - 'removeListener', - 'on', - 'addListener', - 'once', - 'emit', - 'removeAllListeners', -].forEach((i) => { - assert.throws(() => Reflect.apply(NodeEventTarget.prototype[i], [], {}), { - code: 'ERR_INVALID_THIS', - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-exception-handler.js b/cli/tests/node_compat/test/parallel/test-exception-handler.js deleted file mode 100644 index 6c76d2463..000000000 --- a/cli/tests/node_compat/test/parallel/test-exception-handler.js +++ /dev/null @@ -1,47 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 MESSAGE = 'catch me if you can'; - -process.on('uncaughtException', common.mustCall((e) => { - console.log('uncaught exception! 1'); - assert.strictEqual(MESSAGE, e.message); -})); - -process.on('uncaughtException', common.mustCall((e) => { - console.log('uncaught exception! 2'); - assert.strictEqual(MESSAGE, e.message); -})); - -setTimeout(() => { - throw new Error(MESSAGE); -}, 10); diff --git a/cli/tests/node_compat/test/parallel/test-exception-handler2.js b/cli/tests/node_compat/test/parallel/test-exception-handler2.js deleted file mode 100644 index 6cb214593..000000000 --- a/cli/tests/node_compat/test/parallel/test-exception-handler2.js +++ /dev/null @@ -1,43 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -process.on('uncaughtException', function(err) { - console.log(`Caught exception: ${err}`); -}); - -setTimeout(common.mustCall(function() { - console.log('This will still run.'); -}), 50); - -// Intentionally cause an exception, but don't catch it. -nonexistentFunc(); // eslint-disable-line no-undef -assert.fail('This will not run.'); diff --git a/cli/tests/node_compat/test/parallel/test-file-read-noexist.js b/cli/tests/node_compat/test/parallel/test-file-read-noexist.js deleted file mode 100644 index 2e2d4320d..000000000 --- a/cli/tests/node_compat/test/parallel/test-file-read-noexist.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 fixtures = require('../common/fixtures'); -const assert = require('assert'); -const fs = require('fs'); - -const filename = fixtures.path('does_not_exist.txt'); -fs.readFile(filename, 'latin1', common.mustCall(function(err, content) { - assert.ok(err); - assert.strictEqual(err.code, 'ENOENT'); -})); diff --git a/cli/tests/node_compat/test/parallel/test-file-write-stream.js b/cli/tests/node_compat/test/parallel/test-file-write-stream.js deleted file mode 100644 index 199cdd80e..000000000 --- a/cli/tests/node_compat/test/parallel/test-file-write-stream.js +++ /dev/null @@ -1,91 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 path = require('path'); -const fs = require('fs'); -const tmpdir = require('../common/tmpdir'); -const fn = path.join(tmpdir.path, 'write.txt'); -tmpdir.refresh(); -const file = fs.createWriteStream(fn, { - highWaterMark: 10 -}); - -const EXPECTED = '012345678910'; - -const callbacks = { - open: -1, - drain: -2, - close: -1 -}; - -file - .on('open', function(fd) { - console.error('open!'); - callbacks.open++; - assert.strictEqual(typeof fd, 'number'); - }) - .on('drain', function() { - console.error('drain!', callbacks.drain); - callbacks.drain++; - if (callbacks.drain === -1) { - assert.strictEqual(fs.readFileSync(fn, 'utf8'), EXPECTED); - file.write(EXPECTED); - } else if (callbacks.drain === 0) { - assert.strictEqual(fs.readFileSync(fn, 'utf8'), EXPECTED + EXPECTED); - file.end(); - } - }) - .on('close', function() { - console.error('close!'); - assert.strictEqual(file.bytesWritten, EXPECTED.length * 2); - - callbacks.close++; - file.write('should not work anymore', common.expectsError({ - code: 'ERR_STREAM_WRITE_AFTER_END', - name: 'Error', - message: 'write after end' - })); - file.on('error', common.mustNotCall()); - - fs.unlinkSync(fn); - }); - -for (let i = 0; i < 11; i++) { - file.write(`${i}`); -} - -process.on('exit', function() { - for (const k in callbacks) { - assert.strictEqual(callbacks[k], 0, `${k} count off by ${callbacks[k]}`); - } - console.log('ok'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-file-write-stream2.js b/cli/tests/node_compat/test/parallel/test-file-write-stream2.js deleted file mode 100644 index 3aa712a2f..000000000 --- a/cli/tests/node_compat/test/parallel/test-file-write-stream2.js +++ /dev/null @@ -1,116 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const path = require('path'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); - - -const filepath = path.join(tmpdir.path, 'write.txt'); - -const EXPECTED = '012345678910'; - -const cb_expected = 'write open drain write drain close '; -let cb_occurred = ''; - -let countDrains = 0; - - -process.on('exit', function() { - removeTestFile(); - if (cb_occurred !== cb_expected) { - console.log(' Test callback events missing or out of order:'); - console.log(` expected: ${cb_expected}`); - console.log(` occurred: ${cb_occurred}`); - assert.strictEqual( - cb_occurred, cb_expected, - `events missing or out of order: "${cb_occurred}" !== "${cb_expected}"`); - } else { - console.log('ok'); - } -}); - -function removeTestFile() { - try { - fs.unlinkSync(filepath); - } catch { - // Continue regardless of error. - } -} - - -tmpdir.refresh(); - -// Drain at 0, return false at 10. -const file = fs.createWriteStream(filepath, { - highWaterMark: 11 -}); - -file.on('open', function(fd) { - console.error('open'); - cb_occurred += 'open '; - assert.strictEqual(typeof fd, 'number'); -}); - -file.on('drain', function() { - console.error('drain'); - cb_occurred += 'drain '; - ++countDrains; - if (countDrains === 1) { - console.error('drain=1, write again'); - assert.strictEqual(fs.readFileSync(filepath, 'utf8'), EXPECTED); - console.error(`ondrain write ret= ${file.write(EXPECTED)}`); - cb_occurred += 'write '; - } else if (countDrains === 2) { - console.error('second drain, end'); - assert.strictEqual(fs.readFileSync(filepath, 'utf8'), EXPECTED + EXPECTED); - file.end(); - } -}); - -file.on('close', function() { - cb_occurred += 'close '; - assert.strictEqual(file.bytesWritten, EXPECTED.length * 2); - file.write('should not work anymore', (err) => { - assert.ok(err.message.includes('write after end')); - }); -}); - -for (let i = 0; i < 11; i++) { - const ret = file.write(String(i)); - console.error(`${i} ${ret}`); - - // Return false when i hits 10 - assert.strictEqual(ret, i !== 10); -} -cb_occurred += 'write '; diff --git a/cli/tests/node_compat/test/parallel/test-file-write-stream3.js b/cli/tests/node_compat/test/parallel/test-file-write-stream3.js deleted file mode 100644 index d15a0b571..000000000 --- a/cli/tests/node_compat/test/parallel/test-file-write-stream3.js +++ /dev/null @@ -1,221 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 path = require('path'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); - - -const filepath = path.join(tmpdir.path, 'write_pos.txt'); - - -const cb_expected = 'write open close write open close write open close '; -let cb_occurred = ''; - -const fileDataInitial = 'abcdefghijklmnopqrstuvwxyz'; - -const fileDataExpected_1 = 'abcdefghijklmnopqrstuvwxyz'; -const fileDataExpected_2 = 'abcdefghij123456qrstuvwxyz'; -const fileDataExpected_3 = 'abcdefghij\u2026\u2026qrstuvwxyz'; - - -process.on('exit', function() { - if (cb_occurred !== cb_expected) { - console.log(' Test callback events missing or out of order:'); - console.log(` expected: ${cb_expected}`); - console.log(` occurred: ${cb_occurred}`); - assert.strictEqual( - cb_occurred, cb_expected, - `events missing or out of order: "${cb_occurred}" !== "${cb_expected}"`); - } -}); - - -tmpdir.refresh(); - - -function run_test_1() { - const options = {}; - const file = fs.createWriteStream(filepath, options); - console.log(' (debug: start ', file.start); - console.log(' (debug: pos ', file.pos); - - file.on('open', function(fd) { - cb_occurred += 'open '; - }); - - file.on('close', function() { - cb_occurred += 'close '; - console.log(' (debug: bytesWritten ', file.bytesWritten); - console.log(' (debug: start ', file.start); - console.log(' (debug: pos ', file.pos); - assert.strictEqual(file.bytesWritten, buffer.length); - const fileData = fs.readFileSync(filepath, 'utf8'); - console.log(' (debug: file data ', fileData); - console.log(' (debug: expected ', fileDataExpected_1); - assert.strictEqual(fileData, fileDataExpected_1); - - run_test_2(); - }); - - file.on('error', function(err) { - cb_occurred += 'error '; - console.log(' (debug: err event ', err); - throw err; - }); - - const buffer = Buffer.from(fileDataInitial); - file.write(buffer); - cb_occurred += 'write '; - - file.end(); -} - - -function run_test_2() { - - const buffer = Buffer.from('123456'); - - const options = { start: 10, - flags: 'r+' }; - const file = fs.createWriteStream(filepath, options); - console.log(' (debug: start ', file.start); - console.log(' (debug: pos ', file.pos); - - file.on('open', function(fd) { - cb_occurred += 'open '; - }); - - file.on('close', function() { - cb_occurred += 'close '; - console.log(' (debug: bytesWritten ', file.bytesWritten); - console.log(' (debug: start ', file.start); - console.log(' (debug: pos ', file.pos); - assert.strictEqual(file.bytesWritten, buffer.length); - const fileData = fs.readFileSync(filepath, 'utf8'); - console.log(' (debug: file data ', fileData); - console.log(' (debug: expected ', fileDataExpected_2); - assert.strictEqual(fileData, fileDataExpected_2); - - run_test_3(); - }); - - file.on('error', function(err) { - cb_occurred += 'error '; - console.log(' (debug: err event ', err); - throw err; - }); - - file.write(buffer); - cb_occurred += 'write '; - - file.end(); -} - - -function run_test_3() { - - const data = '\u2026\u2026'; // 3 bytes * 2 = 6 bytes in UTF-8 - - const options = { start: 10, - flags: 'r+' }; - const file = fs.createWriteStream(filepath, options); - console.log(' (debug: start ', file.start); - console.log(' (debug: pos ', file.pos); - - file.on('open', function(fd) { - cb_occurred += 'open '; - }); - - file.on('close', function() { - cb_occurred += 'close '; - console.log(' (debug: bytesWritten ', file.bytesWritten); - console.log(' (debug: start ', file.start); - console.log(' (debug: pos ', file.pos); - assert.strictEqual(file.bytesWritten, data.length * 3); - const fileData = fs.readFileSync(filepath, 'utf8'); - console.log(' (debug: file data ', fileData); - console.log(' (debug: expected ', fileDataExpected_3); - assert.strictEqual(fileData, fileDataExpected_3); - - run_test_4(); - run_test_5(); - }); - - file.on('error', function(err) { - cb_occurred += 'error '; - console.log(' (debug: err event ', err); - throw err; - }); - - file.write(data, 'utf8'); - cb_occurred += 'write '; - - file.end(); -} - - -const run_test_4 = common.mustCall(function() { - // Error: start must be >= zero - const fn = () => { - fs.createWriteStream(filepath, { start: -5, flags: 'r+' }); - }; - // Verify the range of values using a common integer verifier. - // Limit Number.MAX_SAFE_INTEGER - const err = { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "start" is out of range. ' + - `It must be >= 0 && <= ${Number.MAX_SAFE_INTEGER}. Received -5`, - name: 'RangeError' - }; - assert.throws(fn, err); -}); - - -const run_test_5 = common.mustCall(function() { - // Error: start must be <= 2 ** 53 - 1 - const fn = () => { - fs.createWriteStream(filepath, { start: 2 ** 53, flags: 'r+' }); - }; - // Verify the range of values using a common integer verifier. - // Limit Number.MAX_SAFE_INTEGER - const err = { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "start" is out of range. It must be ' + - `>= 0 && <= ${Number.MAX_SAFE_INTEGER}. ` + - 'Received 9_007_199_254_740_992', - name: 'RangeError' - }; - assert.throws(fn, err); -}); - -run_test_1(); diff --git a/cli/tests/node_compat/test/parallel/test-file-write-stream4.js b/cli/tests/node_compat/test/parallel/test-file-write-stream4.js deleted file mode 100644 index 392a8ef23..000000000 --- a/cli/tests/node_compat/test/parallel/test-file-write-stream4.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Test that 'close' emits once and not twice when `emitClose: true` is set. -// Refs: https://github.com/nodejs/node/issues/31366 - -const common = require('../common'); -const path = require('path'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -const filepath = path.join(tmpdir.path, 'write_pos.txt'); - -const fileReadStream = fs.createReadStream(process.execPath); -const fileWriteStream = fs.createWriteStream(filepath, { - emitClose: true -}); - -fileReadStream.pipe(fileWriteStream); -fileWriteStream.on('close', common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-fs-access.js b/cli/tests/node_compat/test/parallel/test-fs-access.js deleted file mode 100644 index 2351d4171..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-access.js +++ /dev/null @@ -1,242 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; - -// This tests that fs.access and fs.accessSync works as expected -// and the errors thrown from these APIs include the desired properties - -const common = require('../common'); -if (!common.isWindows && process.getuid() === 0) - common.skip('as this test should not be run as `root`'); - -if (common.isIBMi) - common.skip('IBMi has a different access permission mechanism'); - -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -const { internalBinding } = require('internal/test/binding'); -const { UV_ENOENT } = internalBinding('uv'); - -const tmpdir = require('../common/tmpdir'); -const doesNotExist = path.join(tmpdir.path, '__this_should_not_exist'); -const readOnlyFile = path.join(tmpdir.path, 'read_only_file'); -const readWriteFile = path.join(tmpdir.path, 'read_write_file'); - -function createFileWithPerms(file, mode) { - fs.writeFileSync(file, ''); - fs.chmodSync(file, mode); -} - -tmpdir.refresh(); -createFileWithPerms(readOnlyFile, 0o444); -createFileWithPerms(readWriteFile, 0o666); - -// On non-Windows supported platforms, fs.access(readOnlyFile, W_OK, ...) -// always succeeds if node runs as the super user, which is sometimes the -// case for tests running on our continuous testing platform agents. -// -// In this case, this test tries to change its process user id to a -// non-superuser user so that the test that checks for write access to a -// read-only file can be more meaningful. -// -// The change of user id is done after creating the fixtures files for the same -// reason: the test may be run as the superuser within a directory in which -// only the superuser can create files, and thus it may need superuser -// privileges to create them. -// -// There's not really any point in resetting the process' user id to 0 after -// changing it to 'nobody', since in the case that the test runs without -// superuser privilege, it is not possible to change its process user id to -// superuser. -// -// It can prevent the test from removing files created before the change of user -// id, but that's fine. In this case, it is the responsibility of the -// continuous integration platform to take care of that. -let hasWriteAccessForReadonlyFile = false; -if (!common.isWindows && process.getuid() === 0) { - hasWriteAccessForReadonlyFile = true; - try { - process.setuid('nobody'); - hasWriteAccessForReadonlyFile = false; - } catch { - // Continue regardless of error. - } -} - -assert.strictEqual(typeof fs.F_OK, 'number'); -assert.strictEqual(typeof fs.R_OK, 'number'); -assert.strictEqual(typeof fs.W_OK, 'number'); -assert.strictEqual(typeof fs.X_OK, 'number'); - -const throwNextTick = (e) => { process.nextTick(() => { throw e; }); }; - -fs.access(__filename, common.mustCall(function(...args) { - assert.deepStrictEqual(args, [null]); -})); -fs.promises.access(__filename) - .then(common.mustCall()) - .catch(throwNextTick); -fs.access(__filename, fs.R_OK, common.mustCall(function(...args) { - assert.deepStrictEqual(args, [null]); -})); -fs.promises.access(__filename, fs.R_OK) - .then(common.mustCall()) - .catch(throwNextTick); -fs.access(readOnlyFile, fs.R_OK, common.mustCall(function(...args) { - assert.deepStrictEqual(args, [null]); -})); -fs.promises.access(readOnlyFile, fs.R_OK) - .then(common.mustCall()) - .catch(throwNextTick); - -{ - const expectedError = (err) => { - assert.notStrictEqual(err, null); - assert.strictEqual(err.code, 'ENOENT'); - assert.strictEqual(err.path, doesNotExist); - }; - fs.access(doesNotExist, common.mustCall(expectedError)); - fs.promises.access(doesNotExist) - .then(common.mustNotCall(), common.mustCall(expectedError)) - .catch(throwNextTick); -} - -{ - function expectedError(err) { - assert.strictEqual(this, undefined); - if (hasWriteAccessForReadonlyFile) { - assert.ifError(err); - } else { - assert.notStrictEqual(err, null); - assert.strictEqual(err.path, readOnlyFile); - } - } - fs.access(readOnlyFile, fs.W_OK, common.mustCall(expectedError)); - fs.promises.access(readOnlyFile, fs.W_OK) - .then(common.mustNotCall(), common.mustCall(expectedError)) - .catch(throwNextTick); -} - -{ - const expectedError = (err) => { - assert.strictEqual(err.code, 'ERR_INVALID_ARG_TYPE'); - assert.ok(err instanceof TypeError); - return true; - }; - assert.throws( - () => { fs.access(100, fs.F_OK, common.mustNotCall()); }, - expectedError - ); - - fs.promises.access(100, fs.F_OK) - .then(common.mustNotCall(), common.mustCall(expectedError)) - .catch(throwNextTick); -} - -assert.throws( - () => { - fs.access(__filename, fs.F_OK); - }, - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - -assert.throws( - () => { - fs.access(__filename, fs.F_OK, common.mustNotMutateObjectDeep({})); - }, - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - -// Regular access should not throw. -fs.accessSync(__filename); -const mode = fs.R_OK | fs.W_OK; -fs.accessSync(readWriteFile, mode); - -// Invalid modes should throw. -[ - false, - 1n, - { [Symbol.toPrimitive]() { return fs.R_OK; } }, - [1], - 'r', -].forEach((mode, i) => { - console.log(mode, i); - assert.throws( - () => fs.access(readWriteFile, mode, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - } - ); - assert.throws( - () => fs.accessSync(readWriteFile, mode), - { - code: 'ERR_INVALID_ARG_TYPE', - } - ); -}); - -// Out of range modes should throw -[ - -1, - 8, - Infinity, - NaN, -].forEach((mode, i) => { - console.log(mode, i); - assert.throws( - () => fs.access(readWriteFile, mode, common.mustNotCall()), - { - code: 'ERR_OUT_OF_RANGE', - } - ); - assert.throws( - () => fs.accessSync(readWriteFile, mode), - { - code: 'ERR_OUT_OF_RANGE', - } - ); -}); - -assert.throws( - () => { fs.accessSync(doesNotExist); }, - (err) => { - assert.strictEqual(err.code, 'ENOENT'); - assert.strictEqual(err.path, doesNotExist); - assert.strictEqual( - err.message, - `ENOENT: no such file or directory, access '${doesNotExist}'` - ); - assert.strictEqual(err.constructor, Error); - assert.strictEqual(err.syscall, 'access'); - assert.strictEqual(err.errno, UV_ENOENT); - return true; - } -); - -assert.throws( - () => { fs.accessSync(Buffer.from(doesNotExist)); }, - (err) => { - assert.strictEqual(err.code, 'ENOENT'); - assert.strictEqual(err.path, doesNotExist); - assert.strictEqual( - err.message, - `ENOENT: no such file or directory, access '${doesNotExist}'` - ); - assert.strictEqual(err.constructor, Error); - assert.strictEqual(err.syscall, 'access'); - assert.strictEqual(err.errno, UV_ENOENT); - return true; - } -); diff --git a/cli/tests/node_compat/test/parallel/test-fs-append-file-sync.js b/cli/tests/node_compat/test/parallel/test-fs-append-file-sync.js deleted file mode 100644 index d5adc427d..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-append-file-sync.js +++ /dev/null @@ -1,115 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 join = require('path').join; -const fs = require('fs'); - -const currentFileData = 'ABCD'; -const m = 0o600; -const num = 220; -const data = '南越国是前203年至前111年存在于岭南地区的一个国家,国都位于番禺,疆域包括今天中国的广东、' + - '广西两省区的大部份地区,福建省、湖南、贵州、云南的一小部份地区和越南的北部。' + - '南越国是秦朝灭亡后,由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。' + - '前196年和前179年,南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。南越国共存在93年,' + - '历经五代君主。南越国是岭南地区的第一个有记载的政权国家,采用封建制和郡县制并存的制度,' + - '它的建立保证了秦末乱世岭南地区社会秩序的稳定,有效的改善了岭南地区落后的政治、##济现状。\n'; - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -// Test that empty file will be created and have content added. -const filename = join(tmpdir.path, 'append-sync.txt'); - -fs.appendFileSync(filename, data); - -const fileData = fs.readFileSync(filename); - -assert.strictEqual(Buffer.byteLength(data), fileData.length); - -// Test that appends data to a non empty file. -const filename2 = join(tmpdir.path, 'append-sync2.txt'); -fs.writeFileSync(filename2, currentFileData); - -fs.appendFileSync(filename2, data); - -const fileData2 = fs.readFileSync(filename2); - -assert.strictEqual(Buffer.byteLength(data) + currentFileData.length, - fileData2.length); - -// Test that appendFileSync accepts buffers. -const filename3 = join(tmpdir.path, 'append-sync3.txt'); -fs.writeFileSync(filename3, currentFileData); - -const buf = Buffer.from(data, 'utf8'); -fs.appendFileSync(filename3, buf); - -const fileData3 = fs.readFileSync(filename3); - -assert.strictEqual(buf.length + currentFileData.length, fileData3.length); - -const filename4 = join(tmpdir.path, 'append-sync4.txt'); -fs.writeFileSync(filename4, currentFileData, common.mustNotMutateObjectDeep({ mode: m })); - -[ - true, false, 0, 1, Infinity, () => {}, {}, [], undefined, null, -].forEach((value) => { - assert.throws( - () => fs.appendFileSync(filename4, value, common.mustNotMutateObjectDeep({ mode: m })), - { message: /data/, code: 'ERR_INVALID_ARG_TYPE' } - ); -}); -fs.appendFileSync(filename4, `${num}`, common.mustNotMutateObjectDeep({ mode: m })); - -// Windows permissions aren't Unix. -if (!common.isWindows) { - const st = fs.statSync(filename4); - assert.strictEqual(st.mode & 0o700, m); -} - -const fileData4 = fs.readFileSync(filename4); - -assert.strictEqual(Buffer.byteLength(String(num)) + currentFileData.length, - fileData4.length); - -// Test that appendFile accepts file descriptors. -const filename5 = join(tmpdir.path, 'append-sync5.txt'); -fs.writeFileSync(filename5, currentFileData); - -const filename5fd = fs.openSync(filename5, 'a+', 0o600); -fs.appendFileSync(filename5fd, data); -fs.closeSync(filename5fd); - -const fileData5 = fs.readFileSync(filename5); - -assert.strictEqual(Buffer.byteLength(data) + currentFileData.length, - fileData5.length); diff --git a/cli/tests/node_compat/test/parallel/test-fs-append-file.js b/cli/tests/node_compat/test/parallel/test-fs-append-file.js deleted file mode 100644 index 41c6be684..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-append-file.js +++ /dev/null @@ -1,202 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 join = require('path').join; - -const tmpdir = require('../common/tmpdir'); - -const currentFileData = 'ABCD'; - -const s = '南越国是前203年至前111年存在于岭南地区的一个国家,国都位于番禺,疆域包括今天中国的广东、' + - '广西两省区的大部份地区,福建省、湖南、贵州、云南的一小部份地区和越南的北部。' + - '南越国是秦朝灭亡后,由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。' + - '前196年和前179年,南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。南越国共存在93年,' + - '历经五代君主。南越国是岭南地区的第一个有记载的政权国家,采用封建制和郡县制并存的制度,' + - '它的建立保证了秦末乱世岭南地区社会秩序的稳定,有效的改善了岭南地区落后的政治、##济现状。\n'; - -tmpdir.refresh(); - -const throwNextTick = (e) => { process.nextTick(() => { throw e; }); }; - -// Test that empty file will be created and have content added (callback API). -{ - const filename = join(tmpdir.path, 'append.txt'); - - fs.appendFile(filename, s, common.mustSucceed(() => { - fs.readFile(filename, common.mustSucceed((buffer) => { - assert.strictEqual(Buffer.byteLength(s), buffer.length); - })); - })); -} - -// Test that empty file will be created and have content added (promise API). -{ - const filename = join(tmpdir.path, 'append-promise.txt'); - - fs.promises.appendFile(filename, s) - .then(common.mustCall(() => fs.promises.readFile(filename))) - .then((buffer) => { - assert.strictEqual(Buffer.byteLength(s), buffer.length); - }) - .catch(throwNextTick); -} - -// Test that appends data to a non-empty file (callback API). -{ - const filename = join(tmpdir.path, 'append-non-empty.txt'); - fs.writeFileSync(filename, currentFileData); - - fs.appendFile(filename, s, common.mustSucceed(() => { - fs.readFile(filename, common.mustSucceed((buffer) => { - assert.strictEqual(Buffer.byteLength(s) + currentFileData.length, - buffer.length); - })); - })); -} - -// Test that appends data to a non-empty file (promise API). -{ - const filename = join(tmpdir.path, 'append-non-empty-promise.txt'); - fs.writeFileSync(filename, currentFileData); - - fs.promises.appendFile(filename, s) - .then(common.mustCall(() => fs.promises.readFile(filename))) - .then((buffer) => { - assert.strictEqual(Buffer.byteLength(s) + currentFileData.length, - buffer.length); - }) - .catch(throwNextTick); -} - -// Test that appendFile accepts buffers (callback API). -{ - const filename = join(tmpdir.path, 'append-buffer.txt'); - fs.writeFileSync(filename, currentFileData); - - const buf = Buffer.from(s, 'utf8'); - - fs.appendFile(filename, buf, common.mustSucceed(() => { - fs.readFile(filename, common.mustSucceed((buffer) => { - assert.strictEqual(buf.length + currentFileData.length, buffer.length); - })); - })); -} - -// Test that appendFile accepts buffers (promises API). -{ - const filename = join(tmpdir.path, 'append-buffer-promises.txt'); - fs.writeFileSync(filename, currentFileData); - - const buf = Buffer.from(s, 'utf8'); - - fs.promises.appendFile(filename, buf) - .then(common.mustCall(() => fs.promises.readFile(filename))) - .then((buffer) => { - assert.strictEqual(buf.length + currentFileData.length, buffer.length); - }) - .catch(throwNextTick); -} - -// Test that appendFile does not accept invalid data type (callback API). -[false, 5, {}, null, undefined].forEach(async (data) => { - const errObj = { - code: 'ERR_INVALID_ARG_TYPE', - message: /"data"|"buffer"/ - }; - const filename = join(tmpdir.path, 'append-invalid-data.txt'); - - assert.throws( - () => fs.appendFile(filename, data, common.mustNotCall()), - errObj - ); - - assert.throws( - () => fs.appendFileSync(filename, data), - errObj - ); - - await assert.rejects( - fs.promises.appendFile(filename, data), - errObj - ); - // The filename shouldn't exist if throwing error. - assert.throws( - () => fs.statSync(filename), - { - code: 'ENOENT', - message: /no such file or directory/ - } - ); -}); - -// Test that appendFile accepts file descriptors (callback API). -{ - const filename = join(tmpdir.path, 'append-descriptors.txt'); - fs.writeFileSync(filename, currentFileData); - - fs.open(filename, 'a+', common.mustSucceed((fd) => { - fs.appendFile(fd, s, common.mustSucceed(() => { - fs.close(fd, common.mustSucceed(() => { - fs.readFile(filename, common.mustSucceed((buffer) => { - assert.strictEqual(Buffer.byteLength(s) + currentFileData.length, - buffer.length); - })); - })); - })); - })); -} - -// FIXME(F3n67u): fs.promises.appendFile support FileHandle -// Test that appendFile accepts file descriptors (promises API). -// { -// const filename = join(tmpdir.path, 'append-descriptors-promises.txt'); -// fs.writeFileSync(filename, currentFileData); - -// let fd; -// fs.promises.open(filename, 'a+') -// .then(common.mustCall((fileDescriptor) => { -// fd = fileDescriptor; -// return fs.promises.appendFile(fd, s); -// })) -// .then(common.mustCall(() => fd.close())) -// .then(common.mustCall(() => fs.promises.readFile(filename))) -// .then(common.mustCall((buffer) => { -// assert.strictEqual(Buffer.byteLength(s) + currentFileData.length, -// buffer.length); -// })) -// .catch(throwNextTick); -// } - -assert.throws( - () => fs.appendFile(join(tmpdir.path, 'append6.txt'), console.log), - { code: 'ERR_INVALID_ARG_TYPE' }); diff --git a/cli/tests/node_compat/test/parallel/test-fs-chmod-mask.js b/cli/tests/node_compat/test/parallel/test-fs-chmod-mask.js deleted file mode 100644 index f11567c7e..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-chmod-mask.js +++ /dev/null @@ -1,106 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -// This tests that the lower bits of mode > 0o777 still works in fs APIs. - -const common = require('../common'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); - -// TODO(f3n67u): fs.chmod is not supported in Windows -if (common.isWindows) { - return; -} - -let mode; -// On Windows chmod is only able to manipulate write permission -if (common.isWindows) { - mode = 0o444; // read-only -} else { - mode = 0o777; -} - -const maskToIgnore = 0o10000; - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -function test(mode, asString) { - const suffix = asString ? 'str' : 'num'; - const input = asString ? - (mode | maskToIgnore).toString(8) : (mode | maskToIgnore); - - { - const file = path.join(tmpdir.path, `chmod-async-${suffix}.txt`); - fs.writeFileSync(file, 'test', 'utf-8'); - - fs.chmod(file, input, common.mustSucceed(() => { - assert.strictEqual(fs.statSync(file).mode & 0o777, mode); - })); - } - - { - const file = path.join(tmpdir.path, `chmodSync-${suffix}.txt`); - fs.writeFileSync(file, 'test', 'utf-8'); - - fs.chmodSync(file, input); - assert.strictEqual(fs.statSync(file).mode & 0o777, mode); - } - - // TODO(f3n67u): implement fs.fchmod - // { - // const file = path.join(tmpdir.path, `fchmod-async-${suffix}.txt`); - // fs.writeFileSync(file, 'test', 'utf-8'); - // fs.open(file, 'w', common.mustSucceed((fd) => { - // fs.fchmod(fd, input, common.mustSucceed(() => { - // assert.strictEqual(fs.fstatSync(fd).mode & 0o777, mode); - // fs.close(fd, assert.ifError); - // })); - // })); - // } - - // TODO(f3n67u): implement fs.fchmodSync - // { - // const file = path.join(tmpdir.path, `fchmodSync-${suffix}.txt`); - // fs.writeFileSync(file, 'test', 'utf-8'); - // const fd = fs.openSync(file, 'w'); - - // fs.fchmodSync(fd, input); - // assert.strictEqual(fs.fstatSync(fd).mode & 0o777, mode); - - // fs.close(fd, assert.ifError); - // } - - // TODO(f3n67u): implement fs.lchmod - // if (fs.lchmod) { - // const link = path.join(tmpdir.path, `lchmod-src-${suffix}`); - // const file = path.join(tmpdir.path, `lchmod-dest-${suffix}`); - // fs.writeFileSync(file, 'test', 'utf-8'); - // fs.symlinkSync(file, link); - - // fs.lchmod(link, input, common.mustSucceed(() => { - // assert.strictEqual(fs.lstatSync(link).mode & 0o777, mode); - // })); - // } - - // TODO(f3n67u): implement fs.lchmodSync - // if (fs.lchmodSync) { - // const link = path.join(tmpdir.path, `lchmodSync-src-${suffix}`); - // const file = path.join(tmpdir.path, `lchmodSync-dest-${suffix}`); - // fs.writeFileSync(file, 'test', 'utf-8'); - // fs.symlinkSync(file, link); - - // fs.lchmodSync(link, input); - // assert.strictEqual(fs.lstatSync(link).mode & 0o777, mode); - // } -} - -test(mode, true); -test(mode, false); diff --git a/cli/tests/node_compat/test/parallel/test-fs-chmod.js b/cli/tests/node_compat/test/parallel/test-fs-chmod.js deleted file mode 100644 index b5f524f64..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-chmod.js +++ /dev/null @@ -1,167 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 path = require('path'); -const fs = require('fs'); - -let mode_async; -let mode_sync; - -// Need to hijack fs.open/close to make sure that things -// get closed once they're opened. -fs._open = fs.open; -fs._openSync = fs.openSync; -fs.open = open; -fs.openSync = openSync; -fs._close = fs.close; -fs._closeSync = fs.closeSync; -fs.close = close; -fs.closeSync = closeSync; - -let openCount = 0; - -function open() { - openCount++; - return fs._open.apply(fs, arguments); -} - -function openSync() { - openCount++; - return fs._openSync.apply(fs, arguments); -} - -function close() { - openCount--; - return fs._close.apply(fs, arguments); -} - -function closeSync() { - openCount--; - return fs._closeSync.apply(fs, arguments); -} - -// TODO(f3n67u): fs.chmod is not supported in Windows -if (common.isWindows) { - return; -} - -// On Windows chmod is only able to manipulate write permission -if (common.isWindows) { - mode_async = 0o400; // read-only - mode_sync = 0o600; // read-write -} else { - mode_async = 0o777; - mode_sync = 0o644; -} - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -const file1 = path.join(tmpdir.path, 'a.js'); -const file2 = path.join(tmpdir.path, 'a1.js'); - -// Create file1. -fs.closeSync(fs.openSync(file1, 'w')); - -fs.chmod(file1, mode_async.toString(8), common.mustSucceed(() => { - if (common.isWindows) { - assert.ok((fs.statSync(file1).mode & 0o777) & mode_async); - } else { - assert.strictEqual(fs.statSync(file1).mode & 0o777, mode_async); - } - - fs.chmodSync(file1, mode_sync); - if (common.isWindows) { - assert.ok((fs.statSync(file1).mode & 0o777) & mode_sync); - } else { - assert.strictEqual(fs.statSync(file1).mode & 0o777, mode_sync); - } -})); - -// TODO(f3n67u): implement fs.fchmod -// fs.open(file2, 'w', common.mustSucceed((fd) => { -// fs.fchmod(fd, mode_async.toString(8), common.mustSucceed(() => { -// if (common.isWindows) { -// assert.ok((fs.fstatSync(fd).mode & 0o777) & mode_async); -// } else { -// assert.strictEqual(fs.fstatSync(fd).mode & 0o777, mode_async); -// } - -// assert.throws( -// () => fs.fchmod(fd, {}), -// { -// code: 'ERR_INVALID_ARG_TYPE', -// } -// ); - -// fs.fchmodSync(fd, mode_sync); -// if (common.isWindows) { -// assert.ok((fs.fstatSync(fd).mode & 0o777) & mode_sync); -// } else { -// assert.strictEqual(fs.fstatSync(fd).mode & 0o777, mode_sync); -// } - -// fs.close(fd, assert.ifError); -// })); -// })); - - -// TODO(f3n67u): implement fs.lchmod -// // lchmod -// if (fs.lchmod) { -// const link = path.join(tmpdir.path, 'symbolic-link'); - -// fs.symlinkSync(file2, link); - -// fs.lchmod(link, mode_async, common.mustSucceed(() => { -// assert.strictEqual(fs.lstatSync(link).mode & 0o777, mode_async); - -// fs.lchmodSync(link, mode_sync); -// assert.strictEqual(fs.lstatSync(link).mode & 0o777, mode_sync); - -// })); -// } - -[false, 1, {}, [], null, undefined].forEach((input) => { - const errObj = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "path" argument must be of type string or an instance ' + - 'of Buffer or URL.' + - common.invalidArgTypeHelper(input) - }; - assert.throws(() => fs.chmod(input, 1, common.mustNotCall()), errObj); - assert.throws(() => fs.chmodSync(input, 1), errObj); -}); - -process.on('exit', function() { - assert.strictEqual(openCount, 0); -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-chown-type-check.js b/cli/tests/node_compat/test/parallel/test-fs-chown-type-check.js deleted file mode 100644 index 147edf837..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-chown-type-check.js +++ /dev/null @@ -1,60 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const fs = require('fs'); - -[false, 1, {}, [], null, undefined].forEach((i) => { - assert.throws( - () => fs.chown(i, 1, 1, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.chownSync(i, 1, 1), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -}); - -[false, 'test', {}, [], null, undefined].forEach((i) => { - assert.throws( - () => fs.chown('not_a_file_that_exists', i, 1, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.chown('not_a_file_that_exists', 1, i, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.chownSync('not_a_file_that_exists', i, 1), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.chownSync('not_a_file_that_exists', 1, i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-copyfile.js b/cli/tests/node_compat/test/parallel/test-fs-copyfile.js deleted file mode 100644 index 085fc19bf..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-copyfile.js +++ /dev/null @@ -1,174 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; -const common = require('../common'); -const fixtures = require('../common/fixtures'); -const tmpdir = require('../common/tmpdir'); -const assert = require('assert'); -const fs = require('fs'); -const { internalBinding } = require('internal/test/binding'); -const { - UV_ENOENT, - UV_EEXIST -} = internalBinding('uv'); -const path = require('path'); -const src = fixtures.path('a.js'); -const dest = path.join(tmpdir.path, 'copyfile.out'); -const { - COPYFILE_EXCL, - COPYFILE_FICLONE, - COPYFILE_FICLONE_FORCE, - UV_FS_COPYFILE_EXCL, - UV_FS_COPYFILE_FICLONE, - UV_FS_COPYFILE_FICLONE_FORCE -} = fs.constants; - -function verify(src, dest) { - const srcData = fs.readFileSync(src, 'utf8'); - const srcStat = fs.statSync(src); - const destData = fs.readFileSync(dest, 'utf8'); - const destStat = fs.statSync(dest); - - assert.strictEqual(srcData, destData); - assert.strictEqual(srcStat.mode, destStat.mode); - assert.strictEqual(srcStat.size, destStat.size); -} - -tmpdir.refresh(); - -// Verify that flags are defined. -assert.strictEqual(typeof COPYFILE_EXCL, 'number'); -assert.strictEqual(typeof COPYFILE_FICLONE, 'number'); -assert.strictEqual(typeof COPYFILE_FICLONE_FORCE, 'number'); -assert.strictEqual(typeof UV_FS_COPYFILE_EXCL, 'number'); -assert.strictEqual(typeof UV_FS_COPYFILE_FICLONE, 'number'); -assert.strictEqual(typeof UV_FS_COPYFILE_FICLONE_FORCE, 'number'); -assert.strictEqual(COPYFILE_EXCL, UV_FS_COPYFILE_EXCL); -assert.strictEqual(COPYFILE_FICLONE, UV_FS_COPYFILE_FICLONE); -assert.strictEqual(COPYFILE_FICLONE_FORCE, UV_FS_COPYFILE_FICLONE_FORCE); - -// Verify that files are overwritten when no flags are provided. -fs.writeFileSync(dest, '', 'utf8'); -const result = fs.copyFileSync(src, dest); -assert.strictEqual(result, undefined); -verify(src, dest); - -// Verify that files are overwritten with default flags. -fs.copyFileSync(src, dest, 0); -verify(src, dest); - -// Verify that UV_FS_COPYFILE_FICLONE can be used. -fs.unlinkSync(dest); -fs.copyFileSync(src, dest, UV_FS_COPYFILE_FICLONE); -verify(src, dest); - -// Verify that COPYFILE_FICLONE_FORCE can be used. -try { - fs.unlinkSync(dest); - fs.copyFileSync(src, dest, COPYFILE_FICLONE_FORCE); - verify(src, dest); -} catch (err) { - assert.strictEqual(err.syscall, 'copyfile'); - assert(err.code === 'ENOTSUP' || err.code === 'ENOTTY' || - err.code === 'ENOSYS' || err.code === 'EXDEV'); - assert.strictEqual(err.path, src); - assert.strictEqual(err.dest, dest); -} - -// Copies asynchronously. -tmpdir.refresh(); // Don't use unlinkSync() since the last test may fail. -fs.copyFile(src, dest, common.mustSucceed(() => { - verify(src, dest); - - // Copy asynchronously with flags. - fs.copyFile(src, dest, COPYFILE_EXCL, common.mustCall((err) => { - if (err.code === 'ENOENT') { // Could be ENOENT or EEXIST - assert.strictEqual(err.message, - 'ENOENT: no such file or directory, copyfile ' + - `'${src}' -> '${dest}'`); - assert.strictEqual(err.errno, UV_ENOENT); - assert.strictEqual(err.code, 'ENOENT'); - assert.strictEqual(err.syscall, 'copyfile'); - } else { - assert.strictEqual(err.message, - 'EEXIST: file already exists, copyfile ' + - `'${src}' -> '${dest}'`); - assert.strictEqual(err.errno, UV_EEXIST); - assert.strictEqual(err.code, 'EEXIST'); - assert.strictEqual(err.syscall, 'copyfile'); - } - })); -})); - -// Throws if callback is not a function. -assert.throws(() => { - fs.copyFile(src, dest, 0, 0); -}, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' -}); - -// Throws if the source path is not a string. -[false, 1, {}, [], null, undefined].forEach((i) => { - assert.throws( - () => fs.copyFile(i, dest, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /src/ - } - ); - assert.throws( - () => fs.copyFile(src, i, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /dest/ - } - ); - assert.throws( - () => fs.copyFileSync(i, dest), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /src/ - } - ); - assert.throws( - () => fs.copyFileSync(src, i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /dest/ - } - ); -}); - -assert.throws(() => { - fs.copyFileSync(src, dest, 'r'); -}, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /mode/ -}); - -assert.throws(() => { - fs.copyFileSync(src, dest, 8); -}, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', -}); - -assert.throws(() => { - fs.copyFile(src, dest, 'r', common.mustNotCall()); -}, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /mode/ -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-empty-readStream.js b/cli/tests/node_compat/test/parallel/test-fs-empty-readStream.js deleted file mode 100644 index 4f70fda27..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-empty-readStream.js +++ /dev/null @@ -1,57 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 fixtures = require('../common/fixtures'); - -const emptyFile = fixtures.path('empty.txt'); - -fs.open(emptyFile, 'r', common.mustSucceed((fd) => { - const read = fs.createReadStream(emptyFile, { fd }); - - read.once('data', common.mustNotCall('data event should not emit')); - - read.once('end', common.mustCall()); -})); - -fs.open(emptyFile, 'r', common.mustSucceed((fd) => { - const read = fs.createReadStream(emptyFile, { fd }); - - read.pause(); - - read.once('data', common.mustNotCall('data event should not emit')); - - read.once('end', common.mustNotCall('end event should not emit')); - - setTimeout(common.mustCall(() => { - assert.strictEqual(read.isPaused(), true); - }), common.platformTimeout(50)); -})); diff --git a/cli/tests/node_compat/test/parallel/test-fs-mkdir.js b/cli/tests/node_compat/test/parallel/test-fs-mkdir.js deleted file mode 100644 index 5a3897e91..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-mkdir.js +++ /dev/null @@ -1,379 +0,0 @@ -// 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(() => {}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-open-flags.js b/cli/tests/node_compat/test/parallel/test-fs-open-flags.js deleted file mode 100644 index 532194e06..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-open-flags.js +++ /dev/null @@ -1,101 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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. - -// Flags: --expose-internals -'use strict'; -const common = require('../common'); - -const fixtures = require('../common/fixtures'); - -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -// 0 if not found in fs.constants -const { O_APPEND = 0, - O_CREAT = 0, - O_EXCL = 0, - O_RDONLY = 0, - O_RDWR = 0, - O_SYNC = 0, - O_DSYNC = 0, - O_TRUNC = 0, - O_WRONLY = 0 } = fs.constants; - -const { stringToFlags } = require('internal/fs/utils'); - -assert.strictEqual(stringToFlags('r'), O_RDONLY); -assert.strictEqual(stringToFlags('r+'), O_RDWR); -assert.strictEqual(stringToFlags('rs+'), O_RDWR | O_SYNC); -assert.strictEqual(stringToFlags('sr+'), O_RDWR | O_SYNC); -assert.strictEqual(stringToFlags('w'), O_TRUNC | O_CREAT | O_WRONLY); -assert.strictEqual(stringToFlags('w+'), O_TRUNC | O_CREAT | O_RDWR); -assert.strictEqual(stringToFlags('a'), O_APPEND | O_CREAT | O_WRONLY); -assert.strictEqual(stringToFlags('a+'), O_APPEND | O_CREAT | O_RDWR); - -assert.strictEqual(stringToFlags('wx'), O_TRUNC | O_CREAT | O_WRONLY | O_EXCL); -assert.strictEqual(stringToFlags('xw'), O_TRUNC | O_CREAT | O_WRONLY | O_EXCL); -assert.strictEqual(stringToFlags('wx+'), O_TRUNC | O_CREAT | O_RDWR | O_EXCL); -assert.strictEqual(stringToFlags('xw+'), O_TRUNC | O_CREAT | O_RDWR | O_EXCL); -assert.strictEqual(stringToFlags('ax'), O_APPEND | O_CREAT | O_WRONLY | O_EXCL); -assert.strictEqual(stringToFlags('xa'), O_APPEND | O_CREAT | O_WRONLY | O_EXCL); -assert.strictEqual(stringToFlags('as'), O_APPEND | O_CREAT | O_WRONLY | O_SYNC); -assert.strictEqual(stringToFlags('sa'), O_APPEND | O_CREAT | O_WRONLY | O_SYNC); -assert.strictEqual(stringToFlags('ax+'), O_APPEND | O_CREAT | O_RDWR | O_EXCL); -assert.strictEqual(stringToFlags('xa+'), O_APPEND | O_CREAT | O_RDWR | O_EXCL); -assert.strictEqual(stringToFlags('as+'), O_APPEND | O_CREAT | O_RDWR | O_SYNC); -assert.strictEqual(stringToFlags('sa+'), O_APPEND | O_CREAT | O_RDWR | O_SYNC); - -('+ +a +r +w rw wa war raw r++ a++ w++ x +x x+ rx rx+ wxx wax xwx xxx') - .split(' ') - .forEach(function(flags) { - assert.throws( - () => stringToFlags(flags), - { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError' } - ); - }); - -assert.throws( - () => stringToFlags({}), - { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError' } -); - -assert.throws( - () => stringToFlags(true), - { code: 'ERR_INVALID_ARG_VALUE', name: 'TypeError' } -); - -if (common.isLinux || common.isOSX) { - const tmpdir = require('../common/tmpdir'); - tmpdir.refresh(); - const file = path.join(tmpdir.path, 'a.js'); - fs.copyFileSync(fixtures.path('a.js'), file); - fs.open(file, O_DSYNC, common.mustSucceed((fd) => { - fs.closeSync(fd); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-open-mode-mask.js b/cli/tests/node_compat/test/parallel/test-fs-open-mode-mask.js deleted file mode 100644 index 4b56b3b38..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-open-mode-mask.js +++ /dev/null @@ -1,48 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// This tests that the lower bits of mode > 0o777 still works in fs.open(). - -const common = require('../common'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); - -const mode = common.isWindows ? 0o444 : 0o644; - -const maskToIgnore = 0o10000; - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -function test(mode, asString) { - const suffix = asString ? 'str' : 'num'; - const input = asString ? - (mode | maskToIgnore).toString(8) : (mode | maskToIgnore); - - { - const file = path.join(tmpdir.path, `openSync-${suffix}.txt`); - const fd = fs.openSync(file, 'w+', input); - assert.strictEqual(fs.fstatSync(fd).mode & 0o777, mode); - fs.closeSync(fd); - assert.strictEqual(fs.statSync(file).mode & 0o777, mode); - } - - { - const file = path.join(tmpdir.path, `open-${suffix}.txt`); - fs.open(file, 'w+', input, common.mustSucceed((fd) => { - assert.strictEqual(fs.fstatSync(fd).mode & 0o777, mode); - fs.closeSync(fd); - assert.strictEqual(fs.statSync(file).mode & 0o777, mode); - })); - } -} - -test(mode, true); -test(mode, false); diff --git a/cli/tests/node_compat/test/parallel/test-fs-open-no-close.js b/cli/tests/node_compat/test/parallel/test-fs-open-no-close.js deleted file mode 100644 index abde2ad07..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-open-no-close.js +++ /dev/null @@ -1,38 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Refs: https://github.com/nodejs/node/issues/34266 -// Failing to close a file should not keep the event loop open. - -const common = require('../common'); -const assert = require('assert'); - -const fs = require('fs'); - -const debuglog = (arg) => { - console.log(new Date().toLocaleString(), arg); -}; - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -let openFd; - -fs.open(`${tmpdir.path}/dummy`, 'wx+', common.mustCall((err, fd) => { - debuglog('fs open() callback'); - assert.ifError(err); - openFd = fd; -})); -debuglog('waiting for callback'); - -process.on('beforeExit', common.mustCall(() => { - if (openFd) { - fs.closeSync(openFd); - } -})); diff --git a/cli/tests/node_compat/test/parallel/test-fs-open-numeric-flags.js b/cli/tests/node_compat/test/parallel/test-fs-open-numeric-flags.js deleted file mode 100644 index 3e8efde82..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-open-numeric-flags.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -// O_WRONLY without O_CREAT shall fail with ENOENT -const pathNE = path.join(tmpdir.path, 'file-should-not-exist'); -assert.throws( - () => fs.openSync(pathNE, fs.constants.O_WRONLY), - (e) => e.code === 'ENOENT' -); diff --git a/cli/tests/node_compat/test/parallel/test-fs-open.js b/cli/tests/node_compat/test/parallel/test-fs-open.js deleted file mode 100644 index 631e96a2e..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-open.js +++ /dev/null @@ -1,128 +0,0 @@ -// 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'); - -let caughtException = false; - -try { - // Should throw ENOENT, not EBADF - // see https://github.com/joyent/node/pull/1228 - fs.openSync('/8hvftyuncxrt/path/to/file/that/does/not/exist', 'r'); -} catch (e) { - assert.strictEqual(e.code, 'ENOENT'); - caughtException = true; -} -assert.strictEqual(caughtException, true); - -fs.openSync(__filename); - -fs.open(__filename, common.mustSucceed()); - -fs.open(__filename, 'r', common.mustSucceed()); - -// TODO(wafuwafu13): Support 'rs' flag -// fs.open(__filename, 'rs', common.mustSucceed()); - -fs.open(__filename, 'r', 0, common.mustSucceed()); - -fs.open(__filename, 'r', null, common.mustSucceed()); - -async function promise() { - await fs.promises.open(__filename); - await fs.promises.open(__filename, 'r'); -} - -promise().then(common.mustCall()).catch(common.mustNotCall()); - -assert.throws( - () => fs.open(__filename, 'r', 'boom', common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError' - } -); - -for (const extra of [[], ['r'], ['r', 0], ['r', 0, 'bad callback']]) { - assert.throws( - () => fs.open(__filename, ...extra), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -} - -[false, 1, [], {}, null, undefined].forEach((i) => { - assert.throws( - () => fs.open(i, 'r', common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.openSync(i, 'r', common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.rejects( - fs.promises.open(i, 'r'), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -}); - -// Check invalid modes. -[false, [], {}].forEach((mode) => { - assert.throws( - () => fs.open(__filename, 'r', mode, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE' - } - ); - assert.throws( - () => fs.openSync(__filename, 'r', mode, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE' - } - ); - assert.rejects( - fs.promises.open(__filename, 'r', mode), - { - code: 'ERR_INVALID_ARG_TYPE' - } - ); -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-opendir.js b/cli/tests/node_compat/test/parallel/test-fs-opendir.js deleted file mode 100644 index 75c4aa074..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-opendir.js +++ /dev/null @@ -1,300 +0,0 @@ -// 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 - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -const tmpdir = require('../common/tmpdir'); - -const testDir = tmpdir.path; -const files = ['empty', 'files', 'for', 'just', 'testing']; - -// Make sure tmp directory is clean -tmpdir.refresh(); - -// Create the necessary files -files.forEach(function(filename) { - fs.closeSync(fs.openSync(path.join(testDir, filename), 'w')); -}); - -function assertDirent(dirent) { - assert(dirent instanceof fs.Dirent); - assert.strictEqual(dirent.isFile(), true); - assert.strictEqual(dirent.isDirectory(), false); - // TODO(wafuwafu13): Support these method - // assert.strictEqual(dirent.isSocket(), false); - // assert.strictEqual(dirent.isBlockDevice(), false); - // assert.strictEqual(dirent.isCharacterDevice(), false); - // assert.strictEqual(dirent.isFIFO(), false); - assert.strictEqual(dirent.isSymbolicLink(), false); -} - -// NOTE: this error doesn't occur in Deno -const dirclosedError = { - code: 'ERR_DIR_CLOSED' -}; - -// NOTE: this error doesn't occur in Deno -const dirconcurrentError = { - code: 'ERR_DIR_CONCURRENT_OPERATION' -}; - -const invalidCallbackObj = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' -}; - -// Check the opendir Sync version -{ - const dir = fs.opendirSync(testDir); - const entries = files.map(() => { - const dirent = dir.readSync(); - assertDirent(dirent); - return dirent.name; - }); - assert.deepStrictEqual(files, entries.sort()); - - // dir.read should return null when no more entries exist - assert.strictEqual(dir.readSync(), null); - - // check .path - assert.strictEqual(dir.path, testDir); - - dir.closeSync(); - - // assert.throws(() => dir.readSync(), dirclosedError); - // assert.throws(() => dir.closeSync(), dirclosedError); -} - -// Check the opendir async version -fs.opendir(testDir, common.mustSucceed((dir) => { - let sync = true; - dir.read(common.mustSucceed((dirent) => { - assert(!sync); - - // Order is operating / file system dependent - assert(files.includes(dirent.name), `'files' should include ${dirent}`); - assertDirent(dirent); - - let syncInner = true; - dir.read(common.mustSucceed((dirent) => { - assert(!syncInner); - - dir.close(common.mustSucceed()); - })); - syncInner = false; - })); - sync = false; -})); - -// opendir() on file should throw ENOTDIR -assert.throws(function() { - fs.opendirSync(__filename); -}, /Error: ENOTDIR: not a directory/); - -assert.throws(function() { - fs.opendir(__filename); -}, /TypeError \[ERR_INVALID_ARG_TYPE\]: The "callback" argument must be of type function/); - -fs.opendir(__filename, common.mustCall(function(e) { - assert.strictEqual(e.code, 'ENOTDIR'); -})); - -[false, 1, [], {}, null, undefined].forEach((i) => { - assert.throws( - () => fs.opendir(i, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.opendirSync(i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -}); - -// Promise-based tests -async function doPromiseTest() { - // Check the opendir Promise version - const dir = await fs.promises.opendir(testDir); - const entries = []; - - let i = files.length; - while (i--) { - const dirent = await dir.read(); - entries.push(dirent.name); - assertDirent(dirent); - } - - assert.deepStrictEqual(files, entries.sort()); - - // dir.read should return null when no more entries exist - assert.strictEqual(await dir.read(), null); - - await dir.close(); -} -doPromiseTest().then(common.mustCall()); - -// Async iterator -async function doAsyncIterTest() { - const entries = []; - for await (const dirent of await fs.promises.opendir(testDir)) { - entries.push(dirent.name); - assertDirent(dirent); - } - - assert.deepStrictEqual(files, entries.sort()); - - // Automatically closed during iterator -} -doAsyncIterTest().then(common.mustCall()); - -// Async iterators should do automatic cleanup - -async function doAsyncIterBreakTest() { - const dir = await fs.promises.opendir(testDir); - for await (const dirent of dir) { // eslint-disable-line no-unused-vars - break; - } - - // await assert.rejects(async () => dir.read(), dirclosedError); -} -doAsyncIterBreakTest().then(common.mustCall()); - -async function doAsyncIterReturnTest() { - const dir = await fs.promises.opendir(testDir); - await (async function() { - for await (const dirent of dir) { - return; - } - })(); - - // await assert.rejects(async () => dir.read(), dirclosedError); -} -doAsyncIterReturnTest().then(common.mustCall()); - -async function doAsyncIterThrowTest() { - const dir = await fs.promises.opendir(testDir); - try { - for await (const dirent of dir) { // eslint-disable-line no-unused-vars - throw new Error('oh no'); - } - } catch (err) { - if (err.message !== 'oh no') { - throw err; - } - } - - // await assert.rejects(async () => dir.read(), dirclosedError); -} -doAsyncIterThrowTest().then(common.mustCall()); - -// Check error thrown on invalid values of bufferSize -for (const bufferSize of [-1, 0, 0.5, 1.5, Infinity, NaN]) { - assert.throws( - () => fs.opendirSync(testDir, common.mustNotMutateObjectDeep({ bufferSize })), - { - code: 'ERR_OUT_OF_RANGE' - }); -} -for (const bufferSize of ['', '1', null]) { - assert.throws( - () => fs.opendirSync(testDir, common.mustNotMutateObjectDeep({ bufferSize })), - { - code: 'ERR_INVALID_ARG_TYPE' - }); -} - -// Check that passing a positive integer as bufferSize works -{ - const dir = fs.opendirSync(testDir, common.mustNotMutateObjectDeep({ bufferSize: 1024 })); - assertDirent(dir.readSync()); - dir.close(); -} - -// TODO(wafuwafu13): enable this -// // Check that when passing a string instead of function - throw an exception -// async function doAsyncIterInvalidCallbackTest() { -// const dir = await fs.promises.opendir(testDir); -// assert.throws(() => dir.close('not function'), invalidCallbackObj); -// } -// doAsyncIterInvalidCallbackTest().then(common.mustCall()); - -// Check first call to close() - should not report an error. -async function doAsyncIterDirClosedTest() { - const dir = await fs.promises.opendir(testDir); - await dir.close(); - // await assert.rejects(() => dir.close(), dirclosedError); -} -doAsyncIterDirClosedTest().then(common.mustCall()); - -// Check that readSync() and closeSync() during read() throw exceptions -async function doConcurrentAsyncAndSyncOps() { - const dir = await fs.promises.opendir(testDir); - const promise = dir.read(); - - // assert.throws(() => dir.closeSync(), dirconcurrentError); - // assert.throws(() => dir.readSync(), dirconcurrentError); - - await promise; - dir.closeSync(); -} -doConcurrentAsyncAndSyncOps().then(common.mustCall()); - -// TODO(wafuwafu13): enable this -// // Check read throw exceptions on invalid callback -// { -// const dir = fs.opendirSync(testDir); -// assert.throws(() => dir.read('INVALID_CALLBACK'), /ERR_INVALID_ARG_TYPE/); -// } - -// Check that concurrent read() operations don't do weird things. -async function doConcurrentAsyncOps() { - const dir = await fs.promises.opendir(testDir); - const promise1 = dir.read(); - const promise2 = dir.read(); - - assertDirent(await promise1); - assertDirent(await promise2); - dir.closeSync(); -} -doConcurrentAsyncOps().then(common.mustCall()); - -// Check that concurrent read() + close() operations don't do weird things. -async function doConcurrentAsyncMixedOps() { - const dir = await fs.promises.opendir(testDir); - const promise1 = dir.read(); - const promise2 = dir.close(); - - assertDirent(await promise1); - await promise2; -} -doConcurrentAsyncMixedOps().then(common.mustCall()); - -// Check if directory already closed - the callback should pass an error. -{ - const dir = fs.opendirSync(testDir); - dir.closeSync(); - dir.close(common.mustCall((error) => { - // assert.strictEqual(error.code, dirclosedError.code); - })); -} - -// Check if directory already closed - throw an promise exception. -{ - const dir = fs.opendirSync(testDir); - dir.closeSync(); - // assert.rejects(dir.close(), dirclosedError).then(common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js deleted file mode 100644 index aaa8b42e8..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-autoClose.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const fs = require('fs'); -const path = require('path'); -const assert = require('assert'); -const tmpdir = require('../common/tmpdir'); -const writeFile = path.join(tmpdir.path, 'write-autoClose.txt'); -tmpdir.refresh(); - -const file = fs.createWriteStream(writeFile, { autoClose: true }); - -file.on('finish', common.mustCall(() => { - assert.strictEqual(file.destroyed, false); -})); -file.end('asd'); diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js deleted file mode 100644 index ac52d66a8..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-concurrent-reads.js +++ /dev/null @@ -1,54 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const fixtures = require('../common/fixtures'); -const assert = require('assert'); -const fs = require('fs'); - -// Test that concurrent file read streams don’t interfere with each other’s -// contents, and that the chunks generated by the reads only retain a -// 'reasonable' amount of memory. - -// Refs: https://github.com/nodejs/node/issues/21967 - -const filename = fixtures.path('loop.js'); // Some small non-homogeneous file. -const content = fs.readFileSync(filename); - -const N = 2000; -let started = 0; -let done = 0; - -const arrayBuffers = new Set(); - -function startRead() { - ++started; - const chunks = []; - fs.createReadStream(filename) - .on('data', (chunk) => { - chunks.push(chunk); - arrayBuffers.add(chunk.buffer); - }) - .on('end', common.mustCall(() => { - if (started < N) - startRead(); - assert.deepStrictEqual(Buffer.concat(chunks), content); - if (++done === N) { - const retainedMemory = - [...arrayBuffers].map((ab) => ab.byteLength).reduce((a, b) => a + b); - assert(retainedMemory / (N * content.length) <= 3, - `Retaining ${retainedMemory} bytes in ABs for ${N} ` + - `chunks of size ${content.length}`); - } - })); -} - -// Don’t start the reads all at once – that way we would have to allocate -// a large amount of memory upfront. -for (let i = 0; i < 6; ++i) - startRead(); diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-double-close.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-double-close.js deleted file mode 100644 index 1706dd515..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-double-close.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const fs = require('fs'); - -{ - const s = fs.createReadStream(__filename); - - s.close(common.mustCall()); - s.close(common.mustCall()); -} - -{ - const s = fs.createReadStream(__filename); - - // This is a private API, but it is worth testing. close calls this - s.destroy(null, common.mustCall()); - s.destroy(null, common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-encoding.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-encoding.js deleted file mode 100644 index c3adee739..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-encoding.js +++ /dev/null @@ -1,24 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const fs = require('fs'); -const stream = require('stream'); -const fixtures = require('../common/fixtures'); -const encoding = 'base64'; - -const example = fixtures.path('x.txt'); -const assertStream = new stream.Writable({ - write: function(chunk, enc, next) { - const expected = Buffer.from('xyz'); - assert(chunk.equals(expected)); - } -}); -assertStream.setDefaultEncoding(encoding); -fs.createReadStream(example, encoding).pipe(assertStream); diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-fd.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-fd.js deleted file mode 100644 index 467c48b8d..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-fd.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 fs = require('fs'); -const assert = require('assert'); -const path = require('path'); -const tmpdir = require('../common/tmpdir'); -const file = path.join(tmpdir.path, '/read_stream_fd_test.txt'); -const input = 'hello world'; - -let output = ''; -tmpdir.refresh(); -fs.writeFileSync(file, input); - -const fd = fs.openSync(file, 'r'); -const stream = fs.createReadStream(null, { fd: fd, encoding: 'utf8' }); - -assert.strictEqual(stream.path, undefined); - -stream.on('data', common.mustCallAtLeast((data) => { - output += data; -})); - -process.on('exit', () => { - assert.strictEqual(output, input); -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-inherit.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-inherit.js deleted file mode 100644 index 2de42ffb5..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-inherit.js +++ /dev/null @@ -1,212 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -const assert = require('assert'); -const fs = require('fs'); -const fixtures = require('../common/fixtures'); - -const fn = fixtures.path('elipses.txt'); -const rangeFile = fixtures.path('x.txt'); - -{ - let paused = false; - - const file = fs.ReadStream(fn); - - file.on('open', common.mustCall(function(fd) { - file.length = 0; - assert.strictEqual(typeof fd, 'number'); - assert.ok(file.readable); - - // GH-535 - file.pause(); - file.resume(); - file.pause(); - file.resume(); - })); - - file.on('data', common.mustCallAtLeast(function(data) { - assert.ok(data instanceof Buffer); - assert.ok(!paused); - file.length += data.length; - - paused = true; - file.pause(); - - setTimeout(function() { - paused = false; - file.resume(); - }, 10); - })); - - - file.on('end', common.mustCall()); - - - file.on('close', common.mustCall(function() { - assert.strictEqual(file.length, 30000); - })); -} - -{ - const file = fs.createReadStream(fn, Object.create({ encoding: 'utf8' })); - file.length = 0; - file.on('data', function(data) { - assert.strictEqual(typeof data, 'string'); - file.length += data.length; - - for (let i = 0; i < data.length; i++) { - // http://www.fileformat.info/info/unicode/char/2026/index.htm - assert.strictEqual(data[i], '\u2026'); - } - }); - - file.on('close', common.mustCall(function() { - assert.strictEqual(file.length, 10000); - })); -} - -{ - const options = Object.create({ bufferSize: 1, start: 1, end: 2 }); - const file = fs.createReadStream(rangeFile, options); - assert.strictEqual(file.start, 1); - assert.strictEqual(file.end, 2); - let contentRead = ''; - file.on('data', function(data) { - contentRead += data.toString('utf-8'); - }); - file.on('end', common.mustCall(function() { - assert.strictEqual(contentRead, 'yz'); - })); -} - -{ - const options = Object.create({ bufferSize: 1, start: 1 }); - const file = fs.createReadStream(rangeFile, options); - assert.strictEqual(file.start, 1); - file.data = ''; - file.on('data', function(data) { - file.data += data.toString('utf-8'); - }); - file.on('end', common.mustCall(function() { - assert.strictEqual(file.data, 'yz\n'); - })); -} - -// https://github.com/joyent/node/issues/2320 -{ - const options = Object.create({ bufferSize: 1.23, start: 1 }); - const file = fs.createReadStream(rangeFile, options); - assert.strictEqual(file.start, 1); - file.data = ''; - file.on('data', function(data) { - file.data += data.toString('utf-8'); - }); - file.on('end', common.mustCall(function() { - assert.strictEqual(file.data, 'yz\n'); - })); -} - -{ - const message = - 'The value of "start" is out of range. It must be <= "end" (here: 2).' + - ' Received 10'; - - assert.throws( - () => { - fs.createReadStream(rangeFile, Object.create({ start: 10, end: 2 })); - }, - { - code: 'ERR_OUT_OF_RANGE', - message, - name: 'RangeError' - }); -} - -{ - const options = Object.create({ start: 0, end: 0 }); - const stream = fs.createReadStream(rangeFile, options); - assert.strictEqual(stream.start, 0); - assert.strictEqual(stream.end, 0); - stream.data = ''; - - stream.on('data', function(chunk) { - stream.data += chunk; - }); - - stream.on('end', common.mustCall(function() { - assert.strictEqual(stream.data, 'x'); - })); -} - -// Pause and then resume immediately. -{ - const pauseRes = fs.createReadStream(rangeFile); - pauseRes.pause(); - pauseRes.resume(); -} - -{ - let data = ''; - let file = - fs.createReadStream(rangeFile, Object.create({ autoClose: false })); - assert.strictEqual(file.autoClose, false); - file.on('data', (chunk) => { data += chunk; }); - file.on('end', common.mustCall(function() { - process.nextTick(common.mustCall(function() { - assert(!file.closed); - assert(!file.destroyed); - assert.strictEqual(data, 'xyz\n'); - fileNext(); - })); - })); - - function fileNext() { - // This will tell us if the fd is usable again or not. - file = fs.createReadStream(null, Object.create({ fd: file.fd, start: 0 })); - file.data = ''; - file.on('data', function(data) { - file.data += data; - }); - file.on('end', common.mustCall(function() { - assert.strictEqual(file.data, 'xyz\n'); - })); - } - process.on('exit', function() { - assert(file.closed); - assert(file.destroyed); - }); -} - -// Just to make sure autoClose won't close the stream because of error. -{ - const options = Object.create({ fd: 13337, autoClose: false }); - const file = fs.createReadStream(null, options); - file.on('data', common.mustNotCall()); - file.on('error', common.mustCall()); - process.on('exit', function() { - assert(!file.closed); - assert(!file.destroyed); - assert(file.fd); - }); -} - -// Make sure stream is destroyed when file does not exist. -{ - const file = fs.createReadStream('/path/to/file/that/does/not/exist'); - file.on('data', common.mustNotCall()); - file.on('error', common.mustCall()); - - process.on('exit', function() { - assert(file.closed); - assert(file.destroyed); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js deleted file mode 100644 index 2f9788894..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-patch-open.js +++ /dev/null @@ -1,24 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const fs = require('fs'); - -common.expectWarning( - 'DeprecationWarning', - 'ReadStream.prototype.open() is deprecated', 'DEP0135'); -const s = fs.createReadStream('asd') - // We don't care about errors in this test. - .on('error', () => {}); -s.open(); - -process.nextTick(() => { - // Allow overriding open(). - fs.ReadStream.prototype.open = common.mustCall(); - fs.createReadStream('asd'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-resume.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-resume.js deleted file mode 100644 index 50ec85603..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-resume.js +++ /dev/null @@ -1,59 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 fixtures = require('../common/fixtures'); -const assert = require('assert'); - -const fs = require('fs'); - -const file = fixtures.path('x.txt'); -let data = ''; -let first = true; - -const stream = fs.createReadStream(file); -stream.setEncoding('utf8'); -stream.on('data', common.mustCallAtLeast(function(chunk) { - data += chunk; - if (first) { - first = false; - stream.resume(); - } -})); - -process.nextTick(function() { - stream.pause(); - setTimeout(function() { - stream.resume(); - }, 100); -}); - -process.on('exit', function() { - assert.strictEqual(data, 'xyz\n'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js deleted file mode 100644 index 4dda1150f..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream-throw-type-error.js +++ /dev/null @@ -1,84 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const fixtures = require('../common/fixtures'); -const assert = require('assert'); -const fs = require('fs'); - -// This test ensures that appropriate TypeError is thrown by createReadStream -// when an argument with invalid type is passed - -const example = fixtures.path('x.txt'); -// Should not throw. -fs.createReadStream(example, undefined); -fs.createReadStream(example, null); -fs.createReadStream(example, 'utf8'); -fs.createReadStream(example, { encoding: 'utf8' }); - -const createReadStreamErr = (path, opt, error) => { - assert.throws(() => { - fs.createReadStream(path, opt); - }, error); -}; - -const typeError = { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' -}; - -const rangeError = { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError' -}; - -[123, 0, true, false].forEach((opts) => - createReadStreamErr(example, opts, typeError) -); - -// Case 0: Should not throw if either start or end is undefined -[{}, { start: 0 }, { end: Infinity }].forEach((opts) => - fs.createReadStream(example, opts) -); - -// Case 1: Should throw TypeError if either start or end is not of type 'number' -[ - { start: 'invalid' }, - { end: 'invalid' }, - { start: 'invalid', end: 'invalid' }, -].forEach((opts) => createReadStreamErr(example, opts, typeError)); - -// Case 2: Should throw RangeError if either start or end is NaN -[{ start: NaN }, { end: NaN }, { start: NaN, end: NaN }].forEach((opts) => - createReadStreamErr(example, opts, rangeError) -); - -// Case 3: Should throw RangeError if either start or end is negative -[{ start: -1 }, { end: -1 }, { start: -1, end: -1 }].forEach((opts) => - createReadStreamErr(example, opts, rangeError) -); - -// Case 4: Should throw RangeError if either start or end is fractional -[{ start: 0.1 }, { end: 0.1 }, { start: 0.1, end: 0.1 }].forEach((opts) => - createReadStreamErr(example, opts, rangeError) -); - -// Case 5: Should not throw if both start and end are whole numbers -fs.createReadStream(example, { start: 1, end: 5 }); - -// Case 6: Should throw RangeError if start is greater than end -createReadStreamErr(example, { start: 5, end: 1 }, rangeError); - -// Case 7: Should throw RangeError if start or end is not safe integer -const NOT_SAFE_INTEGER = 2 ** 53; -[ - { start: NOT_SAFE_INTEGER, end: Infinity }, - { start: 0, end: NOT_SAFE_INTEGER }, -].forEach((opts) => - createReadStreamErr(example, opts, rangeError) -); diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-stream.js b/cli/tests/node_compat/test/parallel/test-fs-read-stream.js deleted file mode 100644 index e42347264..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-stream.js +++ /dev/null @@ -1,284 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 tmpdir = require('../common/tmpdir'); - -const child_process = require('child_process'); -const assert = require('assert'); -const fs = require('fs'); -const fixtures = require('../common/fixtures'); - -const fn = fixtures.path('elipses.txt'); -const rangeFile = fixtures.path('x.txt'); - -function test1(options) { - let paused = false; - let bytesRead = 0; - - const file = fs.createReadStream(fn, options); - const fileSize = fs.statSync(fn).size; - - assert.strictEqual(file.bytesRead, 0); - - file.on('open', common.mustCall(function(fd) { - file.length = 0; - assert.strictEqual(typeof fd, 'number'); - assert.strictEqual(file.bytesRead, 0); - assert.ok(file.readable); - - // GH-535 - file.pause(); - file.resume(); - file.pause(); - file.resume(); - })); - - file.on('data', function(data) { - assert.ok(data instanceof Buffer); - assert.ok(data.byteOffset % 8 === 0); - assert.ok(!paused); - file.length += data.length; - - bytesRead += data.length; - assert.strictEqual(file.bytesRead, bytesRead); - - paused = true; - file.pause(); - - setTimeout(function() { - paused = false; - file.resume(); - }, 10); - }); - - - file.on('end', common.mustCall(function(chunk) { - assert.strictEqual(bytesRead, fileSize); - assert.strictEqual(file.bytesRead, fileSize); - })); - - - file.on('close', common.mustCall(function() { - assert.strictEqual(bytesRead, fileSize); - assert.strictEqual(file.bytesRead, fileSize); - })); - - process.on('exit', function() { - assert.strictEqual(file.length, 30000); - }); -} - -test1({}); -test1({ - fs: { - open: common.mustCall(fs.open), - read: common.mustCallAtLeast(fs.read, 1), - close: common.mustCall(fs.close), - } -}); - -{ - const file = fs.createReadStream(fn, common.mustNotMutateObjectDeep({ encoding: 'utf8' })); - file.length = 0; - file.on('data', function(data) { - assert.strictEqual(typeof data, 'string'); - file.length += data.length; - - for (let i = 0; i < data.length; i++) { - // http://www.fileformat.info/info/unicode/char/2026/index.htm - assert.strictEqual(data[i], '\u2026'); - } - }); - - file.on('close', common.mustCall()); - - process.on('exit', function() { - assert.strictEqual(file.length, 10000); - }); -} - -{ - const file = - fs.createReadStream(rangeFile, common.mustNotMutateObjectDeep({ bufferSize: 1, start: 1, end: 2 })); - let contentRead = ''; - file.on('data', function(data) { - contentRead += data.toString('utf-8'); - }); - file.on('end', common.mustCall(function(data) { - assert.strictEqual(contentRead, 'yz'); - })); -} - -{ - const file = fs.createReadStream(rangeFile, common.mustNotMutateObjectDeep({ bufferSize: 1, start: 1 })); - file.data = ''; - file.on('data', function(data) { - file.data += data.toString('utf-8'); - }); - file.on('end', common.mustCall(function() { - assert.strictEqual(file.data, 'yz\n'); - })); -} - -{ - // Ref: https://github.com/nodejs/node-v0.x-archive/issues/2320 - const file = fs.createReadStream(rangeFile, common.mustNotMutateObjectDeep({ bufferSize: 1.23, start: 1 })); - file.data = ''; - file.on('data', function(data) { - file.data += data.toString('utf-8'); - }); - file.on('end', common.mustCall(function() { - assert.strictEqual(file.data, 'yz\n'); - })); -} - -assert.throws( - () => { - fs.createReadStream(rangeFile, common.mustNotMutateObjectDeep({ start: 10, end: 2 })); - }, - { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "start" is out of range. It must be <= "end"' + - ' (here: 2). Received 10', - name: 'RangeError' - }); - -{ - const stream = fs.createReadStream(rangeFile, common.mustNotMutateObjectDeep({ start: 0, end: 0 })); - stream.data = ''; - - stream.on('data', function(chunk) { - stream.data += chunk; - }); - - stream.on('end', common.mustCall(function() { - assert.strictEqual(stream.data, 'x'); - })); -} - -{ - // Verify that end works when start is not specified. - const stream = new fs.createReadStream(rangeFile, common.mustNotMutateObjectDeep({ end: 1 })); - stream.data = ''; - - stream.on('data', function(chunk) { - stream.data += chunk; - }); - - stream.on('end', common.mustCall(function() { - assert.strictEqual(stream.data, 'xy'); - })); -} - -if (!common.isWindows) { - // Verify that end works when start is not specified, and we do not try to - // use positioned reads. This makes sure that this keeps working for - // non-seekable file descriptors. - tmpdir.refresh(); - const filename = `${tmpdir.path}/foo.pipe`; - const mkfifoResult = child_process.spawnSync('mkfifo', [filename]); - if (!mkfifoResult.error) { - child_process.exec(`echo "xyz foobar" > '${filename}'`); - const stream = new fs.createReadStream(filename, common.mustNotMutateObjectDeep({ end: 1 })); - stream.data = ''; - - stream.on('data', function(chunk) { - stream.data += chunk; - }); - - stream.on('end', common.mustCall(function() { - assert.strictEqual(stream.data, 'xy'); - fs.unlinkSync(filename); - })); - } else { - common.printSkipMessage('mkfifo not available'); - } -} - -{ - // Pause and then resume immediately. - const pauseRes = fs.createReadStream(rangeFile); - pauseRes.pause(); - pauseRes.resume(); -} - -{ - let file = fs.createReadStream(rangeFile, common.mustNotMutateObjectDeep({ autoClose: false })); - let data = ''; - file.on('data', function(chunk) { data += chunk; }); - file.on('end', common.mustCall(function() { - assert.strictEqual(data, 'xyz\n'); - process.nextTick(function() { - assert(!file.closed); - assert(!file.destroyed); - fileNext(); - }); - })); - - function fileNext() { - // This will tell us if the fd is usable again or not. - file = fs.createReadStream(null, common.mustNotMutateObjectDeep({ fd: file.fd, start: 0 })); - file.data = ''; - file.on('data', function(data) { - file.data += data; - }); - file.on('end', common.mustCall(function(err) { - assert.strictEqual(file.data, 'xyz\n'); - })); - process.on('exit', function() { - assert(file.closed); - assert(file.destroyed); - }); - } -} - -{ - // Just to make sure autoClose won't close the stream because of error. - const file = fs.createReadStream(null, common.mustNotMutateObjectDeep({ fd: 13337, autoClose: false })); - file.on('data', common.mustNotCall()); - file.on('error', common.mustCall()); - process.on('exit', function() { - assert(!file.closed); - assert(!file.destroyed); - assert(file.fd); - }); -} - -{ - // Make sure stream is destroyed when file does not exist. - const file = fs.createReadStream('/path/to/file/that/does/not/exist'); - file.on('data', common.mustNotCall()); - file.on('error', common.mustCall()); - - process.on('exit', function() { - assert(file.closed); - assert(file.destroyed); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-type.js b/cli/tests/node_compat/test/parallel/test-fs-read-type.js deleted file mode 100644 index 99321ce3e..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-type.js +++ /dev/null @@ -1,250 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const fs = require('fs'); -const assert = require('assert'); -const fixtures = require('../common/fixtures'); - -const filepath = fixtures.path('x.txt'); -const fd = fs.openSync(filepath, 'r'); -const expected = 'xyz\n'; - - -// Error must be thrown with string -assert.throws( - () => fs.read(fd, expected.length, 0, 'utf-8', common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "buffer" argument must be an instance of Buffer, ' + - 'TypedArray, or DataView. Received type number (4)' - } -); - -[true, null, undefined, () => {}, {}].forEach((value) => { - assert.throws(() => { - fs.read(value, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - 0, - common.mustNotCall()); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); -}); - -assert.throws(() => { - fs.read(fd, - Buffer.allocUnsafe(expected.length), - -1, - expected.length, - 0, - common.mustNotCall()); -}, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', -}); - -assert.throws(() => { - fs.read(fd, - Buffer.allocUnsafe(expected.length), - NaN, - expected.length, - 0, - common.mustNotCall()); -}, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. It must be an integer. ' + - 'Received NaN' -}); - -assert.throws(() => { - fs.read(fd, - Buffer.allocUnsafe(expected.length), - 0, - -1, - 0, - common.mustNotCall()); -}, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "length" is out of range. ' + - 'It must be >= 0. Received -1' -}); - -[true, () => {}, {}, ''].forEach((value) => { - assert.throws(() => { - fs.read(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - value, - common.mustNotCall()); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); -}); - -[0.5, 2 ** 53, 2n ** 63n].forEach((value) => { - assert.throws(() => { - fs.read(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - value, - common.mustNotCall()); - }, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError' - }); -}); - -fs.read(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - 0n, - common.mustSucceed()); - -fs.read(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - 2n ** 53n - 1n, - common.mustCall((err) => { - if (err) { - if (common.isIBMi) - assert.strictEqual(err.code, 'EOVERFLOW'); - else - assert.strictEqual(err.code, 'EFBIG'); - } - })); - -assert.throws( - () => fs.readSync(fd, expected.length, 0, 'utf-8'), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "buffer" argument must be an instance of Buffer, ' + - 'TypedArray, or DataView. Received type number (4)' - } -); - -[true, null, undefined, () => {}, {}].forEach((value) => { - assert.throws(() => { - fs.readSync(value, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - 0); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); -}); - -assert.throws(() => { - fs.readSync(fd, - Buffer.allocUnsafe(expected.length), - -1, - expected.length, - 0); -}, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', -}); - -assert.throws(() => { - fs.readSync(fd, - Buffer.allocUnsafe(expected.length), - NaN, - expected.length, - 0); -}, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. It must be an integer. ' + - 'Received NaN' -}); - -assert.throws(() => { - fs.readSync(fd, - Buffer.allocUnsafe(expected.length), - 0, - -1, - 0); -}, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "length" is out of range. ' + - 'It must be >= 0. Received -1' -}); - -assert.throws(() => { - fs.readSync(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length + 1, - 0); -}, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "length" is out of range. ' + - 'It must be <= 4. Received 5' -}); - -[true, () => {}, {}, ''].forEach((value) => { - assert.throws(() => { - fs.readSync(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - value); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); -}); - -[0.5, 2 ** 53, 2n ** 63n].forEach((value) => { - assert.throws(() => { - fs.readSync(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - value); - }, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError' - }); -}); - -fs.readSync(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - 0n); - -try { - fs.readSync(fd, - Buffer.allocUnsafe(expected.length), - 0, - expected.length, - 2n ** 53n - 1n); -} catch (err) { - // On systems where max file size is below 2^53-1, we'd expect a EFBIG error. - // This is not using `assert.throws` because the above call should not raise - // any error on systems that allows file of that size. - if (err.code !== 'EFBIG' && !(common.isIBMi && err.code === 'EOVERFLOW')) - throw err; -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-read-zero-length.js b/cli/tests/node_compat/test/parallel/test-fs-read-zero-length.js deleted file mode 100644 index 3a7501073..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read-zero-length.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const fixtures = require('../common/fixtures'); -const assert = require('assert'); -const fs = require('fs'); -const filepath = fixtures.path('x.txt'); -const fd = fs.openSync(filepath, 'r'); -const bufferAsync = Buffer.alloc(0); -const bufferSync = Buffer.alloc(0); - -fs.read(fd, bufferAsync, 0, 0, 0, common.mustCall((err, bytesRead) => { - assert.strictEqual(bytesRead, 0); - assert.deepStrictEqual(bufferAsync, Buffer.alloc(0)); -})); - -const r = fs.readSync(fd, bufferSync, 0, 0, 0); -assert.deepStrictEqual(bufferSync, Buffer.alloc(0)); -assert.strictEqual(r, 0); diff --git a/cli/tests/node_compat/test/parallel/test-fs-read.js b/cli/tests/node_compat/test/parallel/test-fs-read.js deleted file mode 100644 index 2a7a286d9..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-read.js +++ /dev/null @@ -1,109 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 fixtures = require('../common/fixtures'); -const assert = require('assert'); -const fs = require('fs'); -const filepath = fixtures.path('x.txt'); -const fd = fs.openSync(filepath, 'r'); - -const expected = Buffer.from('xyz\n'); - -function test(bufferAsync, bufferSync, expected) { - fs.read(fd, - bufferAsync, - 0, - expected.length, - 0, - common.mustSucceed((bytesRead) => { - assert.strictEqual(bytesRead, expected.length); - assert.deepStrictEqual(bufferAsync, expected); - })); - - const r = fs.readSync(fd, bufferSync, 0, expected.length, 0); - assert.deepStrictEqual(bufferSync, expected); - assert.strictEqual(r, expected.length); -} - -test(Buffer.allocUnsafe(expected.length), - Buffer.allocUnsafe(expected.length), - expected); - -test(new Uint8Array(expected.length), - new Uint8Array(expected.length), - Uint8Array.from(expected)); - -{ - // Reading beyond file length (3 in this case) should return no data. - // This is a test for a bug where reads > uint32 would return data - // from the current position in the file. - const pos = 0xffffffff + 1; // max-uint32 + 1 - const nRead = fs.readSync(fd, Buffer.alloc(1), 0, 1, pos); - assert.strictEqual(nRead, 0); - - fs.read(fd, Buffer.alloc(1), 0, 1, pos, common.mustSucceed((nRead) => { - assert.strictEqual(nRead, 0); - })); -} - -assert.throws(() => new fs.Dir(), { - code: 'ERR_MISSING_ARGS', -}); - -assert.throws( - () => fs.read(fd, Buffer.alloc(1), 0, 1, 0), - { - code: 'ERR_INVALID_ARG_TYPE', - } -); - -assert.throws( - () => fs.read(fd, { buffer: null }, common.mustNotCall()), - /TypeError: Cannot read properties of null \(reading 'byteLength'\)/, - 'throws when options.buffer is null' -); - -assert.throws( - () => fs.readSync(fd, { buffer: null }), - { - name: 'TypeError', - message: 'The "buffer" argument must be an instance of Buffer, ' + - 'TypedArray, or DataView. Received an instance of Object', - }, - 'throws when options.buffer is null' -); - -assert.throws( - () => fs.read(null, Buffer.alloc(1), 0, 1, 0), - { - message: 'The "fd" argument must be of type number. Received null', - code: 'ERR_INVALID_ARG_TYPE', - } -); diff --git a/cli/tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js b/cli/tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js deleted file mode 100644 index 1a60f9a71..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-readdir-stack-overflow.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -const assert = require('assert'); -const fs = require('fs'); - -function recurse() { - fs.readdirSync('.'); - recurse(); -} - -assert.throws( - () => recurse(), - { - name: 'RangeError', - message: 'Maximum call stack size exceeded' - } -); diff --git a/cli/tests/node_compat/test/parallel/test-fs-readdir.js b/cli/tests/node_compat/test/parallel/test-fs-readdir.js deleted file mode 100644 index 768162fe2..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-readdir.js +++ /dev/null @@ -1,60 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); - -const readdirDir = tmpdir.path; -const files = ['empty', 'files', 'for', 'just', 'testing']; - -// Make sure tmp directory is clean -tmpdir.refresh(); - -// Create the necessary files -files.forEach(function(currentFile) { - fs.closeSync(fs.openSync(`${readdirDir}/${currentFile}`, 'w')); -}); - -// Check the readdir Sync version -assert.deepStrictEqual(files, fs.readdirSync(readdirDir).sort()); - -// Check the readdir async version -fs.readdir(readdirDir, common.mustSucceed((f) => { - assert.deepStrictEqual(files, f.sort()); -})); - -// readdir() on file should throw ENOTDIR -// https://github.com/joyent/node/issues/1869 -assert.throws(function() { - fs.readdirSync(__filename); -}, /Error: ENOTDIR: not a directory/); - -fs.readdir(__filename, common.mustCall(function(e) { - assert.strictEqual(e.code, 'ENOTDIR'); -})); - -[false, 1, [], {}, null, undefined].forEach((i) => { - assert.throws( - () => fs.readdir(i, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.readdirSync(i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-readfile-empty.js b/cli/tests/node_compat/test/parallel/test-fs-readfile-empty.js deleted file mode 100644 index 15f08ef8c..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-readfile-empty.js +++ /dev/null @@ -1,52 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -// Trivial test of fs.readFile on an empty file. -const common = require('../common'); -const fs = require('fs'); -const assert = require('assert'); -const fixtures = require('../common/fixtures'); - -const fn = fixtures.path('empty.txt'); - -fs.readFile(fn, common.mustCall((err, data) => { - assert.ok(data); -})); - -fs.readFile(fn, 'utf8', common.mustCall((err, data) => { - assert.strictEqual(data, ''); -})); - -fs.readFile(fn, { encoding: 'utf8' }, common.mustCall((err, data) => { - assert.strictEqual(data, ''); -})); - -assert.ok(fs.readFileSync(fn)); -assert.strictEqual(fs.readFileSync(fn, 'utf8'), ''); diff --git a/cli/tests/node_compat/test/parallel/test-fs-realpath-native.js b/cli/tests/node_compat/test/parallel/test-fs-realpath-native.js deleted file mode 100644 index 13e5b48cb..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-realpath-native.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const fs = require('fs'); - -const filename = __filename.toLowerCase(); - -assert.strictEqual( - fs.realpathSync.native('./test/parallel/test-fs-realpath-native.js') - .toLowerCase(), - filename); - -fs.realpath.native( - './test/parallel/test-fs-realpath-native.js', - common.mustSucceed(function(res) { - assert.strictEqual(res.toLowerCase(), filename); - assert.strictEqual(this, undefined); - })); diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js b/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js deleted file mode 100644 index 92ca59255..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-not-found.js +++ /dev/null @@ -1,30 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -tmpdir.refresh(); - -{ - // Should warn when trying to delete a nonexistent path - common.expectWarning( - 'DeprecationWarning', - 'In future versions of Node.js, fs.rmdir(path, { recursive: true }) ' + - 'will be removed. Use fs.rm(path, { recursive: true }) instead', - 'DEP0147' - ); - assert.throws( - () => fs.rmdirSync(path.join(tmpdir.path, 'noexist.txt'), - { recursive: true }), - { code: 'ENOENT' } - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js b/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js deleted file mode 100644 index 95703b99f..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-sync-warns-on-file.js +++ /dev/null @@ -1,30 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -tmpdir.refresh(); - -{ - common.expectWarning( - 'DeprecationWarning', - 'In future versions of Node.js, fs.rmdir(path, { recursive: true }) ' + - 'will be removed. Use fs.rm(path, { recursive: true }) instead', - 'DEP0147' - ); - const filePath = path.join(tmpdir.path, 'rmdir-recursive.txt'); - fs.writeFileSync(filePath, ''); - assert.throws( - () => fs.rmdirSync(filePath, { recursive: true }), - { code: common.isWindows ? 'ENOENT' : 'ENOTDIR' } - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js b/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js deleted file mode 100644 index 9a6d584d9..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-not-found.js +++ /dev/null @@ -1,43 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -tmpdir.refresh(); - -{ - assert.throws( - () => - fs.rmdirSync(path.join(tmpdir.path, 'noexist.txt'), { recursive: true }), - { - code: 'ENOENT', - } - ); -} -{ - fs.rmdir( - path.join(tmpdir.path, 'noexist.txt'), - { recursive: true }, - common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOENT'); - }) - ); -} -{ - assert.rejects( - () => fs.promises.rmdir(path.join(tmpdir.path, 'noexist.txt'), - { recursive: true }), - { - code: 'ENOENT', - } - ).then(common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js b/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js deleted file mode 100644 index 4dc27ab8f..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-throws-on-file.js +++ /dev/null @@ -1,36 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -tmpdir.refresh(); - -const code = common.isWindows ? 'ENOENT' : 'ENOTDIR'; - -{ - const filePath = path.join(tmpdir.path, 'rmdir-recursive.txt'); - fs.writeFileSync(filePath, ''); - assert.throws(() => fs.rmdirSync(filePath, { recursive: true }), { code }); -} -{ - const filePath = path.join(tmpdir.path, 'rmdir-recursive.txt'); - fs.writeFileSync(filePath, ''); - fs.rmdir(filePath, { recursive: true }, common.mustCall((err) => { - assert.strictEqual(err.code, code); - })); -} -{ - const filePath = path.join(tmpdir.path, 'rmdir-recursive.txt'); - fs.writeFileSync(filePath, ''); - assert.rejects(() => fs.promises.rmdir(filePath, { recursive: true }), - { code }).then(common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js b/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js deleted file mode 100644 index 3e9564ec1..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-not-found.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); -const fs = require('fs'); -const path = require('path'); - -tmpdir.refresh(); - -{ - // Should warn when trying to delete a nonexistent path - common.expectWarning( - 'DeprecationWarning', - 'In future versions of Node.js, fs.rmdir(path, { recursive: true }) ' + - 'will be removed. Use fs.rm(path, { recursive: true }) instead', - 'DEP0147' - ); - fs.rmdir( - path.join(tmpdir.path, 'noexist.txt'), - { recursive: true }, - common.mustCall() - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js b/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js deleted file mode 100644 index 99644e639..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive-warns-on-file.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -tmpdir.refresh(); - -{ - common.expectWarning( - 'DeprecationWarning', - 'In future versions of Node.js, fs.rmdir(path, { recursive: true }) ' + - 'will be removed. Use fs.rm(path, { recursive: true }) instead', - 'DEP0147' - ); - const filePath = path.join(tmpdir.path, 'rmdir-recursive.txt'); - fs.writeFileSync(filePath, ''); - fs.rmdir(filePath, { recursive: true }, common.mustCall((err) => { - assert.strictEqual(err.code, common.isWindows ? 'ENOENT' : 'ENOTDIR'); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive.js b/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive.js deleted file mode 100644 index 31bde4487..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-recursive.js +++ /dev/null @@ -1,252 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --expose-internals -'use strict'; -const common = require('../common'); -const tmpdir = require('../common/tmpdir'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); -const { validateRmdirOptions } = require('internal/fs/utils'); - -common.expectWarning( - 'DeprecationWarning', - 'In future versions of Node.js, fs.rmdir(path, { recursive: true }) ' + - 'will be removed. Use fs.rm(path, { recursive: true }) instead', - 'DEP0147' -); - -tmpdir.refresh(); - -let count = 0; -const nextDirPath = (name = 'rmdir-recursive') => - path.join(tmpdir.path, `${name}-${count++}`); - -function makeNonEmptyDirectory(depth, files, folders, dirname, createSymLinks) { - fs.mkdirSync(dirname, { recursive: true }); - fs.writeFileSync(path.join(dirname, 'text.txt'), 'hello', 'utf8'); - - const options = { flag: 'wx' }; - - for (let f = files; f > 0; f--) { - fs.writeFileSync(path.join(dirname, `f-${depth}-${f}`), '', options); - } - - if (createSymLinks) { - // Valid symlink - fs.symlinkSync( - `f-${depth}-1`, - path.join(dirname, `link-${depth}-good`), - 'file' - ); - - // Invalid symlink - fs.symlinkSync( - 'does-not-exist', - path.join(dirname, `link-${depth}-bad`), - 'file' - ); - } - - // File with a name that looks like a glob - fs.writeFileSync(path.join(dirname, '[a-z0-9].txt'), '', options); - - depth--; - if (depth <= 0) { - return; - } - - for (let f = folders; f > 0; f--) { - fs.mkdirSync( - path.join(dirname, `folder-${depth}-${f}`), - { recursive: true } - ); - makeNonEmptyDirectory( - depth, - files, - folders, - path.join(dirname, `d-${depth}-${f}`), - createSymLinks - ); - } -} - -function removeAsync(dir) { - // Removal should fail without the recursive option. - fs.rmdir(dir, common.mustCall((err) => { - assert.strictEqual(err.syscall, 'rmdir'); - - // Removal should fail without the recursive option set to true. - fs.rmdir(dir, { recursive: false }, common.mustCall((err) => { - assert.strictEqual(err.syscall, 'rmdir'); - - // Recursive removal should succeed. - fs.rmdir(dir, { recursive: true }, common.mustSucceed(() => { - // An error should occur if recursive and the directory does not exist. - fs.rmdir(dir, { recursive: true }, common.mustCall((err) => { - assert.strictEqual(err.code, 'ENOENT'); - // Attempted removal should fail now because the directory is gone. - fs.rmdir(dir, common.mustCall((err) => { - assert.strictEqual(err.syscall, 'rmdir'); - })); - })); - })); - })); - })); -} - -// Test the asynchronous version -{ - // Create a 4-level folder hierarchy including symlinks - let dir = nextDirPath(); - makeNonEmptyDirectory(4, 10, 2, dir, true); - removeAsync(dir); - - // Create a 2-level folder hierarchy without symlinks - dir = nextDirPath(); - makeNonEmptyDirectory(2, 10, 2, dir, false); - removeAsync(dir); - - // Create a flat folder including symlinks - dir = nextDirPath(); - makeNonEmptyDirectory(1, 10, 2, dir, true); - removeAsync(dir); -} - -// Test the synchronous version. -{ - const dir = nextDirPath(); - makeNonEmptyDirectory(4, 10, 2, dir, true); - - // Removal should fail without the recursive option set to true. - assert.throws(() => { - fs.rmdirSync(dir); - }, { syscall: 'rmdir' }); - assert.throws(() => { - fs.rmdirSync(dir, { recursive: false }); - }, { syscall: 'rmdir' }); - - // Recursive removal should succeed. - fs.rmdirSync(dir, { recursive: true }); - - // An error should occur if recursive and the directory does not exist. - assert.throws(() => fs.rmdirSync(dir, { recursive: true }), - { code: 'ENOENT' }); - - // Attempted removal should fail now because the directory is gone. - assert.throws(() => fs.rmdirSync(dir), { syscall: 'rmdir' }); -} - -// Test the Promises based version. -(async () => { - const dir = nextDirPath(); - makeNonEmptyDirectory(4, 10, 2, dir, true); - - // Removal should fail without the recursive option set to true. - assert.rejects(fs.promises.rmdir(dir), { syscall: 'rmdir' }); - assert.rejects(fs.promises.rmdir(dir, { recursive: false }), { - syscall: 'rmdir' - }); - - // Recursive removal should succeed. - await fs.promises.rmdir(dir, { recursive: true }); - - // An error should occur if recursive and the directory does not exist. - await assert.rejects(fs.promises.rmdir(dir, { recursive: true }), - { code: 'ENOENT' }); - - // Attempted removal should fail now because the directory is gone. - assert.rejects(fs.promises.rmdir(dir), { syscall: 'rmdir' }); -})().then(common.mustCall()); - -// Test input validation. -{ - const defaults = { - retryDelay: 100, - maxRetries: 0, - recursive: false - }; - const modified = { - retryDelay: 953, - maxRetries: 5, - recursive: true - }; - - assert.deepStrictEqual(validateRmdirOptions(), defaults); - assert.deepStrictEqual(validateRmdirOptions({}), defaults); - assert.deepStrictEqual(validateRmdirOptions(modified), modified); - assert.deepStrictEqual(validateRmdirOptions({ - maxRetries: 99 - }), { - retryDelay: 100, - maxRetries: 99, - recursive: false - }); - - [null, 'foo', 5, NaN].forEach((bad) => { - assert.throws(() => { - validateRmdirOptions(bad); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /^The "options" argument must be of type object\./ - }); - }); - - [undefined, null, 'foo', Infinity, function() {}].forEach((bad) => { - assert.throws(() => { - validateRmdirOptions({ recursive: bad }); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: /^The "options\.recursive" property must be of type boolean\./ - }); - }); - - assert.throws(() => { - validateRmdirOptions({ retryDelay: -1 }); - }, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: /^The value of "options\.retryDelay" is out of range\./ - }); - - assert.throws(() => { - validateRmdirOptions({ maxRetries: -1 }); - }, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: /^The value of "options\.maxRetries" is out of range\./ - }); -} - -// FIXME(f3n67u): make this test pass -// It should not pass recursive option to rmdirSync, when called from -// rimraf (see: #35566) -// { -// // Make a non-empty directory: -// const original = fs.rmdirSync; -// const dir = `${nextDirPath()}/foo/bar`; -// fs.mkdirSync(dir, { recursive: true }); -// fs.writeFileSync(`${dir}/foo.txt`, 'hello world', 'utf8'); - -// // When called the second time from rimraf, the recursive option should -// // not be set for rmdirSync: -// let callCount = 0; -// let rmdirSyncOptionsFromRimraf; -// fs.rmdirSync = (path, options) => { -// if (callCount > 0) { -// rmdirSyncOptionsFromRimraf = { ...options }; -// } -// callCount++; -// return original(path, options); -// }; -// fs.rmdirSync(dir, { recursive: true }); -// fs.rmdirSync = original; -// assert.strictEqual(rmdirSyncOptionsFromRimraf.recursive, undefined); -// } diff --git a/cli/tests/node_compat/test/parallel/test-fs-rmdir-type-check.js b/cli/tests/node_compat/test/parallel/test-fs-rmdir-type-check.js deleted file mode 100644 index 0ebfdacaf..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-rmdir-type-check.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const fs = require('fs'); - -[false, 1, [], {}, null, undefined].forEach((i) => { - assert.throws( - () => fs.rmdir(i, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.rmdirSync(i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -}); diff --git a/cli/tests/node_compat/test/parallel/test-fs-watchfile.js b/cli/tests/node_compat/test/parallel/test-fs-watchfile.js deleted file mode 100644 index 3a77fb56d..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-watchfile.js +++ /dev/null @@ -1,112 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -const tmpdir = require('../common/tmpdir'); - -// Basic usage tests. -assert.throws( - () => { - fs.watchFile('./some-file'); - }, - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - -assert.throws( - () => { - fs.watchFile('./another-file', {}, 'bad listener'); - }, - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - -assert.throws(() => { - fs.watchFile(new Object(), common.mustNotCall()); -}, { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }); - -const enoentFile = path.join(tmpdir.path, 'non-existent-file'); -const expectedStatObject = new fs.Stats( - 0, // dev - 0, // mode - 0, // nlink - 0, // uid - 0, // gid - 0, // rdev - 0, // blksize - 0, // ino - 0, // size - 0, // blocks - Date.UTC(1970, 0, 1, 0, 0, 0), // atime - Date.UTC(1970, 0, 1, 0, 0, 0), // mtime - Date.UTC(1970, 0, 1, 0, 0, 0), // ctime - Date.UTC(1970, 0, 1, 0, 0, 0) // birthtime -); - -tmpdir.refresh(); - -// If the file initially didn't exist, and gets created at a later point of -// time, the callback should be invoked again with proper values in stat object -let fileExists = false; - -const watcher = - fs.watchFile(enoentFile, { interval: 0 }, common.mustCall((curr, prev) => { - if (!fileExists) { - // If the file does not exist, all the fields should be zero and the date - // fields should be UNIX EPOCH time - assert.deepStrictEqual(curr, expectedStatObject); - assert.deepStrictEqual(prev, expectedStatObject); - // Create the file now, so that the callback will be called back once the - // event loop notices it. - fs.closeSync(fs.openSync(enoentFile, 'w')); - fileExists = true; - } else { - // If the ino (inode) value is greater than zero, it means that the file - // is present in the filesystem and it has a valid inode number. - assert(curr.ino > 0); - // As the file just got created, previous ino value should be lesser than - // or equal to zero (non-existent file). - assert(prev.ino <= 0); - // Stop watching the file - fs.unwatchFile(enoentFile); - watcher.stop(); // Stopping a stopped watcher should be a noop - } - }, 2)); - -// 'stop' should only be emitted once - stopping a stopped watcher should -// not trigger a 'stop' event. -watcher.on('stop', common.mustCall()); - -// Watch events should callback with a filename on supported systems. -// Omitting AIX. It works but not reliably. -if (common.isLinux || common.isOSX || common.isWindows) { - const dir = path.join(tmpdir.path, 'watch'); - - fs.mkdir(dir, common.mustCall(function(err) { - if (err) assert.fail(err); - - fs.watch(dir, common.mustCall(function(eventType, filename) { - clearInterval(interval); - this._handle.close(); - assert.strictEqual(filename, 'foo.txt'); - })); - - const interval = setInterval(() => { - fs.writeFile(path.join(dir, 'foo.txt'), 'foo', common.mustCall((err) => { - if (err) assert.fail(err); - })); - }, 1); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-buffer.js b/cli/tests/node_compat/test/parallel/test-fs-write-buffer.js deleted file mode 100644 index 16577a8f2..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-buffer.js +++ /dev/null @@ -1,172 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 path = require('path'); -const fs = require('fs'); -const expected = Buffer.from('hello'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -// fs.write with all parameters provided: -{ - const filename = path.join(tmpdir.path, 'write1.txt'); - fs.open(filename, 'w', 0o644, common.mustSucceed((fd) => { - const cb = common.mustSucceed((written) => { - assert.strictEqual(written, expected.length); - fs.closeSync(fd); - - const found = fs.readFileSync(filename, 'utf8'); - assert.strictEqual(found, expected.toString()); - }); - - fs.write(fd, expected, 0, expected.length, null, cb); - })); -} - -// fs.write with a buffer, without the length parameter: -{ - const filename = path.join(tmpdir.path, 'write2.txt'); - fs.open(filename, 'w', 0o644, common.mustSucceed((fd) => { - const cb = common.mustSucceed((written) => { - assert.strictEqual(written, 2); - fs.closeSync(fd); - - const found = fs.readFileSync(filename, 'utf8'); - assert.strictEqual(found, 'lo'); - }); - - fs.write(fd, Buffer.from('hello'), 3, cb); - })); -} - -// fs.write with a buffer, without the offset and length parameters: -{ - const filename = path.join(tmpdir.path, 'write3.txt'); - fs.open(filename, 'w', 0o644, common.mustSucceed((fd) => { - const cb = common.mustSucceed((written) => { - assert.strictEqual(written, expected.length); - fs.closeSync(fd); - - const found = fs.readFileSync(filename, 'utf8'); - assert.deepStrictEqual(expected.toString(), found); - }); - - fs.write(fd, expected, cb); - })); -} - -// fs.write with the offset passed as undefined followed by the callback: -{ - const filename = path.join(tmpdir.path, 'write4.txt'); - fs.open(filename, 'w', 0o644, common.mustSucceed((fd) => { - const cb = common.mustSucceed((written) => { - assert.strictEqual(written, expected.length); - fs.closeSync(fd); - - const found = fs.readFileSync(filename, 'utf8'); - assert.deepStrictEqual(expected.toString(), found); - }); - - fs.write(fd, expected, undefined, cb); - })); -} - -// fs.write with offset and length passed as undefined followed by the callback: -{ - const filename = path.join(tmpdir.path, 'write5.txt'); - fs.open(filename, 'w', 0o644, common.mustSucceed((fd) => { - const cb = common.mustSucceed((written) => { - assert.strictEqual(written, expected.length); - fs.closeSync(fd); - - const found = fs.readFileSync(filename, 'utf8'); - assert.strictEqual(found, expected.toString()); - }); - - fs.write(fd, expected, undefined, undefined, cb); - })); -} - -// fs.write with a Uint8Array, without the offset and length parameters: -{ - const filename = path.join(tmpdir.path, 'write6.txt'); - fs.open(filename, 'w', 0o644, common.mustSucceed((fd) => { - const cb = common.mustSucceed((written) => { - assert.strictEqual(written, expected.length); - fs.closeSync(fd); - - const found = fs.readFileSync(filename, 'utf8'); - assert.strictEqual(found, expected.toString()); - }); - - fs.write(fd, Uint8Array.from(expected), cb); - })); -} - -// fs.write with invalid offset type -{ - const filename = path.join(tmpdir.path, 'write7.txt'); - fs.open(filename, 'w', 0o644, common.mustSucceed((fd) => { - assert.throws(() => { - fs.write(fd, - Buffer.from('abcd'), - NaN, - expected.length, - 0, - common.mustNotCall()); - }, { - code: 'ERR_OUT_OF_RANGE', - name: 'RangeError', - message: 'The value of "offset" is out of range. ' + - 'It must be an integer. Received NaN' - }); - - fs.closeSync(fd); - })); -} - -// fs.write with a DataView, without the offset and length parameters: -{ - const filename = path.join(tmpdir.path, 'write8.txt'); - fs.open(filename, 'w', 0o644, common.mustSucceed((fd) => { - const cb = common.mustSucceed((written) => { - assert.strictEqual(written, expected.length); - fs.closeSync(fd); - - const found = fs.readFileSync(filename, 'utf8'); - assert.strictEqual(found, expected.toString()); - }); - - const uint8 = Uint8Array.from(expected); - fs.write(fd, new DataView(uint8.buffer), cb); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-file-buffer.js b/cli/tests/node_compat/test/parallel/test-fs-write-file-buffer.js deleted file mode 100644 index 9283cc8b4..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-file-buffer.js +++ /dev/null @@ -1,62 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const join = require('path').join; -const util = require('util'); -const fs = require('fs'); - -let data = [ - '/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcH', - 'Bw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/', - '2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e', - 'Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAQABADASIAAhEBAxEB/8QA', - 'HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF', - 'BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK', - 'FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1', - 'dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG', - 'x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB', - 'AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC', - 'AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom', - 'JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE', - 'hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU', - '1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDhfBUFl/wk', - 'OmPqKJJZw3aiZFBw4z93jnkkc9u9dj8XLfSI/EBt7DTo7ea2Ox5YXVo5FC7g', - 'Tjq24nJPXNVtO0KATRvNHCIg3zoWJWQHqp+o4pun+EtJ0zxBq8mnLJa2d1L5', - '0NvnKRjJBUE5PAx3NYxxUY0pRtvYHSc5Ka2X9d7H/9k=']; - -data = data.join('\n'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -const buf = Buffer.from(data, 'base64'); -fs.writeFileSync(join(tmpdir.path, 'test.jpg'), buf); - -util.log('Done!'); diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js b/cli/tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js deleted file mode 100644 index d56aa9a13..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-file-invalid-path.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -if (!common.isWindows) - common.skip('This test is for Windows only.'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -const DATA_VALUE = 'hello'; - -// Refs: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx -// Ignore '/', '\\' and ':' -const RESERVED_CHARACTERS = '<>"|?*'; - -[...RESERVED_CHARACTERS].forEach((ch) => { - const pathname = path.join(tmpdir.path, `somefile_${ch}`); - assert.throws( - () => { - fs.writeFileSync(pathname, DATA_VALUE); - }, - /^Error: ENOENT: no such file or directory, open '.*'$/, - `failed with '${ch}'`); -}); - -// Test for ':' (NTFS data streams). -// Refs: https://msdn.microsoft.com/en-us/library/windows/desktop/bb540537.aspx -const pathname = path.join(tmpdir.path, 'foo:bar'); -fs.writeFileSync(pathname, DATA_VALUE); - -let content = ''; -const fileDataStream = fs.createReadStream(pathname, { - encoding: 'utf8' -}); - -fileDataStream.on('data', (data) => { - content += data; -}); - -fileDataStream.on('end', common.mustCall(() => { - assert.strictEqual(content, DATA_VALUE); -})); diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-file-sync.js b/cli/tests/node_compat/test/parallel/test-fs-write-file-sync.js deleted file mode 100644 index 027ba6377..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-file-sync.js +++ /dev/null @@ -1,128 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -if (!common.isMainThread) - common.skip('Setting process.umask is not supported in Workers'); - -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); - -// On Windows chmod is only able to manipulate read-only bit. Test if creating -// the file in read-only mode works. -const mode = common.isWindows ? 0o444 : 0o755; - -// Reset the umask for testing -process.umask(0o000); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -// Test writeFileSync -{ - const file = path.join(tmpdir.path, 'testWriteFileSync.txt'); - - fs.writeFileSync(file, '123', { mode }); - const content = fs.readFileSync(file, { encoding: 'utf8' }); - assert.strictEqual(content, '123'); - assert.strictEqual(fs.statSync(file).mode & 0o777, mode); -} - -// Test appendFileSync -{ - const file = path.join(tmpdir.path, 'testAppendFileSync.txt'); - - fs.appendFileSync(file, 'abc', { mode }); - const content = fs.readFileSync(file, { encoding: 'utf8' }); - assert.strictEqual(content, 'abc'); - assert.strictEqual(fs.statSync(file).mode & mode, mode); -} - -// Test writeFileSync with file descriptor -{ - // Need to hijack fs.open/close to make sure that things - // get closed once they're opened. - const _openSync = fs.openSync; - const _closeSync = fs.closeSync; - let openCount = 0; - - fs.openSync = (...args) => { - openCount++; - return _openSync(...args); - }; - - fs.closeSync = (...args) => { - openCount--; - return _closeSync(...args); - }; - - const file = path.join(tmpdir.path, 'testWriteFileSyncFd.txt'); - const fd = fs.openSync(file, 'w+', mode); - - fs.writeFileSync(fd, '123'); - fs.closeSync(fd); - const content = fs.readFileSync(file, { encoding: 'utf8' }); - assert.strictEqual(content, '123'); - assert.strictEqual(fs.statSync(file).mode & 0o777, mode); - - // Verify that all opened files were closed. - assert.strictEqual(openCount, 0); - fs.openSync = _openSync; - fs.closeSync = _closeSync; -} - -// Test writeFileSync with flags -{ - const file = path.join(tmpdir.path, 'testWriteFileSyncFlags.txt'); - - fs.writeFileSync(file, 'hello ', { encoding: 'utf8', flag: 'a' }); - fs.writeFileSync(file, 'world!', { encoding: 'utf8', flag: 'a' }); - const content = fs.readFileSync(file, { encoding: 'utf8' }); - assert.strictEqual(content, 'hello world!'); -} - -// Test writeFileSync with an object with an own toString function -{ - // Runtime deprecated by DEP0162 - common.expectWarning('DeprecationWarning', - 'Implicit coercion of objects with own toString property is deprecated.', - 'DEP0162'); - const file = path.join(tmpdir.path, 'testWriteFileSyncStringify.txt'); - const data = { - toString() { - return 'hello world!'; - } - }; - - fs.writeFileSync(file, data, { encoding: 'utf8', flag: 'a' }); - const content = fs.readFileSync(file, { encoding: 'utf8' }); - assert.strictEqual(content, String(data)); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-file.js b/cli/tests/node_compat/test/parallel/test-fs-write-file.js deleted file mode 100644 index a5c93cd23..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-file.js +++ /dev/null @@ -1,115 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 join = require('path').join; - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -const filename = join(tmpdir.path, 'test.txt'); - -const s = '南越国是前203年至前111年存在于岭南地区的一个国家,国都位于番禺,疆域包括今天中国的广东、' + - '广西两省区的大部份地区,福建省、湖南、贵州、云南的一小部份地区和越南的北部。' + - '南越国是秦朝灭亡后,由南海郡尉赵佗于前203年起兵兼并桂林郡和象郡后建立。' + - '前196年和前179年,南越国曾先后两次名义上臣属于西汉,成为西汉的“外臣”。前112年,' + - '南越国末代君主赵建德与西汉发生战争,被汉武帝于前111年所灭。南越国共存在93年,' + - '历经五代君主。南越国是岭南地区的第一个有记载的政权国家,采用封建制和郡县制并存的制度,' + - '它的建立保证了秦末乱世岭南地区社会秩序的稳定,有效的改善了岭南地区落后的政治、##济现状。\n'; - -fs.writeFile(filename, s, common.mustSucceed(() => { - fs.readFile(filename, common.mustSucceed((buffer) => { - assert.strictEqual(Buffer.byteLength(s), buffer.length); - })); -})); - -// Test that writeFile accepts buffers. -const filename2 = join(tmpdir.path, 'test2.txt'); -const buf = Buffer.from(s, 'utf8'); - -fs.writeFile(filename2, buf, common.mustSucceed(() => { - fs.readFile(filename2, common.mustSucceed((buffer) => { - assert.strictEqual(buf.length, buffer.length); - })); -})); - -// Test that writeFile accepts file descriptors. -const filename4 = join(tmpdir.path, 'test4.txt'); - -fs.open(filename4, 'w+', common.mustSucceed((fd) => { - fs.writeFile(fd, s, common.mustSucceed(() => { - fs.close(fd, common.mustSucceed(() => { - fs.readFile(filename4, common.mustSucceed((buffer) => { - assert.strictEqual(Buffer.byteLength(s), buffer.length); - })); - })); - })); -})); - - -{ - // Test that writeFile is cancellable with an AbortSignal. - // Before the operation has started - const controller = new AbortController(); - const signal = controller.signal; - const filename3 = join(tmpdir.path, 'test3.txt'); - - fs.writeFile(filename3, s, { signal }, common.mustCall((err) => { - assert.strictEqual(err.name, 'AbortError'); - })); - - controller.abort(); -} - -// FIXME(bartlomieju): -// { -// // Test that writeFile is cancellable with an AbortSignal. -// // After the operation has started -// const controller = new AbortController(); -// const signal = controller.signal; -// const filename4 = join(tmpdir.path, 'test5.txt'); - -// fs.writeFile(filename4, s, { signal }, common.mustCall((err) => { -// assert.strictEqual(err.name, 'AbortError'); -// })); - -// process.nextTick(() => controller.abort()); -// } - -{ - // Test read-only mode - const filename = join(tmpdir.path, 'test6.txt'); - fs.writeFileSync(filename, ''); - - // TODO: Correct the error type - const expectedError = common.isWindows ? /EPERM/ : /EBADF/; - fs.writeFile(filename, s, { flag: 'r' }, common.expectsError(expectedError)); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-no-fd.js b/cli/tests/node_compat/test/parallel/test-fs-write-no-fd.js deleted file mode 100644 index 58ab0fa44..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-no-fd.js +++ /dev/null @@ -1,19 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const fs = require('fs'); -const assert = require('assert'); - -assert.throws(function() { - fs.write(null, Buffer.allocUnsafe(1), 0, 1, common.mustNotCall()); -}, /TypeError/); - -assert.throws(function() { - fs.write(null, '1', 0, 1, common.mustNotCall()); -}, /TypeError/); diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js b/cli/tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js deleted file mode 100644 index 00958457f..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-autoclose-option.js +++ /dev/null @@ -1,66 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); - -const file = path.join(tmpdir.path, 'write-autoclose-opt1.txt'); -tmpdir.refresh(); -let stream = fs.createWriteStream(file, { flags: 'w+', autoClose: false }); -stream.write('Test1'); -stream.end(); -stream.on('finish', common.mustCall(function() { - stream.on('close', common.mustNotCall()); - process.nextTick(common.mustCall(function() { - assert.strictEqual(stream.closed, false); - assert.notStrictEqual(stream.fd, null); - next(); - })); -})); - -function next() { - // This will tell us if the fd is usable again or not - stream = fs.createWriteStream(null, { fd: stream.fd, start: 0 }); - stream.write('Test2'); - stream.end(); - stream.on('finish', common.mustCall(function() { - assert.strictEqual(stream.closed, false); - stream.on('close', common.mustCall(function() { - assert.strictEqual(stream.fd, null); - assert.strictEqual(stream.closed, true); - process.nextTick(next2); - })); - })); -} - -function next2() { - // This will test if after reusing the fd data is written properly - fs.readFile(file, function(err, data) { - assert.ifError(err); - assert.strictEqual(data.toString(), 'Test2'); - process.nextTick(common.mustCall(next3)); - }); -} - -function next3() { - // This is to test success scenario where autoClose is true - const stream = fs.createWriteStream(file, { autoClose: true }); - stream.write('Test3'); - stream.end(); - stream.on('finish', common.mustCall(function() { - assert.strictEqual(stream.closed, false); - stream.on('close', common.mustCall(function() { - assert.strictEqual(stream.fd, null); - assert.strictEqual(stream.closed, true); - })); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js b/cli/tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js deleted file mode 100644 index 61c3120d7..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-close-without-callback.js +++ /dev/null @@ -1,20 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const fs = require('fs'); -const path = require('path'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -const s = fs.createWriteStream(path.join(tmpdir.path, 'nocallback')); - -s.end('hello world'); -s.close(); diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-double-close.js b/cli/tests/node_compat/test/parallel/test-fs-write-stream-double-close.js deleted file mode 100644 index 1f38a3b7d..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-double-close.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'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(); - -{ - const s = fs.createWriteStream(path.join(tmpdir.path, 'rw')); - - s.close(common.mustCall()); - s.close(common.mustCall()); -} - -{ - const s = fs.createWriteStream(path.join(tmpdir.path, 'rw2')); - - let emits = 0; - s.on('close', () => { - emits++; - }); - - s.close(common.mustCall(() => { - assert.strictEqual(emits, 1); - s.close(common.mustCall(() => { - assert.strictEqual(emits, 1); - })); - process.nextTick(() => { - s.close(common.mustCall(() => { - assert.strictEqual(emits, 1); - })); - }); - })); -} - -{ - const s = fs.createWriteStream(path.join(tmpdir.path, 'rw'), { - autoClose: false - }); - - s.close(common.mustCall()); - s.close(common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-end.js b/cli/tests/node_compat/test/parallel/test-fs-write-stream-end.js deleted file mode 100644 index f11cf86af..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-end.js +++ /dev/null @@ -1,67 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 path = require('path'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -{ - const file = path.join(tmpdir.path, 'write-end-test0.txt'); - const stream = fs.createWriteStream(file); - stream.end(); - stream.on('close', common.mustCall()); -} - -{ - const file = path.join(tmpdir.path, 'write-end-test1.txt'); - const stream = fs.createWriteStream(file); - stream.end('a\n', 'utf8'); - stream.on('close', common.mustCall(function() { - const content = fs.readFileSync(file, 'utf8'); - assert.strictEqual(content, 'a\n'); - })); -} - -{ - const file = path.join(tmpdir.path, 'write-end-test2.txt'); - const stream = fs.createWriteStream(file); - stream.end(); - - let calledOpen = false; - stream.on('open', () => { - calledOpen = true; - }); - stream.on('finish', common.mustCall(() => { - assert.strictEqual(calledOpen, true); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-fs.js b/cli/tests/node_compat/test/parallel/test-fs-write-stream-fs.js deleted file mode 100644 index 533a60d4d..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-fs.js +++ /dev/null @@ -1,45 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const path = require('path'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -{ - const file = path.join(tmpdir.path, 'write-end-test0.txt'); - const stream = fs.createWriteStream(file, { - fs: { - open: common.mustCall(fs.open), - write: common.mustCallAtLeast(fs.write, 1), - close: common.mustCall(fs.close), - } - }); - stream.end('asd'); - stream.on('close', common.mustCall()); -} - - -{ - const file = path.join(tmpdir.path, 'write-end-test1.txt'); - const stream = fs.createWriteStream(file, { - fs: { - open: common.mustCall(fs.open), - write: fs.write, - writev: common.mustCallAtLeast(fs.writev, 1), - close: common.mustCall(fs.close), - } - }); - stream.write('asd'); - stream.write('asd'); - stream.write('asd'); - stream.end(); - stream.on('close', common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js b/cli/tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js deleted file mode 100644 index 5540725f7..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-stream-throw-type-error.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const fs = require('fs'); -const path = require('path'); - -const tmpdir = require('../common/tmpdir'); - -const example = path.join(tmpdir.path, 'dummy'); - -tmpdir.refresh(); -// Should not throw. -fs.createWriteStream(example, undefined).end(); -fs.createWriteStream(example, null).end(); -fs.createWriteStream(example, 'utf8').end(); -fs.createWriteStream(example, { encoding: 'utf8' }).end(); - -const createWriteStreamErr = (path, opt) => { - assert.throws( - () => { - fs.createWriteStream(path, opt); - }, - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); -}; - -createWriteStreamErr(example, 123); -createWriteStreamErr(example, 0); -createWriteStreamErr(example, true); -createWriteStreamErr(example, false); diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-stream.js b/cli/tests/node_compat/test/parallel/test-fs-write-stream.js deleted file mode 100644 index 4d03d44a8..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-stream.js +++ /dev/null @@ -1,74 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 path = require('path'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); - -const file = path.join(tmpdir.path, 'write.txt'); - -tmpdir.refresh(); - -{ - const stream = fs.WriteStream(file); - const _fs_close = fs.close; - - fs.close = function(fd) { - assert.ok(fd, 'fs.close must not be called without an undefined fd.'); - fs.close = _fs_close; - fs.closeSync(fd); - }; - stream.destroy(); -} - -{ - const stream = fs.createWriteStream(file); - - stream.on('drain', function() { - assert.fail('\'drain\' event must not be emitted before ' + - 'stream.write() has been called at least once.'); - }); - stream.destroy(); -} - -// Throws if data is not of type Buffer. -{ - const stream = fs.createWriteStream(file); - stream.on('error', common.mustNotCall()); - assert.throws(() => { - stream.write(42); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - stream.destroy(); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write-sync.js b/cli/tests/node_compat/test/parallel/test-fs-write-sync.js deleted file mode 100644 index 8d9ee9efe..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write-sync.js +++ /dev/null @@ -1,63 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); -const tmpdir = require('../common/tmpdir'); -const filename = path.join(tmpdir.path, 'write.txt'); - -tmpdir.refresh(); - -{ - const parameters = [Buffer.from('bár'), 0, Buffer.byteLength('bár')]; - - // The first time fs.writeSync is called with all parameters provided. - // After that, each pop in the cycle removes the final parameter. So: - // - The 2nd time fs.writeSync with a buffer, without the length parameter. - // - The 3rd time fs.writeSync with a buffer, without the offset and length - // parameters. - while (parameters.length > 0) { - const fd = fs.openSync(filename, 'w'); - - let written = fs.writeSync(fd, ''); - assert.strictEqual(written, 0); - - fs.writeSync(fd, 'foo'); - - written = fs.writeSync(fd, ...parameters); - assert.ok(written > 3); - fs.closeSync(fd); - - assert.strictEqual(fs.readFileSync(filename, 'utf-8'), 'foobár'); - - parameters.pop(); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-write.js b/cli/tests/node_compat/test/parallel/test-fs-write.js deleted file mode 100644 index 33fcb84cf..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-write.js +++ /dev/null @@ -1,212 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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. - -// Flags: --expose_externalize_string -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); -const tmpdir = require('../common/tmpdir'); - -tmpdir.refresh(); - -const fn = path.join(tmpdir.path, 'write.txt'); -const fn2 = path.join(tmpdir.path, 'write2.txt'); -const fn3 = path.join(tmpdir.path, 'write3.txt'); -const fn4 = path.join(tmpdir.path, 'write4.txt'); -const fn5 = path.join(tmpdir.path, 'write5.txt'); -const expected = 'ümlaut.'; -const constants = fs.constants; - -const { externalizeString, isOneByteString } = global; - -// Account for extra globals exposed by --expose_externalize_string. -common.allowGlobals(externalizeString, isOneByteString, global.x); - -{ - const expected = 'ümlaut sechzig'; // Must be a unique string. - externalizeString(expected); - assert.strictEqual(isOneByteString(expected), true); - const fd = fs.openSync(fn, 'w'); - fs.writeSync(fd, expected, 0, 'latin1'); - fs.closeSync(fd); - assert.strictEqual(fs.readFileSync(fn, 'latin1'), expected); -} - -{ - const expected = 'ümlaut neunzig'; // Must be a unique string. - externalizeString(expected); - assert.strictEqual(isOneByteString(expected), true); - const fd = fs.openSync(fn, 'w'); - fs.writeSync(fd, expected, 0, 'utf8'); - fs.closeSync(fd); - assert.strictEqual(fs.readFileSync(fn, 'utf8'), expected); -} - -{ - const expected = 'Zhōngwén 1'; // Must be a unique string. - externalizeString(expected); - assert.strictEqual(isOneByteString(expected), false); - const fd = fs.openSync(fn, 'w'); - fs.writeSync(fd, expected, 0, 'ucs2'); - fs.closeSync(fd); - assert.strictEqual(fs.readFileSync(fn, 'ucs2'), expected); -} - -{ - const expected = 'Zhōngwén 2'; // Must be a unique string. - externalizeString(expected); - assert.strictEqual(isOneByteString(expected), false); - const fd = fs.openSync(fn, 'w'); - fs.writeSync(fd, expected, 0, 'utf8'); - fs.closeSync(fd); - assert.strictEqual(fs.readFileSync(fn, 'utf8'), expected); -} - -fs.open(fn, 'w', 0o644, common.mustSucceed((fd) => { - const done = common.mustSucceed((written) => { - assert.strictEqual(written, Buffer.byteLength(expected)); - fs.closeSync(fd); - const found = fs.readFileSync(fn, 'utf8'); - fs.unlinkSync(fn); - assert.strictEqual(found, expected); - }); - - const written = common.mustSucceed((written) => { - assert.strictEqual(written, 0); - fs.write(fd, expected, 0, 'utf8', done); - }); - - fs.write(fd, '', 0, 'utf8', written); -})); - -// TODO(kt3k): Enable this test when fs.open supports number for `flags` -// paramter. -/* -const args = constants.O_CREAT | constants.O_WRONLY | constants.O_TRUNC; -fs.open(fn2, args, 0o644, common.mustSucceed((fd) => { - const done = common.mustSucceed((written) => { - assert.strictEqual(written, Buffer.byteLength(expected)); - fs.closeSync(fd); - const found = fs.readFileSync(fn2, 'utf8'); - fs.unlinkSync(fn2); - assert.strictEqual(found, expected); - }); - - const written = common.mustSucceed((written) => { - assert.strictEqual(written, 0); - fs.write(fd, expected, 0, 'utf8', done); - }); - - fs.write(fd, '', 0, 'utf8', written); -})); -*/ - -fs.open(fn3, 'w', 0o644, common.mustSucceed((fd) => { - const done = common.mustSucceed((written) => { - assert.strictEqual(written, Buffer.byteLength(expected)); - fs.closeSync(fd); - }); - - fs.write(fd, expected, done); -})); - -fs.open(fn4, 'w', 0o644, common.mustSucceed((fd) => { - const done = common.mustSucceed((written) => { - assert.strictEqual(written, Buffer.byteLength(expected)); - fs.closeSync(fd); - }); - - const data = { - toString() { return expected; } - }; - fs.write(fd, data, done); -})); - -[false, 'test', {}, [], null, undefined].forEach((i) => { - assert.throws( - () => fs.write(i, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - assert.throws( - () => fs.writeSync(i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -}); - -[false, 5, {}, [], null, undefined].forEach((data) => { - assert.throws( - () => fs.write(1, data, common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_TYPE', - message: /"buffer"/ - } - ); - assert.throws( - () => fs.writeSync(1, data), - { - code: 'ERR_INVALID_ARG_TYPE', - message: /"buffer"/ - } - ); -}); - -{ - // Regression test for https://github.com/nodejs/node/issues/38168 - const fd = fs.openSync(fn5, 'w'); - - assert.throws( - () => fs.writeSync(fd, 'abc', 0, 'hex'), - { - code: 'ERR_INVALID_ARG_VALUE', - message: /'encoding' is invalid for data of length 3/ - } - ); - - assert.throws( - () => fs.writeSync(fd, 'abc', 0, 'hex', common.mustNotCall()), - { - code: 'ERR_INVALID_ARG_VALUE', - message: /'encoding' is invalid for data of length 3/ - } - ); - - assert.strictEqual(fs.writeSync(fd, 'abcd', 0, 'hex'), 2); - - fs.write(fd, 'abcd', 0, 'hex', common.mustSucceed((written) => { - assert.strictEqual(written, 2); - fs.closeSync(fd); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-fs-writev-sync.js b/cli/tests/node_compat/test/parallel/test-fs-writev-sync.js deleted file mode 100644 index 53fa48af1..000000000 --- a/cli/tests/node_compat/test/parallel/test-fs-writev-sync.js +++ /dev/null @@ -1,104 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); -const tmpdir = require('../common/tmpdir'); - -tmpdir.refresh(); - -const expected = 'ümlaut. Лорем 運務ホソモ指及 आपको करने विकास 紙読決多密所 أضف'; - -const getFileName = (i) => path.join(tmpdir.path, `writev_sync_${i}.txt`); - -/** - * Testing with a array of buffers input - */ - -// fs.writevSync with array of buffers with all parameters -{ - const filename = getFileName(1); - const fd = fs.openSync(filename, 'w'); - - const buffer = Buffer.from(expected); - const bufferArr = [buffer, buffer]; - const expectedLength = bufferArr.length * buffer.byteLength; - - let written = fs.writevSync(fd, [Buffer.from('')], null); - assert.strictEqual(written, 0); - - written = fs.writevSync(fd, bufferArr, null); - assert.strictEqual(written, expectedLength); - - fs.closeSync(fd); - - assert(Buffer.concat(bufferArr).equals(fs.readFileSync(filename))); -} - -// fs.writevSync with array of buffers without position -{ - const filename = getFileName(2); - const fd = fs.openSync(filename, 'w'); - - const buffer = Buffer.from(expected); - const bufferArr = [buffer, buffer, buffer]; - const expectedLength = bufferArr.length * buffer.byteLength; - - let written = fs.writevSync(fd, [Buffer.from('')]); - assert.strictEqual(written, 0); - - written = fs.writevSync(fd, bufferArr); - assert.strictEqual(written, expectedLength); - - fs.closeSync(fd); - - assert(Buffer.concat(bufferArr).equals(fs.readFileSync(filename))); -} - -// fs.writevSync with empty array of buffers -{ - const filename = getFileName(3); - const fd = fs.openSync(filename, 'w'); - const written = fs.writevSync(fd, []); - assert.strictEqual(written, 0); - fs.closeSync(fd); - -} - -/** - * Testing with wrong input types - */ -{ - const filename = getFileName(4); - const fd = fs.openSync(filename, 'w'); - - [false, 'test', {}, [{}], ['sdf'], null, undefined].forEach((i) => { - assert.throws( - () => fs.writevSync(fd, i, null), { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); - }); - - fs.closeSync(fd); -} - -// fs.writevSync with wrong fd types -[false, 'test', {}, [{}], null, undefined].forEach((i) => { - assert.throws( - () => fs.writevSync(i), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - } - ); -}); diff --git a/cli/tests/node_compat/test/parallel/test-handle-wrap-close-abort.js b/cli/tests/node_compat/test/parallel/test-handle-wrap-close-abort.js deleted file mode 100644 index d143dd439..000000000 --- a/cli/tests/node_compat/test/parallel/test-handle-wrap-close-abort.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -process.on('uncaughtException', common.mustCall(2)); - -setTimeout(function() { - process.nextTick(function() { - const c = setInterval(function() { - clearInterval(c); - throw new Error('setInterval'); - }, 1); - }); - setTimeout(function() { - throw new Error('setTimeout'); - }, 1); -}, 1); diff --git a/cli/tests/node_compat/test/parallel/test-http-agent-getname.js b/cli/tests/node_compat/test/parallel/test-http-agent-getname.js deleted file mode 100644 index 3404252a8..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-agent-getname.js +++ /dev/null @@ -1,63 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const http = require('http'); -const path = require('path'); - -const tmpdir = require('../common/tmpdir'); - -const agent = new http.Agent(); - -// Default to localhost -assert.strictEqual( - agent.getName({ - port: 80, - localAddress: '192.168.1.1' - }), - 'localhost:80:192.168.1.1' -); - -// empty argument -assert.strictEqual( - agent.getName(), - 'localhost::' -); - -// empty options -assert.strictEqual( - agent.getName({}), - 'localhost::' -); - -// pass all arguments -assert.strictEqual( - agent.getName({ - host: '0.0.0.0', - port: 80, - localAddress: '192.168.1.1' - }), - '0.0.0.0:80:192.168.1.1' -); - -// unix socket -const socketPath = path.join(tmpdir.path, 'foo', 'bar'); -assert.strictEqual( - agent.getName({ - socketPath - }), - `localhost:::${socketPath}` -); - -for (const family of [0, null, undefined, 'bogus']) - assert.strictEqual(agent.getName({ family }), 'localhost::'); - -for (const family of [4, 6]) - assert.strictEqual(agent.getName({ family }), `localhost:::${family}`); diff --git a/cli/tests/node_compat/test/parallel/test-http-client-get-url.js b/cli/tests/node_compat/test/parallel/test-http-client-get-url.js deleted file mode 100644 index a38d3ff7b..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-client-get-url.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 http = require('http'); -const url = require('url'); -const testPath = '/foo?bar'; - -const server = http.createServer(common.mustCall((req, res) => { - assert.strictEqual(req.method, 'GET'); - assert.strictEqual(req.url, testPath); - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.write('hello\n'); - res.end(); -}, 3)); - -server.listen(0, common.localhostIPv4, common.mustCall(() => { - const u = `http://${common.localhostIPv4}:${server.address().port}${testPath}`; - http.get(u, common.mustCall(() => { - http.get(url.parse(u), common.mustCall(() => { - http.get(new URL(u), common.mustCall(() => { - server.close(); - })); - })); - })); -})); diff --git a/cli/tests/node_compat/test/parallel/test-http-client-read-in-error.js b/cli/tests/node_compat/test/parallel/test-http-client-read-in-error.js deleted file mode 100644 index 3c86ad8f5..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-client-read-in-error.js +++ /dev/null @@ -1,48 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const net = require('net'); -const http = require('http'); - -class Agent extends http.Agent { - createConnection() { - const socket = new net.Socket(); - - socket.on('error', function() { - socket.push('HTTP/1.1 200\r\n\r\n'); - }); - - let onNewListener; - socket.on('newListener', onNewListener = (name) => { - if (name !== 'error') - return; - socket.removeListener('newListener', onNewListener); - - // Let other listeners to be set up too - process.nextTick(() => { - this.breakSocket(socket); - }); - }); - - return socket; - } - - breakSocket(socket) { - socket.emit('error', new Error('Intentional error')); - } -} - -const agent = new Agent(); - -http.request({ - agent -}).once('error', function() { - console.log('ignore'); - this.on('data', common.mustNotCall()); -}); diff --git a/cli/tests/node_compat/test/parallel/test-http-localaddress.js b/cli/tests/node_compat/test/parallel/test-http-localaddress.js deleted file mode 100644 index ab3eff808..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-localaddress.js +++ /dev/null @@ -1,64 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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. - -// Flags: --expose-internals -'use strict'; -const common = require('../common'); -if (!common.hasMultiLocalhost()) - common.skip('platform-specific test.'); - -const http = require('http'); -const assert = require('assert'); - -const server = http.createServer((req, res) => { - console.log(`Connect from: ${req.connection.remoteAddress}`); - assert.strictEqual(req.connection.remoteAddress, '127.0.0.2'); - - req.on('end', () => { - res.writeHead(200, { 'Content-Type': 'text/plain' }); - res.end(`You are from: ${req.connection.remoteAddress}`); - }); - req.resume(); -}); - -server.listen(0, '127.0.0.1', () => { - const options = { host: 'localhost', - port: server.address().port, - family: 4, - path: '/', - method: 'GET', - localAddress: '127.0.0.2' }; - - const req = http.request(options, function(res) { - res.on('end', () => { - server.close(); - }); - res.resume(); - }); - req.end(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js b/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js deleted file mode 100644 index e9b324892..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-getter.js +++ /dev/null @@ -1,30 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const { OutgoingMessage } = require('http'); -const assert = require('assert'); - -const warn = 'OutgoingMessage.prototype._headerNames is deprecated'; -common.expectWarning('DeprecationWarning', warn, 'DEP0066'); - -{ - // Tests for _headerNames get method - const outgoingMessage = new OutgoingMessage(); - outgoingMessage._headerNames; // eslint-disable-line no-unused-expressions -} - -{ - // Tests _headerNames getter result after setting a header. - const outgoingMessage = new OutgoingMessage(); - outgoingMessage.setHeader('key', 'value'); - const expect = Object.create(null); - expect.key = 'key'; - assert.deepStrictEqual(outgoingMessage._headerNames, expect); -} diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js b/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js deleted file mode 100644 index 9531e5611..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headernames-setter.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const { OutgoingMessage } = require('http'); - -const warn = 'OutgoingMessage.prototype._headerNames is deprecated'; -common.expectWarning('DeprecationWarning', warn, 'DEP0066'); - -{ - // Tests for _headerNames set method - const outgoingMessage = new OutgoingMessage(); - outgoingMessage._headerNames = { - 'x-flow-id': '61bba6c5-28a3-4eab-9241-2ecaa6b6a1fd' - }; -} diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js b/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js deleted file mode 100644 index 0e4783a6d..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-outgoing-internal-headers.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const { kOutHeaders } = require('internal/http'); -const { OutgoingMessage } = require('http'); - -const warn = 'OutgoingMessage.prototype._headers is deprecated'; -common.expectWarning('DeprecationWarning', warn, 'DEP0066'); - -{ - // Tests for _headers get method - const outgoingMessage = new OutgoingMessage(); - outgoingMessage.getHeaders = common.mustCall(); - outgoingMessage._headers; // eslint-disable-line no-unused-expressions -} - -{ - // Tests for _headers set method - const outgoingMessage = new OutgoingMessage(); - outgoingMessage._headers = { - host: 'risingstack.com', - Origin: 'localhost' - }; - - assert.deepStrictEqual( - Object.entries(outgoingMessage[kOutHeaders]), - Object.entries({ - host: ['host', 'risingstack.com'], - origin: ['Origin', 'localhost'] - })); -} - -{ - // Tests for _headers set method `null` - const outgoingMessage = new OutgoingMessage(); - outgoingMessage._headers = null; - - assert.strictEqual( - outgoingMessage[kOutHeaders], - null - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js b/cli/tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js deleted file mode 100644 index 194a9345a..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-outgoing-renderHeaders.js +++ /dev/null @@ -1,57 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// Flags: --expose-internals - -require('../common'); -const assert = require('assert'); - -const kOutHeaders = require('internal/http').kOutHeaders; -const http = require('http'); -const OutgoingMessage = http.OutgoingMessage; - -{ - const outgoingMessage = new OutgoingMessage(); - outgoingMessage._header = {}; - assert.throws( - () => outgoingMessage._renderHeaders(), - { - code: 'ERR_HTTP_HEADERS_SENT', - name: 'Error', - message: 'Cannot render headers after they are sent to the client' - } - ); -} - -{ - const outgoingMessage = new OutgoingMessage(); - outgoingMessage[kOutHeaders] = null; - const result = outgoingMessage._renderHeaders(); - assert.deepStrictEqual(result, {}); -} - - -{ - const outgoingMessage = new OutgoingMessage(); - outgoingMessage[kOutHeaders] = {}; - const result = outgoingMessage._renderHeaders(); - assert.deepStrictEqual(result, {}); -} - -{ - const outgoingMessage = new OutgoingMessage(); - outgoingMessage[kOutHeaders] = { - host: ['host', 'nodejs.org'], - origin: ['Origin', 'localhost'] - }; - const result = outgoingMessage._renderHeaders(); - assert.deepStrictEqual(result, { - host: 'nodejs.org', - Origin: 'localhost' - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-http-outgoing-settimeout.js b/cli/tests/node_compat/test/parallel/test-http-outgoing-settimeout.js deleted file mode 100644 index 592e576b4..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-outgoing-settimeout.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const { OutgoingMessage } = require('http'); - -{ - // Tests for settimeout method with socket - const expectedMsecs = 42; - const outgoingMessage = new OutgoingMessage(); - outgoingMessage.socket = { - setTimeout: common.mustCall((msecs) => { - assert.strictEqual(msecs, expectedMsecs); - }) - }; - outgoingMessage.setTimeout(expectedMsecs); -} - -{ - // Tests for settimeout method without socket - const expectedMsecs = 23; - const outgoingMessage = new OutgoingMessage(); - outgoingMessage.setTimeout(expectedMsecs); - - outgoingMessage.emit('socket', { - setTimeout: common.mustCall((msecs) => { - assert.strictEqual(msecs, expectedMsecs); - }) - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js b/cli/tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js deleted file mode 100644 index 24cc2f33d..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-url.parse-auth-with-header-in-request.js +++ /dev/null @@ -1,59 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const http = require('http'); -const url = require('url'); - -function check(request) { - // The correct authorization header is be passed - assert.strictEqual(request.headers.authorization, 'NoAuthForYOU'); -} - -const server = http.createServer(function(request, response) { - // Run the check function - check(request); - response.writeHead(200, {}); - response.end('ok'); - server.close(); -}); - -server.listen(0, function() { - const testURL = - url.parse(`http://asdf:qwer@localhost:${this.address().port}`); - // The test here is if you set a specific authorization header in the - // request we should not override that with basic auth - testURL.headers = { - Authorization: 'NoAuthForYOU' - }; - - // make the request - http.request(testURL).end(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-auth.js b/cli/tests/node_compat/test/parallel/test-http-url.parse-auth.js deleted file mode 100644 index c9b691aa2..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-url.parse-auth.js +++ /dev/null @@ -1,55 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const http = require('http'); -const url = require('url'); - -function check(request) { - // The correct authorization header is be passed - assert.strictEqual(request.headers.authorization, 'Basic dXNlcjpwYXNzOg=='); -} - -const server = http.createServer(function(request, response) { - // Run the check function - check(request); - response.writeHead(200, {}); - response.end('ok'); - server.close(); -}); - -server.listen(0, function() { - const port = this.address().port; - // username = "user", password = "pass:" - const testURL = url.parse(`http://user:pass%3A@localhost:${port}`); - - // make the request - http.request(testURL).end(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-basic.js b/cli/tests/node_compat/test/parallel/test-http-url.parse-basic.js deleted file mode 100644 index e41bf41a1..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-url.parse-basic.js +++ /dev/null @@ -1,65 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const http = require('http'); -const url = require('url'); - -let testURL; - -// Make sure the basics work -function check(request) { - // Default method should still be 'GET' - assert.strictEqual(request.method, 'GET'); - // There are no URL params, so you should not see any - assert.strictEqual(request.url, '/'); - // The host header should use the url.parse.hostname - assert.strictEqual(request.headers.host, - `${testURL.hostname}:${testURL.port}`); -} - -const server = http.createServer(function(request, response) { - // Run the check function - check(request); - response.writeHead(200, {}); - response.end('ok'); - server.close(); -}); - -server.listen(0, function() { - testURL = url.parse(`http://localhost:${this.address().port}`); - - // make the request - const clientRequest = http.request(testURL); - // Since there is a little magic with the agent - // make sure that an http request uses the http.Agent - assert.ok(clientRequest.agent instanceof http.Agent); - clientRequest.end(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-https.request.js b/cli/tests/node_compat/test/parallel/test-http-url.parse-https.request.js deleted file mode 100644 index 89c7ca2b4..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-url.parse-https.request.js +++ /dev/null @@ -1,69 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); -if (!common.hasCrypto) - common.skip('missing crypto'); -const { readKey } = require('../common/fixtures'); - -const assert = require('assert'); -const https = require('https'); -const url = require('url'); - -// https options -const httpsOptions = { - key: readKey('agent1-key.pem'), - cert: readKey('agent1-cert.pem') -}; - -function check(request) { - // Assert that I'm https - assert.ok(request.socket._secureEstablished); -} - -const server = https.createServer(httpsOptions, function(request, response) { - // Run the check function - check(request); - response.writeHead(200, {}); - response.end('ok'); - server.close(); -}); - -// TODO(wafuwafu13): rejectUnauthorized is always true in Deno -// server.listen(0, function() { -// const testURL = url.parse(`https://localhost:${this.address().port}`); -// testURL.rejectUnauthorized = false; - -// // make the request -// const clientRequest = https.request(testURL); -// // Since there is a little magic with the agent -// // make sure that the request uses the https.Agent -// assert.ok(clientRequest.agent instanceof https.Agent); -// clientRequest.end(); -// }); diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js b/cli/tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js deleted file mode 100644 index 4f50f8a54..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-url.parse-only-support-http-https-protocol.js +++ /dev/null @@ -1,52 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const http = require('http'); -const url = require('url'); - -const invalidUrls = [ - 'file:///whatever', - 'mailto:asdf@asdf.com', - 'ftp://www.example.com', - 'javascript:alert(\'hello\');', - 'xmpp:foo@bar.com', - 'f://some.host/path', -]; - -invalidUrls.forEach((invalid) => { - assert.throws( - () => { http.request(url.parse(invalid)); }, - { - code: 'ERR_INVALID_PROTOCOL', - name: 'TypeError' - } - ); -}); diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-path.js b/cli/tests/node_compat/test/parallel/test-http-url.parse-path.js deleted file mode 100644 index 7077fcae1..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-url.parse-path.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const http = require('http'); -const url = require('url'); - -function check(request) { - // A path should come over - assert.strictEqual(request.url, '/asdf'); -} - -const server = http.createServer(function(request, response) { - // Run the check function - check(request); - response.writeHead(200, {}); - response.end('ok'); - server.close(); -}); - -server.listen(0, function() { - const testURL = url.parse(`http://localhost:${this.address().port}/asdf`); - - // make the request - http.request(testURL).end(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-post.js b/cli/tests/node_compat/test/parallel/test-http-url.parse-post.js deleted file mode 100644 index da316d2db..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-url.parse-post.js +++ /dev/null @@ -1,61 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const http = require('http'); -const url = require('url'); - -let testURL; - -function check(request) { - // url.parse should not mess with the method - assert.strictEqual(request.method, 'POST'); - // Everything else should be right - assert.strictEqual(request.url, '/asdf?qwer=zxcv'); - // The host header should use the url.parse.hostname - assert.strictEqual(request.headers.host, - `${testURL.hostname}:${testURL.port}`); -} - -const server = http.createServer(function(request, response) { - // Run the check function - check(request); - response.writeHead(200, {}); - response.end('ok'); - server.close(); -}); - -server.listen(0, function() { - testURL = url.parse(`http://localhost:${this.address().port}/asdf?qwer=zxcv`); - testURL.method = 'POST'; - - // make the request - http.request(testURL).end(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-http-url.parse-search.js b/cli/tests/node_compat/test/parallel/test-http-url.parse-search.js deleted file mode 100644 index 52651869d..000000000 --- a/cli/tests/node_compat/test/parallel/test-http-url.parse-search.js +++ /dev/null @@ -1,54 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const http = require('http'); -const url = require('url'); - -function check(request) { - // A path should come over with params - assert.strictEqual(request.url, '/asdf?qwer=zxcv'); -} - -const server = http.createServer(function(request, response) { - // Run the check function - check(request); - response.writeHead(200, {}); - response.end('ok'); - server.close(); -}); - -server.listen(0, function() { - const port = this.address().port; - const testURL = url.parse(`http://localhost:${port}/asdf?qwer=zxcv`); - - // make the request - http.request(testURL).end(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-net-access-byteswritten.js b/cli/tests/node_compat/test/parallel/test-net-access-byteswritten.js deleted file mode 100644 index a20a1a7a7..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-access-byteswritten.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); -const net = require('net'); -const tls = require('tls'); -const tty = require('tty'); - -// Check that the bytesWritten getter doesn't crash if object isn't -// constructed. -assert.strictEqual(net.Socket.prototype.bytesWritten, undefined); -assert.strictEqual(Object.getPrototypeOf(tls.TLSSocket).prototype.bytesWritten, - undefined); -assert.strictEqual(tls.TLSSocket.prototype.bytesWritten, undefined); -assert.strictEqual(Object.getPrototypeOf(tty.ReadStream).prototype.bytesWritten, - undefined); -assert.strictEqual(tty.ReadStream.prototype.bytesWritten, undefined); -assert.strictEqual(tty.WriteStream.prototype.bytesWritten, undefined); diff --git a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js b/cli/tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js deleted file mode 100644 index edafbcdc4..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-listen-path.js +++ /dev/null @@ -1,17 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); -const fp = '/blah/fadfa'; -const server = net.createServer(common.mustNotCall()); -server.listen(fp, common.mustNotCall()); -server.on('error', common.mustCall(function(e) { - assert.strictEqual(e.address, fp); -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-path.js b/cli/tests/node_compat/test/parallel/test-net-better-error-messages-path.js deleted file mode 100644 index d1bada362..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-path.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -{ - const fp = '/tmp/fadagagsdfgsdf'; - const c = net.connect(fp); - - c.on('connect', common.mustNotCall()); - c.on('error', common.expectsError({ - code: 'ENOENT', - message: `connect ENOENT ${fp}` - })); -} - -{ - assert.throws( - () => net.createConnection({ path: {} }), - { code: 'ERR_INVALID_ARG_TYPE' } - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js b/cli/tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js deleted file mode 100644 index 6db63fef3..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-better-error-messages-port-hostname.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// This tests that the error thrown from net.createConnection -// comes with host and port properties. -// See https://github.com/nodejs/node-v0.x-archive/issues/7005 - -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -const { addresses } = require('../common/internet'); -const { - errorLookupMock, - mockedErrorCode -} = require('../common/dns'); - -// Using port 0 as hostname used is already invalid. -const c = net.createConnection({ - port: 0, - host: addresses.INVALID_HOST, - lookup: common.mustCall(errorLookupMock()) -}); - -c.on('connect', common.mustNotCall()); - -c.on('error', common.mustCall((error) => { - assert.ok(!('port' in error)); - assert.ok(!('host' in error)); - assert.throws(() => { throw error; }, { - errno: mockedErrorCode, - code: mockedErrorCode, - name: 'Error', - message: 'getaddrinfo ENOTFOUND something.invalid', - hostname: addresses.INVALID_HOST, - syscall: 'getaddrinfo' - }); -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-after-destroy.js b/cli/tests/node_compat/test/parallel/test-net-connect-after-destroy.js deleted file mode 100644 index e08d7c036..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-connect-after-destroy.js +++ /dev/null @@ -1,16 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// Regression test for https://github.com/nodejs/node-v0.x-archive/issues/819. - -require('../common'); -const net = require('net'); - -// Connect to something that we need to DNS resolve -const c = net.createConnection(80, 'google.com'); -c.destroy(); diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-buffer.js b/cli/tests/node_compat/test/parallel/test-net-connect-buffer.js deleted file mode 100644 index 04e71247e..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-connect-buffer.js +++ /dev/null @@ -1,86 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 net = require('net'); - -// TODO: support not using "new" -const tcp = new net.Server(common.mustCall((s) => { - tcp.close(); - - let buf = ''; - s.setEncoding('utf8'); - s.on('data', function(d) { - buf += d; - }); - - s.on('end', common.mustCall(function() { - console.error('SERVER: end', buf); - assert.strictEqual(buf, "L'État, c'est moi"); - s.end(); - })); -})); - -tcp.listen(0, common.mustCall(function() { - // TODO: support not using "new" - const socket = new net.Stream({ highWaterMark: 0 }); - - let connected = false; - assert.strictEqual(socket.pending, true); - socket.connect(this.address().port, common.mustCall(() => connected = true)); - - assert.strictEqual(socket.pending, true); - assert.strictEqual(socket.connecting, true); - assert.strictEqual(socket.readyState, 'opening'); - - // Write a string that contains a multi-byte character sequence to test that - // `bytesWritten` is incremented with the # of bytes, not # of characters. - const a = "L'État, c'est "; - const b = 'moi'; - - // We're still connecting at this point so the datagram is first pushed onto - // the connect queue. Make sure that it's not added to `bytesWritten` again - // when the actual write happens. - const r = socket.write(a, common.mustCall((er) => { - console.error('write cb'); - assert.ok(connected); - assert.strictEqual(socket.bytesWritten, Buffer.from(a + b).length); - assert.strictEqual(socket.pending, false); - })); - socket.on('close', common.mustCall(() => { - assert.strictEqual(socket.pending, true); - })); - - assert.strictEqual(socket.bytesWritten, Buffer.from(a).length); - assert.strictEqual(r, false); - socket.end(b); - - assert.strictEqual(socket.readyState, 'opening'); -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-buffer2.js b/cli/tests/node_compat/test/parallel/test-net-connect-buffer2.js deleted file mode 100644 index 499f3849f..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-connect-buffer2.js +++ /dev/null @@ -1,63 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -const tcp = new net.Server(common.mustCall((s) => { - tcp.close(); - - let buf = ''; - s.setEncoding('utf8'); - s.on('data', function(d) { - buf += d; - }); - - s.on('end', common.mustCall(function() { - console.error('SERVER: end', buf); - assert.strictEqual(buf, "L'État, c'est moi"); - s.end(); - })); -})); - -tcp.listen(0, common.mustCall(function() { - const socket = new net.Stream({ highWaterMark: 0 }); - - let connected = false; - assert.strictEqual(socket.pending, true); - socket.connect(this.address().port, common.mustCall(() => connected = true)); - - assert.strictEqual(socket.pending, true); - assert.strictEqual(socket.connecting, true); - assert.strictEqual(socket.readyState, 'opening'); - - // Write a string that contains a multi-byte character sequence to test that - // `bytesWritten` is incremented with the # of bytes, not # of characters. - const a = "L'État, c'est "; - const b = 'moi'; - - // We're still connecting at this point so the datagram is first pushed onto - // the connect queue. Make sure that it's not added to `bytesWritten` again - // when the actual write happens. - const r = socket.write(a, common.mustCall((er) => { - console.error('write cb'); - assert.ok(connected); - assert.strictEqual(socket.bytesWritten, Buffer.from(a + b).length); - assert.strictEqual(socket.pending, false); - })); - socket.on('close', common.mustCall(() => { - assert.strictEqual(socket.pending, true); - })); - - assert.strictEqual(socket.bytesWritten, Buffer.from(a).length); - assert.strictEqual(r, false); - socket.end(b); - - assert.strictEqual(socket.readyState, 'opening'); -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-destroy.js b/cli/tests/node_compat/test/parallel/test-net-connect-destroy.js deleted file mode 100644 index 2dcea39b2..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-connect-destroy.js +++ /dev/null @@ -1,14 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const net = require('net'); - -const socket = new net.Socket(); -socket.on('close', common.mustCall()); -socket.destroy(); diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js b/cli/tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js deleted file mode 100644 index 08d65f75e..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-connect-immediate-destroy.js +++ /dev/null @@ -1,18 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const net = require('net'); - -const server = net.createServer(); -server.listen(0); -const port = server.address().port; -const socket = net.connect(port, common.localhostIPv4, common.mustNotCall()); -socket.on('error', common.mustNotCall()); -server.close(); -socket.destroy(); diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-immediate-finish.js b/cli/tests/node_compat/test/parallel/test-net-connect-immediate-finish.js deleted file mode 100644 index 4df92e9c1..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-connect-immediate-finish.js +++ /dev/null @@ -1,66 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -// This tests that if the socket is still in the 'connecting' state -// when the user calls socket.end() ('finish'), the socket would emit -// 'connect' and defer the handling until the 'connect' event is handled. - -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -const { addresses } = require('../common/internet'); -const { - errorLookupMock, - mockedErrorCode, - mockedSysCall -} = require('../common/dns'); - -const client = net.connect({ - host: addresses.INVALID_HOST, - port: 80, // Port number doesn't matter because host name is invalid - lookup: common.mustCall(errorLookupMock()) -}, common.mustNotCall()); - -client.once('error', common.mustCall((error) => { - // TODO(BridgeAR): Add a better way to handle not defined properties using - // `assert.throws(fn, object)`. - assert.ok(!('port' in error)); - assert.ok(!('host' in error)); - assert.throws(() => { throw error; }, { - code: mockedErrorCode, - errno: mockedErrorCode, - syscall: mockedSysCall, - hostname: addresses.INVALID_HOST, - message: 'getaddrinfo ENOTFOUND something.invalid' - }); -})); - -client.end(); diff --git a/cli/tests/node_compat/test/parallel/test-net-connect-no-arg.js b/cli/tests/node_compat/test/parallel/test-net-connect-no-arg.js deleted file mode 100644 index 3e3e3eec4..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-connect-no-arg.js +++ /dev/null @@ -1,42 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const net = require('net'); - -// Tests that net.connect() called without arguments throws ERR_MISSING_ARGS. - -assert.throws(() => { - net.connect(); -}, { - code: 'ERR_MISSING_ARGS', - message: 'The "options" or "port" or "path" argument must be specified', -}); - -assert.throws(() => { - new net.Socket().connect(); -}, { - code: 'ERR_MISSING_ARGS', - message: 'The "options" or "port" or "path" argument must be specified', -}); - -assert.throws(() => { - net.connect({}); -}, { - code: 'ERR_MISSING_ARGS', - message: 'The "options" or "port" or "path" argument must be specified', -}); - -assert.throws(() => { - new net.Socket().connect({}); -}, { - code: 'ERR_MISSING_ARGS', - message: 'The "options" or "port" or "path" argument must be specified', -}); diff --git a/cli/tests/node_compat/test/parallel/test-net-dns-error.js b/cli/tests/node_compat/test/parallel/test-net-dns-error.js deleted file mode 100644 index ce326dd6f..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-dns-error.js +++ /dev/null @@ -1,48 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 net = require('net'); - -const host = '*'.repeat(64); -// Resolving hostname > 63 characters may return EAI_FAIL (permanent failure). -const errCodes = ['ENOTFOUND', 'EAI_FAIL']; - -const socket = net.connect(42, host, common.mustNotCall()); -socket.on('error', common.mustCall(function(err) { - assert(errCodes.includes(err.code), err); -})); -socket.on('lookup', common.mustCall(function(err, ip, type) { - assert(err instanceof Error); - assert(errCodes.includes(err.code), err); - assert.strictEqual(ip, undefined); - assert.strictEqual(type, undefined); -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-during-close.js b/cli/tests/node_compat/test/parallel/test-net-during-close.js deleted file mode 100644 index f13c9fb18..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-during-close.js +++ /dev/null @@ -1,49 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 net = require('net'); - -const server = net.createServer(function(socket) { - socket.end(); -}); - -server.listen(0, common.mustCall(function() { - /* eslint-disable no-unused-expressions */ - const client = net.createConnection(this.address().port); - server.close(); - // Server connection event has not yet fired client is still attempting to - // connect. Accessing properties should not throw in this case. - client.remoteAddress; - client.remoteFamily; - client.remotePort; - // Exit now, do not wait for the client error event. - process.exit(0); - /* eslint-enable no-unused-expressions */ -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-end-close.js b/cli/tests/node_compat/test/parallel/test-net-end-close.js deleted file mode 100644 index a818dd097..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-end-close.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --expose-internals -'use strict'; -require('../common'); -const assert = require('assert'); -const net = require('net'); - -// const { internalBinding } = require('internal/test/binding'); -// const { UV_EOF } = internalBinding('uv'); -// const { streamBaseState, kReadBytesOrError } = internalBinding('stream_wrap'); - -const s = new net.Socket({ - handle: { - readStart: function() { - setImmediate(() => { - // streamBaseState[kReadBytesOrError] = UV_EOF; - // internal onread has different shape to Node. - this.onread(new Uint8Array(), -4095); - }); - }, - close: (cb) => setImmediate(cb) - }, - writable: false -}); -assert.strictEqual(s, s.resume()); - -const events = []; - -s.on('end', () => { - events.push('end'); -}); -s.on('close', () => { - events.push('close'); -}); - -process.on('exit', () => { - assert.deepStrictEqual(events, [ 'end', 'close' ]); -}); diff --git a/cli/tests/node_compat/test/parallel/test-net-end-without-connect.js b/cli/tests/node_compat/test/parallel/test-net-end-without-connect.js deleted file mode 100644 index f14d81770..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-end-without-connect.js +++ /dev/null @@ -1,34 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const net = require('net'); - -const sock = new net.Socket(); -sock.end(); // Should not throw. diff --git a/cli/tests/node_compat/test/parallel/test-net-isip.js b/cli/tests/node_compat/test/parallel/test-net-isip.js deleted file mode 100644 index 016277483..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-isip.js +++ /dev/null @@ -1,103 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const net = require('net'); - -assert.strictEqual(net.isIP('127.0.0.1'), 4); -assert.strictEqual(net.isIP('x127.0.0.1'), 0); -assert.strictEqual(net.isIP('example.com'), 0); -assert.strictEqual(net.isIP('0000:0000:0000:0000:0000:0000:0000:0000'), 6); -assert.strictEqual(net.isIP('0000:0000:0000:0000:0000:0000:0000:0000::0000'), - 0); -assert.strictEqual(net.isIP('1050:0:0:0:5:600:300c:326b'), 6); -assert.strictEqual(net.isIP('2001:252:0:1::2008:6'), 6); -assert.strictEqual(net.isIP('2001:dead:beef:1::2008:6'), 6); -assert.strictEqual(net.isIP('2001::'), 6); -assert.strictEqual(net.isIP('2001:dead::'), 6); -assert.strictEqual(net.isIP('2001:dead:beef::'), 6); -assert.strictEqual(net.isIP('2001:dead:beef:1::'), 6); -assert.strictEqual(net.isIP('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'), 6); -assert.strictEqual(net.isIP(':2001:252:0:1::2008:6:'), 0); -assert.strictEqual(net.isIP(':2001:252:0:1::2008:6'), 0); -assert.strictEqual(net.isIP('2001:252:0:1::2008:6:'), 0); -assert.strictEqual(net.isIP('2001:252::1::2008:6'), 0); -assert.strictEqual(net.isIP('::2001:252:1:2008:6'), 6); -assert.strictEqual(net.isIP('::2001:252:1:1.1.1.1'), 6); -assert.strictEqual(net.isIP('::2001:252:1:255.255.255.255'), 6); -assert.strictEqual(net.isIP('::2001:252:1:255.255.255.255.76'), 0); -assert.strictEqual(net.isIP('fe80::2008%eth0'), 6); -assert.strictEqual(net.isIP('fe80::2008%eth0.0'), 6); -assert.strictEqual(net.isIP('fe80::2008%eth0@1'), 0); -assert.strictEqual(net.isIP('::anything'), 0); -assert.strictEqual(net.isIP('::1'), 6); -assert.strictEqual(net.isIP('::'), 6); -assert.strictEqual(net.isIP('0000:0000:0000:0000:0000:0000:12345:0000'), 0); -assert.strictEqual(net.isIP('0'), 0); -assert.strictEqual(net.isIP(), 0); -assert.strictEqual(net.isIP(''), 0); -assert.strictEqual(net.isIP(null), 0); -assert.strictEqual(net.isIP(123), 0); -assert.strictEqual(net.isIP(true), 0); -assert.strictEqual(net.isIP({}), 0); -assert.strictEqual(net.isIP({ toString: () => '::2001:252:1:255.255.255.255' }), - 6); -assert.strictEqual(net.isIP({ toString: () => '127.0.0.1' }), 4); -assert.strictEqual(net.isIP({ toString: () => 'bla' }), 0); - -assert.strictEqual(net.isIPv4('127.0.0.1'), true); -assert.strictEqual(net.isIPv4('example.com'), false); -assert.strictEqual(net.isIPv4('2001:252:0:1::2008:6'), false); -assert.strictEqual(net.isIPv4(), false); -assert.strictEqual(net.isIPv4(''), false); -assert.strictEqual(net.isIPv4(null), false); -assert.strictEqual(net.isIPv4(123), false); -assert.strictEqual(net.isIPv4(true), false); -assert.strictEqual(net.isIPv4({}), false); -assert.strictEqual(net.isIPv4({ - toString: () => '::2001:252:1:255.255.255.255' -}), false); -assert.strictEqual(net.isIPv4({ toString: () => '127.0.0.1' }), true); -assert.strictEqual(net.isIPv4({ toString: () => 'bla' }), false); - -assert.strictEqual(net.isIPv6('127.0.0.1'), false); -assert.strictEqual(net.isIPv6('example.com'), false); -assert.strictEqual(net.isIPv6('2001:252:0:1::2008:6'), true); -assert.strictEqual(net.isIPv6(), false); -assert.strictEqual(net.isIPv6(''), false); -assert.strictEqual(net.isIPv6(null), false); -assert.strictEqual(net.isIPv6(123), false); -assert.strictEqual(net.isIPv6(true), false); -assert.strictEqual(net.isIPv6({}), false); -assert.strictEqual(net.isIPv6({ - toString: () => '::2001:252:1:255.255.255.255' -}), true); -assert.strictEqual(net.isIPv6({ toString: () => '127.0.0.1' }), false); -assert.strictEqual(net.isIPv6({ toString: () => 'bla' }), false); diff --git a/cli/tests/node_compat/test/parallel/test-net-isipv4.js b/cli/tests/node_compat/test/parallel/test-net-isipv4.js deleted file mode 100644 index a9733c342..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-isipv4.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const net = require('net'); - -const v4 = [ - '0.0.0.0', - '8.8.8.8', - '127.0.0.1', - '100.100.100.100', - '192.168.0.1', - '18.101.25.153', - '123.23.34.2', - '172.26.168.134', - '212.58.241.131', - '128.0.0.0', - '23.71.254.72', - '223.255.255.255', - '192.0.2.235', - '99.198.122.146', - '46.51.197.88', - '173.194.34.134', -]; - -const v4not = [ - '.100.100.100.100', - '100..100.100.100.', - '100.100.100.100.', - '999.999.999.999', - '256.256.256.256', - '256.100.100.100.100', - '123.123.123', - 'http://123.123.123', - '1000.2.3.4', - '999.2.3.4', - '0000000192.168.0.200', - '192.168.0.2000000000', -]; - -v4.forEach((ip) => { - assert.strictEqual(net.isIPv4(ip), true); -}); - -v4not.forEach((ip) => { - assert.strictEqual(net.isIPv4(ip), false); -}); diff --git a/cli/tests/node_compat/test/parallel/test-net-isipv6.js b/cli/tests/node_compat/test/parallel/test-net-isipv6.js deleted file mode 100644 index cc74fe657..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-isipv6.js +++ /dev/null @@ -1,251 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const net = require('net'); - -const v6 = [ - '::', - '1::', - '::1', - '1::8', - '1::7:8', - '1:2:3:4:5:6:7:8', - '1:2:3:4:5:6::8', - '1:2:3:4:5:6:7::', - '1:2:3:4:5::7:8', - '1:2:3:4:5::8', - '1:2:3::8', - '1::4:5:6:7:8', - '1::6:7:8', - '1::3:4:5:6:7:8', - '1:2:3:4::6:7:8', - '1:2::4:5:6:7:8', - '::2:3:4:5:6:7:8', - '1:2::8', - '2001:0000:1234:0000:0000:C1C0:ABCD:0876', - '3ffe:0b00:0000:0000:0001:0000:0000:000a', - 'FF02:0000:0000:0000:0000:0000:0000:0001', - '0000:0000:0000:0000:0000:0000:0000:0001', - '0000:0000:0000:0000:0000:0000:0000:0000', - '::ffff:192.168.1.26', - '2::10', - 'ff02::1', - 'fe80::', - '2002::', - '2001:db8::', - '2001:0db8:1234::', - '::ffff:0:0', - '::ffff:192.168.1.1', - '1:2:3:4::8', - '1::2:3:4:5:6:7', - '1::2:3:4:5:6', - '1::2:3:4:5', - '1::2:3:4', - '1::2:3', - '::2:3:4:5:6:7', - '::2:3:4:5:6', - '::2:3:4:5', - '::2:3:4', - '::2:3', - '::8', - '1:2:3:4:5:6::', - '1:2:3:4:5::', - '1:2:3:4::', - '1:2:3::', - '1:2::', - '1:2:3:4::7:8', - '1:2:3::7:8', - '1:2::7:8', - '1:2:3:4:5:6:1.2.3.4', - '1:2:3:4:5::1.2.3.4', - '1:2:3:4::1.2.3.4', - '1:2:3::1.2.3.4', - '1:2::1.2.3.4', - '1::1.2.3.4', - '1:2:3:4::5:1.2.3.4', - '1:2:3::5:1.2.3.4', - '1:2::5:1.2.3.4', - '1::5:1.2.3.4', - '1::5:11.22.33.44', - 'fe80::217:f2ff:254.7.237.98', - 'fe80::217:f2ff:fe07:ed62', - '2001:DB8:0:0:8:800:200C:417A', - 'FF01:0:0:0:0:0:0:101', - '0:0:0:0:0:0:0:1', - '0:0:0:0:0:0:0:0', - '2001:DB8::8:800:200C:417A', - 'FF01::101', - '0:0:0:0:0:0:13.1.68.3', - '0:0:0:0:0:FFFF:129.144.52.38', - '::13.1.68.3', - '::FFFF:129.144.52.38', - 'fe80:0000:0000:0000:0204:61ff:fe9d:f156', - 'fe80:0:0:0:204:61ff:fe9d:f156', - 'fe80::204:61ff:fe9d:f156', - 'fe80:0:0:0:204:61ff:254.157.241.86', - 'fe80::204:61ff:254.157.241.86', - 'fe80::1', - '2001:0db8:85a3:0000:0000:8a2e:0370:7334', - '2001:db8:85a3:0:0:8a2e:370:7334', - '2001:db8:85a3::8a2e:370:7334', - '2001:0db8:0000:0000:0000:0000:1428:57ab', - '2001:0db8:0000:0000:0000::1428:57ab', - '2001:0db8:0:0:0:0:1428:57ab', - '2001:0db8:0:0::1428:57ab', - '2001:0db8::1428:57ab', - '2001:db8::1428:57ab', - '::ffff:12.34.56.78', - '::ffff:0c22:384e', - '2001:0db8:1234:0000:0000:0000:0000:0000', - '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff', - '2001:db8:a::123', - '::ffff:192.0.2.128', - '::ffff:c000:280', - 'a:b:c:d:e:f:f1:f2', - 'a:b:c::d:e:f:f1', - 'a:b:c::d:e:f', - 'a:b:c::d:e', - 'a:b:c::d', - '::a', - '::a:b:c', - '::a:b:c:d:e:f:f1', - 'a::', - 'a:b:c::', - 'a:b:c:d:e:f:f1::', - 'a:bb:ccc:dddd:000e:00f:0f::', - '0:a:0:a:0:0:0:a', - '0:a:0:0:a:0:0:a', - '2001:db8:1:1:1:1:0:0', - '2001:db8:1:1:1:0:0:0', - '2001:db8:1:1:0:0:0:0', - '2001:db8:1:0:0:0:0:0', - '2001:db8:0:0:0:0:0:0', - '2001:0:0:0:0:0:0:0', - 'A:BB:CCC:DDDD:000E:00F:0F::', - '0:0:0:0:0:0:0:a', - '0:0:0:0:a:0:0:0', - '0:0:0:a:0:0:0:0', - 'a:0:0:a:0:0:a:a', - 'a:0:0:a:0:0:0:a', - 'a:0:0:0:a:0:0:a', - 'a:0:0:0:a:0:0:0', - 'a:0:0:0:0:0:0:0', - 'fe80::7:8%eth0', - 'fe80::7:8%1', -]; - -const v6not = [ - '', - '1:', - ':1', - '11:36:12', - '02001:0000:1234:0000:0000:C1C0:ABCD:0876', - '2001:0000:1234:0000:00001:C1C0:ABCD:0876', - '2001:0000:1234: 0000:0000:C1C0:ABCD:0876', - '2001:1:1:1:1:1:255Z255X255Y255', - '3ffe:0b00:0000:0001:0000:0000:000a', - 'FF02:0000:0000:0000:0000:0000:0000:0000:0001', - '3ffe:b00::1::a', - '::1111:2222:3333:4444:5555:6666::', - '1:2:3::4:5::7:8', - '12345::6:7:8', - '1::5:400.2.3.4', - '1::5:260.2.3.4', - '1::5:256.2.3.4', - '1::5:1.256.3.4', - '1::5:1.2.256.4', - '1::5:1.2.3.256', - '1::5:300.2.3.4', - '1::5:1.300.3.4', - '1::5:1.2.300.4', - '1::5:1.2.3.300', - '1::5:900.2.3.4', - '1::5:1.900.3.4', - '1::5:1.2.900.4', - '1::5:1.2.3.900', - '1::5:300.300.300.300', - '1::5:3000.30.30.30', - '1::400.2.3.4', - '1::260.2.3.4', - '1::256.2.3.4', - '1::1.256.3.4', - '1::1.2.256.4', - '1::1.2.3.256', - '1::300.2.3.4', - '1::1.300.3.4', - '1::1.2.300.4', - '1::1.2.3.300', - '1::900.2.3.4', - '1::1.900.3.4', - '1::1.2.900.4', - '1::1.2.3.900', - '1::300.300.300.300', - '1::3000.30.30.30', - '::400.2.3.4', - '::260.2.3.4', - '::256.2.3.4', - '::1.256.3.4', - '::1.2.256.4', - '::1.2.3.256', - '::300.2.3.4', - '::1.300.3.4', - '::1.2.300.4', - '::1.2.3.300', - '::900.2.3.4', - '::1.900.3.4', - '::1.2.900.4', - '::1.2.3.900', - '::300.300.300.300', - '::3000.30.30.30', - '2001:DB8:0:0:8:800:200C:417A:221', - 'FF01::101::2', - '1111:2222:3333:4444::5555:', - '1111:2222:3333::5555:', - '1111:2222::5555:', - '1111::5555:', - '::5555:', - ':::', - '1111:', - ':', - ':1111:2222:3333:4444::5555', - ':1111:2222:3333::5555', - ':1111:2222::5555', - ':1111::5555', - ':::5555', - '1.2.3.4:1111:2222:3333:4444::5555', - '1.2.3.4:1111:2222:3333::5555', - '1.2.3.4:1111:2222::5555', - '1.2.3.4:1111::5555', - '1.2.3.4::5555', - '1.2.3.4::', - 'fe80:0000:0000:0000:0204:61ff:254.157.241.086', - '123', - 'ldkfj', - '2001::FFD3::57ab', - '2001:db8:85a3::8a2e:37023:7334', - '2001:db8:85a3::8a2e:370k:7334', - '1:2:3:4:5:6:7:8:9', - '1::2::3', - '1:::3:4:5', - '1:2:3::4:5:6:7:8:9', - '::ffff:2.3.4', - '::ffff:257.1.2.3', - '::ffff:12345678901234567890.1.26', - '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0', - '02001:0000:1234:0000:0000:C1C0:ABCD:0876', -]; - -v6.forEach((ip) => { - assert.strictEqual(net.isIPv6(ip), true); -}); - -v6not.forEach((ip) => { - assert.strictEqual(net.isIPv6(ip), false); -}); diff --git a/cli/tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js b/cli/tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js deleted file mode 100644 index 69b72b9c2..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-listen-close-server-callback-is-not-function.js +++ /dev/null @@ -1,18 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const net = require('net'); - -const server = net.createServer(common.mustNotCall()); - -server.on('close', common.mustCall()); - -server.listen(0, common.mustNotCall()); - -server.close('bad argument'); diff --git a/cli/tests/node_compat/test/parallel/test-net-listen-close-server.js b/cli/tests/node_compat/test/parallel/test-net-listen-close-server.js deleted file mode 100644 index 441cf4511..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-listen-close-server.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 net = require('net'); - -const server = net.createServer(function(socket) { -}); -server.listen(0, common.mustNotCall()); -server.on('error', common.mustNotCall()); -server.close(); diff --git a/cli/tests/node_compat/test/parallel/test-net-listen-invalid-port.js b/cli/tests/node_compat/test/parallel/test-net-listen-invalid-port.js deleted file mode 100644 index 10685f1d0..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-listen-invalid-port.js +++ /dev/null @@ -1,52 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); - -// This test ensures that port numbers are validated in *all* kinds of `listen` -// calls. If an invalid port is supplied, ensures a `RangeError` is thrown. -// https://github.com/nodejs/node/issues/5727 - -const assert = require('assert'); -const net = require('net'); - -const invalidPort = -1 >>> 0; - -// TODO: support net.Server() without new - -new net.Server().listen(0, function() { - const address = this.address(); - const key = `${address.family}:${address.address}:0`; - - assert.strictEqual(this._connectionKey, key); - this.close(); -}); - -// The first argument is a configuration object -assert.throws(() => { - new net.Server().listen({ port: invalidPort }, common.mustNotCall()); -}, { - code: 'ERR_SOCKET_BAD_PORT', - name: 'RangeError' -}); - -// The first argument is the port, no IP given. -assert.throws(() => { - new net.Server().listen(invalidPort, common.mustNotCall()); -}, { - code: 'ERR_SOCKET_BAD_PORT', - name: 'RangeError' -}); - -// The first argument is the port, the second an IP. -assert.throws(() => { - new net.Server().listen(invalidPort, '0.0.0.0', common.mustNotCall()); -}, { - code: 'ERR_SOCKET_BAD_PORT', - name: 'RangeError' -}); diff --git a/cli/tests/node_compat/test/parallel/test-net-listening.js b/cli/tests/node_compat/test/parallel/test-net-listening.js deleted file mode 100644 index 275dd06eb..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-listening.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -const server = net.createServer(); - -assert.strictEqual(server.listening, false); - -server.listen(0, common.mustCall(() => { - assert.strictEqual(server.listening, true); - - server.close(common.mustCall(() => { - assert.strictEqual(server.listening, false); - })); -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-localerror.js b/cli/tests/node_compat/test/parallel/test-net-localerror.js deleted file mode 100644 index 9e2080ed4..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-localerror.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const net = require('net'); - -const connect = (opts, code, type) => { - assert.throws( - () => net.connect(opts), - { code, name: type.name } - ); -}; - -connect({ - host: 'localhost', - port: 0, - localAddress: 'foobar', -}, 'ERR_INVALID_IP_ADDRESS', TypeError); - -connect({ - host: 'localhost', - port: 0, - localPort: 'foobar', -}, 'ERR_INVALID_ARG_TYPE', TypeError); diff --git a/cli/tests/node_compat/test/parallel/test-net-options-lookup.js b/cli/tests/node_compat/test/parallel/test-net-options-lookup.js deleted file mode 100644 index d3ca0451c..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-options-lookup.js +++ /dev/null @@ -1,59 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -['foobar', 1, {}, []].forEach((input) => connectThrows(input)); - -// Using port 0 as lookup is emitted before connecting. -function connectThrows(input) { - const opts = { - host: 'localhost', - port: 0, - lookup: input - }; - - assert.throws(() => { - net.connect(opts); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); -} - -connectDoesNotThrow(() => {}); - -function connectDoesNotThrow(input) { - const opts = { - host: 'localhost', - port: 0, - lookup: input - }; - - return net.connect(opts); -} - -{ - // Verify that an error is emitted when an invalid address family is returned. - const s = connectDoesNotThrow((host, options, cb) => { - if (options.all) { - cb(null, [{ address: '127.0.0.1', family: 100 }]); - } else { - cb(null, '127.0.0.1', 100); - } - }); - - s.on('error', common.expectsError({ - code: 'ERR_INVALID_ADDRESS_FAMILY', - host: 'localhost', - port: 0, - message: 'Invalid address family: 100 localhost:0' - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-net-pipe-connect-errors.js b/cli/tests/node_compat/test/parallel/test-net-pipe-connect-errors.js deleted file mode 100644 index 451c9eb92..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-pipe-connect-errors.js +++ /dev/null @@ -1,104 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 fixtures = require('../common/fixtures'); -const fs = require('fs'); -const net = require('net'); -const assert = require('assert'); - -// Test if ENOTSOCK is fired when trying to connect to a file which is not -// a socket. - -let emptyTxt; - -if (common.isWindows) { - // On Win, common.PIPE will be a named pipe, so we use an existing empty - // file instead - emptyTxt = fixtures.path('empty.txt'); -} else { - const tmpdir = require('../common/tmpdir'); - tmpdir.refresh(); - // Keep the file name very short so that we don't exceed the 108 char limit - // on CI for a POSIX socket. Even though this isn't actually a socket file, - // the error will be different from the one we are expecting if we exceed the - // limit. - emptyTxt = `${tmpdir.path}0.txt`; - - function cleanup() { - try { - fs.unlinkSync(emptyTxt); - } catch (e) { - assert.strictEqual(e.code, 'ENOENT'); - } - } - process.on('exit', cleanup); - cleanup(); - fs.writeFileSync(emptyTxt, ''); -} - -const notSocketClient = net.createConnection(emptyTxt, function() { - assert.fail('connection callback should not run'); -}); - -notSocketClient.on('error', common.mustCall(function(err) { - assert(err.code === 'ENOTSOCK' || err.code === 'ECONNREFUSED', - `received ${err.code} instead of ENOTSOCK or ECONNREFUSED`); -})); - - -// Trying to connect to not-existing socket should result in ENOENT error -const noEntSocketClient = net.createConnection('no-ent-file', function() { - assert.fail('connection to non-existent socket, callback should not run'); -}); - -noEntSocketClient.on('error', common.mustCall(function(err) { - assert.strictEqual(err.code, 'ENOENT'); -})); - - -// On Windows or IBMi or when running as root, -// a chmod has no effect on named pipes -if (!common.isWindows && !common.isIBMi && process.getuid() !== 0) { - // Trying to connect to a socket one has no access to should result in EACCES - const accessServer = net.createServer( - common.mustNotCall('server callback should not run')); - accessServer.listen(common.PIPE, common.mustCall(function() { - fs.chmodSync(common.PIPE, 0); - - const accessClient = net.createConnection(common.PIPE, function() { - assert.fail('connection should get EACCES, callback should not run'); - }); - - accessClient.on('error', common.mustCall(function(err) { - assert.strictEqual(err.code, 'EACCES'); - accessServer.close(); - })); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js b/cli/tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js deleted file mode 100644 index 30b443b18..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-call-listen-multiple-times.js +++ /dev/null @@ -1,56 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -// TODO: support net.Server() without new - -// First test. Check that after error event you can listen right away. -{ - const dummyServer = new net.Server(); - const server = new net.Server(); - - // Run some server in order to simulate EADDRINUSE error. - dummyServer.listen(common.mustCall(() => { - // Try to listen used port. - server.listen(dummyServer.address().port); - })); - - server.on('error', common.mustCall((e) => { - server.listen(common.mustCall(() => { - dummyServer.close(); - server.close(); - })); - })); -} - -// Second test. Check that second listen call throws an error. -{ - const server = new net.Server(); - - server.listen(common.mustCall(() => server.close())); - - assert.throws(() => server.listen(), { - code: 'ERR_SERVER_ALREADY_LISTEN', - name: 'Error' - }); -} - -// Third test. -// Check that after the close call you can run listen method just fine. -{ - const server = new net.Server(); - - server.listen(common.mustCall(() => { - server.close(); - server.listen(common.mustCall(() => server.close())); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-net-server-listen-options-signal.js b/cli/tests/node_compat/test/parallel/test-net-server-listen-options-signal.js deleted file mode 100644 index b8547f516..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-listen-options-signal.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -{ - // Test bad signal. - const server = net.createServer(); - assert.throws( - () => server.listen({ port: 0, signal: 'INVALID_SIGNAL' }), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); -} - -{ - // Test close. - const server = net.createServer(); - const controller = new AbortController(); - server.on('close', common.mustCall()); - server.listen({ port: 0, signal: controller.signal }); - controller.abort(); -} - -{ - // Test close with pre-aborted signal. - const server = net.createServer(); - const signal = AbortSignal.abort(); - server.on('close', common.mustCall()); - server.listen({ port: 0, signal }); -} diff --git a/cli/tests/node_compat/test/parallel/test-net-server-listen-options.js b/cli/tests/node_compat/test/parallel/test-net-server-listen-options.js deleted file mode 100644 index 4d76a7ca7..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-listen-options.js +++ /dev/null @@ -1,101 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -function close() { this.close(); } - -{ - // Test listen() - net.createServer().listen().on('listening', common.mustCall(close)); - // Test listen(cb) - net.createServer().listen(common.mustCall(close)); - // Test listen(port) - net.createServer().listen(0).on('listening', common.mustCall(close)); - // Test listen({port}) - net.createServer().listen({ port: 0 }) - .on('listening', common.mustCall(close)); -} - -// Test listen(port, cb) and listen({ port }, cb) combinations -const listenOnPort = [ - (port, cb) => net.createServer().listen({ port }, cb), - (port, cb) => net.createServer().listen(port, cb), -]; - -{ - const assertPort = () => { - return common.expectsError({ - code: 'ERR_SOCKET_BAD_PORT', - name: 'RangeError' - }); - }; - - for (const listen of listenOnPort) { - // Arbitrary unused ports - listen('0', common.mustCall(close)); - listen(0, common.mustCall(close)); - listen(undefined, common.mustCall(close)); - listen(null, common.mustCall(close)); - // Test invalid ports - assert.throws(() => listen(-1, common.mustNotCall()), assertPort()); - assert.throws(() => listen(NaN, common.mustNotCall()), assertPort()); - assert.throws(() => listen(123.456, common.mustNotCall()), assertPort()); - assert.throws(() => listen(65536, common.mustNotCall()), assertPort()); - assert.throws(() => listen(1 / 0, common.mustNotCall()), assertPort()); - assert.throws(() => listen(-1 / 0, common.mustNotCall()), assertPort()); - } - // In listen(options, cb), port takes precedence over path - assert.throws(() => { - net.createServer().listen({ port: -1, path: common.PIPE }, - common.mustNotCall()); - }, assertPort()); -} - -{ - function shouldFailToListen(options) { - const fn = () => { - net.createServer().listen(options, common.mustNotCall()); - }; - - if (typeof options === 'object' && - !(('port' in options) || ('path' in options))) { - assert.throws(fn, - { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError', - message: /^The argument 'options' must have the property "port" or "path"\. Received .+$/, - }); - } else { - assert.throws(fn, - { - code: 'ERR_INVALID_ARG_VALUE', - name: 'TypeError', - message: /^The argument 'options' is invalid\. Received .+$/, - }); - } - } - - shouldFailToListen(false, { port: false }); - shouldFailToListen({ port: false }); - shouldFailToListen(true); - shouldFailToListen({ port: true }); - // Invalid fd as listen(handle) - shouldFailToListen({ fd: -1 }); - // Invalid path in listen(options) - shouldFailToListen({ path: -1 }); - - // Neither port or path are specified in options - shouldFailToListen({}); - shouldFailToListen({ host: 'localhost' }); - shouldFailToListen({ host: 'localhost:3000' }); - shouldFailToListen({ host: { port: 3000 } }); - shouldFailToListen({ exclusive: true }); -} diff --git a/cli/tests/node_compat/test/parallel/test-net-server-listen-path.js b/cli/tests/node_compat/test/parallel/test-net-server-listen-path.js deleted file mode 100644 index 559e9c7eb..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-listen-path.js +++ /dev/null @@ -1,100 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -const common = require('../common'); -const net = require('net'); -const assert = require('assert'); -const fs = require('fs'); - -const tmpdir = require('../common/tmpdir'); -tmpdir.refresh(); - -function closeServer() { - return common.mustCall(function() { - this.close(); - }); -} - -let counter = 0; - -// Avoid conflict with listen-handle -function randomPipePath() { - return `${common.PIPE}-listen-path-${counter++}`; -} - -// Test listen(path) -{ - const handlePath = randomPipePath(); - net.createServer() - .listen(handlePath) - .on('listening', closeServer()); -} - -// Test listen({path}) -{ - const handlePath = randomPipePath(); - net.createServer() - .listen({ path: handlePath }) - .on('listening', closeServer()); -} - -// Test listen(path, cb) -{ - const handlePath = randomPipePath(); - net.createServer() - .listen(handlePath, closeServer()); -} - -// Test listen(path, cb) -{ - const handlePath = randomPipePath(); - net.createServer() - .listen({ path: handlePath }, closeServer()); -} - -// Test pipe chmod -{ - const handlePath = randomPipePath(); - - const server = net.createServer() - .listen({ - path: handlePath, - readableAll: true, - writableAll: true - }, common.mustCall(() => { - if (process.platform !== 'win32') { - const mode = fs.statSync(handlePath).mode; - assert.notStrictEqual(mode & fs.constants.S_IROTH, 0); - assert.notStrictEqual(mode & fs.constants.S_IWOTH, 0); - } - server.close(); - })); -} - -// TODO(cmorten): seems Deno.listen() for Unix domains isn't throwing -// Deno.errors.AddrInUse errors as would expect...? -// Test should emit "error" events when listening fails. -// { -// const handlePath = randomPipePath(); -// const server1 = net.createServer().listen({ path: handlePath }, () => { -// // As the handlePath is in use, binding to the same address again should -// // make the server emit an 'EADDRINUSE' error. -// const server2 = net.createServer() -// .listen({ -// path: handlePath, -// writableAll: true, -// }, common.mustNotCall()); - -// server2.on('error', common.mustCall((err) => { -// server1.close(); -// assert.strictEqual(err.code, 'EADDRINUSE'); -// assert.match(err.message, /^listen EADDRINUSE: address already in use/); -// })); -// }); -// } diff --git a/cli/tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js b/cli/tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js deleted file mode 100644 index 15808a7a1..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-listen-remove-callback.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const net = require('net'); - -// Server should only fire listen callback once -const server = net.createServer(); - -server.on('close', function() { - const listeners = server.listeners('listening'); - console.log('Closed, listeners:', listeners.length); - assert.strictEqual(listeners.length, 0); -}); - -server.listen(0, function() { - server.close(); -}); - -server.once('close', function() { - server.listen(0, function() { - server.close(); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-net-server-options.js b/cli/tests/node_compat/test/parallel/test-net-server-options.js deleted file mode 100644 index 92086d149..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-options.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const net = require('net'); - -assert.throws(() => net.createServer('path'), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - -assert.throws(() => net.createServer(0), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); diff --git a/cli/tests/node_compat/test/parallel/test-net-server-try-ports.js b/cli/tests/node_compat/test/parallel/test-net-server-try-ports.js deleted file mode 100644 index 69dbc78b8..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-try-ports.js +++ /dev/null @@ -1,54 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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'; -// This test binds to one port, then attempts to start a server on that -// port. It should be EADDRINUSE but be able to then bind to another port. -const common = require('../common'); -const assert = require('assert'); -const net = require('net'); - -// TODO: support net.Server() without new - -const server1 = new net.Server(); - -const server2 = new net.Server(); - -server2.on('error', common.mustCall(function(e) { - assert.strictEqual(e.code, 'EADDRINUSE'); - - server2.listen(0, common.mustCall(function() { - server1.close(); - server2.close(); - })); -})); - -server1.listen(0, common.mustCall(function() { - // This should make server2 emit EADDRINUSE - server2.listen(this.address().port); -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-server-unref-persistent.js b/cli/tests/node_compat/test/parallel/test-net-server-unref-persistent.js deleted file mode 100644 index 04b79686e..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-unref-persistent.js +++ /dev/null @@ -1,19 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const net = require('net'); -const server = net.createServer(); - -// Unref before listening -server.unref(); -server.listen(); - -// If the timeout fires, that means the server held the event loop open -// and the unref() was not persistent. Close the server and fail the test. -setTimeout(common.mustNotCall(), 1000).unref(); diff --git a/cli/tests/node_compat/test/parallel/test-net-server-unref.js b/cli/tests/node_compat/test/parallel/test-net-server-unref.js deleted file mode 100644 index 68fd6edb1..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-server-unref.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 net = require('net'); - -const s = net.createServer(); -s.listen(0); -s.unref(); - -setTimeout(common.mustNotCall(), 1000).unref(); diff --git a/cli/tests/node_compat/test/parallel/test-net-socket-destroy-twice.js b/cli/tests/node_compat/test/parallel/test-net-socket-destroy-twice.js deleted file mode 100644 index 8cff55d70..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-socket-destroy-twice.js +++ /dev/null @@ -1,43 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 net = require('net'); - -const server = net.createServer(); -server.listen(0); -const port = server.address().port; -const conn = net.createConnection(port); - -conn.on('error', common.mustCall(() => { - conn.destroy(); -})); - -conn.on('close', common.mustCall()); -server.close(); diff --git a/cli/tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js b/cli/tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js deleted file mode 100644 index c50b0061a..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-socket-no-halfopen-enforcer.js +++ /dev/null @@ -1,18 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test ensures that `net.Socket` does not inherit the no-half-open -// enforcer from `stream.Duplex`. - -const { Socket } = require('net'); -const { strictEqual } = require('assert'); - -const socket = new Socket({ allowHalfOpen: false }); -strictEqual(socket.listenerCount('end'), 1); diff --git a/cli/tests/node_compat/test/parallel/test-net-socket-timeout.js b/cli/tests/node_compat/test/parallel/test-net-socket-timeout.js deleted file mode 100644 index b69e40530..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-socket-timeout.js +++ /dev/null @@ -1,88 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 net = require('net'); -const assert = require('assert'); -const { inspect } = require('util'); - -// Verify that invalid delays throw -const s = new net.Socket(); -const nonNumericDelays = [ - '100', true, false, undefined, null, '', {}, () => {}, [], -]; -const badRangeDelays = [-0.001, -1, -Infinity, Infinity, NaN]; -const validDelays = [0, 0.001, 1, 1e6]; -const invalidCallbacks = [ - 1, '100', true, false, null, {}, [], Symbol('test'), -]; - - -for (let i = 0; i < nonNumericDelays.length; i++) { - assert.throws(() => { - s.setTimeout(nonNumericDelays[i], () => {}); - }, { code: 'ERR_INVALID_ARG_TYPE' }, nonNumericDelays[i]); -} - -for (let i = 0; i < badRangeDelays.length; i++) { - assert.throws(() => { - s.setTimeout(badRangeDelays[i], () => {}); - }, { code: 'ERR_OUT_OF_RANGE' }, badRangeDelays[i]); -} - -for (let i = 0; i < validDelays.length; i++) { - s.setTimeout(validDelays[i], () => {}); -} - -for (let i = 0; i < invalidCallbacks.length; i++) { - [0, 1].forEach((mesc) => - assert.throws( - () => s.setTimeout(mesc, invalidCallbacks[i]), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - } - ) - ); -} - -// TODO: support net.Server() without new - -const server = new net.Server(); -server.listen(0, common.mustCall(() => { - const socket = net.createConnection(server.address().port); - assert.strictEqual( - socket.setTimeout(1, common.mustCall(() => { - socket.destroy(); - assert.strictEqual(socket.setTimeout(1, common.mustNotCall()), socket); - server.close(); - })), - socket - ); -})); diff --git a/cli/tests/node_compat/test/parallel/test-net-timeout-no-handle.js b/cli/tests/node_compat/test/parallel/test-net-timeout-no-handle.js deleted file mode 100644 index 1948dc9ad..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-timeout-no-handle.js +++ /dev/null @@ -1,24 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const net = require('net'); -const assert = require('assert'); - -const socket = new net.Socket(); -socket.setTimeout(common.platformTimeout(50)); - -socket.on('timeout', common.mustCall(() => { - assert.strictEqual(socket._handle, null); -})); - -socket.on('connect', common.mustNotCall()); - -// Since the timeout is unrefed, the code will exit without this -setTimeout(() => {}, common.platformTimeout(200)); diff --git a/cli/tests/node_compat/test/parallel/test-net-write-arguments.js b/cli/tests/node_compat/test/parallel/test-net-write-arguments.js deleted file mode 100644 index d6beb72ee..000000000 --- a/cli/tests/node_compat/test/parallel/test-net-write-arguments.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -const net = require('net'); -const assert = require('assert'); -const socket = new net.Stream({ highWaterMark: 0 }); - -// Make sure that anything besides a buffer or a string throws. -socket.on('error', common.mustNotCall()); -assert.throws(() => { - socket.write(null); -}, { - code: 'ERR_STREAM_NULL_VALUES', - name: 'TypeError', - message: 'May not write null values to stream' -}); - -[ - true, - false, - undefined, - 1, - 1.0, - +Infinity, - -Infinity, - [], - {}, -].forEach((value) => { - const socket = new net.Stream({ highWaterMark: 0 }); - // We need to check the callback since 'error' will only - // be emitted once per instance. - assert.throws(() => { - socket.write(value); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "chunk" argument must be of type string or an instance of ' + - `Buffer or Uint8Array.${common.invalidArgTypeHelper(value)}` - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js b/cli/tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js deleted file mode 100644 index 6d0d6a7e0..000000000 --- a/cli/tests/node_compat/test/parallel/test-next-tick-doesnt-hang.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -// This test verifies that having a single nextTick statement and nothing else -// does not hang the event loop. If this test times out it has failed. - -require('../common'); -process.nextTick(function() { - // Nothing -}); diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js b/cli/tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js deleted file mode 100644 index fff40f754..000000000 --- a/cli/tests/node_compat/test/parallel/test-next-tick-fixed-queue-regression.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -// This tests a highly specific regression tied to the FixedQueue size, which -// was introduced in Node.js 9.7.0: https://github.com/nodejs/node/pull/18617 -// More specifically, a nextTick list could potentially end up not fully -// clearing in one run through if exactly 2048 ticks were added after -// microtasks were executed within the nextTick loop. - -process.nextTick(() => { - Promise.resolve(1).then(() => { - for (let i = 0; i < 2047; i++) - process.nextTick(common.mustCall()); - const immediate = setImmediate(common.mustNotCall()); - process.nextTick(common.mustCall(() => clearImmediate(immediate))); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js b/cli/tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js deleted file mode 100644 index b2c00b43a..000000000 --- a/cli/tests/node_compat/test/parallel/test-next-tick-intentional-starvation.js +++ /dev/null @@ -1,68 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -// This is the inverse of test-next-tick-starvation. it verifies -// that process.nextTick will *always* come before other events - -let ran = false; -let starved = false; -const start = +new Date(); -let timerRan = false; - -function spin() { - ran = true; - const now = +new Date(); - if (now - start > 100) { - console.log('The timer is starving, just as we planned.'); - starved = true; - - // now let it out. - return; - } - - process.nextTick(spin); -} - -function onTimeout() { - if (!starved) throw new Error('The timer escaped!'); - console.log('The timer ran once the ban was lifted'); - timerRan = true; -} - -spin(); -setTimeout(onTimeout, 50); - -process.on('exit', function() { - assert.ok(ran); - assert.ok(starved); - assert.ok(timerRan); -}); diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-ordering.js b/cli/tests/node_compat/test/parallel/test-next-tick-ordering.js deleted file mode 100644 index a2839a49e..000000000 --- a/cli/tests/node_compat/test/parallel/test-next-tick-ordering.js +++ /dev/null @@ -1,62 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -let i; - -const N = 30; -const done = []; - -function get_printer(timeout) { - return function() { - console.log(`Running from setTimeout ${timeout}`); - done.push(timeout); - }; -} - -process.nextTick(function() { - console.log('Running from nextTick'); - done.push('nextTick'); -}); - -for (i = 0; i < N; i += 1) { - setTimeout(get_printer(i), i); -} - -console.log('Running from main.'); - - -process.on('exit', function() { - assert.strictEqual(done[0], 'nextTick'); - // Disabling this test. I don't think we can ensure the order - // for (i = 0; i < N; i += 1) { - // assert.strictEqual(i, done[i + 1]); - // } -}); diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-ordering2.js b/cli/tests/node_compat/test/parallel/test-next-tick-ordering2.js deleted file mode 100644 index 29c76d32e..000000000 --- a/cli/tests/node_compat/test/parallel/test-next-tick-ordering2.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const order = []; -process.nextTick(function() { - setTimeout(function() { - order.push('setTimeout'); - }, 0); - - process.nextTick(function() { - order.push('nextTick'); - }); -}); - -process.on('exit', function() { - assert.deepStrictEqual(order, ['nextTick', 'setTimeout']); -}); diff --git a/cli/tests/node_compat/test/parallel/test-next-tick-when-exiting.js b/cli/tests/node_compat/test/parallel/test-next-tick-when-exiting.js deleted file mode 100644 index 5f20b5247..000000000 --- a/cli/tests/node_compat/test/parallel/test-next-tick-when-exiting.js +++ /dev/null @@ -1,21 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); - -process.on('exit', () => { - assert.strictEqual(process._exiting, true); - - process.nextTick( - common.mustNotCall('process is exiting, should not be called') - ); -}); - -process.exit(); diff --git a/cli/tests/node_compat/test/parallel/test-next-tick.js b/cli/tests/node_compat/test/parallel/test-next-tick.js deleted file mode 100644 index aee5c06a1..000000000 --- a/cli/tests/node_compat/test/parallel/test-next-tick.js +++ /dev/null @@ -1,70 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -process.nextTick(common.mustCall(function() { - process.nextTick(common.mustCall(function() { - process.nextTick(common.mustCall()); - })); -})); - -setTimeout(common.mustCall(function() { - process.nextTick(common.mustCall()); -}), 50); - -process.nextTick(common.mustCall()); - -const obj = {}; - -process.nextTick(function(a, b) { - assert.strictEqual(a, 42); - assert.strictEqual(b, obj); - assert.strictEqual(this, undefined); -}, 42, obj); - -process.nextTick((a, b) => { - assert.strictEqual(a, 42); - assert.strictEqual(b, obj); - assert.deepStrictEqual(this, {}); -}, 42, obj); - -process.nextTick(function() { - assert.strictEqual(this, undefined); -}, 1, 2, 3, 4); - -process.nextTick(() => { - assert.deepStrictEqual(this, {}); -}, 1, 2, 3, 4); - -process.on('exit', function() { - process.nextTick(common.mustNotCall()); -}); diff --git a/cli/tests/node_compat/test/parallel/test-nodeeventtarget.js b/cli/tests/node_compat/test/parallel/test-nodeeventtarget.js deleted file mode 100644 index b5c6e788f..000000000 --- a/cli/tests/node_compat/test/parallel/test-nodeeventtarget.js +++ /dev/null @@ -1,190 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals --no-warnings -'use strict'; - -const common = require('../common'); -const { NodeEventTarget } = require('internal/event_target'); - -const { - deepStrictEqual, - ok, - strictEqual, - throws, -} = require('assert'); - -const { on } = require('events'); - -{ - const eventTarget = new NodeEventTarget(); - strictEqual(eventTarget.listenerCount('foo'), 0); - deepStrictEqual(eventTarget.eventNames(), []); - - const ev1 = common.mustCall(function(event) { - strictEqual(event.type, 'foo'); - strictEqual(this, eventTarget); - }, 2); - - const ev2 = { - handleEvent: common.mustCall(function(event) { - strictEqual(event.type, 'foo'); - strictEqual(this, ev2); - }) - }; - - eventTarget.addEventListener('foo', ev1); - eventTarget.addEventListener('foo', ev2, { once: true }); - strictEqual(eventTarget.listenerCount('foo'), 2); - ok(eventTarget.dispatchEvent(new Event('foo'))); - strictEqual(eventTarget.listenerCount('foo'), 1); - eventTarget.dispatchEvent(new Event('foo')); - - eventTarget.removeEventListener('foo', ev1); - strictEqual(eventTarget.listenerCount('foo'), 0); - eventTarget.dispatchEvent(new Event('foo')); -} - -{ - const eventTarget = new NodeEventTarget(); - strictEqual(eventTarget.listenerCount('foo'), 0); - deepStrictEqual(eventTarget.eventNames(), []); - - const ev1 = common.mustCall((event) => { - strictEqual(event.type, 'foo'); - }, 2); - - const ev2 = { - handleEvent: common.mustCall((event) => { - strictEqual(event.type, 'foo'); - }) - }; - - strictEqual(eventTarget.on('foo', ev1), eventTarget); - strictEqual(eventTarget.once('foo', ev2, { once: true }), eventTarget); - strictEqual(eventTarget.listenerCount('foo'), 2); - eventTarget.dispatchEvent(new Event('foo')); - strictEqual(eventTarget.listenerCount('foo'), 1); - eventTarget.dispatchEvent(new Event('foo')); - - strictEqual(eventTarget.off('foo', ev1), eventTarget); - strictEqual(eventTarget.listenerCount('foo'), 0); - eventTarget.dispatchEvent(new Event('foo')); -} - -{ - const eventTarget = new NodeEventTarget(); - strictEqual(eventTarget.listenerCount('foo'), 0); - deepStrictEqual(eventTarget.eventNames(), []); - - const ev1 = common.mustCall((event) => { - strictEqual(event.type, 'foo'); - }, 2); - - const ev2 = { - handleEvent: common.mustCall((event) => { - strictEqual(event.type, 'foo'); - }) - }; - - eventTarget.addListener('foo', ev1); - eventTarget.once('foo', ev2, { once: true }); - strictEqual(eventTarget.listenerCount('foo'), 2); - eventTarget.dispatchEvent(new Event('foo')); - strictEqual(eventTarget.listenerCount('foo'), 1); - eventTarget.dispatchEvent(new Event('foo')); - - eventTarget.removeListener('foo', ev1); - strictEqual(eventTarget.listenerCount('foo'), 0); - eventTarget.dispatchEvent(new Event('foo')); -} - -{ - const eventTarget = new NodeEventTarget(); - strictEqual(eventTarget.listenerCount('foo'), 0); - deepStrictEqual(eventTarget.eventNames(), []); - - // Won't actually be called. - const ev1 = () => {}; - - // Won't actually be called. - const ev2 = { handleEvent() {} }; - - eventTarget.addListener('foo', ev1); - eventTarget.addEventListener('foo', ev1); - eventTarget.once('foo', ev2, { once: true }); - eventTarget.once('foo', ev2, { once: false }); - eventTarget.on('bar', ev1); - strictEqual(eventTarget.listenerCount('foo'), 2); - strictEqual(eventTarget.listenerCount('bar'), 1); - deepStrictEqual(eventTarget.eventNames(), ['foo', 'bar']); - strictEqual(eventTarget.removeAllListeners('foo'), eventTarget); - strictEqual(eventTarget.listenerCount('foo'), 0); - strictEqual(eventTarget.listenerCount('bar'), 1); - deepStrictEqual(eventTarget.eventNames(), ['bar']); - strictEqual(eventTarget.removeAllListeners(), eventTarget); - strictEqual(eventTarget.listenerCount('foo'), 0); - strictEqual(eventTarget.listenerCount('bar'), 0); - deepStrictEqual(eventTarget.eventNames(), []); -} - -{ - const target = new NodeEventTarget(); - - process.on('warning', common.mustCall((warning) => { - ok(warning instanceof Error); - strictEqual(warning.name, 'MaxListenersExceededWarning'); - strictEqual(warning.target, target); - strictEqual(warning.count, 2); - strictEqual(warning.type, 'foo'); - ok(warning.message.includes( - '2 foo listeners added to NodeEventTarget')); - })); - - strictEqual(target.getMaxListeners(), NodeEventTarget.defaultMaxListeners); - target.setMaxListeners(1); - target.on('foo', () => {}); - target.on('foo', () => {}); -} -{ - // Test NodeEventTarget emit - const emitter = new NodeEventTarget(); - emitter.addEventListener('foo', common.mustCall((e) => { - strictEqual(e.type, 'foo'); - strictEqual(e.detail, 'bar'); - ok(e instanceof Event); - }), { once: true }); - emitter.once('foo', common.mustCall((e, droppedAdditionalArgument) => { - strictEqual(e, 'bar'); - strictEqual(droppedAdditionalArgument, undefined); - })); - emitter.emit('foo', 'bar', 'baz'); -} -{ - // Test NodeEventTarget emit unsupported usage - const emitter = new NodeEventTarget(); - throws(() => { - emitter.emit(); - }, /ERR_INVALID_ARG_TYPE/); -} - -(async () => { - // test NodeEventTarget async-iterability - const emitter = new NodeEventTarget(); - const interval = setInterval(() => { - emitter.dispatchEvent(new Event('foo')); - }, 0); - let count = 0; - for await (const [ item ] of on(emitter, 'foo')) { - count++; - strictEqual(item.type, 'foo'); - if (count > 5) { - break; - } - } - clearInterval(interval); -})().then(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-os.js b/cli/tests/node_compat/test/parallel/test-os.js deleted file mode 100644 index 9de4f516f..000000000 --- a/cli/tests/node_compat/test/parallel/test-os.js +++ /dev/null @@ -1,280 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 os = require('os'); -const path = require('path'); -const { inspect } = require('util'); - -const is = { - number: (value, key) => { - assert(!Number.isNaN(value), `${key} should not be NaN`); - assert.strictEqual(typeof value, 'number'); - }, - string: (value) => { assert.strictEqual(typeof value, 'string'); }, - array: (value) => { assert.ok(Array.isArray(value)); }, - object: (value) => { - assert.strictEqual(typeof value, 'object'); - assert.notStrictEqual(value, null); - } -}; - -/* TODO(kt3k): Enable this test -process.env.TMPDIR = '/tmpdir'; -process.env.TMP = '/tmp'; -process.env.TEMP = '/temp'; -if (common.isWindows) { - assert.strictEqual(os.tmpdir(), '/temp'); - process.env.TEMP = ''; - assert.strictEqual(os.tmpdir(), '/tmp'); - process.env.TMP = ''; - const expected = `${process.env.SystemRoot || process.env.windir}\\temp`; - assert.strictEqual(os.tmpdir(), expected); - process.env.TEMP = '\\temp\\'; - assert.strictEqual(os.tmpdir(), '\\temp'); - process.env.TEMP = '\\tmpdir/'; - assert.strictEqual(os.tmpdir(), '\\tmpdir/'); - process.env.TEMP = '\\'; - assert.strictEqual(os.tmpdir(), '\\'); - process.env.TEMP = 'C:\\'; - assert.strictEqual(os.tmpdir(), 'C:\\'); -} else { - assert.strictEqual(os.tmpdir(), '/tmpdir'); - process.env.TMPDIR = ''; - assert.strictEqual(os.tmpdir(), '/tmp'); - process.env.TMP = ''; - assert.strictEqual(os.tmpdir(), '/temp'); - process.env.TEMP = ''; - assert.strictEqual(os.tmpdir(), '/tmp'); - process.env.TMPDIR = '/tmpdir/'; - assert.strictEqual(os.tmpdir(), '/tmpdir'); - process.env.TMPDIR = '/tmpdir\\'; - assert.strictEqual(os.tmpdir(), '/tmpdir\\'); - process.env.TMPDIR = '/'; - assert.strictEqual(os.tmpdir(), '/'); -} -*/ - -const endianness = os.endianness(); -is.string(endianness); -assert.match(endianness, /[BL]E/); - -const hostname = os.hostname(); -is.string(hostname); -assert.ok(hostname.length > 0); - -// On IBMi, os.uptime() returns 'undefined' -if (!common.isIBMi) { - const uptime = os.uptime(); - is.number(uptime); - assert.ok(uptime > 0); -} - -const cpus = os.cpus(); -is.array(cpus); -assert.ok(cpus.length > 0); -for (const cpu of cpus) { - assert.strictEqual(typeof cpu.model, 'string'); - assert.strictEqual(typeof cpu.speed, 'number'); - assert.strictEqual(typeof cpu.times.user, 'number'); - assert.strictEqual(typeof cpu.times.nice, 'number'); - assert.strictEqual(typeof cpu.times.sys, 'number'); - assert.strictEqual(typeof cpu.times.idle, 'number'); - assert.strictEqual(typeof cpu.times.irq, 'number'); -} - -const type = os.type(); -is.string(type); -assert.ok(type.length > 0); - -const release = os.release(); -is.string(release); -assert.ok(release.length > 0); -// TODO: Check format on more than just AIX -if (common.isAIX) - assert.match(release, /^\d+\.\d+$/); - -const platform = os.platform(); -is.string(platform); -assert.ok(platform.length > 0); - -const availableParallelism = os.availableParallelism(); -assert.ok(availableParallelism === navigator.hardwareConcurrency); - -const arch = os.arch(); -is.string(arch); -assert.ok(arch.length > 0); - -if (!common.isSunOS) { - // not implemented yet - assert.ok(os.loadavg().length > 0); - assert.ok(os.freemem() > 0); - assert.ok(os.totalmem() > 0); -} - -const interfaces = os.networkInterfaces(); -switch (platform) { - case 'linux': { - const filter = (e) => - e.address === '127.0.0.1' && - e.netmask === '255.0.0.0'; - - const actual = interfaces.lo.filter(filter); - const expected = [{ - address: '127.0.0.1', - netmask: '255.0.0.0', - family: 'IPv4', - mac: '00:00:00:00:00:00', - internal: true, - cidr: '127.0.0.1/8' - }]; - assert.deepStrictEqual(actual, expected); - break; - } - case 'win32': { - const filter = (e) => - e.address === '127.0.0.1'; - - const actual = interfaces['Loopback Pseudo-Interface 1'].filter(filter); - const expected = [{ - address: '127.0.0.1', - netmask: '255.0.0.0', - family: 'IPv4', - mac: '00:00:00:00:00:00', - internal: true, - cidr: '127.0.0.1/8' - }]; - assert.deepStrictEqual(actual, expected); - break; - } -} -const netmaskToCIDRSuffixMap = new Map(Object.entries({ - '255.0.0.0': 8, - '255.255.255.0': 24, - 'ffff:ffff:ffff:ffff::': 64, - 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff': 128 -})); - -Object.values(interfaces) - .flat(Infinity) - .map((v) => ({ v, mask: netmaskToCIDRSuffixMap.get(v.netmask) })) - .forEach(({ v, mask }) => { - assert.ok('cidr' in v, `"cidr" prop not found in ${inspect(v)}`); - if (mask) { - assert.strictEqual(v.cidr, `${v.address}/${mask}`); - } - }); - -const EOL = os.EOL; -if (common.isWindows) { - assert.strictEqual(EOL, '\r\n'); -} else { - assert.strictEqual(EOL, '\n'); -} - -const home = os.homedir(); -is.string(home); -assert.ok(home.includes(path.sep)); - -const version = os.version(); -assert.strictEqual(typeof version, 'string'); -assert(version); - -if (common.isWindows && process.env.USERPROFILE) { - assert.strictEqual(home, process.env.USERPROFILE); - delete process.env.USERPROFILE; - assert.ok(os.homedir().includes(path.sep)); - process.env.USERPROFILE = home; -} else if (!common.isWindows && process.env.HOME) { - assert.strictEqual(home, process.env.HOME); - delete process.env.HOME; - assert.ok(os.homedir().includes(path.sep)); - process.env.HOME = home; -} - -const pwd = os.userInfo(); -is.object(pwd); -const pwdBuf = os.userInfo({ encoding: 'buffer' }); - -if (common.isWindows) { - assert.strictEqual(pwd.uid, -1); - assert.strictEqual(pwd.gid, -1); - assert.strictEqual(pwd.shell, null); - assert.strictEqual(pwdBuf.uid, -1); - assert.strictEqual(pwdBuf.gid, -1); - assert.strictEqual(pwdBuf.shell, null); -} else { - is.number(pwd.uid); - is.number(pwd.gid); - assert.strictEqual(typeof pwd.shell, 'string'); - // It's possible for /etc/passwd to leave the user's shell blank. - if (pwd.shell.length > 0) { - assert(pwd.shell.includes(path.sep)); - } - assert.strictEqual(pwd.uid, pwdBuf.uid); - assert.strictEqual(pwd.gid, pwdBuf.gid); - assert.strictEqual(pwd.shell, pwdBuf.shell.toString('utf8')); -} - -is.string(pwd.username); -assert.ok(pwd.homedir.includes(path.sep)); -assert.strictEqual(pwd.username, pwdBuf.username.toString('utf8')); -assert.strictEqual(pwd.homedir, pwdBuf.homedir.toString('utf8')); - - -assert.strictEqual(`${os.hostname}`, os.hostname()); -assert.strictEqual(`${os.homedir}`, os.homedir()); -assert.strictEqual(`${os.release}`, os.release()); -assert.strictEqual(`${os.type}`, os.type()); -assert.strictEqual(`${os.endianness}`, os.endianness()); -// TODO(kt3k): Enable this test -// assert.strictEqual(`${os.tmpdir}`, os.tmpdir()); -assert.strictEqual(`${os.arch}`, os.arch()); -assert.strictEqual(`${os.platform}`, os.platform()); -assert.strictEqual(`${os.version}`, os.version()); - -assert.strictEqual(+os.totalmem, os.totalmem()); - -// Assert that the following values are coercible to numbers. -// On IBMi, os.uptime() returns 'undefined' -if (!common.isIBMi) { - is.number(+os.uptime, 'uptime'); - is.number(os.uptime(), 'uptime'); -} - -is.number(+os.freemem, 'freemem'); -is.number(os.freemem(), 'freemem'); - -const devNull = os.devNull; -if (common.isWindows) { - assert.strictEqual(devNull, '\\\\.\\nul'); -} else { - assert.strictEqual(devNull, '/dev/null'); -} diff --git a/cli/tests/node_compat/test/parallel/test-outgoing-message-destroy.js b/cli/tests/node_compat/test/parallel/test-outgoing-message-destroy.js deleted file mode 100644 index d9a13796f..000000000 --- a/cli/tests/node_compat/test/parallel/test-outgoing-message-destroy.js +++ /dev/null @@ -1,20 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Test that http.OutgoingMessage,prototype.destroy() returns `this`. -require('../common'); - -const assert = require('assert'); -const http = require('http'); -const outgoingMessage = new http.OutgoingMessage(); - -assert.strictEqual(outgoingMessage.destroyed, false); -assert.strictEqual(outgoingMessage.destroy(), outgoingMessage); -assert.strictEqual(outgoingMessage.destroyed, true); -assert.strictEqual(outgoingMessage.destroy(), outgoingMessage); diff --git a/cli/tests/node_compat/test/parallel/test-outgoing-message-pipe.js b/cli/tests/node_compat/test/parallel/test-outgoing-message-pipe.js deleted file mode 100644 index ab9063c93..000000000 --- a/cli/tests/node_compat/test/parallel/test-outgoing-message-pipe.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const OutgoingMessage = require('_http_outgoing').OutgoingMessage; - -// Verify that an error is thrown upon a call to `OutgoingMessage.pipe`. - -const outgoingMessage = new OutgoingMessage(); -assert.throws( - () => { outgoingMessage.pipe(outgoingMessage); }, - { - code: 'ERR_STREAM_CANNOT_PIPE', - name: 'Error' - } -); diff --git a/cli/tests/node_compat/test/parallel/test-parse-args.mjs b/cli/tests/node_compat/test/parallel/test-parse-args.mjs deleted file mode 100644 index ae8332fa7..000000000 --- a/cli/tests/node_compat/test/parallel/test-parse-args.mjs +++ /dev/null @@ -1,1001 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -import '../common/index.mjs'; -import assert from 'node:assert'; -import { test } from 'node:test'; -import { parseArgs } from 'node:util'; - -test('when short option used as flag then stored as flag', () => { - const args = ['-f']; - const expected = { values: { __proto__: null, f: true }, positionals: [] }; - const result = parseArgs({ strict: false, args }); - assert.deepStrictEqual(result, expected); -}); - -test('when short option used as flag before positional then stored as flag and positional (and not value)', () => { - const args = ['-f', 'bar']; - const expected = { values: { __proto__: null, f: true }, positionals: [ 'bar' ] }; - const result = parseArgs({ strict: false, args }); - assert.deepStrictEqual(result, expected); -}); - -test('when short option `type: "string"` used with value then stored as value', () => { - const args = ['-f', 'bar']; - const options = { f: { type: 'string' } }; - const expected = { values: { __proto__: null, f: 'bar' }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('when short option listed in short used as flag then long option stored as flag', () => { - const args = ['-f']; - const options = { foo: { short: 'f', type: 'boolean' } }; - const expected = { values: { __proto__: null, foo: true }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('when short option listed in short and long listed in `type: "string"` and ' + - 'used with value then long option stored as value', () => { - const args = ['-f', 'bar']; - const options = { foo: { short: 'f', type: 'string' } }; - const expected = { values: { __proto__: null, foo: 'bar' }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('when short option `type: "string"` used without value then stored as flag', () => { - const args = ['-f']; - const options = { f: { type: 'string' } }; - const expected = { values: { __proto__: null, f: true }, positionals: [] }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('short option group behaves like multiple short options', () => { - const args = ['-rf']; - const options = { }; - const expected = { values: { __proto__: null, r: true, f: true }, positionals: [] }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('short option group does not consume subsequent positional', () => { - const args = ['-rf', 'foo']; - const options = { }; - const expected = { values: { __proto__: null, r: true, f: true }, positionals: ['foo'] }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected); -}); - -// See: Guideline 5 https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html -test('if terminal of short-option group configured `type: "string"`, subsequent positional is stored', () => { - const args = ['-rvf', 'foo']; - const options = { f: { type: 'string' } }; - const expected = { values: { __proto__: null, r: true, v: true, f: 'foo' }, positionals: [] }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('handles short-option groups in conjunction with long-options', () => { - const args = ['-rf', '--foo', 'foo']; - const options = { foo: { type: 'string' } }; - const expected = { values: { __proto__: null, r: true, f: true, foo: 'foo' }, positionals: [] }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('handles short-option groups with "short" alias configured', () => { - const args = ['-rf']; - const options = { remove: { short: 'r', type: 'boolean' } }; - const expected = { values: { __proto__: null, remove: true, f: true }, positionals: [] }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('handles short-option followed by its value', () => { - const args = ['-fFILE']; - const options = { foo: { short: 'f', type: 'string' } }; - const expected = { values: { __proto__: null, foo: 'FILE' }, positionals: [] }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('Everything after a bare `--` is considered a positional argument', () => { - const args = ['--', 'barepositionals', 'mopositionals']; - const expected = { values: { __proto__: null }, positionals: ['barepositionals', 'mopositionals'] }; - const result = parseArgs({ allowPositionals: true, args }); - assert.deepStrictEqual(result, expected, Error('testing bare positionals')); -}); - -test('args are true', () => { - const args = ['--foo', '--bar']; - const expected = { values: { __proto__: null, foo: true, bar: true }, positionals: [] }; - const result = parseArgs({ strict: false, args }); - assert.deepStrictEqual(result, expected, Error('args are true')); -}); - -test('arg is true and positional is identified', () => { - const args = ['--foo=a', '--foo', 'b']; - const expected = { values: { __proto__: null, foo: true }, positionals: ['b'] }; - const result = parseArgs({ strict: false, args }); - assert.deepStrictEqual(result, expected, Error('arg is true and positional is identified')); -}); - -test('args equals are passed `type: "string"`', () => { - const args = ['--so=wat']; - const options = { so: { type: 'string' } }; - const expected = { values: { __proto__: null, so: 'wat' }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected, Error('arg value is passed')); -}); - -test('when args include single dash then result stores dash as positional', () => { - const args = ['-']; - const expected = { values: { __proto__: null }, positionals: ['-'] }; - const result = parseArgs({ allowPositionals: true, args }); - assert.deepStrictEqual(result, expected); -}); - -test('zero config args equals are parsed as if `type: "string"`', () => { - const args = ['--so=wat']; - const options = { }; - const expected = { values: { __proto__: null, so: 'wat' }, positionals: [] }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected, Error('arg value is passed')); -}); - -test('same arg is passed twice `type: "string"` and last value is recorded', () => { - const args = ['--foo=a', '--foo', 'b']; - const options = { foo: { type: 'string' } }; - const expected = { values: { __proto__: null, foo: 'b' }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected, Error('last arg value is passed')); -}); - -test('args equals pass string including more equals', () => { - const args = ['--so=wat=bing']; - const options = { so: { type: 'string' } }; - const expected = { values: { __proto__: null, so: 'wat=bing' }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected, Error('arg value is passed')); -}); - -test('first arg passed for `type: "string"` and "multiple" is in array', () => { - const args = ['--foo=a']; - const options = { foo: { type: 'string', multiple: true } }; - const expected = { values: { __proto__: null, foo: ['a'] }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected, Error('first multiple in array')); -}); - -test('args are passed `type: "string"` and "multiple"', () => { - const args = ['--foo=a', '--foo', 'b']; - const options = { - foo: { - type: 'string', - multiple: true, - }, - }; - const expected = { values: { __proto__: null, foo: ['a', 'b'] }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected, Error('both arg values are passed')); -}); - -test('when expecting `multiple:true` boolean option and option used multiple times then result includes array of ' + - 'booleans matching usage', () => { - const args = ['--foo', '--foo']; - const options = { - foo: { - type: 'boolean', - multiple: true, - }, - }; - const expected = { values: { __proto__: null, foo: [true, true] }, positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('order of option and positional does not matter (per README)', () => { - const args1 = ['--foo=bar', 'baz']; - const args2 = ['baz', '--foo=bar']; - const options = { foo: { type: 'string' } }; - const expected = { values: { __proto__: null, foo: 'bar' }, positionals: ['baz'] }; - assert.deepStrictEqual( - parseArgs({ allowPositionals: true, args: args1, options }), - expected, - Error('option then positional') - ); - assert.deepStrictEqual( - parseArgs({ allowPositionals: true, args: args2, options }), - expected, - Error('positional then option') - ); -}); - -test('correct default args when use node -p', () => { - const holdArgv = process.argv; - process.argv = [process.argv0, '--foo']; - const holdExecArgv = process.execArgv; - process.execArgv = ['-p', '0']; - const result = parseArgs({ strict: false }); - - const expected = { values: { __proto__: null, foo: true }, - positionals: [] }; - assert.deepStrictEqual(result, expected); - process.argv = holdArgv; - process.execArgv = holdExecArgv; -}); - -test('correct default args when use node --print', () => { - const holdArgv = process.argv; - process.argv = [process.argv0, '--foo']; - const holdExecArgv = process.execArgv; - process.execArgv = ['--print', '0']; - const result = parseArgs({ strict: false }); - - const expected = { values: { __proto__: null, foo: true }, - positionals: [] }; - assert.deepStrictEqual(result, expected); - process.argv = holdArgv; - process.execArgv = holdExecArgv; -}); - -test('correct default args when use node -e', () => { - const holdArgv = process.argv; - process.argv = [process.argv0, '--foo']; - const holdExecArgv = process.execArgv; - process.execArgv = ['-e', '0']; - const result = parseArgs({ strict: false }); - - const expected = { values: { __proto__: null, foo: true }, - positionals: [] }; - assert.deepStrictEqual(result, expected); - process.argv = holdArgv; - process.execArgv = holdExecArgv; -}); - -test('correct default args when use node --eval', () => { - const holdArgv = process.argv; - process.argv = [process.argv0, '--foo']; - const holdExecArgv = process.execArgv; - process.execArgv = ['--eval', '0']; - const result = parseArgs({ strict: false }); - const expected = { values: { __proto__: null, foo: true }, - positionals: [] }; - assert.deepStrictEqual(result, expected); - process.argv = holdArgv; - process.execArgv = holdExecArgv; -}); - -test('correct default args when normal arguments', () => { - const holdArgv = process.argv; - process.argv = [process.argv0, 'script.js', '--foo']; - const holdExecArgv = process.execArgv; - process.execArgv = []; - const result = parseArgs({ strict: false }); - - const expected = { values: { __proto__: null, foo: true }, - positionals: [] }; - assert.deepStrictEqual(result, expected); - process.argv = holdArgv; - process.execArgv = holdExecArgv; -}); - -test('excess leading dashes on options are retained', () => { - // Enforce a design decision for an edge case. - const args = ['---triple']; - const options = { }; - const expected = { - values: { '__proto__': null, '-triple': true }, - positionals: [] - }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected, Error('excess option dashes are retained')); -}); - -test('positional arguments are allowed by default in strict:false', () => { - const args = ['foo']; - const options = { }; - const expected = { - values: { __proto__: null }, - positionals: ['foo'] - }; - const result = parseArgs({ strict: false, args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('positional arguments may be explicitly disallowed in strict:false', () => { - const args = ['foo']; - const options = { }; - assert.throws(() => { parseArgs({ strict: false, allowPositionals: false, args, options }); }, { - code: 'ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL' - }); -}); - -// Test bad inputs - -test('invalid argument passed for options', () => { - const args = ['--so=wat']; - const options = 'bad value'; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -test('type property missing for option then throw', () => { - const knownOptions = { foo: { } }; - assert.throws(() => { parseArgs({ options: knownOptions }); }, { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -test('boolean passed to "type" option', () => { - const args = ['--so=wat']; - const options = { foo: { type: true } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -test('invalid union value passed to "type" option', () => { - const args = ['--so=wat']; - const options = { foo: { type: 'str' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_INVALID_ARG_TYPE' - }); -}); - -// Test strict mode - -test('unknown long option --bar', () => { - const args = ['--foo', '--bar']; - const options = { foo: { type: 'boolean' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_PARSE_ARGS_UNKNOWN_OPTION' - }); -}); - -test('unknown short option -b', () => { - const args = ['--foo', '-b']; - const options = { foo: { type: 'boolean' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_PARSE_ARGS_UNKNOWN_OPTION' - }); -}); - -test('unknown option -r in short option group -bar', () => { - const args = ['-bar']; - const options = { b: { type: 'boolean' }, a: { type: 'boolean' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_PARSE_ARGS_UNKNOWN_OPTION' - }); -}); - -test('unknown option with explicit value', () => { - const args = ['--foo', '--bar=baz']; - const options = { foo: { type: 'boolean' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_PARSE_ARGS_UNKNOWN_OPTION' - }); -}); - -test('unexpected positional', () => { - const args = ['foo']; - const options = { foo: { type: 'boolean' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL' - }); -}); - -test('unexpected positional after --', () => { - const args = ['--', 'foo']; - const options = { foo: { type: 'boolean' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_PARSE_ARGS_UNEXPECTED_POSITIONAL' - }); -}); - -test('-- by itself is not a positional', () => { - const args = ['--foo', '--']; - const options = { foo: { type: 'boolean' } }; - const result = parseArgs({ args, options }); - const expected = { values: { __proto__: null, foo: true }, - positionals: [] }; - assert.deepStrictEqual(result, expected); -}); - -test('string option used as boolean', () => { - const args = ['--foo']; - const options = { foo: { type: 'string' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE' - }); -}); - -test('boolean option used with value', () => { - const args = ['--foo=bar']; - const options = { foo: { type: 'boolean' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE' - }); -}); - -test('invalid short option length', () => { - const args = []; - const options = { foo: { short: 'fo', type: 'boolean' } }; - assert.throws(() => { parseArgs({ args, options }); }, { - code: 'ERR_INVALID_ARG_VALUE' - }); -}); - -test('null prototype: when no options then values.toString is undefined', () => { - const result = parseArgs({ args: [] }); - assert.strictEqual(result.values.toString, undefined); -}); - -test('null prototype: when --toString then values.toString is true', () => { - const args = ['--toString']; - const options = { toString: { type: 'boolean' } }; - const expectedResult = { values: { __proto__: null, toString: true }, positionals: [] }; - - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expectedResult); -}); - -const candidateGreedyOptions = [ - '', - '-', - '--', - 'abc', - '123', - '-s', - '--foo', -]; - -candidateGreedyOptions.forEach((value) => { - test(`greedy: when short option with value '${value}' then eaten`, () => { - const args = ['-w', value]; - const options = { with: { type: 'string', short: 'w' } }; - const expectedResult = { values: { __proto__: null, with: value }, positionals: [] }; - - const result = parseArgs({ args, options, strict: false }); - assert.deepStrictEqual(result, expectedResult); - }); - - test(`greedy: when long option with value '${value}' then eaten`, () => { - const args = ['--with', value]; - const options = { with: { type: 'string', short: 'w' } }; - const expectedResult = { values: { __proto__: null, with: value }, positionals: [] }; - - const result = parseArgs({ args, options, strict: false }); - assert.deepStrictEqual(result, expectedResult); - }); -}); - -test('strict: when candidate option value is plain text then does not throw', () => { - const args = ['--with', 'abc']; - const options = { with: { type: 'string' } }; - const expectedResult = { values: { __proto__: null, with: 'abc' }, positionals: [] }; - - const result = parseArgs({ args, options, strict: true }); - assert.deepStrictEqual(result, expectedResult); -}); - -test("strict: when candidate option value is '-' then does not throw", () => { - const args = ['--with', '-']; - const options = { with: { type: 'string' } }; - const expectedResult = { values: { __proto__: null, with: '-' }, positionals: [] }; - - const result = parseArgs({ args, options, strict: true }); - assert.deepStrictEqual(result, expectedResult); -}); - -test("strict: when candidate option value is '--' then throws", () => { - const args = ['--with', '--']; - const options = { with: { type: 'string' } }; - - assert.throws(() => { - parseArgs({ args, options }); - }, { - code: 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE' - }); -}); - -test('strict: when candidate option value is short option then throws', () => { - const args = ['--with', '-a']; - const options = { with: { type: 'string' } }; - - assert.throws(() => { - parseArgs({ args, options }); - }, { - code: 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE' - }); -}); - -test('strict: when candidate option value is short option digit then throws', () => { - const args = ['--with', '-1']; - const options = { with: { type: 'string' } }; - - assert.throws(() => { - parseArgs({ args, options }); - }, { - code: 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE' - }); -}); - -test('strict: when candidate option value is long option then throws', () => { - const args = ['--with', '--foo']; - const options = { with: { type: 'string' } }; - - assert.throws(() => { - parseArgs({ args, options }); - }, { - code: 'ERR_PARSE_ARGS_INVALID_OPTION_VALUE' - }); -}); - -test('strict: when short option and suspect value then throws with short option in error message', () => { - const args = ['-w', '--foo']; - const options = { with: { type: 'string', short: 'w' } }; - - assert.throws(() => { - parseArgs({ args, options }); - }, /for '-w'/ - ); -}); - -test('strict: when long option and suspect value then throws with long option in error message', () => { - const args = ['--with', '--foo']; - const options = { with: { type: 'string' } }; - - assert.throws(() => { - parseArgs({ args, options }); - }, /for '--with'/ - ); -}); - -test('strict: when short option and suspect value then throws with whole expected message', () => { - const args = ['-w', '--foo']; - const options = { with: { type: 'string', short: 'w' } }; - - try { - parseArgs({ args, options }); - } catch (err) { - console.info(err.message); - } - - assert.throws(() => { - parseArgs({ args, options }); - }, /To specify an option argument starting with a dash use '--with=-XYZ' or '-w-XYZ'/ - ); -}); - -test('strict: when long option and suspect value then throws with whole expected message', () => { - const args = ['--with', '--foo']; - const options = { with: { type: 'string', short: 'w' } }; - - assert.throws(() => { - parseArgs({ args, options }); - }, /To specify an option argument starting with a dash use '--with=-XYZ'/ - ); -}); - -test('tokens: positional', () => { - const args = ['one']; - const expectedTokens = [ - { kind: 'positional', index: 0, value: 'one' }, - ]; - const { tokens } = parseArgs({ strict: false, args, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: -- followed by option-like', () => { - const args = ['--', '--foo']; - const expectedTokens = [ - { kind: 'option-terminator', index: 0 }, - { kind: 'positional', index: 1, value: '--foo' }, - ]; - const { tokens } = parseArgs({ strict: false, args, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:true boolean short', () => { - const args = ['-f']; - const options = { - file: { short: 'f', type: 'boolean' } - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '-f', - index: 0, value: undefined, inlineValue: undefined }, - ]; - const { tokens } = parseArgs({ strict: true, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:true boolean long', () => { - const args = ['--file']; - const options = { - file: { short: 'f', type: 'boolean' } - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '--file', - index: 0, value: undefined, inlineValue: undefined }, - ]; - const { tokens } = parseArgs({ strict: true, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false boolean short', () => { - const args = ['-f']; - const expectedTokens = [ - { kind: 'option', name: 'f', rawName: '-f', - index: 0, value: undefined, inlineValue: undefined }, - ]; - const { tokens } = parseArgs({ strict: false, args, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false boolean long', () => { - const args = ['--file']; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '--file', - index: 0, value: undefined, inlineValue: undefined }, - ]; - const { tokens } = parseArgs({ strict: false, args, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false boolean option group', () => { - const args = ['-ab']; - const expectedTokens = [ - { kind: 'option', name: 'a', rawName: '-a', - index: 0, value: undefined, inlineValue: undefined }, - { kind: 'option', name: 'b', rawName: '-b', - index: 0, value: undefined, inlineValue: undefined }, - ]; - const { tokens } = parseArgs({ strict: false, args, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false boolean option group with repeated option', () => { - // Also positional to check index correct after grouop - const args = ['-aa', 'pos']; - const expectedTokens = [ - { kind: 'option', name: 'a', rawName: '-a', - index: 0, value: undefined, inlineValue: undefined }, - { kind: 'option', name: 'a', rawName: '-a', - index: 0, value: undefined, inlineValue: undefined }, - { kind: 'positional', index: 1, value: 'pos' }, - ]; - const { tokens } = parseArgs({ strict: false, allowPositionals: true, args, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:true string short with value after space', () => { - // Also positional to check index correct after out-of-line. - const args = ['-f', 'bar', 'ppp']; - const options = { - file: { short: 'f', type: 'string' } - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '-f', - index: 0, value: 'bar', inlineValue: false }, - { kind: 'positional', index: 2, value: 'ppp' }, - ]; - const { tokens } = parseArgs({ strict: true, allowPositionals: true, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:true string short with value inline', () => { - const args = ['-fBAR']; - const options = { - file: { short: 'f', type: 'string' } - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '-f', - index: 0, value: 'BAR', inlineValue: true }, - ]; - const { tokens } = parseArgs({ strict: true, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false string short missing value', () => { - const args = ['-f']; - const options = { - file: { short: 'f', type: 'string' } - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '-f', - index: 0, value: undefined, inlineValue: undefined }, - ]; - const { tokens } = parseArgs({ strict: false, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:true string long with value after space', () => { - // Also positional to check index correct after out-of-line. - const args = ['--file', 'bar', 'ppp']; - const options = { - file: { short: 'f', type: 'string' } - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '--file', - index: 0, value: 'bar', inlineValue: false }, - { kind: 'positional', index: 2, value: 'ppp' }, - ]; - const { tokens } = parseArgs({ strict: true, allowPositionals: true, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:true string long with value inline', () => { - // Also positional to check index correct after out-of-line. - const args = ['--file=bar', 'pos']; - const options = { - file: { short: 'f', type: 'string' } - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '--file', - index: 0, value: 'bar', inlineValue: true }, - { kind: 'positional', index: 1, value: 'pos' }, - ]; - const { tokens } = parseArgs({ strict: true, allowPositionals: true, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false string long with value inline', () => { - const args = ['--file=bar']; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '--file', - index: 0, value: 'bar', inlineValue: true }, - ]; - const { tokens } = parseArgs({ strict: false, args, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false string long missing value', () => { - const args = ['--file']; - const options = { - file: { short: 'f', type: 'string' } - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '--file', - index: 0, value: undefined, inlineValue: undefined }, - ]; - const { tokens } = parseArgs({ strict: false, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:true complex option group with value after space', () => { - // Also positional to check index correct afterwards. - const args = ['-ab', 'c', 'pos']; - const options = { - alpha: { short: 'a', type: 'boolean' }, - beta: { short: 'b', type: 'string' }, - }; - const expectedTokens = [ - { kind: 'option', name: 'alpha', rawName: '-a', - index: 0, value: undefined, inlineValue: undefined }, - { kind: 'option', name: 'beta', rawName: '-b', - index: 0, value: 'c', inlineValue: false }, - { kind: 'positional', index: 2, value: 'pos' }, - ]; - const { tokens } = parseArgs({ strict: true, allowPositionals: true, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:true complex option group with inline value', () => { - // Also positional to check index correct afterwards. - const args = ['-abc', 'pos']; - const options = { - alpha: { short: 'a', type: 'boolean' }, - beta: { short: 'b', type: 'string' }, - }; - const expectedTokens = [ - { kind: 'option', name: 'alpha', rawName: '-a', - index: 0, value: undefined, inlineValue: undefined }, - { kind: 'option', name: 'beta', rawName: '-b', - index: 0, value: 'c', inlineValue: true }, - { kind: 'positional', index: 1, value: 'pos' }, - ]; - const { tokens } = parseArgs({ strict: true, allowPositionals: true, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false with single dashes', () => { - const args = ['--file', '-', '-']; - const options = { - file: { short: 'f', type: 'string' }, - }; - const expectedTokens = [ - { kind: 'option', name: 'file', rawName: '--file', - index: 0, value: '-', inlineValue: false }, - { kind: 'positional', index: 2, value: '-' }, - ]; - const { tokens } = parseArgs({ strict: false, args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens: strict:false with -- --', () => { - const args = ['--', '--']; - const expectedTokens = [ - { kind: 'option-terminator', index: 0 }, - { kind: 'positional', index: 1, value: '--' }, - ]; - const { tokens } = parseArgs({ strict: false, args, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('default must be a boolean when option type is boolean', () => { - const args = []; - const options = { alpha: { type: 'boolean', default: 'not a boolean' } }; - assert.throws(() => { - parseArgs({ args, options }); - }, /"options\.alpha\.default" property must be of type boolean/ - ); -}); - -test('default must accept undefined value', () => { - const args = []; - const options = { alpha: { type: 'boolean', default: undefined } }; - const result = parseArgs({ args, options }); - const expected = { - values: { - __proto__: null, - }, - positionals: [] - }; - assert.deepStrictEqual(result, expected); -}); - -test('default must be a boolean array when option type is boolean and multiple', () => { - const args = []; - const options = { alpha: { type: 'boolean', multiple: true, default: 'not an array' } }; - assert.throws(() => { - parseArgs({ args, options }); - }, /"options\.alpha\.default" property must be an instance of Array/ - ); -}); - -test('default must be a boolean array when option type is string and multiple is true', () => { - const args = []; - const options = { alpha: { type: 'boolean', multiple: true, default: [true, true, 42] } }; - assert.throws(() => { - parseArgs({ args, options }); - }, /"options\.alpha\.default\[2\]" property must be of type boolean/ - ); -}); - -test('default must be a string when option type is string', () => { - const args = []; - const options = { alpha: { type: 'string', default: true } }; - assert.throws(() => { - parseArgs({ args, options }); - }, /"options\.alpha\.default" property must be of type string/ - ); -}); - -test('default must be an array when option type is string and multiple is true', () => { - const args = []; - const options = { alpha: { type: 'string', multiple: true, default: 'not an array' } }; - assert.throws(() => { - parseArgs({ args, options }); - }, /"options\.alpha\.default" property must be an instance of Array/ - ); -}); - -test('default must be a string array when option type is string and multiple is true', () => { - const args = []; - const options = { alpha: { type: 'string', multiple: true, default: ['str', 42] } }; - assert.throws(() => { - parseArgs({ args, options }); - }, /"options\.alpha\.default\[1\]" property must be of type string/ - ); -}); - -test('default accepted input when multiple is true', () => { - const args = ['--inputStringArr', 'c', '--inputStringArr', 'd', '--inputBoolArr', '--inputBoolArr']; - const options = { - inputStringArr: { type: 'string', multiple: true, default: ['a', 'b'] }, - emptyStringArr: { type: 'string', multiple: true, default: [] }, - fullStringArr: { type: 'string', multiple: true, default: ['a', 'b'] }, - inputBoolArr: { type: 'boolean', multiple: true, default: [false, true, false] }, - emptyBoolArr: { type: 'boolean', multiple: true, default: [] }, - fullBoolArr: { type: 'boolean', multiple: true, default: [false, true, false] }, - }; - const expected = { values: { __proto__: null, - inputStringArr: ['c', 'd'], - inputBoolArr: [true, true], - emptyStringArr: [], - fullStringArr: ['a', 'b'], - emptyBoolArr: [], - fullBoolArr: [false, true, false] }, - positionals: [] }; - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('when default is set, the option must be added as result', () => { - const args = []; - const options = { - a: { type: 'string', default: 'HELLO' }, - b: { type: 'boolean', default: false }, - c: { type: 'boolean', default: true } - }; - const expected = { values: { __proto__: null, a: 'HELLO', b: false, c: true }, positionals: [] }; - - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('when default is set, the args value takes precedence', () => { - const args = ['--a', 'WORLD', '--b', '-c']; - const options = { - a: { type: 'string', default: 'HELLO' }, - b: { type: 'boolean', default: false }, - c: { type: 'boolean', default: true } - }; - const expected = { values: { __proto__: null, a: 'WORLD', b: true, c: true }, positionals: [] }; - - const result = parseArgs({ args, options }); - assert.deepStrictEqual(result, expected); -}); - -test('tokens should not include the default options', () => { - const args = []; - const options = { - a: { type: 'string', default: 'HELLO' }, - b: { type: 'boolean', default: false }, - c: { type: 'boolean', default: true } - }; - - const expectedTokens = []; - - const { tokens } = parseArgs({ args, options, tokens: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('tokens:true should not include the default options after the args input', () => { - const args = ['--z', 'zero', 'positional-item']; - const options = { - z: { type: 'string' }, - a: { type: 'string', default: 'HELLO' }, - b: { type: 'boolean', default: false }, - c: { type: 'boolean', default: true } - }; - - const expectedTokens = [ - { kind: 'option', name: 'z', rawName: '--z', index: 0, value: 'zero', inlineValue: false }, - { kind: 'positional', index: 2, value: 'positional-item' }, - ]; - - const { tokens } = parseArgs({ args, options, tokens: true, allowPositionals: true }); - assert.deepStrictEqual(tokens, expectedTokens); -}); - -test('proto as default value must be ignored', () => { - const args = []; - const options = Object.create(null); - - // eslint-disable-next-line no-proto - options.__proto__ = { type: 'string', default: 'HELLO' }; - - const result = parseArgs({ args, options, allowPositionals: true }); - const expected = { values: { __proto__: null }, positionals: [] }; - assert.deepStrictEqual(result, expected); -}); - - -test('multiple as false should expect a String', () => { - const args = []; - const options = { alpha: { type: 'string', multiple: false, default: ['array'] } }; - assert.throws(() => { - parseArgs({ args, options }); - }, /"options\.alpha\.default" property must be of type string/ - ); -}); diff --git a/cli/tests/node_compat/test/parallel/test-path-basename.js b/cli/tests/node_compat/test/parallel/test-path-basename.js deleted file mode 100644 index 9e8e9ecf8..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-basename.js +++ /dev/null @@ -1,83 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const path = require('path'); - -assert.strictEqual(path.basename(__filename), 'test-path-basename.js'); -assert.strictEqual(path.basename(__filename, '.js'), 'test-path-basename'); -assert.strictEqual(path.basename('.js', '.js'), ''); -assert.strictEqual(path.basename('js', '.js'), 'js'); -assert.strictEqual(path.basename('file.js', '.ts'), 'file.js'); -assert.strictEqual(path.basename('file', '.js'), 'file'); -assert.strictEqual(path.basename('file.js.old', '.js.old'), 'file'); -assert.strictEqual(path.basename(''), ''); -assert.strictEqual(path.basename('/dir/basename.ext'), 'basename.ext'); -assert.strictEqual(path.basename('/basename.ext'), 'basename.ext'); -assert.strictEqual(path.basename('basename.ext'), 'basename.ext'); -assert.strictEqual(path.basename('basename.ext/'), 'basename.ext'); -assert.strictEqual(path.basename('basename.ext//'), 'basename.ext'); -assert.strictEqual(path.basename('aaa/bbb', '/bbb'), 'bbb'); -assert.strictEqual(path.basename('aaa/bbb', 'a/bbb'), 'bbb'); -assert.strictEqual(path.basename('aaa/bbb', 'bbb'), 'bbb'); -assert.strictEqual(path.basename('aaa/bbb//', 'bbb'), 'bbb'); -assert.strictEqual(path.basename('aaa/bbb', 'bb'), 'b'); -assert.strictEqual(path.basename('aaa/bbb', 'b'), 'bb'); -assert.strictEqual(path.basename('/aaa/bbb', '/bbb'), 'bbb'); -assert.strictEqual(path.basename('/aaa/bbb', 'a/bbb'), 'bbb'); -assert.strictEqual(path.basename('/aaa/bbb', 'bbb'), 'bbb'); -assert.strictEqual(path.basename('/aaa/bbb//', 'bbb'), 'bbb'); -assert.strictEqual(path.basename('/aaa/bbb', 'bb'), 'b'); -assert.strictEqual(path.basename('/aaa/bbb', 'b'), 'bb'); -assert.strictEqual(path.basename('/aaa/bbb'), 'bbb'); -assert.strictEqual(path.basename('/aaa/'), 'aaa'); -assert.strictEqual(path.basename('/aaa/b'), 'b'); -assert.strictEqual(path.basename('/a/b'), 'b'); -assert.strictEqual(path.basename('//a'), 'a'); -assert.strictEqual(path.basename('a', 'a'), ''); - -// On Windows a backslash acts as a path separator. -assert.strictEqual(path.win32.basename('\\dir\\basename.ext'), 'basename.ext'); -assert.strictEqual(path.win32.basename('\\basename.ext'), 'basename.ext'); -assert.strictEqual(path.win32.basename('basename.ext'), 'basename.ext'); -assert.strictEqual(path.win32.basename('basename.ext\\'), 'basename.ext'); -assert.strictEqual(path.win32.basename('basename.ext\\\\'), 'basename.ext'); -assert.strictEqual(path.win32.basename('foo'), 'foo'); -assert.strictEqual(path.win32.basename('aaa\\bbb', '\\bbb'), 'bbb'); -assert.strictEqual(path.win32.basename('aaa\\bbb', 'a\\bbb'), 'bbb'); -assert.strictEqual(path.win32.basename('aaa\\bbb', 'bbb'), 'bbb'); -assert.strictEqual(path.win32.basename('aaa\\bbb\\\\\\\\', 'bbb'), 'bbb'); -assert.strictEqual(path.win32.basename('aaa\\bbb', 'bb'), 'b'); -assert.strictEqual(path.win32.basename('aaa\\bbb', 'b'), 'bb'); -assert.strictEqual(path.win32.basename('C:'), ''); -assert.strictEqual(path.win32.basename('C:.'), '.'); -assert.strictEqual(path.win32.basename('C:\\'), ''); -assert.strictEqual(path.win32.basename('C:\\dir\\base.ext'), 'base.ext'); -assert.strictEqual(path.win32.basename('C:\\basename.ext'), 'basename.ext'); -assert.strictEqual(path.win32.basename('C:basename.ext'), 'basename.ext'); -assert.strictEqual(path.win32.basename('C:basename.ext\\'), 'basename.ext'); -assert.strictEqual(path.win32.basename('C:basename.ext\\\\'), 'basename.ext'); -assert.strictEqual(path.win32.basename('C:foo'), 'foo'); -assert.strictEqual(path.win32.basename('file:stream'), 'file:stream'); -assert.strictEqual(path.win32.basename('a', 'a'), ''); - -// On unix a backslash is just treated as any other character. -assert.strictEqual(path.posix.basename('\\dir\\basename.ext'), - '\\dir\\basename.ext'); -assert.strictEqual(path.posix.basename('\\basename.ext'), '\\basename.ext'); -assert.strictEqual(path.posix.basename('basename.ext'), 'basename.ext'); -assert.strictEqual(path.posix.basename('basename.ext\\'), 'basename.ext\\'); -assert.strictEqual(path.posix.basename('basename.ext\\\\'), 'basename.ext\\\\'); -assert.strictEqual(path.posix.basename('foo'), 'foo'); - -// POSIX filenames may include control characters -// c.f. http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html -const controlCharFilename = `Icon${String.fromCharCode(13)}`; -assert.strictEqual(path.posix.basename(`/a/b/${controlCharFilename}`), - controlCharFilename); diff --git a/cli/tests/node_compat/test/parallel/test-path-dirname.js b/cli/tests/node_compat/test/parallel/test-path-dirname.js deleted file mode 100644 index 0b123fcdf..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-dirname.js +++ /dev/null @@ -1,66 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const path = require('path'); - -assert.strictEqual(path.dirname(__filename).substr(-13), - common.isWindows ? 'test\\parallel' : 'test/parallel'); - -assert.strictEqual(path.posix.dirname('/a/b/'), '/a'); -assert.strictEqual(path.posix.dirname('/a/b'), '/a'); -assert.strictEqual(path.posix.dirname('/a'), '/'); -assert.strictEqual(path.posix.dirname(''), '.'); -assert.strictEqual(path.posix.dirname('/'), '/'); -assert.strictEqual(path.posix.dirname('////'), '/'); -assert.strictEqual(path.posix.dirname('//a'), '//'); -assert.strictEqual(path.posix.dirname('foo'), '.'); - -assert.strictEqual(path.win32.dirname('c:\\'), 'c:\\'); -assert.strictEqual(path.win32.dirname('c:\\foo'), 'c:\\'); -assert.strictEqual(path.win32.dirname('c:\\foo\\'), 'c:\\'); -assert.strictEqual(path.win32.dirname('c:\\foo\\bar'), 'c:\\foo'); -assert.strictEqual(path.win32.dirname('c:\\foo\\bar\\'), 'c:\\foo'); -assert.strictEqual(path.win32.dirname('c:\\foo\\bar\\baz'), 'c:\\foo\\bar'); -assert.strictEqual(path.win32.dirname('c:\\foo bar\\baz'), 'c:\\foo bar'); -assert.strictEqual(path.win32.dirname('\\'), '\\'); -assert.strictEqual(path.win32.dirname('\\foo'), '\\'); -assert.strictEqual(path.win32.dirname('\\foo\\'), '\\'); -assert.strictEqual(path.win32.dirname('\\foo\\bar'), '\\foo'); -assert.strictEqual(path.win32.dirname('\\foo\\bar\\'), '\\foo'); -assert.strictEqual(path.win32.dirname('\\foo\\bar\\baz'), '\\foo\\bar'); -assert.strictEqual(path.win32.dirname('\\foo bar\\baz'), '\\foo bar'); -assert.strictEqual(path.win32.dirname('c:'), 'c:'); -assert.strictEqual(path.win32.dirname('c:foo'), 'c:'); -assert.strictEqual(path.win32.dirname('c:foo\\'), 'c:'); -assert.strictEqual(path.win32.dirname('c:foo\\bar'), 'c:foo'); -assert.strictEqual(path.win32.dirname('c:foo\\bar\\'), 'c:foo'); -assert.strictEqual(path.win32.dirname('c:foo\\bar\\baz'), 'c:foo\\bar'); -assert.strictEqual(path.win32.dirname('c:foo bar\\baz'), 'c:foo bar'); -assert.strictEqual(path.win32.dirname('file:stream'), '.'); -assert.strictEqual(path.win32.dirname('dir\\file:stream'), 'dir'); -assert.strictEqual(path.win32.dirname('\\\\unc\\share'), - '\\\\unc\\share'); -assert.strictEqual(path.win32.dirname('\\\\unc\\share\\foo'), - '\\\\unc\\share\\'); -assert.strictEqual(path.win32.dirname('\\\\unc\\share\\foo\\'), - '\\\\unc\\share\\'); -assert.strictEqual(path.win32.dirname('\\\\unc\\share\\foo\\bar'), - '\\\\unc\\share\\foo'); -assert.strictEqual(path.win32.dirname('\\\\unc\\share\\foo\\bar\\'), - '\\\\unc\\share\\foo'); -assert.strictEqual(path.win32.dirname('\\\\unc\\share\\foo\\bar\\baz'), - '\\\\unc\\share\\foo\\bar'); -assert.strictEqual(path.win32.dirname('/a/b/'), '/a'); -assert.strictEqual(path.win32.dirname('/a/b'), '/a'); -assert.strictEqual(path.win32.dirname('/a'), '/'); -assert.strictEqual(path.win32.dirname(''), '.'); -assert.strictEqual(path.win32.dirname('/'), '/'); -assert.strictEqual(path.win32.dirname('////'), '/'); -assert.strictEqual(path.win32.dirname('foo'), '.'); diff --git a/cli/tests/node_compat/test/parallel/test-path-extname.js b/cli/tests/node_compat/test/parallel/test-path-extname.js deleted file mode 100644 index d1ed0342b..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-extname.js +++ /dev/null @@ -1,106 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const path = require('path'); - -const failures = []; -const slashRE = /\//g; - -[ - [__filename, '.js'], - ['', ''], - ['/path/to/file', ''], - ['/path/to/file.ext', '.ext'], - ['/path.to/file.ext', '.ext'], - ['/path.to/file', ''], - ['/path.to/.file', ''], - ['/path.to/.file.ext', '.ext'], - ['/path/to/f.ext', '.ext'], - ['/path/to/..ext', '.ext'], - ['/path/to/..', ''], - ['file', ''], - ['file.ext', '.ext'], - ['.file', ''], - ['.file.ext', '.ext'], - ['/file', ''], - ['/file.ext', '.ext'], - ['/.file', ''], - ['/.file.ext', '.ext'], - ['.path/file.ext', '.ext'], - ['file.ext.ext', '.ext'], - ['file.', '.'], - ['.', ''], - ['./', ''], - ['.file.ext', '.ext'], - ['.file', ''], - ['.file.', '.'], - ['.file..', '.'], - ['..', ''], - ['../', ''], - ['..file.ext', '.ext'], - ['..file', '.file'], - ['..file.', '.'], - ['..file..', '.'], - ['...', '.'], - ['...ext', '.ext'], - ['....', '.'], - ['file.ext/', '.ext'], - ['file.ext//', '.ext'], - ['file/', ''], - ['file//', ''], - ['file./', '.'], - ['file.//', '.'], -].forEach((test) => { - const expected = test[1]; - [path.posix.extname, path.win32.extname].forEach((extname) => { - let input = test[0]; - let os; - if (extname === path.win32.extname) { - input = input.replace(slashRE, '\\'); - os = 'win32'; - } else { - os = 'posix'; - } - const actual = extname(input); - const message = `path.${os}.extname(${JSON.stringify(input)})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; - if (actual !== expected) - failures.push(`\n${message}`); - }); - { - const input = `C:${test[0].replace(slashRE, '\\')}`; - const actual = path.win32.extname(input); - const message = `path.win32.extname(${JSON.stringify(input)})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; - if (actual !== expected) - failures.push(`\n${message}`); - } -}); -assert.strictEqual(failures.length, 0, failures.join('')); - -// On Windows, backslash is a path separator. -assert.strictEqual(path.win32.extname('.\\'), ''); -assert.strictEqual(path.win32.extname('..\\'), ''); -assert.strictEqual(path.win32.extname('file.ext\\'), '.ext'); -assert.strictEqual(path.win32.extname('file.ext\\\\'), '.ext'); -assert.strictEqual(path.win32.extname('file\\'), ''); -assert.strictEqual(path.win32.extname('file\\\\'), ''); -assert.strictEqual(path.win32.extname('file.\\'), '.'); -assert.strictEqual(path.win32.extname('file.\\\\'), '.'); - -// On *nix, backslash is a valid name component like any other character. -assert.strictEqual(path.posix.extname('.\\'), ''); -assert.strictEqual(path.posix.extname('..\\'), '.\\'); -assert.strictEqual(path.posix.extname('file.ext\\'), '.ext\\'); -assert.strictEqual(path.posix.extname('file.ext\\\\'), '.ext\\\\'); -assert.strictEqual(path.posix.extname('file\\'), ''); -assert.strictEqual(path.posix.extname('file\\\\'), ''); -assert.strictEqual(path.posix.extname('file.\\'), '.\\'); -assert.strictEqual(path.posix.extname('file.\\\\'), '.\\\\'); diff --git a/cli/tests/node_compat/test/parallel/test-path-isabsolute.js b/cli/tests/node_compat/test/parallel/test-path-isabsolute.js deleted file mode 100644 index ff64fc7ff..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-isabsolute.js +++ /dev/null @@ -1,35 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const path = require('path'); - -assert.strictEqual(path.win32.isAbsolute('/'), true); -assert.strictEqual(path.win32.isAbsolute('//'), true); -assert.strictEqual(path.win32.isAbsolute('//server'), true); -assert.strictEqual(path.win32.isAbsolute('//server/file'), true); -assert.strictEqual(path.win32.isAbsolute('\\\\server\\file'), true); -assert.strictEqual(path.win32.isAbsolute('\\\\server'), true); -assert.strictEqual(path.win32.isAbsolute('\\\\'), true); -assert.strictEqual(path.win32.isAbsolute('c'), false); -assert.strictEqual(path.win32.isAbsolute('c:'), false); -assert.strictEqual(path.win32.isAbsolute('c:\\'), true); -assert.strictEqual(path.win32.isAbsolute('c:/'), true); -assert.strictEqual(path.win32.isAbsolute('c://'), true); -assert.strictEqual(path.win32.isAbsolute('C:/Users/'), true); -assert.strictEqual(path.win32.isAbsolute('C:\\Users\\'), true); -assert.strictEqual(path.win32.isAbsolute('C:cwd/another'), false); -assert.strictEqual(path.win32.isAbsolute('C:cwd\\another'), false); -assert.strictEqual(path.win32.isAbsolute('directory/directory'), false); -assert.strictEqual(path.win32.isAbsolute('directory\\directory'), false); - -assert.strictEqual(path.posix.isAbsolute('/home/foo'), true); -assert.strictEqual(path.posix.isAbsolute('/home/foo/..'), true); -assert.strictEqual(path.posix.isAbsolute('bar/'), false); -assert.strictEqual(path.posix.isAbsolute('./baz'), false); diff --git a/cli/tests/node_compat/test/parallel/test-path-join.js b/cli/tests/node_compat/test/parallel/test-path-join.js deleted file mode 100644 index 2b958b720..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-join.js +++ /dev/null @@ -1,150 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const path = require('path'); - -const failures = []; -const backslashRE = /\\/g; - -const joinTests = [ - [ [path.posix.join, path.win32.join], - // Arguments result - [[['.', 'x/b', '..', '/b/c.js'], 'x/b/c.js'], - [[], '.'], - [['/.', 'x/b', '..', '/b/c.js'], '/x/b/c.js'], - [['/foo', '../../../bar'], '/bar'], - [['foo', '../../../bar'], '../../bar'], - [['foo/', '../../../bar'], '../../bar'], - [['foo/x', '../../../bar'], '../bar'], - [['foo/x', './bar'], 'foo/x/bar'], - [['foo/x/', './bar'], 'foo/x/bar'], - [['foo/x/', '.', 'bar'], 'foo/x/bar'], - [['./'], './'], - [['.', './'], './'], - [['.', '.', '.'], '.'], - [['.', './', '.'], '.'], - [['.', '/./', '.'], '.'], - [['.', '/////./', '.'], '.'], - [['.'], '.'], - [['', '.'], '.'], - [['', 'foo'], 'foo'], - [['foo', '/bar'], 'foo/bar'], - [['', '/foo'], '/foo'], - [['', '', '/foo'], '/foo'], - [['', '', 'foo'], 'foo'], - [['foo', ''], 'foo'], - [['foo/', ''], 'foo/'], - [['foo', '', '/bar'], 'foo/bar'], - [['./', '..', '/foo'], '../foo'], - [['./', '..', '..', '/foo'], '../../foo'], - [['.', '..', '..', '/foo'], '../../foo'], - [['', '..', '..', '/foo'], '../../foo'], - [['/'], '/'], - [['/', '.'], '/'], - [['/', '..'], '/'], - [['/', '..', '..'], '/'], - [[''], '.'], - [['', ''], '.'], - [[' /foo'], ' /foo'], - [[' ', 'foo'], ' /foo'], - [[' ', '.'], ' '], - [[' ', '/'], ' /'], - [[' ', ''], ' '], - [['/', 'foo'], '/foo'], - [['/', '/foo'], '/foo'], - [['/', '//foo'], '/foo'], - [['/', '', '/foo'], '/foo'], - [['', '/', 'foo'], '/foo'], - [['', '/', '/foo'], '/foo'], - ], - ], -]; - -// Windows-specific join tests -joinTests.push([ - path.win32.join, - joinTests[0][1].slice(0).concat( - [// Arguments result - // UNC path expected - [['//foo/bar'], '\\\\foo\\bar\\'], - [['\\/foo/bar'], '\\\\foo\\bar\\'], - [['\\\\foo/bar'], '\\\\foo\\bar\\'], - // UNC path expected - server and share separate - [['//foo', 'bar'], '\\\\foo\\bar\\'], - [['//foo/', 'bar'], '\\\\foo\\bar\\'], - [['//foo', '/bar'], '\\\\foo\\bar\\'], - // UNC path expected - questionable - [['//foo', '', 'bar'], '\\\\foo\\bar\\'], - [['//foo/', '', 'bar'], '\\\\foo\\bar\\'], - [['//foo/', '', '/bar'], '\\\\foo\\bar\\'], - // UNC path expected - even more questionable - [['', '//foo', 'bar'], '\\\\foo\\bar\\'], - [['', '//foo/', 'bar'], '\\\\foo\\bar\\'], - [['', '//foo/', '/bar'], '\\\\foo\\bar\\'], - // No UNC path expected (no double slash in first component) - [['\\', 'foo/bar'], '\\foo\\bar'], - [['\\', '/foo/bar'], '\\foo\\bar'], - [['', '/', '/foo/bar'], '\\foo\\bar'], - // No UNC path expected (no non-slashes in first component - - // questionable) - [['//', 'foo/bar'], '\\foo\\bar'], - [['//', '/foo/bar'], '\\foo\\bar'], - [['\\\\', '/', '/foo/bar'], '\\foo\\bar'], - [['//'], '\\'], - // No UNC path expected (share name missing - questionable). - [['//foo'], '\\foo'], - [['//foo/'], '\\foo\\'], - [['//foo', '/'], '\\foo\\'], - [['//foo', '', '/'], '\\foo\\'], - // No UNC path expected (too many leading slashes - questionable) - [['///foo/bar'], '\\foo\\bar'], - [['////foo', 'bar'], '\\foo\\bar'], - [['\\\\\\/foo/bar'], '\\foo\\bar'], - // Drive-relative vs drive-absolute paths. This merely describes the - // status quo, rather than being obviously right - [['c:'], 'c:.'], - [['c:.'], 'c:.'], - [['c:', ''], 'c:.'], - [['', 'c:'], 'c:.'], - [['c:.', '/'], 'c:.\\'], - [['c:.', 'file'], 'c:file'], - [['c:', '/'], 'c:\\'], - [['c:', 'file'], 'c:\\file'], - ] - ), -]); -joinTests.forEach((test) => { - if (!Array.isArray(test[0])) - test[0] = [test[0]]; - test[0].forEach((join) => { - test[1].forEach((test) => { - const actual = join.apply(null, test[0]); - const expected = test[1]; - // For non-Windows specific tests with the Windows join(), we need to try - // replacing the slashes since the non-Windows specific tests' `expected` - // use forward slashes - let actualAlt; - let os; - if (join === path.win32.join) { - actualAlt = actual.replace(backslashRE, '/'); - os = 'win32'; - } else { - os = 'posix'; - } - if (actual !== expected && actualAlt !== expected) { - const delimiter = test[0].map(JSON.stringify).join(','); - const message = `path.${os}.join(${delimiter})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; - failures.push(`\n${message}`); - } - }); - }); -}); -assert.strictEqual(failures.length, 0, failures.join('')); diff --git a/cli/tests/node_compat/test/parallel/test-path-makelong.js b/cli/tests/node_compat/test/parallel/test-path-makelong.js deleted file mode 100644 index 694240109..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-makelong.js +++ /dev/null @@ -1,94 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 fixtures = require('../common/fixtures'); -const assert = require('assert'); -const path = require('path'); - -if (common.isWindows) { - const file = fixtures.path('a.js'); - const resolvedFile = path.resolve(file); - - assert.strictEqual(path.toNamespacedPath(file), - `\\\\?\\${resolvedFile}`); - assert.strictEqual(path.toNamespacedPath(`\\\\?\\${file}`), - `\\\\?\\${resolvedFile}`); - assert.strictEqual(path.toNamespacedPath( - '\\\\someserver\\someshare\\somefile'), - '\\\\?\\UNC\\someserver\\someshare\\somefile'); - assert.strictEqual(path.toNamespacedPath( - '\\\\?\\UNC\\someserver\\someshare\\somefile'), - '\\\\?\\UNC\\someserver\\someshare\\somefile'); - assert.strictEqual(path.toNamespacedPath('\\\\.\\pipe\\somepipe'), - '\\\\.\\pipe\\somepipe'); -} - -assert.strictEqual(path.toNamespacedPath(''), ''); -assert.strictEqual(path.toNamespacedPath(null), null); -assert.strictEqual(path.toNamespacedPath(100), 100); -assert.strictEqual(path.toNamespacedPath(path), path); -assert.strictEqual(path.toNamespacedPath(false), false); -assert.strictEqual(path.toNamespacedPath(true), true); - -const emptyObj = {}; -assert.strictEqual(path.posix.toNamespacedPath('/foo/bar'), '/foo/bar'); -assert.strictEqual(path.posix.toNamespacedPath('foo/bar'), 'foo/bar'); -assert.strictEqual(path.posix.toNamespacedPath(null), null); -assert.strictEqual(path.posix.toNamespacedPath(true), true); -assert.strictEqual(path.posix.toNamespacedPath(1), 1); -assert.strictEqual(path.posix.toNamespacedPath(), undefined); -assert.strictEqual(path.posix.toNamespacedPath(emptyObj), emptyObj); -if (common.isWindows) { - // These tests cause resolve() to insert the cwd, so we cannot test them from - // non-Windows platforms (easily) - assert.strictEqual(path.toNamespacedPath(''), ''); - assert.strictEqual(path.win32.toNamespacedPath('foo\\bar').toLowerCase(), - `\\\\?\\${process.cwd().toLowerCase()}\\foo\\bar`); - assert.strictEqual(path.win32.toNamespacedPath('foo/bar').toLowerCase(), - `\\\\?\\${process.cwd().toLowerCase()}\\foo\\bar`); - const currentDeviceLetter = path.parse(process.cwd()).root.substring(0, 2); - assert.strictEqual( - path.win32.toNamespacedPath(currentDeviceLetter).toLowerCase(), - `\\\\?\\${process.cwd().toLowerCase()}`); - assert.strictEqual(path.win32.toNamespacedPath('C').toLowerCase(), - `\\\\?\\${process.cwd().toLowerCase()}\\c`); -} -assert.strictEqual(path.win32.toNamespacedPath('C:\\foo'), '\\\\?\\C:\\foo'); -assert.strictEqual(path.win32.toNamespacedPath('C:/foo'), '\\\\?\\C:\\foo'); -assert.strictEqual(path.win32.toNamespacedPath('\\\\foo\\bar'), - '\\\\?\\UNC\\foo\\bar\\'); -assert.strictEqual(path.win32.toNamespacedPath('//foo//bar'), - '\\\\?\\UNC\\foo\\bar\\'); -assert.strictEqual(path.win32.toNamespacedPath('\\\\?\\foo'), '\\\\?\\foo'); -assert.strictEqual(path.win32.toNamespacedPath(null), null); -assert.strictEqual(path.win32.toNamespacedPath(true), true); -assert.strictEqual(path.win32.toNamespacedPath(1), 1); -assert.strictEqual(path.win32.toNamespacedPath(), undefined); -assert.strictEqual(path.win32.toNamespacedPath(emptyObj), emptyObj); diff --git a/cli/tests/node_compat/test/parallel/test-path-normalize.js b/cli/tests/node_compat/test/parallel/test-path-normalize.js deleted file mode 100644 index 543be42e6..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-normalize.js +++ /dev/null @@ -1,79 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const path = require('path'); - -assert.strictEqual(path.win32.normalize('./fixtures///b/../b/c.js'), - 'fixtures\\b\\c.js'); -assert.strictEqual(path.win32.normalize('/foo/../../../bar'), '\\bar'); -assert.strictEqual(path.win32.normalize('a//b//../b'), 'a\\b'); -assert.strictEqual(path.win32.normalize('a//b//./c'), 'a\\b\\c'); -assert.strictEqual(path.win32.normalize('a//b//.'), 'a\\b'); -assert.strictEqual(path.win32.normalize('//server/share/dir/file.ext'), - '\\\\server\\share\\dir\\file.ext'); -assert.strictEqual(path.win32.normalize('/a/b/c/../../../x/y/z'), '\\x\\y\\z'); -assert.strictEqual(path.win32.normalize('C:'), 'C:.'); -assert.strictEqual(path.win32.normalize('C:..\\abc'), 'C:..\\abc'); -assert.strictEqual(path.win32.normalize('C:..\\..\\abc\\..\\def'), - 'C:..\\..\\def'); -assert.strictEqual(path.win32.normalize('C:\\.'), 'C:\\'); -assert.strictEqual(path.win32.normalize('file:stream'), 'file:stream'); -assert.strictEqual(path.win32.normalize('bar\\foo..\\..\\'), 'bar\\'); -assert.strictEqual(path.win32.normalize('bar\\foo..\\..'), 'bar'); -assert.strictEqual(path.win32.normalize('bar\\foo..\\..\\baz'), 'bar\\baz'); -assert.strictEqual(path.win32.normalize('bar\\foo..\\'), 'bar\\foo..\\'); -assert.strictEqual(path.win32.normalize('bar\\foo..'), 'bar\\foo..'); -assert.strictEqual(path.win32.normalize('..\\foo..\\..\\..\\bar'), - '..\\..\\bar'); -assert.strictEqual(path.win32.normalize('..\\...\\..\\.\\...\\..\\..\\bar'), - '..\\..\\bar'); -assert.strictEqual(path.win32.normalize('../../../foo/../../../bar'), - '..\\..\\..\\..\\..\\bar'); -assert.strictEqual(path.win32.normalize('../../../foo/../../../bar/../../'), - '..\\..\\..\\..\\..\\..\\'); -assert.strictEqual( - path.win32.normalize('../foobar/barfoo/foo/../../../bar/../../'), - '..\\..\\' -); -assert.strictEqual( - path.win32.normalize('../.../../foobar/../../../bar/../../baz'), - '..\\..\\..\\..\\baz' -); -assert.strictEqual(path.win32.normalize('foo/bar\\baz'), 'foo\\bar\\baz'); - -assert.strictEqual(path.posix.normalize('./fixtures///b/../b/c.js'), - 'fixtures/b/c.js'); -assert.strictEqual(path.posix.normalize('/foo/../../../bar'), '/bar'); -assert.strictEqual(path.posix.normalize('a//b//../b'), 'a/b'); -assert.strictEqual(path.posix.normalize('a//b//./c'), 'a/b/c'); -assert.strictEqual(path.posix.normalize('a//b//.'), 'a/b'); -assert.strictEqual(path.posix.normalize('/a/b/c/../../../x/y/z'), '/x/y/z'); -assert.strictEqual(path.posix.normalize('///..//./foo/.//bar'), '/foo/bar'); -assert.strictEqual(path.posix.normalize('bar/foo../../'), 'bar/'); -assert.strictEqual(path.posix.normalize('bar/foo../..'), 'bar'); -assert.strictEqual(path.posix.normalize('bar/foo../../baz'), 'bar/baz'); -assert.strictEqual(path.posix.normalize('bar/foo../'), 'bar/foo../'); -assert.strictEqual(path.posix.normalize('bar/foo..'), 'bar/foo..'); -assert.strictEqual(path.posix.normalize('../foo../../../bar'), '../../bar'); -assert.strictEqual(path.posix.normalize('../.../.././.../../../bar'), - '../../bar'); -assert.strictEqual(path.posix.normalize('../../../foo/../../../bar'), - '../../../../../bar'); -assert.strictEqual(path.posix.normalize('../../../foo/../../../bar/../../'), - '../../../../../../'); -assert.strictEqual( - path.posix.normalize('../foobar/barfoo/foo/../../../bar/../../'), - '../../' -); -assert.strictEqual( - path.posix.normalize('../.../../foobar/../../../bar/../../baz'), - '../../../../baz' -); -assert.strictEqual(path.posix.normalize('foo/bar\\baz'), 'foo/bar\\baz'); diff --git a/cli/tests/node_compat/test/parallel/test-path-parse-format.js b/cli/tests/node_compat/test/parallel/test-path-parse-format.js deleted file mode 100644 index 657503d3c..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-parse-format.js +++ /dev/null @@ -1,233 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 path = require('path'); - -const winPaths = [ - // [path, root] - ['C:\\path\\dir\\index.html', 'C:\\'], - ['C:\\another_path\\DIR\\1\\2\\33\\\\index', 'C:\\'], - ['another_path\\DIR with spaces\\1\\2\\33\\index', ''], - ['\\', '\\'], - ['\\foo\\C:', '\\'], - ['file', ''], - ['file:stream', ''], - ['.\\file', ''], - ['C:', 'C:'], - ['C:.', 'C:'], - ['C:..', 'C:'], - ['C:abc', 'C:'], - ['C:\\', 'C:\\'], - ['C:\\abc', 'C:\\' ], - ['', ''], - - // unc - ['\\\\server\\share\\file_path', '\\\\server\\share\\'], - ['\\\\server two\\shared folder\\file path.zip', - '\\\\server two\\shared folder\\'], - ['\\\\teela\\admin$\\system32', '\\\\teela\\admin$\\'], - ['\\\\?\\UNC\\server\\share', '\\\\?\\UNC\\'], -]; - -const winSpecialCaseParseTests = [ - ['t', { base: 't', name: 't', root: '', dir: '', ext: '' }], - ['/foo/bar', { root: '/', dir: '/foo', base: 'bar', ext: '', name: 'bar' }], -]; - -const winSpecialCaseFormatTests = [ - [{ dir: 'some\\dir' }, 'some\\dir\\'], - [{ base: 'index.html' }, 'index.html'], - [{ root: 'C:\\' }, 'C:\\'], - [{ name: 'index', ext: '.html' }, 'index.html'], - [{ dir: 'some\\dir', name: 'index', ext: '.html' }, 'some\\dir\\index.html'], - [{ root: 'C:\\', name: 'index', ext: '.html' }, 'C:\\index.html'], - [{}, ''], -]; - -const unixPaths = [ - // [path, root] - ['/home/user/dir/file.txt', '/'], - ['/home/user/a dir/another File.zip', '/'], - ['/home/user/a dir//another&File.', '/'], - ['/home/user/a$$$dir//another File.zip', '/'], - ['user/dir/another File.zip', ''], - ['file', ''], - ['.\\file', ''], - ['./file', ''], - ['C:\\foo', ''], - ['/', '/'], - ['', ''], - ['.', ''], - ['..', ''], - ['/foo', '/'], - ['/foo.', '/'], - ['/foo.bar', '/'], - ['/.', '/'], - ['/.foo', '/'], - ['/.foo.bar', '/'], - ['/foo/bar.baz', '/'], -]; - -const unixSpecialCaseFormatTests = [ - [{ dir: 'some/dir' }, 'some/dir/'], - [{ base: 'index.html' }, 'index.html'], - [{ root: '/' }, '/'], - [{ name: 'index', ext: '.html' }, 'index.html'], - [{ dir: 'some/dir', name: 'index', ext: '.html' }, 'some/dir/index.html'], - [{ root: '/', name: 'index', ext: '.html' }, '/index.html'], - [{}, ''], -]; - -const errors = [ - { method: 'parse', input: [null] }, - { method: 'parse', input: [{}] }, - { method: 'parse', input: [true] }, - { method: 'parse', input: [1] }, - { method: 'parse', input: [] }, - { method: 'format', input: [null] }, - { method: 'format', input: [''] }, - { method: 'format', input: [true] }, - { method: 'format', input: [1] }, -]; - -checkParseFormat(path.win32, winPaths); -checkParseFormat(path.posix, unixPaths); -checkSpecialCaseParseFormat(path.win32, winSpecialCaseParseTests); -checkErrors(path.win32); -checkErrors(path.posix); -checkFormat(path.win32, winSpecialCaseFormatTests); -checkFormat(path.posix, unixSpecialCaseFormatTests); - -// Test removal of trailing path separators -const trailingTests = [ - [ path.win32.parse, - [['.\\', { root: '', dir: '', base: '.', ext: '', name: '.' }], - ['\\\\', { root: '\\', dir: '\\', base: '', ext: '', name: '' }], - ['\\\\', { root: '\\', dir: '\\', base: '', ext: '', name: '' }], - ['c:\\foo\\\\\\', - { root: 'c:\\', dir: 'c:\\', base: 'foo', ext: '', name: 'foo' }], - ['D:\\foo\\\\\\bar.baz', - { root: 'D:\\', - dir: 'D:\\foo\\\\', - base: 'bar.baz', - ext: '.baz', - name: 'bar' }, - ], - ], - ], - [ path.posix.parse, - [['./', { root: '', dir: '', base: '.', ext: '', name: '.' }], - ['//', { root: '/', dir: '/', base: '', ext: '', name: '' }], - ['///', { root: '/', dir: '/', base: '', ext: '', name: '' }], - ['/foo///', { root: '/', dir: '/', base: 'foo', ext: '', name: 'foo' }], - ['/foo///bar.baz', - { root: '/', dir: '/foo//', base: 'bar.baz', ext: '.baz', name: 'bar' }, - ], - ], - ], -]; -const failures = []; -trailingTests.forEach((test) => { - const parse = test[0]; - const os = parse === path.win32.parse ? 'win32' : 'posix'; - test[1].forEach((test) => { - const actual = parse(test[0]); - const expected = test[1]; - const message = `path.${os}.parse(${JSON.stringify(test[0])})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; - const actualKeys = Object.keys(actual); - const expectedKeys = Object.keys(expected); - let failed = (actualKeys.length !== expectedKeys.length); - if (!failed) { - for (let i = 0; i < actualKeys.length; ++i) { - const key = actualKeys[i]; - if (!expectedKeys.includes(key) || actual[key] !== expected[key]) { - failed = true; - break; - } - } - } - if (failed) - failures.push(`\n${message}`); - }); -}); -assert.strictEqual(failures.length, 0, failures.join('')); - -function checkErrors(path) { - errors.forEach(({ method, input }) => { - assert.throws(() => { - path[method].apply(path, input); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - }); - }); -} - -function checkParseFormat(path, paths) { - paths.forEach(([element, root]) => { - const output = path.parse(element); - assert.strictEqual(typeof output.root, 'string'); - assert.strictEqual(typeof output.dir, 'string'); - assert.strictEqual(typeof output.base, 'string'); - assert.strictEqual(typeof output.ext, 'string'); - assert.strictEqual(typeof output.name, 'string'); - assert.strictEqual(path.format(output), element); - assert.strictEqual(output.root, root); - assert(output.dir.startsWith(output.root)); - assert.strictEqual(output.dir, output.dir ? path.dirname(element) : ''); - assert.strictEqual(output.base, path.basename(element)); - assert.strictEqual(output.ext, path.extname(element)); - }); -} - -function checkSpecialCaseParseFormat(path, testCases) { - testCases.forEach(([element, expect]) => { - assert.deepStrictEqual(path.parse(element), expect); - }); -} - -function checkFormat(path, testCases) { - testCases.forEach(([element, expect]) => { - assert.strictEqual(path.format(element), expect); - }); - - [null, undefined, 1, true, false, 'string'].forEach((pathObject) => { - assert.throws(() => { - path.format(pathObject); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "pathObject" argument must be of type object.' + - common.invalidArgTypeHelper(pathObject) - }); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-path-posix-exists.js b/cli/tests/node_compat/test/parallel/test-path-posix-exists.js deleted file mode 100644 index 97f2c4ae6..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-posix-exists.js +++ /dev/null @@ -1,13 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -assert.strictEqual(require('path/posix'), require('path').posix); diff --git a/cli/tests/node_compat/test/parallel/test-path-relative.js b/cli/tests/node_compat/test/parallel/test-path-relative.js deleted file mode 100644 index 7b89cc2cd..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-relative.js +++ /dev/null @@ -1,76 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const path = require('path'); - -const failures = []; - -const relativeTests = [ - [ path.win32.relative, - // Arguments result - [['c:/blah\\blah', 'd:/games', 'd:\\games'], - ['c:/aaaa/bbbb', 'c:/aaaa', '..'], - ['c:/aaaa/bbbb', 'c:/cccc', '..\\..\\cccc'], - ['c:/aaaa/bbbb', 'c:/aaaa/bbbb', ''], - ['c:/aaaa/bbbb', 'c:/aaaa/cccc', '..\\cccc'], - ['c:/aaaa/', 'c:/aaaa/cccc', 'cccc'], - ['c:/', 'c:\\aaaa\\bbbb', 'aaaa\\bbbb'], - ['c:/aaaa/bbbb', 'd:\\', 'd:\\'], - ['c:/AaAa/bbbb', 'c:/aaaa/bbbb', ''], - ['c:/aaaaa/', 'c:/aaaa/cccc', '..\\aaaa\\cccc'], - ['C:\\foo\\bar\\baz\\quux', 'C:\\', '..\\..\\..\\..'], - ['C:\\foo\\test', 'C:\\foo\\test\\bar\\package.json', 'bar\\package.json'], - ['C:\\foo\\bar\\baz-quux', 'C:\\foo\\bar\\baz', '..\\baz'], - ['C:\\foo\\bar\\baz', 'C:\\foo\\bar\\baz-quux', '..\\baz-quux'], - ['\\\\foo\\bar', '\\\\foo\\bar\\baz', 'baz'], - ['\\\\foo\\bar\\baz', '\\\\foo\\bar', '..'], - ['\\\\foo\\bar\\baz-quux', '\\\\foo\\bar\\baz', '..\\baz'], - ['\\\\foo\\bar\\baz', '\\\\foo\\bar\\baz-quux', '..\\baz-quux'], - ['C:\\baz-quux', 'C:\\baz', '..\\baz'], - ['C:\\baz', 'C:\\baz-quux', '..\\baz-quux'], - ['\\\\foo\\baz-quux', '\\\\foo\\baz', '..\\baz'], - ['\\\\foo\\baz', '\\\\foo\\baz-quux', '..\\baz-quux'], - ['C:\\baz', '\\\\foo\\bar\\baz', '\\\\foo\\bar\\baz'], - ['\\\\foo\\bar\\baz', 'C:\\baz', 'C:\\baz'], - ], - ], - [ path.posix.relative, - // Arguments result - [['/var/lib', '/var', '..'], - ['/var/lib', '/bin', '../../bin'], - ['/var/lib', '/var/lib', ''], - ['/var/lib', '/var/apache', '../apache'], - ['/var/', '/var/lib', 'lib'], - ['/', '/var/lib', 'var/lib'], - ['/foo/test', '/foo/test/bar/package.json', 'bar/package.json'], - ['/Users/a/web/b/test/mails', '/Users/a/web/b', '../..'], - ['/foo/bar/baz-quux', '/foo/bar/baz', '../baz'], - ['/foo/bar/baz', '/foo/bar/baz-quux', '../baz-quux'], - ['/baz-quux', '/baz', '../baz'], - ['/baz', '/baz-quux', '../baz-quux'], - ['/page1/page2/foo', '/', '../../..'], - ], - ], -]; -relativeTests.forEach((test) => { - const relative = test[0]; - test[1].forEach((test) => { - const actual = relative(test[0], test[1]); - const expected = test[2]; - if (actual !== expected) { - const os = relative === path.win32.relative ? 'win32' : 'posix'; - const message = `path.${os}.relative(${ - test.slice(0, 2).map(JSON.stringify).join(',')})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; - failures.push(`\n${message}`); - } - }); -}); -assert.strictEqual(failures.length, 0, failures.join('')); diff --git a/cli/tests/node_compat/test/parallel/test-path-resolve.js b/cli/tests/node_compat/test/parallel/test-path-resolve.js deleted file mode 100644 index be010ed83..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-resolve.js +++ /dev/null @@ -1,96 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -const fixtures = require('../common/fixtures'); -const assert = require('assert'); -const child = require('child_process'); -const path = require('path'); - -const failures = []; -const slashRE = /\//g; -const backslashRE = /\\/g; - -const posixyCwd = common.isWindows ? - (() => { - const _ = process.cwd() - .replaceAll(path.sep, path.posix.sep); - return _.slice(_.indexOf(path.posix.sep)); - })() : - process.cwd(); - -const resolveTests = [ - [ path.win32.resolve, - // Arguments result - [[['c:/blah\\blah', 'd:/games', 'c:../a'], 'c:\\blah\\a'], - [['c:/ignore', 'd:\\a/b\\c/d', '\\e.exe'], 'd:\\e.exe'], - [['c:/ignore', 'c:/some/file'], 'c:\\some\\file'], - [['d:/ignore', 'd:some/dir//'], 'd:\\ignore\\some\\dir'], - [['.'], process.cwd()], - [['//server/share', '..', 'relative\\'], '\\\\server\\share\\relative'], - [['c:/', '//'], 'c:\\'], - [['c:/', '//dir'], 'c:\\dir'], - [['c:/', '//server/share'], '\\\\server\\share\\'], - [['c:/', '//server//share'], '\\\\server\\share\\'], - [['c:/', '///some//dir'], 'c:\\some\\dir'], - [['C:\\foo\\tmp.3\\', '..\\tmp.3\\cycles\\root.js'], - 'C:\\foo\\tmp.3\\cycles\\root.js'], - ], - ], - [ path.posix.resolve, - // Arguments result - [[['/var/lib', '../', 'file/'], '/var/file'], - [['/var/lib', '/../', 'file/'], '/file'], - // TODO(wafuwafu13): Enable this - // [['a/b/c/', '../../..'], posixyCwd], - // [['.'], posixyCwd], - [['/some/dir', '.', '/absolute/'], '/absolute'], - [['/foo/tmp.3/', '../tmp.3/cycles/root.js'], '/foo/tmp.3/cycles/root.js'], - ], - ], -]; -resolveTests.forEach(([resolve, tests]) => { - tests.forEach(([test, expected]) => { - const actual = resolve.apply(null, test); - let actualAlt; - const os = resolve === path.win32.resolve ? 'win32' : 'posix'; - if (resolve === path.win32.resolve && !common.isWindows) - actualAlt = actual.replace(backslashRE, '/'); - else if (resolve !== path.win32.resolve && common.isWindows) - actualAlt = actual.replace(slashRE, '\\'); - - const message = - `path.${os}.resolve(${test.map(JSON.stringify).join(',')})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; - if (actual !== expected && actualAlt !== expected) - failures.push(message); - }); -}); -assert.strictEqual(failures.length, 0, failures.join('\n')); - -if (common.isWindows) { - // Test resolving the current Windows drive letter from a spawned process. - // See https://github.com/nodejs/node/issues/7215 - const currentDriveLetter = path.parse(process.cwd()).root.substring(0, 2); - const resolveFixture = fixtures.path('path-resolve.js'); - // TODO(wafuwafu13): Enable this - // const spawnResult = child.spawnSync( - // process.argv[0], [resolveFixture, currentDriveLetter]); - // const resolvedPath = spawnResult.stdout.toString().trim(); - // assert.strictEqual(resolvedPath.toLowerCase(), process.cwd().toLowerCase()); -} - -if (!common.isWindows) { - // Test handling relative paths to be safe when process.cwd() fails. - process.cwd = () => ''; - assert.strictEqual(process.cwd(), ''); - const resolved = path.resolve(); - const expected = '.'; - // TODO(wafuwafu13): Enable this - // assert.strictEqual(resolved, expected); -} diff --git a/cli/tests/node_compat/test/parallel/test-path-win32-exists.js b/cli/tests/node_compat/test/parallel/test-path-win32-exists.js deleted file mode 100644 index 8bb1850dc..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-win32-exists.js +++ /dev/null @@ -1,13 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -assert.strictEqual(require('path/win32'), require('path').win32); diff --git a/cli/tests/node_compat/test/parallel/test-path-zero-length-strings.js b/cli/tests/node_compat/test/parallel/test-path-zero-length-strings.js deleted file mode 100644 index 5fa1eafbf..000000000 --- a/cli/tests/node_compat/test/parallel/test-path-zero-length-strings.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// These testcases are specific to one uncommon behavior in path module. Few -// of the functions in path module, treat '' strings as current working -// directory. This test makes sure that the behavior is intact between commits. -// See: https://github.com/nodejs/node/pull/2106 - -require('../common'); -const assert = require('assert'); -const path = require('path'); -const pwd = process.cwd(); - -// Join will internally ignore all the zero-length strings and it will return -// '.' if the joined string is a zero-length string. -assert.strictEqual(path.posix.join(''), '.'); -assert.strictEqual(path.posix.join('', ''), '.'); -assert.strictEqual(path.win32.join(''), '.'); -assert.strictEqual(path.win32.join('', ''), '.'); -assert.strictEqual(path.join(pwd), pwd); -assert.strictEqual(path.join(pwd, ''), pwd); - -// Normalize will return '.' if the input is a zero-length string -assert.strictEqual(path.posix.normalize(''), '.'); -assert.strictEqual(path.win32.normalize(''), '.'); -assert.strictEqual(path.normalize(pwd), pwd); - -// Since '' is not a valid path in any of the common environments, return false -assert.strictEqual(path.posix.isAbsolute(''), false); -assert.strictEqual(path.win32.isAbsolute(''), false); - -// Resolve, internally ignores all the zero-length strings and returns the -// current working directory -assert.strictEqual(path.resolve(''), pwd); -assert.strictEqual(path.resolve('', ''), pwd); - -// Relative, internally calls resolve. So, '' is actually the current directory -assert.strictEqual(path.relative('', pwd), ''); -assert.strictEqual(path.relative(pwd, ''), ''); -assert.strictEqual(path.relative(pwd, pwd), ''); diff --git a/cli/tests/node_compat/test/parallel/test-path.js b/cli/tests/node_compat/test/parallel/test-path.js deleted file mode 100644 index b68f0c2d4..000000000 --- a/cli/tests/node_compat/test/parallel/test-path.js +++ /dev/null @@ -1,80 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 path = require('path'); - -// Test thrown TypeErrors -const typeErrorTests = [true, false, 7, null, {}, undefined, [], NaN]; - -function fail(fn) { - const args = Array.from(arguments).slice(1); - - assert.throws(() => { - fn.apply(null, args); - }, { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' }); -} - -typeErrorTests.forEach((test) => { - [path.posix, path.win32].forEach((namespace) => { - fail(namespace.join, test); - fail(namespace.resolve, test); - fail(namespace.normalize, test); - fail(namespace.isAbsolute, test); - fail(namespace.relative, test, 'foo'); - fail(namespace.relative, 'foo', test); - fail(namespace.parse, test); - fail(namespace.dirname, test); - fail(namespace.basename, test); - fail(namespace.extname, test); - - // Undefined is a valid value as the second argument to basename - if (test !== undefined) { - fail(namespace.basename, 'foo', test); - } - }); -}); - -// path.sep tests -// windows -assert.strictEqual(path.win32.sep, '\\'); -// posix -assert.strictEqual(path.posix.sep, '/'); - -// path.delimiter tests -// windows -assert.strictEqual(path.win32.delimiter, ';'); -// posix -assert.strictEqual(path.posix.delimiter, ':'); - -if (common.isWindows) - assert.strictEqual(path, path.win32); -else - assert.strictEqual(path, path.posix); diff --git a/cli/tests/node_compat/test/parallel/test-process-beforeexit.js b/cli/tests/node_compat/test/parallel/test-process-beforeexit.js deleted file mode 100644 index 7ac789c69..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-beforeexit.js +++ /dev/null @@ -1,88 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 net = require('net'); - -process.once('beforeExit', common.mustCall(tryImmediate)); - -function tryImmediate() { - setImmediate(common.mustCall(() => { - process.once('beforeExit', common.mustCall(tryTimer)); - })); -} - -function tryTimer() { - setTimeout(common.mustCall(() => { - process.once('beforeExit', common.mustCall(tryListen)); - }), 1); -} - -function tryListen() { - net.createServer() - .listen(0) - .on('listening', common.mustCall(function() { - this.close(); - process.once('beforeExit', common.mustCall(tryRepeatedTimer)); - })); -} - -// Test that a function invoked from the beforeExit handler can use a timer -// to keep the event loop open, which can use another timer to keep the event -// loop open, etc. -// -// After N times, call function `tryNextTick` to test behaviors of the -// `process.nextTick`. -function tryRepeatedTimer() { - const N = 5; - let n = 0; - const repeatedTimer = common.mustCall(function() { - if (++n < N) - setTimeout(repeatedTimer, 1); - else // n == N - process.once('beforeExit', common.mustCall(tryNextTickSetImmediate)); - }, N); - setTimeout(repeatedTimer, 1); -} - -// Test if the callback of `process.nextTick` can be invoked. -function tryNextTickSetImmediate() { - process.nextTick(common.mustCall(function() { - setImmediate(common.mustCall(() => { - process.once('beforeExit', common.mustCall(tryNextTick)); - })); - })); -} - -// Test that `process.nextTick` won't keep the event loop running by itself. -function tryNextTick() { - process.nextTick(common.mustCall(function() { - process.once('beforeExit', common.mustNotCall()); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js b/cli/tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js deleted file mode 100644 index 28a9a31e9..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-binding-internalbinding-allowlist.js +++ /dev/null @@ -1,48 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --no-warnings -'use strict'; - -const common = require('../common'); -const assert = require('assert'); - -// Assert that allowed internalBinding modules are accessible via -// process.binding(). -assert(process.binding('async_wrap')); -assert(process.binding('buffer')); -assert(process.binding('cares_wrap')); -assert(process.binding('constants')); -assert(process.binding('contextify')); -if (common.hasCrypto) { // eslint-disable-line node-core/crypto-check - assert(process.binding('crypto')); -} -assert(process.binding('fs')); -assert(process.binding('fs_event_wrap')); -assert(process.binding('http_parser')); -if (common.hasIntl) { - assert(process.binding('icu')); -} -assert(process.binding('inspector')); -assert(process.binding('js_stream')); -assert(process.binding('natives')); -assert(process.binding('os')); -assert(process.binding('pipe_wrap')); -assert(process.binding('signal_wrap')); -assert(process.binding('spawn_sync')); -assert(process.binding('stream_wrap')); -assert(process.binding('tcp_wrap')); -if (common.hasCrypto) { // eslint-disable-line node-core/crypto-check - assert(process.binding('tls_wrap')); -} -assert(process.binding('tty_wrap')); -assert(process.binding('udp_wrap')); -assert(process.binding('url')); -assert(process.binding('util')); -assert(process.binding('uv')); -assert(process.binding('v8')); -assert(process.binding('zlib')); diff --git a/cli/tests/node_compat/test/parallel/test-process-env-allowed-flags.js b/cli/tests/node_compat/test/parallel/test-process-env-allowed-flags.js deleted file mode 100644 index 1b2c96e68..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-env-allowed-flags.js +++ /dev/null @@ -1,109 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); - -// Assert legit flags are allowed, and bogus flags are disallowed -{ - const goodFlags = [ - '--perf_basic_prof', - '--perf-basic-prof', - 'perf-basic-prof', - '--perf_basic-prof', - 'perf_basic-prof', - 'perf_basic_prof', - '-r', - 'r', - '--stack-trace-limit=100', - '--stack-trace-limit=-=xX_nodejs_Xx=-', - ].concat(process.features.inspector ? [ - '--inspect-brk', - 'inspect-brk', - '--inspect_brk', - ] : []); - - const badFlags = [ - 'INSPECT-BRK', - '--INSPECT-BRK', - '--r', - '-R', - '---inspect-brk', - '--cheeseburgers', - ]; - - goodFlags.forEach((flag) => { - assert.strictEqual( - process.allowedNodeEnvironmentFlags.has(flag), - true, - `flag should be in set: ${flag}` - ); - }); - - badFlags.forEach((flag) => { - assert.strictEqual( - process.allowedNodeEnvironmentFlags.has(flag), - false, - `flag should not be in set: ${flag}` - ); - }); -} - -// Assert all "canonical" flags begin with dash(es) -{ - process.allowedNodeEnvironmentFlags.forEach((flag) => { - assert.match(flag, /^--?[a-zA-Z0-9._-]+$/); - }); -} - -// Assert immutability of process.allowedNodeEnvironmentFlags -{ - assert.strictEqual(Object.isFrozen(process.allowedNodeEnvironmentFlags), - true); - - process.allowedNodeEnvironmentFlags.add('foo'); - assert.strictEqual(process.allowedNodeEnvironmentFlags.has('foo'), false); - Set.prototype.add.call(process.allowedNodeEnvironmentFlags, 'foo'); - assert.strictEqual(process.allowedNodeEnvironmentFlags.has('foo'), false); - - const thisArg = {}; - process.allowedNodeEnvironmentFlags.forEach( - common.mustCallAtLeast(function(flag, _, set) { - assert.notStrictEqual(flag, 'foo'); - assert.strictEqual(this, thisArg); - assert.strictEqual(set, process.allowedNodeEnvironmentFlags); - }), - thisArg - ); - - for (const flag of process.allowedNodeEnvironmentFlags.keys()) { - assert.notStrictEqual(flag, 'foo'); - } - for (const flag of process.allowedNodeEnvironmentFlags.values()) { - assert.notStrictEqual(flag, 'foo'); - } - for (const flag of process.allowedNodeEnvironmentFlags) { - assert.notStrictEqual(flag, 'foo'); - } - for (const [flag] of process.allowedNodeEnvironmentFlags.entries()) { - assert.notStrictEqual(flag, 'foo'); - } - - const size = process.allowedNodeEnvironmentFlags.size; - - process.allowedNodeEnvironmentFlags.clear(); - assert.strictEqual(process.allowedNodeEnvironmentFlags.size, size); - Set.prototype.clear.call(process.allowedNodeEnvironmentFlags); - assert.strictEqual(process.allowedNodeEnvironmentFlags.size, size); - - process.allowedNodeEnvironmentFlags.delete('-r'); - assert.strictEqual(process.allowedNodeEnvironmentFlags.size, size); - Set.prototype.delete.call(process.allowedNodeEnvironmentFlags, '-r'); - assert.strictEqual(process.allowedNodeEnvironmentFlags.size, size); -} diff --git a/cli/tests/node_compat/test/parallel/test-process-exit-from-before-exit.js b/cli/tests/node_compat/test/parallel/test-process-exit-from-before-exit.js deleted file mode 100644 index a1472e538..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-exit-from-before-exit.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -process.on('beforeExit', common.mustCall(function() { - setTimeout(common.mustNotCall(), 5); - process.exit(0); // Should execute immediately even if we schedule new work. - assert.fail(); -})); diff --git a/cli/tests/node_compat/test/parallel/test-process-exit-handler.js b/cli/tests/node_compat/test/parallel/test-process-exit-handler.js deleted file mode 100644 index 7069c73e9..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-exit-handler.js +++ /dev/null @@ -1,21 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -if (!common.isMainThread) - common.skip('execArgv does not affect Workers'); - -// This test ensures that no asynchronous operations are performed in the 'exit' -// handler. -// https://github.com/nodejs/node/issues/12322 - -process.on('exit', () => { - setTimeout(() => process.abort(), 0); // Should not run. - for (const start = Date.now(); Date.now() - start < 10;); -}); diff --git a/cli/tests/node_compat/test/parallel/test-process-exit-recursive.js b/cli/tests/node_compat/test/parallel/test-process-exit-recursive.js deleted file mode 100644 index 054b23271..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-exit-recursive.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -// Recursively calling .exit() should not overflow the call stack -let nexits = 0; - -process.on('exit', function(code) { - assert.strictEqual(nexits++, 0); - assert.strictEqual(code, 1); - - // Now override the exit code of 1 with 0 so that the test passes - process.exit(0); -}); - -process.exit(1); diff --git a/cli/tests/node_compat/test/parallel/test-process-exit.js b/cli/tests/node_compat/test/parallel/test-process-exit.js deleted file mode 100644 index 50a3bd3b1..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-exit.js +++ /dev/null @@ -1,42 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -// Calling .exit() from within "exit" should not overflow the call stack -let nexits = 0; - -process.on('exit', function(code) { - assert.strictEqual(nexits++, 0); - assert.strictEqual(code, 0); - process.exit(); -}); - -// "exit" should be emitted unprovoked diff --git a/cli/tests/node_compat/test/parallel/test-process-kill-pid.js b/cli/tests/node_compat/test/parallel/test-process-kill-pid.js deleted file mode 100644 index f6e612f2b..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-kill-pid.js +++ /dev/null @@ -1,116 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -// Test variants of pid -// -// null: TypeError -// undefined: TypeError -// -// 'SIGTERM': TypeError -// -// String(process.pid): TypeError -// -// Nan, Infinity, -Infinity: TypeError -// -// 0, String(0): our group process -// -// process.pid, String(process.pid): ourself - -['SIGTERM', null, undefined, NaN, Infinity, -Infinity].forEach((val) => { - assert.throws(() => process.kill(val), { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "pid" argument must be of type number.' + - common.invalidArgTypeHelper(val) - }); -}); - -// Test that kill throws an error for unknown signal names -assert.throws(() => process.kill(0, 'test'), { - code: 'ERR_UNKNOWN_SIGNAL', - name: 'TypeError', - message: 'Unknown signal: test' -}); - -// Test that kill throws an error for invalid signal numbers -assert.throws(() => process.kill(0, 987), { - code: 'EINVAL', - name: 'Error', - message: 'kill EINVAL' -}); - -// Test kill argument processing in valid cases. -// -// Monkey patch _kill so that we don't actually send any signals, particularly -// that we don't kill our process group, or try to actually send ANY signals on -// windows, which doesn't support them. -function kill(tryPid, trySig, expectPid, expectSig) { - let getPid; - let getSig; - const origKill = process._kill; - process._kill = function(pid, sig) { - getPid = pid; - getSig = sig; - - // un-monkey patch process._kill - process._kill = origKill; - }; - - process.kill(tryPid, trySig); - - assert.strictEqual(getPid.toString(), expectPid.toString()); - assert.strictEqual(getSig, expectSig); -} - -// Note that SIGHUP and SIGTERM map to 1 and 15 respectively, even on Windows -// (for Windows, libuv maps 1 and 15 to the correct behavior). - -kill(0, 'SIGHUP', 0, 1); -kill(0, undefined, 0, 15); -kill('0', 'SIGHUP', 0, 1); -kill('0', undefined, 0, 15); - -// Confirm that numeric signal arguments are supported - -kill(0, 1, 0, 1); -kill(0, 15, 0, 15); - -// Negative numbers are meaningful on unix -kill(-1, 'SIGHUP', -1, 1); -kill(-1, undefined, -1, 15); -kill('-1', 'SIGHUP', -1, 1); -kill('-1', undefined, -1, 15); - -kill(process.pid, 'SIGHUP', process.pid, 1); -kill(process.pid, undefined, process.pid, 15); -kill(String(process.pid), 'SIGHUP', process.pid, 1); -kill(String(process.pid), undefined, process.pid, 15); diff --git a/cli/tests/node_compat/test/parallel/test-process-uptime.js b/cli/tests/node_compat/test/parallel/test-process-uptime.js deleted file mode 100644 index 74d2c13bd..000000000 --- a/cli/tests/node_compat/test/parallel/test-process-uptime.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -console.error(process.uptime()); -// Add some wiggle room for different platforms. -// Verify that the returned value is in seconds - -// 15 seconds should be a good estimate. -assert.ok(process.uptime() <= 15); - -const original = process.uptime(); - -setTimeout(function() { - const uptime = process.uptime(); - assert.ok(original < uptime); -}, 10); diff --git a/cli/tests/node_compat/test/parallel/test-promise-unhandled-silent.js b/cli/tests/node_compat/test/parallel/test-promise-unhandled-silent.js deleted file mode 100644 index 3b2dcde15..000000000 --- a/cli/tests/node_compat/test/parallel/test-promise-unhandled-silent.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --unhandled-rejections=none -'use strict'; - -const common = require('../common'); - -// Verify that ignoring unhandled rejection works fine and that no warning is -// logged. - -new Promise(() => { - throw new Error('One'); -}); - -Promise.reject('test'); - -process.on('warning', common.mustNotCall('warning')); -process.on('uncaughtException', common.mustNotCall('uncaughtException')); -process.on('rejectionHandled', common.mustNotCall('rejectionHandled')); - -process.on('unhandledRejection', common.mustCall(2)); - -setTimeout(common.mustCall(), 2); diff --git a/cli/tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js b/cli/tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js deleted file mode 100644 index a911f096a..000000000 --- a/cli/tests/node_compat/test/parallel/test-promise-unhandled-throw-handler.js +++ /dev/null @@ -1,43 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --unhandled-rejections=throw -'use strict'; - -const common = require('../common'); -const Countdown = require('../common/countdown'); -const assert = require('assert'); - -// Verify that the unhandledRejection handler prevents triggering -// uncaught exceptions - -const err1 = new Error('One'); - -const errors = [err1, null]; - -const ref = new Promise(() => { - throw err1; -}); -// Explicitly reject `null`. -Promise.reject(null); - -process.on('warning', common.mustNotCall('warning')); -process.on('rejectionHandled', common.mustNotCall('rejectionHandled')); -process.on('exit', assert.strictEqual.bind(null, 0)); -process.on('uncaughtException', common.mustNotCall('uncaughtException')); - -const timer = setTimeout(() => console.log(ref), 1000); - -const counter = new Countdown(2, () => { - clearTimeout(timer); -}); - -process.on('unhandledRejection', common.mustCall((err) => { - counter.dec(); - const knownError = errors.shift(); - assert.deepStrictEqual(err, knownError); -}, 2)); diff --git a/cli/tests/node_compat/test/parallel/test-querystring-escape.js b/cli/tests/node_compat/test/parallel/test-querystring-escape.js deleted file mode 100644 index f4f635af1..000000000 --- a/cli/tests/node_compat/test/parallel/test-querystring-escape.js +++ /dev/null @@ -1,48 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -const qs = require('querystring'); - -assert.strictEqual(qs.escape(5), '5'); -assert.strictEqual(qs.escape('test'), 'test'); -assert.strictEqual(qs.escape({}), '%5Bobject%20Object%5D'); -assert.strictEqual(qs.escape([5, 10]), '5%2C10'); -assert.strictEqual(qs.escape('Ŋōđĕ'), '%C5%8A%C5%8D%C4%91%C4%95'); -assert.strictEqual(qs.escape('testŊōđĕ'), 'test%C5%8A%C5%8D%C4%91%C4%95'); -assert.strictEqual(qs.escape(`${String.fromCharCode(0xD800 + 1)}test`), - '%F0%90%91%B4est'); - -assert.throws( - () => qs.escape(String.fromCharCode(0xD800 + 1)), - { - code: 'ERR_INVALID_URI', - name: 'URIError', - message: 'URI malformed' - } -); - -// Using toString for objects -assert.strictEqual( - qs.escape({ test: 5, toString: () => 'test', valueOf: () => 10 }), - 'test' -); - -// `toString` is not callable, must throw an error. -// Error message will vary between different JavaScript engines, so only check -// that it is a `TypeError`. -assert.throws(() => qs.escape({ toString: 5 }), TypeError); - -// Should use valueOf instead of non-callable toString. -assert.strictEqual(qs.escape({ toString: 5, valueOf: () => 'test' }), 'test'); - -// Error message will vary between different JavaScript engines, so only check -// that it is a `TypeError`. -assert.throws(() => qs.escape(Symbol('test')), TypeError); diff --git a/cli/tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js b/cli/tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js deleted file mode 100644 index 4a8c7ab0d..000000000 --- a/cli/tests/node_compat/test/parallel/test-querystring-maxKeys-non-finite.js +++ /dev/null @@ -1,65 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// This test was originally written to test a regression -// that was introduced by -// https://github.com/nodejs/node/pull/2288#issuecomment-179543894 -require('../common'); - -const assert = require('assert'); -const parse = require('querystring').parse; - -// Taken from express-js/body-parser -// https://github.com/expressjs/body-parser/blob/ed25264fb494cf0c8bc992b8257092cd4f694d5e/test/urlencoded.js#L636-L651 -function createManyParams(count) { - let str = ''; - - if (count === 0) { - return str; - } - - str += '0=0'; - - for (let i = 1; i < count; i++) { - const n = i.toString(36); - str += `&${n}=${n}`; - } - - return str; -} - -const count = 10000; -const originalMaxLength = 1000; -const params = createManyParams(count); - -// thealphanerd -// 27def4f introduced a change to parse that would cause Infinity -// to be passed to String.prototype.split as an argument for limit -// In this instance split will always return an empty array -// this test confirms that the output of parse is the expected length -// when passed Infinity as the argument for maxKeys -const resultInfinity = parse(params, undefined, undefined, { - maxKeys: Infinity -}); -const resultNaN = parse(params, undefined, undefined, { - maxKeys: NaN -}); -const resultInfinityString = parse(params, undefined, undefined, { - maxKeys: 'Infinity' -}); -const resultNaNString = parse(params, undefined, undefined, { - maxKeys: 'NaN' -}); - -// Non Finite maxKeys should return the length of input -assert.strictEqual(Object.keys(resultInfinity).length, count); -assert.strictEqual(Object.keys(resultNaN).length, count); -// Strings maxKeys should return the maxLength -// defined by parses internals -assert.strictEqual(Object.keys(resultInfinityString).length, originalMaxLength); -assert.strictEqual(Object.keys(resultNaNString).length, originalMaxLength); diff --git a/cli/tests/node_compat/test/parallel/test-querystring-multichar-separator.js b/cli/tests/node_compat/test/parallel/test-querystring-multichar-separator.js deleted file mode 100644 index 3234dcd60..000000000 --- a/cli/tests/node_compat/test/parallel/test-querystring-multichar-separator.js +++ /dev/null @@ -1,32 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const qs = require('querystring'); - -function check(actual, expected) { - assert(!(actual instanceof Object)); - assert.deepStrictEqual(Object.keys(actual).sort(), - Object.keys(expected).sort()); - Object.keys(expected).forEach(function(key) { - assert.deepStrictEqual(actual[key], expected[key]); - }); -} - -check(qs.parse('foo=>bar&&bar=>baz', '&&', '=>'), - { foo: 'bar', bar: 'baz' }); - -check(qs.stringify({ foo: 'bar', bar: 'baz' }, '&&', '=>'), - 'foo=>bar&&bar=>baz'); - -check(qs.parse('foo==>bar, bar==>baz', ', ', '==>'), - { foo: 'bar', bar: 'baz' }); - -check(qs.stringify({ foo: 'bar', bar: 'baz' }, ', ', '==>'), - 'foo==>bar, bar==>baz'); diff --git a/cli/tests/node_compat/test/parallel/test-querystring.js b/cli/tests/node_compat/test/parallel/test-querystring.js deleted file mode 100644 index fb8176da5..000000000 --- a/cli/tests/node_compat/test/parallel/test-querystring.js +++ /dev/null @@ -1,489 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.12.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'; -require('../common'); -const assert = require('assert'); -const inspect = require('util').inspect; - -// test using assert -const qs = require('querystring'); - -function createWithNoPrototype(properties) { - const noProto = Object.create(null); - properties.forEach((property) => { - noProto[property.key] = property.value; - }); - return noProto; -} -// Folding block, commented to pass gjslint -// {{{ -// [ wonkyQS, canonicalQS, obj ] -const qsTestCases = [ - ['__proto__=1', - '__proto__=1', - createWithNoPrototype([{ key: '__proto__', value: '1' }])], - ['__defineGetter__=asdf', - '__defineGetter__=asdf', - JSON.parse('{"__defineGetter__":"asdf"}')], - ['foo=918854443121279438895193', - 'foo=918854443121279438895193', - { 'foo': '918854443121279438895193' }], - ['foo=bar', 'foo=bar', { 'foo': 'bar' }], - ['foo=bar&foo=quux', 'foo=bar&foo=quux', { 'foo': ['bar', 'quux'] }], - ['foo=1&bar=2', 'foo=1&bar=2', { 'foo': '1', 'bar': '2' }], - ['my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F', - 'my%20weird%20field=q1!2%22\'w%245%267%2Fz8)%3F', - { 'my weird field': 'q1!2"\'w$5&7/z8)?' }], - ['foo%3Dbaz=bar', 'foo%3Dbaz=bar', { 'foo=baz': 'bar' }], - ['foo=baz=bar', 'foo=baz%3Dbar', { 'foo': 'baz=bar' }], - ['str=foo&arr=1&arr=2&arr=3&somenull=&undef=', - 'str=foo&arr=1&arr=2&arr=3&somenull=&undef=', - { 'str': 'foo', - 'arr': ['1', '2', '3'], - 'somenull': '', - 'undef': '' }], - [' foo = bar ', '%20foo%20=%20bar%20', { ' foo ': ' bar ' }], - ['foo=%zx', 'foo=%25zx', { 'foo': '%zx' }], - ['foo=%EF%BF%BD', 'foo=%EF%BF%BD', { 'foo': '\ufffd' }], - // See: https://github.com/joyent/node/issues/1707 - ['hasOwnProperty=x&toString=foo&valueOf=bar&__defineGetter__=baz', - 'hasOwnProperty=x&toString=foo&valueOf=bar&__defineGetter__=baz', - { hasOwnProperty: 'x', - toString: 'foo', - valueOf: 'bar', - __defineGetter__: 'baz' }], - // See: https://github.com/joyent/node/issues/3058 - ['foo&bar=baz', 'foo=&bar=baz', { foo: '', bar: 'baz' }], - ['a=b&c&d=e', 'a=b&c=&d=e', { a: 'b', c: '', d: 'e' }], - ['a=b&c=&d=e', 'a=b&c=&d=e', { a: 'b', c: '', d: 'e' }], - ['a=b&=c&d=e', 'a=b&=c&d=e', { 'a': 'b', '': 'c', 'd': 'e' }], - ['a=b&=&c=d', 'a=b&=&c=d', { 'a': 'b', '': '', 'c': 'd' }], - ['&&foo=bar&&', 'foo=bar', { foo: 'bar' }], - ['&', '', {}], - ['&&&&', '', {}], - ['&=&', '=', { '': '' }], - ['&=&=', '=&=', { '': [ '', '' ] }], - ['=', '=', { '': '' }], - ['+', '%20=', { ' ': '' }], - ['+=', '%20=', { ' ': '' }], - ['+&', '%20=', { ' ': '' }], - ['=+', '=%20', { '': ' ' }], - ['+=&', '%20=', { ' ': '' }], - ['a&&b', 'a=&b=', { 'a': '', 'b': '' }], - ['a=a&&b=b', 'a=a&b=b', { 'a': 'a', 'b': 'b' }], - ['&a', 'a=', { 'a': '' }], - ['&=', '=', { '': '' }], - ['a&a&', 'a=&a=', { a: [ '', '' ] }], - ['a&a&a&', 'a=&a=&a=', { a: [ '', '', '' ] }], - ['a&a&a&a&', 'a=&a=&a=&a=', { a: [ '', '', '', '' ] }], - ['a=&a=value&a=', 'a=&a=value&a=', { a: [ '', 'value', '' ] }], - ['foo+bar=baz+quux', 'foo%20bar=baz%20quux', { 'foo bar': 'baz quux' }], - ['+foo=+bar', '%20foo=%20bar', { ' foo': ' bar' }], - ['a+', 'a%20=', { 'a ': '' }], - ['=a+', '=a%20', { '': 'a ' }], - ['a+&', 'a%20=', { 'a ': '' }], - ['=a+&', '=a%20', { '': 'a ' }], - ['%20+', '%20%20=', { ' ': '' }], - ['=%20+', '=%20%20', { '': ' ' }], - ['%20+&', '%20%20=', { ' ': '' }], - ['=%20+&', '=%20%20', { '': ' ' }], - [null, '', {}], - [undefined, '', {}], -]; - -// [ wonkyQS, canonicalQS, obj ] -const qsColonTestCases = [ - ['foo:bar', 'foo:bar', { 'foo': 'bar' }], - ['foo:bar;foo:quux', 'foo:bar;foo:quux', { 'foo': ['bar', 'quux'] }], - ['foo:1&bar:2;baz:quux', - 'foo:1%26bar%3A2;baz:quux', - { 'foo': '1&bar:2', 'baz': 'quux' }], - ['foo%3Abaz:bar', 'foo%3Abaz:bar', { 'foo:baz': 'bar' }], - ['foo:baz:bar', 'foo:baz%3Abar', { 'foo': 'baz:bar' }], -]; - -// [wonkyObj, qs, canonicalObj] -function extendedFunction() {} -extendedFunction.prototype = { a: 'b' }; -const qsWeirdObjects = [ - // eslint-disable-next-line node-core/no-unescaped-regexp-dot - [{ regexp: /./g }, 'regexp=', { 'regexp': '' }], - // eslint-disable-next-line node-core/no-unescaped-regexp-dot - [{ regexp: new RegExp('.', 'g') }, 'regexp=', { 'regexp': '' }], - [{ fn: () => {} }, 'fn=', { 'fn': '' }], - [{ fn: new Function('') }, 'fn=', { 'fn': '' }], - [{ math: Math }, 'math=', { 'math': '' }], - [{ e: extendedFunction }, 'e=', { 'e': '' }], - [{ d: new Date() }, 'd=', { 'd': '' }], - [{ d: Date }, 'd=', { 'd': '' }], - [ - { f: new Boolean(false), t: new Boolean(true) }, - 'f=&t=', - { 'f': '', 't': '' }, - ], - [{ f: false, t: true }, 'f=false&t=true', { 'f': 'false', 't': 'true' }], - [{ n: null }, 'n=', { 'n': '' }], - [{ nan: NaN }, 'nan=', { 'nan': '' }], - [{ inf: Infinity }, 'inf=', { 'inf': '' }], - [{ a: [], b: [] }, '', {}], - [{ a: 1, b: [] }, 'a=1', { 'a': '1' }], -]; - -const vm = require('vm'); -const foreignObject = vm.runInNewContext('({"foo": ["bar", "baz"]})'); - -const qsNoMungeTestCases = [ - ['', {}], - ['foo=bar&foo=baz', { 'foo': ['bar', 'baz'] }], - ['foo=bar&foo=baz', foreignObject], - ['blah=burp', { 'blah': 'burp' }], - ['a=!-._~\'()*', { 'a': '!-._~\'()*' }], - ['a=abcdefghijklmnopqrstuvwxyz', { 'a': 'abcdefghijklmnopqrstuvwxyz' }], - ['a=ABCDEFGHIJKLMNOPQRSTUVWXYZ', { 'a': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' }], - ['a=0123456789', { 'a': '0123456789' }], - ['gragh=1&gragh=3&goo=2', { 'gragh': ['1', '3'], 'goo': '2' }], - ['frappucino=muffin&goat%5B%5D=scone&pond=moose', - { 'frappucino': 'muffin', 'goat[]': 'scone', 'pond': 'moose' }], - ['trololol=yes&lololo=no', { 'trololol': 'yes', 'lololo': 'no' }], -]; - -const qsUnescapeTestCases = [ - ['there is nothing to unescape here', - 'there is nothing to unescape here'], - ['there%20are%20several%20spaces%20that%20need%20to%20be%20unescaped', - 'there are several spaces that need to be unescaped'], - ['there%2Qare%0-fake%escaped values in%%%%this%9Hstring', - 'there%2Qare%0-fake%escaped values in%%%%this%9Hstring'], - ['%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2F%30%31%32%33%34%35%36%37', - ' !"#$%&\'()*+,-./01234567'], - ['%%2a', '%*'], - ['%2sf%2a', '%2sf*'], - ['%2%2af%2a', '%2*f*'], -]; - -assert.strictEqual(qs.parse('id=918854443121279438895193').id, - '918854443121279438895193'); - -function check(actual, expected, input) { - assert(!(actual instanceof Object)); - const actualKeys = Object.keys(actual).sort(); - const expectedKeys = Object.keys(expected).sort(); - let msg; - if (typeof input === 'string') { - msg = `Input: ${inspect(input)}\n` + - `Actual keys: ${inspect(actualKeys)}\n` + - `Expected keys: ${inspect(expectedKeys)}`; - } - assert.deepStrictEqual(actualKeys, expectedKeys, msg); - expectedKeys.forEach((key) => { - if (typeof input === 'string') { - msg = `Input: ${inspect(input)}\n` + - `Key: ${inspect(key)}\n` + - `Actual value: ${inspect(actual[key])}\n` + - `Expected value: ${inspect(expected[key])}`; - } else { - msg = undefined; - } - assert.deepStrictEqual(actual[key], expected[key], msg); - }); -} - -// Test that the canonical qs is parsed properly. -qsTestCases.forEach((testCase) => { - check(qs.parse(testCase[0]), testCase[2], testCase[0]); -}); - -// Test that the colon test cases can do the same -qsColonTestCases.forEach((testCase) => { - check(qs.parse(testCase[0], ';', ':'), testCase[2], testCase[0]); -}); - -// Test the weird objects, that they get parsed properly -qsWeirdObjects.forEach((testCase) => { - check(qs.parse(testCase[1]), testCase[2], testCase[1]); -}); - -qsNoMungeTestCases.forEach((testCase) => { - assert.deepStrictEqual(qs.stringify(testCase[1], '&', '='), testCase[0]); -}); - -// Test the nested qs-in-qs case -{ - const f = qs.parse('a=b&q=x%3Dy%26y%3Dz'); - check(f, createWithNoPrototype([ - { key: 'a', value: 'b' }, - { key: 'q', value: 'x=y&y=z' }, - ])); - - f.q = qs.parse(f.q); - const expectedInternal = createWithNoPrototype([ - { key: 'x', value: 'y' }, - { key: 'y', value: 'z' }, - ]); - check(f.q, expectedInternal); -} - -// nested in colon -{ - const f = qs.parse('a:b;q:x%3Ay%3By%3Az', ';', ':'); - check(f, createWithNoPrototype([ - { key: 'a', value: 'b' }, - { key: 'q', value: 'x:y;y:z' }, - ])); - f.q = qs.parse(f.q, ';', ':'); - const expectedInternal = createWithNoPrototype([ - { key: 'x', value: 'y' }, - { key: 'y', value: 'z' }, - ]); - check(f.q, expectedInternal); -} - -// Now test stringifying - -// basic -qsTestCases.forEach((testCase) => { - assert.strictEqual(qs.stringify(testCase[2]), testCase[1]); -}); - -qsColonTestCases.forEach((testCase) => { - assert.strictEqual(qs.stringify(testCase[2], ';', ':'), testCase[1]); -}); - -qsWeirdObjects.forEach((testCase) => { - assert.strictEqual(qs.stringify(testCase[0]), testCase[1]); -}); - -// BigInt values - -assert.strictEqual(qs.stringify({ foo: 2n ** 1023n }), - 'foo=' + 2n ** 1023n); -assert.strictEqual(qs.stringify([0n, 1n, 2n]), - '0=0&1=1&2=2'); - -assert.strictEqual(qs.stringify({ foo: 2n ** 1023n }, - null, - null, - { encodeURIComponent: (c) => c }), - 'foo=' + 2n ** 1023n); -assert.strictEqual(qs.stringify([0n, 1n, 2n], - null, - null, - { encodeURIComponent: (c) => c }), - '0=0&1=1&2=2'); - -// Invalid surrogate pair throws URIError -assert.throws( - () => qs.stringify({ foo: '\udc00' }), - { - code: 'ERR_INVALID_URI', - name: 'URIError', - message: 'URI malformed' - } -); - -// Coerce numbers to string -assert.strictEqual(qs.stringify({ foo: 0 }), 'foo=0'); -assert.strictEqual(qs.stringify({ foo: -0 }), 'foo=0'); -assert.strictEqual(qs.stringify({ foo: 3 }), 'foo=3'); -assert.strictEqual(qs.stringify({ foo: -72.42 }), 'foo=-72.42'); -assert.strictEqual(qs.stringify({ foo: NaN }), 'foo='); -assert.strictEqual(qs.stringify({ foo: 1e21 }), 'foo=1e%2B21'); -assert.strictEqual(qs.stringify({ foo: Infinity }), 'foo='); - -// nested -{ - const f = qs.stringify({ - a: 'b', - q: qs.stringify({ - x: 'y', - y: 'z' - }) - }); - assert.strictEqual(f, 'a=b&q=x%3Dy%26y%3Dz'); -} - -qs.parse(undefined); // Should not throw. - -// nested in colon -{ - const f = qs.stringify({ - a: 'b', - q: qs.stringify({ - x: 'y', - y: 'z' - }, ';', ':') - }, ';', ':'); - assert.strictEqual(f, 'a:b;q:x%3Ay%3By%3Az'); -} - -// empty string -assert.strictEqual(qs.stringify(), ''); -assert.strictEqual(qs.stringify(0), ''); -assert.strictEqual(qs.stringify([]), ''); -assert.strictEqual(qs.stringify(null), ''); -assert.strictEqual(qs.stringify(true), ''); - -check(qs.parse(), {}); - -// empty sep -check(qs.parse('a', []), { a: '' }); - -// empty eq -check(qs.parse('a', null, []), { '': 'a' }); - -// Test limiting -assert.strictEqual( - Object.keys(qs.parse('a=1&b=1&c=1', null, null, { maxKeys: 1 })).length, - 1); - -// Test limiting with a case that starts from `&` -assert.strictEqual( - Object.keys(qs.parse('&a', null, null, { maxKeys: 1 })).length, - 0); - -// Test removing limit -{ - function testUnlimitedKeys() { - const query = {}; - - for (let i = 0; i < 2000; i++) query[i] = i; - - const url = qs.stringify(query); - - assert.strictEqual( - Object.keys(qs.parse(url, null, null, { maxKeys: 0 })).length, - 2000); - } - - testUnlimitedKeys(); -} - -{ - const b = qs.unescapeBuffer('%d3%f2Ug%1f6v%24%5e%98%cb' + - '%0d%ac%a2%2f%9d%eb%d8%a2%e6'); - // <Buffer d3 f2 55 67 1f 36 76 24 5e 98 cb 0d ac a2 2f 9d eb d8 a2 e6> - assert.strictEqual(b[0], 0xd3); - assert.strictEqual(b[1], 0xf2); - assert.strictEqual(b[2], 0x55); - assert.strictEqual(b[3], 0x67); - assert.strictEqual(b[4], 0x1f); - assert.strictEqual(b[5], 0x36); - assert.strictEqual(b[6], 0x76); - assert.strictEqual(b[7], 0x24); - assert.strictEqual(b[8], 0x5e); - assert.strictEqual(b[9], 0x98); - assert.strictEqual(b[10], 0xcb); - assert.strictEqual(b[11], 0x0d); - assert.strictEqual(b[12], 0xac); - assert.strictEqual(b[13], 0xa2); - assert.strictEqual(b[14], 0x2f); - assert.strictEqual(b[15], 0x9d); - assert.strictEqual(b[16], 0xeb); - assert.strictEqual(b[17], 0xd8); - assert.strictEqual(b[18], 0xa2); - assert.strictEqual(b[19], 0xe6); -} - -assert.strictEqual(qs.unescapeBuffer('a+b', true).toString(), 'a b'); -assert.strictEqual(qs.unescapeBuffer('a+b').toString(), 'a+b'); -assert.strictEqual(qs.unescapeBuffer('a%').toString(), 'a%'); -assert.strictEqual(qs.unescapeBuffer('a%2').toString(), 'a%2'); -assert.strictEqual(qs.unescapeBuffer('a%20').toString(), 'a '); -assert.strictEqual(qs.unescapeBuffer('a%2g').toString(), 'a%2g'); -assert.strictEqual(qs.unescapeBuffer('a%%').toString(), 'a%%'); - -// Test invalid encoded string -check(qs.parse('%\u0100=%\u0101'), { '%Ā': '%ā' }); - -// Test custom decode -{ - function demoDecode(str) { - return str + str; - } - - check( - qs.parse('a=a&b=b&c=c', null, null, { decodeURIComponent: demoDecode }), - { aa: 'aa', bb: 'bb', cc: 'cc' }); - check( - qs.parse('a=a&b=b&c=c', null, '==', { decodeURIComponent: (str) => str }), - { 'a=a': '', 'b=b': '', 'c=c': '' }); -} - -// TODO(wafuwafu13): Enable this -// // Test QueryString.unescape -// { -// function errDecode(str) { -// throw new Error('To jump to the catch scope'); -// } - -// check(qs.parse('a=a', null, null, { decodeURIComponent: errDecode }), -// { a: 'a' }); -// } - -// Test custom encode -{ - function demoEncode(str) { - return str[0]; - } - - const obj = { aa: 'aa', bb: 'bb', cc: 'cc' }; - assert.strictEqual( - qs.stringify(obj, null, null, { encodeURIComponent: demoEncode }), - 'a=a&b=b&c=c'); -} - -// Test custom encode for different types -{ - const obj = { number: 1, bigint: 2n, true: true, false: false, object: {} }; - assert.strictEqual( - qs.stringify(obj, null, null, { encodeURIComponent: (v) => v }), - 'number=1&bigint=2&true=true&false=false&object='); -} - -// Test QueryString.unescapeBuffer -qsUnescapeTestCases.forEach((testCase) => { - assert.strictEqual(qs.unescape(testCase[0]), testCase[1]); - assert.strictEqual(qs.unescapeBuffer(testCase[0]).toString(), testCase[1]); -}); - -// TODO(wafuwafu13): Enable this -// // Test overriding .unescape -// { -// const prevUnescape = qs.unescape; -// qs.unescape = (str) => { -// return str.replace(/o/g, '_'); -// }; -// check( -// qs.parse('foo=bor'), -// createWithNoPrototype([{ key: 'f__', value: 'b_r' }])); -// qs.unescape = prevUnescape; -// } - -// Test separator and "equals" parsing order -check(qs.parse('foo&bar', '&', '&'), { foo: '', bar: '' }); diff --git a/cli/tests/node_compat/test/parallel/test-readline-emit-keypress-events.js b/cli/tests/node_compat/test/parallel/test-readline-emit-keypress-events.js deleted file mode 100644 index 542616424..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline-emit-keypress-events.js +++ /dev/null @@ -1,79 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// emitKeypressEvents is thoroughly tested in test-readline-keys.js. -// However, that test calls it implicitly. This is just a quick sanity check -// to verify that it works when called explicitly. - -require('../common'); -const assert = require('assert'); -const readline = require('readline'); -const PassThrough = require('stream').PassThrough; - -const expectedSequence = ['f', 'o', 'o']; -const expectedKeys = [ - { sequence: 'f', name: 'f', ctrl: false, meta: false, shift: false }, - { sequence: 'o', name: 'o', ctrl: false, meta: false, shift: false }, - { sequence: 'o', name: 'o', ctrl: false, meta: false, shift: false }, -]; - -{ - const stream = new PassThrough(); - const sequence = []; - const keys = []; - - readline.emitKeypressEvents(stream); - stream.on('keypress', (s, k) => { - sequence.push(s); - keys.push(k); - }); - stream.write('foo'); - - assert.deepStrictEqual(sequence, expectedSequence); - assert.deepStrictEqual(keys, expectedKeys); -} - -{ - const stream = new PassThrough(); - const sequence = []; - const keys = []; - - stream.on('keypress', (s, k) => { - sequence.push(s); - keys.push(k); - }); - readline.emitKeypressEvents(stream); - stream.write('foo'); - - assert.deepStrictEqual(sequence, expectedSequence); - assert.deepStrictEqual(keys, expectedKeys); -} - -{ - const stream = new PassThrough(); - const sequence = []; - const keys = []; - const keypressListener = (s, k) => { - sequence.push(s); - keys.push(k); - }; - - stream.on('keypress', keypressListener); - readline.emitKeypressEvents(stream); - stream.removeListener('keypress', keypressListener); - stream.write('foo'); - - assert.deepStrictEqual(sequence, []); - assert.deepStrictEqual(keys, []); - - stream.on('keypress', keypressListener); - stream.write('foo'); - - assert.deepStrictEqual(sequence, expectedSequence); - assert.deepStrictEqual(keys, expectedKeys); -} diff --git a/cli/tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js b/cli/tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js deleted file mode 100644 index 584dc1110..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline-interface-escapecodetimeout.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test ensures that the escapeCodeTimeout option set correctly - -const assert = require('assert'); -const readline = require('readline'); -const EventEmitter = require('events').EventEmitter; - -class FakeInput extends EventEmitter { - resume() {} - pause() {} - write() {} - end() {} -} - -{ - const fi = new FakeInput(); - const rli = new readline.Interface({ - input: fi, - output: fi, - escapeCodeTimeout: 50 - }); - assert.strictEqual(rli.escapeCodeTimeout, 50); - rli.close(); -} - -[ - null, - {}, - NaN, - '50', -].forEach((invalidInput) => { - assert.throws(() => { - const fi = new FakeInput(); - const rli = new readline.Interface({ - input: fi, - output: fi, - escapeCodeTimeout: invalidInput - }); - rli.close(); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_VALUE' - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-readline-interface.js b/cli/tests/node_compat/test/parallel/test-readline-interface.js deleted file mode 100644 index e8e48dd1e..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline-interface.js +++ /dev/null @@ -1,1217 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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. - -// Flags: --expose-internals -'use strict'; -const common = require('../common'); -common.skipIfDumbTerminal(); - -const assert = require('assert'); -const readline = require('readline'); -const util = require('util'); -const { - getStringWidth, - stripVTControlCharacters -} = require('internal/util/inspect'); -const { EventEmitter, getEventListeners } = require('events'); -const { Writable, Readable } = require('stream'); - -class FakeInput extends EventEmitter { - resume() {} - pause() {} - write() {} - end() {} -} - -function isWarned(emitter) { - for (const name in emitter) { - const listeners = emitter[name]; - if (listeners.warned) return true; - } - return false; -} - -function getInterface(options) { - const fi = new FakeInput(); - const rli = new readline.Interface({ - input: fi, - output: fi, - ...options, - }); - return [rli, fi]; -} - -function assertCursorRowsAndCols(rli, rows, cols) { - const cursorPos = rli.getCursorPos(); - assert.strictEqual(cursorPos.rows, rows); - assert.strictEqual(cursorPos.cols, cols); -} - -{ - const input = new FakeInput(); - const rl = readline.Interface({ input }); - assert(rl instanceof readline.Interface); -} - -[ - undefined, - 50, - 0, - 100.5, - 5000, -].forEach((crlfDelay) => { - const [rli] = getInterface({ crlfDelay }); - assert.strictEqual(rli.crlfDelay, Math.max(crlfDelay || 100, 100)); - rli.close(); -}); - -{ - const input = new FakeInput(); - - // Constructor throws if completer is not a function or undefined - ['not an array', 123, 123n, {}, true, Symbol(), null].forEach((invalid) => { - assert.throws(() => { - readline.createInterface({ - input, - completer: invalid - }); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_VALUE' - }); - }); - - // Constructor throws if history is not an array - ['not an array', 123, 123n, {}, true, Symbol(), null].forEach((history) => { - assert.throws(() => { - readline.createInterface({ - input, - history, - }); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_TYPE' - }); - }); - - // Constructor throws if historySize is not a positive number - ['not a number', -1, NaN, {}, true, Symbol(), null].forEach((historySize) => { - assert.throws(() => { - readline.createInterface({ - input, - historySize, - }); - }, { - name: 'RangeError', - code: 'ERR_INVALID_ARG_VALUE' - }); - }); - - // Check for invalid tab sizes. - assert.throws( - () => new readline.Interface({ - input, - tabSize: 0 - }), - { - message: 'The value of "tabSize" is out of range. ' + - 'It must be >= 1 && < 4294967296. Received 0', - code: 'ERR_OUT_OF_RANGE' - } - ); - - assert.throws( - () => new readline.Interface({ - input, - tabSize: '4' - }), - { code: 'ERR_INVALID_ARG_TYPE' } - ); - - assert.throws( - () => new readline.Interface({ - input, - tabSize: 4.5 - }), - { - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "tabSize" is out of range. ' + - 'It must be an integer. Received 4.5' - } - ); -} - -// Sending a single character with no newline -{ - const fi = new FakeInput(); - const rli = new readline.Interface(fi, {}); - rli.on('line', common.mustNotCall()); - fi.emit('data', 'a'); - rli.close(); -} - -// Sending multiple newlines at once that does not end with a new line and a -// `end` event(last line is). \r should behave like \n when alone. -{ - const [rli, fi] = getInterface({ terminal: true }); - const expectedLines = ['foo', 'bar', 'baz', 'bat']; - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, expectedLines.shift()); - }, expectedLines.length - 1)); - fi.emit('data', expectedLines.join('\r')); - rli.close(); -} - -// \r at start of input should output blank line -{ - const [rli, fi] = getInterface({ terminal: true }); - const expectedLines = ['', 'foo' ]; - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, expectedLines.shift()); - }, expectedLines.length)); - fi.emit('data', '\rfoo\r'); - rli.close(); -} - -// \t does not become part of the input when there is a completer function -{ - const completer = (line) => [[], line]; - const [rli, fi] = getInterface({ terminal: true, completer }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'foo'); - })); - for (const character of '\tfo\to\t') { - fi.emit('data', character); - } - fi.emit('data', '\n'); - rli.close(); -} - -// \t when there is no completer function should behave like an ordinary -// character -{ - const [rli, fi] = getInterface({ terminal: true }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, '\t'); - })); - fi.emit('data', '\t'); - fi.emit('data', '\n'); - rli.close(); -} - -// Adding history lines should emit the history event with -// the history array -{ - const [rli, fi] = getInterface({ terminal: true }); - const expectedLines = ['foo', 'bar', 'baz', 'bat']; - rli.on('history', common.mustCall((history) => { - const expectedHistory = expectedLines.slice(0, history.length).reverse(); - assert.deepStrictEqual(history, expectedHistory); - }, expectedLines.length)); - for (const line of expectedLines) { - fi.emit('data', `${line}\n`); - } - rli.close(); -} - -// Altering the history array in the listener should not alter -// the line being processed -{ - const [rli, fi] = getInterface({ terminal: true }); - const expectedLine = 'foo'; - rli.on('history', common.mustCall((history) => { - assert.strictEqual(history[0], expectedLine); - history.shift(); - })); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, expectedLine); - assert.strictEqual(rli.history.length, 0); - })); - fi.emit('data', `${expectedLine}\n`); - rli.close(); -} - -// Duplicate lines are removed from history when -// `options.removeHistoryDuplicates` is `true` -{ - const [rli, fi] = getInterface({ - terminal: true, - removeHistoryDuplicates: true - }); - const expectedLines = ['foo', 'bar', 'baz', 'bar', 'bat', 'bat']; - // ['foo', 'baz', 'bar', bat']; - let callCount = 0; - rli.on('line', (line) => { - assert.strictEqual(line, expectedLines[callCount]); - callCount++; - }); - fi.emit('data', `${expectedLines.join('\n')}\n`); - assert.strictEqual(callCount, expectedLines.length); - fi.emit('keypress', '.', { name: 'up' }); // 'bat' - assert.strictEqual(rli.line, expectedLines[--callCount]); - fi.emit('keypress', '.', { name: 'up' }); // 'bar' - assert.notStrictEqual(rli.line, expectedLines[--callCount]); - assert.strictEqual(rli.line, expectedLines[--callCount]); - fi.emit('keypress', '.', { name: 'up' }); // 'baz' - assert.strictEqual(rli.line, expectedLines[--callCount]); - fi.emit('keypress', '.', { name: 'up' }); // 'foo' - assert.notStrictEqual(rli.line, expectedLines[--callCount]); - assert.strictEqual(rli.line, expectedLines[--callCount]); - assert.strictEqual(callCount, 0); - fi.emit('keypress', '.', { name: 'down' }); // 'baz' - assert.strictEqual(rli.line, 'baz'); - assert.strictEqual(rli.historyIndex, 2); - fi.emit('keypress', '.', { name: 'n', ctrl: true }); // 'bar' - assert.strictEqual(rli.line, 'bar'); - assert.strictEqual(rli.historyIndex, 1); - fi.emit('keypress', '.', { name: 'n', ctrl: true }); - assert.strictEqual(rli.line, 'bat'); - assert.strictEqual(rli.historyIndex, 0); - // Activate the substring history search. - fi.emit('keypress', '.', { name: 'down' }); // 'bat' - assert.strictEqual(rli.line, 'bat'); - assert.strictEqual(rli.historyIndex, -1); - // Deactivate substring history search. - fi.emit('keypress', '.', { name: 'backspace' }); // 'ba' - assert.strictEqual(rli.historyIndex, -1); - assert.strictEqual(rli.line, 'ba'); - // Activate the substring history search. - fi.emit('keypress', '.', { name: 'down' }); // 'ba' - assert.strictEqual(rli.historyIndex, -1); - assert.strictEqual(rli.line, 'ba'); - fi.emit('keypress', '.', { name: 'down' }); // 'ba' - assert.strictEqual(rli.historyIndex, -1); - assert.strictEqual(rli.line, 'ba'); - fi.emit('keypress', '.', { name: 'up' }); // 'bat' - assert.strictEqual(rli.historyIndex, 0); - assert.strictEqual(rli.line, 'bat'); - fi.emit('keypress', '.', { name: 'up' }); // 'bar' - assert.strictEqual(rli.historyIndex, 1); - assert.strictEqual(rli.line, 'bar'); - fi.emit('keypress', '.', { name: 'up' }); // 'baz' - assert.strictEqual(rli.historyIndex, 2); - assert.strictEqual(rli.line, 'baz'); - fi.emit('keypress', '.', { name: 'up' }); // 'ba' - assert.strictEqual(rli.historyIndex, 4); - assert.strictEqual(rli.line, 'ba'); - fi.emit('keypress', '.', { name: 'up' }); // 'ba' - assert.strictEqual(rli.historyIndex, 4); - assert.strictEqual(rli.line, 'ba'); - // Deactivate substring history search and reset history index. - fi.emit('keypress', '.', { name: 'right' }); // 'ba' - assert.strictEqual(rli.historyIndex, -1); - assert.strictEqual(rli.line, 'ba'); - // Substring history search activated. - fi.emit('keypress', '.', { name: 'up' }); // 'ba' - assert.strictEqual(rli.historyIndex, 0); - assert.strictEqual(rli.line, 'bat'); - rli.close(); -} - -// Duplicate lines are not removed from history when -// `options.removeHistoryDuplicates` is `false` -{ - const [rli, fi] = getInterface({ - terminal: true, - removeHistoryDuplicates: false - }); - const expectedLines = ['foo', 'bar', 'baz', 'bar', 'bat', 'bat']; - let callCount = 0; - rli.on('line', (line) => { - assert.strictEqual(line, expectedLines[callCount]); - callCount++; - }); - fi.emit('data', `${expectedLines.join('\n')}\n`); - assert.strictEqual(callCount, expectedLines.length); - fi.emit('keypress', '.', { name: 'up' }); // 'bat' - assert.strictEqual(rli.line, expectedLines[--callCount]); - fi.emit('keypress', '.', { name: 'up' }); // 'bar' - assert.notStrictEqual(rli.line, expectedLines[--callCount]); - assert.strictEqual(rli.line, expectedLines[--callCount]); - fi.emit('keypress', '.', { name: 'up' }); // 'baz' - assert.strictEqual(rli.line, expectedLines[--callCount]); - fi.emit('keypress', '.', { name: 'up' }); // 'bar' - assert.strictEqual(rli.line, expectedLines[--callCount]); - fi.emit('keypress', '.', { name: 'up' }); // 'foo' - assert.strictEqual(rli.line, expectedLines[--callCount]); - assert.strictEqual(callCount, 0); - rli.close(); -} - -// Regression test for repl freeze, #1968: -// check that nothing fails if 'keypress' event throws. -{ - const [rli, fi] = getInterface({ terminal: true }); - const keys = []; - const err = new Error('bad thing happened'); - fi.on('keypress', (key) => { - keys.push(key); - if (key === 'X') { - throw err; - } - }); - assert.throws( - () => fi.emit('data', 'fooX'), - (e) => { - assert.strictEqual(e, err); - return true; - } - ); - fi.emit('data', 'bar'); - assert.strictEqual(keys.join(''), 'fooXbar'); - rli.close(); -} - -// History is bound -{ - const [rli, fi] = getInterface({ terminal: true, historySize: 2 }); - const lines = ['line 1', 'line 2', 'line 3']; - fi.emit('data', lines.join('\n') + '\n'); - assert.strictEqual(rli.history.length, 2); - assert.strictEqual(rli.history[0], 'line 3'); - assert.strictEqual(rli.history[1], 'line 2'); -} - -// Question -{ - const [rli] = getInterface({ terminal: true }); - const expectedLines = ['foo']; - rli.question(expectedLines[0], () => rli.close()); - assertCursorRowsAndCols(rli, 0, expectedLines[0].length); - rli.close(); -} - -// Sending a multi-line question -{ - const [rli] = getInterface({ terminal: true }); - const expectedLines = ['foo', 'bar']; - rli.question(expectedLines.join('\n'), () => rli.close()); - assertCursorRowsAndCols( - rli, expectedLines.length - 1, expectedLines.slice(-1)[0].length); - rli.close(); -} - -{ - // Beginning and end of line - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - fi.emit('keypress', '.', { ctrl: true, name: 'a' }); - assertCursorRowsAndCols(rli, 0, 0); - fi.emit('keypress', '.', { ctrl: true, name: 'e' }); - assertCursorRowsAndCols(rli, 0, 19); - rli.close(); -} - -{ - // Back and Forward one character - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - assertCursorRowsAndCols(rli, 0, 19); - - // Back one character - fi.emit('keypress', '.', { ctrl: true, name: 'b' }); - assertCursorRowsAndCols(rli, 0, 18); - // Back one character - fi.emit('keypress', '.', { ctrl: true, name: 'b' }); - assertCursorRowsAndCols(rli, 0, 17); - // Forward one character - fi.emit('keypress', '.', { ctrl: true, name: 'f' }); - assertCursorRowsAndCols(rli, 0, 18); - // Forward one character - fi.emit('keypress', '.', { ctrl: true, name: 'f' }); - assertCursorRowsAndCols(rli, 0, 19); - rli.close(); -} - -// Back and Forward one astral character -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', '💻'); - - // Move left one character/code point - fi.emit('keypress', '.', { name: 'left' }); - assertCursorRowsAndCols(rli, 0, 0); - - // Move right one character/code point - fi.emit('keypress', '.', { name: 'right' }); - assertCursorRowsAndCols(rli, 0, 2); - - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, '💻'); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// Two astral characters left -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', '💻'); - - // Move left one character/code point - fi.emit('keypress', '.', { name: 'left' }); - assertCursorRowsAndCols(rli, 0, 0); - - fi.emit('data', '🐕'); - assertCursorRowsAndCols(rli, 0, 2); - - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, '🐕💻'); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// Two astral characters right -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', '💻'); - - // Move left one character/code point - fi.emit('keypress', '.', { name: 'right' }); - assertCursorRowsAndCols(rli, 0, 2); - - fi.emit('data', '🐕'); - assertCursorRowsAndCols(rli, 0, 4); - - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, '💻🐕'); - })); - fi.emit('data', '\n'); - rli.close(); -} - -{ - // `wordLeft` and `wordRight` - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - fi.emit('keypress', '.', { ctrl: true, name: 'left' }); - assertCursorRowsAndCols(rli, 0, 16); - fi.emit('keypress', '.', { meta: true, name: 'b' }); - assertCursorRowsAndCols(rli, 0, 10); - fi.emit('keypress', '.', { ctrl: true, name: 'right' }); - assertCursorRowsAndCols(rli, 0, 16); - fi.emit('keypress', '.', { meta: true, name: 'f' }); - assertCursorRowsAndCols(rli, 0, 19); - rli.close(); -} - -// `deleteWordLeft` -[ - { ctrl: true, name: 'w' }, - { ctrl: true, name: 'backspace' }, - { meta: true, name: 'backspace' }, -].forEach((deleteWordLeftKey) => { - let [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - fi.emit('keypress', '.', { ctrl: true, name: 'left' }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'the quick fox'); - })); - fi.emit('keypress', '.', deleteWordLeftKey); - fi.emit('data', '\n'); - rli.close(); - - // No effect if pressed at beginning of line - [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - fi.emit('keypress', '.', { ctrl: true, name: 'a' }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'the quick brown fox'); - })); - fi.emit('keypress', '.', deleteWordLeftKey); - fi.emit('data', '\n'); - rli.close(); -}); - -// `deleteWordRight` -[ - { ctrl: true, name: 'delete' }, - { meta: true, name: 'delete' }, - { meta: true, name: 'd' }, -].forEach((deleteWordRightKey) => { - let [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - fi.emit('keypress', '.', { ctrl: true, name: 'left' }); - fi.emit('keypress', '.', { ctrl: true, name: 'left' }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'the quick fox'); - })); - fi.emit('keypress', '.', deleteWordRightKey); - fi.emit('data', '\n'); - rli.close(); - - // No effect if pressed at end of line - [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'the quick brown fox'); - })); - fi.emit('keypress', '.', deleteWordRightKey); - fi.emit('data', '\n'); - rli.close(); -}); - -// deleteLeft -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - assertCursorRowsAndCols(rli, 0, 19); - - // Delete left character - fi.emit('keypress', '.', { ctrl: true, name: 'h' }); - assertCursorRowsAndCols(rli, 0, 18); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'the quick brown fo'); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// deleteLeft astral character -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', '💻'); - assertCursorRowsAndCols(rli, 0, 2); - // Delete left character - fi.emit('keypress', '.', { ctrl: true, name: 'h' }); - assertCursorRowsAndCols(rli, 0, 0); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, ''); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// deleteRight -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - - // Go to the start of the line - fi.emit('keypress', '.', { ctrl: true, name: 'a' }); - assertCursorRowsAndCols(rli, 0, 0); - - // Delete right character - fi.emit('keypress', '.', { ctrl: true, name: 'd' }); - assertCursorRowsAndCols(rli, 0, 0); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'he quick brown fox'); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// deleteRight astral character -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', '💻'); - - // Go to the start of the line - fi.emit('keypress', '.', { ctrl: true, name: 'a' }); - assertCursorRowsAndCols(rli, 0, 0); - - // Delete right character - fi.emit('keypress', '.', { ctrl: true, name: 'd' }); - assertCursorRowsAndCols(rli, 0, 0); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, ''); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// deleteLineLeft -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - assertCursorRowsAndCols(rli, 0, 19); - - // Delete from current to start of line - fi.emit('keypress', '.', { ctrl: true, shift: true, name: 'backspace' }); - assertCursorRowsAndCols(rli, 0, 0); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, ''); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// deleteLineRight -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick brown fox'); - - // Go to the start of the line - fi.emit('keypress', '.', { ctrl: true, name: 'a' }); - assertCursorRowsAndCols(rli, 0, 0); - - // Delete from current to end of line - fi.emit('keypress', '.', { ctrl: true, shift: true, name: 'delete' }); - assertCursorRowsAndCols(rli, 0, 0); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, ''); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// Close readline interface -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('keypress', '.', { ctrl: true, name: 'c' }); - assert(rli.closed); -} - -// Multi-line input cursor position -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.columns = 10; - fi.emit('data', 'multi-line text'); - assertCursorRowsAndCols(rli, 1, 5); - rli.close(); -} - -// Multi-line input cursor position and long tabs -{ - const [rli, fi] = getInterface({ tabSize: 16, terminal: true, prompt: '' }); - fi.columns = 10; - fi.emit('data', 'multi-line\ttext \t'); - assert.strictEqual(rli.cursor, 17); - assertCursorRowsAndCols(rli, 3, 2); - rli.close(); -} - -// Check for the default tab size. -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - fi.emit('data', 'the quick\tbrown\tfox'); - assert.strictEqual(rli.cursor, 19); - // The first tab is 7 spaces long, the second one 3 spaces. - assertCursorRowsAndCols(rli, 0, 27); -} - -// Multi-line prompt cursor position -{ - const [rli, fi] = getInterface({ - terminal: true, - prompt: '\nfilledline\nwraping text\n> ' - }); - fi.columns = 10; - fi.emit('data', 't'); - assertCursorRowsAndCols(rli, 4, 3); - rli.close(); -} - -// Clear the whole screen -{ - const [rli, fi] = getInterface({ terminal: true, prompt: '' }); - const lines = ['line 1', 'line 2', 'line 3']; - fi.emit('data', lines.join('\n')); - fi.emit('keypress', '.', { ctrl: true, name: 'l' }); - assertCursorRowsAndCols(rli, 0, 6); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'line 3'); - })); - fi.emit('data', '\n'); - rli.close(); -} - -// Wide characters should be treated as two columns. -assert.strictEqual(getStringWidth('a'), 1); -assert.strictEqual(getStringWidth('あ'), 2); -assert.strictEqual(getStringWidth('谢'), 2); -assert.strictEqual(getStringWidth('고'), 2); -assert.strictEqual(getStringWidth(String.fromCodePoint(0x1f251)), 2); -assert.strictEqual(getStringWidth('abcde'), 5); -assert.strictEqual(getStringWidth('古池や'), 6); -assert.strictEqual(getStringWidth('ノード.js'), 9); -assert.strictEqual(getStringWidth('你好'), 4); -assert.strictEqual(getStringWidth('안녕하세요'), 10); -assert.strictEqual(getStringWidth('A\ud83c\ude00BC'), 5); -assert.strictEqual(getStringWidth('👨👩👦👦'), 8); -assert.strictEqual(getStringWidth('🐕𐐷あ💻😀'), 9); -// TODO(BridgeAR): This should have a width of 4. -assert.strictEqual(getStringWidth('⓬⓪'), 2); -assert.strictEqual(getStringWidth('\u0301\u200D\u200E'), 0); - -// Check if vt control chars are stripped -assert.strictEqual(stripVTControlCharacters('\u001b[31m> \u001b[39m'), '> '); -assert.strictEqual( - stripVTControlCharacters('\u001b[31m> \u001b[39m> '), - '> > ' -); -assert.strictEqual(stripVTControlCharacters('\u001b[31m\u001b[39m'), ''); -assert.strictEqual(stripVTControlCharacters('> '), '> '); -assert.strictEqual(getStringWidth('\u001b[31m> \u001b[39m'), 2); -assert.strictEqual(getStringWidth('\u001b[31m> \u001b[39m> '), 4); -assert.strictEqual(getStringWidth('\u001b[31m\u001b[39m'), 0); -assert.strictEqual(getStringWidth('> '), 2); - -// FIXME(bartlomieju): this causes hang -// Check EventEmitter memory leak -// for (let i = 0; i < 12; i++) { -// const rl = readline.createInterface({ -// input: process.stdin, -// output: process.stdout -// }); -// rl.close(); -// assert.strictEqual(isWarned(process.stdin._events), false); -// assert.strictEqual(isWarned(process.stdout._events), false); -// } - -[true, false].forEach((terminal) => { - // Disable history - { - const [rli, fi] = getInterface({ terminal, historySize: 0 }); - assert.strictEqual(rli.historySize, 0); - - fi.emit('data', 'asdf\n'); - assert.deepStrictEqual(rli.history, []); - rli.close(); - } - - // Default history size 30 - { - const [rli, fi] = getInterface({ terminal }); - assert.strictEqual(rli.historySize, 30); - - fi.emit('data', 'asdf\n'); - assert.deepStrictEqual(rli.history, terminal ? ['asdf'] : []); - rli.close(); - } - - // Sending a full line - { - const [rli, fi] = getInterface({ terminal }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'asdf'); - })); - fi.emit('data', 'asdf\n'); - } - - // Sending a blank line - { - const [rli, fi] = getInterface({ terminal }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, ''); - })); - fi.emit('data', '\n'); - } - - // Sending a single character with no newline and then a newline - { - const [rli, fi] = getInterface({ terminal }); - let called = false; - rli.on('line', (line) => { - called = true; - assert.strictEqual(line, 'a'); - }); - fi.emit('data', 'a'); - assert.ok(!called); - fi.emit('data', '\n'); - assert.ok(called); - rli.close(); - } - - // Sending multiple newlines at once - { - const [rli, fi] = getInterface({ terminal }); - const expectedLines = ['foo', 'bar', 'baz']; - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, expectedLines.shift()); - }, expectedLines.length)); - fi.emit('data', `${expectedLines.join('\n')}\n`); - rli.close(); - } - - // Sending multiple newlines at once that does not end with a new line - { - const [rli, fi] = getInterface({ terminal }); - const expectedLines = ['foo', 'bar', 'baz', 'bat']; - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, expectedLines.shift()); - }, expectedLines.length - 1)); - fi.emit('data', expectedLines.join('\n')); - rli.close(); - } - - // Sending multiple newlines at once that does not end with a new(empty) - // line and a `end` event - { - const [rli, fi] = getInterface({ terminal }); - const expectedLines = ['foo', 'bar', 'baz', '']; - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, expectedLines.shift()); - }, expectedLines.length - 1)); - rli.on('close', common.mustCall()); - fi.emit('data', expectedLines.join('\n')); - fi.emit('end'); - rli.close(); - } - - // Sending a multi-byte utf8 char over multiple writes - { - const buf = Buffer.from('☮', 'utf8'); - const [rli, fi] = getInterface({ terminal }); - let callCount = 0; - rli.on('line', (line) => { - callCount++; - assert.strictEqual(line, buf.toString('utf8')); - }); - for (const i of buf) { - fi.emit('data', Buffer.from([i])); - } - assert.strictEqual(callCount, 0); - fi.emit('data', '\n'); - assert.strictEqual(callCount, 1); - rli.close(); - } - - // Calling readline without `new` - { - const [rli, fi] = getInterface({ terminal }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'asdf'); - })); - fi.emit('data', 'asdf\n'); - rli.close(); - } - - // Calling the question callback - { - const [rli] = getInterface({ terminal }); - rli.question('foo?', common.mustCall((answer) => { - assert.strictEqual(answer, 'bar'); - })); - rli.write('bar\n'); - rli.close(); - } - - // Calling the question multiple times - { - const [rli] = getInterface({ terminal }); - rli.question('foo?', common.mustCall((answer) => { - assert.strictEqual(answer, 'baz'); - })); - rli.question('bar?', common.mustNotCall(() => { - })); - rli.write('baz\n'); - rli.close(); - } - - // Calling the promisified question - { - const [rli] = getInterface({ terminal }); - const question = util.promisify(rli.question).bind(rli); - question('foo?') - .then(common.mustCall((answer) => { - assert.strictEqual(answer, 'bar'); - })); - rli.write('bar\n'); - rli.close(); - } - - // Aborting a question - { - const ac = new AbortController(); - const signal = ac.signal; - const [rli] = getInterface({ terminal }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'bar'); - })); - rli.question('hello?', { signal }, common.mustNotCall()); - ac.abort(); - rli.write('bar\n'); - rli.close(); - } - - // Aborting a promisified question - { - const ac = new AbortController(); - const signal = ac.signal; - const [rli] = getInterface({ terminal }); - const question = util.promisify(rli.question).bind(rli); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'bar'); - })); - question('hello?', { signal }) - .then(common.mustNotCall()) - .catch(common.mustCall((error) => { - assert.strictEqual(error.name, 'AbortError'); - })); - ac.abort(); - rli.write('bar\n'); - rli.close(); - } - - // pre-aborted signal - { - const signal = AbortSignal.abort(); - const [rli] = getInterface({ terminal }); - rli.pause(); - rli.on('resume', common.mustNotCall()); - rli.question('hello?', { signal }, common.mustNotCall()); - rli.close(); - } - - // pre-aborted signal promisified question - { - const signal = AbortSignal.abort(); - const [rli] = getInterface({ terminal }); - const question = util.promisify(rli.question).bind(rli); - rli.on('resume', common.mustNotCall()); - rli.pause(); - question('hello?', { signal }) - .then(common.mustNotCall()) - .catch(common.mustCall((error) => { - assert.strictEqual(error.name, 'AbortError'); - })); - rli.close(); - } - - // Can create a new readline Interface with a null output argument - { - const [rli, fi] = getInterface({ output: null, terminal }); - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, 'asdf'); - })); - fi.emit('data', 'asdf\n'); - - rli.setPrompt('ddd> '); - rli.prompt(); - rli.write("really shouldn't be seeing this"); - rli.question('What do you think of node.js? ', (answer) => { - console.log('Thank you for your valuable feedback:', answer); - rli.close(); - }); - } - - // Calling the getPrompt method - { - const expectedPrompts = ['$ ', '> ']; - const [rli] = getInterface({ terminal }); - for (const prompt of expectedPrompts) { - rli.setPrompt(prompt); - assert.strictEqual(rli.getPrompt(), prompt); - } - } - - { - const expected = terminal ? - ['\u001b[1G', '\u001b[0J', '$ ', '\u001b[3G'] : - ['$ ']; - - const output = new Writable({ - write: common.mustCall((chunk, enc, cb) => { - assert.strictEqual(chunk.toString(), expected.shift()); - cb(); - rl.close(); - }, expected.length) - }); - - const rl = readline.createInterface({ - input: new Readable({ read: common.mustCall() }), - output, - prompt: '$ ', - terminal - }); - - rl.prompt(); - - assert.strictEqual(rl.getPrompt(), '$ '); - } - - { - const fi = new FakeInput(); - assert.deepStrictEqual(fi.listeners(terminal ? 'keypress' : 'data'), []); - } - - // Emit two line events when the delay - // between \r and \n exceeds crlfDelay - { - const crlfDelay = 200; - const [rli, fi] = getInterface({ terminal, crlfDelay }); - let callCount = 0; - rli.on('line', () => { - callCount++; - }); - fi.emit('data', '\r'); - setTimeout(common.mustCall(() => { - fi.emit('data', '\n'); - assert.strictEqual(callCount, 2); - rli.close(); - }), crlfDelay + 10); - } - - // For the purposes of the following tests, we do not care about the exact - // value of crlfDelay, only that the behaviour conforms to what's expected. - // Setting it to Infinity allows the test to succeed even under extreme - // CPU stress. - const crlfDelay = Infinity; - - // Set crlfDelay to `Infinity` is allowed - { - const delay = 200; - const [rli, fi] = getInterface({ terminal, crlfDelay }); - let callCount = 0; - rli.on('line', () => { - callCount++; - }); - fi.emit('data', '\r'); - setTimeout(common.mustCall(() => { - fi.emit('data', '\n'); - assert.strictEqual(callCount, 1); - rli.close(); - }), delay); - } - - // Sending multiple newlines at once that does not end with a new line - // and a `end` event(last line is) - - // \r\n should emit one line event, not two - { - const [rli, fi] = getInterface({ terminal, crlfDelay }); - const expectedLines = ['foo', 'bar', 'baz', 'bat']; - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, expectedLines.shift()); - }, expectedLines.length - 1)); - fi.emit('data', expectedLines.join('\r\n')); - rli.close(); - } - - // \r\n should emit one line event when split across multiple writes. - { - const [rli, fi] = getInterface({ terminal, crlfDelay }); - const expectedLines = ['foo', 'bar', 'baz', 'bat']; - let callCount = 0; - rli.on('line', common.mustCall((line) => { - assert.strictEqual(line, expectedLines[callCount]); - callCount++; - }, expectedLines.length)); - expectedLines.forEach((line) => { - fi.emit('data', `${line}\r`); - fi.emit('data', '\n'); - }); - rli.close(); - } - - // Emit one line event when the delay between \r and \n is - // over the default crlfDelay but within the setting value. - { - const delay = 125; - const [rli, fi] = getInterface({ terminal, crlfDelay }); - let callCount = 0; - rli.on('line', () => callCount++); - fi.emit('data', '\r'); - setTimeout(common.mustCall(() => { - fi.emit('data', '\n'); - assert.strictEqual(callCount, 1); - rli.close(); - }), delay); - } -}); - -// Ensure that the _wordLeft method works even for large input -{ - const input = new Readable({ - read() { - this.push('\x1B[1;5D'); // CTRL + Left - this.push(null); - }, - }); - const output = new Writable({ - write: common.mustCall((data, encoding, cb) => { - assert.strictEqual(rl.cursor, rl.line.length - 1); - cb(); - }), - }); - const rl = new readline.createInterface({ - input, - output, - terminal: true, - }); - rl.line = `a${' '.repeat(1e6)}a`; - rl.cursor = rl.line.length; -} - -// FIXME(bartlomieju): these tests depend on "event_target" module -// { -// const fi = new FakeInput(); -// const signal = AbortSignal.abort(); - -// const rl = readline.createInterface({ -// input: fi, -// output: fi, -// signal, -// }); -// rl.on('close', common.mustCall()); -// assert.strictEqual(getEventListeners(signal, 'abort').length, 0); -// } - -// { -// const fi = new FakeInput(); -// const ac = new AbortController(); -// const { signal } = ac; -// const rl = readline.createInterface({ -// input: fi, -// output: fi, -// signal, -// }); -// assert.strictEqual(getEventListeners(signal, 'abort').length, 1); -// rl.on('close', common.mustCall()); -// ac.abort(); -// assert.strictEqual(getEventListeners(signal, 'abort').length, 0); -// } - -// { -// const fi = new FakeInput(); -// const ac = new AbortController(); -// const { signal } = ac; -// const rl = readline.createInterface({ -// input: fi, -// output: fi, -// signal, -// }); -// assert.strictEqual(getEventListeners(signal, 'abort').length, 1); -// rl.close(); -// assert.strictEqual(getEventListeners(signal, 'abort').length, 0); -// } - -{ - // Constructor throws if signal is not an abort signal - assert.throws(() => { - readline.createInterface({ - input: new FakeInput(), - signal: {}, - }); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_TYPE' - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-readline-keys.js b/cli/tests/node_compat/test/parallel/test-readline-keys.js deleted file mode 100644 index aeeb5fffc..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline-keys.js +++ /dev/null @@ -1,351 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const PassThrough = require('stream').PassThrough; -const assert = require('assert'); -const Interface = require('readline').Interface; - -class FakeInput extends PassThrough {} - -function extend(k) { - return Object.assign({ ctrl: false, meta: false, shift: false }, k); -} - - -const fi = new FakeInput(); -const fo = new FakeInput(); -new Interface({ input: fi, output: fo, terminal: true }); - -let keys = []; -fi.on('keypress', (s, k) => { - keys.push(k); -}); - - -function addTest(sequences, expectedKeys) { - if (!Array.isArray(sequences)) { - sequences = [ sequences ]; - } - - if (!Array.isArray(expectedKeys)) { - expectedKeys = [ expectedKeys ]; - } - - expectedKeys = expectedKeys.map(extend); - - keys = []; - - sequences.forEach((sequence) => { - fi.write(sequence); - }); - assert.deepStrictEqual(keys, expectedKeys); -} - -// Simulate key interval test cases -// Returns a function that takes `next` test case and returns a thunk -// that can be called to run tests in sequence -// e.g. -// addKeyIntervalTest(..) -// (addKeyIntervalTest(..) -// (addKeyIntervalTest(..)(noop)))() -// where noop is a terminal function(() => {}). - -const addKeyIntervalTest = (sequences, expectedKeys, interval = 550, - assertDelay = 550) => { - const fn = common.mustCall((next) => () => { - - if (!Array.isArray(sequences)) { - sequences = [ sequences ]; - } - - if (!Array.isArray(expectedKeys)) { - expectedKeys = [ expectedKeys ]; - } - - expectedKeys = expectedKeys.map(extend); - - const keys = []; - fi.on('keypress', (s, k) => keys.push(k)); - - const emitKeys = ([head, ...tail]) => { - if (head) { - fi.write(head); - setTimeout(() => emitKeys(tail), interval); - } else { - setTimeout(() => { - next(); - assert.deepStrictEqual(keys, expectedKeys); - }, assertDelay); - } - }; - emitKeys(sequences); - }); - return fn; -}; - -// Regular alphanumerics -addTest('io.JS', [ - { name: 'i', sequence: 'i' }, - { name: 'o', sequence: 'o' }, - { name: undefined, sequence: '.' }, - { name: 'j', sequence: 'J', shift: true }, - { name: 's', sequence: 'S', shift: true }, -]); - -// Named characters -addTest('\n\r\t\x1b\n\x1b\r\x1b\t', [ - { name: 'enter', sequence: '\n' }, - { name: 'return', sequence: '\r' }, - { name: 'tab', sequence: '\t' }, - { name: 'enter', sequence: '\x1b\n', meta: true }, - { name: 'return', sequence: '\x1b\r', meta: true }, - { name: 'tab', sequence: '\x1b\t', meta: true }, -]); - -// Space and backspace -addTest('\b\x7f\x1b\b\x1b\x7f\x1b\x1b \x1b ', [ - { name: 'backspace', sequence: '\b' }, - { name: 'backspace', sequence: '\x7f' }, - { name: 'backspace', sequence: '\x1b\b', meta: true }, - { name: 'backspace', sequence: '\x1b\x7f', meta: true }, - { name: 'space', sequence: '\x1b\x1b ', meta: true }, - { name: 'space', sequence: ' ' }, - { name: 'space', sequence: '\x1b ', meta: true }, -]); - -// Escape key -addTest('\x1b\x1b\x1b', [ - { name: 'escape', sequence: '\x1b\x1b\x1b', meta: true }, -]); - -// Escape sequence -addTest('\x1b]', [{ name: undefined, sequence: '\x1B]', meta: true }]); - -// Control keys -addTest('\x01\x0b\x10', [ - { name: 'a', sequence: '\x01', ctrl: true }, - { name: 'k', sequence: '\x0b', ctrl: true }, - { name: 'p', sequence: '\x10', ctrl: true }, -]); - -// Alt keys -addTest('a\x1baA\x1bA', [ - { name: 'a', sequence: 'a' }, - { name: 'a', sequence: '\x1ba', meta: true }, - { name: 'a', sequence: 'A', shift: true }, - { name: 'a', sequence: '\x1bA', meta: true, shift: true }, -]); - -// xterm/gnome ESC [ letter (with modifiers) -addTest('\x1b[2P\x1b[3P\x1b[4P\x1b[5P\x1b[6P\x1b[7P\x1b[8P\x1b[3Q\x1b[8Q\x1b[3R\x1b[8R\x1b[3S\x1b[8S', [ - { name: 'f1', sequence: '\x1b[2P', code: '[P', shift: true, meta: false, ctrl: false }, - { name: 'f1', sequence: '\x1b[3P', code: '[P', shift: false, meta: true, ctrl: false }, - { name: 'f1', sequence: '\x1b[4P', code: '[P', shift: true, meta: true, ctrl: false }, - { name: 'f1', sequence: '\x1b[5P', code: '[P', shift: false, meta: false, ctrl: true }, - { name: 'f1', sequence: '\x1b[6P', code: '[P', shift: true, meta: false, ctrl: true }, - { name: 'f1', sequence: '\x1b[7P', code: '[P', shift: false, meta: true, ctrl: true }, - { name: 'f1', sequence: '\x1b[8P', code: '[P', shift: true, meta: true, ctrl: true }, - { name: 'f2', sequence: '\x1b[3Q', code: '[Q', meta: true }, - { name: 'f2', sequence: '\x1b[8Q', code: '[Q', shift: true, meta: true, ctrl: true }, - { name: 'f3', sequence: '\x1b[3R', code: '[R', meta: true }, - { name: 'f3', sequence: '\x1b[8R', code: '[R', shift: true, meta: true, ctrl: true }, - { name: 'f4', sequence: '\x1b[3S', code: '[S', meta: true }, - { name: 'f4', sequence: '\x1b[8S', code: '[S', shift: true, meta: true, ctrl: true }, -]); - -// xterm/gnome ESC O letter -addTest('\x1bOP\x1bOQ\x1bOR\x1bOS', [ - { name: 'f1', sequence: '\x1bOP', code: 'OP' }, - { name: 'f2', sequence: '\x1bOQ', code: 'OQ' }, - { name: 'f3', sequence: '\x1bOR', code: 'OR' }, - { name: 'f4', sequence: '\x1bOS', code: 'OS' }, -]); - -// xterm/rxvt ESC [ number ~ */ -addTest('\x1b[11~\x1b[12~\x1b[13~\x1b[14~', [ - { name: 'f1', sequence: '\x1b[11~', code: '[11~' }, - { name: 'f2', sequence: '\x1b[12~', code: '[12~' }, - { name: 'f3', sequence: '\x1b[13~', code: '[13~' }, - { name: 'f4', sequence: '\x1b[14~', code: '[14~' }, -]); - -// From Cygwin and used in libuv -addTest('\x1b[[A\x1b[[B\x1b[[C\x1b[[D\x1b[[E', [ - { name: 'f1', sequence: '\x1b[[A', code: '[[A' }, - { name: 'f2', sequence: '\x1b[[B', code: '[[B' }, - { name: 'f3', sequence: '\x1b[[C', code: '[[C' }, - { name: 'f4', sequence: '\x1b[[D', code: '[[D' }, - { name: 'f5', sequence: '\x1b[[E', code: '[[E' }, -]); - -// Common -addTest('\x1b[15~\x1b[17~\x1b[18~\x1b[19~\x1b[20~\x1b[21~\x1b[23~\x1b[24~', [ - { name: 'f5', sequence: '\x1b[15~', code: '[15~' }, - { name: 'f6', sequence: '\x1b[17~', code: '[17~' }, - { name: 'f7', sequence: '\x1b[18~', code: '[18~' }, - { name: 'f8', sequence: '\x1b[19~', code: '[19~' }, - { name: 'f9', sequence: '\x1b[20~', code: '[20~' }, - { name: 'f10', sequence: '\x1b[21~', code: '[21~' }, - { name: 'f11', sequence: '\x1b[23~', code: '[23~' }, - { name: 'f12', sequence: '\x1b[24~', code: '[24~' }, -]); - -// xterm ESC [ letter -addTest('\x1b[A\x1b[B\x1b[C\x1b[D\x1b[E\x1b[F\x1b[H', [ - { name: 'up', sequence: '\x1b[A', code: '[A' }, - { name: 'down', sequence: '\x1b[B', code: '[B' }, - { name: 'right', sequence: '\x1b[C', code: '[C' }, - { name: 'left', sequence: '\x1b[D', code: '[D' }, - { name: 'clear', sequence: '\x1b[E', code: '[E' }, - { name: 'end', sequence: '\x1b[F', code: '[F' }, - { name: 'home', sequence: '\x1b[H', code: '[H' }, -]); - -// xterm/gnome ESC O letter -addTest('\x1bOA\x1bOB\x1bOC\x1bOD\x1bOE\x1bOF\x1bOH', [ - { name: 'up', sequence: '\x1bOA', code: 'OA' }, - { name: 'down', sequence: '\x1bOB', code: 'OB' }, - { name: 'right', sequence: '\x1bOC', code: 'OC' }, - { name: 'left', sequence: '\x1bOD', code: 'OD' }, - { name: 'clear', sequence: '\x1bOE', code: 'OE' }, - { name: 'end', sequence: '\x1bOF', code: 'OF' }, - { name: 'home', sequence: '\x1bOH', code: 'OH' }, -]); - -// Old xterm shift-arrows -addTest('\x1bO2A\x1bO2B', [ - { name: 'up', sequence: '\x1bO2A', code: 'OA', shift: true }, - { name: 'down', sequence: '\x1bO2B', code: 'OB', shift: true }, -]); - -// xterm/rxvt ESC [ number ~ -addTest('\x1b[1~\x1b[2~\x1b[3~\x1b[4~\x1b[5~\x1b[6~', [ - { name: 'home', sequence: '\x1b[1~', code: '[1~' }, - { name: 'insert', sequence: '\x1b[2~', code: '[2~' }, - { name: 'delete', sequence: '\x1b[3~', code: '[3~' }, - { name: 'end', sequence: '\x1b[4~', code: '[4~' }, - { name: 'pageup', sequence: '\x1b[5~', code: '[5~' }, - { name: 'pagedown', sequence: '\x1b[6~', code: '[6~' }, -]); - -// putty -addTest('\x1b[[5~\x1b[[6~', [ - { name: 'pageup', sequence: '\x1b[[5~', code: '[[5~' }, - { name: 'pagedown', sequence: '\x1b[[6~', code: '[[6~' }, -]); - -// rxvt -addTest('\x1b[7~\x1b[8~', [ - { name: 'home', sequence: '\x1b[7~', code: '[7~' }, - { name: 'end', sequence: '\x1b[8~', code: '[8~' }, -]); - -// gnome terminal -addTest('\x1b[A\x1b[B\x1b[2A\x1b[2B', [ - { name: 'up', sequence: '\x1b[A', code: '[A' }, - { name: 'down', sequence: '\x1b[B', code: '[B' }, - { name: 'up', sequence: '\x1b[2A', code: '[A', shift: true }, - { name: 'down', sequence: '\x1b[2B', code: '[B', shift: true }, -]); - -// `rxvt` keys with modifiers. -addTest('\x1b[20~\x1b[2$\x1b[2^\x1b[3$\x1b[3^\x1b[5$\x1b[5^\x1b[6$\x1b[6^\x1b[7$\x1b[7^\x1b[8$\x1b[8^', [ - { name: 'f9', sequence: '\x1b[20~', code: '[20~' }, - { name: 'insert', sequence: '\x1b[2$', code: '[2$', shift: true }, - { name: 'insert', sequence: '\x1b[2^', code: '[2^', ctrl: true }, - { name: 'delete', sequence: '\x1b[3$', code: '[3$', shift: true }, - { name: 'delete', sequence: '\x1b[3^', code: '[3^', ctrl: true }, - { name: 'pageup', sequence: '\x1b[5$', code: '[5$', shift: true }, - { name: 'pageup', sequence: '\x1b[5^', code: '[5^', ctrl: true }, - { name: 'pagedown', sequence: '\x1b[6$', code: '[6$', shift: true }, - { name: 'pagedown', sequence: '\x1b[6^', code: '[6^', ctrl: true }, - { name: 'home', sequence: '\x1b[7$', code: '[7$', shift: true }, - { name: 'home', sequence: '\x1b[7^', code: '[7^', ctrl: true }, - { name: 'end', sequence: '\x1b[8$', code: '[8$', shift: true }, - { name: 'end', sequence: '\x1b[8^', code: '[8^', ctrl: true }, -]); - -// Misc -addTest('\x1b[Z', [ - { name: 'tab', sequence: '\x1b[Z', code: '[Z', shift: true }, -]); - -// xterm + modifiers -addTest('\x1b[20;5~\x1b[6;5^', [ - { name: 'f9', sequence: '\x1b[20;5~', code: '[20~', ctrl: true }, - { name: 'pagedown', sequence: '\x1b[6;5^', code: '[6^', ctrl: true }, -]); - -addTest('\x1b[H\x1b[5H\x1b[1;5H', [ - { name: 'home', sequence: '\x1b[H', code: '[H' }, - { name: 'home', sequence: '\x1b[5H', code: '[H', ctrl: true }, - { name: 'home', sequence: '\x1b[1;5H', code: '[H', ctrl: true }, -]); - -// Escape sequences broken into multiple data chunks -addTest('\x1b[D\x1b[C\x1b[D\x1b[C'.split(''), [ - { name: 'left', sequence: '\x1b[D', code: '[D' }, - { name: 'right', sequence: '\x1b[C', code: '[C' }, - { name: 'left', sequence: '\x1b[D', code: '[D' }, - { name: 'right', sequence: '\x1b[C', code: '[C' }, -]); - -// Escape sequences mixed with regular ones -addTest('\x1b[DD\x1b[2DD\x1b[2^D', [ - { name: 'left', sequence: '\x1b[D', code: '[D' }, - { name: 'd', sequence: 'D', shift: true }, - { name: 'left', sequence: '\x1b[2D', code: '[D', shift: true }, - { name: 'd', sequence: 'D', shift: true }, - { name: 'insert', sequence: '\x1b[2^', code: '[2^', ctrl: true }, - { name: 'd', sequence: 'D', shift: true }, -]); - -// Color sequences -addTest('\x1b[31ma\x1b[39ma', [ - { name: 'undefined', sequence: '\x1b[31m', code: '[31m' }, - { name: 'a', sequence: 'a' }, - { name: 'undefined', sequence: '\x1b[39m', code: '[39m' }, - { name: 'a', sequence: 'a' }, -]); - -// `rxvt` keys with modifiers. -addTest('\x1b[a\x1b[b\x1b[c\x1b[d\x1b[e', [ - { name: 'up', sequence: '\x1b[a', code: '[a', shift: true }, - { name: 'down', sequence: '\x1b[b', code: '[b', shift: true }, - { name: 'right', sequence: '\x1b[c', code: '[c', shift: true }, - { name: 'left', sequence: '\x1b[d', code: '[d', shift: true }, - { name: 'clear', sequence: '\x1b[e', code: '[e', shift: true }, -]); - -addTest('\x1bOa\x1bOb\x1bOc\x1bOd\x1bOe', [ - { name: 'up', sequence: '\x1bOa', code: 'Oa', ctrl: true }, - { name: 'down', sequence: '\x1bOb', code: 'Ob', ctrl: true }, - { name: 'right', sequence: '\x1bOc', code: 'Oc', ctrl: true }, - { name: 'left', sequence: '\x1bOd', code: 'Od', ctrl: true }, - { name: 'clear', sequence: '\x1bOe', code: 'Oe', ctrl: true }, -]); - -// Reduce array of addKeyIntervalTest(..) right to left -// with () => {} as initial function. -const runKeyIntervalTests = [ - // Escape character - addKeyIntervalTest('\x1b', [ - { name: 'escape', sequence: '\x1b', meta: true }, - ]), - // Chain of escape characters. - addKeyIntervalTest('\x1b\x1b\x1b\x1b'.split(''), [ - { name: 'escape', sequence: '\x1b', meta: true }, - { name: 'escape', sequence: '\x1b', meta: true }, - { name: 'escape', sequence: '\x1b', meta: true }, - { name: 'escape', sequence: '\x1b', meta: true }, - ]), -].reverse().reduce((acc, fn) => fn(acc), () => {}); - -// Run key interval tests one after another. -runKeyIntervalTests(); diff --git a/cli/tests/node_compat/test/parallel/test-readline-position.js b/cli/tests/node_compat/test/parallel/test-readline-position.js deleted file mode 100644 index 5ee445c8e..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline-position.js +++ /dev/null @@ -1,43 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; -const common = require('../common'); -const { PassThrough } = require('stream'); -const readline = require('readline'); -const assert = require('assert'); - -const ctrlU = { ctrl: true, name: 'u' }; - -common.skipIfDumbTerminal(); - -{ - const input = new PassThrough(); - const rl = readline.createInterface({ - terminal: true, - input: input, - prompt: '' - }); - - const tests = [ - [1, 'a'], - [2, 'ab'], - [2, '丁'], - [0, '\u0301'], // COMBINING ACUTE ACCENT - [1, 'a\u0301'], // á - [0, '\u20DD'], // COMBINING ENCLOSING CIRCLE - [2, 'a\u20DDb'], // a⃝b - [0, '\u200E'], // LEFT-TO-RIGHT MARK - ]; - - for (const [cursor, string] of tests) { - rl.write(string); - assert.strictEqual(rl.getCursorPos().cols, cursor); - rl.write(null, ctrlU); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-readline-reopen.js b/cli/tests/node_compat/test/parallel/test-readline-reopen.js deleted file mode 100644 index 6d3207220..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline-reopen.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Regression test for https://github.com/nodejs/node/issues/13557 -// Tests that multiple subsequent readline instances can re-use an input stream. - -const common = require('../common'); -const assert = require('assert'); -const readline = require('readline'); -const { PassThrough } = require('stream'); - -const input = new PassThrough(); -const output = new PassThrough(); - -const rl1 = readline.createInterface({ - input, - output, - terminal: true -}); - -rl1.on('line', common.mustCall(rl1OnLine)); - -// Write a line plus the first byte of a UTF-8 multibyte character to make sure -// that it doesn’t get lost when closing the readline instance. -input.write(Buffer.concat([ - Buffer.from('foo\n'), - Buffer.from([ 0xe2 ]), // Exactly one third of a ☃ snowman. -])); - -function rl1OnLine(line) { - assert.strictEqual(line, 'foo'); - rl1.close(); - const rl2 = readline.createInterface({ - input, - output, - terminal: true - }); - - rl2.on('line', common.mustCall((line) => { - assert.strictEqual(line, '☃bar'); - rl2.close(); - })); - input.write(Buffer.from([0x98, 0x83])); // The rest of the ☃ snowman. - input.write('bar\n'); -} diff --git a/cli/tests/node_compat/test/parallel/test-readline-set-raw-mode.js b/cli/tests/node_compat/test/parallel/test-readline-set-raw-mode.js deleted file mode 100644 index a1f4f743d..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline-set-raw-mode.js +++ /dev/null @@ -1,97 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const readline = require('readline'); -const Stream = require('stream'); - -const stream = new Stream(); -let expectedRawMode = true; -let rawModeCalled = false; -let resumeCalled = false; -let pauseCalled = false; - -stream.setRawMode = function(mode) { - rawModeCalled = true; - assert.strictEqual(mode, expectedRawMode); -}; -stream.resume = function() { - resumeCalled = true; -}; -stream.pause = function() { - pauseCalled = true; -}; - -// When the "readline" starts in "terminal" mode, -// then setRawMode(true) should be called -const rli = readline.createInterface({ - input: stream, - output: stream, - terminal: true -}); -assert(rli.terminal); -assert(rawModeCalled); -assert(resumeCalled); -assert(!pauseCalled); - - -// pause() should call *not* call setRawMode() -rawModeCalled = false; -resumeCalled = false; -pauseCalled = false; -rli.pause(); -assert(!rawModeCalled); -assert(!resumeCalled); -assert(pauseCalled); - - -// resume() should *not* call setRawMode() -rawModeCalled = false; -resumeCalled = false; -pauseCalled = false; -rli.resume(); -assert(!rawModeCalled); -assert(resumeCalled); -assert(!pauseCalled); - - -// close() should call setRawMode(false) -expectedRawMode = false; -rawModeCalled = false; -resumeCalled = false; -pauseCalled = false; -rli.close(); -assert(rawModeCalled); -assert(!resumeCalled); -assert(pauseCalled); - -assert.deepStrictEqual(stream.listeners('keypress'), []); -// One data listener for the keypress events. -assert.strictEqual(stream.listeners('data').length, 1); diff --git a/cli/tests/node_compat/test/parallel/test-readline-undefined-columns.js b/cli/tests/node_compat/test/parallel/test-readline-undefined-columns.js deleted file mode 100644 index e41798ae3..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline-undefined-columns.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const PassThrough = require('stream').PassThrough; -const readline = require('readline'); - -common.skipIfDumbTerminal(); - -// Checks that tab completion still works -// when output column size is undefined - -const iStream = new PassThrough(); -const oStream = new PassThrough(); - -readline.createInterface({ - terminal: true, - input: iStream, - output: oStream, - completer: function(line, cb) { - cb(null, [['process.stdout', 'process.stdin', 'process.stderr'], line]); - } -}); - -let output = ''; - -oStream.on('data', function(data) { - output += data; -}); - -oStream.on('end', common.mustCall(() => { - const expect = 'process.stdout\r\n' + - 'process.stdin\r\n' + - 'process.stderr'; - assert.match(output, new RegExp(expect)); -})); - -iStream.write('process.s\t'); - -// Completion works. -assert.match(output, /process\.std\b/); -// Completion doesn’t show all results yet. -assert.doesNotMatch(output, /stdout/); - -iStream.write('\t'); -oStream.end(); diff --git a/cli/tests/node_compat/test/parallel/test-readline.js b/cli/tests/node_compat/test/parallel/test-readline.js deleted file mode 100644 index 15f1b4f0c..000000000 --- a/cli/tests/node_compat/test/parallel/test-readline.js +++ /dev/null @@ -1,158 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { PassThrough } = require('stream'); -const readline = require('readline'); -const assert = require('assert'); - -common.skipIfDumbTerminal(); - -{ - const input = new PassThrough(); - const rl = readline.createInterface({ - terminal: true, - input: input - }); - - rl.on('line', common.mustCall((data) => { - assert.strictEqual(data, 'abc'); - })); - - input.end('abc'); -} - -{ - const input = new PassThrough(); - const rl = readline.createInterface({ - terminal: true, - input: input - }); - - rl.on('line', common.mustNotCall('must not be called before newline')); - - input.write('abc'); -} - -{ - const input = new PassThrough(); - const rl = readline.createInterface({ - terminal: true, - input: input - }); - - rl.on('line', common.mustCall((data) => { - assert.strictEqual(data, 'abc'); - })); - - input.write('abc\n'); -} - -{ - const input = new PassThrough(); - const rl = readline.createInterface({ - terminal: true, - input: input - }); - - rl.write('foo'); - assert.strictEqual(rl.cursor, 3); - - const key = { - xterm: { - home: ['\x1b[H', { ctrl: true, name: 'a' }], - end: ['\x1b[F', { ctrl: true, name: 'e' }], - }, - gnome: { - home: ['\x1bOH', { ctrl: true, name: 'a' }], - end: ['\x1bOF', { ctrl: true, name: 'e' }] - }, - rxvt: { - home: ['\x1b[7', { ctrl: true, name: 'a' }], - end: ['\x1b[8', { ctrl: true, name: 'e' }] - }, - putty: { - home: ['\x1b[1~', { ctrl: true, name: 'a' }], - end: ['\x1b[>~', { ctrl: true, name: 'e' }] - } - }; - - [key.xterm, key.gnome, key.rxvt, key.putty].forEach(function(key) { - rl.write.apply(rl, key.home); - assert.strictEqual(rl.cursor, 0); - rl.write.apply(rl, key.end); - assert.strictEqual(rl.cursor, 3); - }); - -} - -{ - const input = new PassThrough(); - const rl = readline.createInterface({ - terminal: true, - input: input - }); - - const key = { - xterm: { - home: ['\x1b[H', { ctrl: true, name: 'a' }], - metab: ['\x1bb', { meta: true, name: 'b' }], - metaf: ['\x1bf', { meta: true, name: 'f' }], - } - }; - - rl.write('foo bar.hop/zoo'); - rl.write.apply(rl, key.xterm.home); - [ - { cursor: 4, key: key.xterm.metaf }, - { cursor: 7, key: key.xterm.metaf }, - { cursor: 8, key: key.xterm.metaf }, - { cursor: 11, key: key.xterm.metaf }, - { cursor: 12, key: key.xterm.metaf }, - { cursor: 15, key: key.xterm.metaf }, - { cursor: 12, key: key.xterm.metab }, - { cursor: 11, key: key.xterm.metab }, - { cursor: 8, key: key.xterm.metab }, - { cursor: 7, key: key.xterm.metab }, - { cursor: 4, key: key.xterm.metab }, - { cursor: 0, key: key.xterm.metab }, - ].forEach(function(action) { - rl.write.apply(rl, action.key); - assert.strictEqual(rl.cursor, action.cursor); - }); -} - -{ - const input = new PassThrough(); - const rl = readline.createInterface({ - terminal: true, - input: input - }); - - const key = { - xterm: { - home: ['\x1b[H', { ctrl: true, name: 'a' }], - metad: ['\x1bd', { meta: true, name: 'd' }] - } - }; - - rl.write('foo bar.hop/zoo'); - rl.write.apply(rl, key.xterm.home); - [ - 'bar.hop/zoo', - '.hop/zoo', - 'hop/zoo', - '/zoo', - 'zoo', - '', - ].forEach(function(expectedLine) { - rl.write.apply(rl, key.xterm.metad); - assert.strictEqual(rl.cursor, 0); - assert.strictEqual(rl.line, expectedLine); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stdin-from-file-spawn.js b/cli/tests/node_compat/test/parallel/test-stdin-from-file-spawn.js deleted file mode 100644 index 2f6b41898..000000000 --- a/cli/tests/node_compat/test/parallel/test-stdin-from-file-spawn.js +++ /dev/null @@ -1,52 +0,0 @@ -// 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 - -// TODO(cjihrig): 'run -A runner.ts' should not be needed in -// execSync() call at the bottom of this test. - -'use strict'; -const common = require('../common'); -const process = require('process'); - -let defaultShell; -if (process.platform === 'linux' || process.platform === 'darwin') { - defaultShell = '/bin/sh'; -} else if (process.platform === 'win32') { - defaultShell = 'cmd.exe'; -} else { - common.skip('This is test exists only on Linux/Win32/OSX'); -} - -const { execSync } = require('child_process'); -const fs = require('fs'); -const path = require('path'); -const tmpdir = require('../common/tmpdir'); - -const tmpDir = tmpdir.path; -tmpdir.refresh(); -const tmpCmdFile = path.join(tmpDir, 'test-stdin-from-file-spawn-cmd'); -const tmpJsFile = path.join(tmpDir, 'test-stdin-from-file-spawn.js'); -fs.writeFileSync(tmpCmdFile, 'echo hello'); -fs.writeFileSync(tmpJsFile, ` -'use strict'; -const { spawn } = require('child_process'); -// Reference the object to invoke the getter -process.stdin; -setTimeout(() => { - let ok = false; - const child = spawn(process.env.SHELL || '${defaultShell}', - [], { stdio: ['inherit', 'pipe'] }); - child.stdout.on('data', () => { - ok = true; - }); - child.on('close', () => { - process.exit(ok ? 0 : -1); - }); -}, 100); -`); - -execSync(`${process.argv[0]} run -A runner.ts ${tmpJsFile} < ${tmpCmdFile}`); diff --git a/cli/tests/node_compat/test/parallel/test-stream-add-abort-signal.js b/cli/tests/node_compat/test/parallel/test-stream-add-abort-signal.js deleted file mode 100644 index cf598b547..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-add-abort-signal.js +++ /dev/null @@ -1,34 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; - -require('../common'); -const assert = require('assert'); -const { addAbortSignal, Readable } = require('stream'); -const { - addAbortSignalNoValidate, -} = require('internal/streams/add-abort-signal'); - -{ - assert.throws(() => { - addAbortSignal('INVALID_SIGNAL'); - }, /ERR_INVALID_ARG_TYPE/); - - const ac = new AbortController(); - assert.throws(() => { - addAbortSignal(ac.signal, 'INVALID_STREAM'); - }, /ERR_INVALID_ARG_TYPE/); -} - -{ - const r = new Readable({ - read: () => {}, - }); - assert.deepStrictEqual(r, addAbortSignalNoValidate('INVALID_SIGNAL', r)); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-aliases-legacy.js b/cli/tests/node_compat/test/parallel/test-stream-aliases-legacy.js deleted file mode 100644 index e0af8bb47..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-aliases-legacy.js +++ /dev/null @@ -1,21 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -const assert = require('assert'); -const stream = require('stream'); - -// Verify that all individual aliases are left in place. - -assert.strictEqual(stream.Readable, require('_stream_readable')); -assert.strictEqual(stream.Writable, require('_stream_writable')); -assert.strictEqual(stream.Duplex, require('_stream_duplex')); -assert.strictEqual(stream.Transform, require('_stream_transform')); -assert.strictEqual(stream.PassThrough, require('_stream_passthrough')); diff --git a/cli/tests/node_compat/test/parallel/test-stream-auto-destroy.js b/cli/tests/node_compat/test/parallel/test-stream-auto-destroy.js deleted file mode 100644 index a0947ba39..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-auto-destroy.js +++ /dev/null @@ -1,119 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -{ - const r = new stream.Readable({ - autoDestroy: true, - read() { - this.push('hello'); - this.push('world'); - this.push(null); - }, - destroy: common.mustCall((err, cb) => cb()) - }); - - let ended = false; - - r.resume(); - - r.on('end', common.mustCall(() => { - ended = true; - })); - - r.on('close', common.mustCall(() => { - assert(ended); - })); -} - -{ - const w = new stream.Writable({ - autoDestroy: true, - write(data, enc, cb) { - cb(null); - }, - destroy: common.mustCall((err, cb) => cb()) - }); - - let finished = false; - - w.write('hello'); - w.write('world'); - w.end(); - - w.on('finish', common.mustCall(() => { - finished = true; - })); - - w.on('close', common.mustCall(() => { - assert(finished); - })); -} - -{ - const t = new stream.Transform({ - autoDestroy: true, - transform(data, enc, cb) { - cb(null, data); - }, - destroy: common.mustCall((err, cb) => cb()) - }); - - let ended = false; - let finished = false; - - t.write('hello'); - t.write('world'); - t.end(); - - t.resume(); - - t.on('end', common.mustCall(() => { - ended = true; - })); - - t.on('finish', common.mustCall(() => { - finished = true; - })); - - t.on('close', common.mustCall(() => { - assert(ended); - assert(finished); - })); -} - -{ - const r = new stream.Readable({ - read() { - r2.emit('error', new Error('fail')); - } - }); - const r2 = new stream.Readable({ - autoDestroy: true, - destroy: common.mustCall((err, cb) => cb()) - }); - - r.pipe(r2); -} - -{ - const r = new stream.Readable({ - read() { - w.emit('error', new Error('fail')); - } - }); - const w = new stream.Writable({ - autoDestroy: true, - destroy: common.mustCall((err, cb) => cb()) - }); - - r.pipe(w); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js b/cli/tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js deleted file mode 100644 index 84095dbf1..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-await-drain-writers-in-synchronously-recursion-write.js +++ /dev/null @@ -1,35 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { PassThrough } = require('stream'); - -const encode = new PassThrough({ - highWaterMark: 1 -}); - -const decode = new PassThrough({ - highWaterMark: 1 -}); - -const send = common.mustCall((buf) => { - encode.write(buf); -}, 4); - -let i = 0; -const onData = common.mustCall(() => { - if (++i === 2) { - send(Buffer.from([0x3])); - send(Buffer.from([0x4])); - } -}, 4); - -encode.pipe(decode).on('data', onData); - -send(Buffer.from([0x1])); -send(Buffer.from([0x2])); diff --git a/cli/tests/node_compat/test/parallel/test-stream-backpressure.js b/cli/tests/node_compat/test/parallel/test-stream-backpressure.js deleted file mode 100644 index f1e14bb5d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-backpressure.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -let pushes = 0; -const total = 65500 + 40 * 1024; -const rs = new stream.Readable({ - read: common.mustCall(function() { - if (pushes++ === 10) { - this.push(null); - return; - } - - const length = this._readableState.length; - - // We are at most doing two full runs of _reads - // before stopping, because Readable is greedy - // to keep its buffer full - assert(length <= total); - - this.push(Buffer.alloc(65500)); - for (let i = 0; i < 40; i++) { - this.push(Buffer.alloc(1024)); - } - - // We will be over highWaterMark at this point - // but a new call to _read is scheduled anyway. - }, 11) -}); - -const ws = stream.Writable({ - write: common.mustCall(function(data, enc, cb) { - setImmediate(cb); - }, 41 * 10) -}); - -rs.pipe(ws); diff --git a/cli/tests/node_compat/test/parallel/test-stream-big-packet.js b/cli/tests/node_compat/test/parallel/test-stream-big-packet.js deleted file mode 100644 index 4e816cc2d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-big-packet.js +++ /dev/null @@ -1,72 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -let passed = false; - -class TestStream extends stream.Transform { - _transform(chunk, encoding, done) { - if (!passed) { - // Char 'a' only exists in the last write - passed = chunk.toString().includes('a'); - } - done(); - } -} - -const s1 = new stream.Transform({ - transform(chunk, encoding, cb) { - process.nextTick(cb, null, chunk); - } -}); -const s2 = new stream.PassThrough(); -const s3 = new TestStream(); -s1.pipe(s3); -// Don't let s2 auto close which may close s3 -s2.pipe(s3, { end: false }); - -// We must write a buffer larger than highWaterMark -const big = Buffer.alloc(s1.writableHighWaterMark + 1, 'x'); - -// Since big is larger than highWaterMark, it will be buffered internally. -assert(!s1.write(big)); -// 'tiny' is small enough to pass through internal buffer. -assert(s2.write('tiny')); - -// Write some small data in next IO loop, which will never be written to s3 -// Because 'drain' event is not emitted from s1 and s1 is still paused -setImmediate(s1.write.bind(s1), 'later'); - -// Assert after two IO loops when all operations have been done. -process.on('exit', function() { - assert(passed, 'Large buffer is not handled properly by Writable Stream'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-big-push.js b/cli/tests/node_compat/test/parallel/test-stream-big-push.js deleted file mode 100644 index 2e6d01fe2..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-big-push.js +++ /dev/null @@ -1,81 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 stream = require('stream'); -const str = 'asdfasdfasdfasdfasdf'; - -const r = new stream.Readable({ - highWaterMark: 5, - encoding: 'utf8' -}); - -let reads = 0; - -function _read() { - if (reads === 0) { - setTimeout(() => { - r.push(str); - }, 1); - reads++; - } else if (reads === 1) { - const ret = r.push(str); - assert.strictEqual(ret, false); - reads++; - } else { - r.push(null); - } -} - -r._read = common.mustCall(_read, 3); - -r.on('end', common.mustCall()); - -// Push some data in to start. -// We've never gotten any read event at this point. -const ret = r.push(str); -// Should be false. > hwm -assert(!ret); -let chunk = r.read(); -assert.strictEqual(chunk, str); -chunk = r.read(); -assert.strictEqual(chunk, null); - -r.once('readable', () => { - // This time, we'll get *all* the remaining data, because - // it's been added synchronously, as the read WOULD take - // us below the hwm, and so it triggered a _read() again, - // which synchronously added more, which we then return. - chunk = r.read(); - assert.strictEqual(chunk, str + str); - - chunk = r.read(); - assert.strictEqual(chunk, null); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-buffer-list.js b/cli/tests/node_compat/test/parallel/test-stream-buffer-list.js deleted file mode 100644 index 7b16f5d83..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-buffer-list.js +++ /dev/null @@ -1,91 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; -require('../common'); -const assert = require('assert'); -const BufferList = require('internal/streams/buffer_list'); - -// Test empty buffer list. -const emptyList = new BufferList(); - -emptyList.shift(); -assert.deepStrictEqual(emptyList, new BufferList()); - -assert.strictEqual(emptyList.join(','), ''); - -assert.deepStrictEqual(emptyList.concat(0), Buffer.alloc(0)); - -const buf = Buffer.from('foo'); - -function testIterator(list, count) { - // test iterator - let len = 0; - // eslint-disable-next-line no-unused-vars - for (const x of list) { - len++; - } - assert.strictEqual(len, count); -} - -// Test buffer list with one element. -const list = new BufferList(); -testIterator(list, 0); - -list.push(buf); -testIterator(list, 1); -for (const x of list) { - assert.strictEqual(x, buf); -} - -const copy = list.concat(3); -testIterator(copy, 3); - -assert.notStrictEqual(copy, buf); -assert.deepStrictEqual(copy, buf); - -assert.strictEqual(list.join(','), 'foo'); - -const shifted = list.shift(); -testIterator(list, 0); -assert.strictEqual(shifted, buf); -assert.deepStrictEqual(list, new BufferList()); - -{ - const list = new BufferList(); - list.push('foo'); - list.push('bar'); - list.push('foo'); - list.push('bar'); - assert.strictEqual(list.consume(6, true), 'foobar'); - assert.strictEqual(list.consume(6, true), 'foobar'); -} - -{ - const list = new BufferList(); - list.push('foo'); - list.push('bar'); - assert.strictEqual(list.consume(5, true), 'fooba'); -} - -{ - const list = new BufferList(); - list.push(buf); - list.push(buf); - list.push(buf); - list.push(buf); - assert.strictEqual(list.consume(6).toString(), 'foofoo'); - assert.strictEqual(list.consume(6).toString(), 'foofoo'); -} - -{ - const list = new BufferList(); - list.push(buf); - list.push(buf); - assert.strictEqual(list.consume(5).toString(), 'foofo'); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-construct.js b/cli/tests/node_compat/test/parallel/test-stream-construct.js deleted file mode 100644 index 0cd93c9e9..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-construct.js +++ /dev/null @@ -1,287 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Writable, Readable, Duplex } = require('stream'); -const assert = require('assert'); - -{ - // Multiple callback. - new Writable({ - construct: common.mustCall((callback) => { - callback(); - callback(); - }) - }).on('error', common.expectsError({ - name: 'Error', - code: 'ERR_MULTIPLE_CALLBACK' - })); -} - -{ - // Multiple callback. - new Readable({ - construct: common.mustCall((callback) => { - callback(); - callback(); - }) - }).on('error', common.expectsError({ - name: 'Error', - code: 'ERR_MULTIPLE_CALLBACK' - })); -} - -{ - // Synchronous error. - - new Writable({ - construct: common.mustCall((callback) => { - callback(new Error('test')); - }) - }).on('error', common.expectsError({ - name: 'Error', - message: 'test' - })); -} - -{ - // Synchronous error. - - new Readable({ - construct: common.mustCall((callback) => { - callback(new Error('test')); - }) - }).on('error', common.expectsError({ - name: 'Error', - message: 'test' - })); -} - -{ - // Asynchronous error. - - new Writable({ - construct: common.mustCall((callback) => { - process.nextTick(callback, new Error('test')); - }) - }).on('error', common.expectsError({ - name: 'Error', - message: 'test' - })); -} - -{ - // Asynchronous error. - - new Readable({ - construct: common.mustCall((callback) => { - process.nextTick(callback, new Error('test')); - }) - }).on('error', common.expectsError({ - name: 'Error', - message: 'test' - })); -} - -function testDestroy(factory) { - { - let constructed = false; - const s = factory({ - construct: common.mustCall((cb) => { - constructed = true; - process.nextTick(cb); - }) - }); - s.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - s.destroy(); - } - - { - let constructed = false; - const s = factory({ - construct: common.mustCall((cb) => { - constructed = true; - process.nextTick(cb); - }) - }); - s.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - s.destroy(null, () => { - assert.strictEqual(constructed, true); - }); - } - - { - let constructed = false; - const s = factory({ - construct: common.mustCall((cb) => { - constructed = true; - process.nextTick(cb); - }) - }); - s.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - s.destroy(); - } - - - { - let constructed = false; - const s = factory({ - construct: common.mustCall((cb) => { - constructed = true; - process.nextTick(cb); - }) - }); - s.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - s.on('error', common.mustCall((err) => { - assert.strictEqual(err.message, 'kaboom'); - })); - s.destroy(new Error('kaboom'), (err) => { - assert.strictEqual(err.message, 'kaboom'); - assert.strictEqual(constructed, true); - }); - } - - { - let constructed = false; - const s = factory({ - construct: common.mustCall((cb) => { - constructed = true; - process.nextTick(cb); - }) - }); - s.on('error', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - s.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - s.destroy(new Error()); - } -} -testDestroy((opts) => new Readable({ - read: common.mustNotCall(), - ...opts -})); -testDestroy((opts) => new Writable({ - write: common.mustNotCall(), - final: common.mustNotCall(), - ...opts -})); - -{ - let constructed = false; - const r = new Readable({ - autoDestroy: true, - construct: common.mustCall((cb) => { - constructed = true; - process.nextTick(cb); - }), - read: common.mustCall(() => { - assert.strictEqual(constructed, true); - r.push(null); - }) - }); - r.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - r.on('data', common.mustNotCall()); -} - -{ - let constructed = false; - const w = new Writable({ - autoDestroy: true, - construct: common.mustCall((cb) => { - constructed = true; - process.nextTick(cb); - }), - write: common.mustCall((chunk, encoding, cb) => { - assert.strictEqual(constructed, true); - process.nextTick(cb); - }), - final: common.mustCall((cb) => { - assert.strictEqual(constructed, true); - process.nextTick(cb); - }) - }); - w.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - w.end('data'); -} - -{ - let constructed = false; - const w = new Writable({ - autoDestroy: true, - construct: common.mustCall((cb) => { - constructed = true; - process.nextTick(cb); - }), - write: common.mustNotCall(), - final: common.mustCall((cb) => { - assert.strictEqual(constructed, true); - process.nextTick(cb); - }) - }); - w.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); - w.end(); -} - -{ - new Duplex({ - construct: common.mustCall() - }); -} - -{ - // https://github.com/nodejs/node/issues/34448 - - let constructed = false; - const d = new Duplex({ - readable: false, - construct: common.mustCall((callback) => { - setImmediate(common.mustCall(() => { - constructed = true; - callback(); - })); - }), - write(chunk, encoding, callback) { - callback(); - }, - read() { - this.push(null); - } - }); - d.resume(); - d.end('foo'); - d.on('close', common.mustCall(() => { - assert.strictEqual(constructed, true); - })); -} - -{ - // Construct should not cause stream to read. - new Readable({ - construct: common.mustCall((callback) => { - callback(); - }), - read: common.mustNotCall() - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-destroy-event-order.js b/cli/tests/node_compat/test/parallel/test-stream-destroy-event-order.js deleted file mode 100644 index 09802b2a3..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-destroy-event-order.js +++ /dev/null @@ -1,31 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Readable } = require('stream'); - -const rs = new Readable({ - read() {} -}); - -let closed = false; -let errored = false; - -rs.on('close', common.mustCall(() => { - closed = true; - assert(errored); -})); - -rs.on('error', common.mustCall((err) => { - errored = true; - assert(!closed); -})); - -rs.destroy(new Error('kaboom')); diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-destroy.js b/cli/tests/node_compat/test/parallel/test-stream-duplex-destroy.js deleted file mode 100644 index 73cf75fe3..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-duplex-destroy.js +++ /dev/null @@ -1,264 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Duplex } = require('stream'); -const assert = require('assert'); - -{ - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {} - }); - - duplex.resume(); - - duplex.on('end', common.mustNotCall()); - duplex.on('finish', common.mustNotCall()); - duplex.on('close', common.mustCall()); - - duplex.destroy(); - assert.strictEqual(duplex.destroyed, true); -} - -{ - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {} - }); - duplex.resume(); - - const expected = new Error('kaboom'); - - duplex.on('end', common.mustNotCall()); - duplex.on('finish', common.mustNotCall()); - duplex.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - duplex.destroy(expected); - assert.strictEqual(duplex.destroyed, true); -} - -{ - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {} - }); - - duplex._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, expected); - cb(err); - }); - - const expected = new Error('kaboom'); - - duplex.on('finish', common.mustNotCall('no finish event')); - duplex.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - duplex.destroy(expected); - assert.strictEqual(duplex.destroyed, true); -} - -{ - const expected = new Error('kaboom'); - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {}, - destroy: common.mustCall(function(err, cb) { - assert.strictEqual(err, expected); - cb(); - }) - }); - duplex.resume(); - - duplex.on('end', common.mustNotCall('no end event')); - duplex.on('finish', common.mustNotCall('no finish event')); - - // Error is swallowed by the custom _destroy - duplex.on('error', common.mustNotCall('no error event')); - duplex.on('close', common.mustCall()); - - duplex.destroy(expected); - assert.strictEqual(duplex.destroyed, true); -} - -{ - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {} - }); - - duplex._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - cb(); - }); - - duplex.destroy(); - assert.strictEqual(duplex.destroyed, true); -} - -{ - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {} - }); - duplex.resume(); - - duplex._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - process.nextTick(() => { - this.push(null); - this.end(); - cb(); - }); - }); - - const fail = common.mustNotCall('no finish or end event'); - - duplex.on('finish', fail); - duplex.on('end', fail); - - duplex.destroy(); - - duplex.removeListener('end', fail); - duplex.removeListener('finish', fail); - duplex.on('end', common.mustNotCall()); - duplex.on('finish', common.mustNotCall()); - assert.strictEqual(duplex.destroyed, true); -} - -{ - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {} - }); - - const expected = new Error('kaboom'); - - duplex._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - cb(expected); - }); - - duplex.on('finish', common.mustNotCall('no finish event')); - duplex.on('end', common.mustNotCall('no end event')); - duplex.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - duplex.destroy(); - assert.strictEqual(duplex.destroyed, true); -} - -{ - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {}, - allowHalfOpen: true - }); - duplex.resume(); - - duplex.on('finish', common.mustNotCall()); - duplex.on('end', common.mustNotCall()); - - duplex.destroy(); - assert.strictEqual(duplex.destroyed, true); -} - -{ - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {}, - }); - - duplex.destroyed = true; - assert.strictEqual(duplex.destroyed, true); - - // The internal destroy() mechanism should not be triggered - duplex.on('finish', common.mustNotCall()); - duplex.on('end', common.mustNotCall()); - duplex.destroy(); -} - -{ - function MyDuplex() { - assert.strictEqual(this.destroyed, false); - this.destroyed = false; - Duplex.call(this); - } - - Object.setPrototypeOf(MyDuplex.prototype, Duplex.prototype); - Object.setPrototypeOf(MyDuplex, Duplex); - - new MyDuplex(); -} - -{ - const duplex = new Duplex({ - writable: false, - autoDestroy: true, - write(chunk, enc, cb) { cb(); }, - read() {}, - }); - duplex.push(null); - duplex.resume(); - duplex.on('close', common.mustCall()); -} - -{ - const duplex = new Duplex({ - readable: false, - autoDestroy: true, - write(chunk, enc, cb) { cb(); }, - read() {}, - }); - duplex.end(); - duplex.on('close', common.mustCall()); -} - -{ - const duplex = new Duplex({ - allowHalfOpen: false, - autoDestroy: true, - write(chunk, enc, cb) { cb(); }, - read() {}, - }); - duplex.push(null); - duplex.resume(); - const orgEnd = duplex.end; - duplex.end = common.mustNotCall(); - duplex.on('end', () => { - // Ensure end() is called in next tick to allow - // any pending writes to be invoked first. - process.nextTick(() => { - duplex.end = common.mustCall(orgEnd); - }); - }); - duplex.on('close', common.mustCall()); -} -{ - // Check abort signal - const controller = new AbortController(); - const { signal } = controller; - const duplex = new Duplex({ - write(chunk, enc, cb) { cb(); }, - read() {}, - signal, - }); - let count = 0; - duplex.on('error', common.mustCall((e) => { - assert.strictEqual(count++, 0); // Ensure not called twice - assert.strictEqual(e.name, 'AbortError'); - })); - duplex.on('close', common.mustCall()); - controller.abort(); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-end.js b/cli/tests/node_compat/test/parallel/test-stream-duplex-end.js deleted file mode 100644 index b6d95a448..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-duplex-end.js +++ /dev/null @@ -1,48 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const Duplex = require('stream').Duplex; - -{ - const stream = new Duplex({ - read() {} - }); - assert.strictEqual(stream.allowHalfOpen, true); - stream.on('finish', common.mustNotCall()); - assert.strictEqual(stream.listenerCount('end'), 0); - stream.resume(); - stream.push(null); -} - -{ - const stream = new Duplex({ - read() {}, - allowHalfOpen: false - }); - assert.strictEqual(stream.allowHalfOpen, false); - stream.on('finish', common.mustCall()); - assert.strictEqual(stream.listenerCount('end'), 0); - stream.resume(); - stream.push(null); -} - -{ - const stream = new Duplex({ - read() {}, - allowHalfOpen: false - }); - assert.strictEqual(stream.allowHalfOpen, false); - stream._writableState.ended = true; - stream.on('finish', common.mustNotCall()); - assert.strictEqual(stream.listenerCount('end'), 0); - stream.resume(); - stream.push(null); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-from.js b/cli/tests/node_compat/test/parallel/test-stream-duplex-from.js deleted file mode 100644 index c91a040c5..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-duplex-from.js +++ /dev/null @@ -1,413 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Duplex, Readable, Writable, pipeline, PassThrough } = require('stream'); -const { ReadableStream, WritableStream } = require('stream/web'); -const { Blob } = require('buffer'); - -{ - const d = Duplex.from({ - readable: new Readable({ - read() { - this.push('asd'); - this.push(null); - } - }) - }); - assert.strictEqual(d.readable, true); - assert.strictEqual(d.writable, false); - d.once('readable', common.mustCall(function() { - assert.strictEqual(d.read().toString(), 'asd'); - })); - d.once('end', common.mustCall(function() { - assert.strictEqual(d.readable, false); - })); -} - -{ - const d = Duplex.from(new Readable({ - read() { - this.push('asd'); - this.push(null); - } - })); - assert.strictEqual(d.readable, true); - assert.strictEqual(d.writable, false); - d.once('readable', common.mustCall(function() { - assert.strictEqual(d.read().toString(), 'asd'); - })); - d.once('end', common.mustCall(function() { - assert.strictEqual(d.readable, false); - })); -} - -{ - let ret = ''; - const d = Duplex.from(new Writable({ - write(chunk, encoding, callback) { - ret += chunk; - callback(); - } - })); - assert.strictEqual(d.readable, false); - assert.strictEqual(d.writable, true); - d.end('asd'); - d.on('finish', common.mustCall(function() { - assert.strictEqual(d.writable, false); - assert.strictEqual(ret, 'asd'); - })); -} - -{ - let ret = ''; - const d = Duplex.from({ - writable: new Writable({ - write(chunk, encoding, callback) { - ret += chunk; - callback(); - } - }) - }); - assert.strictEqual(d.readable, false); - assert.strictEqual(d.writable, true); - d.end('asd'); - d.on('finish', common.mustCall(function() { - assert.strictEqual(d.writable, false); - assert.strictEqual(ret, 'asd'); - })); -} - -{ - let ret = ''; - const d = Duplex.from({ - readable: new Readable({ - read() { - this.push('asd'); - this.push(null); - } - }), - writable: new Writable({ - write(chunk, encoding, callback) { - ret += chunk; - callback(); - } - }) - }); - assert.strictEqual(d.readable, true); - assert.strictEqual(d.writable, true); - d.once('readable', common.mustCall(function() { - assert.strictEqual(d.read().toString(), 'asd'); - })); - d.once('end', common.mustCall(function() { - assert.strictEqual(d.readable, false); - })); - d.end('asd'); - d.once('finish', common.mustCall(function() { - assert.strictEqual(d.writable, false); - assert.strictEqual(ret, 'asd'); - })); -} - -{ - const d = Duplex.from(Promise.resolve('asd')); - assert.strictEqual(d.readable, true); - assert.strictEqual(d.writable, false); - d.once('readable', common.mustCall(function() { - assert.strictEqual(d.read().toString(), 'asd'); - })); - d.once('end', common.mustCall(function() { - assert.strictEqual(d.readable, false); - })); -} - -{ - // https://github.com/nodejs/node/issues/40497 - pipeline( - ['abc\ndef\nghi'], - Duplex.from(async function * (source) { - let rest = ''; - for await (const chunk of source) { - const lines = (rest + chunk.toString()).split('\n'); - rest = lines.pop(); - for (const line of lines) { - yield line; - } - } - yield rest; - }), - async function * (source) { // eslint-disable-line require-yield - let ret = ''; - for await (const x of source) { - ret += x; - } - assert.strictEqual(ret, 'abcdefghi'); - }, - common.mustSucceed(), - ); -} - -// Ensure that isDuplexNodeStream was called -{ - const duplex = new Duplex(); - assert.strictEqual(Duplex.from(duplex), duplex); -} - -// Ensure that Duplex.from works for blobs -{ - const blob = new Blob(['blob']); - const expectedByteLength = blob.size; - const duplex = Duplex.from(blob); - duplex.on('data', common.mustCall((arrayBuffer) => { - assert.strictEqual(arrayBuffer.byteLength, expectedByteLength); - })); -} - -// Ensure that given a promise rejection it emits an error -{ - const myErrorMessage = 'myCustomError'; - Duplex.from(Promise.reject(myErrorMessage)) - .on('error', common.mustCall((error) => { - assert.strictEqual(error, myErrorMessage); - })); -} - -// Ensure that given a promise rejection on an async function it emits an error -{ - const myErrorMessage = 'myCustomError'; - async function asyncFn() { - return Promise.reject(myErrorMessage); - } - - Duplex.from(asyncFn) - .on('error', common.mustCall((error) => { - assert.strictEqual(error, myErrorMessage); - })); -} - -// Ensure that Duplex.from throws an Invalid return value when function is void -{ - assert.throws(() => Duplex.from(() => {}), { - code: 'ERR_INVALID_RETURN_VALUE', - }); -} - -// Ensure data if a sub object has a readable stream it's duplexified -{ - const msg = Buffer.from('hello'); - const duplex = Duplex.from({ - readable: Readable({ - read() { - this.push(msg); - this.push(null); - } - }) - }).on('data', common.mustCall((data) => { - assert.strictEqual(data, msg); - })); - - assert.strictEqual(duplex.writable, false); -} - -// Ensure data if a sub object has a writable stream it's duplexified -{ - const msg = Buffer.from('hello'); - const duplex = Duplex.from({ - writable: Writable({ - write: common.mustCall((data) => { - assert.strictEqual(data, msg); - }) - }) - }); - - duplex.write(msg); - assert.strictEqual(duplex.readable, false); -} - -// Ensure data if a sub object has a writable and readable stream it's duplexified -{ - const msg = Buffer.from('hello'); - - const duplex = Duplex.from({ - readable: Readable({ - read() { - this.push(msg); - this.push(null); - } - }), - writable: Writable({ - write: common.mustCall((data) => { - assert.strictEqual(data, msg); - }) - }) - }); - - duplex.pipe(duplex) - .on('data', common.mustCall((data) => { - assert.strictEqual(data, msg); - assert.strictEqual(duplex.readable, true); - assert.strictEqual(duplex.writable, true); - })) - .on('end', common.mustCall()); -} - -// Ensure that given readable stream that throws an error it calls destroy -{ - const myErrorMessage = 'error!'; - const duplex = Duplex.from(Readable({ - read() { - throw new Error(myErrorMessage); - } - })); - duplex.on('error', common.mustCall((msg) => { - assert.strictEqual(msg.message, myErrorMessage); - })); -} - -// Ensure that given writable stream that throws an error it calls destroy -{ - const myErrorMessage = 'error!'; - const duplex = Duplex.from(Writable({ - write(chunk, enc, cb) { - cb(myErrorMessage); - } - })); - - duplex.on('error', common.mustCall((msg) => { - assert.strictEqual(msg, myErrorMessage); - })); - - duplex.write('test'); -} - -{ - const through = new PassThrough({ objectMode: true }); - - let res = ''; - const d = Readable.from(['foo', 'bar'], { objectMode: true }) - .pipe(Duplex.from({ - writable: through, - readable: through - })); - - d.on('data', (data) => { - d.pause(); - setImmediate(() => { - d.resume(); - }); - res += data; - }).on('end', common.mustCall(() => { - assert.strictEqual(res, 'foobar'); - })).on('close', common.mustCall()); -} - -function makeATestReadableStream(value) { - return new ReadableStream({ - start(controller) { - controller.enqueue(value); - controller.close(); - } - }); -} - -function makeATestWritableStream(writeFunc) { - return new WritableStream({ - write(chunk) { - writeFunc(chunk); - } - }); -} - -{ - const d = Duplex.from({ - readable: makeATestReadableStream('foo'), - }); - assert.strictEqual(d.readable, true); - assert.strictEqual(d.writable, false); - - d.on('data', common.mustCall((data) => { - assert.strictEqual(data.toString(), 'foo'); - })); - - d.on('end', common.mustCall(() => { - assert.strictEqual(d.readable, false); - })); -} - -{ - const d = Duplex.from(makeATestReadableStream('foo')); - - assert.strictEqual(d.readable, true); - assert.strictEqual(d.writable, false); - - d.on('data', common.mustCall((data) => { - assert.strictEqual(data.toString(), 'foo'); - })); - - d.on('end', common.mustCall(() => { - assert.strictEqual(d.readable, false); - })); -} - -/* -TODO(kt3k): Enable this test case -{ - let ret = ''; - const d = Duplex.from({ - writable: makeATestWritableStream((chunk) => ret += chunk), - }); - - assert.strictEqual(d.readable, false); - assert.strictEqual(d.writable, true); - - d.end('foo'); - d.on('finish', common.mustCall(() => { - assert.strictEqual(ret, 'foo'); - assert.strictEqual(d.writable, false); - })); -} - -{ - let ret = ''; - const d = Duplex.from(makeATestWritableStream((chunk) => ret += chunk)); - - assert.strictEqual(d.readable, false); - assert.strictEqual(d.writable, true); - - d.end('foo'); - d.on('finish', common.mustCall(() => { - assert.strictEqual(ret, 'foo'); - assert.strictEqual(d.writable, false); - })); -} - -{ - let ret = ''; - const d = Duplex.from({ - readable: makeATestReadableStream('foo'), - writable: makeATestWritableStream((chunk) => ret += chunk), - }); - - d.end('bar'); - - d.on('data', common.mustCall((data) => { - assert.strictEqual(data.toString(), 'foo'); - })); - - d.on('end', common.mustCall(() => { - assert.strictEqual(d.readable, false); - })); - - d.on('finish', common.mustCall(() => { - assert.strictEqual(ret, 'bar'); - assert.strictEqual(d.writable, false); - })); -} -*/ diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-props.js b/cli/tests/node_compat/test/parallel/test-stream-duplex-props.js deleted file mode 100644 index 1eedc9404..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-duplex-props.js +++ /dev/null @@ -1,38 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const { Duplex } = require('stream'); - -{ - const d = new Duplex({ - objectMode: true, - highWaterMark: 100 - }); - - assert.strictEqual(d.writableObjectMode, true); - assert.strictEqual(d.writableHighWaterMark, 100); - assert.strictEqual(d.readableObjectMode, true); - assert.strictEqual(d.readableHighWaterMark, 100); -} - -{ - const d = new Duplex({ - readableObjectMode: false, - readableHighWaterMark: 10, - writableObjectMode: true, - writableHighWaterMark: 100 - }); - - assert.strictEqual(d.writableObjectMode, true); - assert.strictEqual(d.writableHighWaterMark, 100); - assert.strictEqual(d.readableObjectMode, false); - assert.strictEqual(d.readableHighWaterMark, 10); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-readable-end.js b/cli/tests/node_compat/test/parallel/test-stream-duplex-readable-end.js deleted file mode 100644 index 87327814c..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-duplex-readable-end.js +++ /dev/null @@ -1,36 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// https://github.com/nodejs/node/issues/35926 -const common = require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -let loops = 5; - -const src = new stream.Readable({ - read() { - if (loops--) - this.push(Buffer.alloc(20000)); - } -}); - -const dst = new stream.Transform({ - transform(chunk, output, fn) { - this.push(null); - fn(); - } -}); - -src.pipe(dst); - -dst.on('data', () => { }); -dst.on('end', common.mustCall(() => { - assert.strictEqual(loops, 3); - assert.ok(src.isPaused()); -})); diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js b/cli/tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js deleted file mode 100644 index c556d14ef..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-duplex-writable-finished.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Duplex } = require('stream'); -const assert = require('assert'); - -// basic -{ - // Find it on Duplex.prototype - assert(Object.hasOwn(Duplex.prototype, 'writableFinished')); -} - -// event -{ - const duplex = new Duplex(); - - duplex._write = (chunk, encoding, cb) => { - // The state finished should start in false. - assert.strictEqual(duplex.writableFinished, false); - cb(); - }; - - duplex.on('finish', common.mustCall(() => { - assert.strictEqual(duplex.writableFinished, true); - })); - - duplex.end('testing finished state', common.mustCall(() => { - assert.strictEqual(duplex.writableFinished, true); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-duplex.js b/cli/tests/node_compat/test/parallel/test-stream-duplex.js deleted file mode 100644 index d7210e49e..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-duplex.js +++ /dev/null @@ -1,140 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 Duplex = require('stream').Duplex; -const { ReadableStream, WritableStream } = require('stream/web'); - -const stream = new Duplex({ objectMode: true }); - -assert(Duplex() instanceof Duplex); -assert(stream._readableState.objectMode); -assert(stream._writableState.objectMode); -assert(stream.allowHalfOpen); -assert.strictEqual(stream.listenerCount('end'), 0); - -let written; -let read; - -stream._write = (obj, _, cb) => { - written = obj; - cb(); -}; - -stream._read = () => {}; - -stream.on('data', (obj) => { - read = obj; -}); - -stream.push({ val: 1 }); -stream.end({ val: 2 }); - -process.on('exit', () => { - assert.strictEqual(read.val, 1); - assert.strictEqual(written.val, 2); -}); - -// Duplex.fromWeb -{ - const dataToRead = Buffer.from('hello'); - const dataToWrite = Buffer.from('world'); - - const readable = new ReadableStream({ - start(controller) { - controller.enqueue(dataToRead); - }, - }); - - const writable = new WritableStream({ - write: common.mustCall((chunk) => { - assert.strictEqual(chunk, dataToWrite); - }) - }); - - const pair = { readable, writable }; - const duplex = Duplex.fromWeb(pair); - - duplex.write(dataToWrite); - duplex.once('data', common.mustCall((chunk) => { - assert.strictEqual(chunk, dataToRead); - })); -} - -// Duplex.fromWeb - using utf8 and objectMode -{ - const dataToRead = 'hello'; - const dataToWrite = 'world'; - - const readable = new ReadableStream({ - start(controller) { - controller.enqueue(dataToRead); - }, - }); - - const writable = new WritableStream({ - write: common.mustCall((chunk) => { - assert.strictEqual(chunk, dataToWrite); - }) - }); - - const pair = { - readable, - writable - }; - const duplex = Duplex.fromWeb(pair, { encoding: 'utf8', objectMode: true }); - - duplex.write(dataToWrite); - duplex.once('data', common.mustCall((chunk) => { - assert.strictEqual(chunk, dataToRead); - })); -} -// Duplex.toWeb -{ - const dataToRead = Buffer.from('hello'); - const dataToWrite = Buffer.from('world'); - - const duplex = Duplex({ - read() { - this.push(dataToRead); - this.push(null); - }, - write: common.mustCall((chunk) => { - assert.strictEqual(chunk, dataToWrite); - }) - }); - - const { writable, readable } = Duplex.toWeb(duplex); - writable.getWriter().write(dataToWrite); - - readable.getReader().read().then(common.mustCall((result) => { - assert.deepStrictEqual(Buffer.from(result.value), dataToRead); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-end-paused.js b/cli/tests/node_compat/test/parallel/test-stream-end-paused.js deleted file mode 100644 index 12c05243d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-end-paused.js +++ /dev/null @@ -1,57 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -// Make sure we don't miss the end event for paused 0-length streams - -const Readable = require('stream').Readable; -const stream = new Readable(); -let calledRead = false; -stream._read = function() { - assert(!calledRead); - calledRead = true; - this.push(null); -}; - -stream.on('data', function() { - throw new Error('should not ever get data'); -}); -stream.pause(); - -setTimeout(common.mustCall(function() { - stream.on('end', common.mustCall()); - stream.resume(); -}), 1); - -process.on('exit', function() { - assert(calledRead); - console.log('ok'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-error-once.js b/cli/tests/node_compat/test/parallel/test-stream-error-once.js deleted file mode 100644 index 592788d4f..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-error-once.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Writable, Readable } = require('stream'); - -{ - const writable = new Writable(); - writable.on('error', common.mustCall()); - writable.end(); - writable.write('h'); - writable.write('h'); -} - -{ - const readable = new Readable(); - readable.on('error', common.mustCall()); - readable.push(null); - readable.push('h'); - readable.push('h'); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-events-prepend.js b/cli/tests/node_compat/test/parallel/test-stream-events-prepend.js deleted file mode 100644 index 7245977f1..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-events-prepend.js +++ /dev/null @@ -1,33 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); - -class Writable extends stream.Writable { - constructor() { - super(); - this.prependListener = undefined; - } - - _write(chunk, end, cb) { - cb(); - } -} - -class Readable extends stream.Readable { - _read() { - this.push(null); - } -} - -const w = new Writable(); -w.on('pipe', common.mustCall()); - -const r = new Readable(); -r.pipe(w); diff --git a/cli/tests/node_compat/test/parallel/test-stream-inheritance.js b/cli/tests/node_compat/test/parallel/test-stream-inheritance.js deleted file mode 100644 index 296e12996..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-inheritance.js +++ /dev/null @@ -1,70 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const { Readable, Writable, Duplex, Transform } = require('stream'); - -const readable = new Readable({ read() {} }); -const writable = new Writable({ write() {} }); -const duplex = new Duplex({ read() {}, write() {} }); -const transform = new Transform({ transform() {} }); - -assert.ok(readable instanceof Readable); -assert.ok(!(writable instanceof Readable)); -assert.ok(duplex instanceof Readable); -assert.ok(transform instanceof Readable); - -assert.ok(!(readable instanceof Writable)); -assert.ok(writable instanceof Writable); -assert.ok(duplex instanceof Writable); -assert.ok(transform instanceof Writable); - -assert.ok(!(readable instanceof Duplex)); -assert.ok(!(writable instanceof Duplex)); -assert.ok(duplex instanceof Duplex); -assert.ok(transform instanceof Duplex); - -assert.ok(!(readable instanceof Transform)); -assert.ok(!(writable instanceof Transform)); -assert.ok(!(duplex instanceof Transform)); -assert.ok(transform instanceof Transform); - -assert.ok(!(null instanceof Writable)); -assert.ok(!(undefined instanceof Writable)); - -// Simple inheritance check for `Writable` works fine in a subclass constructor. -function CustomWritable() { - assert.ok( - this instanceof CustomWritable, - `${this} does not inherit from CustomWritable` - ); - assert.ok( - this instanceof Writable, - `${this} does not inherit from Writable` - ); -} - -Object.setPrototypeOf(CustomWritable, Writable); -Object.setPrototypeOf(CustomWritable.prototype, Writable.prototype); - -new CustomWritable(); - -assert.throws( - CustomWritable, - { - code: 'ERR_ASSERTION', - constructor: assert.AssertionError, - message: 'undefined does not inherit from CustomWritable' - } -); - -class OtherCustomWritable extends Writable {} - -assert(!(new OtherCustomWritable() instanceof CustomWritable)); -assert(!(new CustomWritable() instanceof OtherCustomWritable)); diff --git a/cli/tests/node_compat/test/parallel/test-stream-ispaused.js b/cli/tests/node_compat/test/parallel/test-stream-ispaused.js deleted file mode 100644 index 8f4897047..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-ispaused.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -const readable = new stream.Readable(); - -// _read is a noop, here. -readable._read = Function(); - -// Default state of a stream is not "paused" -assert.ok(!readable.isPaused()); - -// Make the stream start flowing... -readable.on('data', Function()); - -// still not paused. -assert.ok(!readable.isPaused()); - -readable.pause(); -assert.ok(readable.isPaused()); -readable.resume(); -assert.ok(!readable.isPaused()); diff --git a/cli/tests/node_compat/test/parallel/test-stream-objectmode-undefined.js b/cli/tests/node_compat/test/parallel/test-stream-objectmode-undefined.js deleted file mode 100644 index 0478b0ee7..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-objectmode-undefined.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { Readable, Writable, Transform } = require('stream'); - -{ - const stream = new Readable({ - objectMode: true, - read: common.mustCall(() => { - stream.push(undefined); - stream.push(null); - }) - }); - - stream.on('data', common.mustCall((chunk) => { - assert.strictEqual(chunk, undefined); - })); -} - -{ - const stream = new Writable({ - objectMode: true, - write: common.mustCall((chunk) => { - assert.strictEqual(chunk, undefined); - }) - }); - - stream.write(undefined); -} - -{ - const stream = new Transform({ - objectMode: true, - transform: common.mustCall((chunk) => { - stream.push(chunk); - }) - }); - - stream.on('data', common.mustCall((chunk) => { - assert.strictEqual(chunk, undefined); - })); - - stream.write(undefined); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-once-readable-pipe.js b/cli/tests/node_compat/test/parallel/test-stream-once-readable-pipe.js deleted file mode 100644 index f273b9602..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-once-readable-pipe.js +++ /dev/null @@ -1,68 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Readable, Writable } = require('stream'); - -// This test ensures that if have 'readable' listener -// on Readable instance it will not disrupt the pipe. - -{ - let receivedData = ''; - const w = new Writable({ - write: (chunk, env, callback) => { - receivedData += chunk; - callback(); - }, - }); - - const data = ['foo', 'bar', 'baz']; - const r = new Readable({ - read: () => {}, - }); - - r.once('readable', common.mustCall()); - - r.pipe(w); - r.push(data[0]); - r.push(data[1]); - r.push(data[2]); - r.push(null); - - w.on('finish', common.mustCall(() => { - assert.strictEqual(receivedData, data.join('')); - })); -} - -{ - let receivedData = ''; - const w = new Writable({ - write: (chunk, env, callback) => { - receivedData += chunk; - callback(); - }, - }); - - const data = ['foo', 'bar', 'baz']; - const r = new Readable({ - read: () => {}, - }); - - r.pipe(w); - r.push(data[0]); - r.push(data[1]); - r.push(data[2]); - r.push(null); - r.once('readable', common.mustCall()); - - w.on('finish', common.mustCall(() => { - assert.strictEqual(receivedData, data.join('')); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-after-end.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-after-end.js deleted file mode 100644 index a7af22b94..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-after-end.js +++ /dev/null @@ -1,76 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Readable, Writable } = require('stream'); - -class TestReadable extends Readable { - constructor(opt) { - super(opt); - this._ended = false; - } - - _read() { - if (this._ended) - this.emit('error', new Error('_read called twice')); - this._ended = true; - this.push(null); - } -} - -class TestWritable extends Writable { - constructor(opt) { - super(opt); - this._written = []; - } - - _write(chunk, encoding, cb) { - this._written.push(chunk); - cb(); - } -} - -// This one should not emit 'end' until we read() from it later. -const ender = new TestReadable(); - -// What happens when you pipe() a Readable that's already ended? -const piper = new TestReadable(); -// pushes EOF null, and length=0, so this will trigger 'end' -piper.read(); - -setTimeout(common.mustCall(function() { - ender.on('end', common.mustCall()); - const c = ender.read(); - assert.strictEqual(c, null); - - const w = new TestWritable(); - w.on('finish', common.mustCall()); - piper.pipe(w); -}), 1); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js deleted file mode 100644 index e49c99033..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-manual-resume.js +++ /dev/null @@ -1,82 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -// A consumer stream with a very low highWaterMark, which starts in a state -// where it buffers the chunk it receives rather than indicating that they -// have been consumed. -const writable = new stream.Writable({ - highWaterMark: 5 -}); - -let isCurrentlyBufferingWrites = true; -const queue = []; - -writable._write = (chunk, encoding, cb) => { - if (isCurrentlyBufferingWrites) - queue.push({ chunk, cb }); - else - cb(); -}; - -const readable = new stream.Readable({ - read() {} -}); - -readable.pipe(writable); - -readable.once('pause', common.mustCall(() => { - assert.strictEqual( - readable._readableState.awaitDrainWriters, - writable, - 'Expected awaitDrainWriters to be a Writable but instead got ' + - `${readable._readableState.awaitDrainWriters}` - ); - // First pause, resume manually. The next write() to writable will still - // return false, because chunks are still being buffered, so it will increase - // the awaitDrain counter again. - - process.nextTick(common.mustCall(() => { - readable.resume(); - })); - - readable.once('pause', common.mustCall(() => { - assert.strictEqual( - readable._readableState.awaitDrainWriters, - writable, - '.resume() should not reset the awaitDrainWriters, but instead got ' + - `${readable._readableState.awaitDrainWriters}` - ); - // Second pause, handle all chunks from now on. Once all callbacks that - // are currently queued up are handled, the awaitDrain drain counter should - // fall back to 0 and all chunks that are pending on the readable side - // should be flushed. - isCurrentlyBufferingWrites = false; - for (const queued of queue) - queued.cb(); - })); -})); - -readable.push(Buffer.alloc(100)); // Fill the writable HWM, first 'pause'. -readable.push(Buffer.alloc(100)); // Second 'pause'. -readable.push(Buffer.alloc(100)); // Should get through to the writable. -readable.push(null); - -writable.on('finish', common.mustCall(() => { - assert.strictEqual( - readable._readableState.awaitDrainWriters, - null, - `awaitDrainWriters should be reset to null - after all chunks are written but instead got - ${readable._readableState.awaitDrainWriters}` - ); - // Everything okay, all chunks were written. -})); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js deleted file mode 100644 index 54fbe9e89..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain-push-while-write.js +++ /dev/null @@ -1,43 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -const writable = new stream.Writable({ - write: common.mustCall(function(chunk, encoding, cb) { - assert.strictEqual( - readable._readableState.awaitDrainWriters, - null, - ); - - if (chunk.length === 32 * 1024) { // first chunk - readable.push(Buffer.alloc(34 * 1024)); // above hwm - // We should check if awaitDrain counter is increased in the next - // tick, because awaitDrain is incremented after this method finished - process.nextTick(() => { - assert.strictEqual(readable._readableState.awaitDrainWriters, writable); - }); - } - - process.nextTick(cb); - }, 3) -}); - -// A readable stream which produces two buffers. -const bufs = [Buffer.alloc(32 * 1024), Buffer.alloc(33 * 1024)]; // above hwm -const readable = new stream.Readable({ - read: function() { - while (bufs.length > 0) { - this.push(bufs.shift()); - } - } -}); - -readable.pipe(writable); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain.js deleted file mode 100644 index 49062fe0b..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-await-drain.js +++ /dev/null @@ -1,74 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -// This is very similar to test-stream-pipe-cleanup-pause.js. - -const reader = new stream.Readable(); -const writer1 = new stream.Writable(); -const writer2 = new stream.Writable(); -const writer3 = new stream.Writable(); - -// 560000 is chosen here because it is larger than the (default) highWaterMark -// and will cause `.write()` to return false -// See: https://github.com/nodejs/node/issues/5820 -const buffer = Buffer.allocUnsafe(560000); - -reader._read = () => {}; - -writer1._write = common.mustCall(function(chunk, encoding, cb) { - this.emit('chunk-received'); - process.nextTick(cb); -}, 1); - -writer1.once('chunk-received', () => { - assert.strictEqual( - reader._readableState.awaitDrainWriters.size, - 0, - 'awaitDrain initial value should be 0, actual is ' + - reader._readableState.awaitDrainWriters.size - ); - setImmediate(() => { - // This one should *not* get through to writer1 because writer2 is not - // "done" processing. - reader.push(buffer); - }); -}); - -// A "slow" consumer: -writer2._write = common.mustCall((chunk, encoding, cb) => { - assert.strictEqual( - reader._readableState.awaitDrainWriters.size, - 1, - 'awaitDrain should be 1 after first push, actual is ' + - reader._readableState.awaitDrainWriters.size - ); - // Not calling cb here to "simulate" slow stream. - // This should be called exactly once, since the first .write() call - // will return false. -}, 1); - -writer3._write = common.mustCall((chunk, encoding, cb) => { - assert.strictEqual( - reader._readableState.awaitDrainWriters.size, - 2, - 'awaitDrain should be 2 after second push, actual is ' + - reader._readableState.awaitDrainWriters.size - ); - // Not calling cb here to "simulate" slow stream. - // This should be called exactly once, since the first .write() call - // will return false. -}, 1); - -reader.pipe(writer1); -reader.pipe(writer2); -reader.pipe(writer3); -reader.push(buffer); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js deleted file mode 100644 index 279ce10d5..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup-pause.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); - -const reader = new stream.Readable(); -const writer1 = new stream.Writable(); -const writer2 = new stream.Writable(); - -// 560000 is chosen here because it is larger than the (default) highWaterMark -// and will cause `.write()` to return false -// See: https://github.com/nodejs/node/issues/2323 -const buffer = Buffer.allocUnsafe(560000); - -reader._read = () => {}; - -writer1._write = common.mustCall(function(chunk, encoding, cb) { - this.emit('chunk-received'); - cb(); -}, 1); -writer1.once('chunk-received', function() { - reader.unpipe(writer1); - reader.pipe(writer2); - reader.push(buffer); - setImmediate(function() { - reader.push(buffer); - setImmediate(function() { - reader.push(buffer); - }); - }); -}); - -writer2._write = common.mustCall(function(chunk, encoding, cb) { - cb(); -}, 3); - -reader.pipe(writer1); -reader.push(buffer); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup.js deleted file mode 100644 index 8106ab4f1..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-cleanup.js +++ /dev/null @@ -1,132 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -// This test asserts that Stream.prototype.pipe does not leave listeners -// hanging on the source or dest. -require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -function Writable() { - this.writable = true; - this.endCalls = 0; - stream.Stream.call(this); -} -Object.setPrototypeOf(Writable.prototype, stream.Stream.prototype); -Object.setPrototypeOf(Writable, stream.Stream); -Writable.prototype.end = function() { - this.endCalls++; -}; - -Writable.prototype.destroy = function() { - this.endCalls++; -}; - -function Readable() { - this.readable = true; - stream.Stream.call(this); -} -Object.setPrototypeOf(Readable.prototype, stream.Stream.prototype); -Object.setPrototypeOf(Readable, stream.Stream); - -function Duplex() { - this.readable = true; - Writable.call(this); -} -Object.setPrototypeOf(Duplex.prototype, Writable.prototype); -Object.setPrototypeOf(Duplex, Writable); - -let i = 0; -const limit = 100; - -let w = new Writable(); - -let r; - -for (i = 0; i < limit; i++) { - r = new Readable(); - r.pipe(w); - r.emit('end'); -} -assert.strictEqual(r.listeners('end').length, 0); -assert.strictEqual(w.endCalls, limit); - -w.endCalls = 0; - -for (i = 0; i < limit; i++) { - r = new Readable(); - r.pipe(w); - r.emit('close'); -} -assert.strictEqual(r.listeners('close').length, 0); -assert.strictEqual(w.endCalls, limit); - -w.endCalls = 0; - -r = new Readable(); - -for (i = 0; i < limit; i++) { - w = new Writable(); - r.pipe(w); - w.emit('close'); -} -assert.strictEqual(w.listeners('close').length, 0); - -r = new Readable(); -w = new Writable(); -const d = new Duplex(); -r.pipe(d); // pipeline A -d.pipe(w); // pipeline B -assert.strictEqual(r.listeners('end').length, 2); // A.onend, A.cleanup -assert.strictEqual(r.listeners('close').length, 2); // A.onclose, A.cleanup -assert.strictEqual(d.listeners('end').length, 2); // B.onend, B.cleanup -// A.cleanup, B.onclose, B.cleanup -assert.strictEqual(d.listeners('close').length, 3); -assert.strictEqual(w.listeners('end').length, 0); -assert.strictEqual(w.listeners('close').length, 1); // B.cleanup - -r.emit('end'); -assert.strictEqual(d.endCalls, 1); -assert.strictEqual(w.endCalls, 0); -assert.strictEqual(r.listeners('end').length, 0); -assert.strictEqual(r.listeners('close').length, 0); -assert.strictEqual(d.listeners('end').length, 2); // B.onend, B.cleanup -assert.strictEqual(d.listeners('close').length, 2); // B.onclose, B.cleanup -assert.strictEqual(w.listeners('end').length, 0); -assert.strictEqual(w.listeners('close').length, 1); // B.cleanup - -d.emit('end'); -assert.strictEqual(d.endCalls, 1); -assert.strictEqual(w.endCalls, 1); -assert.strictEqual(r.listeners('end').length, 0); -assert.strictEqual(r.listeners('close').length, 0); -assert.strictEqual(d.listeners('end').length, 0); -assert.strictEqual(d.listeners('close').length, 0); -assert.strictEqual(w.listeners('end').length, 0); -assert.strictEqual(w.listeners('close').length, 0); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-error-handling.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-error-handling.js deleted file mode 100644 index 356bb1cd9..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-error-handling.js +++ /dev/null @@ -1,131 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Stream, PassThrough } = require('stream'); - -{ - const source = new Stream(); - const dest = new Stream(); - - source.pipe(dest); - - let gotErr = null; - source.on('error', function(err) { - gotErr = err; - }); - - const err = new Error('This stream turned into bacon.'); - source.emit('error', err); - assert.strictEqual(gotErr, err); -} - -{ - const source = new Stream(); - const dest = new Stream(); - - source.pipe(dest); - - const err = new Error('This stream turned into bacon.'); - - let gotErr = null; - try { - source.emit('error', err); - } catch (e) { - gotErr = e; - } - - assert.strictEqual(gotErr, err); -} - -{ - const R = Stream.Readable; - const W = Stream.Writable; - - const r = new R({ autoDestroy: false }); - const w = new W({ autoDestroy: false }); - let removed = false; - - r._read = common.mustCall(function() { - setTimeout(common.mustCall(function() { - assert(removed); - assert.throws(function() { - w.emit('error', new Error('fail')); - }, /^Error: fail$/); - }), 1); - }); - - w.on('error', myOnError); - r.pipe(w); - w.removeListener('error', myOnError); - removed = true; - - function myOnError() { - throw new Error('this should not happen'); - } -} - -{ - const R = Stream.Readable; - const W = Stream.Writable; - - const r = new R(); - const w = new W(); - let removed = false; - - r._read = common.mustCall(function() { - setTimeout(common.mustCall(function() { - assert(removed); - w.emit('error', new Error('fail')); - }), 1); - }); - - w.on('error', common.mustCall()); - w._write = () => {}; - - r.pipe(w); - // Removing some OTHER random listener should not do anything - w.removeListener('error', () => {}); - removed = true; -} - -{ - const _err = new Error('this should be handled'); - const destination = new PassThrough(); - destination.once('error', common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - - const stream = new Stream(); - stream - .pipe(destination); - - destination.destroy(_err); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-event.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-event.js deleted file mode 100644 index a2721c053..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-event.js +++ /dev/null @@ -1,58 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -function Writable() { - this.writable = true; - stream.Stream.call(this); -} -Object.setPrototypeOf(Writable.prototype, stream.Stream.prototype); -Object.setPrototypeOf(Writable, stream.Stream); - -function Readable() { - this.readable = true; - stream.Stream.call(this); -} -Object.setPrototypeOf(Readable.prototype, stream.Stream.prototype); -Object.setPrototypeOf(Readable, stream.Stream); - -let passed = false; - -const w = new Writable(); -w.on('pipe', function(src) { - passed = true; -}); - -const r = new Readable(); -r.pipe(w); - -assert.ok(passed); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js deleted file mode 100644 index c0b144c18..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-flow-after-unpipe.js +++ /dev/null @@ -1,36 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Readable, Writable } = require('stream'); - -// Tests that calling .unpipe() un-blocks a stream that is paused because -// it is waiting on the writable side to finish a write(). - -const rs = new Readable({ - highWaterMark: 1, - // That this gets called at least 20 times is the real test here. - read: common.mustCallAtLeast(() => rs.push('foo'), 20) -}); - -const ws = new Writable({ - highWaterMark: 1, - write: common.mustCall(() => { - // Ignore the callback, this write() simply never finishes. - setImmediate(() => rs.unpipe(ws)); - }) -}); - -let chunks = 0; -rs.on('data', common.mustCallAtLeast(() => { - chunks++; - if (chunks >= 20) - rs.pause(); // Finish this test. -})); - -rs.pipe(ws); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-flow.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-flow.js deleted file mode 100644 index 8e877312f..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-flow.js +++ /dev/null @@ -1,97 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { Readable, Writable, PassThrough } = require('stream'); - -{ - let ticks = 17; - - const rs = new Readable({ - objectMode: true, - read: () => { - if (ticks-- > 0) - return process.nextTick(() => rs.push({})); - rs.push({}); - rs.push(null); - } - }); - - const ws = new Writable({ - highWaterMark: 0, - objectMode: true, - write: (data, end, cb) => setImmediate(cb) - }); - - rs.on('end', common.mustCall()); - ws.on('finish', common.mustCall()); - rs.pipe(ws); -} - -{ - let missing = 8; - - const rs = new Readable({ - objectMode: true, - read: () => { - if (missing--) rs.push({}); - else rs.push(null); - } - }); - - const pt = rs - .pipe(new PassThrough({ objectMode: true, highWaterMark: 2 })) - .pipe(new PassThrough({ objectMode: true, highWaterMark: 2 })); - - pt.on('end', () => { - wrapper.push(null); - }); - - const wrapper = new Readable({ - objectMode: true, - read: () => { - process.nextTick(() => { - let data = pt.read(); - if (data === null) { - pt.once('readable', () => { - data = pt.read(); - if (data !== null) wrapper.push(data); - }); - } else { - wrapper.push(data); - } - }); - } - }); - - wrapper.resume(); - wrapper.on('end', common.mustCall()); -} - -{ - // Only register drain if there is backpressure. - const rs = new Readable({ read() {} }); - - const pt = rs - .pipe(new PassThrough({ objectMode: true, highWaterMark: 2 })); - assert.strictEqual(pt.listenerCount('drain'), 0); - pt.on('finish', () => { - assert.strictEqual(pt.listenerCount('drain'), 0); - }); - - rs.push('asd'); - assert.strictEqual(pt.listenerCount('drain'), 0); - - process.nextTick(() => { - rs.push('asd'); - assert.strictEqual(pt.listenerCount('drain'), 0); - rs.push(null); - assert.strictEqual(pt.listenerCount('drain'), 0); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js deleted file mode 100644 index 0666e44d6..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-manual-resume.js +++ /dev/null @@ -1,42 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); - -function test(throwCodeInbetween) { - // Check that a pipe does not stall if .read() is called unexpectedly - // (i.e. the stream is not resumed by the pipe). - - const n = 1000; - let counter = n; - const rs = stream.Readable({ - objectMode: true, - read: common.mustCallAtLeast(() => { - if (--counter >= 0) - rs.push({ counter }); - else - rs.push(null); - }, n) - }); - - const ws = stream.Writable({ - objectMode: true, - write: common.mustCall((data, enc, cb) => { - setImmediate(cb); - }, n) - }); - - setImmediate(() => throwCodeInbetween(rs, ws)); - - rs.pipe(ws); -} - -test((rs) => rs.read()); -test((rs) => rs.resume()); -test(() => 0); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js deleted file mode 100644 index cd24dd4ca..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-multiple-pipes.js +++ /dev/null @@ -1,58 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -const readable = new stream.Readable({ - read: () => {} -}); - -const writables = []; - -for (let i = 0; i < 5; i++) { - const target = new stream.Writable({ - write: common.mustCall((chunk, encoding, callback) => { - target.output.push(chunk); - callback(); - }, 1) - }); - target.output = []; - - target.on('pipe', common.mustCall()); - readable.pipe(target); - - - writables.push(target); -} - -const input = Buffer.from([1, 2, 3, 4, 5]); - -readable.push(input); - -// The pipe() calls will postpone emission of the 'resume' event using nextTick, -// so no data will be available to the writable streams until then. -process.nextTick(common.mustCall(() => { - for (const target of writables) { - assert.deepStrictEqual(target.output, [input]); - - target.on('unpipe', common.mustCall()); - readable.unpipe(target); - } - - readable.push('something else'); // This does not get through. - readable.push(null); - readable.resume(); // Make sure the 'end' event gets emitted. -})); - -readable.on('end', common.mustCall(() => { - for (const target of writables) { - assert.deepStrictEqual(target.output, [input]); - } -})); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-needDrain.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-needDrain.js deleted file mode 100644 index f8b724de9..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-needDrain.js +++ /dev/null @@ -1,38 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Readable, Writable } = require('stream'); - -// Pipe should pause temporarily if writable needs drain. -{ - const w = new Writable({ - write(buf, encoding, callback) { - process.nextTick(callback); - }, - highWaterMark: 1 - }); - - while (w.write('asd')); - - assert.strictEqual(w.writableNeedDrain, true); - - const r = new Readable({ - read() { - this.push('asd'); - this.push(null); - } - }); - - r.on('pause', common.mustCall(2)); - r.on('end', common.mustCall()); - - r.pipe(w); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js deleted file mode 100644 index 7e1215733..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-same-destination-twice.js +++ /dev/null @@ -1,85 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -// Regression test for https://github.com/nodejs/node/issues/12718. -// Tests that piping a source stream twice to the same destination stream -// works, and that a subsequent unpipe() call only removes the pipe *once*. -const assert = require('assert'); -const { PassThrough, Writable } = require('stream'); - -{ - const passThrough = new PassThrough(); - const dest = new Writable({ - write: common.mustCall((chunk, encoding, cb) => { - assert.strictEqual(`${chunk}`, 'foobar'); - cb(); - }) - }); - - passThrough.pipe(dest); - passThrough.pipe(dest); - - assert.strictEqual(passThrough._events.data.length, 2); - assert.strictEqual(passThrough._readableState.pipes.length, 2); - assert.strictEqual(passThrough._readableState.pipes[0], dest); - assert.strictEqual(passThrough._readableState.pipes[1], dest); - - passThrough.unpipe(dest); - - assert.strictEqual(passThrough._events.data.length, 1); - assert.strictEqual(passThrough._readableState.pipes.length, 1); - assert.deepStrictEqual(passThrough._readableState.pipes, [dest]); - - passThrough.write('foobar'); - passThrough.pipe(dest); -} - -{ - const passThrough = new PassThrough(); - const dest = new Writable({ - write: common.mustCall((chunk, encoding, cb) => { - assert.strictEqual(`${chunk}`, 'foobar'); - cb(); - }, 2) - }); - - passThrough.pipe(dest); - passThrough.pipe(dest); - - assert.strictEqual(passThrough._events.data.length, 2); - assert.strictEqual(passThrough._readableState.pipes.length, 2); - assert.strictEqual(passThrough._readableState.pipes[0], dest); - assert.strictEqual(passThrough._readableState.pipes[1], dest); - - passThrough.write('foobar'); -} - -{ - const passThrough = new PassThrough(); - const dest = new Writable({ - write: common.mustNotCall() - }); - - passThrough.pipe(dest); - passThrough.pipe(dest); - - assert.strictEqual(passThrough._events.data.length, 2); - assert.strictEqual(passThrough._readableState.pipes.length, 2); - assert.strictEqual(passThrough._readableState.pipes[0], dest); - assert.strictEqual(passThrough._readableState.pipes[1], dest); - - passThrough.unpipe(dest); - passThrough.unpipe(dest); - - assert.strictEqual(passThrough._events.data, undefined); - assert.strictEqual(passThrough._readableState.pipes.length, 0); - - passThrough.write('foobar'); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js deleted file mode 100644 index a51dcfbad..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-unpipe-streams.js +++ /dev/null @@ -1,103 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const { Readable, Writable } = require('stream'); - -const source = Readable({ read: () => {} }); -const dest1 = Writable({ write: () => {} }); -const dest2 = Writable({ write: () => {} }); - -source.pipe(dest1); -source.pipe(dest2); - -dest1.on('unpipe', common.mustCall()); -dest2.on('unpipe', common.mustCall()); - -assert.strictEqual(source._readableState.pipes[0], dest1); -assert.strictEqual(source._readableState.pipes[1], dest2); -assert.strictEqual(source._readableState.pipes.length, 2); - -// Should be able to unpipe them in the reverse order that they were piped. - -source.unpipe(dest2); - -assert.deepStrictEqual(source._readableState.pipes, [dest1]); -assert.notStrictEqual(source._readableState.pipes, dest2); - -dest2.on('unpipe', common.mustNotCall()); -source.unpipe(dest2); - -source.unpipe(dest1); - -assert.strictEqual(source._readableState.pipes.length, 0); - -{ - // Test `cleanup()` if we unpipe all streams. - const source = Readable({ read: () => {} }); - const dest1 = Writable({ write: () => {} }); - const dest2 = Writable({ write: () => {} }); - - let destCount = 0; - const srcCheckEventNames = ['end', 'data']; - const destCheckEventNames = ['close', 'finish', 'drain', 'error', 'unpipe']; - - const checkSrcCleanup = common.mustCall(() => { - assert.strictEqual(source._readableState.pipes.length, 0); - assert.strictEqual(source._readableState.flowing, false); - - srcCheckEventNames.forEach((eventName) => { - assert.strictEqual( - source.listenerCount(eventName), 0, - `source's '${eventName}' event listeners not removed` - ); - }); - }); - - function checkDestCleanup(dest) { - const currentDestId = ++destCount; - source.pipe(dest); - - const unpipeChecker = common.mustCall(() => { - assert.deepStrictEqual( - dest.listeners('unpipe'), [unpipeChecker], - `destination{${currentDestId}} should have a 'unpipe' event ` + - 'listener which is `unpipeChecker`' - ); - dest.removeListener('unpipe', unpipeChecker); - destCheckEventNames.forEach((eventName) => { - assert.strictEqual( - dest.listenerCount(eventName), 0, - `destination{${currentDestId}}'s '${eventName}' event ` + - 'listeners not removed' - ); - }); - - if (--destCount === 0) - checkSrcCleanup(); - }); - - dest.on('unpipe', unpipeChecker); - } - - checkDestCleanup(dest1); - checkDestCleanup(dest2); - source.unpipe(); -} - -{ - const src = Readable({ read: () => {} }); - const dst = Writable({ write: () => {} }); - src.pipe(dst); - src.on('resume', common.mustCall(() => { - src.on('pause', common.mustCall()); - src.unpipe(dst); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js b/cli/tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js deleted file mode 100644 index 7a1719be3..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipe-without-listenerCount.js +++ /dev/null @@ -1,24 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const stream = require('stream'); - -const r = new stream.Stream(); -r.listenerCount = undefined; - -const w = new stream.Stream(); -w.listenerCount = undefined; - -w.on('pipe', function() { - r.emit('error', new Error('Readable Error')); - w.emit('error', new Error('Writable Error')); -}); -r.on('error', common.mustCall()); -w.on('error', common.mustCall()); -r.pipe(w); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js b/cli/tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js deleted file mode 100644 index 3d3ce96cc..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipeline-async-iterator.js +++ /dev/null @@ -1,38 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Readable, PassThrough, pipeline } = require('stream'); -const assert = require('assert'); - -const _err = new Error('kaboom'); - -async function run() { - const source = new Readable({ - read() { - } - }); - source.push('hello'); - source.push('world'); - - setImmediate(() => { source.destroy(_err); }); - - const iterator = pipeline( - source, - new PassThrough(), - () => {}); - - iterator.setEncoding('utf8'); - - for await (const k of iterator) { - assert.strictEqual(k, 'helloworld'); - } -} - -run().catch(common.mustCall((err) => assert.strictEqual(err, _err))); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js b/cli/tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js deleted file mode 100644 index e785a0008..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipeline-queued-end-in-destroy.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { Readable, Duplex, pipeline } = require('stream'); - -// Test that the callback for pipeline() is called even when the ._destroy() -// method of the stream places an .end() request to itself that does not -// get processed before the destruction of the stream (i.e. the 'close' event). -// Refs: https://github.com/nodejs/node/issues/24456 - -const readable = new Readable({ - read: common.mustCall() -}); - -const duplex = new Duplex({ - write(chunk, enc, cb) { - // Simulate messages queueing up. - }, - read() {}, - destroy(err, cb) { - // Call end() from inside the destroy() method, like HTTP/2 streams - // do at the time of writing. - this.end(); - cb(err); - } -}); - -duplex.on('finished', common.mustNotCall()); - -pipeline(readable, duplex, common.mustCall((err) => { - assert.strictEqual(err.code, 'ERR_STREAM_PREMATURE_CLOSE'); -})); - -// Write one chunk of data, and destroy the stream later. -// That should trigger the pipeline destruction. -readable.push('foo'); -setImmediate(() => { - readable.destroy(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js b/cli/tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js deleted file mode 100644 index a03fe17dd..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-pipeline-with-empty-string.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { - pipeline, - PassThrough -} = require('stream'); - - -async function runTest() { - await pipeline( - '', - new PassThrough({ objectMode: true }), - common.mustCall(), - ); -} - -runTest().then(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-stream-push-strings.js b/cli/tests/node_compat/test/parallel/test-stream-push-strings.js deleted file mode 100644 index 4d88e082b..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-push-strings.js +++ /dev/null @@ -1,74 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const Readable = require('stream').Readable; - -class MyStream extends Readable { - constructor(options) { - super(options); - this._chunks = 3; - } - - _read(n) { - switch (this._chunks--) { - case 0: - return this.push(null); - case 1: - return setTimeout(() => { - this.push('last chunk'); - }, 100); - case 2: - return this.push('second to last chunk'); - case 3: - return process.nextTick(() => { - this.push('first chunk'); - }); - default: - throw new Error('?'); - } - } -} - -const ms = new MyStream(); -const results = []; -ms.on('readable', function() { - let chunk; - while (null !== (chunk = ms.read())) - results.push(String(chunk)); -}); - -const expect = [ 'first chunksecond to last chunk', 'last chunk' ]; -process.on('exit', function() { - assert.strictEqual(ms._chunks, -1); - assert.deepStrictEqual(results, expect); - console.log('ok'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-aborted.js b/cli/tests/node_compat/test/parallel/test-stream-readable-aborted.js deleted file mode 100644 index 3e6550e7e..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-aborted.js +++ /dev/null @@ -1,73 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Readable, Duplex } = require('stream'); - -{ - const readable = new Readable({ - read() { - } - }); - assert.strictEqual(readable.readableAborted, false); - readable.destroy(); - assert.strictEqual(readable.readableAborted, true); -} - -{ - const readable = new Readable({ - read() { - } - }); - assert.strictEqual(readable.readableAborted, false); - readable.push(null); - readable.destroy(); - assert.strictEqual(readable.readableAborted, true); -} - -{ - const readable = new Readable({ - read() { - } - }); - assert.strictEqual(readable.readableAborted, false); - readable.push('asd'); - readable.destroy(); - assert.strictEqual(readable.readableAborted, true); -} - -{ - const readable = new Readable({ - read() { - } - }); - assert.strictEqual(readable.readableAborted, false); - readable.push('asd'); - readable.push(null); - assert.strictEqual(readable.readableAborted, false); - readable.on('end', common.mustCall(() => { - assert.strictEqual(readable.readableAborted, false); - readable.destroy(); - assert.strictEqual(readable.readableAborted, false); - queueMicrotask(() => { - assert.strictEqual(readable.readableAborted, false); - }); - })); - readable.resume(); -} - -{ - const duplex = new Duplex({ - readable: false, - write() {} - }); - duplex.destroy(); - assert.strictEqual(duplex.readableAborted, false); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js b/cli/tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js deleted file mode 100644 index 50939ac81..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-add-chunk-during-data.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { Readable } = require('stream'); - -// Verify that .push() and .unshift() can be called from 'data' listeners. - -for (const method of ['push', 'unshift']) { - const r = new Readable({ read() {} }); - r.once('data', common.mustCall((chunk) => { - assert.strictEqual(r.readableLength, 0); - r[method](chunk); - assert.strictEqual(r.readableLength, chunk.length); - - r.on('data', common.mustCall((chunk) => { - assert.strictEqual(chunk.toString(), 'Hello, world'); - })); - })); - - r.push('Hello, world'); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js b/cli/tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js deleted file mode 100644 index b11ae8fca..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-constructor-set-methods.js +++ /dev/null @@ -1,18 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const Readable = require('stream').Readable; - -const _read = common.mustCall(function _read(n) { - this.push(null); -}); - -const r = new Readable({ read: _read }); -r.resume(); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-data.js b/cli/tests/node_compat/test/parallel/test-stream-readable-data.js deleted file mode 100644 index d33f9f248..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-data.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const { Readable } = require('stream'); - -const readable = new Readable({ - read() {} -}); - -function read() {} - -readable.setEncoding('utf8'); -readable.on('readable', read); -readable.removeListener('readable', read); - -process.nextTick(function() { - readable.on('data', common.mustCall()); - readable.push('hello'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-destroy.js b/cli/tests/node_compat/test/parallel/test-stream-readable-destroy.js deleted file mode 100644 index 0a780c98e..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-destroy.js +++ /dev/null @@ -1,412 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Readable, addAbortSignal } = require('stream'); -const assert = require('assert'); - -{ - const read = new Readable({ - read() {} - }); - read.resume(); - - read.on('close', common.mustCall()); - - read.destroy(); - assert.strictEqual(read.errored, null); - assert.strictEqual(read.destroyed, true); -} - -{ - const read = new Readable({ - read() {} - }); - read.resume(); - - const expected = new Error('kaboom'); - - read.on('end', common.mustNotCall('no end event')); - read.on('close', common.mustCall()); - read.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - read.destroy(expected); - assert.strictEqual(read.errored, expected); - assert.strictEqual(read.destroyed, true); -} - -{ - const read = new Readable({ - read() {} - }); - - read._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, expected); - cb(err); - }); - - const expected = new Error('kaboom'); - - read.on('end', common.mustNotCall('no end event')); - read.on('close', common.mustCall()); - read.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - read.destroy(expected); - assert.strictEqual(read.destroyed, true); -} - -{ - const read = new Readable({ - read() {}, - destroy: common.mustCall(function(err, cb) { - assert.strictEqual(err, expected); - cb(); - }) - }); - - const expected = new Error('kaboom'); - - read.on('end', common.mustNotCall('no end event')); - - // Error is swallowed by the custom _destroy - read.on('error', common.mustNotCall('no error event')); - read.on('close', common.mustCall()); - - read.destroy(expected); - assert.strictEqual(read.destroyed, true); -} - -{ - const read = new Readable({ - read() {} - }); - - read._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - cb(); - }); - - read.destroy(); - assert.strictEqual(read.destroyed, true); -} - -{ - const read = new Readable({ - read() {} - }); - read.resume(); - - read._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - process.nextTick(() => { - this.push(null); - cb(); - }); - }); - - const fail = common.mustNotCall('no end event'); - - read.on('end', fail); - read.on('close', common.mustCall()); - - read.destroy(); - - read.removeListener('end', fail); - read.on('end', common.mustNotCall()); - assert.strictEqual(read.destroyed, true); -} - -{ - const read = new Readable({ - read() {} - }); - - const expected = new Error('kaboom'); - - read._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - cb(expected); - }); - - let ticked = false; - read.on('end', common.mustNotCall('no end event')); - read.on('error', common.mustCall((err) => { - assert.strictEqual(ticked, true); - assert.strictEqual(read._readableState.errorEmitted, true); - assert.strictEqual(read._readableState.errored, expected); - assert.strictEqual(err, expected); - })); - - read.destroy(); - assert.strictEqual(read._readableState.errorEmitted, false); - assert.strictEqual(read._readableState.errored, expected); - assert.strictEqual(read.destroyed, true); - ticked = true; -} - -{ - const read = new Readable({ - read() {} - }); - read.resume(); - - read.destroyed = true; - assert.strictEqual(read.destroyed, true); - - // The internal destroy() mechanism should not be triggered - read.on('end', common.mustNotCall()); - read.destroy(); -} - -{ - function MyReadable() { - assert.strictEqual(this.destroyed, false); - this.destroyed = false; - Readable.call(this); - } - - Object.setPrototypeOf(MyReadable.prototype, Readable.prototype); - Object.setPrototypeOf(MyReadable, Readable); - - new MyReadable(); -} - -{ - // Destroy and destroy callback - const read = new Readable({ - read() {} - }); - read.resume(); - - const expected = new Error('kaboom'); - - let ticked = false; - read.on('close', common.mustCall(() => { - assert.strictEqual(read._readableState.errorEmitted, true); - assert.strictEqual(ticked, true); - })); - read.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - assert.strictEqual(read._readableState.errored, null); - assert.strictEqual(read._readableState.errorEmitted, false); - - read.destroy(expected, common.mustCall(function(err) { - assert.strictEqual(read._readableState.errored, expected); - assert.strictEqual(err, expected); - })); - assert.strictEqual(read._readableState.errorEmitted, false); - assert.strictEqual(read._readableState.errored, expected); - ticked = true; -} - -{ - const readable = new Readable({ - destroy: common.mustCall(function(err, cb) { - process.nextTick(cb, new Error('kaboom 1')); - }), - read() {} - }); - - let ticked = false; - readable.on('close', common.mustCall(() => { - assert.strictEqual(ticked, true); - assert.strictEqual(readable._readableState.errorEmitted, true); - })); - readable.on('error', common.mustCall((err) => { - assert.strictEqual(ticked, true); - assert.strictEqual(err.message, 'kaboom 1'); - assert.strictEqual(readable._readableState.errorEmitted, true); - })); - - readable.destroy(); - assert.strictEqual(readable.destroyed, true); - assert.strictEqual(readable._readableState.errored, null); - assert.strictEqual(readable._readableState.errorEmitted, false); - - // Test case where `readable.destroy()` is called again with an error before - // the `_destroy()` callback is called. - readable.destroy(new Error('kaboom 2')); - assert.strictEqual(readable._readableState.errorEmitted, false); - assert.strictEqual(readable._readableState.errored, null); - - ticked = true; -} - -{ - const read = new Readable({ - read() {} - }); - - read.destroy(); - read.push('hi'); - read.on('data', common.mustNotCall()); -} - -{ - const read = new Readable({ - read: common.mustNotCall() - }); - read.destroy(); - assert.strictEqual(read.destroyed, true); - read.read(); -} - -{ - const read = new Readable({ - autoDestroy: false, - read() { - this.push(null); - this.push('asd'); - } - }); - - read.on('error', common.mustCall(() => { - assert(read._readableState.errored); - })); - read.resume(); -} - -{ - const controller = new AbortController(); - const read = addAbortSignal(controller.signal, new Readable({ - read() { - this.push('asd'); - }, - })); - - read.on('error', common.mustCall((e) => { - assert.strictEqual(e.name, 'AbortError'); - })); - controller.abort(); - read.on('data', common.mustNotCall()); -} - -{ - const controller = new AbortController(); - const read = new Readable({ - signal: controller.signal, - read() { - this.push('asd'); - }, - }); - - read.on('error', common.mustCall((e) => { - assert.strictEqual(e.name, 'AbortError'); - })); - controller.abort(); - read.on('data', common.mustNotCall()); -} - -{ - const controller = new AbortController(); - const read = addAbortSignal(controller.signal, new Readable({ - objectMode: true, - read() { - return false; - } - })); - read.push('asd'); - - read.on('error', common.mustCall((e) => { - assert.strictEqual(e.name, 'AbortError'); - })); - assert.rejects((async () => { - // eslint-disable-next-line no-unused-vars, no-empty - for await (const chunk of read) { } - })(), /AbortError/); - setTimeout(() => controller.abort(), 0); -} - -{ - const read = new Readable({ - read() { - }, - }); - - read.on('data', common.mustNotCall()); - read.on('error', common.mustCall((e) => { - read.push('asd'); - read.read(); - })); - read.on('close', common.mustCall((e) => { - read.push('asd'); - read.read(); - })); - read.destroy(new Error('asd')); -} - -{ - const read = new Readable({ - read() { - }, - }); - - read.on('data', common.mustNotCall()); - read.on('close', common.mustCall((e) => { - read.push('asd'); - read.read(); - })); - read.destroy(); -} - -{ - const read = new Readable({ - read() { - }, - }); - - read.on('data', common.mustNotCall()); - read.on('close', common.mustCall((e) => { - read.push('asd'); - read.unshift('asd'); - })); - read.destroy(); -} - -{ - const read = new Readable({ - read() { - }, - }); - - read.on('data', common.mustNotCall()); - read.destroy(); - read.unshift('asd'); -} - -{ - const read = new Readable({ - read() { - }, - }); - - read.resume(); - read.on('data', common.mustNotCall()); - read.on('close', common.mustCall((e) => { - read.push('asd'); - })); - read.destroy(); -} - -{ - const read = new Readable({ - read() { - }, - }); - - read.on('data', common.mustNotCall()); - read.destroy(); - read.push('asd'); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-didRead.js b/cli/tests/node_compat/test/parallel/test-stream-readable-didRead.js deleted file mode 100644 index 2d9cfa40f..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-didRead.js +++ /dev/null @@ -1,118 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { isDisturbed, isErrored, Readable } = require('stream'); - -function noop() {} - -function check(readable, data, fn) { - assert.strictEqual(readable.readableDidRead, false); - assert.strictEqual(isDisturbed(readable), false); - assert.strictEqual(isErrored(readable), false); - if (data === -1) { - readable.on('error', common.mustCall(() => { - assert.strictEqual(isErrored(readable), true); - })); - readable.on('data', common.mustNotCall()); - readable.on('end', common.mustNotCall()); - } else { - readable.on('error', common.mustNotCall()); - if (data === -2) { - readable.on('end', common.mustNotCall()); - } else { - readable.on('end', common.mustCall()); - } - if (data > 0) { - readable.on('data', common.mustCallAtLeast(data)); - } else { - readable.on('data', common.mustNotCall()); - } - } - readable.on('close', common.mustCall()); - fn(); - setImmediate(() => { - assert.strictEqual(readable.readableDidRead, data > 0); - if (data > 0) { - assert.strictEqual(isDisturbed(readable), true); - } - }); -} - -{ - const readable = new Readable({ - read() { - this.push(null); - } - }); - check(readable, 0, () => { - readable.read(); - }); -} - -{ - const readable = new Readable({ - read() { - this.push(null); - } - }); - check(readable, 0, () => { - readable.resume(); - }); -} - -{ - const readable = new Readable({ - read() { - this.push(null); - } - }); - check(readable, -2, () => { - readable.destroy(); - }); -} - -{ - const readable = new Readable({ - read() { - this.push(null); - } - }); - - check(readable, -1, () => { - readable.destroy(new Error()); - }); -} - -{ - const readable = new Readable({ - read() { - this.push('data'); - this.push(null); - } - }); - - check(readable, 1, () => { - readable.on('data', noop); - }); -} - -{ - const readable = new Readable({ - read() { - this.push('data'); - this.push(null); - } - }); - - check(readable, 1, () => { - readable.on('data', noop); - readable.off('data', noop); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js b/cli/tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js deleted file mode 100644 index fac562092..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-emit-readable-short-stream.js +++ /dev/null @@ -1,153 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -{ - const r = new stream.Readable({ - read: common.mustCall(function() { - this.push('content'); - this.push(null); - }) - }); - - const t = new stream.Transform({ - transform: common.mustCall(function(chunk, encoding, callback) { - this.push(chunk); - return callback(); - }), - flush: common.mustCall(function(callback) { - return callback(); - }) - }); - - r.pipe(t); - t.on('readable', common.mustCall(function() { - while (true) { - const chunk = t.read(); - if (!chunk) - break; - - assert.strictEqual(chunk.toString(), 'content'); - } - }, 2)); -} - -{ - const t = new stream.Transform({ - transform: common.mustCall(function(chunk, encoding, callback) { - this.push(chunk); - return callback(); - }), - flush: common.mustCall(function(callback) { - return callback(); - }) - }); - - t.end('content'); - - t.on('readable', common.mustCall(function() { - while (true) { - const chunk = t.read(); - if (!chunk) - break; - assert.strictEqual(chunk.toString(), 'content'); - } - })); -} - -{ - const t = new stream.Transform({ - transform: common.mustCall(function(chunk, encoding, callback) { - this.push(chunk); - return callback(); - }), - flush: common.mustCall(function(callback) { - return callback(); - }) - }); - - t.write('content'); - t.end(); - - t.on('readable', common.mustCall(function() { - while (true) { - const chunk = t.read(); - if (!chunk) - break; - assert.strictEqual(chunk.toString(), 'content'); - } - })); -} - -{ - const t = new stream.Readable({ - read() { - } - }); - - t.on('readable', common.mustCall(function() { - while (true) { - const chunk = t.read(); - if (!chunk) - break; - assert.strictEqual(chunk.toString(), 'content'); - } - })); - - t.push('content'); - t.push(null); -} - -{ - const t = new stream.Readable({ - read() { - } - }); - - t.on('readable', common.mustCall(function() { - while (true) { - const chunk = t.read(); - if (!chunk) - break; - assert.strictEqual(chunk.toString(), 'content'); - } - }, 2)); - - process.nextTick(() => { - t.push('content'); - t.push(null); - }); -} - -{ - const t = new stream.Transform({ - transform: common.mustCall(function(chunk, encoding, callback) { - this.push(chunk); - return callback(); - }), - flush: common.mustCall(function(callback) { - return callback(); - }) - }); - - t.on('readable', common.mustCall(function() { - while (true) { - const chunk = t.read(); - if (!chunk) - break; - assert.strictEqual(chunk.toString(), 'content'); - } - }, 2)); - - t.write('content'); - t.end(); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js b/cli/tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js deleted file mode 100644 index a05130737..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-emittedReadable.js +++ /dev/null @@ -1,80 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const Readable = require('stream').Readable; - -const readable = new Readable({ - read: () => {} -}); - -// Initialized to false. -assert.strictEqual(readable._readableState.emittedReadable, false); - -const expected = [Buffer.from('foobar'), Buffer.from('quo'), null]; -readable.on('readable', common.mustCall(() => { - // emittedReadable should be true when the readable event is emitted - assert.strictEqual(readable._readableState.emittedReadable, true); - assert.deepStrictEqual(readable.read(), expected.shift()); - // emittedReadable is reset to false during read() - assert.strictEqual(readable._readableState.emittedReadable, false); -}, 3)); - -// When the first readable listener is just attached, -// emittedReadable should be false -assert.strictEqual(readable._readableState.emittedReadable, false); - -// These trigger a single 'readable', as things are batched up -process.nextTick(common.mustCall(() => { - readable.push('foo'); -})); -process.nextTick(common.mustCall(() => { - readable.push('bar'); -})); - -// These triggers two readable events -setImmediate(common.mustCall(() => { - readable.push('quo'); - process.nextTick(common.mustCall(() => { - readable.push(null); - })); -})); - -const noRead = new Readable({ - read: () => {} -}); - -noRead.on('readable', common.mustCall(() => { - // emittedReadable should be true when the readable event is emitted - assert.strictEqual(noRead._readableState.emittedReadable, true); - noRead.read(0); - // emittedReadable is not reset during read(0) - assert.strictEqual(noRead._readableState.emittedReadable, true); -})); - -noRead.push('foo'); -noRead.push(null); - -const flowing = new Readable({ - read: () => {} -}); - -flowing.on('data', common.mustCall(() => { - // When in flowing mode, emittedReadable is always false. - assert.strictEqual(flowing._readableState.emittedReadable, false); - flowing.read(); - assert.strictEqual(flowing._readableState.emittedReadable, false); -}, 3)); - -flowing.push('foooo'); -flowing.push('bar'); -flowing.push('quo'); -process.nextTick(common.mustCall(() => { - flowing.push(null); -})); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js b/cli/tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js deleted file mode 100644 index 7c542f330..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-end-destroyed.js +++ /dev/null @@ -1,24 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Readable } = require('stream'); - -{ - // Don't emit 'end' after 'close'. - - const r = new Readable(); - - r.on('end', common.mustNotCall()); - r.resume(); - r.destroy(); - r.on('close', common.mustCall(() => { - r.push(null); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-ended.js b/cli/tests/node_compat/test/parallel/test-stream-readable-ended.js deleted file mode 100644 index b8f59e2df..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-ended.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Readable } = require('stream'); -const assert = require('assert'); - -// basic -{ - // Find it on Readable.prototype - assert(Object.hasOwn(Readable.prototype, 'readableEnded')); -} - -// event -{ - const readable = new Readable(); - - readable._read = () => { - // The state ended should start in false. - assert.strictEqual(readable.readableEnded, false); - readable.push('asd'); - assert.strictEqual(readable.readableEnded, false); - readable.push(null); - assert.strictEqual(readable.readableEnded, false); - }; - - readable.on('end', common.mustCall(() => { - assert.strictEqual(readable.readableEnded, true); - })); - - readable.on('data', common.mustCall(() => { - assert.strictEqual(readable.readableEnded, false); - })); -} - -// Verifies no `error` triggered on multiple .push(null) invocations -{ - const readable = new Readable(); - - readable.on('readable', () => { readable.read(); }); - readable.on('error', common.mustNotCall()); - readable.on('end', common.mustCall()); - - readable.push('a'); - readable.push(null); - readable.push(null); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-error-end.js b/cli/tests/node_compat/test/parallel/test-stream-readable-error-end.js deleted file mode 100644 index 821a5f458..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-error-end.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Readable } = require('stream'); - -{ - const r = new Readable({ read() {} }); - - r.on('end', common.mustNotCall()); - r.on('data', common.mustCall()); - r.on('error', common.mustCall()); - r.push('asd'); - r.push(null); - r.destroy(new Error('kaboom')); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-event.js b/cli/tests/node_compat/test/parallel/test-stream-readable-event.js deleted file mode 100644 index 87a4e0feb..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-event.js +++ /dev/null @@ -1,135 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 Readable = require('stream').Readable; - -{ - // First test, not reading when the readable is added. - // make sure that on('readable', ...) triggers a readable event. - const r = new Readable({ - highWaterMark: 3 - }); - - r._read = common.mustNotCall(); - - // This triggers a 'readable' event, which is lost. - r.push(Buffer.from('blerg')); - - setTimeout(function() { - // We're testing what we think we are - assert(!r._readableState.reading); - r.on('readable', common.mustCall()); - }, 1); -} - -{ - // Second test, make sure that readable is re-emitted if there's - // already a length, while it IS reading. - - const r = new Readable({ - highWaterMark: 3 - }); - - r._read = common.mustCall(); - - // This triggers a 'readable' event, which is lost. - r.push(Buffer.from('bl')); - - setTimeout(function() { - // Assert we're testing what we think we are - assert(r._readableState.reading); - r.on('readable', common.mustCall()); - }, 1); -} - -{ - // Third test, not reading when the stream has not passed - // the highWaterMark but *has* reached EOF. - const r = new Readable({ - highWaterMark: 30 - }); - - r._read = common.mustNotCall(); - - // This triggers a 'readable' event, which is lost. - r.push(Buffer.from('blerg')); - r.push(null); - - setTimeout(function() { - // Assert we're testing what we think we are - assert(!r._readableState.reading); - r.on('readable', common.mustCall()); - }, 1); -} - -{ - // Pushing an empty string in non-objectMode should - // trigger next `read()`. - const underlyingData = ['', 'x', 'y', '', 'z']; - const expected = underlyingData.filter((data) => data); - const result = []; - - const r = new Readable({ - encoding: 'utf8', - }); - r._read = function() { - process.nextTick(() => { - if (!underlyingData.length) { - this.push(null); - } else { - this.push(underlyingData.shift()); - } - }); - }; - - r.on('readable', () => { - const data = r.read(); - if (data !== null) result.push(data); - }); - - r.on('end', common.mustCall(() => { - assert.deepStrictEqual(result, expected); - })); -} - -{ - // #20923 - const r = new Readable(); - r._read = function() { - // Actually doing thing here - }; - r.on('data', function() {}); - - r.removeAllListeners(); - - assert.strictEqual(r.eventNames().length, 0); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js b/cli/tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js deleted file mode 100644 index 1ac657197..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-flow-recursion.js +++ /dev/null @@ -1,84 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -// This test verifies that passing a huge number to read(size) -// will push up the highWaterMark, and cause the stream to read -// more data continuously, but without triggering a nextTick -// warning or RangeError. - -const Readable = require('stream').Readable; - -// Throw an error if we trigger a nextTick warning. -process.throwDeprecation = true; - -const stream = new Readable({ highWaterMark: 2 }); -let reads = 0; -let total = 5000; -stream._read = function(size) { - reads++; - size = Math.min(size, total); - total -= size; - if (size === 0) - stream.push(null); - else - stream.push(Buffer.allocUnsafe(size)); -}; - -let depth = 0; - -function flow(stream, size, callback) { - depth += 1; - const chunk = stream.read(size); - - if (!chunk) - stream.once('readable', flow.bind(null, stream, size, callback)); - else - callback(chunk); - - depth -= 1; - console.log(`flow(${depth}): exit`); -} - -flow(stream, 5000, function() { - console.log(`complete (${depth})`); -}); - -process.on('exit', function(code) { - assert.strictEqual(reads, 2); - // We pushed up the high water mark - assert.strictEqual(stream.readableHighWaterMark, 8192); - // Length is 0 right now, because we pulled it all out. - assert.strictEqual(stream.readableLength, 0); - assert(!code); - assert.strictEqual(depth, 0); - console.log('ok'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js b/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js deleted file mode 100644 index c797129ee..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-async.js +++ /dev/null @@ -1,34 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -// This test ensures that Readable stream will continue to call _read -// for streams with highWaterMark === 0 once the stream returns data -// by calling push() asynchronously. - -const { Readable } = require('stream'); - -let count = 5; - -const r = new Readable({ - // Called 6 times: First 5 return data, last one signals end of stream. - read: common.mustCall(() => { - process.nextTick(common.mustCall(() => { - if (count--) - r.push('a'); - else - r.push(null); - })); - }, 6), - highWaterMark: 0, -}); - -r.on('end', common.mustCall()); -r.on('data', common.mustCall(5)); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js b/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js deleted file mode 100644 index 3d9c0507a..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0-no-flow-data.js +++ /dev/null @@ -1,111 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -// Ensure that subscribing the 'data' event will not make the stream flow. -// The 'data' event will require calling read() by hand. -// -// The test is written for the (somewhat rare) highWaterMark: 0 streams to -// specifically catch any regressions that might occur with these streams. - -const assert = require('assert'); -const { Readable } = require('stream'); - -const streamData = [ 'a', null ]; - -// Track the calls so we can assert their order later. -const calls = []; -const r = new Readable({ - read: common.mustCall(() => { - calls.push('_read:' + streamData[0]); - process.nextTick(() => { - calls.push('push:' + streamData[0]); - r.push(streamData.shift()); - }); - }, streamData.length), - highWaterMark: 0, - - // Object mode is used here just for testing convenience. It really - // shouldn't affect the order of events. Just the data and its format. - objectMode: true, -}); - -assert.strictEqual(r.readableFlowing, null); -r.on('readable', common.mustCall(() => { - calls.push('readable'); -}, 2)); -assert.strictEqual(r.readableFlowing, false); -r.on('data', common.mustCall((data) => { - calls.push('data:' + data); -}, 1)); -r.on('end', common.mustCall(() => { - calls.push('end'); -})); -assert.strictEqual(r.readableFlowing, false); - -// The stream emits the events asynchronously but that's not guaranteed to -// happen on the next tick (especially since the _read implementation above -// uses process.nextTick). -// -// We use setImmediate here to give the stream enough time to emit all the -// events it's about to emit. -setImmediate(() => { - - // Only the _read, push, readable calls have happened. No data must be - // emitted yet. - assert.deepStrictEqual(calls, ['_read:a', 'push:a', 'readable']); - - // Calling 'r.read()' should trigger the data event. - assert.strictEqual(r.read(), 'a'); - assert.deepStrictEqual( - calls, - ['_read:a', 'push:a', 'readable', 'data:a']); - - // The next 'read()' will return null because hwm: 0 does not buffer any - // data and the _read implementation above does the push() asynchronously. - // - // Note: This 'null' signals "no data available". It isn't the end-of-stream - // null value as the stream doesn't know yet that it is about to reach the - // end. - // - // Using setImmediate again to give the stream enough time to emit all the - // events it wants to emit. - assert.strictEqual(r.read(), null); - setImmediate(() => { - - // There's a new 'readable' event after the data has been pushed. - // The 'end' event will be emitted only after a 'read()'. - // - // This is somewhat special for the case where the '_read' implementation - // calls 'push' asynchronously. If 'push' was synchronous, the 'end' event - // would be emitted here _before_ we call read(). - assert.deepStrictEqual( - calls, - ['_read:a', 'push:a', 'readable', 'data:a', - '_read:null', 'push:null', 'readable']); - - assert.strictEqual(r.read(), null); - - // While it isn't really specified whether the 'end' event should happen - // synchronously with read() or not, we'll assert the current behavior - // ('end' event happening on the next tick after read()) so any changes - // to it are noted and acknowledged in the future. - assert.deepStrictEqual( - calls, - ['_read:a', 'push:a', 'readable', 'data:a', - '_read:null', 'push:null', 'readable']); - process.nextTick(() => { - assert.deepStrictEqual( - calls, - ['_read:a', 'push:a', 'readable', 'data:a', - '_read:null', 'push:null', 'readable', 'end']); - }); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0.js b/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0.js deleted file mode 100644 index cfbfac8ab..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-hwm-0.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -// This test ensures that Readable stream will call _read() for streams -// with highWaterMark === 0 upon .read(0) instead of just trying to -// emit 'readable' event. - -const assert = require('assert'); -const { Readable } = require('stream'); - -const r = new Readable({ - // Must be called only once upon setting 'readable' listener - read: common.mustCall(), - highWaterMark: 0, -}); - -let pushedNull = false; -// This will trigger read(0) but must only be called after push(null) -// because the we haven't pushed any data -r.on('readable', common.mustCall(() => { - assert.strictEqual(r.read(), null); - assert.strictEqual(pushedNull, true); -})); -r.on('end', common.mustCall()); -process.nextTick(() => { - assert.strictEqual(r.read(), null); - pushedNull = true; - r.push(null); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-infinite-read.js b/cli/tests/node_compat/test/parallel/test-stream-readable-infinite-read.js deleted file mode 100644 index e3819cad9..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-infinite-read.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Readable } = require('stream'); - -const buf = Buffer.alloc(8192); - -const readable = new Readable({ - read: common.mustCall(function() { - this.push(buf); - }, 31) -}); - -let i = 0; - -readable.on('readable', common.mustCall(function() { - if (i++ === 10) { - // We will just terminate now. - process.removeAllListeners('readable'); - return; - } - - const data = readable.read(); - // TODO(mcollina): there is something odd in the highWaterMark logic - // investigate. - if (i === 1) { - assert.strictEqual(data.length, 8192 * 2); - } else { - assert.strictEqual(data.length, 8192 * 3); - } -}, 11)); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js b/cli/tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js deleted file mode 100644 index a40526389..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-invalid-chunk.js +++ /dev/null @@ -1,41 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const stream = require('stream'); - -function testPushArg(val) { - const readable = new stream.Readable({ - read: () => {} - }); - readable.on('error', common.expectsError({ - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - })); - readable.push(val); -} - -testPushArg([]); -testPushArg({}); -testPushArg(0); - -function testUnshiftArg(val) { - const readable = new stream.Readable({ - read: () => {} - }); - readable.on('error', common.expectsError({ - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError' - })); - readable.unshift(val); -} - -testUnshiftArg([]); -testUnshiftArg({}); -testUnshiftArg(0); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-needReadable.js b/cli/tests/node_compat/test/parallel/test-stream-readable-needReadable.js deleted file mode 100644 index 675e5e872..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-needReadable.js +++ /dev/null @@ -1,106 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const Readable = require('stream').Readable; - -const readable = new Readable({ - read: () => {} -}); - -// Initialized to false. -assert.strictEqual(readable._readableState.needReadable, false); - -readable.on('readable', common.mustCall(() => { - // When the readable event fires, needReadable is reset. - assert.strictEqual(readable._readableState.needReadable, false); - readable.read(); -})); - -// If a readable listener is attached, then a readable event is needed. -assert.strictEqual(readable._readableState.needReadable, true); - -readable.push('foo'); -readable.push(null); - -readable.on('end', common.mustCall(() => { - // No need to emit readable anymore when the stream ends. - assert.strictEqual(readable._readableState.needReadable, false); -})); - -const asyncReadable = new Readable({ - read: () => {} -}); - -asyncReadable.on('readable', common.mustCall(() => { - if (asyncReadable.read() !== null) { - // After each read(), the buffer is empty. - // If the stream doesn't end now, - // then we need to notify the reader on future changes. - assert.strictEqual(asyncReadable._readableState.needReadable, true); - } -}, 2)); - -process.nextTick(common.mustCall(() => { - asyncReadable.push('foooo'); -})); -process.nextTick(common.mustCall(() => { - asyncReadable.push('bar'); -})); -setImmediate(common.mustCall(() => { - asyncReadable.push(null); - assert.strictEqual(asyncReadable._readableState.needReadable, false); -})); - -const flowing = new Readable({ - read: () => {} -}); - -// Notice this must be above the on('data') call. -flowing.push('foooo'); -flowing.push('bar'); -flowing.push('quo'); -process.nextTick(common.mustCall(() => { - flowing.push(null); -})); - -// When the buffer already has enough data, and the stream is -// in flowing mode, there is no need for the readable event. -flowing.on('data', common.mustCall(function(data) { - assert.strictEqual(flowing._readableState.needReadable, false); -}, 3)); - -const slowProducer = new Readable({ - read: () => {} -}); - -slowProducer.on('readable', common.mustCall(() => { - const chunk = slowProducer.read(8); - const state = slowProducer._readableState; - if (chunk === null) { - // The buffer doesn't have enough data, and the stream is not need, - // we need to notify the reader when data arrives. - assert.strictEqual(state.needReadable, true); - } else { - assert.strictEqual(state.needReadable, false); - } -}, 4)); - -process.nextTick(common.mustCall(() => { - slowProducer.push('foo'); - process.nextTick(common.mustCall(() => { - slowProducer.push('foo'); - process.nextTick(common.mustCall(() => { - slowProducer.push('foo'); - process.nextTick(common.mustCall(() => { - slowProducer.push(null); - })); - })); - })); -})); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-next-no-null.js b/cli/tests/node_compat/test/parallel/test-stream-readable-next-no-null.js deleted file mode 100644 index 06f06f41d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-next-no-null.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const { mustNotCall, expectsError } = require('../common'); -const { Readable } = require('stream'); - -async function* generate() { - yield null; -} - -const stream = Readable.from(generate()); - -stream.on('error', expectsError({ - code: 'ERR_STREAM_NULL_VALUES', - name: 'TypeError', - message: 'May not write null values to stream' -})); - -stream.on('data', mustNotCall()); - -stream.on('end', mustNotCall()); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js b/cli/tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js deleted file mode 100644 index 9a96db87d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-no-unneeded-readable.js +++ /dev/null @@ -1,69 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Readable, PassThrough } = require('stream'); - -function test(r) { - const wrapper = new Readable({ - read: () => { - let data = r.read(); - - if (data) { - wrapper.push(data); - return; - } - - r.once('readable', function() { - data = r.read(); - if (data) { - wrapper.push(data); - } - // else: the end event should fire - }); - }, - }); - - r.once('end', function() { - wrapper.push(null); - }); - - wrapper.resume(); - wrapper.once('end', common.mustCall()); -} - -{ - const source = new Readable({ - read: () => {} - }); - source.push('foo'); - source.push('bar'); - source.push(null); - - const pt = source.pipe(new PassThrough()); - test(pt); -} - -{ - // This is the underlying cause of the above test case. - const pushChunks = ['foo', 'bar']; - const r = new Readable({ - read: () => { - const chunk = pushChunks.shift(); - if (chunk) { - // synchronous call - r.push(chunk); - } else { - // asynchronous call - process.nextTick(() => r.push(null)); - } - }, - }); - - test(r); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js b/cli/tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js deleted file mode 100644 index 4ab7f3adb..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-object-multi-push-async.js +++ /dev/null @@ -1,190 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Readable } = require('stream'); - -const MAX = 42; -const BATCH = 10; - -{ - const readable = new Readable({ - objectMode: true, - read: common.mustCall(function() { - console.log('>> READ'); - fetchData((err, data) => { - if (err) { - this.destroy(err); - return; - } - - if (data.length === 0) { - console.log('pushing null'); - this.push(null); - return; - } - - console.log('pushing'); - data.forEach((d) => this.push(d)); - }); - }, Math.floor(MAX / BATCH) + 2) - }); - - let i = 0; - function fetchData(cb) { - if (i > MAX) { - setTimeout(cb, 10, null, []); - } else { - const array = []; - const max = i + BATCH; - for (; i < max; i++) { - array.push(i); - } - setTimeout(cb, 10, null, array); - } - } - - readable.on('readable', () => { - let data; - console.log('readable emitted'); - while ((data = readable.read()) !== null) { - console.log(data); - } - }); - - readable.on('end', common.mustCall(() => { - assert.strictEqual(i, (Math.floor(MAX / BATCH) + 1) * BATCH); - })); -} - -{ - const readable = new Readable({ - objectMode: true, - read: common.mustCall(function() { - console.log('>> READ'); - fetchData((err, data) => { - if (err) { - this.destroy(err); - return; - } - - if (data.length === 0) { - console.log('pushing null'); - this.push(null); - return; - } - - console.log('pushing'); - data.forEach((d) => this.push(d)); - }); - }, Math.floor(MAX / BATCH) + 2) - }); - - let i = 0; - function fetchData(cb) { - if (i > MAX) { - setTimeout(cb, 10, null, []); - } else { - const array = []; - const max = i + BATCH; - for (; i < max; i++) { - array.push(i); - } - setTimeout(cb, 10, null, array); - } - } - - readable.on('data', (data) => { - console.log('data emitted', data); - }); - - readable.on('end', common.mustCall(() => { - assert.strictEqual(i, (Math.floor(MAX / BATCH) + 1) * BATCH); - })); -} - -{ - const readable = new Readable({ - objectMode: true, - read: common.mustCall(function() { - console.log('>> READ'); - fetchData((err, data) => { - if (err) { - this.destroy(err); - return; - } - - console.log('pushing'); - data.forEach((d) => this.push(d)); - - if (data[BATCH - 1] >= MAX) { - console.log('pushing null'); - this.push(null); - } - }); - }, Math.floor(MAX / BATCH) + 1) - }); - - let i = 0; - function fetchData(cb) { - const array = []; - const max = i + BATCH; - for (; i < max; i++) { - array.push(i); - } - setTimeout(cb, 10, null, array); - } - - readable.on('data', (data) => { - console.log('data emitted', data); - }); - - readable.on('end', common.mustCall(() => { - assert.strictEqual(i, (Math.floor(MAX / BATCH) + 1) * BATCH); - })); -} - -{ - const readable = new Readable({ - objectMode: true, - read: common.mustNotCall() - }); - - readable.on('data', common.mustNotCall()); - - readable.push(null); - - let nextTickPassed = false; - process.nextTick(() => { - nextTickPassed = true; - }); - - readable.on('end', common.mustCall(() => { - assert.strictEqual(nextTickPassed, true); - })); -} - -{ - const readable = new Readable({ - objectMode: true, - read: common.mustCall() - }); - - readable.on('data', (data) => { - console.log('data emitted', data); - }); - - readable.on('end', common.mustCall()); - - setImmediate(() => { - readable.push('aaa'); - readable.push(null); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js b/cli/tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js deleted file mode 100644 index 923349ef4..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-pause-and-resume.js +++ /dev/null @@ -1,81 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Readable } = require('stream'); - -let ticks = 18; -let expectedData = 19; - -const rs = new Readable({ - objectMode: true, - read: () => { - if (ticks-- > 0) - return process.nextTick(() => rs.push({})); - rs.push({}); - rs.push(null); - } -}); - -rs.on('end', common.mustCall()); -readAndPause(); - -function readAndPause() { - // Does a on(data) -> pause -> wait -> resume -> on(data) ... loop. - // Expects on(data) to never fire if the stream is paused. - const ondata = common.mustCall((data) => { - rs.pause(); - - expectedData--; - if (expectedData <= 0) - return; - - setImmediate(function() { - rs.removeListener('data', ondata); - readAndPause(); - rs.resume(); - }); - }, 1); // Only call ondata once - - rs.on('data', ondata); -} - -{ - const readable = new Readable({ - read() {} - }); - - function read() {} - - readable.setEncoding('utf8'); - readable.on('readable', read); - readable.removeListener('readable', read); - readable.pause(); - - process.nextTick(function() { - assert(readable.isPaused()); - }); -} - -{ - const { PassThrough } = require('stream'); - - const source3 = new PassThrough(); - const target3 = new PassThrough(); - - const chunk = Buffer.allocUnsafe(1000); - while (target3.write(chunk)); - - source3.pipe(target3); - target3.on('drain', common.mustCall(() => { - assert(!source3.isPaused()); - })); - target3.on('data', () => {}); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js b/cli/tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js deleted file mode 100644 index 3df0bcaaf..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-readable-then-resume.js +++ /dev/null @@ -1,38 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Readable } = require('stream'); -const assert = require('assert'); - -// This test verifies that a stream could be resumed after -// removing the readable event in the same tick - -check(new Readable({ - objectMode: true, - highWaterMark: 1, - read() { - if (!this.first) { - this.push('hello'); - this.first = true; - return; - } - - this.push(null); - } -})); - -function check(s) { - const readableListener = common.mustNotCall(); - s.on('readable', readableListener); - s.on('end', common.mustCall()); - assert.strictEqual(s.removeListener, s.off); - s.removeListener('readable', readableListener); - s.resume(); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-readable.js b/cli/tests/node_compat/test/parallel/test-stream-readable-readable.js deleted file mode 100644 index 6353ad8d4..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-readable.js +++ /dev/null @@ -1,52 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const { Readable } = require('stream'); - -{ - const r = new Readable({ - read() {} - }); - assert.strictEqual(r.readable, true); - r.destroy(); - assert.strictEqual(r.readable, false); -} - -{ - const mustNotCall = common.mustNotCall(); - const r = new Readable({ - read() {} - }); - assert.strictEqual(r.readable, true); - r.on('end', mustNotCall); - r.resume(); - r.push(null); - assert.strictEqual(r.readable, true); - r.off('end', mustNotCall); - r.on('end', common.mustCall(() => { - assert.strictEqual(r.readable, false); - })); -} - -{ - const r = new Readable({ - read: common.mustCall(() => { - process.nextTick(() => { - r.destroy(new Error()); - assert.strictEqual(r.readable, false); - }); - }) - }); - r.resume(); - r.on('error', common.mustCall(() => { - assert.strictEqual(r.readable, false); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js b/cli/tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js deleted file mode 100644 index 26663b88b..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-reading-readingMore.js +++ /dev/null @@ -1,178 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const Readable = require('stream').Readable; - -{ - const readable = new Readable({ - read(size) {} - }); - - const state = readable._readableState; - - // Starting off with false initially. - assert.strictEqual(state.reading, false); - assert.strictEqual(state.readingMore, false); - - readable.on('data', common.mustCall((data) => { - // While in a flowing state with a 'readable' listener - // we should not be reading more - if (readable.readableFlowing) - assert.strictEqual(state.readingMore, true); - - // Reading as long as we've not ended - assert.strictEqual(state.reading, !state.ended); - }, 2)); - - function onStreamEnd() { - // End of stream; state.reading is false - // And so should be readingMore. - assert.strictEqual(state.readingMore, false); - assert.strictEqual(state.reading, false); - } - - const expectedReadingMore = [true, true, false]; - readable.on('readable', common.mustCall(() => { - // There is only one readingMore scheduled from on('data'), - // after which everything is governed by the .read() call - assert.strictEqual(state.readingMore, expectedReadingMore.shift()); - - // If the stream has ended, we shouldn't be reading - assert.strictEqual(state.ended, !state.reading); - - // Consume all the data - while (readable.read() !== null); - - if (expectedReadingMore.length === 0) // Reached end of stream - process.nextTick(common.mustCall(onStreamEnd, 1)); - }, 3)); - - readable.on('end', common.mustCall(onStreamEnd)); - readable.push('pushed'); - - readable.read(6); - - // reading - assert.strictEqual(state.reading, true); - assert.strictEqual(state.readingMore, true); - - // add chunk to front - readable.unshift('unshifted'); - - // end - readable.push(null); -} - -{ - const readable = new Readable({ - read(size) {} - }); - - const state = readable._readableState; - - // Starting off with false initially. - assert.strictEqual(state.reading, false); - assert.strictEqual(state.readingMore, false); - - readable.on('data', common.mustCall((data) => { - // While in a flowing state without a 'readable' listener - // we should be reading more - if (readable.readableFlowing) - assert.strictEqual(state.readingMore, true); - - // Reading as long as we've not ended - assert.strictEqual(state.reading, !state.ended); - }, 2)); - - function onStreamEnd() { - // End of stream; state.reading is false - // And so should be readingMore. - assert.strictEqual(state.readingMore, false); - assert.strictEqual(state.reading, false); - } - - readable.on('end', common.mustCall(onStreamEnd)); - readable.push('pushed'); - - // Stop emitting 'data' events - assert.strictEqual(state.flowing, true); - readable.pause(); - - // paused - assert.strictEqual(state.reading, false); - assert.strictEqual(state.flowing, false); - - readable.resume(); - assert.strictEqual(state.reading, false); - assert.strictEqual(state.flowing, true); - - // add chunk to front - readable.unshift('unshifted'); - - // end - readable.push(null); -} - -{ - const readable = new Readable({ - read(size) {} - }); - - const state = readable._readableState; - - // Starting off with false initially. - assert.strictEqual(state.reading, false); - assert.strictEqual(state.readingMore, false); - - const onReadable = common.mustNotCall(); - - readable.on('readable', onReadable); - - readable.on('data', common.mustCall((data) => { - // Reading as long as we've not ended - assert.strictEqual(state.reading, !state.ended); - }, 2)); - - readable.removeListener('readable', onReadable); - - function onStreamEnd() { - // End of stream; state.reading is false - // And so should be readingMore. - assert.strictEqual(state.readingMore, false); - assert.strictEqual(state.reading, false); - } - - readable.on('end', common.mustCall(onStreamEnd)); - readable.push('pushed'); - - // We are still not flowing, we will be resuming in the next tick - assert.strictEqual(state.flowing, false); - - // Wait for nextTick, so the readableListener flag resets - process.nextTick(function() { - readable.resume(); - - // Stop emitting 'data' events - assert.strictEqual(state.flowing, true); - readable.pause(); - - // paused - assert.strictEqual(state.flowing, false); - - readable.resume(); - assert.strictEqual(state.flowing, true); - - // add chunk to front - readable.unshift('unshifted'); - - // end - readable.push(null); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js b/cli/tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js deleted file mode 100644 index 0e490529c..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-resume-hwm.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Readable } = require('stream'); - -// readable.resume() should not lead to a ._read() call being scheduled -// when we exceed the high water mark already. - -const readable = new Readable({ - read: common.mustNotCall(), - highWaterMark: 100 -}); - -// Fill up the internal buffer so that we definitely exceed the HWM: -for (let i = 0; i < 10; i++) - readable.push('a'.repeat(200)); - -// Call resume, and pause after one chunk. -// The .pause() is just so that we don’t empty the buffer fully, which would -// be a valid reason to call ._read(). -readable.resume(); -readable.once('data', common.mustCall(() => readable.pause())); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js b/cli/tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js deleted file mode 100644 index 474670264..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-resumeScheduled.js +++ /dev/null @@ -1,72 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -// Testing Readable Stream resumeScheduled state - -const assert = require('assert'); -const { Readable, Writable } = require('stream'); - -{ - // pipe() test case - const r = new Readable({ read() {} }); - const w = new Writable(); - - // resumeScheduled should start = `false`. - assert.strictEqual(r._readableState.resumeScheduled, false); - - // Calling pipe() should change the state value = true. - r.pipe(w); - assert.strictEqual(r._readableState.resumeScheduled, true); - - process.nextTick(common.mustCall(() => { - assert.strictEqual(r._readableState.resumeScheduled, false); - })); -} - -{ - // 'data' listener test case - const r = new Readable({ read() {} }); - - // resumeScheduled should start = `false`. - assert.strictEqual(r._readableState.resumeScheduled, false); - - r.push(Buffer.from([1, 2, 3])); - - // Adding 'data' listener should change the state value - r.on('data', common.mustCall(() => { - assert.strictEqual(r._readableState.resumeScheduled, false); - })); - assert.strictEqual(r._readableState.resumeScheduled, true); - - process.nextTick(common.mustCall(() => { - assert.strictEqual(r._readableState.resumeScheduled, false); - })); -} - -{ - // resume() test case - const r = new Readable({ read() {} }); - - // resumeScheduled should start = `false`. - assert.strictEqual(r._readableState.resumeScheduled, false); - - // Calling resume() should change the state value. - r.resume(); - assert.strictEqual(r._readableState.resumeScheduled, true); - - r.on('resume', common.mustCall(() => { - // The state value should be `false` again - assert.strictEqual(r._readableState.resumeScheduled, false); - })); - - process.nextTick(common.mustCall(() => { - assert.strictEqual(r._readableState.resumeScheduled, false); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js b/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js deleted file mode 100644 index c99a39819..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-existing-buffers.js +++ /dev/null @@ -1,67 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const { Readable } = require('stream'); -const assert = require('assert'); - -{ - // Call .setEncoding() while there are bytes already in the buffer. - const r = new Readable({ read() {} }); - - r.push(Buffer.from('a')); - r.push(Buffer.from('b')); - - r.setEncoding('utf8'); - const chunks = []; - r.on('data', (chunk) => chunks.push(chunk)); - - process.nextTick(() => { - assert.deepStrictEqual(chunks, ['ab']); - }); -} - -{ - // Call .setEncoding() while the buffer contains a complete, - // but chunked character. - const r = new Readable({ read() {} }); - - r.push(Buffer.from([0xf0])); - r.push(Buffer.from([0x9f])); - r.push(Buffer.from([0x8e])); - r.push(Buffer.from([0x89])); - - r.setEncoding('utf8'); - const chunks = []; - r.on('data', (chunk) => chunks.push(chunk)); - - process.nextTick(() => { - assert.deepStrictEqual(chunks, ['🎉']); - }); -} - -{ - // Call .setEncoding() while the buffer contains an incomplete character, - // and finish the character later. - const r = new Readable({ read() {} }); - - r.push(Buffer.from([0xf0])); - r.push(Buffer.from([0x9f])); - - r.setEncoding('utf8'); - - r.push(Buffer.from([0x8e])); - r.push(Buffer.from([0x89])); - - const chunks = []; - r.on('data', (chunk) => chunks.push(chunk)); - - process.nextTick(() => { - assert.deepStrictEqual(chunks, ['🎉']); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js b/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js deleted file mode 100644 index e6823f7cd..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-setEncoding-null.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const { Readable } = require('stream'); - - -{ - const readable = new Readable({ encoding: 'hex' }); - assert.strictEqual(readable._readableState.encoding, 'hex'); - - readable.setEncoding(null); - - assert.strictEqual(readable._readableState.encoding, 'utf8'); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-unshift.js b/cli/tests/node_compat/test/parallel/test-stream-readable-unshift.js deleted file mode 100644 index 1303befa9..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-unshift.js +++ /dev/null @@ -1,177 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const { Readable } = require('stream'); - -{ - // Check that strings are saved as Buffer - const readable = new Readable({ read() {} }); - - const string = 'abc'; - - readable.on('data', common.mustCall((chunk) => { - assert(Buffer.isBuffer(chunk)); - assert.strictEqual(chunk.toString('utf8'), string); - }, 1)); - - readable.unshift(string); - -} - -{ - // Check that data goes at the beginning - const readable = new Readable({ read() {} }); - const unshift = 'front'; - const push = 'back'; - - const expected = [unshift, push]; - readable.on('data', common.mustCall((chunk) => { - assert.strictEqual(chunk.toString('utf8'), expected.shift()); - }, 2)); - - - readable.push(push); - readable.unshift(unshift); -} - -{ - // Check that buffer is saved with correct encoding - const readable = new Readable({ read() {} }); - - const encoding = 'base64'; - const string = Buffer.from('abc').toString(encoding); - - readable.on('data', common.mustCall((chunk) => { - assert.strictEqual(chunk.toString(encoding), string); - }, 1)); - - readable.unshift(string, encoding); - -} - -{ - - const streamEncoding = 'base64'; - - function checkEncoding(readable) { - - // chunk encodings - const encodings = ['utf8', 'binary', 'hex', 'base64']; - const expected = []; - - readable.on('data', common.mustCall((chunk) => { - const { encoding, string } = expected.pop(); - assert.strictEqual(chunk.toString(encoding), string); - }, encodings.length)); - - for (const encoding of encodings) { - const string = 'abc'; - - // If encoding is the same as the state.encoding the string is - // saved as is - const expect = encoding !== streamEncoding ? - Buffer.from(string, encoding).toString(streamEncoding) : string; - - expected.push({ encoding, string: expect }); - - readable.unshift(string, encoding); - } - } - - const r1 = new Readable({ read() {} }); - r1.setEncoding(streamEncoding); - checkEncoding(r1); - - const r2 = new Readable({ read() {}, encoding: streamEncoding }); - checkEncoding(r2); - -} - -{ - // Both .push & .unshift should have the same behaviour - // When setting an encoding, each chunk should be emitted with that encoding - const encoding = 'base64'; - - function checkEncoding(readable) { - const string = 'abc'; - readable.on('data', common.mustCall((chunk) => { - assert.strictEqual(chunk, Buffer.from(string).toString(encoding)); - }, 2)); - - readable.push(string); - readable.unshift(string); - } - - const r1 = new Readable({ read() {} }); - r1.setEncoding(encoding); - checkEncoding(r1); - - const r2 = new Readable({ read() {}, encoding }); - checkEncoding(r2); - -} - -{ - // Check that ObjectMode works - const readable = new Readable({ objectMode: true, read() {} }); - - const chunks = ['a', 1, {}, []]; - - readable.on('data', common.mustCall((chunk) => { - assert.strictEqual(chunk, chunks.pop()); - }, chunks.length)); - - for (const chunk of chunks) { - readable.unshift(chunk); - } -} - -{ - - // Should not throw: https://github.com/nodejs/node/issues/27192 - const highWaterMark = 50; - class ArrayReader extends Readable { - constructor(opt) { - super({ highWaterMark }); - // The error happened only when pushing above hwm - this.buffer = new Array(highWaterMark * 2).fill(0).map(String); - } - _read(size) { - while (this.buffer.length) { - const chunk = this.buffer.shift(); - if (!this.buffer.length) { - this.push(chunk); - this.push(null); - return true; - } - if (!this.push(chunk)) - return; - } - } - } - - function onRead() { - while (null !== (stream.read())) { - // Remove the 'readable' listener before unshifting - stream.removeListener('readable', onRead); - stream.unshift('a'); - stream.on('data', (chunk) => { - console.log(chunk.length); - }); - break; - } - } - - const stream = new ArrayReader(); - stream.once('readable', common.mustCall(onRead)); - stream.on('end', common.mustCall()); - -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js b/cli/tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js deleted file mode 100644 index a2fe2ac01..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readable-with-unimplemented-_read.js +++ /dev/null @@ -1,20 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Readable } = require('stream'); - -const readable = new Readable(); - -readable.read(); -readable.on('error', common.expectsError({ - code: 'ERR_METHOD_NOT_IMPLEMENTED', - name: 'Error', - message: 'The _read() method is not implemented' -})); -readable.on('close', common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-stream-readableListening-state.js b/cli/tests/node_compat/test/parallel/test-stream-readableListening-state.js deleted file mode 100644 index 69085ac86..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-readableListening-state.js +++ /dev/null @@ -1,41 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -const r = new stream.Readable({ - read: () => {} -}); - -// readableListening state should start in `false`. -assert.strictEqual(r._readableState.readableListening, false); - -r.on('readable', common.mustCall(() => { - // Inside the readable event this state should be true. - assert.strictEqual(r._readableState.readableListening, true); -})); - -r.push(Buffer.from('Testing readableListening state')); - -const r2 = new stream.Readable({ - read: () => {} -}); - -// readableListening state should start in `false`. -assert.strictEqual(r2._readableState.readableListening, false); - -r2.on('data', common.mustCall((chunk) => { - // readableListening should be false because we don't have - // a `readable` listener - assert.strictEqual(r2._readableState.readableListening, false); -})); - -r2.push(Buffer.from('Testing readableListening state')); diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-callback-twice.js b/cli/tests/node_compat/test/parallel/test-stream-transform-callback-twice.js deleted file mode 100644 index 3ca0a4c68..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-callback-twice.js +++ /dev/null @@ -1,21 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Transform } = require('stream'); -const stream = new Transform({ - transform(chunk, enc, cb) { cb(); cb(); } -}); - -stream.on('error', common.expectsError({ - name: 'Error', - message: 'Callback called multiple times', - code: 'ERR_MULTIPLE_CALLBACK' -})); - -stream.write('foo'); diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js b/cli/tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js deleted file mode 100644 index 4daf199b0..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-constructor-set-methods.js +++ /dev/null @@ -1,50 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const assert = require('assert'); -const { Transform } = require('stream'); - -const t = new Transform(); - -assert.throws( - () => { - t.end(Buffer.from('blerg')); - }, - { - name: 'Error', - code: 'ERR_METHOD_NOT_IMPLEMENTED', - message: 'The _transform() method is not implemented' - } -); - -const _transform = common.mustCall((chunk, _, next) => { - next(); -}); - -const _final = common.mustCall((next) => { - next(); -}); - -const _flush = common.mustCall((next) => { - next(); -}); - -const t2 = new Transform({ - transform: _transform, - flush: _flush, - final: _final -}); - -assert.strictEqual(t2._transform, _transform); -assert.strictEqual(t2._flush, _flush); -assert.strictEqual(t2._final, _final); - -t2.end(Buffer.from('blerg')); -t2.resume(); diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-destroy.js b/cli/tests/node_compat/test/parallel/test-stream-transform-destroy.js deleted file mode 100644 index e721f848f..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-destroy.js +++ /dev/null @@ -1,150 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Transform } = require('stream'); -const assert = require('assert'); - -{ - const transform = new Transform({ - transform(chunk, enc, cb) {} - }); - - transform.resume(); - - transform.on('end', common.mustNotCall()); - transform.on('close', common.mustCall()); - transform.on('finish', common.mustNotCall()); - - transform.destroy(); -} - -{ - const transform = new Transform({ - transform(chunk, enc, cb) {} - }); - transform.resume(); - - const expected = new Error('kaboom'); - - transform.on('end', common.mustNotCall()); - transform.on('finish', common.mustNotCall()); - transform.on('close', common.mustCall()); - transform.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - transform.destroy(expected); -} - -{ - const transform = new Transform({ - transform(chunk, enc, cb) {} - }); - - transform._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, expected); - cb(err); - }, 1); - - const expected = new Error('kaboom'); - - transform.on('finish', common.mustNotCall('no finish event')); - transform.on('close', common.mustCall()); - transform.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - transform.destroy(expected); -} - -{ - const expected = new Error('kaboom'); - const transform = new Transform({ - transform(chunk, enc, cb) {}, - destroy: common.mustCall(function(err, cb) { - assert.strictEqual(err, expected); - cb(); - }, 1) - }); - transform.resume(); - - transform.on('end', common.mustNotCall('no end event')); - transform.on('close', common.mustCall()); - transform.on('finish', common.mustNotCall('no finish event')); - - // Error is swallowed by the custom _destroy - transform.on('error', common.mustNotCall('no error event')); - - transform.destroy(expected); -} - -{ - const transform = new Transform({ - transform(chunk, enc, cb) {} - }); - - transform._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - cb(); - }, 1); - - transform.destroy(); -} - -{ - const transform = new Transform({ - transform(chunk, enc, cb) {} - }); - transform.resume(); - - transform._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - process.nextTick(() => { - this.push(null); - this.end(); - cb(); - }); - }, 1); - - const fail = common.mustNotCall('no event'); - - transform.on('finish', fail); - transform.on('end', fail); - transform.on('close', common.mustCall()); - - transform.destroy(); - - transform.removeListener('end', fail); - transform.removeListener('finish', fail); - transform.on('end', common.mustCall()); - transform.on('finish', common.mustNotCall()); -} - -{ - const transform = new Transform({ - transform(chunk, enc, cb) {} - }); - - const expected = new Error('kaboom'); - - transform._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - cb(expected); - }, 1); - - transform.on('close', common.mustCall()); - transform.on('finish', common.mustNotCall('no finish event')); - transform.on('end', common.mustNotCall('no end event')); - transform.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - transform.destroy(); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-final-sync.js b/cli/tests/node_compat/test/parallel/test-stream-transform-final-sync.js deleted file mode 100644 index 5d108097d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-final-sync.js +++ /dev/null @@ -1,117 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const stream = require('stream'); -let state = 0; - - -// What you do -// -// const stream = new stream.Transform({ -// transform: function transformCallback(chunk, _, next) { -// // part 1 -// this.push(chunk); -// //part 2 -// next(); -// }, -// final: function endCallback(done) { -// // part 1 -// process.nextTick(function () { -// // part 2 -// done(); -// }); -// }, -// flush: function flushCallback(done) { -// // part 1 -// process.nextTick(function () { -// // part 2 -// done(); -// }); -// } -// }); -// t.on('data', dataListener); -// t.on('end', endListener); -// t.on('finish', finishListener); -// t.write(1); -// t.write(4); -// t.end(7, endMethodCallback); -// -// The order things are called -// -// 1. transformCallback part 1 -// 2. dataListener -// 3. transformCallback part 2 -// 4. transformCallback part 1 -// 5. dataListener -// 6. transformCallback part 2 -// 7. transformCallback part 1 -// 8. dataListener -// 9. transformCallback part 2 -// 10. finalCallback part 1 -// 11. finalCallback part 2 -// 12. flushCallback part 1 -// 13. finishListener -// 14. endMethodCallback -// 15. flushCallback part 2 -// 16. endListener - -const t = new stream.Transform({ - objectMode: true, - transform: common.mustCall(function(chunk, _, next) { - // transformCallback part 1 - assert.strictEqual(++state, chunk); - this.push(state); - // transformCallback part 2 - assert.strictEqual(++state, chunk + 2); - process.nextTick(next); - }, 3), - final: common.mustCall(function(done) { - state++; - // finalCallback part 1 - assert.strictEqual(state, 10); - state++; - // finalCallback part 2 - assert.strictEqual(state, 11); - done(); - }, 1), - flush: common.mustCall(function(done) { - state++; - // fluchCallback part 1 - assert.strictEqual(state, 12); - process.nextTick(function() { - state++; - // fluchCallback part 2 - assert.strictEqual(state, 13); - done(); - }); - }, 1) -}); -t.on('finish', common.mustCall(function() { - state++; - // finishListener - assert.strictEqual(state, 15); -}, 1)); -t.on('end', common.mustCall(function() { - state++; - // endEvent - assert.strictEqual(state, 16); -}, 1)); -t.on('data', common.mustCall(function(d) { - // dataListener - assert.strictEqual(++state, d + 1); -}, 3)); -t.write(1); -t.write(4); -t.end(7, common.mustCall(function() { - state++; - // endMethodCallback - assert.strictEqual(state, 14); -}, 1)); diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-final.js b/cli/tests/node_compat/test/parallel/test-stream-transform-final.js deleted file mode 100644 index 1d14adf6b..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-final.js +++ /dev/null @@ -1,119 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const stream = require('stream'); -let state = 0; - - -// What you do: -// -// const stream = new stream.Transform({ -// transform: function transformCallback(chunk, _, next) { -// // part 1 -// this.push(chunk); -// //part 2 -// next(); -// }, -// final: function endCallback(done) { -// // part 1 -// process.nextTick(function () { -// // part 2 -// done(); -// }); -// }, -// flush: function flushCallback(done) { -// // part 1 -// process.nextTick(function () { -// // part 2 -// done(); -// }); -// } -// }); -// t.on('data', dataListener); -// t.on('end', endListener); -// t.on('finish', finishListener); -// t.write(1); -// t.write(4); -// t.end(7, endMethodCallback); -// -// The order things are called - -// 1. transformCallback part 1 -// 2. dataListener -// 3. transformCallback part 2 -// 4. transformCallback part 1 -// 5. dataListener -// 6. transformCallback part 2 -// 7. transformCallback part 1 -// 8. dataListener -// 9. transformCallback part 2 -// 10. finalCallback part 1 -// 11. finalCallback part 2 -// 12. flushCallback part 1 -// 13. finishListener -// 14. endMethodCallback -// 15. flushCallback part 2 -// 16. endListener - -const t = new stream.Transform({ - objectMode: true, - transform: common.mustCall(function(chunk, _, next) { - // transformCallback part 1 - assert.strictEqual(++state, chunk); - this.push(state); - // transformCallback part 2 - assert.strictEqual(++state, chunk + 2); - process.nextTick(next); - }, 3), - final: common.mustCall(function(done) { - state++; - // finalCallback part 1 - assert.strictEqual(state, 10); - setTimeout(function() { - state++; - // finalCallback part 2 - assert.strictEqual(state, 11); - done(); - }, 100); - }, 1), - flush: common.mustCall(function(done) { - state++; - // flushCallback part 1 - assert.strictEqual(state, 12); - process.nextTick(function() { - state++; - // flushCallback part 2 - assert.strictEqual(state, 13); - done(); - }); - }, 1) -}); -t.on('finish', common.mustCall(function() { - state++; - // finishListener - assert.strictEqual(state, 15); -}, 1)); -t.on('end', common.mustCall(function() { - state++; - // end event - assert.strictEqual(state, 16); -}, 1)); -t.on('data', common.mustCall(function(d) { - // dataListener - assert.strictEqual(++state, d + 1); -}, 3)); -t.write(1); -t.write(4); -t.end(7, common.mustCall(function() { - state++; - // endMethodCallback - assert.strictEqual(state, 14); -}, 1)); diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-flush-data.js b/cli/tests/node_compat/test/parallel/test-stream-transform-flush-data.js deleted file mode 100644 index 6b8ba1adc..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-flush-data.js +++ /dev/null @@ -1,35 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -const assert = require('assert'); -const Transform = require('stream').Transform; - - -const expected = 'asdf'; - - -function _transform(d, e, n) { - n(); -} - -function _flush(n) { - n(null, expected); -} - -const t = new Transform({ - transform: _transform, - flush: _flush -}); - -t.end(Buffer.from('blerg')); -t.on('data', (data) => { - assert.strictEqual(data.toString(), expected); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js b/cli/tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js deleted file mode 100644 index 12390fe36..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-objectmode-falsey-value.js +++ /dev/null @@ -1,58 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 stream = require('stream'); -const PassThrough = stream.PassThrough; - -const src = new PassThrough({ objectMode: true }); -const tx = new PassThrough({ objectMode: true }); -const dest = new PassThrough({ objectMode: true }); - -const expect = [ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; -const results = []; - -dest.on('data', common.mustCall(function(x) { - results.push(x); -}, expect.length)); - -src.pipe(tx).pipe(dest); - -let i = -1; -const int = setInterval(common.mustCall(function() { - if (results.length === expect.length) { - src.end(); - clearInterval(int); - assert.deepStrictEqual(results, expect); - } else { - src.write(i++); - } -}, expect.length + 1), 1); diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js b/cli/tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js deleted file mode 100644 index 783ddfc91..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-split-highwatermark.js +++ /dev/null @@ -1,80 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -const { Transform, Readable, Writable } = require('stream'); - -const DEFAULT = 16 * 1024; - -function testTransform(expectedReadableHwm, expectedWritableHwm, options) { - const t = new Transform(options); - assert.strictEqual(t._readableState.highWaterMark, expectedReadableHwm); - assert.strictEqual(t._writableState.highWaterMark, expectedWritableHwm); -} - -// Test overriding defaultHwm -testTransform(666, DEFAULT, { readableHighWaterMark: 666 }); -testTransform(DEFAULT, 777, { writableHighWaterMark: 777 }); -testTransform(666, 777, { - readableHighWaterMark: 666, - writableHighWaterMark: 777, -}); - -// Test highWaterMark overriding -testTransform(555, 555, { - highWaterMark: 555, - readableHighWaterMark: 666, -}); -testTransform(555, 555, { - highWaterMark: 555, - writableHighWaterMark: 777, -}); -testTransform(555, 555, { - highWaterMark: 555, - readableHighWaterMark: 666, - writableHighWaterMark: 777, -}); - -// Test undefined, null -[undefined, null].forEach((v) => { - testTransform(DEFAULT, DEFAULT, { readableHighWaterMark: v }); - testTransform(DEFAULT, DEFAULT, { writableHighWaterMark: v }); - testTransform(666, DEFAULT, { highWaterMark: v, readableHighWaterMark: 666 }); - testTransform(DEFAULT, 777, { highWaterMark: v, writableHighWaterMark: 777 }); -}); - -// test NaN -{ - assert.throws(() => { - new Transform({ readableHighWaterMark: NaN }); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_VALUE', - message: "The property 'options.readableHighWaterMark' is invalid. " + - 'Received NaN' - }); - - assert.throws(() => { - new Transform({ writableHighWaterMark: NaN }); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_VALUE', - message: "The property 'options.writableHighWaterMark' is invalid. " + - 'Received NaN' - }); -} - -// Test non Duplex streams ignore the options -{ - const r = new Readable({ readableHighWaterMark: 666 }); - assert.strictEqual(r._readableState.highWaterMark, DEFAULT); - const w = new Writable({ writableHighWaterMark: 777 }); - assert.strictEqual(w._writableState.highWaterMark, DEFAULT); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js b/cli/tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js deleted file mode 100644 index 22e2586df..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-transform-split-objectmode.js +++ /dev/null @@ -1,88 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const Transform = require('stream').Transform; - -const parser = new Transform({ readableObjectMode: true }); - -assert(parser._readableState.objectMode); -assert(!parser._writableState.objectMode); -assert.strictEqual(parser.readableHighWaterMark, 16); -assert.strictEqual(parser.writableHighWaterMark, 16 * 1024); -assert.strictEqual(parser.readableHighWaterMark, - parser._readableState.highWaterMark); -assert.strictEqual(parser.writableHighWaterMark, - parser._writableState.highWaterMark); - -parser._transform = function(chunk, enc, callback) { - callback(null, { val: chunk[0] }); -}; - -let parsed; - -parser.on('data', function(obj) { - parsed = obj; -}); - -parser.end(Buffer.from([42])); - -process.on('exit', function() { - assert.strictEqual(parsed.val, 42); -}); - - -const serializer = new Transform({ writableObjectMode: true }); - -assert(!serializer._readableState.objectMode); -assert(serializer._writableState.objectMode); -assert.strictEqual(serializer.readableHighWaterMark, 16 * 1024); -assert.strictEqual(serializer.writableHighWaterMark, 16); -assert.strictEqual(parser.readableHighWaterMark, - parser._readableState.highWaterMark); -assert.strictEqual(parser.writableHighWaterMark, - parser._writableState.highWaterMark); - -serializer._transform = function(obj, _, callback) { - callback(null, Buffer.from([obj.val])); -}; - -let serialized; - -serializer.on('data', function(chunk) { - serialized = chunk; -}); - -serializer.write({ val: 42 }); - -process.on('exit', function() { - assert.strictEqual(serialized[0], 42); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-uint8array.js b/cli/tests/node_compat/test/parallel/test-stream-uint8array.js deleted file mode 100644 index c8de2dfe6..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-uint8array.js +++ /dev/null @@ -1,108 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const { Readable, Writable } = require('stream'); - -const ABC = new Uint8Array([0x41, 0x42, 0x43]); -const DEF = new Uint8Array([0x44, 0x45, 0x46]); -const GHI = new Uint8Array([0x47, 0x48, 0x49]); - -{ - // Simple Writable test. - - let n = 0; - const writable = new Writable({ - write: common.mustCall((chunk, encoding, cb) => { - assert(chunk instanceof Buffer); - if (n++ === 0) { - assert.strictEqual(String(chunk), 'ABC'); - } else { - assert.strictEqual(String(chunk), 'DEF'); - } - - cb(); - }, 2) - }); - - writable.write(ABC); - writable.end(DEF); -} - -{ - // Writable test, pass in Uint8Array in object mode. - - const writable = new Writable({ - objectMode: true, - write: common.mustCall((chunk, encoding, cb) => { - assert(!(chunk instanceof Buffer)); - assert(chunk instanceof Uint8Array); - assert.strictEqual(chunk, ABC); - assert.strictEqual(encoding, 'utf8'); - cb(); - }) - }); - - writable.end(ABC); -} - -{ - // Writable test, multiple writes carried out via writev. - let callback; - - const writable = new Writable({ - write: common.mustCall((chunk, encoding, cb) => { - assert(chunk instanceof Buffer); - assert.strictEqual(encoding, 'buffer'); - assert.strictEqual(String(chunk), 'ABC'); - callback = cb; - }), - writev: common.mustCall((chunks, cb) => { - assert.strictEqual(chunks.length, 2); - assert.strictEqual(chunks[0].encoding, 'buffer'); - assert.strictEqual(chunks[1].encoding, 'buffer'); - assert.strictEqual(chunks[0].chunk + chunks[1].chunk, 'DEFGHI'); - }) - }); - - writable.write(ABC); - writable.write(DEF); - writable.end(GHI); - callback(); -} - -{ - // Simple Readable test. - const readable = new Readable({ - read() {} - }); - - readable.push(DEF); - readable.unshift(ABC); - - const buf = readable.read(); - assert(buf instanceof Buffer); - assert.deepStrictEqual([...buf], [...ABC, ...DEF]); -} - -{ - // Readable test, setEncoding. - const readable = new Readable({ - read() {} - }); - - readable.setEncoding('utf8'); - - readable.push(DEF); - readable.unshift(ABC); - - const out = readable.read(); - assert.strictEqual(out, 'ABCDEF'); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-unpipe-event.js b/cli/tests/node_compat/test/parallel/test-stream-unpipe-event.js deleted file mode 100644 index d0b60f435..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-unpipe-event.js +++ /dev/null @@ -1,92 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { Writable, Readable } = require('stream'); -class NullWriteable extends Writable { - _write(chunk, encoding, callback) { - return callback(); - } -} -class QuickEndReadable extends Readable { - _read() { - this.push(null); - } -} -class NeverEndReadable extends Readable { - _read() {} -} - -{ - const dest = new NullWriteable(); - const src = new QuickEndReadable(); - dest.on('pipe', common.mustCall()); - dest.on('unpipe', common.mustCall()); - src.pipe(dest); - setImmediate(() => { - assert.strictEqual(src._readableState.pipes.length, 0); - }); -} - -{ - const dest = new NullWriteable(); - const src = new NeverEndReadable(); - dest.on('pipe', common.mustCall()); - dest.on('unpipe', common.mustNotCall('unpipe should not have been emitted')); - src.pipe(dest); - setImmediate(() => { - assert.strictEqual(src._readableState.pipes.length, 1); - }); -} - -{ - const dest = new NullWriteable(); - const src = new NeverEndReadable(); - dest.on('pipe', common.mustCall()); - dest.on('unpipe', common.mustCall()); - src.pipe(dest); - src.unpipe(dest); - setImmediate(() => { - assert.strictEqual(src._readableState.pipes.length, 0); - }); -} - -{ - const dest = new NullWriteable(); - const src = new QuickEndReadable(); - dest.on('pipe', common.mustCall()); - dest.on('unpipe', common.mustCall()); - src.pipe(dest, { end: false }); - setImmediate(() => { - assert.strictEqual(src._readableState.pipes.length, 0); - }); -} - -{ - const dest = new NullWriteable(); - const src = new NeverEndReadable(); - dest.on('pipe', common.mustCall()); - dest.on('unpipe', common.mustNotCall('unpipe should not have been emitted')); - src.pipe(dest, { end: false }); - setImmediate(() => { - assert.strictEqual(src._readableState.pipes.length, 1); - }); -} - -{ - const dest = new NullWriteable(); - const src = new NeverEndReadable(); - dest.on('pipe', common.mustCall()); - dest.on('unpipe', common.mustCall()); - src.pipe(dest, { end: false }); - src.unpipe(dest); - setImmediate(() => { - assert.strictEqual(src._readableState.pipes.length, 0); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js b/cli/tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js deleted file mode 100644 index f6c057fd6..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-unshift-empty-chunk.js +++ /dev/null @@ -1,87 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -// This test verifies that stream.unshift(Buffer.alloc(0)) or -// stream.unshift('') does not set state.reading=false. -const Readable = require('stream').Readable; - -const r = new Readable(); -let nChunks = 10; -const chunk = Buffer.alloc(10, 'x'); - -r._read = function(n) { - setImmediate(() => { - r.push(--nChunks === 0 ? null : chunk); - }); -}; - -let readAll = false; -const seen = []; -r.on('readable', () => { - let chunk; - while ((chunk = r.read()) !== null) { - seen.push(chunk.toString()); - // Simulate only reading a certain amount of the data, - // and then putting the rest of the chunk back into the - // stream, like a parser might do. We just fill it with - // 'y' so that it's easy to see which bits were touched, - // and which were not. - const putBack = Buffer.alloc(readAll ? 0 : 5, 'y'); - readAll = !readAll; - r.unshift(putBack); - } -}); - -const expect = - [ 'xxxxxxxxxx', - 'yyyyy', - 'xxxxxxxxxx', - 'yyyyy', - 'xxxxxxxxxx', - 'yyyyy', - 'xxxxxxxxxx', - 'yyyyy', - 'xxxxxxxxxx', - 'yyyyy', - 'xxxxxxxxxx', - 'yyyyy', - 'xxxxxxxxxx', - 'yyyyy', - 'xxxxxxxxxx', - 'yyyyy', - 'xxxxxxxxxx', - 'yyyyy' ]; - -r.on('end', () => { - assert.deepStrictEqual(seen, expect); - console.log('ok'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-unshift-read-race.js b/cli/tests/node_compat/test/parallel/test-stream-unshift-read-race.js deleted file mode 100644 index d88850519..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-unshift-read-race.js +++ /dev/null @@ -1,135 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -// This test verifies that: -// 1. unshift() does not cause colliding _read() calls. -// 2. unshift() after the 'end' event is an error, but after the EOF -// signalling null, it is ok, and just creates a new readable chunk. -// 3. push() after the EOF signaling null is an error. -// 4. _read() is not called after pushing the EOF null chunk. - -const stream = require('stream'); -const hwm = 10; -const r = stream.Readable({ highWaterMark: hwm, autoDestroy: false }); -const chunks = 10; - -const data = Buffer.allocUnsafe(chunks * hwm + Math.ceil(hwm / 2)); -for (let i = 0; i < data.length; i++) { - const c = 'asdf'.charCodeAt(i % 4); - data[i] = c; -} - -let pos = 0; -let pushedNull = false; -r._read = function(n) { - assert(!pushedNull, '_read after null push'); - - // Every third chunk is fast - push(!(chunks % 3)); - - function push(fast) { - assert(!pushedNull, 'push() after null push'); - const c = pos >= data.length ? null : data.slice(pos, pos + n); - pushedNull = c === null; - if (fast) { - pos += n; - r.push(c); - if (c === null) pushError(); - } else { - setTimeout(function() { - pos += n; - r.push(c); - if (c === null) pushError(); - }, 1); - } - } -}; - -function pushError() { - r.unshift(Buffer.allocUnsafe(1)); - w.end(); - - assert.throws(() => { - r.push(Buffer.allocUnsafe(1)); - }, { - code: 'ERR_STREAM_PUSH_AFTER_EOF', - name: 'Error', - message: 'stream.push() after EOF' - }); -} - - -const w = stream.Writable(); -const written = []; -w._write = function(chunk, encoding, cb) { - written.push(chunk.toString()); - cb(); -}; - -r.on('end', common.mustNotCall()); - -r.on('readable', function() { - let chunk; - while (null !== (chunk = r.read(10))) { - w.write(chunk); - if (chunk.length > 4) - r.unshift(Buffer.from('1234')); - } -}); - -w.on('finish', common.mustCall(function() { - // Each chunk should start with 1234, and then be asfdasdfasdf... - // The first got pulled out before the first unshift('1234'), so it's - // lacking that piece. - assert.strictEqual(written[0], 'asdfasdfas'); - let asdf = 'd'; - console.error(`0: ${written[0]}`); - for (let i = 1; i < written.length; i++) { - console.error(`${i.toString(32)}: ${written[i]}`); - assert.strictEqual(written[i].slice(0, 4), '1234'); - for (let j = 4; j < written[i].length; j++) { - const c = written[i].charAt(j); - assert.strictEqual(c, asdf); - switch (asdf) { - case 'a': asdf = 's'; break; - case 's': asdf = 'd'; break; - case 'd': asdf = 'f'; break; - case 'f': asdf = 'a'; break; - } - } - } -})); - -process.on('exit', function() { - assert.strictEqual(written.length, 18); - console.log('ok'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js b/cli/tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js deleted file mode 100644 index 547309d70..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-change-default-encoding.js +++ /dev/null @@ -1,85 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const stream = require('stream'); - -class MyWritable extends stream.Writable { - constructor(fn, options) { - super(options); - this.fn = fn; - } - - _write(chunk, encoding, callback) { - this.fn(Buffer.isBuffer(chunk), typeof chunk, encoding); - callback(); - } -} - -(function defaultCondingIsUtf8() { - const m = new MyWritable(function(isBuffer, type, enc) { - assert.strictEqual(enc, 'utf8'); - }, { decodeStrings: false }); - m.write('foo'); - m.end(); -}()); - -(function changeDefaultEncodingToAscii() { - const m = new MyWritable(function(isBuffer, type, enc) { - assert.strictEqual(enc, 'ascii'); - }, { decodeStrings: false }); - m.setDefaultEncoding('ascii'); - m.write('bar'); - m.end(); -}()); - -// Change default encoding to invalid value. -assert.throws(() => { - const m = new MyWritable( - (isBuffer, type, enc) => {}, - { decodeStrings: false }); - m.setDefaultEncoding({}); - m.write('bar'); - m.end(); -}, { - name: 'TypeError', - code: 'ERR_UNKNOWN_ENCODING', - message: 'Unknown encoding: {}' -}); - -(function checkVariableCaseEncoding() { - const m = new MyWritable(function(isBuffer, type, enc) { - assert.strictEqual(enc, 'ascii'); - }, { decodeStrings: false }); - m.setDefaultEncoding('AsCii'); - m.write('bar'); - m.end(); -}()); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js b/cli/tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js deleted file mode 100644 index ee24da756..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-clear-buffer.js +++ /dev/null @@ -1,42 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// This test ensures that the _writeableState.bufferedRequestCount and -// the actual buffered request count are the same. - -const common = require('../common'); -const Stream = require('stream'); -const assert = require('assert'); - -class StreamWritable extends Stream.Writable { - constructor() { - super({ objectMode: true }); - } - - // Refs: https://github.com/nodejs/node/issues/6758 - // We need a timer like on the original issue thread. - // Otherwise the code will never reach our test case. - _write(chunk, encoding, cb) { - setImmediate(cb); - } -} - -const testStream = new StreamWritable(); -testStream.cork(); - -for (let i = 1; i <= 5; i++) { - testStream.write(i, common.mustCall(() => { - assert.strictEqual( - testStream._writableState.bufferedRequestCount, - testStream._writableState.getBuffer().length - ); - })); -} - -testStream.end(); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js b/cli/tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js deleted file mode 100644 index 58e687edd..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-constructor-set-methods.js +++ /dev/null @@ -1,48 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const assert = require('assert'); -const { Writable } = require('stream'); - -const bufferBlerg = Buffer.from('blerg'); -const w = new Writable(); - -assert.throws( - () => { - w.end(bufferBlerg); - }, - { - name: 'Error', - code: 'ERR_METHOD_NOT_IMPLEMENTED', - message: 'The _write() method is not implemented' - } -); - -const _write = common.mustCall((chunk, _, next) => { - next(); -}); - -const _writev = common.mustCall((chunks, next) => { - assert.strictEqual(chunks.length, 2); - next(); -}); - -const w2 = new Writable({ write: _write, writev: _writev }); - -assert.strictEqual(w2._write, _write); -assert.strictEqual(w2._writev, _writev); - -w2.write(bufferBlerg); - -w2.cork(); -w2.write(bufferBlerg); -w2.write(bufferBlerg); - -w2.end(); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js b/cli/tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js deleted file mode 100644 index 9bf47bb1a..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-decoded-encoding.js +++ /dev/null @@ -1,65 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const stream = require('stream'); - -class MyWritable extends stream.Writable { - constructor(fn, options) { - super(options); - this.fn = fn; - } - - _write(chunk, encoding, callback) { - this.fn(Buffer.isBuffer(chunk), typeof chunk, encoding); - callback(); - } -} - -{ - const m = new MyWritable(function(isBuffer, type, enc) { - assert(isBuffer); - assert.strictEqual(type, 'object'); - assert.strictEqual(enc, 'buffer'); - }, { decodeStrings: true }); - m.write('some-text', 'utf8'); - m.end(); -} - -{ - const m = new MyWritable(function(isBuffer, type, enc) { - assert(!isBuffer); - assert.strictEqual(type, 'string'); - assert.strictEqual(enc, 'utf8'); - }, { decodeStrings: false }); - m.write('some-text', 'utf8'); - m.end(); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-destroy.js b/cli/tests/node_compat/test/parallel/test-stream-writable-destroy.js deleted file mode 100644 index bfe145854..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-destroy.js +++ /dev/null @@ -1,496 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Writable, addAbortSignal } = require('stream'); -const assert = require('assert'); - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - write.on('finish', common.mustNotCall()); - write.on('close', common.mustCall()); - - write.destroy(); - assert.strictEqual(write.destroyed, true); -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { - this.destroy(new Error('asd')); - cb(); - } - }); - - write.on('error', common.mustCall()); - write.on('finish', common.mustNotCall()); - write.end('asd'); - assert.strictEqual(write.destroyed, true); -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - const expected = new Error('kaboom'); - - write.on('finish', common.mustNotCall()); - write.on('close', common.mustCall()); - write.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - write.destroy(expected); - assert.strictEqual(write.destroyed, true); -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - write._destroy = function(err, cb) { - assert.strictEqual(err, expected); - cb(err); - }; - - const expected = new Error('kaboom'); - - write.on('finish', common.mustNotCall('no finish event')); - write.on('close', common.mustCall()); - write.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - write.destroy(expected); - assert.strictEqual(write.destroyed, true); -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); }, - destroy: common.mustCall(function(err, cb) { - assert.strictEqual(err, expected); - cb(); - }) - }); - - const expected = new Error('kaboom'); - - write.on('finish', common.mustNotCall('no finish event')); - write.on('close', common.mustCall()); - - // Error is swallowed by the custom _destroy - write.on('error', common.mustNotCall('no error event')); - - write.destroy(expected); - assert.strictEqual(write.destroyed, true); -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - write._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - cb(); - }); - - write.destroy(); - assert.strictEqual(write.destroyed, true); -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - write._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - process.nextTick(() => { - this.end(); - cb(); - }); - }); - - const fail = common.mustNotCall('no finish event'); - - write.on('finish', fail); - write.on('close', common.mustCall()); - - write.destroy(); - - assert.strictEqual(write.destroyed, true); -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - const expected = new Error('kaboom'); - - write._destroy = common.mustCall(function(err, cb) { - assert.strictEqual(err, null); - cb(expected); - }); - - write.on('close', common.mustCall()); - write.on('finish', common.mustNotCall('no finish event')); - write.on('error', common.mustCall((err) => { - assert.strictEqual(err, expected); - })); - - write.destroy(); - assert.strictEqual(write.destroyed, true); -} - -{ - // double error case - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - let ticked = false; - write.on('close', common.mustCall(() => { - assert.strictEqual(ticked, true); - })); - write.on('error', common.mustCall((err) => { - assert.strictEqual(ticked, true); - assert.strictEqual(err.message, 'kaboom 1'); - assert.strictEqual(write._writableState.errorEmitted, true); - })); - - const expected = new Error('kaboom 1'); - write.destroy(expected); - write.destroy(new Error('kaboom 2')); - assert.strictEqual(write._writableState.errored, expected); - assert.strictEqual(write._writableState.errorEmitted, false); - assert.strictEqual(write.destroyed, true); - ticked = true; -} - -{ - const writable = new Writable({ - destroy: common.mustCall(function(err, cb) { - process.nextTick(cb, new Error('kaboom 1')); - }), - write(chunk, enc, cb) { - cb(); - } - }); - - let ticked = false; - writable.on('close', common.mustCall(() => { - writable.on('error', common.mustNotCall()); - writable.destroy(new Error('hello')); - assert.strictEqual(ticked, true); - assert.strictEqual(writable._writableState.errorEmitted, true); - })); - writable.on('error', common.mustCall((err) => { - assert.strictEqual(ticked, true); - assert.strictEqual(err.message, 'kaboom 1'); - assert.strictEqual(writable._writableState.errorEmitted, true); - })); - - writable.destroy(); - assert.strictEqual(writable.destroyed, true); - assert.strictEqual(writable._writableState.errored, null); - assert.strictEqual(writable._writableState.errorEmitted, false); - - // Test case where `writable.destroy()` is called again with an error before - // the `_destroy()` callback is called. - writable.destroy(new Error('kaboom 2')); - assert.strictEqual(writable._writableState.errorEmitted, false); - assert.strictEqual(writable._writableState.errored, null); - - ticked = true; -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - write.destroyed = true; - assert.strictEqual(write.destroyed, true); - - // The internal destroy() mechanism should not be triggered - write.on('close', common.mustNotCall()); - write.destroy(); -} - -{ - function MyWritable() { - assert.strictEqual(this.destroyed, false); - this.destroyed = false; - Writable.call(this); - } - - Object.setPrototypeOf(MyWritable.prototype, Writable.prototype); - Object.setPrototypeOf(MyWritable, Writable); - - new MyWritable(); -} - -{ - // Destroy and destroy callback - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - write.destroy(); - - const expected = new Error('kaboom'); - - write.destroy(expected, common.mustCall((err) => { - assert.strictEqual(err, undefined); - })); -} - -{ - // Checks that `._undestroy()` restores the state so that `final` will be - // called again. - const write = new Writable({ - write: common.mustNotCall(), - final: common.mustCall((cb) => cb(), 2), - autoDestroy: true - }); - - write.end(); - write.once('close', common.mustCall(() => { - write._undestroy(); - write.end(); - })); -} - -{ - const write = new Writable(); - - write.destroy(); - write.on('error', common.mustNotCall()); - write.write('asd', common.expectsError({ - name: 'Error', - code: 'ERR_STREAM_DESTROYED', - message: 'Cannot call write after a stream was destroyed' - })); -} - -{ - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - write.on('error', common.mustNotCall()); - - write.cork(); - write.write('asd', common.mustCall()); - write.uncork(); - - write.cork(); - write.write('asd', common.expectsError({ - name: 'Error', - code: 'ERR_STREAM_DESTROYED', - message: 'Cannot call write after a stream was destroyed' - })); - write.destroy(); - write.write('asd', common.expectsError({ - name: 'Error', - code: 'ERR_STREAM_DESTROYED', - message: 'Cannot call write after a stream was destroyed' - })); - write.uncork(); -} - -{ - // Call end(cb) after error & destroy - - const write = new Writable({ - write(chunk, enc, cb) { cb(new Error('asd')); } - }); - write.on('error', common.mustCall(() => { - write.destroy(); - let ticked = false; - write.end(common.mustCall((err) => { - assert.strictEqual(ticked, true); - assert.strictEqual(err.code, 'ERR_STREAM_DESTROYED'); - })); - ticked = true; - })); - write.write('asd'); -} - -{ - // Call end(cb) after finish & destroy - - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - write.on('finish', common.mustCall(() => { - write.destroy(); - let ticked = false; - write.end(common.mustCall((err) => { - assert.strictEqual(ticked, true); - assert.strictEqual(err.code, 'ERR_STREAM_ALREADY_FINISHED'); - })); - ticked = true; - })); - write.end(); -} - -{ - // Call end(cb) after error & destroy and don't trigger - // unhandled exception. - - const write = new Writable({ - write(chunk, enc, cb) { process.nextTick(cb); } - }); - const _err = new Error('asd'); - write.once('error', common.mustCall((err) => { - assert.strictEqual(err.message, 'asd'); - })); - write.end('asd', common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - write.destroy(_err); -} - -{ - // Call buffered write callback with error - - const _err = new Error('asd'); - const write = new Writable({ - write(chunk, enc, cb) { - process.nextTick(cb, _err); - }, - autoDestroy: false - }); - write.cork(); - write.write('asd', common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - write.write('asd', common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - write.on('error', common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - write.uncork(); -} - -{ - // Ensure callback order. - - let state = 0; - const write = new Writable({ - write(chunk, enc, cb) { - // `setImmediate()` is used on purpose to ensure the callback is called - // after `process.nextTick()` callbacks. - setImmediate(cb); - } - }); - write.write('asd', common.mustCall(() => { - assert.strictEqual(state++, 0); - })); - write.write('asd', common.mustCall((err) => { - assert.strictEqual(err.code, 'ERR_STREAM_DESTROYED'); - assert.strictEqual(state++, 1); - })); - write.destroy(); -} - -{ - const write = new Writable({ - autoDestroy: false, - write(chunk, enc, cb) { - cb(); - cb(); - } - }); - - write.on('error', common.mustCall(() => { - assert(write._writableState.errored); - })); - write.write('asd'); -} - -{ - const ac = new AbortController(); - const write = addAbortSignal(ac.signal, new Writable({ - write(chunk, enc, cb) { cb(); } - })); - - write.on('error', common.mustCall((e) => { - assert.strictEqual(e.name, 'AbortError'); - assert.strictEqual(write.destroyed, true); - })); - write.write('asd'); - ac.abort(); -} - -{ - const ac = new AbortController(); - const write = new Writable({ - signal: ac.signal, - write(chunk, enc, cb) { cb(); } - }); - - write.on('error', common.mustCall((e) => { - assert.strictEqual(e.name, 'AbortError'); - assert.strictEqual(write.destroyed, true); - })); - write.write('asd'); - ac.abort(); -} - -{ - const signal = AbortSignal.abort(); - - const write = new Writable({ - signal, - write(chunk, enc, cb) { cb(); } - }); - - write.on('error', common.mustCall((e) => { - assert.strictEqual(e.name, 'AbortError'); - assert.strictEqual(write.destroyed, true); - })); -} - -{ - // Destroy twice - const write = new Writable({ - write(chunk, enc, cb) { cb(); } - }); - - write.end(common.mustCall()); - write.destroy(); - write.destroy(); -} - -{ - // https://github.com/nodejs/node/issues/39356 - const s = new Writable({ - final() {} - }); - const _err = new Error('oh no'); - // Remove `callback` and it works - s.end(common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - s.on('error', common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - s.destroy(_err); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js b/cli/tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js deleted file mode 100644 index 730146db3..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-end-cb-error.js +++ /dev/null @@ -1,85 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -{ - // Invoke end callback on failure. - const writable = new stream.Writable(); - - const _err = new Error('kaboom'); - writable._write = (chunk, encoding, cb) => { - process.nextTick(cb, _err); - }; - - writable.on('error', common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - writable.write('asd'); - writable.end(common.mustCall((err) => { - assert.strictEqual(err, _err); - })); - writable.end(common.mustCall((err) => { - assert.strictEqual(err, _err); - })); -} - -{ - // Don't invoke end callback twice - const writable = new stream.Writable(); - - writable._write = (chunk, encoding, cb) => { - process.nextTick(cb); - }; - - let called = false; - writable.end('asd', common.mustCall((err) => { - called = true; - assert.strictEqual(err, undefined); - })); - - writable.on('error', common.mustCall((err) => { - assert.strictEqual(err.message, 'kaboom'); - })); - writable.on('finish', common.mustCall(() => { - assert.strictEqual(called, true); - writable.emit('error', new Error('kaboom')); - })); -} - -{ - const w = new stream.Writable({ - write(chunk, encoding, callback) { - setImmediate(callback); - }, - finish(callback) { - setImmediate(callback); - } - }); - w.end('testing ended state', common.mustCall((err) => { - assert.strictEqual(err.code, 'ERR_STREAM_WRITE_AFTER_END'); - })); - assert.strictEqual(w.destroyed, false); - assert.strictEqual(w.writableEnded, true); - w.end(common.mustCall((err) => { - assert.strictEqual(err.code, 'ERR_STREAM_WRITE_AFTER_END'); - })); - assert.strictEqual(w.destroyed, false); - assert.strictEqual(w.writableEnded, true); - w.end('end', common.mustCall((err) => { - assert.strictEqual(err.code, 'ERR_STREAM_WRITE_AFTER_END'); - })); - assert.strictEqual(w.destroyed, true); - w.on('error', common.mustCall((err) => { - assert.strictEqual(err.code, 'ERR_STREAM_WRITE_AFTER_END'); - })); - w.on('finish', common.mustNotCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-end-multiple.js b/cli/tests/node_compat/test/parallel/test-stream-writable-end-multiple.js deleted file mode 100644 index ea1759303..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-end-multiple.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -const assert = require('assert'); -const stream = require('stream'); - -const writable = new stream.Writable(); -writable._write = (chunk, encoding, cb) => { - setTimeout(() => cb(), 10); -}; - -writable.end('testing ended state', common.mustCall()); -writable.end(common.mustCall()); -writable.on('finish', common.mustCall(() => { - let ticked = false; - writable.end(common.mustCall((err) => { - assert.strictEqual(ticked, true); - assert.strictEqual(err.code, 'ERR_STREAM_ALREADY_FINISHED'); - })); - ticked = true; -})); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-ended-state.js b/cli/tests/node_compat/test/parallel/test-stream-writable-ended-state.js deleted file mode 100644 index f6f6971a2..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-ended-state.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -const assert = require('assert'); -const stream = require('stream'); - -const writable = new stream.Writable(); - -writable._write = (chunk, encoding, cb) => { - assert.strictEqual(writable._writableState.ended, false); - assert.strictEqual(writable._writableState.writable, undefined); - assert.strictEqual(writable.writableEnded, false); - cb(); -}; - -assert.strictEqual(writable._writableState.ended, false); -assert.strictEqual(writable._writableState.writable, undefined); -assert.strictEqual(writable.writable, true); -assert.strictEqual(writable.writableEnded, false); - -writable.end('testing ended state', common.mustCall(() => { - assert.strictEqual(writable._writableState.ended, true); - assert.strictEqual(writable._writableState.writable, undefined); - assert.strictEqual(writable.writable, false); - assert.strictEqual(writable.writableEnded, true); -})); - -assert.strictEqual(writable._writableState.ended, true); -assert.strictEqual(writable._writableState.writable, undefined); -assert.strictEqual(writable.writable, false); -assert.strictEqual(writable.writableEnded, true); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js b/cli/tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js deleted file mode 100644 index 9d8775dec..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-finish-destroyed.js +++ /dev/null @@ -1,50 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Writable } = require('stream'); - -{ - const w = new Writable({ - write: common.mustCall((chunk, encoding, cb) => { - w.on('close', common.mustCall(() => { - cb(); - })); - }) - }); - - w.on('finish', common.mustNotCall()); - w.end('asd'); - w.destroy(); -} - -{ - const w = new Writable({ - write: common.mustCall((chunk, encoding, cb) => { - w.on('close', common.mustCall(() => { - cb(); - w.end(); - })); - }) - }); - - w.on('finish', common.mustNotCall()); - w.write('asd'); - w.destroy(); -} - -{ - const w = new Writable({ - write() { - } - }); - w.on('finish', common.mustNotCall()); - w.end(); - w.destroy(); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-finished-state.js b/cli/tests/node_compat/test/parallel/test-stream-writable-finished-state.js deleted file mode 100644 index 0b7333bf2..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-finished-state.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -const assert = require('assert'); -const stream = require('stream'); - -const writable = new stream.Writable(); - -writable._write = (chunk, encoding, cb) => { - // The state finished should start in false. - assert.strictEqual(writable._writableState.finished, false); - cb(); -}; - -writable.on('finish', common.mustCall(() => { - assert.strictEqual(writable._writableState.finished, true); -})); - -writable.end('testing finished state', common.mustCall(() => { - assert.strictEqual(writable._writableState.finished, true); -})); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-finished.js b/cli/tests/node_compat/test/parallel/test-stream-writable-finished.js deleted file mode 100644 index 30ae737f9..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-finished.js +++ /dev/null @@ -1,106 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const { Writable } = require('stream'); -const assert = require('assert'); - -// basic -{ - // Find it on Writable.prototype - assert(Object.hasOwn(Writable.prototype, 'writableFinished')); -} - -// event -{ - const writable = new Writable(); - - writable._write = (chunk, encoding, cb) => { - // The state finished should start in false. - assert.strictEqual(writable.writableFinished, false); - cb(); - }; - - writable.on('finish', common.mustCall(() => { - assert.strictEqual(writable.writableFinished, true); - })); - - writable.end('testing finished state', common.mustCall(() => { - assert.strictEqual(writable.writableFinished, true); - })); -} - -{ - // Emit finish asynchronously. - - const w = new Writable({ - write(chunk, encoding, cb) { - cb(); - } - }); - - w.end(); - w.on('finish', common.mustCall()); -} - -{ - // Emit prefinish synchronously. - - const w = new Writable({ - write(chunk, encoding, cb) { - cb(); - } - }); - - let sync = true; - w.on('prefinish', common.mustCall(() => { - assert.strictEqual(sync, true); - })); - w.end(); - sync = false; -} - -{ - // Emit prefinish synchronously w/ final. - - const w = new Writable({ - write(chunk, encoding, cb) { - cb(); - }, - final(cb) { - cb(); - } - }); - - let sync = true; - w.on('prefinish', common.mustCall(() => { - assert.strictEqual(sync, true); - })); - w.end(); - sync = false; -} - - -{ - // Call _final synchronously. - - let sync = true; - const w = new Writable({ - write(chunk, encoding, cb) { - cb(); - }, - final: common.mustCall((cb) => { - assert.strictEqual(sync, true); - cb(); - }) - }); - - w.end(); - sync = false; -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js b/cli/tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js deleted file mode 100644 index 82912adb8..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-invalid-chunk.js +++ /dev/null @@ -1,43 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -function testWriteType(val, objectMode, code) { - const writable = new stream.Writable({ - objectMode, - write: () => {} - }); - writable.on('error', common.mustNotCall()); - if (code) { - assert.throws(() => { - writable.write(val); - }, { code }); - } else { - writable.write(val); - } -} - -testWriteType([], false, 'ERR_INVALID_ARG_TYPE'); -testWriteType({}, false, 'ERR_INVALID_ARG_TYPE'); -testWriteType(0, false, 'ERR_INVALID_ARG_TYPE'); -testWriteType(true, false, 'ERR_INVALID_ARG_TYPE'); -testWriteType(0.0, false, 'ERR_INVALID_ARG_TYPE'); -testWriteType(undefined, false, 'ERR_INVALID_ARG_TYPE'); -testWriteType(null, false, 'ERR_STREAM_NULL_VALUES'); - -testWriteType([], true); -testWriteType({}, true); -testWriteType(0, true); -testWriteType(true, true); -testWriteType(0.0, true); -testWriteType(undefined, true); -testWriteType(null, true, 'ERR_STREAM_NULL_VALUES'); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js b/cli/tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js deleted file mode 100644 index fe8c28921..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-needdrain-state.js +++ /dev/null @@ -1,32 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const stream = require('stream'); -const assert = require('assert'); - -const transform = new stream.Transform({ - transform: _transform, - highWaterMark: 1 -}); - -function _transform(chunk, encoding, cb) { - process.nextTick(() => { - assert.strictEqual(transform._writableState.needDrain, true); - cb(); - }); -} - -assert.strictEqual(transform._writableState.needDrain, false); - -transform.write('asdasd', common.mustCall(() => { - assert.strictEqual(transform._writableState.needDrain, false); -})); - -assert.strictEqual(transform._writableState.needDrain, true); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-null.js b/cli/tests/node_compat/test/parallel/test-stream-writable-null.js deleted file mode 100644 index e2ddd7d0a..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-null.js +++ /dev/null @@ -1,54 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const stream = require('stream'); - -class MyWritable extends stream.Writable { - constructor(options) { - super({ autoDestroy: false, ...options }); - } - _write(chunk, encoding, callback) { - assert.notStrictEqual(chunk, null); - callback(); - } -} - -{ - const m = new MyWritable({ objectMode: true }); - m.on('error', common.mustNotCall()); - assert.throws(() => { - m.write(null); - }, { - code: 'ERR_STREAM_NULL_VALUES' - }); -} - -{ - const m = new MyWritable(); - m.on('error', common.mustNotCall()); - assert.throws(() => { - m.write(false); - }, { - code: 'ERR_INVALID_ARG_TYPE' - }); -} - -{ // Should not throw. - const m = new MyWritable({ objectMode: true }); - m.write(false, assert.ifError); -} - -{ // Should not throw. - const m = new MyWritable({ objectMode: true }).on('error', (e) => { - assert.ifError(e || new Error('should not get here')); - }); - m.write(false, assert.ifError); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-properties.js b/cli/tests/node_compat/test/parallel/test-stream-writable-properties.js deleted file mode 100644 index ef19b3a01..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-properties.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -const { Writable } = require('stream'); - -{ - const w = new Writable(); - assert.strictEqual(w.writableCorked, 0); - w.uncork(); - assert.strictEqual(w.writableCorked, 0); - w.cork(); - assert.strictEqual(w.writableCorked, 1); - w.cork(); - assert.strictEqual(w.writableCorked, 2); - w.uncork(); - assert.strictEqual(w.writableCorked, 1); - w.uncork(); - assert.strictEqual(w.writableCorked, 0); - w.uncork(); - assert.strictEqual(w.writableCorked, 0); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-writable.js b/cli/tests/node_compat/test/parallel/test-stream-writable-writable.js deleted file mode 100644 index 63be4b3ca..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-writable.js +++ /dev/null @@ -1,55 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const { Writable } = require('stream'); - -{ - const w = new Writable({ - write() {} - }); - assert.strictEqual(w.writable, true); - w.destroy(); - assert.strictEqual(w.writable, false); -} - -{ - const w = new Writable({ - write: common.mustCall((chunk, encoding, callback) => { - callback(new Error()); - }) - }); - assert.strictEqual(w.writable, true); - w.write('asd'); - assert.strictEqual(w.writable, false); - w.on('error', common.mustCall()); -} - -{ - const w = new Writable({ - write: common.mustCall((chunk, encoding, callback) => { - process.nextTick(() => { - callback(new Error()); - assert.strictEqual(w.writable, false); - }); - }) - }); - w.write('asd'); - w.on('error', common.mustCall()); -} - -{ - const w = new Writable({ - write: common.mustNotCall() - }); - assert.strictEqual(w.writable, true); - w.end(); - assert.strictEqual(w.writable, false); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js b/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js deleted file mode 100644 index c4df3233a..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-error.js +++ /dev/null @@ -1,65 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Writable } = require('stream'); -const assert = require('assert'); - -// Ensure callback is always invoked before -// error is emitted. Regardless if error was -// sync or async. - -{ - let callbackCalled = false; - // Sync Error - const writable = new Writable({ - write: common.mustCall((buf, enc, cb) => { - cb(new Error()); - }) - }); - writable.on('error', common.mustCall(() => { - assert.strictEqual(callbackCalled, true); - })); - writable.write('hi', common.mustCall(() => { - callbackCalled = true; - })); -} - -{ - let callbackCalled = false; - // Async Error - const writable = new Writable({ - write: common.mustCall((buf, enc, cb) => { - process.nextTick(cb, new Error()); - }) - }); - writable.on('error', common.mustCall(() => { - assert.strictEqual(callbackCalled, true); - })); - writable.write('hi', common.mustCall(() => { - callbackCalled = true; - })); -} - -{ - // Sync Error - const writable = new Writable({ - write: common.mustCall((buf, enc, cb) => { - cb(new Error()); - }) - }); - - writable.on('error', common.mustCall()); - - let cnt = 0; - // Ensure we don't live lock on sync error - while (writable.write('a')) - cnt++; - - assert.strictEqual(cnt, 0); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js b/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js deleted file mode 100644 index ab2408fd9..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-write-cb-twice.js +++ /dev/null @@ -1,59 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Writable } = require('stream'); - -{ - // Sync + Sync - const writable = new Writable({ - write: common.mustCall((buf, enc, cb) => { - cb(); - cb(); - }) - }); - writable.write('hi'); - writable.on('error', common.expectsError({ - code: 'ERR_MULTIPLE_CALLBACK', - name: 'Error' - })); -} - -{ - // Sync + Async - const writable = new Writable({ - write: common.mustCall((buf, enc, cb) => { - cb(); - process.nextTick(() => { - cb(); - }); - }) - }); - writable.write('hi'); - writable.on('error', common.expectsError({ - code: 'ERR_MULTIPLE_CALLBACK', - name: 'Error' - })); -} - -{ - // Async + Async - const writable = new Writable({ - write: common.mustCall((buf, enc, cb) => { - process.nextTick(cb); - process.nextTick(() => { - cb(); - }); - }) - }); - writable.write('hi'); - writable.on('error', common.expectsError({ - code: 'ERR_MULTIPLE_CALLBACK', - name: 'Error' - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-write-error.js b/cli/tests/node_compat/test/parallel/test-stream-writable-write-error.js deleted file mode 100644 index 2bb91f821..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-write-error.js +++ /dev/null @@ -1,82 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const { Writable } = require('stream'); - -function expectError(w, args, code, sync) { - if (sync) { - if (code) { - assert.throws(() => w.write(...args), { code }); - } else { - w.write(...args); - } - } else { - let errorCalled = false; - let ticked = false; - w.write(...args, common.mustCall((err) => { - assert.strictEqual(ticked, true); - assert.strictEqual(errorCalled, false); - assert.strictEqual(err.code, code); - })); - ticked = true; - w.on('error', common.mustCall((err) => { - errorCalled = true; - assert.strictEqual(err.code, code); - })); - } -} - -function test(autoDestroy) { - { - const w = new Writable({ - autoDestroy, - _write() {} - }); - w.end(); - expectError(w, ['asd'], 'ERR_STREAM_WRITE_AFTER_END'); - } - - { - const w = new Writable({ - autoDestroy, - _write() {} - }); - w.destroy(); - } - - { - const w = new Writable({ - autoDestroy, - _write() {} - }); - expectError(w, [null], 'ERR_STREAM_NULL_VALUES', true); - } - - { - const w = new Writable({ - autoDestroy, - _write() {} - }); - expectError(w, [{}], 'ERR_INVALID_ARG_TYPE', true); - } - - { - const w = new Writable({ - decodeStrings: false, - autoDestroy, - _write() {} - }); - expectError(w, ['asd', 'noencoding'], 'ERR_UNKNOWN_ENCODING', true); - } -} - -test(false); -test(true); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js b/cli/tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js deleted file mode 100644 index ff34a83c1..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writable-write-writev-finish.js +++ /dev/null @@ -1,159 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -// Ensure consistency between the finish event when using cork() -// and writev and when not using them - -{ - const writable = new stream.Writable(); - - writable._write = (chunks, encoding, cb) => { - cb(new Error('write test error')); - }; - - writable.on('finish', common.mustNotCall()); - writable.on('prefinish', common.mustNotCall()); - writable.on('error', common.mustCall((er) => { - assert.strictEqual(er.message, 'write test error'); - })); - - writable.end('test'); -} - -{ - const writable = new stream.Writable(); - - writable._write = (chunks, encoding, cb) => { - setImmediate(cb, new Error('write test error')); - }; - - writable.on('finish', common.mustNotCall()); - writable.on('prefinish', common.mustNotCall()); - writable.on('error', common.mustCall((er) => { - assert.strictEqual(er.message, 'write test error'); - })); - - writable.end('test'); -} - -{ - const writable = new stream.Writable(); - - writable._write = (chunks, encoding, cb) => { - cb(new Error('write test error')); - }; - - writable._writev = (chunks, cb) => { - cb(new Error('writev test error')); - }; - - writable.on('finish', common.mustNotCall()); - writable.on('prefinish', common.mustNotCall()); - writable.on('error', common.mustCall((er) => { - assert.strictEqual(er.message, 'writev test error'); - })); - - writable.cork(); - writable.write('test'); - - setImmediate(function() { - writable.end('test'); - }); -} - -{ - const writable = new stream.Writable(); - - writable._write = (chunks, encoding, cb) => { - setImmediate(cb, new Error('write test error')); - }; - - writable._writev = (chunks, cb) => { - setImmediate(cb, new Error('writev test error')); - }; - - writable.on('finish', common.mustNotCall()); - writable.on('prefinish', common.mustNotCall()); - writable.on('error', common.mustCall((er) => { - assert.strictEqual(er.message, 'writev test error'); - })); - - writable.cork(); - writable.write('test'); - - setImmediate(function() { - writable.end('test'); - }); -} - -// Regression test for -// https://github.com/nodejs/node/issues/13812 - -{ - const rs = new stream.Readable(); - rs.push('ok'); - rs.push(null); - rs._read = () => {}; - - const ws = new stream.Writable(); - - ws.on('finish', common.mustNotCall()); - ws.on('error', common.mustCall()); - - ws._write = (chunk, encoding, done) => { - setImmediate(done, new Error()); - }; - rs.pipe(ws); -} - -{ - const rs = new stream.Readable(); - rs.push('ok'); - rs.push(null); - rs._read = () => {}; - - const ws = new stream.Writable(); - - ws.on('finish', common.mustNotCall()); - ws.on('error', common.mustCall()); - - ws._write = (chunk, encoding, done) => { - done(new Error()); - }; - rs.pipe(ws); -} - -{ - const w = new stream.Writable(); - w._write = (chunk, encoding, cb) => { - process.nextTick(cb); - }; - w.on('error', common.mustCall()); - w.on('finish', common.mustNotCall()); - w.on('prefinish', () => { - w.write("shouldn't write in prefinish listener"); - }); - w.end(); -} - -{ - const w = new stream.Writable(); - w._write = (chunk, encoding, cb) => { - process.nextTick(cb); - }; - w.on('error', common.mustCall()); - w.on('finish', () => { - w.write("shouldn't write in finish listener"); - }); - w.end(); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-writableState-ending.js b/cli/tests/node_compat/test/parallel/test-stream-writableState-ending.js deleted file mode 100644 index a477e63b6..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writableState-ending.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -const assert = require('assert'); -const stream = require('stream'); - -const writable = new stream.Writable(); - -function testStates(ending, finished, ended) { - assert.strictEqual(writable._writableState.ending, ending); - assert.strictEqual(writable._writableState.finished, finished); - assert.strictEqual(writable._writableState.ended, ended); -} - -writable._write = (chunk, encoding, cb) => { - // Ending, finished, ended start in false. - testStates(false, false, false); - cb(); -}; - -writable.on('finish', () => { - // Ending, finished, ended = true. - testStates(true, true, true); -}); - -const result = writable.end('testing function end()', () => { - // Ending, finished, ended = true. - testStates(true, true, true); -}); - -// End returns the writable instance -assert.strictEqual(result, writable); - -// Ending, ended = true. -// finished = false. -testStates(true, false, true); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js b/cli/tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js deleted file mode 100644 index 0320d1a5d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js +++ /dev/null @@ -1,64 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -const writable = new stream.Writable(); - -writable._writev = common.mustCall((chunks, cb) => { - assert.strictEqual(chunks.length, 2); - cb(); -}, 1); - -writable._write = common.mustCall((chunk, encoding, cb) => { - cb(); -}, 1); - -// first cork -writable.cork(); -assert.strictEqual(writable._writableState.corked, 1); -assert.strictEqual(writable._writableState.bufferedRequestCount, 0); - -// cork again -writable.cork(); -assert.strictEqual(writable._writableState.corked, 2); - -// The first chunk is buffered -writable.write('first chunk'); -assert.strictEqual(writable._writableState.bufferedRequestCount, 1); - -// First uncork does nothing -writable.uncork(); -assert.strictEqual(writable._writableState.corked, 1); -assert.strictEqual(writable._writableState.bufferedRequestCount, 1); - -process.nextTick(uncork); - -// The second chunk is buffered, because we uncork at the end of tick -writable.write('second chunk'); -assert.strictEqual(writable._writableState.corked, 1); -assert.strictEqual(writable._writableState.bufferedRequestCount, 2); - -function uncork() { - // Second uncork flushes the buffer - writable.uncork(); - assert.strictEqual(writable._writableState.corked, 0); - assert.strictEqual(writable._writableState.bufferedRequestCount, 0); - - // Verify that end() uncorks correctly - writable.cork(); - writable.write('third chunk'); - writable.end(); - - // End causes an uncork() as well - assert.strictEqual(writable._writableState.corked, 0); - assert.strictEqual(writable._writableState.bufferedRequestCount, 0); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-write-destroy.js b/cli/tests/node_compat/test/parallel/test-stream-write-destroy.js deleted file mode 100644 index a4f103547..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-write-destroy.js +++ /dev/null @@ -1,69 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const { Writable } = require('stream'); - -// Test interaction between calling .destroy() on a writable and pending -// writes. - -for (const withPendingData of [ false, true ]) { - for (const useEnd of [ false, true ]) { - const callbacks = []; - - const w = new Writable({ - write(data, enc, cb) { - callbacks.push(cb); - }, - // Effectively disable the HWM to observe 'drain' events more easily. - highWaterMark: 1 - }); - - let chunksWritten = 0; - let drains = 0; - w.on('drain', () => drains++); - - function onWrite(err) { - if (err) { - assert.strictEqual(w.destroyed, true); - assert.strictEqual(err.code, 'ERR_STREAM_DESTROYED'); - } else { - chunksWritten++; - } - } - - w.write('abc', onWrite); - assert.strictEqual(chunksWritten, 0); - assert.strictEqual(drains, 0); - callbacks.shift()(); - assert.strictEqual(chunksWritten, 1); - assert.strictEqual(drains, 1); - - if (withPendingData) { - // Test 2 cases: There either is or is not data still in the write queue. - // (The second write will never actually get executed either way.) - w.write('def', onWrite); - } - if (useEnd) { - // Again, test 2 cases: Either we indicate that we want to end the - // writable or not. - w.end('ghi', onWrite); - } else { - w.write('ghi', onWrite); - } - - assert.strictEqual(chunksWritten, 1); - w.destroy(); - assert.strictEqual(chunksWritten, 1); - callbacks.shift()(); - assert.strictEqual(chunksWritten, useEnd && !withPendingData ? 1 : 2); - assert.strictEqual(callbacks.length, 0); - assert.strictEqual(drains, 1); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-stream-write-drain.js b/cli/tests/node_compat/test/parallel/test-stream-write-drain.js deleted file mode 100644 index 008b2b34b..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-write-drain.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const { Writable } = require('stream'); - -// Don't emit 'drain' if ended - -const w = new Writable({ - write(data, enc, cb) { - process.nextTick(cb); - }, - highWaterMark: 1 -}); - -w.on('drain', common.mustNotCall()); -w.write('asd'); -w.end(); diff --git a/cli/tests/node_compat/test/parallel/test-stream-write-final.js b/cli/tests/node_compat/test/parallel/test-stream-write-final.js deleted file mode 100644 index 527f515eb..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-write-final.js +++ /dev/null @@ -1,31 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const stream = require('stream'); -let shutdown = false; - -const w = new stream.Writable({ - final: common.mustCall(function(cb) { - assert.strictEqual(this, w); - setTimeout(function() { - shutdown = true; - cb(); - }, 100); - }), - write: function(chunk, e, cb) { - process.nextTick(cb); - } -}); -w.on('finish', common.mustCall(function() { - assert(shutdown); -})); -w.write(Buffer.allocUnsafe(1)); -w.end(Buffer.allocUnsafe(0)); diff --git a/cli/tests/node_compat/test/parallel/test-stream-writev.js b/cli/tests/node_compat/test/parallel/test-stream-writev.js deleted file mode 100644 index 050546646..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream-writev.js +++ /dev/null @@ -1,137 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 stream = require('stream'); - -const queue = []; -for (let decode = 0; decode < 2; decode++) { - for (let uncork = 0; uncork < 2; uncork++) { - for (let multi = 0; multi < 2; multi++) { - queue.push([!!decode, !!uncork, !!multi]); - } - } -} - -run(); - -function run() { - const t = queue.pop(); - if (t) - test(t[0], t[1], t[2], run); - else - console.log('ok'); -} - -function test(decode, uncork, multi, next) { - console.log(`# decode=${decode} uncork=${uncork} multi=${multi}`); - let counter = 0; - let expectCount = 0; - function cnt(msg) { - expectCount++; - const expect = expectCount; - return function(er) { - assert.ifError(er); - counter++; - assert.strictEqual(counter, expect); - }; - } - - const w = new stream.Writable({ decodeStrings: decode }); - w._write = common.mustNotCall('Should not call _write'); - - const expectChunks = decode ? [ - { encoding: 'buffer', - chunk: [104, 101, 108, 108, 111, 44, 32] }, - { encoding: 'buffer', - chunk: [119, 111, 114, 108, 100] }, - { encoding: 'buffer', - chunk: [33] }, - { encoding: 'buffer', - chunk: [10, 97, 110, 100, 32, 116, 104, 101, 110, 46, 46, 46] }, - { encoding: 'buffer', - chunk: [250, 206, 190, 167, 222, 173, 190, 239, 222, 202, 251, 173] }, - ] : [ - { encoding: 'ascii', chunk: 'hello, ' }, - { encoding: 'utf8', chunk: 'world' }, - { encoding: 'buffer', chunk: [33] }, - { encoding: 'latin1', chunk: '\nand then...' }, - { encoding: 'hex', chunk: 'facebea7deadbeefdecafbad' }, - ]; - - let actualChunks; - w._writev = function(chunks, cb) { - actualChunks = chunks.map(function(chunk) { - return { - encoding: chunk.encoding, - chunk: Buffer.isBuffer(chunk.chunk) ? - Array.prototype.slice.call(chunk.chunk) : chunk.chunk - }; - }); - cb(); - }; - - w.cork(); - w.write('hello, ', 'ascii', cnt('hello')); - w.write('world', 'utf8', cnt('world')); - - if (multi) - w.cork(); - - w.write(Buffer.from('!'), 'buffer', cnt('!')); - w.write('\nand then...', 'latin1', cnt('and then')); - - if (multi) - w.uncork(); - - w.write('facebea7deadbeefdecafbad', 'hex', cnt('hex')); - - if (uncork) - w.uncork(); - - w.end(cnt('end')); - - w.on('finish', function() { - // Make sure finish comes after all the write cb - cnt('finish')(); - assert.deepStrictEqual(actualChunks, expectChunks); - next(); - }); -} - -{ - const w = new stream.Writable({ - writev: common.mustCall(function(chunks, cb) { - cb(); - }) - }); - w.write('asd', common.mustCall()); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js b/cli/tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js deleted file mode 100644 index 34a1f7240..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-base64-single-char-read-end.js +++ /dev/null @@ -1,63 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const { Readable: R, Writable: W } = require('stream'); -const assert = require('assert'); - -const src = new R({ encoding: 'base64' }); -const dst = new W(); -let hasRead = false; -const accum = []; - -src._read = function(n) { - if (!hasRead) { - hasRead = true; - process.nextTick(function() { - src.push(Buffer.from('1')); - src.push(null); - }); - } -}; - -dst._write = function(chunk, enc, cb) { - accum.push(chunk); - cb(); -}; - -src.on('end', function() { - assert.strictEqual(String(Buffer.concat(accum)), 'MQ=='); - clearTimeout(timeout); -}); - -src.pipe(dst); - -const timeout = setTimeout(function() { - assert.fail('timed out waiting for _write'); -}, 100); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-basic.js b/cli/tests/node_compat/test/parallel/test-stream2-basic.js deleted file mode 100644 index b820d5287..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-basic.js +++ /dev/null @@ -1,452 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Readable: R, Writable: W } = require('stream'); -const assert = require('assert'); - -const EE = require('events').EventEmitter; - -class TestReader extends R { - constructor(n) { - super(); - this._buffer = Buffer.alloc(n || 100, 'x'); - this._pos = 0; - this._bufs = 10; - } - - _read(n) { - const max = this._buffer.length - this._pos; - n = Math.max(n, 0); - const toRead = Math.min(n, max); - if (toRead === 0) { - // Simulate the read buffer filling up with some more bytes some time - // in the future. - setTimeout(() => { - this._pos = 0; - this._bufs -= 1; - if (this._bufs <= 0) { - // read them all! - if (!this.ended) - this.push(null); - } else { - // now we have more. - // kinda cheating by calling _read, but whatever, - // it's just fake anyway. - this._read(n); - } - }, 10); - return; - } - - const ret = this._buffer.slice(this._pos, this._pos + toRead); - this._pos += toRead; - this.push(ret); - } -} - -class TestWriter extends EE { - constructor() { - super(); - this.received = []; - this.flush = false; - } - - write(c) { - this.received.push(c.toString()); - this.emit('write', c); - return true; - } - - end(c) { - if (c) this.write(c); - this.emit('end', this.received); - } -} - -{ - // Test basic functionality - const r = new TestReader(20); - - const reads = []; - const expect = [ 'x', - 'xx', - 'xxx', - 'xxxx', - 'xxxxx', - 'xxxxxxxxx', - 'xxxxxxxxxx', - 'xxxxxxxxxxxx', - 'xxxxxxxxxxxxx', - 'xxxxxxxxxxxxxxx', - 'xxxxxxxxxxxxxxxxx', - 'xxxxxxxxxxxxxxxxxxx', - 'xxxxxxxxxxxxxxxxxxxxx', - 'xxxxxxxxxxxxxxxxxxxxxxx', - 'xxxxxxxxxxxxxxxxxxxxxxxxx', - 'xxxxxxxxxxxxxxxxxxxxx' ]; - - r.on('end', common.mustCall(function() { - assert.deepStrictEqual(reads, expect); - })); - - let readSize = 1; - function flow() { - let res; - while (null !== (res = r.read(readSize++))) { - reads.push(res.toString()); - } - r.once('readable', flow); - } - - flow(); -} - -{ - // Verify pipe - const r = new TestReader(5); - - const expect = [ 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx' ]; - - const w = new TestWriter(); - - w.on('end', common.mustCall(function(received) { - assert.deepStrictEqual(received, expect); - })); - - r.pipe(w); -} - - -[1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(function(SPLIT) { - // Verify unpipe - const r = new TestReader(5); - - // Unpipe after 3 writes, then write to another stream instead. - let expect = [ 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx' ]; - expect = [ expect.slice(0, SPLIT), expect.slice(SPLIT) ]; - - const w = [ new TestWriter(), new TestWriter() ]; - - let writes = SPLIT; - w[0].on('write', function() { - if (--writes === 0) { - r.unpipe(); - assert.deepStrictEqual(r._readableState.pipes, []); - w[0].end(); - r.pipe(w[1]); - assert.deepStrictEqual(r._readableState.pipes, [w[1]]); - } - }); - - let ended = 0; - - w[0].on('end', common.mustCall(function(results) { - ended++; - assert.strictEqual(ended, 1); - assert.deepStrictEqual(results, expect[0]); - })); - - w[1].on('end', common.mustCall(function(results) { - ended++; - assert.strictEqual(ended, 2); - assert.deepStrictEqual(results, expect[1]); - })); - - r.pipe(w[0]); -}); - - -{ - // Verify both writers get the same data when piping to destinations - const r = new TestReader(5); - const w = [ new TestWriter(), new TestWriter() ]; - - const expect = [ 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx' ]; - - w[0].on('end', common.mustCall(function(received) { - assert.deepStrictEqual(received, expect); - })); - w[1].on('end', common.mustCall(function(received) { - assert.deepStrictEqual(received, expect); - })); - - r.pipe(w[0]); - r.pipe(w[1]); -} - - -[1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(function(SPLIT) { - // Verify multi-unpipe - const r = new TestReader(5); - - // Unpipe after 3 writes, then write to another stream instead. - let expect = [ 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx', - 'xxxxx' ]; - expect = [ expect.slice(0, SPLIT), expect.slice(SPLIT) ]; - - const w = [ new TestWriter(), new TestWriter(), new TestWriter() ]; - - let writes = SPLIT; - w[0].on('write', function() { - if (--writes === 0) { - r.unpipe(); - w[0].end(); - r.pipe(w[1]); - } - }); - - let ended = 0; - - w[0].on('end', common.mustCall(function(results) { - ended++; - assert.strictEqual(ended, 1); - assert.deepStrictEqual(results, expect[0]); - })); - - w[1].on('end', common.mustCall(function(results) { - ended++; - assert.strictEqual(ended, 2); - assert.deepStrictEqual(results, expect[1]); - })); - - r.pipe(w[0]); - r.pipe(w[2]); -}); - -{ - // Verify that back pressure is respected - const r = new R({ objectMode: true }); - r._read = common.mustNotCall(); - let counter = 0; - r.push(['one']); - r.push(['two']); - r.push(['three']); - r.push(['four']); - r.push(null); - - const w1 = new R(); - w1.write = function(chunk) { - assert.strictEqual(chunk[0], 'one'); - w1.emit('close'); - process.nextTick(function() { - r.pipe(w2); - r.pipe(w3); - }); - }; - w1.end = common.mustNotCall(); - - r.pipe(w1); - - const expected = ['two', 'two', 'three', 'three', 'four', 'four']; - - const w2 = new R(); - w2.write = function(chunk) { - assert.strictEqual(chunk[0], expected.shift()); - assert.strictEqual(counter, 0); - - counter++; - - if (chunk[0] === 'four') { - return true; - } - - setTimeout(function() { - counter--; - w2.emit('drain'); - }, 10); - - return false; - }; - w2.end = common.mustCall(); - - const w3 = new R(); - w3.write = function(chunk) { - assert.strictEqual(chunk[0], expected.shift()); - assert.strictEqual(counter, 1); - - counter++; - - if (chunk[0] === 'four') { - return true; - } - - setTimeout(function() { - counter--; - w3.emit('drain'); - }, 50); - - return false; - }; - w3.end = common.mustCall(function() { - assert.strictEqual(counter, 2); - assert.strictEqual(expected.length, 0); - }); -} - -{ - // Verify read(0) behavior for ended streams - const r = new R(); - let written = false; - let ended = false; - r._read = common.mustNotCall(); - - r.push(Buffer.from('foo')); - r.push(null); - - const v = r.read(0); - - assert.strictEqual(v, null); - - const w = new R(); - w.write = function(buffer) { - written = true; - assert.strictEqual(ended, false); - assert.strictEqual(buffer.toString(), 'foo'); - }; - - w.end = common.mustCall(function() { - ended = true; - assert.strictEqual(written, true); - }); - - r.pipe(w); -} - -{ - // Verify synchronous _read ending - const r = new R(); - let called = false; - r._read = function(n) { - r.push(null); - }; - - r.once('end', function() { - // Verify that this is called before the next tick - called = true; - }); - - r.read(); - - process.nextTick(function() { - assert.strictEqual(called, true); - }); -} - -{ - // Verify that adding readable listeners trigger data flow - const r = new R({ highWaterMark: 5 }); - let onReadable = false; - let readCalled = 0; - - r._read = function(n) { - if (readCalled++ === 2) - r.push(null); - else - r.push(Buffer.from('asdf')); - }; - - r.on('readable', function() { - onReadable = true; - r.read(); - }); - - r.on('end', common.mustCall(function() { - assert.strictEqual(readCalled, 3); - assert.ok(onReadable); - })); -} - -{ - // Verify that streams are chainable - const r = new R(); - r._read = common.mustCall(); - const r2 = r.setEncoding('utf8').pause().resume().pause(); - assert.strictEqual(r, r2); -} - -{ - // Verify readableEncoding property - assert(Object.hasOwn(R.prototype, 'readableEncoding')); - - const r = new R({ encoding: 'utf8' }); - assert.strictEqual(r.readableEncoding, 'utf8'); -} - -{ - // Verify readableObjectMode property - assert(Object.hasOwn(R.prototype, 'readableObjectMode')); - - const r = new R({ objectMode: true }); - assert.strictEqual(r.readableObjectMode, true); -} - -{ - // Verify writableObjectMode property - assert(Object.hasOwn(W.prototype, 'writableObjectMode')); - - const w = new W({ objectMode: true }); - assert.strictEqual(w.writableObjectMode, true); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-compatibility.js b/cli/tests/node_compat/test/parallel/test-stream2-compatibility.js deleted file mode 100644 index c228366c3..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-compatibility.js +++ /dev/null @@ -1,77 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const { Readable: R, Writable: W } = require('stream'); -const assert = require('assert'); - -let ondataCalled = 0; - -class TestReader extends R { - constructor() { - super(); - this._buffer = Buffer.alloc(100, 'x'); - - this.on('data', () => { - ondataCalled++; - }); - } - - _read(n) { - this.push(this._buffer); - this._buffer = Buffer.alloc(0); - } -} - -const reader = new TestReader(); -setImmediate(function() { - assert.strictEqual(ondataCalled, 1); - console.log('ok'); - reader.push(null); -}); - -class TestWriter extends W { - constructor() { - super(); - this.write('foo'); - this.end(); - } - - _write(chunk, enc, cb) { - cb(); - } -} - -const writer = new TestWriter(); - -process.on('exit', function() { - assert.strictEqual(reader.readable, false); - assert.strictEqual(writer.writable, false); - console.log('ok'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-decode-partial.js b/cli/tests/node_compat/test/parallel/test-stream2-decode-partial.js deleted file mode 100644 index f3a9ec15d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-decode-partial.js +++ /dev/null @@ -1,30 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const { Readable } = require('stream'); -const assert = require('assert'); - -let buf = ''; -const euro = Buffer.from([0xE2, 0x82, 0xAC]); -const cent = Buffer.from([0xC2, 0xA2]); -const source = Buffer.concat([euro, cent]); - -const readable = Readable({ encoding: 'utf8' }); -readable.push(source.slice(0, 2)); -readable.push(source.slice(2, 4)); -readable.push(source.slice(4, 6)); -readable.push(null); - -readable.on('data', function(data) { - buf += data; -}); - -process.on('exit', function() { - assert.strictEqual(buf, '€¢'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-finish-pipe.js b/cli/tests/node_compat/test/parallel/test-stream2-finish-pipe.js deleted file mode 100644 index c98812ff8..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-finish-pipe.js +++ /dev/null @@ -1,51 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const stream = require('stream'); - -const r = new stream.Readable(); -r._read = function(size) { - r.push(Buffer.allocUnsafe(size)); -}; - -const w = new stream.Writable(); -w._write = function(data, encoding, cb) { - process.nextTick(cb, null); -}; - -r.pipe(w); - -// end() must be called in nextTick or a WRITE_AFTER_END error occurs. -process.nextTick(() => { - // This might sound unrealistic, but it happens in net.js. When - // socket.allowHalfOpen === false, EOF will cause .destroySoon() call which - // ends the writable side of net.Socket. - w.end(); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-large-read-stall.js b/cli/tests/node_compat/test/parallel/test-stream2-large-read-stall.js deleted file mode 100644 index e13b53711..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-large-read-stall.js +++ /dev/null @@ -1,81 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -// If everything aligns so that you do a read(n) of exactly the -// remaining buffer, then make sure that 'end' still emits. - -const READSIZE = 100; -const PUSHSIZE = 20; -const PUSHCOUNT = 1000; -const HWM = 50; - -const Readable = require('stream').Readable; -const r = new Readable({ - highWaterMark: HWM -}); -const rs = r._readableState; - -r._read = push; - -r.on('readable', function() { - console.error('>> readable'); - let ret; - do { - console.error(` > read(${READSIZE})`); - ret = r.read(READSIZE); - console.error(` < ${ret && ret.length} (${rs.length} remain)`); - } while (ret && ret.length === READSIZE); - - console.error('<< after read()', - ret && ret.length, - rs.needReadable, - rs.length); -}); - -r.on('end', common.mustCall(function() { - assert.strictEqual(pushes, PUSHCOUNT + 1); -})); - -let pushes = 0; -function push() { - if (pushes > PUSHCOUNT) - return; - - if (pushes++ === PUSHCOUNT) { - console.error(' push(EOF)'); - return r.push(null); - } - - console.error(` push #${pushes}`); - if (r.push(Buffer.allocUnsafe(PUSHSIZE))) - setTimeout(push, 1); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-objects.js b/cli/tests/node_compat/test/parallel/test-stream2-objects.js deleted file mode 100644 index c5b2c981e..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-objects.js +++ /dev/null @@ -1,304 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Readable, Writable } = require('stream'); -const assert = require('assert'); - -function toArray(callback) { - const stream = new Writable({ objectMode: true }); - const list = []; - stream.write = function(chunk) { - list.push(chunk); - }; - - stream.end = common.mustCall(function() { - callback(list); - }); - - return stream; -} - -function fromArray(list) { - const r = new Readable({ objectMode: true }); - r._read = common.mustNotCall(); - list.forEach(function(chunk) { - r.push(chunk); - }); - r.push(null); - - return r; -} - -{ - // Verify that objects can be read from the stream - const r = fromArray([{ one: '1' }, { two: '2' }]); - - const v1 = r.read(); - const v2 = r.read(); - const v3 = r.read(); - - assert.deepStrictEqual(v1, { one: '1' }); - assert.deepStrictEqual(v2, { two: '2' }); - assert.strictEqual(v3, null); -} - -{ - // Verify that objects can be piped into the stream - const r = fromArray([{ one: '1' }, { two: '2' }]); - - r.pipe(toArray(common.mustCall(function(list) { - assert.deepStrictEqual(list, [ - { one: '1' }, - { two: '2' }, - ]); - }))); -} - -{ - // Verify that read(n) is ignored - const r = fromArray([{ one: '1' }, { two: '2' }]); - const value = r.read(2); - - assert.deepStrictEqual(value, { one: '1' }); -} - -{ - // Verify that objects can be synchronously read - const r = new Readable({ objectMode: true }); - const list = [{ one: '1' }, { two: '2' }]; - r._read = function(n) { - const item = list.shift(); - r.push(item || null); - }; - - r.pipe(toArray(common.mustCall(function(list) { - assert.deepStrictEqual(list, [ - { one: '1' }, - { two: '2' }, - ]); - }))); -} - -{ - // Verify that objects can be asynchronously read - const r = new Readable({ objectMode: true }); - const list = [{ one: '1' }, { two: '2' }]; - r._read = function(n) { - const item = list.shift(); - process.nextTick(function() { - r.push(item || null); - }); - }; - - r.pipe(toArray(common.mustCall(function(list) { - assert.deepStrictEqual(list, [ - { one: '1' }, - { two: '2' }, - ]); - }))); -} - -{ - // Verify that strings can be read as objects - const r = new Readable({ - objectMode: true - }); - r._read = common.mustNotCall(); - const list = ['one', 'two', 'three']; - list.forEach(function(str) { - r.push(str); - }); - r.push(null); - - r.pipe(toArray(common.mustCall(function(array) { - assert.deepStrictEqual(array, list); - }))); -} - -{ - // Verify read(0) behavior for object streams - const r = new Readable({ - objectMode: true - }); - r._read = common.mustNotCall(); - - r.push('foobar'); - r.push(null); - - r.pipe(toArray(common.mustCall(function(array) { - assert.deepStrictEqual(array, ['foobar']); - }))); -} - -{ - // Verify the behavior of pushing falsey values - const r = new Readable({ - objectMode: true - }); - r._read = common.mustNotCall(); - - r.push(false); - r.push(0); - r.push(''); - r.push(null); - - r.pipe(toArray(common.mustCall(function(array) { - assert.deepStrictEqual(array, [false, 0, '']); - }))); -} - -{ - // Verify high watermark _read() behavior - const r = new Readable({ - highWaterMark: 6, - objectMode: true - }); - let calls = 0; - const list = ['1', '2', '3', '4', '5', '6', '7', '8']; - - r._read = function(n) { - calls++; - }; - - list.forEach(function(c) { - r.push(c); - }); - - const v = r.read(); - - assert.strictEqual(calls, 0); - assert.strictEqual(v, '1'); - - const v2 = r.read(); - assert.strictEqual(v2, '2'); - - const v3 = r.read(); - assert.strictEqual(v3, '3'); - - assert.strictEqual(calls, 1); -} - -{ - // Verify high watermark push behavior - const r = new Readable({ - highWaterMark: 6, - objectMode: true - }); - r._read = common.mustNotCall(); - for (let i = 0; i < 6; i++) { - const bool = r.push(i); - assert.strictEqual(bool, i !== 5); - } -} - -{ - // Verify that objects can be written to stream - const w = new Writable({ objectMode: true }); - - w._write = function(chunk, encoding, cb) { - assert.deepStrictEqual(chunk, { foo: 'bar' }); - cb(); - }; - - w.on('finish', common.mustCall()); - w.write({ foo: 'bar' }); - w.end(); -} - -{ - // Verify that multiple objects can be written to stream - const w = new Writable({ objectMode: true }); - const list = []; - - w._write = function(chunk, encoding, cb) { - list.push(chunk); - cb(); - }; - - w.on('finish', common.mustCall(function() { - assert.deepStrictEqual(list, [0, 1, 2, 3, 4]); - })); - - w.write(0); - w.write(1); - w.write(2); - w.write(3); - w.write(4); - w.end(); -} - -{ - // Verify that strings can be written as objects - const w = new Writable({ - objectMode: true - }); - const list = []; - - w._write = function(chunk, encoding, cb) { - list.push(chunk); - process.nextTick(cb); - }; - - w.on('finish', common.mustCall(function() { - assert.deepStrictEqual(list, ['0', '1', '2', '3', '4']); - })); - - w.write('0'); - w.write('1'); - w.write('2'); - w.write('3'); - w.write('4'); - w.end(); -} - -{ - // Verify that stream buffers finish until callback is called - const w = new Writable({ - objectMode: true - }); - let called = false; - - w._write = function(chunk, encoding, cb) { - assert.strictEqual(chunk, 'foo'); - - process.nextTick(function() { - called = true; - cb(); - }); - }; - - w.on('finish', common.mustCall(function() { - assert.strictEqual(called, true); - })); - - w.write('foo'); - w.end(); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js b/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js deleted file mode 100644 index ee8b0d656..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-handling.js +++ /dev/null @@ -1,113 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -{ - let count = 1000; - - const source = new stream.Readable(); - source._read = function(n) { - n = Math.min(count, n); - count -= n; - source.push(Buffer.allocUnsafe(n)); - }; - - let unpipedDest; - source.unpipe = function(dest) { - unpipedDest = dest; - stream.Readable.prototype.unpipe.call(this, dest); - }; - - const dest = new stream.Writable(); - dest._write = function(chunk, encoding, cb) { - cb(); - }; - - source.pipe(dest); - - let gotErr = null; - dest.on('error', function(err) { - gotErr = err; - }); - - let unpipedSource; - dest.on('unpipe', function(src) { - unpipedSource = src; - }); - - const err = new Error('This stream turned into bacon.'); - dest.emit('error', err); - assert.strictEqual(gotErr, err); - assert.strictEqual(unpipedSource, source); - assert.strictEqual(unpipedDest, dest); -} - -{ - let count = 1000; - - const source = new stream.Readable(); - source._read = function(n) { - n = Math.min(count, n); - count -= n; - source.push(Buffer.allocUnsafe(n)); - }; - - let unpipedDest; - source.unpipe = function(dest) { - unpipedDest = dest; - stream.Readable.prototype.unpipe.call(this, dest); - }; - - const dest = new stream.Writable({ autoDestroy: false }); - dest._write = function(chunk, encoding, cb) { - cb(); - }; - - source.pipe(dest); - - let unpipedSource; - dest.on('unpipe', function(src) { - unpipedSource = src; - }); - - const err = new Error('This stream turned into bacon.'); - - let gotErr = null; - try { - dest.emit('error', err); - } catch (e) { - gotErr = e; - } - assert.strictEqual(gotErr, err); - assert.strictEqual(unpipedSource, source); - assert.strictEqual(unpipedDest, dest); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js b/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js deleted file mode 100644 index 990dfc67d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-pipe-error-once-listener.js +++ /dev/null @@ -1,60 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; - -require('../common'); -const stream = require('stream'); - -class Read extends stream.Readable { - _read(size) { - this.push('x'); - this.push(null); - } -} - -class Write extends stream.Writable { - _write(buffer, encoding, cb) { - this.emit('error', new Error('boom')); - this.emit('alldone'); - } -} - -const read = new Read(); -const write = new Write(); - -write.once('error', () => {}); -write.once('alldone', function(err) { - console.log('ok'); -}); - -process.on('exit', function(c) { - console.error('error thrown even with listener'); -}); - -read.pipe(write); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-push.js b/cli/tests/node_compat/test/parallel/test-stream2-push.js deleted file mode 100644 index e1dcdec95..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-push.js +++ /dev/null @@ -1,143 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const { Readable, Writable } = require('stream'); - -const EE = require('events').EventEmitter; - - -// A mock thing a bit like the net.Socket/tcp_wrap.handle interaction - -const stream = new Readable({ - highWaterMark: 16, - encoding: 'utf8' -}); - -const source = new EE(); - -stream._read = function() { - console.error('stream._read'); - readStart(); -}; - -let ended = false; -stream.on('end', function() { - ended = true; -}); - -source.on('data', function(chunk) { - const ret = stream.push(chunk); - console.error('data', stream.readableLength); - if (!ret) - readStop(); -}); - -source.on('end', function() { - stream.push(null); -}); - -let reading = false; - -function readStart() { - console.error('readStart'); - reading = true; -} - -function readStop() { - console.error('readStop'); - reading = false; - process.nextTick(function() { - const r = stream.read(); - if (r !== null) - writer.write(r); - }); -} - -const writer = new Writable({ - decodeStrings: false -}); - -const written = []; - -const expectWritten = - [ 'asdfgasdfgasdfgasdfg', - 'asdfgasdfgasdfgasdfg', - 'asdfgasdfgasdfgasdfg', - 'asdfgasdfgasdfgasdfg', - 'asdfgasdfgasdfgasdfg', - 'asdfgasdfgasdfgasdfg' ]; - -writer._write = function(chunk, encoding, cb) { - console.error(`WRITE ${chunk}`); - written.push(chunk); - process.nextTick(cb); -}; - -writer.on('finish', finish); - - -// Now emit some chunks. - -const chunk = 'asdfg'; - -let set = 0; -readStart(); -data(); -function data() { - assert(reading); - source.emit('data', chunk); - assert(reading); - source.emit('data', chunk); - assert(reading); - source.emit('data', chunk); - assert(reading); - source.emit('data', chunk); - assert(!reading); - if (set++ < 5) - setTimeout(data, 10); - else - end(); -} - -function finish() { - console.error('finish'); - assert.deepStrictEqual(written, expectWritten); - console.log('ok'); -} - -function end() { - source.emit('end'); - assert(!reading); - writer.end(stream.read()); - setImmediate(function() { - assert(ended); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-read-sync-stack.js b/cli/tests/node_compat/test/parallel/test-stream2-read-sync-stack.js deleted file mode 100644 index 0d291ac08..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-read-sync-stack.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 Readable = require('stream').Readable; - -// This tests synchronous read callbacks and verifies that even if they nest -// heavily the process handles it without an error - -const r = new Readable(); -const N = 256 * 1024; - -let reads = 0; -r._read = function(n) { - const chunk = reads++ === N ? null : Buffer.allocUnsafe(1); - r.push(chunk); -}; - -r.on('readable', function onReadable() { - if (!(r.readableLength % 256)) - console.error('readable', r.readableLength); - r.read(N * 2); -}); - -r.on('end', common.mustCall()); - -r.read(0); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js b/cli/tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js deleted file mode 100644 index fca3b11f2..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-readable-empty-buffer-no-eof.js +++ /dev/null @@ -1,124 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const Readable = require('stream').Readable; - -test1(); -test2(); - -function test1() { - const r = new Readable(); - - // Should not end when we get a Buffer.alloc(0) or '' as the _read - // result that just means that there is *temporarily* no data, but to - // go ahead and try again later. - // - // note that this is very unusual. it only works for crypto streams - // because the other side of the stream will call read(0) to cycle - // data through openssl. that's why setImmediate() is used to call - // r.read(0) again later, otherwise there is no more work being done - // and the process just exits. - - const buf = Buffer.alloc(5, 'x'); - let reads = 5; - r._read = function(n) { - switch (reads--) { - case 5: - return setImmediate(() => { - return r.push(buf); - }); - case 4: - setImmediate(() => { - return r.push(Buffer.alloc(0)); - }); - return setImmediate(r.read.bind(r, 0)); - case 3: - setImmediate(r.read.bind(r, 0)); - return process.nextTick(() => { - return r.push(Buffer.alloc(0)); - }); - case 2: - setImmediate(r.read.bind(r, 0)); - return r.push(Buffer.alloc(0)); // Not-EOF! - case 1: - return r.push(buf); - case 0: - return r.push(null); // EOF - default: - throw new Error('unreachable'); - } - }; - - const results = []; - function flow() { - let chunk; - while (null !== (chunk = r.read())) - results.push(String(chunk)); - } - r.on('readable', flow); - r.on('end', () => { - results.push('EOF'); - }); - flow(); - - process.on('exit', () => { - assert.deepStrictEqual(results, [ 'xxxxx', 'xxxxx', 'EOF' ]); - console.log('ok'); - }); -} - -function test2() { - const r = new Readable({ encoding: 'base64' }); - let reads = 5; - r._read = function(n) { - if (!reads--) - return r.push(null); // EOF - return r.push(Buffer.from('x')); - }; - - const results = []; - function flow() { - let chunk; - while (null !== (chunk = r.read())) - results.push(String(chunk)); - } - r.on('readable', flow); - r.on('end', () => { - results.push('EOF'); - }); - flow(); - - process.on('exit', () => { - assert.deepStrictEqual(results, [ 'eHh4', 'eHg=', 'EOF' ]); - console.log('ok'); - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-from-list.js b/cli/tests/node_compat/test/parallel/test-stream2-readable-from-list.js deleted file mode 100644 index 90f93d040..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-readable-from-list.js +++ /dev/null @@ -1,108 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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. - -// Flags: --expose-internals -'use strict'; -require('../common'); -const assert = require('assert'); -const fromList = require('stream').Readable._fromList; -const BufferList = require('internal/streams/buffer_list'); -const util = require('util'); - -function bufferListFromArray(arr) { - const bl = new BufferList(); - for (let i = 0; i < arr.length; ++i) - bl.push(arr[i]); - return bl; -} - -{ - // Verify behavior with buffers - let list = [ Buffer.from('foog'), - Buffer.from('bark'), - Buffer.from('bazy'), - Buffer.from('kuel') ]; - list = bufferListFromArray(list); - - assert.strictEqual( - util.inspect([ list ], { compact: false }), - `[ - BufferList { - head: [Object], - tail: [Object], - length: 4 - } -]`); - - // Read more than the first element. - let ret = fromList(6, { buffer: list, length: 16 }); - assert.strictEqual(ret.toString(), 'foogba'); - - // Read exactly the first element. - ret = fromList(2, { buffer: list, length: 10 }); - assert.strictEqual(ret.toString(), 'rk'); - - // Read less than the first element. - ret = fromList(2, { buffer: list, length: 8 }); - assert.strictEqual(ret.toString(), 'ba'); - - // Read more than we have. - ret = fromList(100, { buffer: list, length: 6 }); - assert.strictEqual(ret.toString(), 'zykuel'); - - // all consumed. - assert.deepStrictEqual(list, new BufferList()); -} - -{ - // Verify behavior with strings - let list = [ 'foog', - 'bark', - 'bazy', - 'kuel' ]; - list = bufferListFromArray(list); - - // Read more than the first element. - let ret = fromList(6, { buffer: list, length: 16, decoder: true }); - assert.strictEqual(ret, 'foogba'); - - // Read exactly the first element. - ret = fromList(2, { buffer: list, length: 10, decoder: true }); - assert.strictEqual(ret, 'rk'); - - // Read less than the first element. - ret = fromList(2, { buffer: list, length: 8, decoder: true }); - assert.strictEqual(ret, 'ba'); - - // Read more than we have. - ret = fromList(100, { buffer: list, length: 6, decoder: true }); - assert.strictEqual(ret, 'zykuel'); - - // all consumed. - assert.deepStrictEqual(list, new BufferList()); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js b/cli/tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js deleted file mode 100644 index bf65fda0a..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-readable-legacy-drain.js +++ /dev/null @@ -1,62 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 Stream = require('stream'); -const Readable = Stream.Readable; - -const r = new Readable(); -const N = 256; -let reads = 0; -r._read = function(n) { - return r.push(++reads === N ? null : Buffer.allocUnsafe(1)); -}; - -r.on('end', common.mustCall()); - -const w = new Stream(); -w.writable = true; -let buffered = 0; -w.write = function(c) { - buffered += c.length; - process.nextTick(drain); - return false; -}; - -function drain() { - assert(buffered <= 3); - buffered = 0; - w.emit('drain'); -} - -w.end = common.mustCall(); - -r.pipe(w); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js b/cli/tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js deleted file mode 100644 index c1e3a2f46..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-readable-non-empty-end.js +++ /dev/null @@ -1,79 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Readable } = require('stream'); - -let len = 0; -const chunks = new Array(10); -for (let i = 1; i <= 10; i++) { - chunks[i - 1] = Buffer.allocUnsafe(i); - len += i; -} - -const test = new Readable(); -let n = 0; -test._read = function(size) { - const chunk = chunks[n++]; - setTimeout(function() { - test.push(chunk === undefined ? null : chunk); - }, 1); -}; - -test.on('end', thrower); -function thrower() { - throw new Error('this should not happen!'); -} - -let bytesread = 0; -test.on('readable', function() { - const b = len - bytesread - 1; - const res = test.read(b); - if (res) { - bytesread += res.length; - console.error(`br=${bytesread} len=${len}`); - setTimeout(next, 1); - } - test.read(0); -}); -test.read(0); - -function next() { - // Now let's make 'end' happen - test.removeListener('end', thrower); - test.on('end', common.mustCall()); - - // One to get the last byte - let r = test.read(); - assert(r); - assert.strictEqual(r.length, 1); - r = test.read(); - assert.strictEqual(r, null); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js b/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js deleted file mode 100644 index 8971536e7..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-destroy.js +++ /dev/null @@ -1,34 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const { Readable } = require('stream'); -const EE = require('events').EventEmitter; - -const oldStream = new EE(); -oldStream.pause = () => {}; -oldStream.resume = () => {}; - -{ - new Readable({ - autoDestroy: false, - destroy: common.mustCall() - }) - .wrap(oldStream); - oldStream.emit('destroy'); -} - -{ - new Readable({ - autoDestroy: false, - destroy: common.mustCall() - }) - .wrap(oldStream); - oldStream.emit('close'); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js b/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js deleted file mode 100644 index 5716d0bf9..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-empty.js +++ /dev/null @@ -1,45 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Readable } = require('stream'); -const EE = require('events').EventEmitter; - -const oldStream = new EE(); -oldStream.pause = () => {}; -oldStream.resume = () => {}; - -const newStream = new Readable().wrap(oldStream); - -newStream - .on('readable', () => {}) - .on('end', common.mustCall()); - -oldStream.emit('end'); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js b/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js deleted file mode 100644 index 77cb757c4..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap-error.js +++ /dev/null @@ -1,44 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -const { Readable } = require('stream'); -const EE = require('events').EventEmitter; - -class LegacyStream extends EE { - pause() {} - resume() {} -} - -{ - const err = new Error(); - const oldStream = new LegacyStream(); - const r = new Readable({ autoDestroy: true }) - .wrap(oldStream) - .on('error', common.mustCall(() => { - assert.strictEqual(r._readableState.errorEmitted, true); - assert.strictEqual(r._readableState.errored, err); - assert.strictEqual(r.destroyed, true); - })); - oldStream.emit('error', err); -} - -{ - const err = new Error(); - const oldStream = new LegacyStream(); - const r = new Readable({ autoDestroy: false }) - .wrap(oldStream) - .on('error', common.mustCall(() => { - assert.strictEqual(r._readableState.errorEmitted, true); - assert.strictEqual(r._readableState.errored, err); - assert.strictEqual(r.destroyed, false); - })); - oldStream.emit('error', err); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap.js b/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap.js deleted file mode 100644 index 2bf8e99b0..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-readable-wrap.js +++ /dev/null @@ -1,107 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Readable, Writable } = require('stream'); -const EE = require('events').EventEmitter; - -function runTest(highWaterMark, objectMode, produce) { - - const old = new EE(); - const r = new Readable({ highWaterMark, objectMode }); - assert.strictEqual(r, r.wrap(old)); - - r.on('end', common.mustCall()); - - old.pause = function() { - old.emit('pause'); - flowing = false; - }; - - old.resume = function() { - old.emit('resume'); - flow(); - }; - - // Make sure pause is only emitted once. - let pausing = false; - r.on('pause', () => { - assert.strictEqual(pausing, false); - pausing = true; - process.nextTick(() => { - pausing = false; - }); - }); - - let flowing; - let chunks = 10; - let oldEnded = false; - const expected = []; - function flow() { - flowing = true; - while (flowing && chunks-- > 0) { - const item = produce(); - expected.push(item); - old.emit('data', item); - } - if (chunks <= 0) { - oldEnded = true; - old.emit('end'); - } - } - - const w = new Writable({ highWaterMark: highWaterMark * 2, - objectMode }); - const written = []; - w._write = function(chunk, encoding, cb) { - written.push(chunk); - setTimeout(cb, 1); - }; - - w.on('finish', common.mustCall(function() { - performAsserts(); - })); - - r.pipe(w); - - flow(); - - function performAsserts() { - assert(oldEnded); - assert.deepStrictEqual(written, expected); - } -} - -runTest(100, false, function() { return Buffer.allocUnsafe(100); }); -runTest(10, false, function() { return Buffer.from('xxxxxxxxxx'); }); -runTest(1, true, function() { return { foo: 'bar' }; }); - -const objectChunks = [ 5, 'a', false, 0, '', 'xyz', { x: 4 }, 7, [], 555 ]; -runTest(1, true, function() { return objectChunks.shift(); }); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-set-encoding.js b/cli/tests/node_compat/test/parallel/test-stream2-set-encoding.js deleted file mode 100644 index ed7023b29..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-set-encoding.js +++ /dev/null @@ -1,330 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Readable: R } = require('stream'); - -class TestReader extends R { - constructor(n, opts) { - super(opts); - this.pos = 0; - this.len = n || 100; - } - - _read(n) { - setTimeout(() => { - if (this.pos >= this.len) { - // Double push(null) to test eos handling - this.push(null); - return this.push(null); - } - - n = Math.min(n, this.len - this.pos); - if (n <= 0) { - // Double push(null) to test eos handling - this.push(null); - return this.push(null); - } - - this.pos += n; - const ret = Buffer.alloc(n, 'a'); - - return this.push(ret); - }, 1); - } -} - -{ - // Verify utf8 encoding - const tr = new TestReader(100); - tr.setEncoding('utf8'); - const out = []; - const expect = - [ 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa' ]; - - tr.on('readable', function flow() { - let chunk; - while (null !== (chunk = tr.read(10))) - out.push(chunk); - }); - - tr.on('end', common.mustCall(function() { - assert.deepStrictEqual(out, expect); - })); -} - - -{ - // Verify hex encoding - const tr = new TestReader(100); - tr.setEncoding('hex'); - const out = []; - const expect = - [ '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161' ]; - - tr.on('readable', function flow() { - let chunk; - while (null !== (chunk = tr.read(10))) - out.push(chunk); - }); - - tr.on('end', common.mustCall(function() { - assert.deepStrictEqual(out, expect); - })); -} - -{ - // Verify hex encoding with read(13) - const tr = new TestReader(100); - tr.setEncoding('hex'); - const out = []; - const expect = - [ '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '16161' ]; - - tr.on('readable', function flow() { - let chunk; - while (null !== (chunk = tr.read(13))) - out.push(chunk); - }); - - tr.on('end', common.mustCall(function() { - assert.deepStrictEqual(out, expect); - })); -} - -{ - // Verify base64 encoding - const tr = new TestReader(100); - tr.setEncoding('base64'); - const out = []; - const expect = - [ 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYQ==' ]; - - tr.on('readable', function flow() { - let chunk; - while (null !== (chunk = tr.read(10))) - out.push(chunk); - }); - - tr.on('end', common.mustCall(function() { - assert.deepStrictEqual(out, expect); - })); -} - -{ - // Verify utf8 encoding - const tr = new TestReader(100, { encoding: 'utf8' }); - const out = []; - const expect = - [ 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa', - 'aaaaaaaaaa' ]; - - tr.on('readable', function flow() { - let chunk; - while (null !== (chunk = tr.read(10))) - out.push(chunk); - }); - - tr.on('end', common.mustCall(function() { - assert.deepStrictEqual(out, expect); - })); -} - - -{ - // Verify hex encoding - const tr = new TestReader(100, { encoding: 'hex' }); - const out = []; - const expect = - [ '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161', - '6161616161' ]; - - tr.on('readable', function flow() { - let chunk; - while (null !== (chunk = tr.read(10))) - out.push(chunk); - }); - - tr.on('end', common.mustCall(function() { - assert.deepStrictEqual(out, expect); - })); -} - -{ - // Verify hex encoding with read(13) - const tr = new TestReader(100, { encoding: 'hex' }); - const out = []; - const expect = - [ '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '1616161616161', - '6161616161616', - '16161' ]; - - tr.on('readable', function flow() { - let chunk; - while (null !== (chunk = tr.read(13))) - out.push(chunk); - }); - - tr.on('end', common.mustCall(function() { - assert.deepStrictEqual(out, expect); - })); -} - -{ - // Verify base64 encoding - const tr = new TestReader(100, { encoding: 'base64' }); - const out = []; - const expect = - [ 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYWFhYWFh', - 'YWFhYWFhYW', - 'FhYQ==' ]; - - tr.on('readable', function flow() { - let chunk; - while (null !== (chunk = tr.read(10))) - out.push(chunk); - }); - - tr.on('end', common.mustCall(function() { - assert.deepStrictEqual(out, expect); - })); -} - -{ - // Verify chaining behavior - const tr = new TestReader(100); - assert.deepStrictEqual(tr.setEncoding('utf8'), tr); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-transform.js b/cli/tests/node_compat/test/parallel/test-stream2-transform.js deleted file mode 100644 index 2bd376b1f..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-transform.js +++ /dev/null @@ -1,501 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { PassThrough, Transform } = require('stream'); - -{ - // Verify writable side consumption - const tx = new Transform({ - highWaterMark: 10 - }); - - let transformed = 0; - tx._transform = function(chunk, encoding, cb) { - transformed += chunk.length; - tx.push(chunk); - cb(); - }; - - for (let i = 1; i <= 10; i++) { - tx.write(Buffer.allocUnsafe(i)); - } - tx.end(); - - assert.strictEqual(tx.readableLength, 10); - assert.strictEqual(transformed, 10); - assert.deepStrictEqual(tx.writableBuffer.map(function(c) { - return c.chunk.length; - }), [5, 6, 7, 8, 9, 10]); -} - -{ - // Verify passthrough behavior - const pt = new PassThrough(); - - pt.write(Buffer.from('foog')); - pt.write(Buffer.from('bark')); - pt.write(Buffer.from('bazy')); - pt.write(Buffer.from('kuel')); - pt.end(); - - assert.strictEqual(pt.read(5).toString(), 'foogb'); - assert.strictEqual(pt.read(5).toString(), 'arkba'); - assert.strictEqual(pt.read(5).toString(), 'zykue'); - assert.strictEqual(pt.read(5).toString(), 'l'); -} - -{ - // Verify object passthrough behavior - const pt = new PassThrough({ objectMode: true }); - - pt.write(1); - pt.write(true); - pt.write(false); - pt.write(0); - pt.write('foo'); - pt.write(''); - pt.write({ a: 'b' }); - pt.end(); - - assert.strictEqual(pt.read(), 1); - assert.strictEqual(pt.read(), true); - assert.strictEqual(pt.read(), false); - assert.strictEqual(pt.read(), 0); - assert.strictEqual(pt.read(), 'foo'); - assert.strictEqual(pt.read(), ''); - assert.deepStrictEqual(pt.read(), { a: 'b' }); -} - -{ - // Verify passthrough constructor behavior - const pt = PassThrough(); - - assert(pt instanceof PassThrough); -} - -{ - // Verify transform constructor behavior - const pt = Transform(); - - assert(pt instanceof Transform); -} - -{ - // Perform a simple transform - const pt = new Transform(); - pt._transform = function(c, e, cb) { - const ret = Buffer.alloc(c.length, 'x'); - pt.push(ret); - cb(); - }; - - pt.write(Buffer.from('foog')); - pt.write(Buffer.from('bark')); - pt.write(Buffer.from('bazy')); - pt.write(Buffer.from('kuel')); - pt.end(); - - assert.strictEqual(pt.read(5).toString(), 'xxxxx'); - assert.strictEqual(pt.read(5).toString(), 'xxxxx'); - assert.strictEqual(pt.read(5).toString(), 'xxxxx'); - assert.strictEqual(pt.read(5).toString(), 'x'); -} - -{ - // Verify simple object transform - const pt = new Transform({ objectMode: true }); - pt._transform = function(c, e, cb) { - pt.push(JSON.stringify(c)); - cb(); - }; - - pt.write(1); - pt.write(true); - pt.write(false); - pt.write(0); - pt.write('foo'); - pt.write(''); - pt.write({ a: 'b' }); - pt.end(); - - assert.strictEqual(pt.read(), '1'); - assert.strictEqual(pt.read(), 'true'); - assert.strictEqual(pt.read(), 'false'); - assert.strictEqual(pt.read(), '0'); - assert.strictEqual(pt.read(), '"foo"'); - assert.strictEqual(pt.read(), '""'); - assert.strictEqual(pt.read(), '{"a":"b"}'); -} - -{ - // Verify async passthrough - const pt = new Transform(); - pt._transform = function(chunk, encoding, cb) { - setTimeout(function() { - pt.push(chunk); - cb(); - }, 10); - }; - - pt.write(Buffer.from('foog')); - pt.write(Buffer.from('bark')); - pt.write(Buffer.from('bazy')); - pt.write(Buffer.from('kuel')); - pt.end(); - - pt.on('finish', common.mustCall(function() { - assert.strictEqual(pt.read(5).toString(), 'foogb'); - assert.strictEqual(pt.read(5).toString(), 'arkba'); - assert.strictEqual(pt.read(5).toString(), 'zykue'); - assert.strictEqual(pt.read(5).toString(), 'l'); - })); -} - -{ - // Verify asymmetric transform (expand) - const pt = new Transform(); - - // Emit each chunk 2 times. - pt._transform = function(chunk, encoding, cb) { - setTimeout(function() { - pt.push(chunk); - setTimeout(function() { - pt.push(chunk); - cb(); - }, 10); - }, 10); - }; - - pt.write(Buffer.from('foog')); - pt.write(Buffer.from('bark')); - pt.write(Buffer.from('bazy')); - pt.write(Buffer.from('kuel')); - pt.end(); - - pt.on('finish', common.mustCall(function() { - assert.strictEqual(pt.read(5).toString(), 'foogf'); - assert.strictEqual(pt.read(5).toString(), 'oogba'); - assert.strictEqual(pt.read(5).toString(), 'rkbar'); - assert.strictEqual(pt.read(5).toString(), 'kbazy'); - assert.strictEqual(pt.read(5).toString(), 'bazyk'); - assert.strictEqual(pt.read(5).toString(), 'uelku'); - assert.strictEqual(pt.read(5).toString(), 'el'); - })); -} - -{ - // Verify asymmetric transform (compress) - const pt = new Transform(); - - // Each output is the first char of 3 consecutive chunks, - // or whatever's left. - pt.state = ''; - - pt._transform = function(chunk, encoding, cb) { - if (!chunk) - chunk = ''; - const s = chunk.toString(); - setTimeout(() => { - this.state += s.charAt(0); - if (this.state.length === 3) { - pt.push(Buffer.from(this.state)); - this.state = ''; - } - cb(); - }, 10); - }; - - pt._flush = function(cb) { - // Just output whatever we have. - pt.push(Buffer.from(this.state)); - this.state = ''; - cb(); - }; - - pt.write(Buffer.from('aaaa')); - pt.write(Buffer.from('bbbb')); - pt.write(Buffer.from('cccc')); - pt.write(Buffer.from('dddd')); - pt.write(Buffer.from('eeee')); - pt.write(Buffer.from('aaaa')); - pt.write(Buffer.from('bbbb')); - pt.write(Buffer.from('cccc')); - pt.write(Buffer.from('dddd')); - pt.write(Buffer.from('eeee')); - pt.write(Buffer.from('aaaa')); - pt.write(Buffer.from('bbbb')); - pt.write(Buffer.from('cccc')); - pt.write(Buffer.from('dddd')); - pt.end(); - - // 'abcdeabcdeabcd' - pt.on('finish', common.mustCall(function() { - assert.strictEqual(pt.read(5).toString(), 'abcde'); - assert.strictEqual(pt.read(5).toString(), 'abcde'); - assert.strictEqual(pt.read(5).toString(), 'abcd'); - })); -} - -// This tests for a stall when data is written to a full stream -// that has empty transforms. -{ - // Verify complex transform behavior - let count = 0; - let saved = null; - const pt = new Transform({ highWaterMark: 3 }); - pt._transform = function(c, e, cb) { - if (count++ === 1) - saved = c; - else { - if (saved) { - pt.push(saved); - saved = null; - } - pt.push(c); - } - - cb(); - }; - - pt.once('readable', function() { - process.nextTick(function() { - pt.write(Buffer.from('d')); - pt.write(Buffer.from('ef'), common.mustCall(function() { - pt.end(); - })); - assert.strictEqual(pt.read().toString(), 'abcdef'); - assert.strictEqual(pt.read(), null); - }); - }); - - pt.write(Buffer.from('abc')); -} - - -{ - // Verify passthrough event emission - const pt = new PassThrough(); - let emits = 0; - pt.on('readable', function() { - emits++; - }); - - pt.write(Buffer.from('foog')); - pt.write(Buffer.from('bark')); - - assert.strictEqual(emits, 0); - assert.strictEqual(pt.read(5).toString(), 'foogb'); - assert.strictEqual(String(pt.read(5)), 'null'); - assert.strictEqual(emits, 0); - - pt.write(Buffer.from('bazy')); - pt.write(Buffer.from('kuel')); - - assert.strictEqual(emits, 0); - assert.strictEqual(pt.read(5).toString(), 'arkba'); - assert.strictEqual(pt.read(5).toString(), 'zykue'); - assert.strictEqual(pt.read(5), null); - - pt.end(); - - assert.strictEqual(emits, 1); - assert.strictEqual(pt.read(5).toString(), 'l'); - assert.strictEqual(pt.read(5), null); - assert.strictEqual(emits, 1); -} - -{ - // Verify passthrough event emission reordering - const pt = new PassThrough(); - let emits = 0; - pt.on('readable', function() { - emits++; - }); - - pt.write(Buffer.from('foog')); - pt.write(Buffer.from('bark')); - - assert.strictEqual(emits, 0); - assert.strictEqual(pt.read(5).toString(), 'foogb'); - assert.strictEqual(pt.read(5), null); - - pt.once('readable', common.mustCall(function() { - assert.strictEqual(pt.read(5).toString(), 'arkba'); - assert.strictEqual(pt.read(5), null); - - pt.once('readable', common.mustCall(function() { - assert.strictEqual(pt.read(5).toString(), 'zykue'); - assert.strictEqual(pt.read(5), null); - pt.once('readable', common.mustCall(function() { - assert.strictEqual(pt.read(5).toString(), 'l'); - assert.strictEqual(pt.read(5), null); - assert.strictEqual(emits, 3); - })); - pt.end(); - })); - pt.write(Buffer.from('kuel')); - })); - - pt.write(Buffer.from('bazy')); -} - -{ - // Verify passthrough facade - const pt = new PassThrough(); - const datas = []; - pt.on('data', function(chunk) { - datas.push(chunk.toString()); - }); - - pt.on('end', common.mustCall(function() { - assert.deepStrictEqual(datas, ['foog', 'bark', 'bazy', 'kuel']); - })); - - pt.write(Buffer.from('foog')); - setTimeout(function() { - pt.write(Buffer.from('bark')); - setTimeout(function() { - pt.write(Buffer.from('bazy')); - setTimeout(function() { - pt.write(Buffer.from('kuel')); - setTimeout(function() { - pt.end(); - }, 10); - }, 10); - }, 10); - }, 10); -} - -{ - // Verify object transform (JSON parse) - const jp = new Transform({ objectMode: true }); - jp._transform = function(data, encoding, cb) { - try { - jp.push(JSON.parse(data)); - cb(); - } catch (er) { - cb(er); - } - }; - - // Anything except null/undefined is fine. - // those are "magic" in the stream API, because they signal EOF. - const objects = [ - { foo: 'bar' }, - 100, - 'string', - { nested: { things: [ { foo: 'bar' }, 100, 'string' ] } }, - ]; - - let ended = false; - jp.on('end', function() { - ended = true; - }); - - objects.forEach(function(obj) { - jp.write(JSON.stringify(obj)); - const res = jp.read(); - assert.deepStrictEqual(res, obj); - }); - - jp.end(); - // Read one more time to get the 'end' event - jp.read(); - - process.nextTick(common.mustCall(function() { - assert.strictEqual(ended, true); - })); -} - -{ - // Verify object transform (JSON stringify) - const js = new Transform({ objectMode: true }); - js._transform = function(data, encoding, cb) { - try { - js.push(JSON.stringify(data)); - cb(); - } catch (er) { - cb(er); - } - }; - - // Anything except null/undefined is fine. - // those are "magic" in the stream API, because they signal EOF. - const objects = [ - { foo: 'bar' }, - 100, - 'string', - { nested: { things: [ { foo: 'bar' }, 100, 'string' ] } }, - ]; - - let ended = false; - js.on('end', function() { - ended = true; - }); - - objects.forEach(function(obj) { - js.write(obj); - const res = js.read(); - assert.strictEqual(res, JSON.stringify(obj)); - }); - - js.end(); - // Read one more time to get the 'end' event - js.read(); - - process.nextTick(common.mustCall(function() { - assert.strictEqual(ended, true); - })); -} - -{ - const s = new Transform({ - objectMode: true, - construct(callback) { - this.push('header from constructor'); - callback(); - }, - transform: (row, encoding, callback) => { - callback(null, row); - }, - }); - - const expected = [ - 'header from constructor', - 'firstLine', - 'secondLine', - ]; - s.on('data', common.mustCall((data) => { - assert.strictEqual(data.toString(), expected.shift()); - }, 3)); - s.write('firstLine'); - process.nextTick(() => s.write('secondLine')); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream2-unpipe-drain.js b/cli/tests/node_compat/test/parallel/test-stream2-unpipe-drain.js deleted file mode 100644 index 9c1a6844d..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-unpipe-drain.js +++ /dev/null @@ -1,79 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const stream = require('stream'); - -class TestWriter extends stream.Writable { - _write(buffer, encoding, callback) { - console.log('write called'); - // Super slow write stream (callback never called) - } -} - -const dest = new TestWriter(); - -class TestReader extends stream.Readable { - constructor() { - super(); - this.reads = 0; - } - - _read(size) { - this.reads += 1; - this.push(Buffer.alloc(size)); - } -} - -const src1 = new TestReader(); -const src2 = new TestReader(); - -src1.pipe(dest); - -src1.once('readable', () => { - process.nextTick(() => { - - src2.pipe(dest); - - src2.once('readable', () => { - process.nextTick(() => { - - src1.unpipe(dest); - }); - }); - }); -}); - - -process.on('exit', () => { - assert.strictEqual(src1.reads, 2); - assert.strictEqual(src2.reads, 2); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-unpipe-leak.js b/cli/tests/node_compat/test/parallel/test-stream2-unpipe-leak.js deleted file mode 100644 index 8958bc06b..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-unpipe-leak.js +++ /dev/null @@ -1,80 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); -const stream = require('stream'); - -const chunk = Buffer.from('hallo'); - -class TestWriter extends stream.Writable { - _write(buffer, encoding, callback) { - callback(null); - } -} - -const dest = new TestWriter(); - -// Set this high so that we'd trigger a nextTick warning -// and/or RangeError if we do maybeReadMore wrong. -class TestReader extends stream.Readable { - constructor() { - super({ - highWaterMark: 0x10000 - }); - } - - _read(size) { - this.push(chunk); - } -} - -const src = new TestReader(); - -for (let i = 0; i < 10; i++) { - src.pipe(dest); - src.unpipe(dest); -} - -assert.strictEqual(src.listeners('end').length, 0); -assert.strictEqual(src.listeners('readable').length, 0); - -assert.strictEqual(dest.listeners('unpipe').length, 0); -assert.strictEqual(dest.listeners('drain').length, 0); -assert.strictEqual(dest.listeners('error').length, 0); -assert.strictEqual(dest.listeners('close').length, 0); -assert.strictEqual(dest.listeners('finish').length, 0); - -console.error(src._readableState); -process.on('exit', function() { - src.readableBuffer.length = 0; - console.error(src._readableState); - assert(src.readableLength >= src.readableHighWaterMark); - console.log('ok'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream2-writable.js b/cli/tests/node_compat/test/parallel/test-stream2-writable.js deleted file mode 100644 index 8b7197b9b..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream2-writable.js +++ /dev/null @@ -1,466 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 { Writable: W, Duplex: D } = require('stream'); -const assert = require('assert'); - -class TestWriter extends W { - constructor(opts) { - super(opts); - this.buffer = []; - this.written = 0; - } - - _write(chunk, encoding, cb) { - // Simulate a small unpredictable latency - setTimeout(() => { - this.buffer.push(chunk.toString()); - this.written += chunk.length; - cb(); - }, Math.floor(Math.random() * 10)); - } -} - -const chunks = new Array(50); -for (let i = 0; i < chunks.length; i++) { - chunks[i] = 'x'.repeat(i); -} - -{ - // Verify fast writing - const tw = new TestWriter({ - highWaterMark: 100 - }); - - tw.on('finish', common.mustCall(function() { - // Got chunks in the right order - assert.deepStrictEqual(tw.buffer, chunks); - })); - - chunks.forEach(function(chunk) { - // Ignore backpressure. Just buffer it all up. - tw.write(chunk); - }); - tw.end(); -} - -{ - // Verify slow writing - const tw = new TestWriter({ - highWaterMark: 100 - }); - - tw.on('finish', common.mustCall(function() { - // Got chunks in the right order - assert.deepStrictEqual(tw.buffer, chunks); - })); - - let i = 0; - (function W() { - tw.write(chunks[i++]); - if (i < chunks.length) - setTimeout(W, 10); - else - tw.end(); - })(); -} - -{ - // Verify write backpressure - const tw = new TestWriter({ - highWaterMark: 50 - }); - - let drains = 0; - - tw.on('finish', common.mustCall(function() { - // Got chunks in the right order - assert.deepStrictEqual(tw.buffer, chunks); - assert.strictEqual(drains, 17); - })); - - tw.on('drain', function() { - drains++; - }); - - let i = 0; - (function W() { - let ret; - do { - ret = tw.write(chunks[i++]); - } while (ret !== false && i < chunks.length); - - if (i < chunks.length) { - assert(tw.writableLength >= 50); - tw.once('drain', W); - } else { - tw.end(); - } - })(); -} - -{ - // Verify write buffersize - const tw = new TestWriter({ - highWaterMark: 100 - }); - - const encodings = - [ 'hex', - 'utf8', - 'utf-8', - 'ascii', - 'latin1', - 'binary', - 'base64', - 'ucs2', - 'ucs-2', - 'utf16le', - 'utf-16le', - undefined ]; - - tw.on('finish', function() { - // Got the expected chunks - assert.deepStrictEqual(tw.buffer, chunks); - }); - - chunks.forEach(function(chunk, i) { - const enc = encodings[i % encodings.length]; - chunk = Buffer.from(chunk); - tw.write(chunk.toString(enc), enc); - }); -} - -{ - // Verify write with no buffersize - const tw = new TestWriter({ - highWaterMark: 100, - decodeStrings: false - }); - - tw._write = function(chunk, encoding, cb) { - assert.strictEqual(typeof chunk, 'string'); - chunk = Buffer.from(chunk, encoding); - return TestWriter.prototype._write.call(this, chunk, encoding, cb); - }; - - const encodings = - [ 'hex', - 'utf8', - 'utf-8', - 'ascii', - 'latin1', - 'binary', - 'base64', - 'ucs2', - 'ucs-2', - 'utf16le', - 'utf-16le', - undefined ]; - - tw.on('finish', function() { - // Got the expected chunks - assert.deepStrictEqual(tw.buffer, chunks); - }); - - chunks.forEach(function(chunk, i) { - const enc = encodings[i % encodings.length]; - chunk = Buffer.from(chunk); - tw.write(chunk.toString(enc), enc); - }); -} - -{ - // Verify write callbacks - const callbacks = chunks.map(function(chunk, i) { - return [i, function() { - callbacks._called[i] = chunk; - }]; - }).reduce(function(set, x) { - set[`callback-${x[0]}`] = x[1]; - return set; - }, {}); - callbacks._called = []; - - const tw = new TestWriter({ - highWaterMark: 100 - }); - - tw.on('finish', common.mustCall(function() { - process.nextTick(common.mustCall(function() { - // Got chunks in the right order - assert.deepStrictEqual(tw.buffer, chunks); - // Called all callbacks - assert.deepStrictEqual(callbacks._called, chunks); - })); - })); - - chunks.forEach(function(chunk, i) { - tw.write(chunk, callbacks[`callback-${i}`]); - }); - tw.end(); -} - -{ - // Verify end() callback - const tw = new TestWriter(); - tw.end(common.mustCall()); -} - -const helloWorldBuffer = Buffer.from('hello world'); - -{ - // Verify end() callback with chunk - const tw = new TestWriter(); - tw.end(helloWorldBuffer, common.mustCall()); -} - -{ - // Verify end() callback with chunk and encoding - const tw = new TestWriter(); - tw.end('hello world', 'ascii', common.mustCall()); -} - -{ - // Verify end() callback after write() call - const tw = new TestWriter(); - tw.write(helloWorldBuffer); - tw.end(common.mustCall()); -} - -{ - // Verify end() callback after write() callback - const tw = new TestWriter(); - let writeCalledback = false; - tw.write(helloWorldBuffer, function() { - writeCalledback = true; - }); - tw.end(common.mustCall(function() { - assert.strictEqual(writeCalledback, true); - })); -} - -{ - // Verify encoding is ignored for buffers - const tw = new W(); - const hex = '018b5e9a8f6236ffe30e31baf80d2cf6eb'; - tw._write = common.mustCall(function(chunk) { - assert.strictEqual(chunk.toString('hex'), hex); - }); - const buf = Buffer.from(hex, 'hex'); - tw.write(buf, 'latin1'); -} - -{ - // Verify writables cannot be piped - const w = new W({ autoDestroy: false }); - w._write = common.mustNotCall(); - let gotError = false; - w.on('error', function() { - gotError = true; - }); - w.pipe(process.stdout); - assert.strictEqual(gotError, true); -} - -{ - // Verify that duplex streams cannot be piped - const d = new D(); - d._read = common.mustCall(); - d._write = common.mustNotCall(); - let gotError = false; - d.on('error', function() { - gotError = true; - }); - d.pipe(process.stdout); - assert.strictEqual(gotError, false); -} - -{ - // Verify that end(chunk) twice is an error - const w = new W(); - w._write = common.mustCall((msg) => { - assert.strictEqual(msg.toString(), 'this is the end'); - }); - let gotError = false; - w.on('error', function(er) { - gotError = true; - assert.strictEqual(er.message, 'write after end'); - }); - w.end('this is the end'); - w.end('and so is this'); - process.nextTick(common.mustCall(function() { - assert.strictEqual(gotError, true); - })); -} - -{ - // Verify stream doesn't end while writing - const w = new W(); - let wrote = false; - w._write = function(chunk, e, cb) { - assert.strictEqual(this.writing, undefined); - wrote = true; - this.writing = true; - setTimeout(() => { - this.writing = false; - cb(); - }, 1); - }; - w.on('finish', common.mustCall(function() { - assert.strictEqual(wrote, true); - assert.strictEqual(this.writing, false); - })); - w.write(Buffer.alloc(0)); - w.end(); -} - -{ - // Verify finish does not come before write() callback - const w = new W(); - let writeCb = false; - w._write = function(chunk, e, cb) { - setTimeout(function() { - writeCb = true; - cb(); - }, 10); - }; - w.on('finish', common.mustCall(function() { - assert.strictEqual(writeCb, true); - })); - w.write(Buffer.alloc(0)); - w.end(); -} - -{ - // Verify finish does not come before synchronous _write() callback - const w = new W(); - let writeCb = false; - w._write = function(chunk, e, cb) { - cb(); - }; - w.on('finish', common.mustCall(function() { - assert.strictEqual(writeCb, true); - })); - w.write(Buffer.alloc(0), function() { - writeCb = true; - }); - w.end(); -} - -{ - // Verify finish is emitted if the last chunk is empty - const w = new W(); - w._write = function(chunk, e, cb) { - process.nextTick(cb); - }; - w.on('finish', common.mustCall()); - w.write(Buffer.allocUnsafe(1)); - w.end(Buffer.alloc(0)); -} - -{ - // Verify that finish is emitted after shutdown - const w = new W(); - let shutdown = false; - - w._final = common.mustCall(function(cb) { - assert.strictEqual(this, w); - setTimeout(function() { - shutdown = true; - cb(); - }, 100); - }); - w._write = function(chunk, e, cb) { - process.nextTick(cb); - }; - w.on('finish', common.mustCall(function() { - assert.strictEqual(shutdown, true); - })); - w.write(Buffer.allocUnsafe(1)); - w.end(Buffer.allocUnsafe(0)); -} - -{ - // Verify that error is only emitted once when failing in _finish. - const w = new W(); - - w._final = common.mustCall(function(cb) { - cb(new Error('test')); - }); - w.on('error', common.mustCall((err) => { - assert.strictEqual(w._writableState.errorEmitted, true); - assert.strictEqual(err.message, 'test'); - w.on('error', common.mustNotCall()); - w.destroy(new Error()); - })); - w.end(); -} - -{ - // Verify that error is only emitted once when failing in write. - const w = new W(); - w.on('error', common.mustNotCall()); - assert.throws(() => { - w.write(null); - }, { - code: 'ERR_STREAM_NULL_VALUES' - }); -} - -{ - // Verify that error is only emitted once when failing in write after end. - const w = new W(); - w.on('error', common.mustCall((err) => { - assert.strictEqual(w._writableState.errorEmitted, true); - assert.strictEqual(err.code, 'ERR_STREAM_WRITE_AFTER_END'); - })); - w.end(); - w.write('hello'); - w.destroy(new Error()); -} - -{ - // Verify that finish is not emitted after error - const w = new W(); - - w._final = common.mustCall(function(cb) { - cb(new Error()); - }); - w._write = function(chunk, e, cb) { - process.nextTick(cb); - }; - w.on('error', common.mustCall()); - w.on('prefinish', common.mustNotCall()); - w.on('finish', common.mustNotCall()); - w.write(Buffer.allocUnsafe(1)); - w.end(Buffer.allocUnsafe(0)); -} diff --git a/cli/tests/node_compat/test/parallel/test-stream3-cork-end.js b/cli/tests/node_compat/test/parallel/test-stream3-cork-end.js deleted file mode 100644 index 52f881121..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream3-cork-end.js +++ /dev/null @@ -1,98 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const stream = require('stream'); -const Writable = stream.Writable; - -// Test the buffering behavior of Writable streams. -// -// The call to cork() triggers storing chunks which are flushed -// on calling end() and the stream subsequently ended. -// -// node version target: 0.12 - -const expectedChunks = ['please', 'buffer', 'me', 'kindly']; -const inputChunks = expectedChunks.slice(0); -let seenChunks = []; -let seenEnd = false; - -const w = new Writable(); -// Let's arrange to store the chunks. -w._write = function(chunk, encoding, cb) { - // Stream end event is not seen before the last write. - assert.ok(!seenEnd); - // Default encoding given none was specified. - assert.strictEqual(encoding, 'buffer'); - - seenChunks.push(chunk); - cb(); -}; -// Let's record the stream end event. -w.on('finish', () => { - seenEnd = true; -}); - -function writeChunks(remainingChunks, callback) { - const writeChunk = remainingChunks.shift(); - let writeState; - - if (writeChunk) { - setImmediate(() => { - writeState = w.write(writeChunk); - // We were not told to stop writing. - assert.ok(writeState); - - writeChunks(remainingChunks, callback); - }); - } else { - callback(); - } -} - -// Do an initial write. -w.write('stuff'); -// The write was immediate. -assert.strictEqual(seenChunks.length, 1); -// Reset the seen chunks. -seenChunks = []; - -// Trigger stream buffering. -w.cork(); - -// Write the bufferedChunks. -writeChunks(inputChunks, () => { - // Should not have seen anything yet. - assert.strictEqual(seenChunks.length, 0); - - // Trigger flush and ending the stream. - w.end(); - - // Stream should not ended in current tick. - assert.ok(!seenEnd); - - // Buffered bytes should be seen in current tick. - assert.strictEqual(seenChunks.length, 4); - - // Did the chunks match. - for (let i = 0, l = expectedChunks.length; i < l; i++) { - const seen = seenChunks[i]; - // There was a chunk. - assert.ok(seen); - - const expected = Buffer.from(expectedChunks[i]); - // It was what we expected. - assert.ok(seen.equals(expected)); - } - - setImmediate(() => { - // Stream should have ended in next tick. - assert.ok(seenEnd); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream3-cork-uncork.js b/cli/tests/node_compat/test/parallel/test-stream3-cork-uncork.js deleted file mode 100644 index 1fb993003..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream3-cork-uncork.js +++ /dev/null @@ -1,93 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const stream = require('stream'); -const Writable = stream.Writable; - -// Test the buffering behavior of Writable streams. -// -// The call to cork() triggers storing chunks which are flushed -// on calling uncork() in the same tick. -// -// node version target: 0.12 - -const expectedChunks = ['please', 'buffer', 'me', 'kindly']; -const inputChunks = expectedChunks.slice(0); -let seenChunks = []; -let seenEnd = false; - -const w = new Writable(); -// Let's arrange to store the chunks. -w._write = function(chunk, encoding, cb) { - // Default encoding given none was specified. - assert.strictEqual(encoding, 'buffer'); - - seenChunks.push(chunk); - cb(); -}; -// Let's record the stream end event. -w.on('finish', () => { - seenEnd = true; -}); - -function writeChunks(remainingChunks, callback) { - const writeChunk = remainingChunks.shift(); - let writeState; - - if (writeChunk) { - setImmediate(() => { - writeState = w.write(writeChunk); - // We were not told to stop writing. - assert.ok(writeState); - - writeChunks(remainingChunks, callback); - }); - } else { - callback(); - } -} - -// Do an initial write. -w.write('stuff'); -// The write was immediate. -assert.strictEqual(seenChunks.length, 1); -// Reset the chunks seen so far. -seenChunks = []; - -// Trigger stream buffering. -w.cork(); - -// Write the bufferedChunks. -writeChunks(inputChunks, () => { - // Should not have seen anything yet. - assert.strictEqual(seenChunks.length, 0); - - // Trigger writing out the buffer. - w.uncork(); - - // Buffered bytes should be seen in current tick. - assert.strictEqual(seenChunks.length, 4); - - // Did the chunks match. - for (let i = 0, l = expectedChunks.length; i < l; i++) { - const seen = seenChunks[i]; - // There was a chunk. - assert.ok(seen); - - const expected = Buffer.from(expectedChunks[i]); - // It was what we expected. - assert.ok(seen.equals(expected)); - } - - setImmediate(() => { - // The stream should not have been ended. - assert.ok(!seenEnd); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-stream3-pause-then-read.js b/cli/tests/node_compat/test/parallel/test-stream3-pause-then-read.js deleted file mode 100644 index f840672ce..000000000 --- a/cli/tests/node_compat/test/parallel/test-stream3-pause-then-read.js +++ /dev/null @@ -1,177 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -require('../common'); -const assert = require('assert'); - -const stream = require('stream'); -const Readable = stream.Readable; -const Writable = stream.Writable; - -const totalChunks = 100; -const chunkSize = 99; -const expectTotalData = totalChunks * chunkSize; -let expectEndingData = expectTotalData; - -const r = new Readable({ highWaterMark: 1000 }); -let chunks = totalChunks; -r._read = function(n) { - console.log('_read called', chunks); - if (!(chunks % 2)) - setImmediate(push); - else if (!(chunks % 3)) - process.nextTick(push); - else - push(); -}; - -let totalPushed = 0; -function push() { - const chunk = chunks-- > 0 ? Buffer.alloc(chunkSize, 'x') : null; - if (chunk) { - totalPushed += chunk.length; - } - console.log('chunks', chunks); - r.push(chunk); -} - -read100(); - -// First we read 100 bytes. -function read100() { - readn(100, onData); -} - -function readn(n, then) { - console.error(`read ${n}`); - expectEndingData -= n; - (function read() { - const c = r.read(n); - console.error('c', c); - if (!c) - r.once('readable', read); - else { - assert.strictEqual(c.length, n); - assert(!r.readableFlowing); - then(); - } - })(); -} - -// Then we listen to some data events. -function onData() { - expectEndingData -= 100; - console.error('onData'); - let seen = 0; - r.on('data', function od(c) { - seen += c.length; - if (seen >= 100) { - // Seen enough - r.removeListener('data', od); - r.pause(); - if (seen > 100) { - // Oh no, seen too much! - // Put the extra back. - const diff = seen - 100; - r.unshift(c.slice(c.length - diff)); - console.error('seen too much', seen, diff); - } - - // Nothing should be lost in-between. - setImmediate(pipeLittle); - } - }); -} - -// Just pipe 200 bytes, then unshift the extra and unpipe. -function pipeLittle() { - expectEndingData -= 200; - console.error('pipe a little'); - const w = new Writable(); - let written = 0; - w.on('finish', () => { - assert.strictEqual(written, 200); - setImmediate(read1234); - }); - w._write = function(chunk, encoding, cb) { - written += chunk.length; - if (written >= 200) { - r.unpipe(w); - w.end(); - cb(); - if (written > 200) { - const diff = written - 200; - written -= diff; - r.unshift(chunk.slice(chunk.length - diff)); - } - } else { - setImmediate(cb); - } - }; - r.pipe(w); -} - -// Now read 1234 more bytes. -function read1234() { - readn(1234, resumePause); -} - -function resumePause() { - console.error('resumePause'); - // Don't read anything, just resume and re-pause a whole bunch. - r.resume(); - r.pause(); - r.resume(); - r.pause(); - r.resume(); - r.pause(); - r.resume(); - r.pause(); - r.resume(); - r.pause(); - setImmediate(pipe); -} - - -function pipe() { - console.error('pipe the rest'); - const w = new Writable(); - let written = 0; - w._write = function(chunk, encoding, cb) { - written += chunk.length; - cb(); - }; - w.on('finish', () => { - console.error('written', written, totalPushed); - assert.strictEqual(written, expectEndingData); - assert.strictEqual(totalPushed, expectTotalData); - console.log('ok'); - }); - r.pipe(w); -} diff --git a/cli/tests/node_compat/test/parallel/test-streams-highwatermark.js b/cli/tests/node_compat/test/parallel/test-streams-highwatermark.js deleted file mode 100644 index 9245f7db0..000000000 --- a/cli/tests/node_compat/test/parallel/test-streams-highwatermark.js +++ /dev/null @@ -1,94 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const assert = require('assert'); -const stream = require('stream'); -const { inspect } = require('util'); - -{ - // This test ensures that the stream implementation correctly handles values - // for highWaterMark which exceed the range of signed 32 bit integers and - // rejects invalid values. - - // This number exceeds the range of 32 bit integer arithmetic but should still - // be handled correctly. - const ovfl = Number.MAX_SAFE_INTEGER; - - const readable = stream.Readable({ highWaterMark: ovfl }); - assert.strictEqual(readable._readableState.highWaterMark, ovfl); - - const writable = stream.Writable({ highWaterMark: ovfl }); - assert.strictEqual(writable._writableState.highWaterMark, ovfl); - - for (const invalidHwm of [true, false, '5', {}, -5, NaN]) { - for (const type of [stream.Readable, stream.Writable]) { - assert.throws(() => { - type({ highWaterMark: invalidHwm }); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_VALUE', - message: "The property 'options.highWaterMark' is invalid. " + - `Received ${inspect(invalidHwm)}` - }); - } - } -} - -{ - // This test ensures that the push method's implementation - // correctly handles the edge case where the highWaterMark and - // the state.length are both zero - - const readable = stream.Readable({ highWaterMark: 0 }); - - for (let i = 0; i < 3; i++) { - const needMoreData = readable.push(); - assert.strictEqual(needMoreData, true); - } -} - -{ - // This test ensures that the read(n) method's implementation - // correctly handles the edge case where the highWaterMark, state.length - // and n are all zero - - const readable = stream.Readable({ highWaterMark: 0 }); - - readable._read = common.mustCall(); - readable.read(0); -} - -{ - // Parse size as decimal integer - ['1', '1.0', 1].forEach((size) => { - const readable = new stream.Readable({ - read: common.mustCall(), - highWaterMark: 0, - }); - readable.read(size); - - assert.strictEqual(readable._readableState.highWaterMark, Number(size)); - }); -} - -{ - // Test highwatermark limit - const hwm = 0x40000000 + 1; - const readable = stream.Readable({ - read() {}, - }); - - assert.throws(() => readable.read(hwm), common.expectsError({ - code: 'ERR_OUT_OF_RANGE', - message: 'The value of "size" is out of range.' + - ' It must be <= 1GiB. Received ' + - hwm, - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-timers-api-refs.js b/cli/tests/node_compat/test/parallel/test-timers-api-refs.js deleted file mode 100644 index 62ce55fad..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-api-refs.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const timers = require('timers'); - -// Delete global APIs to make sure they're not relied on by the internal timers -// code -delete global.setTimeout; -delete global.clearTimeout; -delete global.setInterval; -delete global.clearInterval; -delete global.setImmediate; -delete global.clearImmediate; - -const timeoutCallback = () => { timers.clearTimeout(timeout); }; -const timeout = timers.setTimeout(common.mustCall(timeoutCallback), 1); - -const intervalCallback = () => { timers.clearInterval(interval); }; -const interval = timers.setInterval(common.mustCall(intervalCallback), 1); - -const immediateCallback = () => { timers.clearImmediate(immediate); }; -const immediate = timers.setImmediate(immediateCallback); diff --git a/cli/tests/node_compat/test/parallel/test-timers-args.js b/cli/tests/node_compat/test/parallel/test-timers-args.js deleted file mode 100644 index b771bf591..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-args.js +++ /dev/null @@ -1,38 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); - -function range(n) { - return 'x'.repeat(n + 1).split('').map(function(_, i) { return i; }); -} - -function timeout(nargs) { - const args = range(nargs); - setTimeout.apply(null, [callback, 1].concat(args)); - - function callback() { - assert.deepStrictEqual([].slice.call(arguments), args); - if (nargs < 128) timeout(nargs + 1); - } -} - -function interval(nargs) { - const args = range(nargs); - const timer = setTimeout.apply(null, [callback, 1].concat(args)); - - function callback() { - clearInterval(timer); - assert.deepStrictEqual([].slice.call(arguments), args); - if (nargs < 128) interval(nargs + 1); - } -} - -timeout(0); -interval(0); diff --git a/cli/tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js b/cli/tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js deleted file mode 100644 index 7b7b59b27..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-clear-null-does-not-throw-error.js +++ /dev/null @@ -1,18 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test makes sure clearing timers with -// 'null' or no input does not throw error -clearInterval(null); -clearInterval(); -clearTimeout(null); -clearTimeout(); -clearImmediate(null); -clearImmediate(); diff --git a/cli/tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js b/cli/tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js deleted file mode 100644 index 524389c6b..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-clear-object-does-not-throw-error.js +++ /dev/null @@ -1,15 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test makes sure clearing timers with -// objects doesn't throw -clearImmediate({}); -clearTimeout({}); -clearInterval({}); diff --git a/cli/tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js b/cli/tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js deleted file mode 100644 index b6af3f943..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-clear-timeout-interval-equivalent.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -// This test makes sure that timers created with setTimeout can be disarmed by -// clearInterval and that timers created with setInterval can be disarmed by -// clearTimeout. -// -// This behavior is documented in the HTML Living Standard: -// -// * Refs: https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval - -// Disarm interval with clearTimeout. -const interval = setInterval(common.mustNotCall(), 1); -clearTimeout(interval); - -// Disarm timeout with clearInterval. -const timeout = setTimeout(common.mustNotCall(), 1); -clearInterval(timeout); diff --git a/cli/tests/node_compat/test/parallel/test-timers-clearImmediate.js b/cli/tests/node_compat/test/parallel/test-timers-clearImmediate.js deleted file mode 100644 index 129e301f2..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-clearImmediate.js +++ /dev/null @@ -1,20 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -const N = 3; - -function next() { - const fn = common.mustCall(() => clearImmediate(immediate)); - const immediate = setImmediate(fn); -} - -for (let i = 0; i < N; i++) { - next(); -} diff --git a/cli/tests/node_compat/test/parallel/test-timers-interval-throw.js b/cli/tests/node_compat/test/parallel/test-timers-interval-throw.js deleted file mode 100644 index d408fc866..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-interval-throw.js +++ /dev/null @@ -1,24 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); - -// To match browser behaviour, interval should continue -// being rescheduled even if it throws. - -let count = 2; -const interval = setInterval(() => { throw new Error('IntervalError'); }, 1); - -process.on('uncaughtException', common.mustCall((err) => { - assert.strictEqual(err.message, 'IntervalError'); - if (--count === 0) { - clearInterval(interval); - } -}, 2)); diff --git a/cli/tests/node_compat/test/parallel/test-timers-non-integer-delay.js b/cli/tests/node_compat/test/parallel/test-timers-non-integer-delay.js deleted file mode 100644 index 1d3ca55c2..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-non-integer-delay.js +++ /dev/null @@ -1,88 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -// This test makes sure that non-integer timer delays do not make the process -// hang. See https://github.com/joyent/node/issues/8065 and -// https://github.com/joyent/node/issues/8068 which have been fixed by -// https://github.com/joyent/node/pull/8073. -// -// If the process hangs, this test will make the tests suite timeout, -// otherwise it will exit very quickly (after 50 timers with a short delay -// fire). -// -// We have to set at least several timers with a non-integer delay to -// reproduce the issue. Sometimes, a timer with a non-integer delay will -// expire correctly. 50 timers has always been more than enough to reproduce -// it 100%. - -const TIMEOUT_DELAY = 1.1; -let N = 50; - -const interval = setInterval(common.mustCall(() => { - if (--N === 0) { - clearInterval(interval); - } -}, N), TIMEOUT_DELAY); - -// Test non-integer delay ordering -{ - const ordering = []; - - setTimeout(common.mustCall(() => { - ordering.push(1); - }), 1); - - setTimeout(common.mustCall(() => { - ordering.push(2); - }), 1.8); - - setTimeout(common.mustCall(() => { - ordering.push(3); - }), 1.1); - - setTimeout(common.mustCall(() => { - ordering.push(4); - }), 1); - - setTimeout(common.mustCall(() => { - const expected = [1, 2, 3, 4]; - - assert.deepStrictEqual( - ordering, - expected, - `Non-integer delay ordering should be ${expected}, but got ${ordering}` - ); - - // 2 should always be last of these delays due to ordering guarantees by - // the implementation. - }), 2); -} diff --git a/cli/tests/node_compat/test/parallel/test-timers-refresh.js b/cli/tests/node_compat/test/parallel/test-timers-refresh.js deleted file mode 100644 index 942cf5604..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-refresh.js +++ /dev/null @@ -1,109 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals - -'use strict'; - -const common = require('../common'); - -const { strictEqual, throws } = require('assert'); -const { setUnrefTimeout } = require('internal/timers'); - -// Schedule the unrefed cases first so that the later case keeps the event loop -// active. - -// Every case in this test relies on implicit sorting within either Node's or -// libuv's timers storage data structures. - -// unref()'d timer -{ - let called = false; - const timer = setTimeout(common.mustCall(() => { - called = true; - }), 1); - timer.unref(); - - // This relies on implicit timers handle sorting within libuv. - - setTimeout(common.mustCall(() => { - strictEqual(called, false, 'unref()\'d timer returned before check'); - }), 1); - - strictEqual(timer.refresh(), timer); -} - -// Should throw with non-functions -{ - [null, true, false, 0, 1, NaN, '', 'foo', {}, Symbol()].forEach((cb) => { - throws( - () => setUnrefTimeout(cb), - { - code: 'ERR_INVALID_ARG_TYPE', - } - ); - }); -} - -// unref pooled timer -{ - let called = false; - const timer = setUnrefTimeout(common.mustCall(() => { - called = true; - }), 1); - - setUnrefTimeout(common.mustCall(() => { - strictEqual(called, false, 'unref pooled timer returned before check'); - }), 1); - - strictEqual(timer.refresh(), timer); -} - -// regular timer -{ - let called = false; - const timer = setTimeout(common.mustCall(() => { - called = true; - }), 1); - - setTimeout(common.mustCall(() => { - strictEqual(called, false, 'pooled timer returned before check'); - }), 1); - - strictEqual(timer.refresh(), timer); -} - -// regular timer -{ - let called = false; - const timer = setTimeout(common.mustCall(() => { - if (!called) { - called = true; - process.nextTick(common.mustCall(() => { - timer.refresh(); - strictEqual(timer.hasRef(), true); - })); - } - }, 2), 1); -} - -// interval -{ - let called = 0; - const timer = setInterval(common.mustCall(() => { - called += 1; - if (called === 2) { - clearInterval(timer); - } - }, 2), 1); - - setTimeout(common.mustCall(() => { - strictEqual(called, 0, 'pooled timer returned before check'); - }), 1); - - strictEqual(timer.refresh(), timer); -} diff --git a/cli/tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js b/cli/tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js deleted file mode 100644 index fa6348d75..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-same-timeout-wrong-list-deleted.js +++ /dev/null @@ -1,41 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// This is a regression test for https://github.com/nodejs/node/issues/7722. -// -// When nested timers have the same timeout, calling clearTimeout on the -// older timer after it has fired causes the list the newer timer is in -// to be deleted. Since the newer timer was not cleared, it still blocks -// the event loop completing for the duration of its timeout, however, since -// no reference exists to it in its list, it cannot be canceled and its -// callback is not called when the timeout elapses. - -const common = require('../common'); - -const TIMEOUT = common.platformTimeout(100); - -const handle1 = setTimeout(common.mustCall(function() { - // Cause the old TIMEOUT list to be deleted - clearTimeout(handle1); - - // Cause a new list with the same key (TIMEOUT) to be created for this timer - const handle2 = setTimeout(common.mustNotCall(), TIMEOUT); - - setTimeout(common.mustCall(function() { - // Attempt to cancel the second timer. Fix for this bug will keep the - // newer timer from being dereferenced by keeping its list from being - // erroneously deleted. If we are able to cancel the timer successfully, - // the bug is fixed. - clearTimeout(handle2); - }), 1); - - // When this callback completes, `listOnTimeout` should now look at the - // correct list and refrain from removing the new TIMEOUT list which - // contains the reference to the newer timer. -}), TIMEOUT); diff --git a/cli/tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js b/cli/tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js deleted file mode 100644 index d93ef57fe..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-timeout-with-non-integer.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); - -/** - * This test is for https://github.com/nodejs/node/issues/24203 - */ -let count = 50; -const time = 1.00000000000001; -const exec = common.mustCall(() => { - if (--count === 0) { - return; - } - setTimeout(exec, time); -}, count); -exec(); diff --git a/cli/tests/node_compat/test/parallel/test-timers-uncaught-exception.js b/cli/tests/node_compat/test/parallel/test-timers-uncaught-exception.js deleted file mode 100644 index e76c11afc..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-uncaught-exception.js +++ /dev/null @@ -1,46 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 errorMsg = 'BAM!'; - -// The first timer throws... -setTimeout(common.mustCall(function() { - throw new Error(errorMsg); -}), 1); - -// ...but the second one should still run -setTimeout(common.mustCall(), 1); - -function uncaughtException(err) { - assert.strictEqual(err.message, errorMsg); -} - -process.on('uncaughtException', common.mustCall(uncaughtException)); diff --git a/cli/tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js b/cli/tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js deleted file mode 100644 index 03a0861e2..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-unref-throw-then-ref.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -process.once('uncaughtException', common.mustCall((err) => { - common.expectsError({ - message: 'Timeout Error' - })(err); -})); - -let called = false; -const t = setTimeout(() => { - assert(!called); - called = true; - t.ref(); - throw new Error('Timeout Error'); -}, 1).unref(); - -setTimeout(common.mustCall(), 1); diff --git a/cli/tests/node_compat/test/parallel/test-timers-user-call.js b/cli/tests/node_compat/test/parallel/test-timers-user-call.js deleted file mode 100644 index 969051f80..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-user-call.js +++ /dev/null @@ -1,47 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Make sure `setTimeout()` and friends don't throw if the user-supplied -// function has .call() and .apply() monkey-patched to undesirable values. - -// Refs: https://github.com/nodejs/node/issues/12956 - -'use strict'; - -const common = require('../common'); - -{ - const fn = common.mustCall(10); - fn.call = 'not a function'; - fn.apply = 'also not a function'; - setTimeout(fn, 1); - setTimeout(fn, 1, 'oneArg'); - setTimeout(fn, 1, 'two', 'args'); - setTimeout(fn, 1, 'three', '(3)', 'args'); - setTimeout(fn, 1, 'more', 'than', 'three', 'args'); - - setImmediate(fn, 1); - setImmediate(fn, 1, 'oneArg'); - setImmediate(fn, 1, 'two', 'args'); - setImmediate(fn, 1, 'three', '(3)', 'args'); - setImmediate(fn, 1, 'more', 'than', 'three', 'args'); -} - -{ - const testInterval = (...args) => { - const fn = common.mustCall(() => { clearInterval(interval); }); - fn.call = 'not a function'; - fn.apply = 'also not a function'; - const interval = setInterval(fn, 1, ...args); - }; - - testInterval(); - testInterval('oneArg'); - testInterval('two', 'args'); - testInterval('three', '(3)', 'args'); - testInterval('more', 'than', 'three', 'args'); -} diff --git a/cli/tests/node_compat/test/parallel/test-timers-zero-timeout.js b/cli/tests/node_compat/test/parallel/test-timers-zero-timeout.js deleted file mode 100644 index ef32f7381..000000000 --- a/cli/tests/node_compat/test/parallel/test-timers-zero-timeout.js +++ /dev/null @@ -1,56 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'); - -// https://github.com/joyent/node/issues/2079 - zero timeout drops extra args -{ - setTimeout(common.mustCall(f), 0, 'foo', 'bar', 'baz'); - setTimeout(() => {}, 0); - - function f(a, b, c) { - assert.strictEqual(a, 'foo'); - assert.strictEqual(b, 'bar'); - assert.strictEqual(c, 'baz'); - } -} - -{ - let ncalled = 3; - - const f = common.mustCall((a, b, c) => { - assert.strictEqual(a, 'foo'); - assert.strictEqual(b, 'bar'); - assert.strictEqual(c, 'baz'); - if (--ncalled === 0) clearTimeout(iv); - }, ncalled); - - const iv = setInterval(f, 0, 'foo', 'bar', 'baz'); -} diff --git a/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js b/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js deleted file mode 100644 index ee38cbd2c..000000000 --- a/cli/tests/node_compat/test/parallel/test-tty-stdin-end.js +++ /dev/null @@ -1,14 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test ensures that Node.js doesn't crash on `process.stdin.emit("end")`. -// https://github.com/nodejs/node/issues/1068 - -process.stdin.emit('end'); diff --git a/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js b/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js deleted file mode 100644 index 95b9bffe6..000000000 --- a/cli/tests/node_compat/test/parallel/test-ttywrap-invalid-fd.js +++ /dev/null @@ -1,74 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// Flags: --expose-internals -'use strict'; - -// const common = require('../common'); -const tty = require('tty'); -// const { internalBinding } = require('internal/test/binding'); -// const { -// UV_EBADF, -// UV_EINVAL -// } = internalBinding('uv'); -const assert = require('assert'); - -assert.throws( - () => new tty.WriteStream(-1), - { - code: 'ERR_INVALID_FD', - name: 'RangeError', - message: '"fd" must be a positive integer: -1' - } -); - -// { -// const info = { -// code: common.isWindows ? 'EBADF' : 'EINVAL', -// message: common.isWindows ? 'bad file descriptor' : 'invalid argument', -// errno: common.isWindows ? UV_EBADF : UV_EINVAL, -// syscall: 'uv_tty_init' -// }; - -// const suffix = common.isWindows ? -// 'EBADF (bad file descriptor)' : 'EINVAL (invalid argument)'; -// const message = `TTY initialization failed: uv_tty_init returned ${suffix}`; - -// assert.throws( -// () => { -// common.runWithInvalidFD((fd) => { -// new tty.WriteStream(fd); -// }); -// }, { -// code: 'ERR_TTY_INIT_FAILED', -// name: 'SystemError', -// message, -// info -// } -// ); - -// assert.throws( -// () => { -// common.runWithInvalidFD((fd) => { -// new tty.ReadStream(fd); -// }); -// }, { -// code: 'ERR_TTY_INIT_FAILED', -// name: 'SystemError', -// message, -// info -// }); -// } - -assert.throws( - () => new tty.ReadStream(-1), - { - code: 'ERR_INVALID_FD', - name: 'RangeError', - message: '"fd" must be a positive integer: -1' - } -); diff --git a/cli/tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js b/cli/tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js deleted file mode 100644 index 9aeb23a54..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-domain-ascii-unicode.js +++ /dev/null @@ -1,38 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -if (!common.hasIntl) - common.skip('missing Intl'); - -const strictEqual = require('assert').strictEqual; -const url = require('url'); - -const domainToASCII = url.domainToASCII; -const domainToUnicode = url.domainToUnicode; - -const domainWithASCII = [ - ['ıíd', 'xn--d-iga7r'], - ['يٴ', 'xn--mhb8f'], - ['www.ϧƽəʐ.com', 'www.xn--cja62apfr6c.com'], - ['новини.com', 'xn--b1amarcd.com'], - ['名がドメイン.com', 'xn--v8jxj3d1dzdz08w.com'], - ['افغانستا.icom.museum', 'xn--mgbaal8b0b9b2b.icom.museum'], - ['الجزائر.icom.fake', 'xn--lgbbat1ad8j.icom.fake'], - ['भारत.org', 'xn--h2brj9c.org'], -]; - -domainWithASCII.forEach((pair) => { - const domain = pair[0]; - const ascii = pair[1]; - const domainConvertedToASCII = domainToASCII(domain); - strictEqual(domainConvertedToASCII, ascii); - const asciiConvertedToUnicode = domainToUnicode(ascii); - strictEqual(asciiConvertedToUnicode, domain); -}); diff --git a/cli/tests/node_compat/test/parallel/test-url-fileurltopath.js b/cli/tests/node_compat/test/parallel/test-url-fileurltopath.js deleted file mode 100644 index 72ba73166..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-fileurltopath.js +++ /dev/null @@ -1,161 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const { isWindows } = require('../common'); -const assert = require('assert'); -const url = require('url'); - -function testInvalidArgs(...args) { - for (const arg of args) { - assert.throws(() => url.fileURLToPath(arg), { - code: 'ERR_INVALID_ARG_TYPE' - }); - } -} - -// Input must be string or URL -testInvalidArgs(null, undefined, 1, {}, true); - -// Input must be a file URL -assert.throws(() => url.fileURLToPath('https://a/b/c'), { - code: 'ERR_INVALID_URL_SCHEME' -}); - -{ - const withHost = new URL('file://host/a'); - - if (isWindows) { - assert.strictEqual(url.fileURLToPath(withHost), '\\\\host\\a'); - } else { - assert.throws(() => url.fileURLToPath(withHost), { - code: 'ERR_INVALID_FILE_URL_HOST' - }); - } -} - -{ - if (isWindows) { - assert.throws(() => url.fileURLToPath('file:///C:/a%2F/'), { - code: 'ERR_INVALID_FILE_URL_PATH' - }); - assert.throws(() => url.fileURLToPath('file:///C:/a%5C/'), { - code: 'ERR_INVALID_FILE_URL_PATH' - }); - assert.throws(() => url.fileURLToPath('file:///?:/'), { - code: 'ERR_INVALID_FILE_URL_PATH' - }); - } else { - assert.throws(() => url.fileURLToPath('file:///a%2F/'), { - code: 'ERR_INVALID_FILE_URL_PATH' - }); - } -} - -{ - let testCases; - if (isWindows) { - testCases = [ - // Lowercase ascii alpha - { path: 'C:\\foo', fileURL: 'file:///C:/foo' }, - // Uppercase ascii alpha - { path: 'C:\\FOO', fileURL: 'file:///C:/FOO' }, - // dir - { path: 'C:\\dir\\foo', fileURL: 'file:///C:/dir/foo' }, - // trailing separator - { path: 'C:\\dir\\', fileURL: 'file:///C:/dir/' }, - // dot - { path: 'C:\\foo.mjs', fileURL: 'file:///C:/foo.mjs' }, - // space - { path: 'C:\\foo bar', fileURL: 'file:///C:/foo%20bar' }, - // question mark - { path: 'C:\\foo?bar', fileURL: 'file:///C:/foo%3Fbar' }, - // number sign - { path: 'C:\\foo#bar', fileURL: 'file:///C:/foo%23bar' }, - // ampersand - { path: 'C:\\foo&bar', fileURL: 'file:///C:/foo&bar' }, - // equals - { path: 'C:\\foo=bar', fileURL: 'file:///C:/foo=bar' }, - // colon - { path: 'C:\\foo:bar', fileURL: 'file:///C:/foo:bar' }, - // semicolon - { path: 'C:\\foo;bar', fileURL: 'file:///C:/foo;bar' }, - // percent - { path: 'C:\\foo%bar', fileURL: 'file:///C:/foo%25bar' }, - // backslash - { path: 'C:\\foo\\bar', fileURL: 'file:///C:/foo/bar' }, - // backspace - { path: 'C:\\foo\bbar', fileURL: 'file:///C:/foo%08bar' }, - // tab - { path: 'C:\\foo\tbar', fileURL: 'file:///C:/foo%09bar' }, - // newline - { path: 'C:\\foo\nbar', fileURL: 'file:///C:/foo%0Abar' }, - // carriage return - { path: 'C:\\foo\rbar', fileURL: 'file:///C:/foo%0Dbar' }, - // latin1 - { path: 'C:\\fóóbàr', fileURL: 'file:///C:/f%C3%B3%C3%B3b%C3%A0r' }, - // Euro sign (BMP code point) - { path: 'C:\\€', fileURL: 'file:///C:/%E2%82%AC' }, - // Rocket emoji (non-BMP code point) - { path: 'C:\\🚀', fileURL: 'file:///C:/%F0%9F%9A%80' }, - // UNC path (see https://docs.microsoft.com/en-us/archive/blogs/ie/file-uris-in-windows) - { path: '\\\\nas\\My Docs\\File.doc', fileURL: 'file://nas/My%20Docs/File.doc' }, - ]; - } else { - testCases = [ - // Lowercase ascii alpha - { path: '/foo', fileURL: 'file:///foo' }, - // Uppercase ascii alpha - { path: '/FOO', fileURL: 'file:///FOO' }, - // dir - { path: '/dir/foo', fileURL: 'file:///dir/foo' }, - // trailing separator - { path: '/dir/', fileURL: 'file:///dir/' }, - // dot - { path: '/foo.mjs', fileURL: 'file:///foo.mjs' }, - // space - { path: '/foo bar', fileURL: 'file:///foo%20bar' }, - // question mark - { path: '/foo?bar', fileURL: 'file:///foo%3Fbar' }, - // number sign - { path: '/foo#bar', fileURL: 'file:///foo%23bar' }, - // ampersand - { path: '/foo&bar', fileURL: 'file:///foo&bar' }, - // equals - { path: '/foo=bar', fileURL: 'file:///foo=bar' }, - // colon - { path: '/foo:bar', fileURL: 'file:///foo:bar' }, - // semicolon - { path: '/foo;bar', fileURL: 'file:///foo;bar' }, - // percent - { path: '/foo%bar', fileURL: 'file:///foo%25bar' }, - // backslash - { path: '/foo\\bar', fileURL: 'file:///foo%5Cbar' }, - // backspace - { path: '/foo\bbar', fileURL: 'file:///foo%08bar' }, - // tab - { path: '/foo\tbar', fileURL: 'file:///foo%09bar' }, - // newline - { path: '/foo\nbar', fileURL: 'file:///foo%0Abar' }, - // carriage return - { path: '/foo\rbar', fileURL: 'file:///foo%0Dbar' }, - // latin1 - { path: '/fóóbàr', fileURL: 'file:///f%C3%B3%C3%B3b%C3%A0r' }, - // Euro sign (BMP code point) - { path: '/€', fileURL: 'file:///%E2%82%AC' }, - // Rocket emoji (non-BMP code point) - { path: '/🚀', fileURL: 'file:///%F0%9F%9A%80' }, - ]; - } - - for (const { path, fileURL } of testCases) { - const fromString = url.fileURLToPath(fileURL); - assert.strictEqual(fromString, path); - const fromURL = url.fileURLToPath(new URL(fileURL)); - assert.strictEqual(fromURL, path); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-url-format-invalid-input.js b/cli/tests/node_compat/test/parallel/test-url-format-invalid-input.js deleted file mode 100644 index d411b8d32..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-format-invalid-input.js +++ /dev/null @@ -1,34 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const url = require('url'); - -const throwsObjsAndReportTypes = [ - undefined, - null, - true, - false, - 0, - function() {}, - Symbol('foo'), -]; - -for (const urlObject of throwsObjsAndReportTypes) { - assert.throws(() => { - url.format(urlObject); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "urlObject" argument must be one of type object or string.' + - common.invalidArgTypeHelper(urlObject) - }); -} -assert.strictEqual(url.format(''), ''); -assert.strictEqual(url.format({}), ''); diff --git a/cli/tests/node_compat/test/parallel/test-url-format-whatwg.js b/cli/tests/node_compat/test/parallel/test-url-format-whatwg.js deleted file mode 100644 index 1e9b36dcb..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-format-whatwg.js +++ /dev/null @@ -1,149 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -if (!common.hasIntl) - common.skip('missing Intl'); - -const assert = require('assert'); -const url = require('url'); - -const myURL = new URL('http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c'); - -assert.strictEqual( - url.format(myURL), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, {}), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -{ - [true, 1, 'test', Infinity].forEach((value) => { - assert.throws( - () => url.format(myURL, value), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "options" argument must be of type object.' + - common.invalidArgTypeHelper(value) - } - ); - }); -} - -// Any falsy value other than undefined will be treated as false. -// Any truthy value will be treated as true. - -assert.strictEqual( - url.format(myURL, { auth: false }), - 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { auth: '' }), - 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { auth: 0 }), - 'http://xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { auth: 1 }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { auth: {} }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { fragment: false }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b' -); - -assert.strictEqual( - url.format(myURL, { fragment: '' }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b' -); - -assert.strictEqual( - url.format(myURL, { fragment: 0 }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b' -); - -assert.strictEqual( - url.format(myURL, { fragment: 1 }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { fragment: {} }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { search: false }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a#c' -); - -assert.strictEqual( - url.format(myURL, { search: '' }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a#c' -); - -assert.strictEqual( - url.format(myURL, { search: 0 }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a#c' -); - -assert.strictEqual( - url.format(myURL, { search: 1 }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { search: {} }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { unicode: true }), - 'http://user:pass@理容ナカムラ.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { unicode: 1 }), - 'http://user:pass@理容ナカムラ.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { unicode: {} }), - 'http://user:pass@理容ナカムラ.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { unicode: false }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(myURL, { unicode: 0 }), - 'http://user:pass@xn--lck1c3crb1723bpq4a.com/a?a=b#c' -); - -assert.strictEqual( - url.format(new URL('http://user:pass@xn--0zwm56d.com:8080/path'), { unicode: true }), - 'http://user:pass@测试.com:8080/path' -); diff --git a/cli/tests/node_compat/test/parallel/test-url-format.js b/cli/tests/node_compat/test/parallel/test-url-format.js deleted file mode 100644 index 1208509c7..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-format.js +++ /dev/null @@ -1,284 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const url = require('url'); - -if (!common.hasIntl) - common.skip('missing Intl'); - -// Formatting tests to verify that it'll format slightly wonky content to a -// valid URL. -const formatTests = { - 'http://example.com?': { - href: 'http://example.com/?', - protocol: 'http:', - slashes: true, - host: 'example.com', - hostname: 'example.com', - search: '?', - query: {}, - pathname: '/' - }, - 'http://example.com?foo=bar#frag': { - href: 'http://example.com/?foo=bar#frag', - protocol: 'http:', - host: 'example.com', - hostname: 'example.com', - hash: '#frag', - search: '?foo=bar', - query: 'foo=bar', - pathname: '/' - }, - 'http://example.com?foo=@bar#frag': { - href: 'http://example.com/?foo=@bar#frag', - protocol: 'http:', - host: 'example.com', - hostname: 'example.com', - hash: '#frag', - search: '?foo=@bar', - query: 'foo=@bar', - pathname: '/' - }, - 'http://example.com?foo=/bar/#frag': { - href: 'http://example.com/?foo=/bar/#frag', - protocol: 'http:', - host: 'example.com', - hostname: 'example.com', - hash: '#frag', - search: '?foo=/bar/', - query: 'foo=/bar/', - pathname: '/' - }, - 'http://example.com?foo=?bar/#frag': { - href: 'http://example.com/?foo=?bar/#frag', - protocol: 'http:', - host: 'example.com', - hostname: 'example.com', - hash: '#frag', - search: '?foo=?bar/', - query: 'foo=?bar/', - pathname: '/' - }, - 'http://example.com#frag=?bar/#frag': { - href: 'http://example.com/#frag=?bar/#frag', - protocol: 'http:', - host: 'example.com', - hostname: 'example.com', - hash: '#frag=?bar/#frag', - pathname: '/' - }, - 'http://google.com" onload="alert(42)/': { - href: 'http://google.com/%22%20onload=%22alert(42)/', - protocol: 'http:', - host: 'google.com', - pathname: '/%22%20onload=%22alert(42)/' - }, - 'http://a.com/a/b/c?s#h': { - href: 'http://a.com/a/b/c?s#h', - protocol: 'http', - host: 'a.com', - pathname: 'a/b/c', - hash: 'h', - search: 's' - }, - 'xmpp:isaacschlueter@jabber.org': { - href: 'xmpp:isaacschlueter@jabber.org', - protocol: 'xmpp:', - host: 'jabber.org', - auth: 'isaacschlueter', - hostname: 'jabber.org' - }, - 'http://atpass:foo%40bar@127.0.0.1/': { - href: 'http://atpass:foo%40bar@127.0.0.1/', - auth: 'atpass:foo@bar', - hostname: '127.0.0.1', - protocol: 'http:', - pathname: '/' - }, - 'http://atslash%2F%40:%2F%40@foo/': { - href: 'http://atslash%2F%40:%2F%40@foo/', - auth: 'atslash/@:/@', - hostname: 'foo', - protocol: 'http:', - pathname: '/' - }, - 'svn+ssh://foo/bar': { - href: 'svn+ssh://foo/bar', - hostname: 'foo', - protocol: 'svn+ssh:', - pathname: '/bar', - slashes: true - }, - 'dash-test://foo/bar': { - href: 'dash-test://foo/bar', - hostname: 'foo', - protocol: 'dash-test:', - pathname: '/bar', - slashes: true - }, - 'dash-test:foo/bar': { - href: 'dash-test:foo/bar', - hostname: 'foo', - protocol: 'dash-test:', - pathname: '/bar' - }, - 'dot.test://foo/bar': { - href: 'dot.test://foo/bar', - hostname: 'foo', - protocol: 'dot.test:', - pathname: '/bar', - slashes: true - }, - 'dot.test:foo/bar': { - href: 'dot.test:foo/bar', - hostname: 'foo', - protocol: 'dot.test:', - pathname: '/bar' - }, - // IPv6 support - 'coap:u:p@[::1]:61616/.well-known/r?n=Temperature': { - href: 'coap:u:p@[::1]:61616/.well-known/r?n=Temperature', - protocol: 'coap:', - auth: 'u:p', - hostname: '::1', - port: '61616', - pathname: '/.well-known/r', - search: 'n=Temperature' - }, - 'coap:[fedc:ba98:7654:3210:fedc:ba98:7654:3210]:61616/s/stopButton': { - href: 'coap:[fedc:ba98:7654:3210:fedc:ba98:7654:3210]:61616/s/stopButton', - protocol: 'coap', - host: '[fedc:ba98:7654:3210:fedc:ba98:7654:3210]:61616', - pathname: '/s/stopButton' - }, - 'http://[::]/': { - href: 'http://[::]/', - protocol: 'http:', - hostname: '[::]', - pathname: '/' - }, - - // Encode context-specific delimiters in path and query, but do not touch - // other non-delimiter chars like `%`. - // <https://github.com/nodejs/node-v0.x-archive/issues/4082> - - // `#`,`?` in path - '/path/to/%%23%3F+=&.txt?foo=theA1#bar': { - href: '/path/to/%%23%3F+=&.txt?foo=theA1#bar', - pathname: '/path/to/%#?+=&.txt', - query: { - foo: 'theA1' - }, - hash: '#bar' - }, - - // `#`,`?` in path + `#` in query - '/path/to/%%23%3F+=&.txt?foo=the%231#bar': { - href: '/path/to/%%23%3F+=&.txt?foo=the%231#bar', - pathname: '/path/to/%#?+=&.txt', - query: { - foo: 'the#1' - }, - hash: '#bar' - }, - - // `#` in path end + `#` in query - '/path/to/%%23?foo=the%231#bar': { - href: '/path/to/%%23?foo=the%231#bar', - pathname: '/path/to/%#', - query: { - foo: 'the#1' - }, - hash: '#bar' - }, - - // `?` and `#` in path and search - 'http://ex.com/foo%3F100%m%23r?abc=the%231?&foo=bar#frag': { - href: 'http://ex.com/foo%3F100%m%23r?abc=the%231?&foo=bar#frag', - protocol: 'http:', - hostname: 'ex.com', - hash: '#frag', - search: '?abc=the#1?&foo=bar', - pathname: '/foo?100%m#r', - }, - - // `?` and `#` in search only - 'http://ex.com/fooA100%mBr?abc=the%231?&foo=bar#frag': { - href: 'http://ex.com/fooA100%mBr?abc=the%231?&foo=bar#frag', - protocol: 'http:', - hostname: 'ex.com', - hash: '#frag', - search: '?abc=the#1?&foo=bar', - pathname: '/fooA100%mBr', - }, - - // Multiple `#` in search - 'http://example.com/?foo=bar%231%232%233&abc=%234%23%235#frag': { - href: 'http://example.com/?foo=bar%231%232%233&abc=%234%23%235#frag', - protocol: 'http:', - slashes: true, - host: 'example.com', - hostname: 'example.com', - hash: '#frag', - search: '?foo=bar#1#2#3&abc=#4##5', - query: {}, - pathname: '/' - }, - - // More than 255 characters in hostname which exceeds the limit - [`http://${'a'.repeat(255)}.com/node`]: { - href: 'http:///node', - protocol: 'http:', - slashes: true, - host: '', - hostname: '', - pathname: '/node', - path: '/node' - }, - - // Greater than or equal to 63 characters after `.` in hostname - [`http://www.${'z'.repeat(63)}example.com/node`]: { - href: `http://www.${'z'.repeat(63)}example.com/node`, - protocol: 'http:', - slashes: true, - host: `www.${'z'.repeat(63)}example.com`, - hostname: `www.${'z'.repeat(63)}example.com`, - pathname: '/node', - path: '/node' - }, - - // https://github.com/nodejs/node/issues/3361 - 'file:///home/user': { - href: 'file:///home/user', - protocol: 'file', - pathname: '/home/user', - path: '/home/user' - }, - - // surrogate in auth - 'http://%F0%9F%98%80@www.example.com/': { - href: 'http://%F0%9F%98%80@www.example.com/', - protocol: 'http:', - auth: '\uD83D\uDE00', - hostname: 'www.example.com', - pathname: '/' - } -}; -for (const u in formatTests) { - const expect = formatTests[u].href; - delete formatTests[u].href; - const actual = url.format(u); - const actualObj = url.format(formatTests[u]); - assert.strictEqual(actual, expect, - `wonky format(${u}) == ${expect}\nactual:${actual}`); - assert.strictEqual(actualObj, expect, - `wonky format(${JSON.stringify(formatTests[u])}) == ${ - expect}\nactual: ${actualObj}`); -} diff --git a/cli/tests/node_compat/test/parallel/test-url-parse-invalid-input.js b/cli/tests/node_compat/test/parallel/test-url-parse-invalid-input.js deleted file mode 100644 index 345e8d338..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-parse-invalid-input.js +++ /dev/null @@ -1,83 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const url = require('url'); - -// https://github.com/joyent/node/issues/568 -[ - [undefined, 'undefined'], - [null, 'object'], - [true, 'boolean'], - [false, 'boolean'], - [0.0, 'number'], - [0, 'number'], - [[], 'object'], - [{}, 'object'], - [() => {}, 'function'], - [Symbol('foo'), 'symbol'], -].forEach(([val, type]) => { - assert.throws(() => { - url.parse(val); - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "url" argument must be of type string.' + - common.invalidArgTypeHelper(val) - }); -}); - -assert.throws(() => { url.parse('http://%E0%A4%A@fail'); }, - (e) => { - // The error should be a URIError. - if (!(e instanceof URIError)) - return false; - - // The error should be from the JS engine and not from Node.js. - // JS engine errors do not have the `code` property. - return e.code === undefined; - }); - -assert.throws(() => { url.parse('http://[127.0.0.1\x00c8763]:8000/'); }, - { code: 'ERR_INVALID_URL', input: 'http://[127.0.0.1\x00c8763]:8000/' } -); - -if (common.hasIntl) { - // An array of Unicode code points whose Unicode NFKD contains a "bad - // character". - const badIDNA = (() => { - const BAD_CHARS = '#%/:?@[\\]^|'; - const out = []; - for (let i = 0x80; i < 0x110000; i++) { - const cp = String.fromCodePoint(i); - for (const badChar of BAD_CHARS) { - if (cp.normalize('NFKD').includes(badChar)) { - out.push(cp); - } - } - } - return out; - })(); - - // The generation logic above should at a minimum produce these two - // characters. - assert(badIDNA.includes('℀')); - assert(badIDNA.includes('@')); - - for (const badCodePoint of badIDNA) { - const badURL = `http://fail${badCodePoint}fail.com/`; - assert.throws(() => { url.parse(badURL); }, - (e) => e.code === 'ERR_INVALID_URL', - `parsing ${badURL}`); - } - - assert.throws(() => { url.parse('http://\u00AD/bad.com/'); }, - (e) => e.code === 'ERR_INVALID_URL', - 'parsing http://\u00AD/bad.com/'); -} diff --git a/cli/tests/node_compat/test/parallel/test-url-parse-query.js b/cli/tests/node_compat/test/parallel/test-url-parse-query.js deleted file mode 100644 index f6ccb1f46..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-parse-query.js +++ /dev/null @@ -1,97 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const url = require('url'); - -function createWithNoPrototype(properties = []) { - const noProto = Object.create(null); - properties.forEach((property) => { - noProto[property.key] = property.value; - }); - return noProto; -} - -function check(actual, expected) { - assert.notStrictEqual(Object.getPrototypeOf(actual), Object.prototype); - assert.deepStrictEqual(Object.keys(actual).sort(), - Object.keys(expected).sort()); - Object.keys(expected).forEach(function(key) { - assert.deepStrictEqual(actual[key], expected[key]); - }); -} - -const parseTestsWithQueryString = { - '/foo/bar?baz=quux#frag': { - href: '/foo/bar?baz=quux#frag', - hash: '#frag', - search: '?baz=quux', - query: createWithNoPrototype([{ key: 'baz', value: 'quux' }]), - pathname: '/foo/bar', - path: '/foo/bar?baz=quux' - }, - 'http://example.com': { - href: 'http://example.com/', - protocol: 'http:', - slashes: true, - host: 'example.com', - hostname: 'example.com', - query: createWithNoPrototype(), - search: null, - pathname: '/', - path: '/' - }, - '/example': { - protocol: null, - slashes: null, - auth: undefined, - host: null, - port: null, - hostname: null, - hash: null, - search: null, - query: createWithNoPrototype(), - pathname: '/example', - path: '/example', - href: '/example' - }, - '/example?query=value': { - protocol: null, - slashes: null, - auth: undefined, - host: null, - port: null, - hostname: null, - hash: null, - search: '?query=value', - query: createWithNoPrototype([{ key: 'query', value: 'value' }]), - pathname: '/example', - path: '/example?query=value', - href: '/example?query=value' - } -}; -for (const u in parseTestsWithQueryString) { - const actual = url.parse(u, true); - const expected = Object.assign(new url.Url(), parseTestsWithQueryString[u]); - for (const i in actual) { - if (actual[i] === null && expected[i] === undefined) { - expected[i] = null; - } - } - - const properties = Object.keys(actual).sort(); - assert.deepStrictEqual(properties, Object.keys(expected).sort()); - properties.forEach((property) => { - if (property === 'query') { - check(actual[property], expected[property]); - } else { - assert.deepStrictEqual(actual[property], expected[property]); - } - }); -} diff --git a/cli/tests/node_compat/test/parallel/test-url-pathtofileurl.js b/cli/tests/node_compat/test/parallel/test-url-pathtofileurl.js deleted file mode 100644 index bafd870aa..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-pathtofileurl.js +++ /dev/null @@ -1,153 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const { isWindows } = require('../common'); -const assert = require('assert'); -const url = require('url'); - -{ - const fileURL = url.pathToFileURL('test/').href; - assert.ok(fileURL.startsWith('file:///')); - assert.ok(fileURL.endsWith('/')); -} - -{ - const fileURL = url.pathToFileURL('test\\').href; - assert.ok(fileURL.startsWith('file:///')); - if (isWindows) - assert.ok(fileURL.endsWith('/')); - else - assert.ok(fileURL.endsWith('%5C')); -} - -{ - const fileURL = url.pathToFileURL('test/%').href; - assert.ok(fileURL.includes('%25')); -} - -{ - if (isWindows) { - // UNC path: \\server\share\resource - - // Missing server: - assert.throws(() => url.pathToFileURL('\\\\\\no-server'), { - code: 'ERR_INVALID_ARG_VALUE' - }); - - // Missing share or resource: - assert.throws(() => url.pathToFileURL('\\\\host'), { - code: 'ERR_INVALID_ARG_VALUE' - }); - } else { - // UNC paths on posix are considered a single path that has backslashes: - const fileURL = url.pathToFileURL('\\\\nas\\share\\path.txt').href; - assert.match(fileURL, /file:\/\/.+%5C%5Cnas%5Cshare%5Cpath\.txt$/); - } -} - -{ - let testCases; - if (isWindows) { - testCases = [ - // Lowercase ascii alpha - { path: 'C:\\foo', expected: 'file:///C:/foo' }, - // Uppercase ascii alpha - { path: 'C:\\FOO', expected: 'file:///C:/FOO' }, - // dir - { path: 'C:\\dir\\foo', expected: 'file:///C:/dir/foo' }, - // trailing separator - { path: 'C:\\dir\\', expected: 'file:///C:/dir/' }, - // dot - { path: 'C:\\foo.mjs', expected: 'file:///C:/foo.mjs' }, - // space - { path: 'C:\\foo bar', expected: 'file:///C:/foo%20bar' }, - // question mark - { path: 'C:\\foo?bar', expected: 'file:///C:/foo%3Fbar' }, - // number sign - { path: 'C:\\foo#bar', expected: 'file:///C:/foo%23bar' }, - // ampersand - { path: 'C:\\foo&bar', expected: 'file:///C:/foo&bar' }, - // equals - { path: 'C:\\foo=bar', expected: 'file:///C:/foo=bar' }, - // colon - { path: 'C:\\foo:bar', expected: 'file:///C:/foo:bar' }, - // semicolon - { path: 'C:\\foo;bar', expected: 'file:///C:/foo;bar' }, - // percent - { path: 'C:\\foo%bar', expected: 'file:///C:/foo%25bar' }, - // backslash - { path: 'C:\\foo\\bar', expected: 'file:///C:/foo/bar' }, - // backspace - { path: 'C:\\foo\bbar', expected: 'file:///C:/foo%08bar' }, - // tab - { path: 'C:\\foo\tbar', expected: 'file:///C:/foo%09bar' }, - // newline - { path: 'C:\\foo\nbar', expected: 'file:///C:/foo%0Abar' }, - // carriage return - { path: 'C:\\foo\rbar', expected: 'file:///C:/foo%0Dbar' }, - // latin1 - { path: 'C:\\fóóbàr', expected: 'file:///C:/f%C3%B3%C3%B3b%C3%A0r' }, - // Euro sign (BMP code point) - { path: 'C:\\€', expected: 'file:///C:/%E2%82%AC' }, - // Rocket emoji (non-BMP code point) - { path: 'C:\\🚀', expected: 'file:///C:/%F0%9F%9A%80' }, - // UNC path (see https://docs.microsoft.com/en-us/archive/blogs/ie/file-uris-in-windows) - { path: '\\\\nas\\My Docs\\File.doc', expected: 'file://nas/My%20Docs/File.doc' }, - ]; - } else { - testCases = [ - // Lowercase ascii alpha - { path: '/foo', expected: 'file:///foo' }, - // Uppercase ascii alpha - { path: '/FOO', expected: 'file:///FOO' }, - // dir - { path: '/dir/foo', expected: 'file:///dir/foo' }, - // trailing separator - { path: '/dir/', expected: 'file:///dir/' }, - // dot - { path: '/foo.mjs', expected: 'file:///foo.mjs' }, - // space - { path: '/foo bar', expected: 'file:///foo%20bar' }, - // question mark - { path: '/foo?bar', expected: 'file:///foo%3Fbar' }, - // number sign - { path: '/foo#bar', expected: 'file:///foo%23bar' }, - // ampersand - { path: '/foo&bar', expected: 'file:///foo&bar' }, - // equals - { path: '/foo=bar', expected: 'file:///foo=bar' }, - // colon - { path: '/foo:bar', expected: 'file:///foo:bar' }, - // semicolon - { path: '/foo;bar', expected: 'file:///foo;bar' }, - // percent - { path: '/foo%bar', expected: 'file:///foo%25bar' }, - // backslash - { path: '/foo\\bar', expected: 'file:///foo%5Cbar' }, - // backspace - { path: '/foo\bbar', expected: 'file:///foo%08bar' }, - // tab - { path: '/foo\tbar', expected: 'file:///foo%09bar' }, - // newline - { path: '/foo\nbar', expected: 'file:///foo%0Abar' }, - // carriage return - { path: '/foo\rbar', expected: 'file:///foo%0Dbar' }, - // latin1 - { path: '/fóóbàr', expected: 'file:///f%C3%B3%C3%B3b%C3%A0r' }, - // Euro sign (BMP code point) - { path: '/€', expected: 'file:///%E2%82%AC' }, - // Rocket emoji (non-BMP code point) - { path: '/🚀', expected: 'file:///%F0%9F%9A%80' }, - ]; - } - - for (const { path, expected } of testCases) { - const actual = url.pathToFileURL(path).href; - assert.strictEqual(actual, expected); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-url-relative.js b/cli/tests/node_compat/test/parallel/test-url-relative.js deleted file mode 100644 index 2bcddd96f..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-relative.js +++ /dev/null @@ -1,441 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const assert = require('assert'); -const inspect = require('util').inspect; -const url = require('url'); - -// When source is false -assert.strictEqual(url.resolveObject('', 'foo'), 'foo'); - -// [from, path, expected] -const relativeTests = [ - ['/foo/bar/baz', 'quux', '/foo/bar/quux'], - ['/foo/bar/baz', 'quux/asdf', '/foo/bar/quux/asdf'], - ['/foo/bar/baz', 'quux/baz', '/foo/bar/quux/baz'], - ['/foo/bar/baz', '../quux/baz', '/foo/quux/baz'], - ['/foo/bar/baz', '/bar', '/bar'], - ['/foo/bar/baz/', 'quux', '/foo/bar/baz/quux'], - ['/foo/bar/baz/', 'quux/baz', '/foo/bar/baz/quux/baz'], - ['/foo/bar/baz', '../../../../../../../../quux/baz', '/quux/baz'], - ['/foo/bar/baz', '../../../../../../../quux/baz', '/quux/baz'], - ['/foo', '.', '/'], - ['/foo', '..', '/'], - ['/foo/', '.', '/foo/'], - ['/foo/', '..', '/'], - ['/foo/bar', '.', '/foo/'], - ['/foo/bar', '..', '/'], - ['/foo/bar/', '.', '/foo/bar/'], - ['/foo/bar/', '..', '/foo/'], - ['foo/bar', '../../../baz', '../../baz'], - ['foo/bar/', '../../../baz', '../baz'], - ['http://example.com/b//c//d;p?q#blarg', 'https:#hash2', 'https:///#hash2'], - ['http://example.com/b//c//d;p?q#blarg', - 'https:/p/a/t/h?s#hash2', - 'https://p/a/t/h?s#hash2'], - ['http://example.com/b//c//d;p?q#blarg', - 'https://u:p@h.com/p/a/t/h?s#hash2', - 'https://u:p@h.com/p/a/t/h?s#hash2'], - ['http://example.com/b//c//d;p?q#blarg', - 'https:/a/b/c/d', - 'https://a/b/c/d'], - ['http://example.com/b//c//d;p?q#blarg', - 'http:#hash2', - 'http://example.com/b//c//d;p?q#hash2'], - ['http://example.com/b//c//d;p?q#blarg', - 'http:/p/a/t/h?s#hash2', - 'http://example.com/p/a/t/h?s#hash2'], - ['http://example.com/b//c//d;p?q#blarg', - 'http://u:p@h.com/p/a/t/h?s#hash2', - 'http://u:p@h.com/p/a/t/h?s#hash2'], - ['http://example.com/b//c//d;p?q#blarg', - 'http:/a/b/c/d', - 'http://example.com/a/b/c/d'], - ['/foo/bar/baz', '/../etc/passwd', '/etc/passwd'], - ['http://localhost', 'file:///Users/foo', 'file:///Users/foo'], - ['http://localhost', 'file://foo/Users', 'file://foo/Users'], - ['https://registry.npmjs.org', '@foo/bar', 'https://registry.npmjs.org/@foo/bar'], -]; -relativeTests.forEach(function(relativeTest) { - const a = url.resolve(relativeTest[0], relativeTest[1]); - const e = relativeTest[2]; - assert.strictEqual(a, e, - `resolve(${relativeTest[0]}, ${relativeTest[1]})` + - ` == ${e}\n actual=${a}`); -}); - -// -// Tests below taken from Chiron -// http://code.google.com/p/chironjs/source/browse/trunk/src/test/http/url.js -// -// Copyright (c) 2002-2008 Kris Kowal <http://cixar.com/~kris.kowal> -// used with permission under MIT License -// -// Changes marked with @isaacs - -const bases = [ - 'http://a/b/c/d;p?q', - 'http://a/b/c/d;p?q=1/2', - 'http://a/b/c/d;p=1/2?q', - 'fred:///s//a/b/c', - 'http:///s//a/b/c', -]; - -// [to, from, result] -const relativeTests2 = [ - // http://lists.w3.org/Archives/Public/uri/2004Feb/0114.html - ['../c', 'foo:a/b', 'foo:c'], - ['foo:.', 'foo:a', 'foo:'], - ['/foo/../../../bar', 'zz:abc', 'zz:/bar'], - ['/foo/../bar', 'zz:abc', 'zz:/bar'], - // @isaacs Disagree. Not how web browsers resolve this. - ['foo/../../../bar', 'zz:abc', 'zz:bar'], - // ['foo/../../../bar', 'zz:abc', 'zz:../../bar'], // @isaacs Added - ['foo/../bar', 'zz:abc', 'zz:bar'], - ['zz:.', 'zz:abc', 'zz:'], - ['/.', bases[0], 'http://a/'], - ['/.foo', bases[0], 'http://a/.foo'], - ['.foo', bases[0], 'http://a/b/c/.foo'], - - // http://gbiv.com/protocols/uri/test/rel_examples1.html - // examples from RFC 2396 - ['g:h', bases[0], 'g:h'], - ['g', bases[0], 'http://a/b/c/g'], - ['./g', bases[0], 'http://a/b/c/g'], - ['g/', bases[0], 'http://a/b/c/g/'], - ['/g', bases[0], 'http://a/g'], - ['//g', bases[0], 'http://g/'], - // Changed with RFC 2396bis - // ('?y', bases[0], 'http://a/b/c/d;p?y'], - ['?y', bases[0], 'http://a/b/c/d;p?y'], - ['g?y', bases[0], 'http://a/b/c/g?y'], - // Changed with RFC 2396bis - // ('#s', bases[0], CURRENT_DOC_URI + '#s'], - ['#s', bases[0], 'http://a/b/c/d;p?q#s'], - ['g#s', bases[0], 'http://a/b/c/g#s'], - ['g?y#s', bases[0], 'http://a/b/c/g?y#s'], - [';x', bases[0], 'http://a/b/c/;x'], - ['g;x', bases[0], 'http://a/b/c/g;x'], - ['g;x?y#s', bases[0], 'http://a/b/c/g;x?y#s'], - // Changed with RFC 2396bis - // ('', bases[0], CURRENT_DOC_URI], - ['', bases[0], 'http://a/b/c/d;p?q'], - ['.', bases[0], 'http://a/b/c/'], - ['./', bases[0], 'http://a/b/c/'], - ['..', bases[0], 'http://a/b/'], - ['../', bases[0], 'http://a/b/'], - ['../g', bases[0], 'http://a/b/g'], - ['../..', bases[0], 'http://a/'], - ['../../', bases[0], 'http://a/'], - ['../../g', bases[0], 'http://a/g'], - ['../../../g', bases[0], ('http://a/../g', 'http://a/g')], - ['../../../../g', bases[0], ('http://a/../../g', 'http://a/g')], - // Changed with RFC 2396bis - // ('/./g', bases[0], 'http://a/./g'], - ['/./g', bases[0], 'http://a/g'], - // Changed with RFC 2396bis - // ('/../g', bases[0], 'http://a/../g'], - ['/../g', bases[0], 'http://a/g'], - ['g.', bases[0], 'http://a/b/c/g.'], - ['.g', bases[0], 'http://a/b/c/.g'], - ['g..', bases[0], 'http://a/b/c/g..'], - ['..g', bases[0], 'http://a/b/c/..g'], - ['./../g', bases[0], 'http://a/b/g'], - ['./g/.', bases[0], 'http://a/b/c/g/'], - ['g/./h', bases[0], 'http://a/b/c/g/h'], - ['g/../h', bases[0], 'http://a/b/c/h'], - ['g;x=1/./y', bases[0], 'http://a/b/c/g;x=1/y'], - ['g;x=1/../y', bases[0], 'http://a/b/c/y'], - ['g?y/./x', bases[0], 'http://a/b/c/g?y/./x'], - ['g?y/../x', bases[0], 'http://a/b/c/g?y/../x'], - ['g#s/./x', bases[0], 'http://a/b/c/g#s/./x'], - ['g#s/../x', bases[0], 'http://a/b/c/g#s/../x'], - ['http:g', bases[0], ('http:g', 'http://a/b/c/g')], - ['http:', bases[0], ('http:', bases[0])], - // Not sure where this one originated - ['/a/b/c/./../../g', bases[0], 'http://a/a/g'], - - // http://gbiv.com/protocols/uri/test/rel_examples2.html - // slashes in base URI's query args - ['g', bases[1], 'http://a/b/c/g'], - ['./g', bases[1], 'http://a/b/c/g'], - ['g/', bases[1], 'http://a/b/c/g/'], - ['/g', bases[1], 'http://a/g'], - ['//g', bases[1], 'http://g/'], - // Changed in RFC 2396bis - // ('?y', bases[1], 'http://a/b/c/?y'], - ['?y', bases[1], 'http://a/b/c/d;p?y'], - ['g?y', bases[1], 'http://a/b/c/g?y'], - ['g?y/./x', bases[1], 'http://a/b/c/g?y/./x'], - ['g?y/../x', bases[1], 'http://a/b/c/g?y/../x'], - ['g#s', bases[1], 'http://a/b/c/g#s'], - ['g#s/./x', bases[1], 'http://a/b/c/g#s/./x'], - ['g#s/../x', bases[1], 'http://a/b/c/g#s/../x'], - ['./', bases[1], 'http://a/b/c/'], - ['../', bases[1], 'http://a/b/'], - ['../g', bases[1], 'http://a/b/g'], - ['../../', bases[1], 'http://a/'], - ['../../g', bases[1], 'http://a/g'], - - // http://gbiv.com/protocols/uri/test/rel_examples3.html - // slashes in path params - // all of these changed in RFC 2396bis - ['g', bases[2], 'http://a/b/c/d;p=1/g'], - ['./g', bases[2], 'http://a/b/c/d;p=1/g'], - ['g/', bases[2], 'http://a/b/c/d;p=1/g/'], - ['g?y', bases[2], 'http://a/b/c/d;p=1/g?y'], - [';x', bases[2], 'http://a/b/c/d;p=1/;x'], - ['g;x', bases[2], 'http://a/b/c/d;p=1/g;x'], - ['g;x=1/./y', bases[2], 'http://a/b/c/d;p=1/g;x=1/y'], - ['g;x=1/../y', bases[2], 'http://a/b/c/d;p=1/y'], - ['./', bases[2], 'http://a/b/c/d;p=1/'], - ['../', bases[2], 'http://a/b/c/'], - ['../g', bases[2], 'http://a/b/c/g'], - ['../../', bases[2], 'http://a/b/'], - ['../../g', bases[2], 'http://a/b/g'], - - // http://gbiv.com/protocols/uri/test/rel_examples4.html - // double and triple slash, unknown scheme - ['g:h', bases[3], 'g:h'], - ['g', bases[3], 'fred:///s//a/b/g'], - ['./g', bases[3], 'fred:///s//a/b/g'], - ['g/', bases[3], 'fred:///s//a/b/g/'], - ['/g', bases[3], 'fred:///g'], // May change to fred:///s//a/g - ['//g', bases[3], 'fred://g'], // May change to fred:///s//g - ['//g/x', bases[3], 'fred://g/x'], // May change to fred:///s//g/x - ['///g', bases[3], 'fred:///g'], - ['./', bases[3], 'fred:///s//a/b/'], - ['../', bases[3], 'fred:///s//a/'], - ['../g', bases[3], 'fred:///s//a/g'], - - ['../../', bases[3], 'fred:///s//'], - ['../../g', bases[3], 'fred:///s//g'], - ['../../../g', bases[3], 'fred:///s/g'], - // May change to fred:///s//a/../../../g - ['../../../../g', bases[3], 'fred:///g'], - - // http://gbiv.com/protocols/uri/test/rel_examples5.html - // double and triple slash, well-known scheme - ['g:h', bases[4], 'g:h'], - ['g', bases[4], 'http:///s//a/b/g'], - ['./g', bases[4], 'http:///s//a/b/g'], - ['g/', bases[4], 'http:///s//a/b/g/'], - ['/g', bases[4], 'http:///g'], // May change to http:///s//a/g - ['//g', bases[4], 'http://g/'], // May change to http:///s//g - ['//g/x', bases[4], 'http://g/x'], // May change to http:///s//g/x - ['///g', bases[4], 'http:///g'], - ['./', bases[4], 'http:///s//a/b/'], - ['../', bases[4], 'http:///s//a/'], - ['../g', bases[4], 'http:///s//a/g'], - ['../../', bases[4], 'http:///s//'], - ['../../g', bases[4], 'http:///s//g'], - // May change to http:///s//a/../../g - ['../../../g', bases[4], 'http:///s/g'], - // May change to http:///s//a/../../../g - ['../../../../g', bases[4], 'http:///g'], - - // From Dan Connelly's tests in http://www.w3.org/2000/10/swap/uripath.py - ['bar:abc', 'foo:xyz', 'bar:abc'], - ['../abc', 'http://example/x/y/z', 'http://example/x/abc'], - ['http://example/x/abc', 'http://example2/x/y/z', 'http://example/x/abc'], - ['../r', 'http://ex/x/y/z', 'http://ex/x/r'], - ['q/r', 'http://ex/x/y', 'http://ex/x/q/r'], - ['q/r#s', 'http://ex/x/y', 'http://ex/x/q/r#s'], - ['q/r#s/t', 'http://ex/x/y', 'http://ex/x/q/r#s/t'], - ['ftp://ex/x/q/r', 'http://ex/x/y', 'ftp://ex/x/q/r'], - ['', 'http://ex/x/y', 'http://ex/x/y'], - ['', 'http://ex/x/y/', 'http://ex/x/y/'], - ['', 'http://ex/x/y/pdq', 'http://ex/x/y/pdq'], - ['z/', 'http://ex/x/y/', 'http://ex/x/y/z/'], - ['#Animal', - 'file:/swap/test/animal.rdf', - 'file:/swap/test/animal.rdf#Animal'], - ['../abc', 'file:/e/x/y/z', 'file:/e/x/abc'], - ['/example/x/abc', 'file:/example2/x/y/z', 'file:/example/x/abc'], - ['../r', 'file:/ex/x/y/z', 'file:/ex/x/r'], - ['/r', 'file:/ex/x/y/z', 'file:/r'], - ['q/r', 'file:/ex/x/y', 'file:/ex/x/q/r'], - ['q/r#s', 'file:/ex/x/y', 'file:/ex/x/q/r#s'], - ['q/r#', 'file:/ex/x/y', 'file:/ex/x/q/r#'], - ['q/r#s/t', 'file:/ex/x/y', 'file:/ex/x/q/r#s/t'], - ['ftp://ex/x/q/r', 'file:/ex/x/y', 'ftp://ex/x/q/r'], - ['', 'file:/ex/x/y', 'file:/ex/x/y'], - ['', 'file:/ex/x/y/', 'file:/ex/x/y/'], - ['', 'file:/ex/x/y/pdq', 'file:/ex/x/y/pdq'], - ['z/', 'file:/ex/x/y/', 'file:/ex/x/y/z/'], - ['file://meetings.example.com/cal#m1', - 'file:/devel/WWW/2000/10/swap/test/reluri-1.n3', - 'file://meetings.example.com/cal#m1'], - ['file://meetings.example.com/cal#m1', - 'file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3', - 'file://meetings.example.com/cal#m1'], - ['./#blort', 'file:/some/dir/foo', 'file:/some/dir/#blort'], - ['./#', 'file:/some/dir/foo', 'file:/some/dir/#'], - // Ryan Lee - ['./', 'http://example/x/abc.efg', 'http://example/x/'], - - - // Graham Klyne's tests - // http://www.ninebynine.org/Software/HaskellUtils/Network/UriTest.xls - // 01-31 are from Connelly's cases - - // 32-49 - ['./q:r', 'http://ex/x/y', 'http://ex/x/q:r'], - ['./p=q:r', 'http://ex/x/y', 'http://ex/x/p=q:r'], - ['?pp/rr', 'http://ex/x/y?pp/qq', 'http://ex/x/y?pp/rr'], - ['y/z', 'http://ex/x/y?pp/qq', 'http://ex/x/y/z'], - ['local/qual@domain.org#frag', - 'mailto:local', - 'mailto:local/qual@domain.org#frag'], - ['more/qual2@domain2.org#frag', - 'mailto:local/qual1@domain1.org', - 'mailto:local/more/qual2@domain2.org#frag'], - ['y?q', 'http://ex/x/y?q', 'http://ex/x/y?q'], - ['/x/y?q', 'http://ex?p', 'http://ex/x/y?q'], - ['c/d', 'foo:a/b', 'foo:a/c/d'], - ['/c/d', 'foo:a/b', 'foo:/c/d'], - ['', 'foo:a/b?c#d', 'foo:a/b?c'], - ['b/c', 'foo:a', 'foo:b/c'], - ['../b/c', 'foo:/a/y/z', 'foo:/a/b/c'], - ['./b/c', 'foo:a', 'foo:b/c'], - ['/./b/c', 'foo:a', 'foo:/b/c'], - ['../../d', 'foo://a//b/c', 'foo://a/d'], - ['.', 'foo:a', 'foo:'], - ['..', 'foo:a', 'foo:'], - - // 50-57[cf. TimBL comments -- - // http://lists.w3.org/Archives/Public/uri/2003Feb/0028.html, - // http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html) - ['abc', 'http://example/x/y%2Fz', 'http://example/x/abc'], - ['../../x%2Fabc', 'http://example/a/x/y/z', 'http://example/a/x%2Fabc'], - ['../x%2Fabc', 'http://example/a/x/y%2Fz', 'http://example/a/x%2Fabc'], - ['abc', 'http://example/x%2Fy/z', 'http://example/x%2Fy/abc'], - ['q%3Ar', 'http://ex/x/y', 'http://ex/x/q%3Ar'], - ['/x%2Fabc', 'http://example/x/y%2Fz', 'http://example/x%2Fabc'], - ['/x%2Fabc', 'http://example/x/y/z', 'http://example/x%2Fabc'], - ['/x%2Fabc', 'http://example/x/y%2Fz', 'http://example/x%2Fabc'], - - // 70-77 - ['local2@domain2', 'mailto:local1@domain1?query1', 'mailto:local2@domain2'], - ['local2@domain2?query2', - 'mailto:local1@domain1', - 'mailto:local2@domain2?query2'], - ['local2@domain2?query2', - 'mailto:local1@domain1?query1', - 'mailto:local2@domain2?query2'], - ['?query2', 'mailto:local@domain?query1', 'mailto:local@domain?query2'], - ['local@domain?query2', 'mailto:?query1', 'mailto:local@domain?query2'], - ['?query2', 'mailto:local@domain?query1', 'mailto:local@domain?query2'], - ['http://example/a/b?c/../d', 'foo:bar', 'http://example/a/b?c/../d'], - ['http://example/a/b#c/../d', 'foo:bar', 'http://example/a/b#c/../d'], - - // 82-88 - // @isaacs Disagree. Not how browsers do it. - // ['http:this', 'http://example.org/base/uri', 'http:this'], - // @isaacs Added - ['http:this', 'http://example.org/base/uri', 'http://example.org/base/this'], - ['http:this', 'http:base', 'http:this'], - ['.//g', 'f:/a', 'f://g'], - ['b/c//d/e', 'f://example.org/base/a', 'f://example.org/base/b/c//d/e'], - ['m2@example.ord/c2@example.org', - 'mid:m@example.ord/c@example.org', - 'mid:m@example.ord/m2@example.ord/c2@example.org'], - ['mini1.xml', - 'file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/', - 'file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/mini1.xml'], - ['../b/c', 'foo:a/y/z', 'foo:a/b/c'], - - // changeing auth - ['http://diff:auth@www.example.com', - 'http://asdf:qwer@www.example.com', - 'http://diff:auth@www.example.com/'], - - // changing port - ['https://example.com:81/', - 'https://example.com:82/', - 'https://example.com:81/'], - - // https://github.com/nodejs/node/issues/1435 - ['https://another.host.com/', - 'https://user:password@example.org/', - 'https://another.host.com/'], - ['//another.host.com/', - 'https://user:password@example.org/', - 'https://another.host.com/'], - ['http://another.host.com/', - 'https://user:password@example.org/', - 'http://another.host.com/'], - ['mailto:another.host.com', - 'mailto:user@example.org', - 'mailto:another.host.com'], - ['https://example.com/foo', - 'https://user:password@example.com', - 'https://user:password@example.com/foo'], - - // No path at all - ['#hash1', '#hash2', '#hash1'], -]; -relativeTests2.forEach(function(relativeTest) { - const a = url.resolve(relativeTest[1], relativeTest[0]); - const e = url.format(relativeTest[2]); - assert.strictEqual(a, e, - `resolve(${relativeTest[0]}, ${relativeTest[1]})` + - ` == ${e}\n actual=${a}`); -}); - -// If format and parse are inverse operations then -// resolveObject(parse(x), y) == parse(resolve(x, y)) - -// format: [from, path, expected] -relativeTests.forEach(function(relativeTest) { - let actual = url.resolveObject(url.parse(relativeTest[0]), relativeTest[1]); - let expected = url.parse(relativeTest[2]); - - - assert.deepStrictEqual(actual, expected); - - expected = relativeTest[2]; - actual = url.format(actual); - - assert.strictEqual(actual, expected, - `format(${actual}) == ${expected}\n` + - `actual: ${actual}`); -}); - -// format: [to, from, result] -// the test: ['.//g', 'f:/a', 'f://g'] is a fundamental problem -// url.parse('f:/a') does not have a host -// url.resolve('f:/a', './/g') does not have a host because you have moved -// down to the g directory. i.e. f: //g, however when this url is parsed -// f:// will indicate that the host is g which is not the case. -// it is unclear to me how to keep this information from being lost -// it may be that a pathname of ////g should collapse to /g but this seems -// to be a lot of work for an edge case. Right now I remove the test -if (relativeTests2[181][0] === './/g' && - relativeTests2[181][1] === 'f:/a' && - relativeTests2[181][2] === 'f://g') { - relativeTests2.splice(181, 1); -} -relativeTests2.forEach(function(relativeTest) { - let actual = url.resolveObject(url.parse(relativeTest[1]), relativeTest[0]); - let expected = url.parse(relativeTest[2]); - - assert.deepStrictEqual( - actual, - expected, - `expected ${inspect(expected)} but got ${inspect(actual)}` - ); - - expected = url.format(relativeTest[2]); - actual = url.format(actual); - - assert.strictEqual(actual, expected, - `format(${relativeTest[1]}) == ${expected}\n` + - `actual: ${actual}`); -}); diff --git a/cli/tests/node_compat/test/parallel/test-url-urltooptions.js b/cli/tests/node_compat/test/parallel/test-url-urltooptions.js deleted file mode 100644 index 05813f0ae..000000000 --- a/cli/tests/node_compat/test/parallel/test-url-urltooptions.js +++ /dev/null @@ -1,45 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.11.1 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -require('../common'); -const assert = require('assert'); -const { urlToHttpOptions } = require('url'); - -// Test urlToHttpOptions -const urlObj = new URL('http://user:pass@foo.bar.com:21/aaa/zzz?l=24#test'); -const opts = urlToHttpOptions(urlObj); -assert.strictEqual(opts instanceof URL, false); -assert.strictEqual(opts.protocol, 'http:'); -assert.strictEqual(opts.auth, 'user:pass'); -assert.strictEqual(opts.hostname, 'foo.bar.com'); -assert.strictEqual(opts.port, 21); -assert.strictEqual(opts.path, '/aaa/zzz?l=24'); -assert.strictEqual(opts.pathname, '/aaa/zzz'); -assert.strictEqual(opts.search, '?l=24'); -assert.strictEqual(opts.hash, '#test'); - -const { hostname } = urlToHttpOptions(new URL('http://[::1]:21')); -assert.strictEqual(hostname, '::1'); - -// If a WHATWG URL object is copied, it is possible that the resulting copy -// contains the Symbols that Node uses for brand checking, but not the data -// properties, which are getters. Verify that urlToHttpOptions() can handle -// such a case. -const copiedUrlObj = { ...urlObj }; -const copiedOpts = urlToHttpOptions(copiedUrlObj); -assert.strictEqual(copiedOpts instanceof URL, false); -assert.strictEqual(copiedOpts.protocol, undefined); -assert.strictEqual(copiedOpts.auth, undefined); -assert.strictEqual(copiedOpts.hostname, undefined); -// TODO(wafuwafu13): Fix `AssertionError: Values have the same structure but are not reference-equal` -// assert.strictEqual(copiedOpts.port, NaN); -assert.strictEqual(copiedOpts.path, ''); -assert.strictEqual(copiedOpts.pathname, undefined); -assert.strictEqual(copiedOpts.search, undefined); -assert.strictEqual(copiedOpts.hash, undefined); -assert.strictEqual(copiedOpts.href, undefined); diff --git a/cli/tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js b/cli/tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js deleted file mode 100644 index 19093a3ae..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-deprecate-invalid-code.js +++ /dev/null @@ -1,21 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const assert = require('assert'); -const util = require('util'); - -[1, true, false, null, {}].forEach((notString) => { - assert.throws(() => util.deprecate(() => {}, 'message', notString), { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "code" argument must be of type string.' + - common.invalidArgTypeHelper(notString) - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-util-deprecate.js b/cli/tests/node_compat/test/parallel/test-util-deprecate.js deleted file mode 100644 index 2394caa22..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-deprecate.js +++ /dev/null @@ -1,64 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -// Tests basic functionality of util.deprecate(). - -const assert = require('assert'); -const util = require('util'); - -const expectedWarnings = new Map(); - -// Emits deprecation only once if same function is called. -{ - const msg = 'fhqwhgads'; - const fn = util.deprecate(() => {}, msg); - expectedWarnings.set(msg, { code: undefined, count: 1 }); - fn(); - fn(); -} - -// Emits deprecation twice for different functions. -{ - const msg = 'sterrance'; - const fn1 = util.deprecate(() => {}, msg); - const fn2 = util.deprecate(() => {}, msg); - expectedWarnings.set(msg, { code: undefined, count: 2 }); - fn1(); - fn2(); -} - -// Emits deprecation only once if optional code is the same, even for different -// functions. -{ - const msg = 'cannonmouth'; - const code = 'deprecatesque'; - const fn1 = util.deprecate(() => {}, msg, code); - const fn2 = util.deprecate(() => {}, msg, code); - expectedWarnings.set(msg, { code, count: 1 }); - fn1(); - fn2(); - fn1(); - fn2(); -} - -process.on('warning', (warning) => { - assert.strictEqual(warning.name, 'DeprecationWarning'); - assert.ok(expectedWarnings.has(warning.message)); - const expected = expectedWarnings.get(warning.message); - assert.strictEqual(warning.code, expected.code); - expected.count = expected.count - 1; - if (expected.count === 0) - expectedWarnings.delete(warning.message); -}); - -process.on('exit', () => { - assert.deepStrictEqual(expectedWarnings, new Map()); -}); diff --git a/cli/tests/node_compat/test/parallel/test-util-format.js b/cli/tests/node_compat/test/parallel/test-util-format.js deleted file mode 100644 index 9d474c481..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-format.js +++ /dev/null @@ -1,504 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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'; -require('../common'); -const assert = require('assert'); -const util = require('util'); -const symbol = Symbol('foo'); - -assert.strictEqual(util.format(), ''); -assert.strictEqual(util.format(''), ''); -assert.strictEqual(util.format([]), '[]'); -assert.strictEqual(util.format([0]), '[ 0 ]'); -assert.strictEqual(util.format({}), '{}'); -assert.strictEqual(util.format({ foo: 42 }), '{ foo: 42 }'); -assert.strictEqual(util.format(null), 'null'); -assert.strictEqual(util.format(true), 'true'); -assert.strictEqual(util.format(false), 'false'); -assert.strictEqual(util.format('test'), 'test'); - -// CHECKME this is for console.log() compatibility - but is it *right*? -assert.strictEqual(util.format('foo', 'bar', 'baz'), 'foo bar baz'); - -// ES6 Symbol handling -assert.strictEqual(util.format(symbol), 'Symbol(foo)'); -assert.strictEqual(util.format('foo', symbol), 'foo Symbol(foo)'); -assert.strictEqual(util.format('%s', symbol), 'Symbol(foo)'); -assert.strictEqual(util.format('%j', symbol), 'undefined'); - -// Number format specifier -assert.strictEqual(util.format('%d'), '%d'); -assert.strictEqual(util.format('%d', 42.0), '42'); -assert.strictEqual(util.format('%d', 42), '42'); -assert.strictEqual(util.format('%d', '42'), '42'); -assert.strictEqual(util.format('%d', '42.0'), '42'); -assert.strictEqual(util.format('%d', 1.5), '1.5'); -assert.strictEqual(util.format('%d', -0.5), '-0.5'); -assert.strictEqual(util.format('%d', -0.0), '-0'); -assert.strictEqual(util.format('%d', ''), '0'); -assert.strictEqual(util.format('%d', ' -0.000'), '-0'); -assert.strictEqual(util.format('%d', Symbol()), 'NaN'); -assert.strictEqual(util.format('%d', Infinity), 'Infinity'); -assert.strictEqual(util.format('%d', -Infinity), '-Infinity'); -assert.strictEqual(util.format('%d %d', 42, 43), '42 43'); -assert.strictEqual(util.format('%d %d', 42), '42 %d'); -assert.strictEqual( - util.format('%d', 1180591620717411303424), - '1.1805916207174113e+21' -); -assert.strictEqual( - util.format('%d', 1180591620717411303424n), - '1180591620717411303424n' -); -assert.strictEqual( - util.format('%d %d', 1180591620717411303424n, 12345678901234567890123n), - '1180591620717411303424n 12345678901234567890123n' -); - -// Integer format specifier -assert.strictEqual(util.format('%i'), '%i'); -assert.strictEqual(util.format('%i', 42.0), '42'); -assert.strictEqual(util.format('%i', 42), '42'); -assert.strictEqual(util.format('%i', '42'), '42'); -assert.strictEqual(util.format('%i', '42.0'), '42'); -assert.strictEqual(util.format('%i', 1.5), '1'); -assert.strictEqual(util.format('%i', -0.5), '-0'); -assert.strictEqual(util.format('%i', ''), 'NaN'); -assert.strictEqual(util.format('%i', Infinity), 'NaN'); -assert.strictEqual(util.format('%i', -Infinity), 'NaN'); -assert.strictEqual(util.format('%i', Symbol()), 'NaN'); -assert.strictEqual(util.format('%i %i', 42, 43), '42 43'); -assert.strictEqual(util.format('%i %i', 42), '42 %i'); -assert.strictEqual( - util.format('%i', 1180591620717411303424), - '1' -); -assert.strictEqual( - util.format('%i', 1180591620717411303424n), - '1180591620717411303424n' -); -assert.strictEqual( - util.format('%i %i', 1180591620717411303424n, 12345678901234567890123n), - '1180591620717411303424n 12345678901234567890123n' -); - -assert.strictEqual( - util.format('%d %i', 1180591620717411303424n, 12345678901234567890123n), - '1180591620717411303424n 12345678901234567890123n' -); - -assert.strictEqual( - util.format('%i %d', 1180591620717411303424n, 12345678901234567890123n), - '1180591620717411303424n 12345678901234567890123n' -); - -// Float format specifier -assert.strictEqual(util.format('%f'), '%f'); -assert.strictEqual(util.format('%f', 42.0), '42'); -assert.strictEqual(util.format('%f', 42), '42'); -assert.strictEqual(util.format('%f', '42'), '42'); -assert.strictEqual(util.format('%f', '-0.0'), '-0'); -assert.strictEqual(util.format('%f', '42.0'), '42'); -assert.strictEqual(util.format('%f', 1.5), '1.5'); -assert.strictEqual(util.format('%f', -0.5), '-0.5'); -assert.strictEqual(util.format('%f', Math.PI), '3.141592653589793'); -assert.strictEqual(util.format('%f', ''), 'NaN'); -assert.strictEqual(util.format('%f', Symbol('foo')), 'NaN'); -assert.strictEqual(util.format('%f', 5n), '5'); -assert.strictEqual(util.format('%f', Infinity), 'Infinity'); -assert.strictEqual(util.format('%f', -Infinity), '-Infinity'); -assert.strictEqual(util.format('%f %f', 42, 43), '42 43'); -assert.strictEqual(util.format('%f %f', 42), '42 %f'); - -// String format specifier -assert.strictEqual(util.format('%s'), '%s'); -assert.strictEqual(util.format('%s', undefined), 'undefined'); -assert.strictEqual(util.format('%s', null), 'null'); -assert.strictEqual(util.format('%s', 'foo'), 'foo'); -assert.strictEqual(util.format('%s', 42), '42'); -assert.strictEqual(util.format('%s', '42'), '42'); -assert.strictEqual(util.format('%s', -0), '-0'); -assert.strictEqual(util.format('%s', '-0.0'), '-0.0'); -assert.strictEqual(util.format('%s %s', 42, 43), '42 43'); -assert.strictEqual(util.format('%s %s', 42), '42 %s'); -assert.strictEqual(util.format('%s', 42n), '42n'); -assert.strictEqual(util.format('%s', Symbol('foo')), 'Symbol(foo)'); -assert.strictEqual(util.format('%s', true), 'true'); -assert.strictEqual(util.format('%s', { a: [1, 2, 3] }), '{ a: [Array] }'); -assert.strictEqual(util.format('%s', { toString() { return 'Foo'; } }), 'Foo'); -assert.strictEqual(util.format('%s', { toString: 5 }), '{ toString: 5 }'); -assert.strictEqual(util.format('%s', () => 5), '() => 5'); -assert.strictEqual(util.format('%s', Infinity), 'Infinity'); -assert.strictEqual(util.format('%s', -Infinity), '-Infinity'); - -// TODO(wafuwafu13): Fix -// // String format specifier including `toString` properties on the prototype. -// { -// class Foo { toString() { return 'Bar'; } } -// assert.strictEqual(util.format('%s', new Foo()), 'Bar'); -// assert.strictEqual( -// util.format('%s', Object.setPrototypeOf(new Foo(), null)), -// '[Foo: null prototype] {}' -// ); -// global.Foo = Foo; -// assert.strictEqual(util.format('%s', new Foo()), 'Bar'); -// delete global.Foo; -// class Bar { abc = true; } -// assert.strictEqual(util.format('%s', new Bar()), 'Bar { abc: true }'); -// class Foobar extends Array { aaa = true; } -// assert.strictEqual( -// util.format('%s', new Foobar(5)), -// 'Foobar(5) [ <5 empty items>, aaa: true ]' -// ); - -// // Subclassing: -// class B extends Foo {} - -// function C() {} -// C.prototype.toString = function() { -// return 'Custom'; -// }; - -// function D() { -// C.call(this); -// } -// D.prototype = Object.create(C.prototype); - -// assert.strictEqual( -// util.format('%s', new B()), -// 'Bar' -// ); -// assert.strictEqual( -// util.format('%s', new C()), -// 'Custom' -// ); -// assert.strictEqual( -// util.format('%s', new D()), -// 'Custom' -// ); - -// D.prototype.constructor = D; -// assert.strictEqual( -// util.format('%s', new D()), -// 'Custom' -// ); - -// D.prototype.constructor = null; -// assert.strictEqual( -// util.format('%s', new D()), -// 'Custom' -// ); - -// D.prototype.constructor = { name: 'Foobar' }; -// assert.strictEqual( -// util.format('%s', new D()), -// 'Custom' -// ); - -// Object.defineProperty(D.prototype, 'constructor', { -// get() { -// throw new Error(); -// }, -// configurable: true -// }); -// assert.strictEqual( -// util.format('%s', new D()), -// 'Custom' -// ); - -// assert.strictEqual( -// util.format('%s', Object.create(null)), -// '[Object: null prototype] {}' -// ); -// } - -// JSON format specifier -assert.strictEqual(util.format('%j'), '%j'); -assert.strictEqual(util.format('%j', 42), '42'); -assert.strictEqual(util.format('%j', '42'), '"42"'); -assert.strictEqual(util.format('%j %j', 42, 43), '42 43'); -assert.strictEqual(util.format('%j %j', 42), '42 %j'); - -// Object format specifier -const obj = { - foo: 'bar', - foobar: 1, - func: function() {} -}; -const nestedObj = { - foo: 'bar', - foobar: { - foo: 'bar', - func: function() {} - } -}; -const nestedObj2 = { - foo: 'bar', - foobar: 1, - func: [{ a: function() {} }] -}; -assert.strictEqual(util.format('%o'), '%o'); -assert.strictEqual(util.format('%o', 42), '42'); -assert.strictEqual(util.format('%o', 'foo'), '\'foo\''); -assert.strictEqual( - util.format('%o', obj), - '{\n' + - ' foo: \'bar\',\n' + - ' foobar: 1,\n' + - ' func: <ref *1> [Function: func] {\n' + - ' [length]: 0,\n' + - ' [name]: \'func\',\n' + - ' [prototype]: { [constructor]: [Circular *1] }\n' + - ' }\n' + - '}'); -assert.strictEqual( - util.format('%o', nestedObj2), - '{\n' + - ' foo: \'bar\',\n' + - ' foobar: 1,\n' + - ' func: [\n' + - ' {\n' + - ' a: <ref *1> [Function: a] {\n' + - ' [length]: 0,\n' + - ' [name]: \'a\',\n' + - ' [prototype]: { [constructor]: [Circular *1] }\n' + - ' }\n' + - ' },\n' + - ' [length]: 1\n' + - ' ]\n' + - '}'); -assert.strictEqual( - util.format('%o', nestedObj), - '{\n' + - ' foo: \'bar\',\n' + - ' foobar: {\n' + - ' foo: \'bar\',\n' + - ' func: <ref *1> [Function: func] {\n' + - ' [length]: 0,\n' + - ' [name]: \'func\',\n' + - ' [prototype]: { [constructor]: [Circular *1] }\n' + - ' }\n' + - ' }\n' + - '}'); -assert.strictEqual( - util.format('%o %o', obj, obj), - '{\n' + - ' foo: \'bar\',\n' + - ' foobar: 1,\n' + - ' func: <ref *1> [Function: func] {\n' + - ' [length]: 0,\n' + - ' [name]: \'func\',\n' + - ' [prototype]: { [constructor]: [Circular *1] }\n' + - ' }\n' + - '} {\n' + - ' foo: \'bar\',\n' + - ' foobar: 1,\n' + - ' func: <ref *1> [Function: func] {\n' + - ' [length]: 0,\n' + - ' [name]: \'func\',\n' + - ' [prototype]: { [constructor]: [Circular *1] }\n' + - ' }\n' + - '}'); -assert.strictEqual( - util.format('%o %o', obj), - '{\n' + - ' foo: \'bar\',\n' + - ' foobar: 1,\n' + - ' func: <ref *1> [Function: func] {\n' + - ' [length]: 0,\n' + - ' [name]: \'func\',\n' + - ' [prototype]: { [constructor]: [Circular *1] }\n' + - ' }\n' + - '} %o'); - -assert.strictEqual(util.format('%O'), '%O'); -assert.strictEqual(util.format('%O', 42), '42'); -assert.strictEqual(util.format('%O', 'foo'), '\'foo\''); -assert.strictEqual( - util.format('%O', obj), - '{ foo: \'bar\', foobar: 1, func: [Function: func] }'); -assert.strictEqual( - util.format('%O', nestedObj), - '{ foo: \'bar\', foobar: { foo: \'bar\', func: [Function: func] } }'); -assert.strictEqual( - util.format('%O %O', obj, obj), - '{ foo: \'bar\', foobar: 1, func: [Function: func] } ' + - '{ foo: \'bar\', foobar: 1, func: [Function: func] }'); -assert.strictEqual( - util.format('%O %O', obj), - '{ foo: \'bar\', foobar: 1, func: [Function: func] } %O'); - -// Various format specifiers -assert.strictEqual(util.format('%%s%s', 'foo'), '%sfoo'); -assert.strictEqual(util.format('%s:%s'), '%s:%s'); -assert.strictEqual(util.format('%s:%s', undefined), 'undefined:%s'); -assert.strictEqual(util.format('%s:%s', 'foo'), 'foo:%s'); -assert.strictEqual(util.format('%s:%i', 'foo'), 'foo:%i'); -assert.strictEqual(util.format('%s:%f', 'foo'), 'foo:%f'); -assert.strictEqual(util.format('%s:%s', 'foo', 'bar'), 'foo:bar'); -assert.strictEqual(util.format('%s:%s', 'foo', 'bar', 'baz'), 'foo:bar baz'); -assert.strictEqual(util.format('%%%s%%', 'hi'), '%hi%'); -assert.strictEqual(util.format('%%%s%%%%', 'hi'), '%hi%%'); -assert.strictEqual(util.format('%sbc%%def', 'a'), 'abc%def'); -assert.strictEqual(util.format('%d:%d', 12, 30), '12:30'); -assert.strictEqual(util.format('%d:%d', 12), '12:%d'); -assert.strictEqual(util.format('%d:%d'), '%d:%d'); -assert.strictEqual(util.format('%i:%i', 12, 30), '12:30'); -assert.strictEqual(util.format('%i:%i', 12), '12:%i'); -assert.strictEqual(util.format('%i:%i'), '%i:%i'); -assert.strictEqual(util.format('%f:%f', 12, 30), '12:30'); -assert.strictEqual(util.format('%f:%f', 12), '12:%f'); -assert.strictEqual(util.format('%f:%f'), '%f:%f'); -assert.strictEqual(util.format('o: %j, a: %j', {}, []), 'o: {}, a: []'); -assert.strictEqual(util.format('o: %j, a: %j', {}), 'o: {}, a: %j'); -assert.strictEqual(util.format('o: %j, a: %j'), 'o: %j, a: %j'); -assert.strictEqual(util.format('o: %o, a: %O', {}, []), 'o: {}, a: []'); -assert.strictEqual(util.format('o: %o, a: %o', {}), 'o: {}, a: %o'); -assert.strictEqual(util.format('o: %O, a: %O'), 'o: %O, a: %O'); - - -// Invalid format specifiers -assert.strictEqual(util.format('a% b', 'x'), 'a% b x'); -assert.strictEqual(util.format('percent: %d%, fraction: %d', 10, 0.1), - 'percent: 10%, fraction: 0.1'); -assert.strictEqual(util.format('abc%', 1), 'abc% 1'); - -// Additional arguments after format specifiers -assert.strictEqual(util.format('%i', 1, 'number'), '1 number'); -assert.strictEqual(util.format('%i', 1, () => {}), '1 [Function (anonymous)]'); - -// %c from https://console.spec.whatwg.org/ -assert.strictEqual(util.format('%c'), '%c'); -assert.strictEqual(util.format('%cab'), '%cab'); -assert.strictEqual(util.format('%cab', 'color: blue'), 'ab'); -assert.strictEqual(util.format('%cab', 'color: blue', 'c'), 'ab c'); - -{ - const o = {}; - o.o = o; - assert.strictEqual(util.format('%j', o), '[Circular]'); -} - -{ - const o = { - toJSON() { - throw new Error('Not a circular object but still not serializable'); - } - }; - assert.throws(() => util.format('%j', o), - /^Error: Not a circular object but still not serializable$/); -} - -// Errors -const err = new Error('foo'); -assert.strictEqual(util.format(err), err.stack); -class CustomError extends Error { - constructor(msg) { - super(); - Object.defineProperty(this, 'message', - { value: msg, enumerable: false }); - Object.defineProperty(this, 'name', - { value: 'CustomError', enumerable: false }); - Error.captureStackTrace(this, CustomError); - } -} -const customError = new CustomError('bar'); -assert.strictEqual(util.format(customError), customError.stack); -// Doesn't capture stack trace -function BadCustomError(msg) { - Error.call(this); - Object.defineProperty(this, 'message', - { value: msg, enumerable: false }); - Object.defineProperty(this, 'name', - { value: 'BadCustomError', enumerable: false }); -} -Object.setPrototypeOf(BadCustomError.prototype, Error.prototype); -Object.setPrototypeOf(BadCustomError, Error); -assert.strictEqual(util.format(new BadCustomError('foo')), - '[BadCustomError: foo]'); - -// The format of arguments should not depend on type of the first argument -assert.strictEqual(util.format('1', '1'), '1 1'); -assert.strictEqual(util.format(1, '1'), '1 1'); -assert.strictEqual(util.format('1', 1), '1 1'); -assert.strictEqual(util.format(1, -0), '1 -0'); -assert.strictEqual(util.format('1', () => {}), '1 [Function (anonymous)]'); -assert.strictEqual(util.format(1, () => {}), '1 [Function (anonymous)]'); -assert.strictEqual(util.format('1', "'"), "1 '"); -assert.strictEqual(util.format(1, "'"), "1 '"); -assert.strictEqual(util.format('1', 'number'), '1 number'); -assert.strictEqual(util.format(1, 'number'), '1 number'); -assert.strictEqual(util.format(5n), '5n'); -assert.strictEqual(util.format(5n, 5n), '5n 5n'); - -// Check `formatWithOptions`. -assert.strictEqual( - util.formatWithOptions( - { colors: true }, - true, undefined, Symbol(), 1, 5n, null, 'foobar' - ), - '\u001b[33mtrue\u001b[39m ' + - '\u001b[90mundefined\u001b[39m ' + - '\u001b[32mSymbol()\u001b[39m ' + - '\u001b[33m1\u001b[39m ' + - '\u001b[33m5n\u001b[39m ' + - '\u001b[1mnull\u001b[22m ' + - 'foobar' -); - -// TODO(wafuwafu13): Fix -// assert.strictEqual( -// util.format(new SharedArrayBuffer(4)), -// 'SharedArrayBuffer { [Uint8Contents]: <00 00 00 00>, byteLength: 4 }' -// ); - -assert.strictEqual( - util.formatWithOptions( - { colors: true, compact: 3 }, - '%s', [ 1, { a: true }] - ), - '[ 1, [Object] ]' -); - -[ - undefined, - null, - false, - 5n, - 5, - 'test', - Symbol(), -].forEach((invalidOptions) => { - assert.throws(() => { - util.formatWithOptions(invalidOptions, { a: true }); - }, { - code: 'ERR_INVALID_ARG_TYPE', - message: /"inspectOptions".+object/ - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-util-inherits.js b/cli/tests/node_compat/test/parallel/test-util-inherits.js deleted file mode 100644 index ac1ab596b..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-inherits.js +++ /dev/null @@ -1,117 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); -const { inherits } = require('util'); - -// Super constructor -function A() { - this._a = 'a'; -} -A.prototype.a = function() { return this._a; }; - -// One level of inheritance -function B(value) { - A.call(this); - this._b = value; -} -inherits(B, A); -B.prototype.b = function() { return this._b; }; - -assert.deepStrictEqual( - Object.getOwnPropertyDescriptor(B, 'super_'), - { - value: A, - enumerable: false, - configurable: true, - writable: true - } -); - -const b = new B('b'); -assert.strictEqual(b.a(), 'a'); -assert.strictEqual(b.b(), 'b'); -assert.strictEqual(b.constructor, B); - -// Two levels of inheritance -function C() { - B.call(this, 'b'); - this._c = 'c'; -} -inherits(C, B); -C.prototype.c = function() { return this._c; }; -C.prototype.getValue = function() { return this.a() + this.b() + this.c(); }; - -assert.strictEqual(C.super_, B); - -const c = new C(); -assert.strictEqual(c.getValue(), 'abc'); -assert.strictEqual(c.constructor, C); - -// Inherits can be called after setting prototype properties -function D() { - C.call(this); - this._d = 'd'; -} - -D.prototype.d = function() { return this._d; }; -inherits(D, C); - -assert.strictEqual(D.super_, C); - -const d = new D(); -assert.strictEqual(d.c(), 'c'); -assert.strictEqual(d.d(), 'd'); -assert.strictEqual(d.constructor, D); - -// ES6 classes can inherit from a constructor function -class E { - constructor() { - D.call(this); - this._e = 'e'; - } - e() { return this._e; } -} -inherits(E, D); - -assert.strictEqual(E.super_, D); - -const e = new E(); -assert.strictEqual(e.getValue(), 'abc'); -assert.strictEqual(e.d(), 'd'); -assert.strictEqual(e.e(), 'e'); -assert.strictEqual(e.constructor, E); - -// Should throw with invalid arguments -assert.throws(() => { - inherits(A, {}); -}, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "superCtor.prototype" property must be of type object. ' + - 'Received undefined' -}); - -assert.throws(() => { - inherits(A, null); -}, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "superCtor" argument must be of type function. ' + - 'Received null' -}); - -assert.throws(() => { - inherits(null, A); -}, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "ctor" argument must be of type function. Received null' -}); diff --git a/cli/tests/node_compat/test/parallel/test-util-inspect-long-running.js b/cli/tests/node_compat/test/parallel/test-util-inspect-long-running.js deleted file mode 100644 index 67dc03ba4..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-inspect-long-running.js +++ /dev/null @@ -1,27 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -// Test that huge objects don't crash due to exceeding the maximum heap size. - -const util = require('util'); - -// Create a difficult to stringify object. Without the artificial limitation -// this would crash or throw an maximum string size error. -let last = {}; -const obj = last; - -for (let i = 0; i < 1000; i++) { - last.next = { circular: obj, last, obj: { a: 1, b: 2, c: true } }; - last = last.next; - obj[i] = last; -} - -util.inspect(obj, { depth: Infinity }); diff --git a/cli/tests/node_compat/test/parallel/test-util-inspect-namespace.js b/cli/tests/node_compat/test/parallel/test-util-inspect-namespace.js deleted file mode 100644 index 786f05671..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-inspect-namespace.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --experimental-vm-modules -'use strict'; -const common = require('../common'); -const assert = require('assert'); - -// TODO(wafuwafu13): Implement 'vm' -// const { SourceTextModule } = require('vm'); -const { inspect } = require('util'); - -// (async () => { -// const m = new SourceTextModule('export const a = 1; export var b = 2'); -// await m.link(() => 0); -// assert.strictEqual( -// inspect(m.namespace), -// '[Module: null prototype] { a: <uninitialized>, b: undefined }'); -// await m.evaluate(); -// assert.strictEqual( -// inspect(m.namespace), -// '[Module: null prototype] { a: 1, b: 2 }' -// ); -// })().then(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-util-inspect-proxy.js b/cli/tests/node_compat/test/parallel/test-util-inspect-proxy.js deleted file mode 100644 index ef78ab07a..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-inspect-proxy.js +++ /dev/null @@ -1,172 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --expose-internals -'use strict'; - -require('../common'); -const assert = require('assert'); -const util = require('util'); -// TODO(wafuwafu13): Implement 'internal/test/binding' -// const { internalBinding } = require('internal/test/binding'); -// const processUtil = internalBinding('util'); -const opts = { showProxy: true }; - -// let proxyObj; -// let called = false; -// const target = { -// [util.inspect.custom](depth, { showProxy }) { -// if (showProxy === false) { -// called = true; -// if (proxyObj !== this) { -// throw new Error('Failed'); -// } -// } -// return [1, 2, 3]; -// } -// }; - -// // TODO(wafuwafu13): Fix Uncaught Error -// const handler = { -// getPrototypeOf() { throw new Error('getPrototypeOf'); }, -// setPrototypeOf() { throw new Error('setPrototypeOf'); }, -// isExtensible() { throw new Error('isExtensible'); }, -// preventExtensions() { throw new Error('preventExtensions'); }, -// getOwnPropertyDescriptor() { throw new Error('getOwnPropertyDescriptor'); }, -// defineProperty() { throw new Error('defineProperty'); }, -// has() { throw new Error('has'); }, -// get() { throw new Error('get'); }, -// set() { throw new Error('set'); }, -// deleteProperty() { throw new Error('deleteProperty'); }, -// ownKeys() { throw new Error('ownKeys'); }, -// apply() { throw new Error('apply'); }, -// construct() { throw new Error('construct'); } -// }; -// proxyObj = new Proxy(target, handler); - -// // Inspecting the proxy should not actually walk it's properties -// util.inspect(proxyObj, opts); - -// // Make sure inspecting object does not trigger any proxy traps. -// util.format('%s', proxyObj); - -// TODO(wafuwafu13): Implement processUtil -// // getProxyDetails is an internal method, not intended for public use. -// // This is here to test that the internals are working correctly. -// let details = processUtil.getProxyDetails(proxyObj, true); -// assert.strictEqual(target, details[0]); -// assert.strictEqual(handler, details[1]); - -// details = processUtil.getProxyDetails(proxyObj); -// assert.strictEqual(target, details[0]); -// assert.strictEqual(handler, details[1]); - -// details = processUtil.getProxyDetails(proxyObj, false); -// assert.strictEqual(target, details); - -// assert.strictEqual( -// util.inspect(proxyObj, opts), -// 'Proxy [\n' + -// ' [ 1, 2, 3 ],\n' + -// ' {\n' + -// ' getPrototypeOf: [Function: getPrototypeOf],\n' + -// ' setPrototypeOf: [Function: setPrototypeOf],\n' + -// ' isExtensible: [Function: isExtensible],\n' + -// ' preventExtensions: [Function: preventExtensions],\n' + -// ' getOwnPropertyDescriptor: [Function: getOwnPropertyDescriptor],\n' + -// ' defineProperty: [Function: defineProperty],\n' + -// ' has: [Function: has],\n' + -// ' get: [Function: get],\n' + -// ' set: [Function: set],\n' + -// ' deleteProperty: [Function: deleteProperty],\n' + -// ' ownKeys: [Function: ownKeys],\n' + -// ' apply: [Function: apply],\n' + -// ' construct: [Function: construct]\n' + -// ' }\n' + -// ']' -// ); - -// TODO(wafuwafu13): Implement processUtil -// // Using getProxyDetails with non-proxy returns undefined -// assert.strictEqual(processUtil.getProxyDetails({}), undefined); - -// // Inspecting a proxy without the showProxy option set to true should not -// // trigger any proxy handlers. -// assert.strictEqual(util.inspect(proxyObj), '[ 1, 2, 3 ]'); -// assert(called); - -// Yo dawg, I heard you liked Proxy so I put a Proxy -// inside your Proxy that proxies your Proxy's Proxy. -const proxy1 = new Proxy({}, {}); -const proxy2 = new Proxy(proxy1, {}); -const proxy3 = new Proxy(proxy2, proxy1); -const proxy4 = new Proxy(proxy1, proxy2); -const proxy5 = new Proxy(proxy3, proxy4); -const proxy6 = new Proxy(proxy5, proxy5); -const expected0 = '{}'; -const expected1 = 'Proxy [ {}, {} ]'; -const expected2 = 'Proxy [ Proxy [ {}, {} ], {} ]'; -const expected3 = 'Proxy [ Proxy [ Proxy [ {}, {} ], {} ], Proxy [ {}, {} ] ]'; -const expected4 = 'Proxy [ Proxy [ {}, {} ], Proxy [ Proxy [ {}, {} ], {} ] ]'; -const expected5 = 'Proxy [\n ' + - 'Proxy [ Proxy [ Proxy [Array], {} ], Proxy [ {}, {} ] ],\n' + - ' Proxy [ Proxy [ {}, {} ], Proxy [ Proxy [Array], {} ] ]' + - '\n]'; -const expected6 = 'Proxy [\n' + - ' Proxy [\n' + - ' Proxy [ Proxy [Array], Proxy [Array] ],\n' + - ' Proxy [ Proxy [Array], Proxy [Array] ]\n' + - ' ],\n' + - ' Proxy [\n' + - ' Proxy [ Proxy [Array], Proxy [Array] ],\n' + - ' Proxy [ Proxy [Array], Proxy [Array] ]\n' + - ' ]\n' + - ']'; -// assert.strictEqual( -// util.inspect(proxy1, { showProxy: 1, depth: null }), -// expected1); -// assert.strictEqual(util.inspect(proxy2, opts), expected2); -// assert.strictEqual(util.inspect(proxy3, opts), expected3); -// assert.strictEqual(util.inspect(proxy4, opts), expected4); -// assert.strictEqual(util.inspect(proxy5, opts), expected5); -// assert.strictEqual(util.inspect(proxy6, opts), expected6); -// assert.strictEqual(util.inspect(proxy1), expected0); -// assert.strictEqual(util.inspect(proxy2), expected0); -// assert.strictEqual(util.inspect(proxy3), expected0); -// assert.strictEqual(util.inspect(proxy4), expected0); -// assert.strictEqual(util.inspect(proxy5), expected0); -// assert.strictEqual(util.inspect(proxy6), expected0); - -// // Just for fun, let's create a Proxy using Arrays. -// const proxy7 = new Proxy([], []); -// const expected7 = 'Proxy [ [], [] ]'; -// assert.strictEqual(util.inspect(proxy7, opts), expected7); -// assert.strictEqual(util.inspect(proxy7), '[]'); - -// // Now we're just getting silly, right? -// const proxy8 = new Proxy(Date, []); -// const proxy9 = new Proxy(Date, String); -// const expected8 = 'Proxy [ [Function: Date], [] ]'; -// const expected9 = 'Proxy [ [Function: Date], [Function: String] ]'; -// assert.strictEqual(util.inspect(proxy8, opts), expected8); -// assert.strictEqual(util.inspect(proxy9, opts), expected9); -// assert.strictEqual(util.inspect(proxy8), '[Function: Date]'); -// assert.strictEqual(util.inspect(proxy9), '[Function: Date]'); - -// const proxy10 = new Proxy(() => {}, {}); -// const proxy11 = new Proxy(() => {}, { -// get() { -// return proxy11; -// }, -// apply() { -// return proxy11; -// } -// }); -// const expected10 = '[Function (anonymous)]'; -// const expected11 = '[Function (anonymous)]'; -// assert.strictEqual(util.inspect(proxy10), expected10); -// assert.strictEqual(util.inspect(proxy11), expected11); diff --git a/cli/tests/node_compat/test/parallel/test-util-inspect.js b/cli/tests/node_compat/test/parallel/test-util-inspect.js deleted file mode 100644 index 17fafed2e..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-inspect.js +++ /dev/null @@ -1,3201 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --expose-internals -// 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'); -// TODO(wafuwafu13): Implement 'internal/test/binding' -// const { internalBinding } = require('internal/test/binding'); -// const JSStream = internalBinding('js_stream').JSStream; -const util = require('util'); -const vm = require('vm'); -// TODO(wafuwafu13): Implement 'v8' -// const v8 = require('v8'); -// TODO(wafuwafu13): Implement 'internal/test/binding' -// const { previewEntries } = internalBinding('util'); -const { inspect } = util; -// TODO(wafuwafu13): Implement MessageChannel -// const { MessageChannel } = require('worker_threads'); - -assert.strictEqual(util.inspect(1), '1'); -assert.strictEqual(util.inspect(false), 'false'); -assert.strictEqual(util.inspect(''), "''"); -assert.strictEqual(util.inspect('hello'), "'hello'"); -assert.strictEqual(util.inspect(function abc() {}), '[Function: abc]'); -assert.strictEqual(util.inspect(() => {}), '[Function (anonymous)]'); -assert.strictEqual( - util.inspect(async function() {}), - '[AsyncFunction (anonymous)]' -); -assert.strictEqual(util.inspect(async () => {}), '[AsyncFunction (anonymous)]'); - -// Special function inspection. -{ - const fn = (() => function*() {})(); - assert.strictEqual( - util.inspect(fn), - '[GeneratorFunction (anonymous)]' - ); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(async function* abc() {}), - // '[AsyncGeneratorFunction: abc]' - // ); - Object.setPrototypeOf(fn, Object.getPrototypeOf(async () => {})); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(fn), - // '[GeneratorFunction (anonymous)] AsyncFunction' - // ); - Object.defineProperty(fn, 'name', { value: 5, configurable: true }); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(fn), - // '[GeneratorFunction: 5] AsyncFunction' - // ); - Object.defineProperty(fn, Symbol.toStringTag, { - value: 'Foobar', - configurable: true - }); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect({ ['5']: fn }), - // "{ '5': [GeneratorFunction: 5] AsyncFunction [Foobar] }" - // ); - Object.defineProperty(fn, 'name', { value: '5', configurable: true }); - Object.setPrototypeOf(fn, null); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(fn), - // '[GeneratorFunction (null prototype): 5] [Foobar]' - // ); - // assert.strictEqual( - // util.inspect({ ['5']: fn }), - // "{ '5': [GeneratorFunction (null prototype): 5] [Foobar] }" - // ); -} - -assert.strictEqual(util.inspect(undefined), 'undefined'); -assert.strictEqual(util.inspect(null), 'null'); -assert.strictEqual(util.inspect(/foo(bar\n)?/gi), '/foo(bar\\n)?/gi'); -assert.strictEqual( - util.inspect(new Date('Sun, 14 Feb 2010 11:48:40 GMT')), - new Date('2010-02-14T12:48:40+01:00').toISOString() -); -assert.strictEqual(util.inspect(new Date('')), (new Date('')).toString()); -assert.strictEqual(util.inspect('\n\x01'), "'\\n\\x01'"); -// TODO(@crowlKats) -//assert.strictEqual( -// util.inspect(`${Array(75).fill(1)}'\n\x1d\n\x03\x85\x7f\x7e\x9f\xa0`), -// // eslint-disable-next-line no-irregular-whitespace -// `"${Array(75).fill(1)}'\\n" +\n '\\x1D\\n' +\n '\\x03\\x85\\x7F~\\x9F '` -//); -assert.strictEqual(util.inspect([]), '[]'); -assert.strictEqual(util.inspect(Object.create([])), 'Array {}'); -assert.strictEqual(util.inspect([1, 2]), '[ 1, 2 ]'); -assert.strictEqual(util.inspect([1, [2, 3]]), '[ 1, [ 2, 3 ] ]'); -assert.strictEqual(util.inspect({}), '{}'); -assert.strictEqual(util.inspect({ a: 1 }), '{ a: 1 }'); -assert.strictEqual(util.inspect({ a: function() {} }), '{ a: [Function: a] }'); -assert.strictEqual(util.inspect({ a: () => {} }), '{ a: [Function: a] }'); -// eslint-disable-next-line func-name-matching -assert.strictEqual(util.inspect({ a: async function abc() {} }), - '{ a: [AsyncFunction: abc] }'); -assert.strictEqual(util.inspect({ a: async () => {} }), - '{ a: [AsyncFunction: a] }'); -assert.strictEqual(util.inspect({ a: function*() {} }), - '{ a: [GeneratorFunction: a] }'); -assert.strictEqual(util.inspect({ a: 1, b: 2 }), '{ a: 1, b: 2 }'); -assert.strictEqual(util.inspect({ 'a': {} }), '{ a: {} }'); -assert.strictEqual(util.inspect({ 'a': { 'b': 2 } }), '{ a: { b: 2 } }'); -assert.strictEqual(util.inspect({ 'a': { 'b': { 'c': { 'd': 2 } } } }), - '{ a: { b: { c: [Object] } } }'); -assert.strictEqual( - util.inspect({ 'a': { 'b': { 'c': { 'd': 2 } } } }, false, null), - '{\n a: { b: { c: { d: 2 } } }\n}'); -// TODO(wafuwafu13): Fix -// assert.strictEqual(util.inspect([1, 2, 3], true), '[ 1, 2, 3, [length]: 3 ]'); -assert.strictEqual(util.inspect({ 'a': { 'b': { 'c': 2 } } }, false, 0), - '{ a: [Object] }'); -assert.strictEqual(util.inspect({ 'a': { 'b': { 'c': 2 } } }, false, 1), - '{ a: { b: [Object] } }'); -assert.strictEqual(util.inspect({ 'a': { 'b': ['c'] } }, false, 1), - '{ a: { b: [Array] } }'); -// TODO(wafuwafu13): Fix -// assert.strictEqual(util.inspect(new Uint8Array(0)), 'Uint8Array(0) []'); -// assert(inspect(new Uint8Array(0), { showHidden: true }).includes('[buffer]')); -assert.strictEqual( - util.inspect( - Object.create( - {}, - { visible: { value: 1, enumerable: true }, hidden: { value: 2 } } - ) - ), - '{ visible: 1 }' -); -// TODO(wafuwafu13): Fix -// assert.strictEqual( -// util.inspect( -// Object.assign(new String('hello'), { [Symbol('foo')]: 123 }), -// { showHidden: true } -// ), -// "[String: 'hello'] { [length]: 5, [Symbol(foo)]: 123 }" -// ); - -// TODO(wafuwafu13): Implement JSStream -// assert.match(util.inspect((new JSStream())._externalStream), -// /^\[External: [0-9a-f]+\]$/); - -{ - const regexp = /regexp/; - regexp.aprop = 42; - assert.strictEqual(util.inspect({ a: regexp }, false, 0), '{ a: /regexp/ }'); -} - -assert.match( - util.inspect({ a: { a: { a: { a: {} } } } }, undefined, undefined, true), - /Object/ -); -assert.doesNotMatch( - util.inspect({ a: { a: { a: { a: {} } } } }, undefined, null, true), - /Object/ -); - -// TODO(wafuwafu13): Fix -// { -// const showHidden = true; -// const ab = new Uint8Array([1, 2, 3, 4]).buffer; -// const dv = new DataView(ab, 1, 2); -// assert.strictEqual( -// util.inspect(ab, showHidden), -// 'ArrayBuffer { [Uint8Contents]: <01 02 03 04>, byteLength: 4 }' -// ); -// assert.strictEqual(util.inspect(new DataView(ab, 1, 2), showHidden), -// 'DataView {\n' + -// ' byteLength: 2,\n' + -// ' byteOffset: 1,\n' + -// ' buffer: ArrayBuffer {' + -// ' [Uint8Contents]: <01 02 03 04>, byteLength: 4 }\n}'); -// assert.strictEqual( -// util.inspect(ab, showHidden), -// 'ArrayBuffer { [Uint8Contents]: <01 02 03 04>, byteLength: 4 }' -// ); -// assert.strictEqual(util.inspect(dv, showHidden), -// 'DataView {\n' + -// ' byteLength: 2,\n' + -// ' byteOffset: 1,\n' + -// ' buffer: ArrayBuffer { [Uint8Contents]: ' + -// '<01 02 03 04>, byteLength: 4 }\n}'); -// ab.x = 42; -// dv.y = 1337; -// assert.strictEqual(util.inspect(ab, showHidden), -// 'ArrayBuffer { [Uint8Contents]: <01 02 03 04>, ' + -// 'byteLength: 4, x: 42 }'); -// assert.strictEqual(util.inspect(dv, showHidden), -// 'DataView {\n' + -// ' byteLength: 2,\n' + -// ' byteOffset: 1,\n' + -// ' buffer: ArrayBuffer { [Uint8Contents]: <01 02 03 04>,' + -// ' byteLength: 4, x: 42 },\n' + -// ' y: 1337\n}'); -// } - -// TODO(wafuwafu13): Implement `MessageChannel` -// { -// const ab = new ArrayBuffer(42); -// assert.strictEqual(ab.byteLength, 42); -// new MessageChannel().port1.postMessage(ab, [ ab ]); -// assert.strictEqual(ab.byteLength, 0); -// assert.strictEqual(util.inspect(ab), -// 'ArrayBuffer { (detached), byteLength: 0 }'); -// } - -// TODO(wafuwafu13): Fix -// // Truncate output for ArrayBuffers using plural or singular bytes -// { -// const ab = new ArrayBuffer(3); -// assert.strictEqual(util.inspect(ab, { showHidden: true, maxArrayLength: 2 }), -// 'ArrayBuffer { [Uint8Contents]' + -// ': <00 00 ... 1 more byte>, byteLength: 3 }'); -// assert.strictEqual(util.inspect(ab, { showHidden: true, maxArrayLength: 1 }), -// 'ArrayBuffer { [Uint8Contents]' + -// ': <00 ... 2 more bytes>, byteLength: 3 }'); -// } - -// TODO(wafuwafu13): Implement 'vm' -// // Now do the same checks but from a different context. -// { -// const showHidden = false; -// const ab = vm.runInNewContext('new ArrayBuffer(4)'); -// const dv = vm.runInNewContext('new DataView(ab, 1, 2)', { ab }); -// assert.strictEqual( -// util.inspect(ab, showHidden), -// 'ArrayBuffer { [Uint8Contents]: <00 00 00 00>, byteLength: 4 }' -// ); -// assert.strictEqual(util.inspect(new DataView(ab, 1, 2), showHidden), -// 'DataView {\n' + -// ' byteLength: 2,\n' + -// ' byteOffset: 1,\n' + -// ' buffer: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + -// ' byteLength: 4 }\n}'); -// assert.strictEqual( -// util.inspect(ab, showHidden), -// 'ArrayBuffer { [Uint8Contents]: <00 00 00 00>, byteLength: 4 }' -// ); -// assert.strictEqual(util.inspect(dv, showHidden), -// 'DataView {\n' + -// ' byteLength: 2,\n' + -// ' byteOffset: 1,\n' + -// ' buffer: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + -// ' byteLength: 4 }\n}'); -// ab.x = 42; -// dv.y = 1337; -// assert.strictEqual(util.inspect(ab, showHidden), -// 'ArrayBuffer { [Uint8Contents]: <00 00 00 00>, ' + -// 'byteLength: 4, x: 42 }'); -// assert.strictEqual(util.inspect(dv, showHidden), -// 'DataView {\n' + -// ' byteLength: 2,\n' + -// ' byteOffset: 1,\n' + -// ' buffer: ArrayBuffer { [Uint8Contents]: <00 00 00 00>,' + -// ' byteLength: 4, x: 42 },\n' + -// ' y: 1337\n}'); -// } - -// TODO(wafuwafu13): Fix -// [ Float32Array, -// Float64Array, -// Int16Array, -// Int32Array, -// Int8Array, -// Uint16Array, -// Uint32Array, -// Uint8Array, -// Uint8ClampedArray ].forEach((constructor) => { -// const length = 2; -// const byteLength = length * constructor.BYTES_PER_ELEMENT; -// const array = new constructor(new ArrayBuffer(byteLength), 0, length); -// array[0] = 65; -// array[1] = 97; -// assert.strictEqual( -// util.inspect(array, { showHidden: true }), -// `${constructor.name}(${length}) [\n` + -// ' 65,\n' + -// ' 97,\n' + -// ` [BYTES_PER_ELEMENT]: ${constructor.BYTES_PER_ELEMENT},\n` + -// ` [length]: ${length},\n` + -// ` [byteLength]: ${byteLength},\n` + -// ' [byteOffset]: 0,\n' + -// ` [buffer]: ArrayBuffer { byteLength: ${byteLength} }\n]`); -// assert.strictEqual( -// util.inspect(array, false), -// `${constructor.name}(${length}) [ 65, 97 ]` -// ); -// }); - -// TODO(wafuwafu13): Implement 'vm' -// // Now check that declaring a TypedArray in a different context works the same. -// [ Float32Array, -// Float64Array, -// Int16Array, -// Int32Array, -// Int8Array, -// Uint16Array, -// Uint32Array, -// Uint8Array, -// Uint8ClampedArray ].forEach((constructor) => { -// const length = 2; -// const byteLength = length * constructor.BYTES_PER_ELEMENT; -// const array = vm.runInNewContext( -// 'new constructor(new ArrayBuffer(byteLength), 0, length)', -// { constructor, byteLength, length } -// ); -// array[0] = 65; -// array[1] = 97; -// assert.strictEqual( -// util.inspect(array, true), -// `${constructor.name}(${length}) [\n` + -// ' 65,\n' + -// ' 97,\n' + -// ` [BYTES_PER_ELEMENT]: ${constructor.BYTES_PER_ELEMENT},\n` + -// ` [length]: ${length},\n` + -// ` [byteLength]: ${byteLength},\n` + -// ' [byteOffset]: 0,\n' + -// ` [buffer]: ArrayBuffer { byteLength: ${byteLength} }\n]`); -// assert.strictEqual( -// util.inspect(array, false), -// `${constructor.name}(${length}) [ 65, 97 ]` -// ); -// }); - -// TODO(wafuwafu13): Fix -// { -// const brokenLength = new Float32Array(2); -// Object.defineProperty(brokenLength, 'length', { value: -1 }); -// assert.strictEqual(inspect(brokenLength), 'Float32Array(2) [ 0n, 0n ]'); -// } - -assert.strictEqual( - util.inspect(Object.create({}, { - visible: { value: 1, enumerable: true }, - hidden: { value: 2 } - }), { showHidden: true }), - '{ visible: 1, [hidden]: 2 }' -); -// Objects without prototype. -assert.strictEqual( - util.inspect(Object.create(null, { - name: { value: 'Tim', enumerable: true }, - hidden: { value: 'secret' } - }), { showHidden: true }), - "[Object: null prototype] { name: 'Tim', [hidden]: 'secret' }" -); - -assert.strictEqual( - util.inspect(Object.create(null, { - name: { value: 'Tim', enumerable: true }, - hidden: { value: 'secret' } - })), - "[Object: null prototype] { name: 'Tim' }" -); - -// Dynamic properties. -{ - assert.strictEqual( - util.inspect({ get readonly() { return 1; } }), - '{ readonly: [Getter] }'); - - assert.strictEqual( - util.inspect({ get readwrite() { return 1; }, set readwrite(val) {} }), - '{ readwrite: [Getter/Setter] }'); - - assert.strictEqual( - // eslint-disable-next-line accessor-pairs - util.inspect({ set writeonly(val) {} }), - '{ writeonly: [Setter] }'); - - const value = {}; - value.a = value; - assert.strictEqual(util.inspect(value), '<ref *1> { a: [Circular *1] }'); - const getterFn = { - get one() { - return null; - } - }; - assert.strictEqual( - util.inspect(getterFn, { getters: true }), - '{ one: [Getter: null] }' - ); -} - -// TODO(wafuwafu13): Fix -// // Array with dynamic properties. -// { -// const value = [1, 2, 3]; -// Object.defineProperty( -// value, -// 'growingLength', -// { -// enumerable: true, -// get: function() { this.push(true); return this.length; } -// } -// ); -// Object.defineProperty( -// value, -// '-1', -// { -// enumerable: true, -// value: -1 -// } -// ); -// assert.strictEqual(util.inspect(value), -// "[ 1, 2, 3, growingLength: [Getter], '-1': -1 ]"); -// } - -// Array with inherited number properties. -{ - class CustomArray extends Array {} - CustomArray.prototype[5] = 'foo'; - CustomArray.prototype[49] = 'bar'; - CustomArray.prototype.foo = true; - const arr = new CustomArray(50); - arr[49] = 'I win'; - assert.strictEqual( - util.inspect(arr), - "CustomArray(50) [ <49 empty items>, 'I win' ]" - ); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(arr, { showHidden: true }), - // 'CustomArray(50) [\n' + - // ' <49 empty items>,\n' + - // " 'I win',\n" + - // ' [length]: 50,\n' + - // " '5': 'foo',\n" + - // ' foo: true\n' + - // ']' - // ); -} - -// TODO(wafuwafu13): Fix -// // Array with extra properties. -// { -// const arr = [1, 2, 3, , ]; -// arr.foo = 'bar'; -// assert.strictEqual(util.inspect(arr), -// "[ 1, 2, 3, <1 empty item>, foo: 'bar' ]"); - -// const arr2 = []; -// assert.strictEqual(util.inspect([], { showHidden: true }), '[ [length]: 0 ]'); -// arr2['00'] = 1; -// assert.strictEqual(util.inspect(arr2), "[ '00': 1 ]"); -// assert.strictEqual(util.inspect(arr2, { showHidden: true }), -// "[ [length]: 0, '00': 1 ]"); -// arr2[1] = 0; -// assert.strictEqual(util.inspect(arr2), "[ <1 empty item>, 0, '00': 1 ]"); -// assert.strictEqual(util.inspect(arr2, { showHidden: true }), -// "[ <1 empty item>, 0, [length]: 2, '00': 1 ]"); -// delete arr2[1]; -// assert.strictEqual(util.inspect(arr2), "[ <2 empty items>, '00': 1 ]"); -// assert.strictEqual(util.inspect(arr2, { showHidden: true }), -// "[ <2 empty items>, [length]: 2, '00': 1 ]"); -// arr2['01'] = 2; -// assert.strictEqual(util.inspect(arr2), -// "[ <2 empty items>, '00': 1, '01': 2 ]"); -// assert.strictEqual(util.inspect(arr2, { showHidden: true }), -// "[ <2 empty items>, [length]: 2, '00': 1, '01': 2 ]"); -// delete arr2['00']; -// arr2[0] = 0; -// assert.strictEqual(util.inspect(arr2), -// "[ 0, <1 empty item>, '01': 2 ]"); -// assert.strictEqual(util.inspect(arr2, { showHidden: true }), -// "[ 0, <1 empty item>, [length]: 2, '01': 2 ]"); -// delete arr2['01']; -// arr2[2 ** 32 - 2] = 'max'; -// arr2[2 ** 32 - 1] = 'too far'; -// assert.strictEqual( -// util.inspect(arr2), -// "[ 0, <4294967293 empty items>, 'max', '4294967295': 'too far' ]" -// ); - -// const arr3 = []; -// arr3[-1] = -1; -// assert.strictEqual(util.inspect(arr3), "[ '-1': -1 ]"); -// } - -// TODO(wafuwafu13): Fix -// // Indices out of bounds. -// { -// const arr = []; -// arr[2 ** 32] = true; // Not a valid array index. -// assert.strictEqual(util.inspect(arr), "[ '4294967296': true ]"); -// arr[0] = true; -// arr[10] = true; -// assert.strictEqual(util.inspect(arr), -// "[ true, <9 empty items>, true, '4294967296': true ]"); -// arr[2 ** 32 - 2] = true; -// arr[2 ** 32 - 1] = true; -// arr[2 ** 32 + 1] = true; -// delete arr[0]; -// delete arr[10]; -// assert.strictEqual(util.inspect(arr), -// ['[', -// '<4294967294 empty items>,', -// 'true,', -// "'4294967296': true,", -// "'4294967295': true,", -// "'4294967297': true\n]", -// ].join('\n ')); -// } - -// Function with properties. -{ - const value = () => {}; - value.aprop = 42; - assert.strictEqual(util.inspect(value), '[Function: value] { aprop: 42 }'); -} - -// Anonymous function with properties. -{ - const value = (() => function() {})(); - value.aprop = 42; - assert.strictEqual( - util.inspect(value), - '[Function (anonymous)] { aprop: 42 }' - ); -} - -// Regular expressions with properties. -{ - const value = /123/ig; - value.aprop = 42; - assert.strictEqual(util.inspect(value), '/123/gi { aprop: 42 }'); -} - -// Dates with properties. -{ - const value = new Date('Sun, 14 Feb 2010 11:48:40 GMT'); - value.aprop = 42; - assert.strictEqual(util.inspect(value), - '2010-02-14T11:48:40.000Z { aprop: 42 }'); -} - -// Test the internal isDate implementation. -{ - const Date2 = vm.runInNewContext('Date'); - const d = new Date2(); - const orig = util.inspect(d); - Date2.prototype.foo = 'bar'; - const after = util.inspect(d); - assert.strictEqual(orig, after); -} - -// Test positive/negative zero. -assert.strictEqual(util.inspect(0), '0'); -assert.strictEqual(util.inspect(-0), '-0'); -// Edge case from check. -assert.strictEqual(util.inspect(-5e-324), '-5e-324'); - -// Test for sparse array. -{ - const a = ['foo', 'bar', 'baz']; - assert.strictEqual(util.inspect(a), "[ 'foo', 'bar', 'baz' ]"); - delete a[1]; - assert.strictEqual(util.inspect(a), "[ 'foo', <1 empty item>, 'baz' ]"); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(a, true), - // "[ 'foo', <1 empty item>, 'baz', [length]: 3 ]" - // ); - assert.strictEqual(util.inspect(new Array(5)), '[ <5 empty items> ]'); - a[3] = 'bar'; - a[100] = 'qux'; - assert.strictEqual( - util.inspect(a, { breakLength: Infinity }), - "[ 'foo', <1 empty item>, 'baz', 'bar', <96 empty items>, 'qux' ]" - ); - delete a[3]; - assert.strictEqual( - util.inspect(a, { maxArrayLength: 4 }), - "[ 'foo', <1 empty item>, 'baz', <97 empty items>, ... 1 more item ]" - ); - // test 4 special case - assert.strictEqual(util.inspect(a, { - maxArrayLength: 2 - }), "[ 'foo', <1 empty item>, ... 99 more items ]"); -} - -// TODO(wafuwafu13): Implement `previewEntries` -// Test for Array constructor in different context. -// { -// const map = new Map(); -// map.set(1, 2); -// // Passing only a single argument to indicate a set iterator. -// const valsSetIterator = previewEntries(map.entries()); -// // Passing through true to indicate a map iterator. -// const valsMapIterEntries = previewEntries(map.entries(), true); -// const valsMapIterKeys = previewEntries(map.keys(), true); - -// assert.strictEqual(util.inspect(valsSetIterator), '[ 1, 2 ]'); -// assert.strictEqual(util.inspect(valsMapIterEntries), '[ [ 1, 2 ], true ]'); -// assert.strictEqual(util.inspect(valsMapIterKeys), '[ [ 1 ], false ]'); -// } - -// TODO(wafuwafu13): Implement 'vm' -// // Test for other constructors in different context. -// { -// let obj = vm.runInNewContext('(function(){return {}})()', {}); -// assert.strictEqual(util.inspect(obj), '{}'); -// obj = vm.runInNewContext('const m=new Map();m.set(1,2);m', {}); -// assert.strictEqual(util.inspect(obj), 'Map(1) { 1 => 2 }'); -// obj = vm.runInNewContext('const s=new Set();s.add(1);s.add(2);s', {}); -// assert.strictEqual(util.inspect(obj), 'Set(2) { 1, 2 }'); -// obj = vm.runInNewContext('fn=function(){};new Promise(fn,fn)', {}); -// assert.strictEqual(util.inspect(obj), 'Promise { <pending> }'); -// } - -// Test for property descriptors. -{ - const getter = Object.create(null, { - a: { - get: function() { return 'aaa'; } - } - }); - const setter = Object.create(null, { - b: { // eslint-disable-line accessor-pairs - set: function() {} - } - }); - const getterAndSetter = Object.create(null, { - c: { - get: function() { return 'ccc'; }, - set: function() {} - } - }); - assert.strictEqual( - util.inspect(getter, true), - '[Object: null prototype] { [a]: [Getter] }' - ); - assert.strictEqual( - util.inspect(setter, true), - '[Object: null prototype] { [b]: [Setter] }' - ); - assert.strictEqual( - util.inspect(getterAndSetter, true), - '[Object: null prototype] { [c]: [Getter/Setter] }' - ); -} - -// Exceptions should print the error message, not '{}'. -{ - [ - new Error(), - new Error('FAIL'), - new TypeError('FAIL'), - new SyntaxError('FAIL'), - ].forEach((err) => { - assert.strictEqual(util.inspect(err), err.stack); - }); - assert.throws( - () => undef(), // eslint-disable-line no-undef - (e) => { - assert.strictEqual(util.inspect(e), e.stack); - return true; - } - ); - - const ex = util.inspect(new Error('FAIL'), true); - assert(ex.includes('Error: FAIL')); - assert(ex.includes('[stack]')); - assert(ex.includes('[message]')); -} - -{ - const tmp = Error.stackTraceLimit; - Error.stackTraceLimit = 0; - const err = new Error('foo'); - const err2 = new Error('foo\nbar'); - assert.strictEqual(util.inspect(err, { compact: true }), '[Error: foo]'); - assert(err.stack); - delete err.stack; - assert(!err.stack); - assert.strictEqual(util.inspect(err, { compact: true }), '[Error: foo]'); - assert.strictEqual( - util.inspect(err2, { compact: true }), - '[Error: foo\nbar]' - ); - - err.bar = true; - err2.bar = true; - - assert.strictEqual( - util.inspect(err, { compact: true }), - '{ [Error: foo] bar: true }' - ); - assert.strictEqual( - util.inspect(err2, { compact: true }), - '{ [Error: foo\nbar]\n bar: true }' - ); - assert.strictEqual( - util.inspect(err, { compact: true, breakLength: 5 }), - '{ [Error: foo]\n bar: true }' - ); - assert.strictEqual( - util.inspect(err, { compact: true, breakLength: 1 }), - '{ [Error: foo]\n bar:\n true }' - ); - assert.strictEqual( - util.inspect(err2, { compact: true, breakLength: 5 }), - '{ [Error: foo\nbar]\n bar: true }' - ); - assert.strictEqual( - util.inspect(err, { compact: false }), - '[Error: foo] {\n bar: true\n}' - ); - assert.strictEqual( - util.inspect(err2, { compact: false }), - '[Error: foo\nbar] {\n bar: true\n}' - ); - - Error.stackTraceLimit = tmp; -} - -// TODO(wafuwafu13): Fix -// // Prevent enumerable error properties from being printed. -// { -// let err = new Error(); -// err.message = 'foobar'; -// let out = util.inspect(err).split('\n'); -// assert.strictEqual(out[0], 'Error: foobar'); -// assert(out[out.length - 1].startsWith(' at ')); -// // Reset the error, the stack is otherwise not recreated. -// err = new Error(); -// err.message = 'foobar'; -// err.name = 'Unique'; -// Object.defineProperty(err, 'stack', { value: err.stack, enumerable: true }); -// out = util.inspect(err).split('\n'); -// assert.strictEqual(out[0], 'Unique: foobar'); -// assert(out[out.length - 1].startsWith(' at ')); -// err.name = 'Baz'; -// out = util.inspect(err).split('\n'); -// assert.strictEqual(out[0], 'Unique: foobar'); -// assert.strictEqual(out[out.length - 2], " name: 'Baz'"); -// assert.strictEqual(out[out.length - 1], '}'); -// } - -// // Doesn't capture stack trace. -{ - function BadCustomError(msg) { - Error.call(this); - Object.defineProperty(this, 'message', - { value: msg, enumerable: false }); - Object.defineProperty(this, 'name', - { value: 'BadCustomError', enumerable: false }); - } - Object.setPrototypeOf(BadCustomError.prototype, Error.prototype); - Object.setPrototypeOf(BadCustomError, Error); - assert.strictEqual( - util.inspect(new BadCustomError('foo')), - '[BadCustomError: foo]' - ); -} - -// TODO(wafuwafu13): Fix -// // Tampered error stack or name property (different type than string). -// // Note: Symbols are not supported by `Error#toString()` which is called by -// // accessing the `stack` property. -// [ -// [404, '404: foo', '[404]'], -// [0, '0: foo', '[RangeError: foo]'], -// [0n, '0: foo', '[RangeError: foo]'], -// [null, 'null: foo', '[RangeError: foo]'], -// [undefined, 'RangeError: foo', '[RangeError: foo]'], -// [false, 'false: foo', '[RangeError: foo]'], -// ['', 'foo', '[RangeError: foo]'], -// [[1, 2, 3], '1,2,3: foo', '[1,2,3]'], -// ].forEach(([value, outputStart, stack]) => { -// let err = new RangeError('foo'); -// err.name = value; -// assert( -// util.inspect(err).startsWith(outputStart), -// util.format( -// 'The name set to %o did not result in the expected output "%s"', -// value, -// outputStart -// ) -// ); - -// err = new RangeError('foo'); -// err.stack = value; -// assert.strictEqual(util.inspect(err), stack); -// }); - -// https://github.com/nodejs/node-v0.x-archive/issues/1941 -// TODO(@crowlKats) -//assert.strictEqual(util.inspect(Object.create(Date.prototype)), 'Date {}'); - -// https://github.com/nodejs/node-v0.x-archive/issues/1944 -{ - const d = new Date(); - d.toUTCString = null; - util.inspect(d); -} - -// TODO(wafuwafu13): Fix -// // Should not throw. -// { -// const d = new Date(); -// d.toISOString = null; -// util.inspect(d); -// } - -// TODO(wafuwafu13): Fix -// // Should not throw. -// { -// const r = /regexp/; -// r.toString = null; -// util.inspect(r); -// } - -// TODO(wafuwafu13): Fix -// // See https://github.com/nodejs/node-v0.x-archive/issues/2225 -// { -// const x = { [util.inspect.custom]: util.inspect }; -// assert(util.inspect(x).includes( -// '[Symbol(nodejs.util.inspect.custom)]: [Function: inspect] {\n')); -// } - -// TODO(wafuwafu13): Fix -// // `util.inspect` should display the escaped value of a key. -// { -// const w = { -// '\\': 1, -// '\\\\': 2, -// '\\\\\\': 3, -// '\\\\\\\\': 4, -// '\n': 5, -// '\r': 6 -// }; - -// const y = ['a', 'b', 'c']; -// y['\\\\'] = 'd'; -// y['\n'] = 'e'; -// y['\r'] = 'f'; - -// assert.strictEqual( -// util.inspect(w), -// "{ '\\\\': 1, '\\\\\\\\': 2, '\\\\\\\\\\\\': 3, " + -// "'\\\\\\\\\\\\\\\\': 4, '\\n': 5, '\\r': 6 }" -// ); -// assert.strictEqual( -// util.inspect(y), -// "[ 'a', 'b', 'c', '\\\\\\\\': 'd', " + -// "'\\n': 'e', '\\r': 'f' ]" -// ); -// } - -// Test util.inspect.styles and util.inspect.colors. -{ - function testColorStyle(style, input, implicit) { - const colorName = util.inspect.styles[style]; - let color = ['', '']; - if (util.inspect.colors[colorName]) - color = util.inspect.colors[colorName]; - - const withoutColor = util.inspect(input, false, 0, false); - const withColor = util.inspect(input, false, 0, true); - const expect = `\u001b[${color[0]}m${withoutColor}\u001b[${color[1]}m`; - assert.strictEqual( - withColor, - expect, - `util.inspect color for style ${style}`); - } - - testColorStyle('special', function() {}); - testColorStyle('number', 123.456); - testColorStyle('boolean', true); - testColorStyle('undefined', undefined); - testColorStyle('null', null); - testColorStyle('string', 'test string'); - testColorStyle('date', new Date()); - testColorStyle('regexp', /regexp/); -} - -// An object with "hasOwnProperty" overwritten should not throw. -util.inspect({ hasOwnProperty: null }); - -// New API, accepts an "options" object. -{ - const subject = { foo: 'bar', hello: 31, a: { b: { c: { d: 0 } } } }; - Object.defineProperty(subject, 'hidden', { enumerable: false, value: null }); - - assert.strictEqual( - util.inspect(subject, { showHidden: false }).includes('hidden'), - false - ); - assert.strictEqual( - util.inspect(subject, { showHidden: true }).includes('hidden'), - true - ); - assert.strictEqual( - util.inspect(subject, { colors: false }).includes('\u001b[32m'), - false - ); - assert.strictEqual( - util.inspect(subject, { colors: true }).includes('\u001b[32m'), - true - ); - assert.strictEqual( - util.inspect(subject, { depth: 2 }).includes('c: [Object]'), - true - ); - assert.strictEqual( - util.inspect(subject, { depth: 0 }).includes('a: [Object]'), - true - ); - assert.strictEqual( - util.inspect(subject, { depth: null }).includes('{ d: 0 }'), - true - ); - assert.strictEqual( - util.inspect(subject, { depth: undefined }).includes('{ d: 0 }'), - true - ); -} - -{ - // "customInspect" option can enable/disable calling [util.inspect.custom](). - const subject = { [util.inspect.custom]: () => 123 }; - - assert.strictEqual( - util.inspect(subject, { customInspect: true }).includes('123'), - true - ); - assert.strictEqual( - util.inspect(subject, { customInspect: true }).includes('inspect'), - false - ); - assert.strictEqual( - util.inspect(subject, { customInspect: false }).includes('123'), - false - ); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(subject, { customInspect: false }).includes('inspect'), - // true - // ); - - // A custom [util.inspect.custom]() should be able to return other Objects. - subject[util.inspect.custom] = () => ({ foo: 'bar' }); - - assert.strictEqual(util.inspect(subject), "{ foo: 'bar' }"); - - subject[util.inspect.custom] = common.mustCall((depth, opts) => { - const clone = { ...opts }; - // This might change at some point but for now we keep the stylize function. - // The function should either be documented or an alternative should be - // implemented. - assert.strictEqual(typeof opts.stylize, 'function'); - assert.strictEqual(opts.seen, undefined); - assert.strictEqual(opts.budget, undefined); - assert.strictEqual(opts.indentationLvl, undefined); - assert.strictEqual(opts.showHidden, false); - // TODO(@crowlKats) - //assert.deepStrictEqual( - // new Set(Object.keys(util.inspect.defaultOptions).concat(['stylize'])), - // new Set(Object.keys(opts)) - //); - opts.showHidden = true; - return { [util.inspect.custom]: common.mustCall((depth, opts2) => { - assert.deepStrictEqual(clone, opts2); - }) }; - }); - - util.inspect(subject); - - // util.inspect.custom is a shared symbol which can be accessed as - // Symbol.for("nodejs.util.inspect.custom"). - const inspect = Symbol.for('nodejs.util.inspect.custom'); - - subject[inspect] = () => ({ baz: 'quux' }); - - assert.strictEqual(util.inspect(subject), '{ baz: \'quux\' }'); - - subject[inspect] = (depth, opts) => { - assert.strictEqual(opts.customInspectOptions, true); - assert.strictEqual(opts.seen, null); - return {}; - }; - - util.inspect(subject, { customInspectOptions: true, seen: null }); -} - -{ - const subject = { [util.inspect.custom]: common.mustCall((depth, opts) => { - assert.strictEqual(depth, null); - assert.strictEqual(opts.compact, true); - }) }; - util.inspect(subject, { depth: null, compact: true }); -} - -// TODO(wafuwafu13): Fix -// { -// // Returning `this` from a custom inspection function works. -// const subject = { a: 123, [util.inspect.custom]() { return this; } }; -// const UIC = 'nodejs.util.inspect.custom'; -// assert.strictEqual( -// util.inspect(subject), -// `{\n a: 123,\n [Symbol(${UIC})]: [Function: [${UIC}]]\n}` -// ); -// } - -// Verify that it's possible to use the stylize function to manipulate input. -assert.strictEqual( - util.inspect([1, 2, 3], { stylize() { return 'x'; } }), - '[ x, x, x ]' -); - -// Using `util.inspect` with "colors" option should produce as many lines as -// without it. -{ - function testLines(input) { - const countLines = (str) => (str.match(/\n/g) || []).length; - const withoutColor = util.inspect(input); - const withColor = util.inspect(input, { colors: true }); - assert.strictEqual(countLines(withoutColor), countLines(withColor)); - } - - const bigArray = new Array(100).fill().map((value, index) => index); - - testLines([1, 2, 3, 4, 5, 6, 7]); - testLines(bigArray); - testLines({ foo: 'bar', baz: 35, b: { a: 35 } }); - testLines({ a: { a: 3, b: 1, c: 1, d: 1, e: 1, f: 1, g: 1, h: 1 }, b: 1 }); - testLines({ - foo: 'bar', - baz: 35, - b: { a: 35 }, - veryLongKey: 'very long value', - evenLongerKey: ['with even longer value in array'] - }); -} - -// Test boxed primitives output the correct values. -assert.strictEqual(util.inspect(new String('test')), "[String: 'test']"); -assert.strictEqual( - util.inspect(new String('test'), { colors: true }), - "\u001b[32m[String: 'test']\u001b[39m" -); -assert.strictEqual( - util.inspect(Object(Symbol('test'))), - '[Symbol: Symbol(test)]' -); -assert.strictEqual(util.inspect(new Boolean(false)), '[Boolean: false]'); -// TODO(wafuwafu13): Fix -// assert.strictEqual( -// util.inspect(Object.setPrototypeOf(new Boolean(true), null)), -// '[Boolean (null prototype): true]' -// ); -// assert.strictEqual(util.inspect(new Number(0)), '[Number: 0]'); -// assert.strictEqual( -// util.inspect( -// Object.defineProperty( -// Object.setPrototypeOf(new Number(-0), Array.prototype), -// Symbol.toStringTag, -// { value: 'Foobar' } -// ) -// ), -// '[Number (Array): -0] [Foobar]' -// ); -assert.strictEqual(util.inspect(new Number(-1.1)), '[Number: -1.1]'); -assert.strictEqual(util.inspect(new Number(13.37)), '[Number: 13.37]'); - -// Test boxed primitives with own properties. -{ - const str = new String('baz'); - str.foo = 'bar'; - assert.strictEqual(util.inspect(str), "[String: 'baz'] { foo: 'bar' }"); - - const bool = new Boolean(true); - bool.foo = 'bar'; - assert.strictEqual(util.inspect(bool), "[Boolean: true] { foo: 'bar' }"); - - const num = new Number(13.37); - num.foo = 'bar'; - assert.strictEqual(util.inspect(num), "[Number: 13.37] { foo: 'bar' }"); - - const sym = Object(Symbol('foo')); - sym.foo = 'bar'; - assert.strictEqual(util.inspect(sym), "[Symbol: Symbol(foo)] { foo: 'bar' }"); - - const big = Object(BigInt(55)); - big.foo = 'bar'; - assert.strictEqual(util.inspect(big), "[BigInt: 55n] { foo: 'bar' }"); -} - -// Test es6 Symbol. -if (typeof Symbol !== 'undefined') { - assert.strictEqual(util.inspect(Symbol()), 'Symbol()'); - //assert.strictEqual(util.inspect(Symbol(123)), 'Symbol(123)'); - //assert.strictEqual(util.inspect(Symbol('hi')), 'Symbol(hi)'); - assert.strictEqual(util.inspect([Symbol()]), '[ Symbol() ]'); - assert.strictEqual(util.inspect({ foo: Symbol() }), '{ foo: Symbol() }'); - - const options = { showHidden: true }; - let subject = {}; - - subject[Symbol('sym\nbol')] = 42; - - // TODO(wafuwafu13): Fix - // assert.strictEqual(util.inspect(subject), '{ [Symbol(sym\\nbol)]: 42 }'); - // assert.strictEqual( - // util.inspect(subject, options), - // '{ [Symbol(sym\\nbol)]: 42 }' - // ); - - // Object.defineProperty( - // subject, - // Symbol(), - // { enumerable: false, value: 'non-enum' }); - // assert.strictEqual(util.inspect(subject), '{ [Symbol(sym\\nbol)]: 42 }'); - // assert.strictEqual( - // util.inspect(subject, options), - // "{ [Symbol(sym\\nbol)]: 42, [Symbol()]: 'non-enum' }" - // ); - - // subject = [1, 2, 3]; - // subject[Symbol('symbol')] = 42; - - // assert.strictEqual(util.inspect(subject), - // '[ 1, 2, 3, [Symbol(symbol)]: 42 ]'); -} - -// Test Set. -{ - assert.strictEqual(util.inspect(new Set()), 'Set(0) {}'); - // TODO(wafuwafu13): Fix - // assert.strictEqual(util.inspect(new Set([1, 2, 3])), 'Set(3) { 1, 2, 3 }'); - // const set = new Set(['foo']); - // set.bar = 42; - // assert.strictEqual( - // util.inspect(set, { showHidden: true }), - // "Set(1) { 'foo', bar: 42 }" - // ); -} - -// TODO(wafuwafu13): Fix -// // Test circular Set. -// { -// const set = new Set(); -// set.add(set); -// assert.strictEqual(util.inspect(set), '<ref *1> Set(1) { [Circular *1] }'); -// } - -// Test Map. -{ - assert.strictEqual(util.inspect(new Map()), 'Map(0) {}'); - assert.strictEqual(util.inspect(new Map([[1, 'a'], [2, 'b'], [3, 'c']])), - "Map(3) { 1 => 'a', 2 => 'b', 3 => 'c' }"); - const map = new Map([['foo', null]]); - map.bar = 42; - assert.strictEqual(util.inspect(map, true), - "Map(1) { 'foo' => null, bar: 42 }"); -} - -// Test circular Map. -{ - const map = new Map(); - map.set(map, 'map'); - assert.strictEqual( - inspect(map), - "<ref *1> Map(1) { [Circular *1] => 'map' }" - ); - map.set(map, map); - assert.strictEqual( - inspect(map), - '<ref *1> Map(1) { [Circular *1] => [Circular *1] }' - ); - map.delete(map); - map.set('map', map); - assert.strictEqual( - inspect(map), - "<ref *1> Map(1) { 'map' => [Circular *1] }" - ); -} - -// Test multiple circular references. -{ - const obj = {}; - obj.a = [obj]; - obj.b = {}; - obj.b.inner = obj.b; - obj.b.obj = obj; - - assert.strictEqual( - inspect(obj), - '<ref *1> {\n' + - ' a: [ [Circular *1] ],\n' + - ' b: <ref *2> { inner: [Circular *2], obj: [Circular *1] }\n' + - '}' - ); -} - -// TODO(wafuwafu13): Fix -// // Test Promise. -// { -// const resolved = Promise.resolve(3); -// assert.strictEqual(util.inspect(resolved), 'Promise { 3 }'); - -// const rejected = Promise.reject(3); -// assert.strictEqual(util.inspect(rejected), 'Promise { <rejected> 3 }'); -// // Squelch UnhandledPromiseRejection. -// rejected.catch(() => {}); - -// const pending = new Promise(() => {}); -// assert.strictEqual(util.inspect(pending), 'Promise { <pending> }'); - -// const promiseWithProperty = Promise.resolve('foo'); -// promiseWithProperty.bar = 42; -// assert.strictEqual(util.inspect(promiseWithProperty), -// "Promise { 'foo', bar: 42 }"); -// } - -// Make sure it doesn't choke on polyfills. Unlike Set/Map, there is no standard -// interface to synchronously inspect a Promise, so our techniques only work on -// a bonafide native Promise. -{ - const oldPromise = Promise; - global.Promise = function() { this.bar = 42; }; - assert.strictEqual(util.inspect(new Promise()), '{ bar: 42 }'); - global.Promise = oldPromise; -} - -// TODO(wafuwafu13): Fix -// // Test Map iterators. -// { -// const map = new Map([['foo', 'bar']]); -// assert.strictEqual(util.inspect(map.keys()), '[Map Iterator] { \'foo\' }'); -// const mapValues = map.values(); -// Object.defineProperty(mapValues, Symbol.toStringTag, { value: 'Foo' }); -// assert.strictEqual( -// util.inspect(mapValues), -// '[Foo] [Map Iterator] { \'bar\' }' -// ); -// map.set('A', 'B!'); -// assert.strictEqual(util.inspect(map.entries(), { maxArrayLength: 1 }), -// "[Map Entries] { [ 'foo', 'bar' ], ... 1 more item }"); -// // Make sure the iterator doesn't get consumed. -// const keys = map.keys(); -// assert.strictEqual(util.inspect(keys), "[Map Iterator] { 'foo', 'A' }"); -// assert.strictEqual(util.inspect(keys), "[Map Iterator] { 'foo', 'A' }"); -// keys.extra = true; -// assert.strictEqual( -// util.inspect(keys, { maxArrayLength: 0 }), -// '[Map Iterator] { ... 2 more items, extra: true }'); -// } - -// TODO(wafuwafu13): Fix -// // Test Set iterators. -// { -// const aSet = new Set([1]); -// assert.strictEqual(util.inspect(aSet.entries(), { compact: false }), -// '[Set Entries] {\n [\n 1,\n 1\n ]\n}'); -// aSet.add(3); -// assert.strictEqual(util.inspect(aSet.keys()), '[Set Iterator] { 1, 3 }'); -// assert.strictEqual(util.inspect(aSet.values()), '[Set Iterator] { 1, 3 }'); -// const setEntries = aSet.entries(); -// Object.defineProperty(setEntries, Symbol.toStringTag, { value: 'Foo' }); -// assert.strictEqual(util.inspect(setEntries), -// '[Foo] [Set Entries] { [ 1, 1 ], [ 3, 3 ] }'); -// // Make sure the iterator doesn't get consumed. -// const keys = aSet.keys(); -// Object.defineProperty(keys, Symbol.toStringTag, { value: null }); -// assert.strictEqual(util.inspect(keys), '[Set Iterator] { 1, 3 }'); -// assert.strictEqual(util.inspect(keys), '[Set Iterator] { 1, 3 }'); -// keys.extra = true; -// assert.strictEqual( -// util.inspect(keys, { maxArrayLength: 1 }), -// '[Set Iterator] { 1, ... 1 more item, extra: true }'); -// } - -// Minimal inspection should still return as much information as possible about -// the constructor and Symbol.toStringTag. -{ - class Foo { - get [Symbol.toStringTag]() { - return 'ABC'; - } - } - const a = new Foo(); - assert.strictEqual(inspect(a, { depth: -1 }), 'Foo [ABC] {}'); - a.foo = true; - assert.strictEqual(inspect(a, { depth: -1 }), '[Foo [ABC]]'); - Object.defineProperty(a, Symbol.toStringTag, { - value: 'Foo', - configurable: true, - writable: true - }); - assert.strictEqual(inspect(a, { depth: -1 }), '[Foo]'); - delete a[Symbol.toStringTag]; - Object.setPrototypeOf(a, null); - // TODO(wafuwafu13): Fix - // assert.strictEqual(inspect(a, { depth: -1 }), '[Foo: null prototype]'); - // delete a.foo; - // assert.strictEqual(inspect(a, { depth: -1 }), '[Foo: null prototype] {}'); - // Object.defineProperty(a, Symbol.toStringTag, { - // value: 'ABC', - // configurable: true - // }); - // assert.strictEqual( - // inspect(a, { depth: -1 }), - // '[Foo: null prototype] [ABC] {}' - // ); - // Object.defineProperty(a, Symbol.toStringTag, { - // value: 'Foo', - // configurable: true - // }); - // assert.strictEqual( - // inspect(a, { depth: -1 }), - // '[Object: null prototype] [Foo] {}' - // ); -} - -// Test alignment of items in container. -// Assumes that the first numeric character is the start of an item. -{ - function checkAlignment(container, start, lineX, end) { - const lines = util.inspect(container).split('\n'); - lines.forEach((line, i) => { - if (i === 0) { - assert.strictEqual(line, start); - } else if (i === lines.length - 1) { - assert.strictEqual(line, end); - } else { - let expected = lineX.replace('X', i - 1); - if (i !== lines.length - 2) - expected += ','; - assert.strictEqual(line, expected); - } - }); - } - - const bigArray = []; - for (let i = 0; i < 100; i++) { - bigArray.push(i); - } - - const obj = {}; - bigArray.forEach((prop) => { - obj[prop] = null; - }); - - checkAlignment(obj, '{', " 'X': null", '}'); - // TODO(wafuwafu13): Fix - // checkAlignment(new Set(bigArray), 'Set(100) {', ' X', '}'); - checkAlignment( - new Map(bigArray.map((number) => [number, null])), - 'Map(100) {', ' X => null', '}' - ); -} - - -// Test display of constructors. -{ - class ObjectSubclass {} - class ArraySubclass extends Array {} - class SetSubclass extends Set {} - class MapSubclass extends Map {} - class PromiseSubclass extends Promise {} - - const x = new ObjectSubclass(); - x.foo = 42; - assert.strictEqual(util.inspect(x), - 'ObjectSubclass { foo: 42 }'); - assert.strictEqual(util.inspect(new ArraySubclass(1, 2, 3)), - 'ArraySubclass(3) [ 1, 2, 3 ]'); - // TODO(wafuwafu13): Fix - // assert.strictEqual(util.inspect(new SetSubclass([1, 2, 3])), - // 'SetSubclass(3) [Set] { 1, 2, 3 }'); - assert.strictEqual(util.inspect(new MapSubclass([['foo', 42]])), - "MapSubclass(1) [Map] { 'foo' => 42 }"); - // TODO(wafuwafu13): Fix - // assert.strictEqual(util.inspect(new PromiseSubclass(() => {})), - // 'PromiseSubclass [Promise] { <pending> }'); - assert.strictEqual( - util.inspect({ a: { b: new ArraySubclass([1, [2], 3]) } }, { depth: 1 }), - '{ a: { b: [ArraySubclass] } }' - ); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(Object.setPrototypeOf(x, null)), - // '[ObjectSubclass: null prototype] { foo: 42 }' - // ); -} - -// Empty and circular before depth. -{ - const arr = [[[[]]]]; - assert.strictEqual(util.inspect(arr), '[ [ [ [] ] ] ]'); - arr[0][0][0][0] = []; - assert.strictEqual(util.inspect(arr), '[ [ [ [Array] ] ] ]'); - arr[0][0][0] = {}; - assert.strictEqual(util.inspect(arr), '[ [ [ {} ] ] ]'); - arr[0][0][0] = { a: 2 }; - assert.strictEqual(util.inspect(arr), '[ [ [ [Object] ] ] ]'); - arr[0][0][0] = arr; - assert.strictEqual(util.inspect(arr), '<ref *1> [ [ [ [Circular *1] ] ] ]'); - arr[0][0][0] = arr[0][0]; - assert.strictEqual(util.inspect(arr), '[ [ <ref *1> [ [Circular *1] ] ] ]'); -} - -// Corner cases. -{ - const x = { constructor: 42 }; - assert.strictEqual(util.inspect(x), '{ constructor: 42 }'); -} - -{ - const x = {}; - Object.defineProperty(x, 'constructor', { - get: function() { - throw new Error('should not access constructor'); - }, - enumerable: true - }); - assert.strictEqual(util.inspect(x), '{ constructor: [Getter] }'); -} - -{ - const x = new function() {}; // eslint-disable-line new-parens - assert.strictEqual(util.inspect(x), '{}'); -} - -{ - const x = Object.create(null); - assert.strictEqual(util.inspect(x), '[Object: null prototype] {}'); -} - -// TODO(wafuwafu13): Fix -// { -// const x = []; -// x[''] = 1; -// assert.strictEqual(util.inspect(x), "[ '': 1 ]"); -// } - -// TODO(wafuwafu13): Fix -// // The following maxArrayLength tests were introduced after v6.0.0 was released. -// // Do not backport to v5/v4 unless all of -// // https://github.com/nodejs/node/pull/6334 is backported. -// { -// const x = new Array(101).fill(); -// assert(util.inspect(x).endsWith('1 more item\n]')); -// assert(!util.inspect(x, { maxArrayLength: 101 }).endsWith('1 more item\n]')); -// assert.strictEqual( -// util.inspect(x, { maxArrayLength: -1 }), -// '[ ... 101 more items ]' -// ); -// assert.strictEqual(util.inspect(x, { maxArrayLength: 0 }), -// '[ ... 101 more items ]'); -// } - -{ - const x = Array(101); - assert.strictEqual(util.inspect(x, { maxArrayLength: 0 }), - '[ ... 101 more items ]'); - assert(!util.inspect(x, { maxArrayLength: null }).endsWith('1 more item\n]')); - assert(!util.inspect( - x, { maxArrayLength: Infinity } - ).endsWith('1 more item ]')); -} - -{ - const x = new Uint8Array(101); - // TODO(wafuwafu13): Fix - // assert(util.inspect(x).endsWith('1 more item\n]')); - assert(!util.inspect(x, { maxArrayLength: 101 }).includes('1 more item')); - // TODO(wafuwafu13): Fix - // assert.strictEqual(util.inspect(x, { maxArrayLength: 0 }), - // 'Uint8Array(101) [ ... 101 more items ]'); - assert(!util.inspect(x, { maxArrayLength: null }).includes('1 more item')); - // TODO(wafuwafu13): Fix - // assert(util.inspect(x, { maxArrayLength: Infinity }).endsWith(' 0, 0\n]')); -} - -{ - const obj = { foo: 'abc', bar: 'xyz' }; - const oneLine = util.inspect(obj, { breakLength: Infinity }); - // Subtract four for the object's two curly braces and two spaces of padding. - // Add one more to satisfy the strictly greater than condition in the code. - const breakpoint = oneLine.length - 5; - const twoLines = util.inspect(obj, { breakLength: breakpoint }); - - assert.strictEqual(oneLine, "{ foo: 'abc', bar: 'xyz' }"); - assert.strictEqual( - util.inspect(obj, { breakLength: breakpoint + 1 }), - twoLines - ); - assert.strictEqual(twoLines, "{\n foo: 'abc',\n bar: 'xyz'\n}"); -} - -// util.inspect.defaultOptions tests. -{ - const arr = new Array(101).fill(); - const obj = { a: { a: { a: { a: 1 } } } }; - - const oldOptions = { ...util.inspect.defaultOptions }; - - // Set single option through property assignment. - util.inspect.defaultOptions.maxArrayLength = null; - assert.doesNotMatch(util.inspect(arr), /1 more item/); - util.inspect.defaultOptions.maxArrayLength = oldOptions.maxArrayLength; - // TODO(wafuwafu13): Fix - // assert.match(util.inspect(arr), /1 more item/); - util.inspect.defaultOptions.depth = null; - assert.doesNotMatch(util.inspect(obj), /Object/); - util.inspect.defaultOptions.depth = oldOptions.depth; - assert.match(util.inspect(obj), /Object/); - assert.strictEqual( - JSON.stringify(util.inspect.defaultOptions), - JSON.stringify(oldOptions) - ); - - // Set multiple options through object assignment. - util.inspect.defaultOptions = { maxArrayLength: null, depth: 2 }; - assert.doesNotMatch(util.inspect(arr), /1 more item/); - assert.match(util.inspect(obj), /Object/); - util.inspect.defaultOptions = oldOptions; - // assert.match(util.inspect(arr), /1 more item/); - assert.match(util.inspect(obj), /Object/); - assert.strictEqual( - JSON.stringify(util.inspect.defaultOptions), - JSON.stringify(oldOptions) - ); - - assert.throws(() => { - util.inspect.defaultOptions = null; - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "options" argument must be of type object. ' + - 'Received null' - } - ); - - assert.throws(() => { - util.inspect.defaultOptions = 'bad'; - }, { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "options" argument must be of type object. ' + - "Received type string ('bad')" - } - ); -} - -util.inspect(process); - -// TODO(wafuwafu13): Fix -// // Setting custom inspect property to a non-function should do nothing. -// { -// const obj = { [util.inspect.custom]: 'fhqwhgads' }; -// assert.strictEqual( -// util.inspect(obj), -// "{ [Symbol(nodejs.util.inspect.custom)]: 'fhqwhgads' }" -// ); -// } - -{ - // @@toStringTag - const obj = { [Symbol.toStringTag]: 'a' }; - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(obj), - // "{ [Symbol(Symbol.toStringTag)]: 'a' }" - // ); - Object.defineProperty(obj, Symbol.toStringTag, { - value: 'a', - enumerable: false - }); - assert.strictEqual(util.inspect(obj), 'Object [a] {}'); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // util.inspect(obj, { showHidden: true }), - // "{ [Symbol(Symbol.toStringTag)]: 'a' }" - // ); - - class Foo { - constructor() { - this.foo = 'bar'; - } - - get [Symbol.toStringTag]() { - return this.foo; - } - } - - // TODO(wafuwafu13): Fix - // assert.strictEqual(util.inspect( - // Object.create(null, { [Symbol.toStringTag]: { value: 'foo' } })), - // '[Object: null prototype] [foo] {}'); - - assert.strictEqual(util.inspect(new Foo()), "Foo [bar] { foo: 'bar' }"); - - assert.strictEqual( - util.inspect(new (class extends Foo {})()), - "Foo [bar] { foo: 'bar' }"); - - assert.strictEqual( - util.inspect(Object.create(Object.create(Foo.prototype), { - foo: { value: 'bar', enumerable: true } - })), - "Foo [bar] { foo: 'bar' }"); - - class ThrowingClass { - get [Symbol.toStringTag]() { - throw new Error('toStringTag error'); - } - } - - assert.throws(() => util.inspect(new ThrowingClass()), /toStringTag error/); - - class NotStringClass { - get [Symbol.toStringTag]() { - return null; - } - } - - assert.strictEqual(util.inspect(new NotStringClass()), - 'NotStringClass {}'); -} - -{ - const o = { - a: [1, 2, [[ - 'Lorem ipsum dolor\nsit amet,\tconsectetur adipiscing elit, sed do ' + - 'eiusmod tempor incididunt ut labore et dolore magna aliqua.', - 'test', - 'foo']], 4], - b: new Map([['za', 1], ['zb', 'test']]) - }; - - let out = util.inspect(o, { compact: true, depth: 5, breakLength: 80 }); - let expect = [ - '{ a:', - ' [ 1,', - ' 2,', - " [ [ 'Lorem ipsum dolor\\nsit amet,\\tconsectetur adipiscing elit, " + - "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',", - " 'test',", - " 'foo' ] ],", - ' 4 ],', - " b: Map(2) { 'za' => 1, 'zb' => 'test' } }", - ].join('\n'); - assert.strictEqual(out, expect); - - out = util.inspect(o, { compact: false, depth: 5, breakLength: 60 }); - expect = [ - '{', - ' a: [', - ' 1,', - ' 2,', - ' [', - ' [', - " 'Lorem ipsum dolor\\n' +", - " 'sit amet,\\tconsectetur adipiscing elit, sed do eiusmod " + - "tempor incididunt ut labore et dolore magna aliqua.',", - " 'test',", - " 'foo'", - ' ]', - ' ],', - ' 4', - ' ],', - ' b: Map(2) {', - " 'za' => 1,", - " 'zb' => 'test'", - ' }', - '}', - ].join('\n'); - assert.strictEqual(out, expect); - - out = util.inspect(o.a[2][0][0], { compact: false, breakLength: 30 }); - expect = [ - "'Lorem ipsum dolor\\n' +", - " 'sit amet,\\tconsectetur adipiscing elit, sed do eiusmod tempor " + - "incididunt ut labore et dolore magna aliqua.'", - ].join('\n'); - assert.strictEqual(out, expect); - - out = util.inspect( - '12345678901234567890123456789012345678901234567890', - { compact: false, breakLength: 3 }); - expect = "'12345678901234567890123456789012345678901234567890'"; - assert.strictEqual(out, expect); - - out = util.inspect( - '12 45 78 01 34 67 90 23 56 89 123456789012345678901234567890', - { compact: false, breakLength: 3 }); - expect = [ - "'12 45 78 01 34 67 90 23 56 89 123456789012345678901234567890'", - ].join('\n'); - assert.strictEqual(out, expect); - - // TODO(wafuwafu13): Fix - o.a = () => {}; - o.b = new Number(3); - out = util.inspect(o, { compact: false, breakLength: 3 }); - expect = [ - '{', - ' a: [Function (anonymous)],', - ' b: [Number: 3]', - '}', - ].join('\n'); - assert.strictEqual(out, expect); - - out = util.inspect(o, { compact: false, breakLength: 3, showHidden: true }); - expect = [ - '{', - ' a: [Function (anonymous)] {', - ' [length]: 0,', - " [name]: ''", - ' },', - ' b: [Number: 3]', - '}', - ].join('\n'); - assert.strictEqual(out, expect); - - o[util.inspect.custom] = () => 42; - out = util.inspect(o, { compact: false, breakLength: 3 }); - expect = '42'; - assert.strictEqual(out, expect); - - o[util.inspect.custom] = () => '12 45 78 01 34 67 90 23'; - out = util.inspect(o, { compact: false, breakLength: 3 }); - expect = '12 45 78 01 34 67 90 23'; - assert.strictEqual(out, expect); - - o[util.inspect.custom] = () => ({ a: '12 45 78 01 34 67 90 23' }); - out = util.inspect(o, { compact: false, breakLength: 3 }); - expect = "{\n a: '12 45 78 01 34 67 90 23'\n}"; - assert.strictEqual(out, expect); -} - -// TODO(wafuwafu13): Fix -// // Check compact indentation. -// { -// const typed = new Uint8Array(); -// typed.buffer.foo = true; -// const set = new Set([[1, 2]]); -// const promise = Promise.resolve([[1, set]]); -// const map = new Map([[promise, typed]]); -// map.set(set.values(), map.values()); - -// let out = util.inspect(map, { compact: false, showHidden: true, depth: 9 }); -// let expected = [ -// 'Map(2) {', -// ' Promise {', -// ' [', -// ' [', -// ' 1,', -// ' Set(1) {', -// ' [', -// ' 1,', -// ' 2,', -// ' [length]: 2', -// ' ]', -// ' },', -// ' [length]: 2', -// ' ],', -// ' [length]: 1', -// ' ]', -// ' } => Uint8Array(0) [', -// ' [BYTES_PER_ELEMENT]: 1,', -// ' [length]: 0,', -// ' [byteLength]: 0,', -// ' [byteOffset]: 0,', -// ' [buffer]: ArrayBuffer {', -// ' byteLength: 0,', -// ' foo: true', -// ' }', -// ' ],', -// ' [Set Iterator] {', -// ' [', -// ' 1,', -// ' 2,', -// ' [length]: 2', -// ' ],', -// " [Symbol(Symbol.toStringTag)]: 'Set Iterator'", -// ' } => <ref *1> [Map Iterator] {', -// ' Uint8Array(0) [', -// ' [BYTES_PER_ELEMENT]: 1,', -// ' [length]: 0,', -// ' [byteLength]: 0,', -// ' [byteOffset]: 0,', -// ' [buffer]: ArrayBuffer {', -// ' byteLength: 0,', -// ' foo: true', -// ' }', -// ' ],', -// ' [Circular *1],', -// " [Symbol(Symbol.toStringTag)]: 'Map Iterator'", -// ' }', -// '}', -// ].join('\n'); - -// assert.strict.equal(out, expected); - -// out = util.inspect(map, { compact: 2, showHidden: true, depth: 9 }); - -// expected = [ -// 'Map(2) {', -// ' Promise {', -// ' [', -// ' [', -// ' 1,', -// ' Set(1) { [ 1, 2, [length]: 2 ] },', -// ' [length]: 2', -// ' ],', -// ' [length]: 1', -// ' ]', -// ' } => Uint8Array(0) [', -// ' [BYTES_PER_ELEMENT]: 1,', -// ' [length]: 0,', -// ' [byteLength]: 0,', -// ' [byteOffset]: 0,', -// ' [buffer]: ArrayBuffer { byteLength: 0, foo: true }', -// ' ],', -// ' [Set Iterator] {', -// ' [ 1, 2, [length]: 2 ],', -// " [Symbol(Symbol.toStringTag)]: 'Set Iterator'", -// ' } => <ref *1> [Map Iterator] {', -// ' Uint8Array(0) [', -// ' [BYTES_PER_ELEMENT]: 1,', -// ' [length]: 0,', -// ' [byteLength]: 0,', -// ' [byteOffset]: 0,', -// ' [buffer]: ArrayBuffer { byteLength: 0, foo: true }', -// ' ],', -// ' [Circular *1],', -// " [Symbol(Symbol.toStringTag)]: 'Map Iterator'", -// ' }', -// '}', -// ].join('\n'); - -// assert.strict.equal(out, expected); - -// out = util.inspect(map, { -// showHidden: true, depth: 9, breakLength: 4, compact: true -// }); -// expected = [ -// 'Map(2) {', -// ' Promise {', -// ' [ [ 1,', -// ' Set(1) {', -// ' [ 1,', -// ' 2,', -// ' [length]: 2 ] },', -// ' [length]: 2 ],', -// ' [length]: 1 ] } => Uint8Array(0) [', -// ' [BYTES_PER_ELEMENT]: 1,', -// ' [length]: 0,', -// ' [byteLength]: 0,', -// ' [byteOffset]: 0,', -// ' [buffer]: ArrayBuffer {', -// ' byteLength: 0,', -// ' foo: true } ],', -// ' [Set Iterator] {', -// ' [ 1,', -// ' 2,', -// ' [length]: 2 ],', -// ' [Symbol(Symbol.toStringTag)]:', -// " 'Set Iterator' } => <ref *1> [Map Iterator] {", -// ' Uint8Array(0) [', -// ' [BYTES_PER_ELEMENT]: 1,', -// ' [length]: 0,', -// ' [byteLength]: 0,', -// ' [byteOffset]: 0,', -// ' [buffer]: ArrayBuffer {', -// ' byteLength: 0,', -// ' foo: true } ],', -// ' [Circular *1],', -// ' [Symbol(Symbol.toStringTag)]:', -// " 'Map Iterator' } }", -// ].join('\n'); - -// assert.strict.equal(out, expected); -// } - -// TODO(wafuwafu13): Fix -// { // Test WeakMap && WeakSet -// const obj = {}; -// const arr = []; -// const weakMap = new WeakMap([[obj, arr], [arr, obj]]); -// let out = util.inspect(weakMap, { showHidden: true }); -// let expect = 'WeakMap { [ [length]: 0 ] => {}, {} => [ [length]: 0 ] }'; -// assert.strictEqual(out, expect); - -// out = util.inspect(weakMap); -// expect = 'WeakMap { <items unknown> }'; -// assert.strictEqual(out, expect); - -// out = util.inspect(weakMap, { maxArrayLength: 0, showHidden: true }); -// expect = 'WeakMap { ... 2 more items }'; -// assert.strictEqual(out, expect); - -// weakMap.extra = true; -// out = util.inspect(weakMap, { maxArrayLength: 1, showHidden: true }); -// // It is not possible to determine the output reliable. -// expect = 'WeakMap { [ [length]: 0 ] => {}, ... 1 more item, extra: true }'; -// let expectAlt = 'WeakMap { {} => [ [length]: 0 ], ... 1 more item, ' + -// 'extra: true }'; -// assert(out === expect || out === expectAlt, -// `Found: "${out}"\nrather than: "${expect}"\nor: "${expectAlt}"`); - -// // Test WeakSet -// arr.push(1); -// const weakSet = new WeakSet([obj, arr]); -// out = util.inspect(weakSet, { showHidden: true }); -// expect = 'WeakSet { [ 1, [length]: 1 ], {} }'; -// assert.strictEqual(out, expect); - -// out = util.inspect(weakSet); -// expect = 'WeakSet { <items unknown> }'; -// assert.strictEqual(out, expect); - -// out = util.inspect(weakSet, { maxArrayLength: -2, showHidden: true }); -// expect = 'WeakSet { ... 2 more items }'; -// assert.strictEqual(out, expect); - -// weakSet.extra = true; -// out = util.inspect(weakSet, { maxArrayLength: 1, showHidden: true }); -// // It is not possible to determine the output reliable. -// expect = 'WeakSet { {}, ... 1 more item, extra: true }'; -// expectAlt = 'WeakSet { [ 1, [length]: 1 ], ... 1 more item, extra: true }'; -// assert(out === expect || out === expectAlt, -// `Found: "${out}"\nrather than: "${expect}"\nor: "${expectAlt}"`); -// // Keep references to the WeakMap entries, otherwise they could be GCed too -// // early. -// assert(obj && arr); -// } - -{ // Test argument objects. - const args = (function() { return arguments; })('a'); - assert.strictEqual(util.inspect(args), "[Arguments] { '0': 'a' }"); -} - -{ - // Test that a long linked list can be inspected without throwing an error. - const list = {}; - let head = list; - // A linked list of length 100k should be inspectable in some way, even though - // the real cutoff value is much lower than 100k. - for (let i = 0; i < 100000; i++) - head = head.next = {}; - assert.strictEqual( - util.inspect(list), - '{ next: { next: { next: [Object] } } }' - ); - const longList = util.inspect(list, { depth: Infinity }); - const match = longList.match(/next/g); - assert(match.length > 500 && match.length < 10000); - // TODO(wafuwafu13): Fix - // assert(longList.includes('[Object: Inspection interrupted ' + - // 'prematurely. Maximum call stack size exceeded.]')); -} - -// Do not escape single quotes if no double quote or backtick is present. -assert.strictEqual(util.inspect("'"), '"\'"'); -assert.strictEqual(util.inspect('"\''), '`"\'`'); -// eslint-disable-next-line no-template-curly-in-string -// TODO(@crowlKats) -//assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'"); - -// TODO(wafuwafu13): Fix -// // Errors should visualize as much information as possible. -// // If the name is not included in the stack, visualize it as well. -// [ -// [class Foo extends TypeError {}, 'test'], -// [class Foo extends TypeError {}, undefined], -// [class BarError extends Error {}, 'test'], -// [class BazError extends Error { -// get name() { -// return 'BazError'; -// } -// }, undefined], -// ].forEach(([Class, message], i) => { -// console.log('Test %i', i); -// const foo = new Class(message); -// const name = foo.name; -// const extra = Class.name.includes('Error') ? '' : ` [${foo.name}]`; -// assert( -// util.inspect(foo).startsWith( -// `${Class.name}${extra}${message ? `: ${message}` : '\n'}`), -// util.inspect(foo) -// ); -// Object.defineProperty(foo, Symbol.toStringTag, { -// value: 'WOW', -// writable: true, -// configurable: true -// }); -// const stack = foo.stack; -// foo.stack = 'This is a stack'; -// assert.strictEqual( -// util.inspect(foo), -// '[This is a stack]' -// ); -// foo.stack = stack; -// assert( -// util.inspect(foo).startsWith( -// `${Class.name} [WOW]${extra}${message ? `: ${message}` : '\n'}`), -// util.inspect(foo) -// ); -// Object.setPrototypeOf(foo, null); -// assert( -// util.inspect(foo).startsWith( -// `[${name}: null prototype] [WOW]${message ? `: ${message}` : '\n'}` -// ), -// util.inspect(foo) -// ); -// foo.bar = true; -// delete foo[Symbol.toStringTag]; -// assert( -// util.inspect(foo).startsWith( -// `[${name}: null prototype]${message ? `: ${message}` : '\n'}`), -// util.inspect(foo) -// ); -// foo.stack = 'This is a stack'; -// assert.strictEqual( -// util.inspect(foo), -// '[[Error: null prototype]: This is a stack] { bar: true }' -// ); -// foo.stack = stack.split('\n')[0]; -// assert.strictEqual( -// util.inspect(foo), -// `[[${name}: null prototype]${message ? `: ${message}` : ''}] { bar: true }` -// ); -// }); - -// TODO(wafuwafu13): Fix -// // Verify that classes are properly inspected. -// [ -// /* eslint-disable spaced-comment, no-multi-spaces, brace-style */ -// // The whitespace is intentional. -// [class { }, '[class (anonymous)]'], -// [class extends Error { log() {} }, '[class (anonymous) extends Error]'], -// [class A { constructor(a) { this.a = a; } log() { return this.a; } }, -// '[class A]'], -// [class -// // Random { // comments /* */ are part of the toString() result -// /* eslint-disable-next-line space-before-blocks */ -// äß/**/extends/*{*/TypeError{}, '[class äß extends TypeError]'], -// /* The whitespace and new line is intended! */ -// // Foobar !!! -// [class X extends /****/ Error -// // More comments -// {}, '[class X extends Error]'], -// /* eslint-enable spaced-comment, no-multi-spaces, brace-style */ -// ].forEach(([clazz, string]) => { -// const inspected = util.inspect(clazz); -// assert.strictEqual(inspected, string); -// Object.defineProperty(clazz, Symbol.toStringTag, { -// value: 'Woohoo' -// }); -// const parts = inspected.slice(0, -1).split(' '); -// const [, name, ...rest] = parts; -// rest.unshift('[Woohoo]'); -// if (rest.length) { -// rest[rest.length - 1] += ']'; -// } -// assert.strictEqual( -// util.inspect(clazz), -// ['[class', name, ...rest].join(' ') -// ); -// if (rest.length) { -// rest[rest.length - 1] = rest[rest.length - 1].slice(0, -1); -// rest.length = 1; -// } -// Object.setPrototypeOf(clazz, Map.prototype); -// assert.strictEqual( -// util.inspect(clazz), -// ['[class', name, '[Map]', ...rest].join(' ') + ']' -// ); -// Object.setPrototypeOf(clazz, null); -// assert.strictEqual( -// util.inspect(clazz), -// ['[class', name, ...rest, 'extends [null prototype]]'].join(' ') -// ); -// Object.defineProperty(clazz, 'name', { value: 'Foo' }); -// const res = ['[class', 'Foo', ...rest, 'extends [null prototype]]'].join(' '); -// assert.strictEqual(util.inspect(clazz), res); -// clazz.foo = true; -// assert.strictEqual(util.inspect(clazz), `${res} { foo: true }`); -// }); - -// "class" properties should not be detected as "class". -{ - // eslint-disable-next-line space-before-function-paren - let obj = { class () {} }; - assert.strictEqual( - util.inspect(obj), - '{ class: [Function: class] }' - ); - obj = { class: () => {} }; - assert.strictEqual( - util.inspect(obj), - '{ class: [Function: class] }' - ); - obj = { ['class Foo {}']() {} }; - assert.strictEqual( - util.inspect(obj), - "{ 'class Foo {}': [Function: class Foo {}] }" - ); - function Foo() {} - Object.defineProperty(Foo, 'toString', { value: () => 'class Foo {}' }); - assert.strictEqual( - util.inspect(Foo), - '[Function: Foo]' - ); - function fn() {} - Object.defineProperty(fn, 'name', { value: 'class Foo {}' }); - assert.strictEqual( - util.inspect(fn), - '[Function: class Foo {}]' - ); -} - -// TODO(wafuwafu13): Fix -// // Verify that throwing in valueOf and toString still produces nice results. -// [ -// [new String(55), "[String: '55']"], -// [new Boolean(true), '[Boolean: true]'], -// [new Number(55), '[Number: 55]'], -// [Object(BigInt(55)), '[BigInt: 55n]'], -// [Object(Symbol('foo')), '[Symbol: Symbol(foo)]'], -// [function() {}, '[Function (anonymous)]'], -// [() => {}, '[Function (anonymous)]'], -// [[1, 2], '[ 1, 2 ]'], -// [[, , 5, , , , ], '[ <2 empty items>, 5, <3 empty items> ]'], -// [{ a: 5 }, '{ a: 5 }'], -// [new Set([1, 2]), 'Set(2) { 1, 2 }'], -// [new Map([[1, 2]]), 'Map(1) { 1 => 2 }'], -// [new Set([1, 2]).entries(), '[Set Entries] { [ 1, 1 ], [ 2, 2 ] }'], -// [new Map([[1, 2]]).keys(), '[Map Iterator] { 1 }'], -// [new Date(2000), '1970-01-01T00:00:02.000Z'], -// [new Uint8Array(2), 'Uint8Array(2) [ 0, 0 ]'], -// [new Promise((resolve) => setTimeout(resolve, 10)), 'Promise { <pending> }'], -// [new WeakSet(), 'WeakSet { <items unknown> }'], -// [new WeakMap(), 'WeakMap { <items unknown> }'], -// [/foobar/g, '/foobar/g'], -// ].forEach(([value, expected]) => { -// Object.defineProperty(value, 'valueOf', { -// get() { -// throw new Error('valueOf'); -// } -// }); -// Object.defineProperty(value, 'toString', { -// get() { -// throw new Error('toString'); -// } -// }); -// assert.strictEqual(util.inspect(value), expected); -// value.foo = 'bar'; -// assert.notStrictEqual(util.inspect(value), expected); -// delete value.foo; -// value[Symbol('foo')] = 'yeah'; -// assert.notStrictEqual(util.inspect(value), expected); -// }); - -// TODO(wafuwafu13): Fix -// // Verify that having no prototype still produces nice results. -// [ -// [[1, 3, 4], '[Array(3): null prototype] [ 1, 3, 4 ]'], -// [new Set([1, 2]), '[Set(2): null prototype] { 1, 2 }'], -// [new Map([[1, 2]]), '[Map(1): null prototype] { 1 => 2 }'], -// [new Promise((resolve) => setTimeout(resolve, 10)), -// '[Promise: null prototype] { <pending> }'], -// [new WeakSet(), '[WeakSet: null prototype] { <items unknown> }'], -// [new WeakMap(), '[WeakMap: null prototype] { <items unknown> }'], -// [new Uint8Array(2), '[Uint8Array(2): null prototype] [ 0, 0 ]'], -// [new Uint16Array(2), '[Uint16Array(2): null prototype] [ 0, 0 ]'], -// [new Uint32Array(2), '[Uint32Array(2): null prototype] [ 0, 0 ]'], -// [new Int8Array(2), '[Int8Array(2): null prototype] [ 0, 0 ]'], -// [new Int16Array(2), '[Int16Array(2): null prototype] [ 0, 0 ]'], -// [new Int32Array(2), '[Int32Array(2): null prototype] [ 0, 0 ]'], -// [new Float32Array(2), '[Float32Array(2): null prototype] [ 0, 0 ]'], -// [new Float64Array(2), '[Float64Array(2): null prototype] [ 0, 0 ]'], -// [new BigInt64Array(2), '[BigInt64Array(2): null prototype] [ 0n, 0n ]'], -// [new BigUint64Array(2), '[BigUint64Array(2): null prototype] [ 0n, 0n ]'], -// [new ArrayBuffer(16), '[ArrayBuffer: null prototype] {\n' + -// ' [Uint8Contents]: <00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>,\n' + -// ' byteLength: undefined\n}'], -// [new DataView(new ArrayBuffer(16)), -// '[DataView: null prototype] {\n byteLength: undefined,\n ' + -// 'byteOffset: undefined,\n buffer: undefined\n}'], -// [new SharedArrayBuffer(2), '[SharedArrayBuffer: null prototype] ' + -// '{\n [Uint8Contents]: <00 00>,\n byteLength: undefined\n}'], -// [/foobar/, '[RegExp: null prototype] /foobar/'], -// [new Date('Sun, 14 Feb 2010 11:48:40 GMT'), -// '[Date: null prototype] 2010-02-14T11:48:40.000Z'], -// ].forEach(([value, expected]) => { -// assert.strictEqual( -// util.inspect(Object.setPrototypeOf(value, null)), -// expected -// ); -// value.foo = 'bar'; -// assert.notStrictEqual(util.inspect(value), expected); -// delete value.foo; -// value[Symbol('foo')] = 'yeah'; -// assert.notStrictEqual(util.inspect(value), expected); -// }); - -// TODO(wafuwafu13): Fix -// // Verify that subclasses with and without prototype produce nice results. -// [ -// [RegExp, ['foobar', 'g'], '/foobar/g'], -// [WeakSet, [[{}]], '{ <items unknown> }'], -// [WeakMap, [[[{}, {}]]], '{ <items unknown> }'], -// [BigInt64Array, -// [10], -// '[\n 0n, 0n, 0n, 0n, 0n,\n 0n, 0n, 0n, 0n, 0n\n]'], -// [Date, ['Sun, 14 Feb 2010 11:48:40 GMT'], '2010-02-14T11:48:40.000Z'], -// [Date, ['invalid_date'], 'Invalid Date'], -// ].forEach(([base, input, rawExpected]) => { -// class Foo extends base {} -// const value = new Foo(...input); -// const symbol = value[Symbol.toStringTag]; -// const size = base.name.includes('Array') ? `(${input[0]})` : ''; -// const expected = `Foo${size} ${symbol ? `[${symbol}] ` : ''}${rawExpected}`; -// const expectedWithoutProto = -// `[${base.name}${size}: null prototype] ${rawExpected}`; -// assert.strictEqual(util.inspect(value), expected); -// value.foo = 'bar'; -// assert.notStrictEqual(util.inspect(value), expected); -// delete value.foo; -// assert.strictEqual( -// util.inspect(Object.setPrototypeOf(value, null)), -// expectedWithoutProto -// ); -// value.foo = 'bar'; -// let res = util.inspect(value); -// assert.notStrictEqual(res, expectedWithoutProto); -// assert.match(res, /foo: 'bar'/); -// delete value.foo; -// value[Symbol('foo')] = 'yeah'; -// res = util.inspect(value); -// assert.notStrictEqual(res, expectedWithoutProto); -// assert.match(res, /\[Symbol\(foo\)]: 'yeah'/); -// }); - -assert.strictEqual(inspect(1n), '1n'); -assert.strictEqual(inspect(Object(-1n)), '[BigInt: -1n]'); -assert.strictEqual(inspect(Object(13n)), '[BigInt: 13n]'); -// TODO(wafuwafu13): Fix -// assert.strictEqual(inspect(new BigInt64Array([0n])), 'BigInt64Array(1) [ 0n ]'); -// assert.strictEqual( -// inspect(new BigUint64Array([0n])), 'BigUint64Array(1) [ 0n ]'); - -// Verify non-enumerable keys get escaped. -{ - const obj = {}; - Object.defineProperty(obj, 'Non\nenumerable\tkey', { value: true }); - assert.strictEqual( - util.inspect(obj, { showHidden: true }), - '{ [Non\\nenumerable\\tkey]: true }' - ); -} - -// Check for special colors. -{ - const special = inspect.colors[inspect.styles.special]; - const string = inspect.colors[inspect.styles.string]; - - assert.strictEqual( - inspect(new WeakSet(), { colors: true }), - `WeakSet { \u001b[${special[0]}m<items unknown>\u001b[${special[1]}m }` - ); - assert.strictEqual( - inspect(new WeakMap(), { colors: true }), - `WeakMap { \u001b[${special[0]}m<items unknown>\u001b[${special[1]}m }` - ); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // inspect(new Promise(() => {}), { colors: true }), - // `Promise { \u001b[${special[0]}m<pending>\u001b[${special[1]}m }` - // ); - - // const rejection = Promise.reject('Oh no!'); - // assert.strictEqual( - // inspect(rejection, { colors: true }), - // `Promise { \u001b[${special[0]}m<rejected>\u001b[${special[1]}m ` + - // `\u001b[${string[0]}m'Oh no!'\u001b[${string[1]}m }` - // ); - // rejection.catch(() => {}); - - // Verify that aliases do not show up as key while checking `inspect.colors`. - const colors = Object.keys(inspect.colors); - const aliases = Object.getOwnPropertyNames(inspect.colors) - .filter((c) => !colors.includes(c)); - assert(!colors.includes('grey')); - assert(colors.includes('gray')); - // Verify that all aliases are correctly mapped. - for (const alias of aliases) { - assert(Array.isArray(inspect.colors[alias])); - } - // Check consistent naming. - [ - 'black', - 'red', - 'green', - 'yellow', - 'blue', - 'magenta', - 'cyan', - 'white', - ].forEach((color, i) => { - assert.deepStrictEqual(inspect.colors[color], [30 + i, 39]); - assert.deepStrictEqual(inspect.colors[`${color}Bright`], [90 + i, 39]); - const bgColor = `bg${color[0].toUpperCase()}${color.slice(1)}`; - assert.deepStrictEqual(inspect.colors[bgColor], [40 + i, 49]); - assert.deepStrictEqual(inspect.colors[`${bgColor}Bright`], [100 + i, 49]); - }); - - // Unknown colors are handled gracefully: - const stringStyle = inspect.styles.string; - inspect.styles.string = 'UNKNOWN'; - assert.strictEqual(inspect('foobar', { colors: true }), "'foobar'"); - inspect.styles.string = stringStyle; -} - -assert.strictEqual( - inspect([1, 3, 2], { sorted: true }), - inspect([1, 3, 2]) -); -assert.strictEqual( - inspect({ c: 3, a: 1, b: 2 }, { sorted: true }), - '{ a: 1, b: 2, c: 3 }' -); -assert.strictEqual( - inspect( - { a200: 4, a100: 1, a102: 3, a101: 2 }, - { sorted(a, b) { return b.localeCompare(a); } } - ), - '{ a200: 4, a102: 3, a101: 2, a100: 1 }' -); - -// TODO(wafuwafu13): Fix -// // Non-indices array properties are sorted as well. -// { -// const arr = [3, 2, 1]; -// arr.b = 2; -// arr.c = 3; -// arr.a = 1; -// arr[Symbol('b')] = true; -// arr[Symbol('a')] = false; -// assert.strictEqual( -// inspect(arr, { sorted: true }), -// '[ 3, 2, 1, [Symbol(a)]: false, [Symbol(b)]: true, a: 1, b: 2, c: 3 ]' -// ); -// } - -// TODO(wafuwafu13): Fix -// // Manipulate the prototype in weird ways. -// { -// let obj = { a: true }; -// let value = (function() { return function() {}; })(); -// Object.setPrototypeOf(value, null); -// Object.setPrototypeOf(obj, value); -// assert.strictEqual( -// util.inspect(obj), -// 'Object <[Function (null prototype) (anonymous)]> { a: true }' -// ); -// assert.strictEqual( -// util.inspect(obj, { colors: true }), -// 'Object <\u001b[36m[Function (null prototype) (anonymous)]\u001b[39m> ' + -// '{ a: \u001b[33mtrue\u001b[39m }' -// ); - -// obj = { a: true }; -// value = []; -// Object.setPrototypeOf(value, null); -// Object.setPrototypeOf(obj, value); -// assert.strictEqual( -// util.inspect(obj), -// 'Object <[Array(0): null prototype] []> { a: true }' -// ); - -// function StorageObject() {} -// StorageObject.prototype = Object.create(null); -// assert.strictEqual( -// util.inspect(new StorageObject()), -// 'StorageObject <[Object: null prototype] {}> {}' -// ); - -// obj = [1, 2, 3]; -// Object.setPrototypeOf(obj, Number.prototype); -// assert.strictEqual(inspect(obj), "Number { '0': 1, '1': 2, '2': 3 }"); - -// Object.setPrototypeOf(obj, Object.create(null)); -// assert.strictEqual( -// inspect(obj), -// "Array <[Object: null prototype] {}> { '0': 1, '1': 2, '2': 3 }" -// ); - -// StorageObject.prototype = Object.create(null); -// Object.setPrototypeOf(StorageObject.prototype, Object.create(null)); -// Object.setPrototypeOf( -// Object.getPrototypeOf(StorageObject.prototype), -// Object.create(null) -// ); -// assert.strictEqual( -// util.inspect(new StorageObject()), -// 'StorageObject <Object <Object <[Object: null prototype] {}>>> {}' -// ); -// assert.strictEqual( -// util.inspect(new StorageObject(), { depth: 1 }), -// 'StorageObject <Object <Object <Complex prototype>>> {}' -// ); -// } - -// TODO(wafuwafu13): Fix -// // Check that the fallback always works. -// { -// const obj = new Set([1, 2]); -// const iterator = obj[Symbol.iterator]; -// Object.setPrototypeOf(obj, null); -// Object.defineProperty(obj, Symbol.iterator, { -// value: iterator, -// configurable: true -// }); -// assert.strictEqual(util.inspect(obj), '[Set(2): null prototype] { 1, 2 }'); -// Object.defineProperty(obj, Symbol.iterator, { -// value: true, -// configurable: true -// }); -// Object.defineProperty(obj, 'size', { -// value: NaN, -// configurable: true, -// enumerable: true -// }); -// assert.strictEqual( -// util.inspect(obj), -// '[Set(2): null prototype] { 1, 2, size: NaN }' -// ); -// } - -// TODO(wafuwafu13): Fix -// Check the getter option. -{ - let foo = 1; - const get = { get foo() { return foo; } }; - const getset = { - get foo() { return foo; }, - set foo(val) { foo = val; }, - get inc() { return ++foo; } - }; - const thrower = { get foo() { throw new Error('Oops'); } }; - assert.strictEqual( - inspect(get, { getters: true, colors: true }), - '{ foo: \u001b[36m[Getter:\u001b[39m ' + - '\u001b[33m1\u001b[39m\u001b[36m]\u001b[39m }'); - assert.strictEqual( - inspect(thrower, { getters: true }), - '{ foo: [Getter: <Inspection threw (Oops)>] }'); - assert.strictEqual( - inspect(getset, { getters: true }), - '{ foo: [Getter/Setter: 1], inc: [Getter: 2] }'); - assert.strictEqual( - inspect(getset, { getters: 'get' }), - '{ foo: [Getter/Setter], inc: [Getter: 3] }'); - assert.strictEqual( - inspect(getset, { getters: 'set' }), - '{ foo: [Getter/Setter: 3], inc: [Getter] }'); - getset.foo = new Set([[{ a: true }, 2, {}], 'foobar', { x: 1 }]); - // assert.strictEqual( - // inspect(getset, { getters: true }), - // '{\n foo: [Getter/Setter] Set(3) { [ [Object], 2, {} ], ' + - // "'foobar', { x: 1 } },\n inc: [Getter: NaN]\n}"); -} - -// Check compact number mode. -{ - let obj = { - a: { - b: { - x: 5, - c: { - x: '10000000000000000 00000000000000000 '.repeat(1e1), - d: 2, - e: 3 - } - } - }, - b: [ - 1, - 2, - [ 1, 2, { a: 1, b: 2, c: 3 } ], - ], - c: ['foo', 4, 444444], - d: Array.from({ length: 101 }).map((e, i) => { - return i % 2 === 0 ? i * i : i; - }), - e: Array(6).fill('foobar'), - f: Array(9).fill('foobar'), - g: Array(21).fill('foobar baz'), - h: [100].concat(Array.from({ length: 9 }).map((e, n) => (n))), - long: Array(9).fill('This text is too long for grouping!') - }; - - let out = util.inspect(obj, { compact: 3, depth: 10, breakLength: 60 }); - let expected = [ - '{', - ' a: {', - ' b: {', - ' x: 5,', - ' c: {', - " x: '10000000000000000 00000000000000000 10000000000000000 " + - '00000000000000000 10000000000000000 00000000000000000 ' + - '10000000000000000 00000000000000000 10000000000000000 ' + - '00000000000000000 10000000000000000 00000000000000000 ' + - '10000000000000000 00000000000000000 10000000000000000 ' + - '00000000000000000 10000000000000000 00000000000000000 ' + - "10000000000000000 00000000000000000 ',", - ' d: 2,', - ' e: 3', - ' }', - ' }', - ' },', - ' b: [ 1, 2, [ 1, 2, { a: 1, b: 2, c: 3 } ] ],', - " c: [ 'foo', 4, 444444 ],", - ' d: [', - ' 0, 1, 4, 3, 16, 5, 36, 7, 64,', - ' 9, 100, 11, 144, 13, 196, 15, 256, 17,', - ' 324, 19, 400, 21, 484, 23, 576, 25, 676,', - ' 27, 784, 29, 900, 31, 1024, 33, 1156, 35,', - ' 1296, 37, 1444, 39, 1600, 41, 1764, 43, 1936,', - ' 45, 2116, 47, 2304, 49, 2500, 51, 2704, 53,', - ' 2916, 55, 3136, 57, 3364, 59, 3600, 61, 3844,', - ' 63, 4096, 65, 4356, 67, 4624, 69, 4900, 71,', - ' 5184, 73, 5476, 75, 5776, 77, 6084, 79, 6400,', - ' 81, 6724, 83, 7056, 85, 7396, 87, 7744, 89,', - ' 8100, 91, 8464, 93, 8836, 95, 9216, 97, 9604,', - ' 99,', - ' ... 1 more item', - ' ],', - ' e: [', - " 'foobar',", - " 'foobar',", - " 'foobar',", - " 'foobar',", - " 'foobar',", - " 'foobar'", - ' ],', - ' f: [', - " 'foobar', 'foobar',", - " 'foobar', 'foobar',", - " 'foobar', 'foobar',", - " 'foobar', 'foobar',", - " 'foobar'", - ' ],', - ' g: [', - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz', 'foobar baz',", - " 'foobar baz'", - ' ],', - ' h: [', - ' 100, 0, 1, 2, 3,', - ' 4, 5, 6, 7, 8', - ' ],', - ' long: [', - " 'This text is too long for grouping!',", - " 'This text is too long for grouping!',", - " 'This text is too long for grouping!',", - " 'This text is too long for grouping!',", - " 'This text is too long for grouping!',", - " 'This text is too long for grouping!',", - " 'This text is too long for grouping!',", - " 'This text is too long for grouping!',", - " 'This text is too long for grouping!'", - ' ]', - '}', - ].join('\n'); - - // TODO(wafuwafu13): Fix - // assert.strictEqual(out, expected); - - obj = [ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 123456789, - ]; - - out = util.inspect(obj, { compact: 3 }); - - expected = [ - '[', - ' 1, 1, 1, 1,', - ' 1, 1, 1, 1,', - ' 1, 1, 1, 1,', - ' 1, 1, 1, 1,', - ' 1, 1, 1, 1,', - ' 1, 1, 1, 1,', - ' 1, 1, 123456789', - ']', - ].join('\n'); - - // TODO(wafuwafu13): Fix - // assert.strictEqual(out, expected); - - // Unicode support. あ has a length of one and a width of two. - obj = [ - '123', '123', '123', '123', 'あああ', - '123', '123', '123', '123', 'あああ', - ]; - - out = util.inspect(obj, { compact: 3 }); - - expected = [ - '[', - " '123', '123',", - " '123', '123',", - " 'あああ', '123',", - " '123', '123',", - " '123', 'あああ'", - ']', - ].join('\n'); - - // TODO(wafuwafu13): Fix - // assert.strictEqual(out, expected); - - // Verify that array grouping and line consolidation does not happen together. - obj = { - a: { - b: { - x: 5, - c: { - d: 2, - e: 3 - } - } - }, - b: Array.from({ length: 9 }).map((e, n) => { - return n % 2 === 0 ? 'foobar' : 'baz'; - }) - }; - - out = util.inspect(obj, { compact: 1, breakLength: Infinity, colors: true }); - - expected = [ - '{', - ' a: {', - ' b: { x: \u001b[33m5\u001b[39m, c: \u001b[36m[Object]\u001b[39m }', - ' },', - ' b: [', - " \u001b[32m'foobar'\u001b[39m, \u001b[32m'baz'\u001b[39m,", - " \u001b[32m'foobar'\u001b[39m, \u001b[32m'baz'\u001b[39m,", - " \u001b[32m'foobar'\u001b[39m, \u001b[32m'baz'\u001b[39m,", - " \u001b[32m'foobar'\u001b[39m, \u001b[32m'baz'\u001b[39m,", - " \u001b[32m'foobar'\u001b[39m", - ' ]', - '}', - ].join('\n'); - - // TODO(wafuwafu13): Fix - // assert.strictEqual(out, expected); - - obj = Array.from({ length: 60 }).map((e, i) => i); - out = util.inspect(obj, { compact: 1, breakLength: Infinity, colors: true }); - - expected = [ - '[', - /* eslint-disable max-len */ - ' \u001b[33m0\u001b[39m, \u001b[33m1\u001b[39m, \u001b[33m2\u001b[39m, \u001b[33m3\u001b[39m,', - ' \u001b[33m4\u001b[39m, \u001b[33m5\u001b[39m, \u001b[33m6\u001b[39m, \u001b[33m7\u001b[39m,', - ' \u001b[33m8\u001b[39m, \u001b[33m9\u001b[39m, \u001b[33m10\u001b[39m, \u001b[33m11\u001b[39m,', - ' \u001b[33m12\u001b[39m, \u001b[33m13\u001b[39m, \u001b[33m14\u001b[39m, \u001b[33m15\u001b[39m,', - ' \u001b[33m16\u001b[39m, \u001b[33m17\u001b[39m, \u001b[33m18\u001b[39m, \u001b[33m19\u001b[39m,', - ' \u001b[33m20\u001b[39m, \u001b[33m21\u001b[39m, \u001b[33m22\u001b[39m, \u001b[33m23\u001b[39m,', - ' \u001b[33m24\u001b[39m, \u001b[33m25\u001b[39m, \u001b[33m26\u001b[39m, \u001b[33m27\u001b[39m,', - ' \u001b[33m28\u001b[39m, \u001b[33m29\u001b[39m, \u001b[33m30\u001b[39m, \u001b[33m31\u001b[39m,', - ' \u001b[33m32\u001b[39m, \u001b[33m33\u001b[39m, \u001b[33m34\u001b[39m, \u001b[33m35\u001b[39m,', - ' \u001b[33m36\u001b[39m, \u001b[33m37\u001b[39m, \u001b[33m38\u001b[39m, \u001b[33m39\u001b[39m,', - ' \u001b[33m40\u001b[39m, \u001b[33m41\u001b[39m, \u001b[33m42\u001b[39m, \u001b[33m43\u001b[39m,', - ' \u001b[33m44\u001b[39m, \u001b[33m45\u001b[39m, \u001b[33m46\u001b[39m, \u001b[33m47\u001b[39m,', - ' \u001b[33m48\u001b[39m, \u001b[33m49\u001b[39m, \u001b[33m50\u001b[39m, \u001b[33m51\u001b[39m,', - ' \u001b[33m52\u001b[39m, \u001b[33m53\u001b[39m, \u001b[33m54\u001b[39m, \u001b[33m55\u001b[39m,', - ' \u001b[33m56\u001b[39m, \u001b[33m57\u001b[39m, \u001b[33m58\u001b[39m, \u001b[33m59\u001b[39m', - /* eslint-enable max-len */ - ']', - ].join('\n'); - - // TODO(wafuwafu13): Fix - // assert.strictEqual(out, expected); - - out = util.inspect([1, 2, 3, 4], { compact: 1, colors: true }); - expected = '[ \u001b[33m1\u001b[39m, \u001b[33m2\u001b[39m, ' + - '\u001b[33m3\u001b[39m, \u001b[33m4\u001b[39m ]'; - - assert.strictEqual(out, expected); - - obj = [ - 'Object', 'Function', 'Array', - 'Number', 'parseFloat', 'parseInt', - 'Infinity', 'NaN', 'undefined', - 'Boolean', 'String', 'Symbol', - 'Date', 'Promise', 'RegExp', - 'Error', 'EvalError', 'RangeError', - 'ReferenceError', 'SyntaxError', 'TypeError', - 'URIError', 'JSON', 'Math', - 'console', 'Intl', 'ArrayBuffer', - 'Uint8Array', 'Int8Array', 'Uint16Array', - 'Int16Array', 'Uint32Array', 'Int32Array', - 'Float32Array', 'Float64Array', 'Uint8ClampedArray', - 'BigUint64Array', 'BigInt64Array', 'DataView', - 'Map', 'BigInt', 'Set', - 'WeakMap', 'WeakSet', 'Proxy', - 'Reflect', 'decodeURI', 'decodeURIComponent', - 'encodeURI', 'encodeURIComponent', 'escape', - 'unescape', 'eval', 'isFinite', - 'isNaN', 'SharedArrayBuffer', 'Atomics', - 'globalThis', 'WebAssembly', 'global', - 'process', 'Buffer', 'URL', - 'URLSearchParams', 'TextEncoder', 'TextDecoder', - 'clearInterval', 'clearTimeout', 'setInterval', - 'setTimeout', 'queueMicrotask', 'clearImmediate', - 'setImmediate', 'module', 'require', - 'assert', 'async_hooks', 'buffer', - 'child_process', 'cluster', 'crypto', - 'dgram', 'dns', 'domain', - 'events', 'fs', 'http', - 'http2', 'https', 'inspector', - 'net', 'os', 'path', - 'perf_hooks', 'punycode', 'querystring', - 'readline', 'repl', 'stream', - 'string_decoder', 'tls', 'trace_events', - 'tty', 'url', 'v8', - 'vm', 'worker_threads', 'zlib', - '_', '_error', 'util', - ]; - - out = util.inspect( - obj, - { compact: 3, breakLength: 80, maxArrayLength: 250 } - ); - expected = [ - '[', - " 'Object', 'Function', 'Array',", - " 'Number', 'parseFloat', 'parseInt',", - " 'Infinity', 'NaN', 'undefined',", - " 'Boolean', 'String', 'Symbol',", - " 'Date', 'Promise', 'RegExp',", - " 'Error', 'EvalError', 'RangeError',", - " 'ReferenceError', 'SyntaxError', 'TypeError',", - " 'URIError', 'JSON', 'Math',", - " 'console', 'Intl', 'ArrayBuffer',", - " 'Uint8Array', 'Int8Array', 'Uint16Array',", - " 'Int16Array', 'Uint32Array', 'Int32Array',", - " 'Float32Array', 'Float64Array', 'Uint8ClampedArray',", - " 'BigUint64Array', 'BigInt64Array', 'DataView',", - " 'Map', 'BigInt', 'Set',", - " 'WeakMap', 'WeakSet', 'Proxy',", - " 'Reflect', 'decodeURI', 'decodeURIComponent',", - " 'encodeURI', 'encodeURIComponent', 'escape',", - " 'unescape', 'eval', 'isFinite',", - " 'isNaN', 'SharedArrayBuffer', 'Atomics',", - " 'globalThis', 'WebAssembly', 'global',", - " 'process', 'Buffer', 'URL',", - " 'URLSearchParams', 'TextEncoder', 'TextDecoder',", - " 'clearInterval', 'clearTimeout', 'setInterval',", - " 'setTimeout', 'queueMicrotask', 'clearImmediate',", - " 'setImmediate', 'module', 'require',", - " 'assert', 'async_hooks', 'buffer',", - " 'child_process', 'cluster', 'crypto',", - " 'dgram', 'dns', 'domain',", - " 'events', 'fs', 'http',", - " 'http2', 'https', 'inspector',", - " 'net', 'os', 'path',", - " 'perf_hooks', 'punycode', 'querystring',", - " 'readline', 'repl', 'stream',", - " 'string_decoder', 'tls', 'trace_events',", - " 'tty', 'url', 'v8',", - " 'vm', 'worker_threads', 'zlib',", - " '_', '_error', 'util'", - ']', - ].join('\n'); - - // TODO(wafuwafu13): Fix - // assert.strictEqual(out, expected); -} - -// TODO(wafuwafu13): Fix -// { -// // Use a fake stack to verify the expected colored outcome. -// const stack = [ -// 'TypedError: Wonderful message!', -// ' at A.<anonymous> (/test/node_modules/foo/node_modules/bar/baz.js:2:7)', -// ' at Module._compile (node:internal/modules/cjs/loader:827:30)', -// ' at Fancy (node:vm:697:32)', -// // This file is not an actual Node.js core file. -// ' at tryModuleLoad (node:internal/modules/cjs/foo:629:12)', -// ' at Function.Module._load (node:internal/modules/cjs/loader:621:3)', -// // This file is not an actual Node.js core file. -// ' at Module.require [as weird/name] (node:internal/aaaaa/loader:735:19)', -// ' at require (node:internal/modules/cjs/helpers:14:16)', -// ' at /test/test-util-inspect.js:2239:9', -// ' at getActual (node:assert:592:5)', -// ]; -// const isNodeCoreFile = [ -// false, false, true, true, false, true, false, true, false, true, -// ]; -// const err = new TypeError('Wonderful message!'); -// err.stack = stack.join('\n'); -// util.inspect(err, { colors: true }).split('\n').forEach((line, i) => { -// let actual = stack[i].replace(/node_modules\/([a-z]+)/g, (a, m) => { -// return `node_modules/\u001b[4m${m}\u001b[24m`; -// }); -// if (isNodeCoreFile[i]) { -// actual = `\u001b[90m${actual}\u001b[39m`; -// } -// assert.strictEqual(actual, line); -// }); -// } - -// { -// // Cross platform checks. -// const err = new Error('foo'); -// util.inspect(err, { colors: true }).split('\n').forEach((line, i) => { -// assert(i < 2 || line.startsWith('\u001b[90m')); -// }); -// } - -// TODO(wafuwafu13): Implement "trace_events" -// { -// // Tracing class respects inspect depth. -// try { -// const trace = require('trace_events').createTracing({ categories: ['fo'] }); -// const actualDepth0 = util.inspect({ trace }, { depth: 0 }); -// assert.strictEqual(actualDepth0, '{ trace: [Tracing] }'); -// const actualDepth1 = util.inspect({ trace }, { depth: 1 }); -// assert.strictEqual( -// actualDepth1, -// "{ trace: Tracing { enabled: false, categories: 'fo' } }" -// ); -// } catch (err) { -// if (err.code !== 'ERR_TRACE_EVENTS_UNAVAILABLE') -// throw err; -// } -// } - -// Inspect prototype properties. -{ - class Foo extends Map { - prop = false; - prop2 = true; - get abc() { - return true; - } - get def() { - return false; - } - set def(v) {} - get xyz() { - return 'Should be ignored'; - } - func(a) {} - [util.inspect.custom]() { - return this; - } - } - - class Bar extends Foo { - abc = true; - prop = true; - get xyz() { - return 'YES!'; - } - [util.inspect.custom]() { - return this; - } - } - - const bar = new Bar(); - - assert.strictEqual( - inspect(bar), - 'Bar(0) [Map] { prop: true, prop2: true, abc: true }' - ); - // TODO(wafuwafu13): Fix - // assert.strictEqual( - // inspect(bar, { showHidden: true, getters: true, colors: false }), - // 'Bar(0) [Map] {\n' + - // ' prop: true,\n' + - // ' prop2: true,\n' + - // ' abc: true,\n' + - // " [xyz]: [Getter: 'YES!'],\n" + - // ' [def]: [Getter/Setter: false]\n' + - // '}' - // ); - // assert.strictEqual( - // inspect(bar, { showHidden: true, getters: false, colors: true }), - // 'Bar(0) [Map] {\n' + - // ' prop: \x1B[33mtrue\x1B[39m,\n' + - // ' prop2: \x1B[33mtrue\x1B[39m,\n' + - // ' abc: \x1B[33mtrue\x1B[39m,\n' + - // ' \x1B[2m[xyz]: \x1B[36m[Getter]\x1B[39m\x1B[22m,\n' + - // ' \x1B[2m[def]: \x1B[36m[Getter/Setter]\x1B[39m\x1B[22m\n' + - // '}' - // ); - - // const obj = Object.create({ abc: true, def: 5, toString() {} }); - // assert.strictEqual( - // inspect(obj, { showHidden: true, colors: true }), - // '{ \x1B[2mabc: \x1B[33mtrue\x1B[39m\x1B[22m, ' + - // '\x1B[2mdef: \x1B[33m5\x1B[39m\x1B[22m }' - // ); - - // assert.strictEqual( - // inspect(Object.getPrototypeOf(bar), { showHidden: true, getters: true }), - // '<ref *1> Foo [Map] {\n' + - // ' [constructor]: [class Bar extends Foo] {\n' + - // ' [length]: 0,\n' + - // " [name]: 'Bar',\n" + - // ' [prototype]: [Circular *1],\n' + - // ' [Symbol(Symbol.species)]: [Getter: <Inspection threw ' + - // "(Symbol.prototype.toString requires that 'this' be a Symbol)>]\n" + - // ' },\n' + - // " [xyz]: [Getter: 'YES!'],\n" + - // ' [Symbol(nodejs.util.inspect.custom)]: ' + - // '[Function: [nodejs.util.inspect.custom]] {\n' + - // ' [length]: 0,\n' + - // " [name]: '[nodejs.util.inspect.custom]'\n" + - // ' },\n' + - // ' [abc]: [Getter: true],\n' + - // ' [def]: [Getter/Setter: false]\n' + - // ' }' - // ); - - // assert.strictEqual( - // inspect(Object.getPrototypeOf(bar)), - // 'Foo [Map] {}' - // ); - - // assert.strictEqual( - // inspect(Object.getPrototypeOf(new Foo())), - // 'Map {}' - // ); -} - -// Check that prototypes with a null prototype are inspectable. -// Regression test for https://github.com/nodejs/node/issues/35730 -{ - function Func() {} - Func.prototype = null; - const object = {}; - object.constructor = Func; - - assert.strictEqual(util.inspect(object), '{ constructor: [Function: Func] }'); -} - -// Test changing util.inspect.colors colors and aliases. -{ - const colors = util.inspect.colors; - - const originalValue = colors.gray; - - // "grey" is reference-equal alias of "gray". - assert.strictEqual(colors.grey, colors.gray); - - // Assigninging one should assign the other. This tests that the alias setter - // function keeps things reference-equal. - colors.gray = [0, 0]; - assert.deepStrictEqual(colors.gray, [0, 0]); - assert.strictEqual(colors.grey, colors.gray); - - colors.grey = [1, 1]; - assert.deepStrictEqual(colors.grey, [1, 1]); - assert.strictEqual(colors.grey, colors.gray); - - // Restore original value to avoid side effects in other tests. - colors.gray = originalValue; - assert.deepStrictEqual(colors.gray, originalValue); - assert.strictEqual(colors.grey, colors.gray); -} - -// TODO(wafuwafu13): Implement 'vm' -// // https://github.com/nodejs/node/issues/31889 -// { -// v8.setFlagsFromString('--allow-natives-syntax'); -// const undetectable = vm.runInThisContext('%GetUndetectable()'); -// v8.setFlagsFromString('--no-allow-natives-syntax'); -// assert.strictEqual(inspect(undetectable), '{}'); -// } - -// Truncate output for Primitives with 1 character left -{ - assert.strictEqual(util.inspect('bl', { maxStringLength: 1 }), - "'b'... 1 more character"); -} - -{ - const x = 'a'.repeat(1e6); - assert(util.inspect(x).endsWith('... 990000 more characters')); - assert.strictEqual( - util.inspect(x, { maxStringLength: 4 }), - "'aaaa'... 999996 more characters" - ); - assert.match(util.inspect(x, { maxStringLength: null }), /a'$/); -} - -// TODO(wafuwafu13): Implement 'vm' -// { -// // Verify that util.inspect() invokes custom inspect functions on objects -// // from other vm.Contexts but does not pass data from its own Context to that -// // function. -// const target = vm.runInNewContext(` -// ({ -// [Symbol.for('nodejs.util.inspect.custom')](depth, ctx) { -// this.depth = depth; -// this.ctx = ctx; -// try { -// this.stylized = ctx.stylize('🐈'); -// } catch (e) { -// this.stylizeException = e; -// } -// return this.stylized; -// } -// }) -// `, Object.create(null)); -// assert.strictEqual(target.ctx, undefined); - -// { -// // Subtest 1: Just try to inspect the object with default options. -// assert.strictEqual(util.inspect(target), '🐈'); -// assert.strictEqual(typeof target.ctx, 'object'); -// const objectGraph = fullObjectGraph(target); -// assert(!objectGraph.has(Object)); -// assert(!objectGraph.has(Function)); -// } - -// { -// // Subtest 2: Use a stylize function that returns a non-primitive. -// const output = util.inspect(target, { -// stylize: common.mustCall((str) => { -// return {}; -// }) -// }); -// assert.strictEqual(output, '[object Object]'); -// assert.strictEqual(typeof target.ctx, 'object'); -// const objectGraph = fullObjectGraph(target); -// assert(!objectGraph.has(Object)); -// assert(!objectGraph.has(Function)); -// } - -// { -// // Subtest 3: Use a stylize function that throws an exception. -// const output = util.inspect(target, { -// stylize: common.mustCall((str) => { -// throw new Error('oops'); -// }) -// }); -// assert.strictEqual(output, '🐈'); -// assert.strictEqual(typeof target.ctx, 'object'); -// const objectGraph = fullObjectGraph(target); -// assert(!objectGraph.has(Object)); -// assert(!objectGraph.has(Function)); -// } - -// function fullObjectGraph(value) { -// const graph = new Set([value]); - -// for (const entry of graph) { -// if ((typeof entry !== 'object' && typeof entry !== 'function') || -// entry === null) { -// continue; -// } - -// graph.add(Object.getPrototypeOf(entry)); -// const descriptors = Object.values( -// Object.getOwnPropertyDescriptors(entry)); -// for (const descriptor of descriptors) { -// graph.add(descriptor.value); -// graph.add(descriptor.set); -// graph.add(descriptor.get); -// } -// } - -// return graph; -// } - -// // Consistency check. -// assert(fullObjectGraph(global).has(Function.prototype)); -// } - -{ - // Confirm that own constructor value displays correctly. - - function Fhqwhgads() {} - - const sterrance = new Fhqwhgads(); - sterrance.constructor = Fhqwhgads; - - assert.strictEqual( - util.inspect(sterrance, { showHidden: true }), - 'Fhqwhgads {\n' + - ' constructor: <ref *1> [Function: Fhqwhgads] {\n' + - ' [length]: 0,\n' + - " [name]: 'Fhqwhgads',\n" + - ' [prototype]: { [constructor]: [Circular *1] }\n' + - ' }\n' + - '}' - ); -} - -// TODO(wafuwafu13): Fix TypeError: main.hasOwnProperty is not a function -// { -// // Confirm null prototype of generator prototype displays as expected. - -// function getProtoOfProto() { -// return Object.getPrototypeOf(Object.getPrototypeOf(function* () {})); -// } - -// function* generator() {} - -// const generatorPrototype = Object.getPrototypeOf(generator); -// const originalProtoOfProto = Object.getPrototypeOf(generatorPrototype); -// assert.strictEqual(getProtoOfProto(), originalProtoOfProto); -// Object.setPrototypeOf(generatorPrototype, null); -// assert.notStrictEqual(getProtoOfProto, originalProtoOfProto); - -// // This is the actual test. The other assertions in this block are about -// // making sure the test is set up correctly and isn't polluting other tests. -// assert.strictEqual( -// util.inspect(generator, { showHidden: true }), -// '[GeneratorFunction: generator] {\n' + -// ' [length]: 0,\n' + -// " [name]: 'generator',\n" + -// " [prototype]: Object [Generator] { [Symbol(Symbol.toStringTag)]: 'Generator' },\n" + // eslint-disable-line max-len -// " [Symbol(Symbol.toStringTag)]: 'GeneratorFunction'\n" + -// '}' -// ); - -// // Reset so we don't pollute other tests -// Object.setPrototypeOf(generatorPrototype, originalProtoOfProto); -// assert.strictEqual(getProtoOfProto(), originalProtoOfProto); -// } - -{ - // Test for when breakLength results in a single column. - const obj = Array(9).fill('fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf'); - assert.strictEqual( - util.inspect(obj, { breakLength: 256 }), - '[\n' + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf',\n" + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf',\n" + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf',\n" + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf',\n" + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf',\n" + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf',\n" + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf',\n" + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf',\n" + - " 'fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf'\n" + - ']' - ); -} - -{ - assert.strictEqual( - util.inspect({ ['__proto__']: { a: 1 } }), - "{ ['__proto__']: { a: 1 } }" - ); -} diff --git a/cli/tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js b/cli/tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js deleted file mode 100644 index 25caac1f7..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-isDeepStrictEqual.js +++ /dev/null @@ -1,608 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -"use strict"; - -// Confirm functionality of `util.isDeepStrictEqual()`. - -require("../common"); - -const assert = require("assert"); -const util = require("util"); - -class MyDate extends Date { - constructor(...args) { - super(...args); - this[0] = "1"; - } -} - -class MyRegExp extends RegExp { - constructor(...args) { - super(...args); - this[0] = "1"; - } -} - -{ - const arr = new Uint8Array([120, 121, 122, 10]); - const buf = Buffer.from(arr); - // They have different [[Prototype]] - assert.strictEqual(util.isDeepStrictEqual(arr, buf), false); - - const buf2 = Buffer.from(arr); - buf2.prop = 1; - - assert.strictEqual(util.isDeepStrictEqual(buf2, buf), false); - - const arr2 = new Uint8Array([120, 121, 122, 10]); - arr2.prop = 5; - assert.strictEqual(util.isDeepStrictEqual(arr, arr2), false); -} - -{ - const date = new Date("2016"); - - const date2 = new MyDate("2016"); - - // deepStrictEqual checks own properties - assert.strictEqual(util.isDeepStrictEqual(date, date2), false); - assert.strictEqual(util.isDeepStrictEqual(date2, date), false); -} - -{ - const re1 = new RegExp("test"); - const re2 = new MyRegExp("test"); - - // deepStrictEqual checks all properties - assert.strictEqual(util.isDeepStrictEqual(re1, re2), false); -} - -{ - // For these cases, deepStrictEqual should throw. - const similar = new Set([ - { 0: "1" }, // Object - { 0: 1 }, // Object - new String("1"), // Object - ["1"], // Array - [1], // Array - new MyDate("2016"), // Date with this[0] = '1' - new MyRegExp("test"), // RegExp with this[0] = '1' - new Int8Array([1]), // Int8Array - new Uint8Array([1]), // Uint8Array - new Int16Array([1]), // Int16Array - new Uint16Array([1]), // Uint16Array - new Int32Array([1]), // Int32Array - new Uint32Array([1]), // Uint32Array - Buffer.from([1]), // Buffer - ]); - - for (const a of similar) { - for (const b of similar) { - if (a !== b) { - assert.strictEqual(util.isDeepStrictEqual(a, b), false); - } - } - } -} - -function utilIsDeepStrict(a, b) { - assert.strictEqual(util.isDeepStrictEqual(a, b), true); - assert.strictEqual(util.isDeepStrictEqual(b, a), true); -} -function notUtilIsDeepStrict(a, b) { - assert.strictEqual(util.isDeepStrictEqual(a, b), false); - assert.strictEqual(util.isDeepStrictEqual(b, a), false); -} - -// es6 Maps and Sets -utilIsDeepStrict(new Set(), new Set()); -utilIsDeepStrict(new Map(), new Map()); - -utilIsDeepStrict(new Set([1, 2, 3]), new Set([1, 2, 3])); -notUtilIsDeepStrict(new Set([1, 2, 3]), new Set([1, 2, 3, 4])); -notUtilIsDeepStrict(new Set([1, 2, 3, 4]), new Set([1, 2, 3])); -utilIsDeepStrict(new Set(["1", "2", "3"]), new Set(["1", "2", "3"])); -utilIsDeepStrict( - new Set([ - [1, 2], - [3, 4], - ]), - new Set([ - [3, 4], - [1, 2], - ]) -); - -{ - const a = [1, 2]; - const b = [3, 4]; - const c = [1, 2]; - const d = [3, 4]; - - utilIsDeepStrict( - { a: a, b: b, s: new Set([a, b]) }, - { a: c, b: d, s: new Set([d, c]) } - ); -} - -utilIsDeepStrict( - new Map([ - [1, 1], - [2, 2], - ]), - new Map([ - [1, 1], - [2, 2], - ]) -); -utilIsDeepStrict( - new Map([ - [1, 1], - [2, 2], - ]), - new Map([ - [2, 2], - [1, 1], - ]) -); -notUtilIsDeepStrict( - new Map([ - [1, 1], - [2, 2], - ]), - new Map([ - [1, 2], - [2, 1], - ]) -); -notUtilIsDeepStrict( - new Map([ - [[1], 1], - [{}, 2], - ]), - new Map([ - [[1], 2], - [{}, 1], - ]) -); - -notUtilIsDeepStrict(new Set([1]), [1]); -notUtilIsDeepStrict(new Set(), []); -notUtilIsDeepStrict(new Set(), {}); - -notUtilIsDeepStrict(new Map([["a", 1]]), { a: 1 }); -notUtilIsDeepStrict(new Map(), []); -notUtilIsDeepStrict(new Map(), {}); - -notUtilIsDeepStrict(new Set(["1"]), new Set([1])); - -notUtilIsDeepStrict(new Map([["1", "a"]]), new Map([[1, "a"]])); -notUtilIsDeepStrict(new Map([["a", "1"]]), new Map([["a", 1]])); -notUtilIsDeepStrict(new Map([["a", "1"]]), new Map([["a", 2]])); - -utilIsDeepStrict(new Set([{}]), new Set([{}])); - -// Ref: https://github.com/nodejs/node/issues/13347 -notUtilIsDeepStrict( - new Set([{ a: 1 }, { a: 1 }]), - new Set([{ a: 1 }, { a: 2 }]) -); -notUtilIsDeepStrict( - new Set([{ a: 1 }, { a: 1 }, { a: 2 }]), - new Set([{ a: 1 }, { a: 2 }, { a: 2 }]) -); -notUtilIsDeepStrict( - new Map([ - [{ x: 1 }, 5], - [{ x: 1 }, 5], - ]), - new Map([ - [{ x: 1 }, 5], - [{ x: 2 }, 5], - ]) -); - -notUtilIsDeepStrict(new Set([3, "3"]), new Set([3, 4])); -notUtilIsDeepStrict( - new Map([ - [3, 0], - ["3", 0], - ]), - new Map([ - [3, 0], - [4, 0], - ]) -); - -notUtilIsDeepStrict( - new Set([{ a: 1 }, { a: 1 }, { a: 2 }]), - new Set([{ a: 1 }, { a: 2 }, { a: 2 }]) -); - -// Mixed primitive and object keys -utilIsDeepStrict( - new Map([ - [1, "a"], - [{}, "a"], - ]), - new Map([ - [1, "a"], - [{}, "a"], - ]) -); -utilIsDeepStrict(new Set([1, "a", [{}, "a"]]), new Set([1, "a", [{}, "a"]])); - -// This is an awful case, where a map contains multiple equivalent keys: -notUtilIsDeepStrict( - new Map([ - [1, "a"], - ["1", "b"], - ]), - new Map([ - ["1", "a"], - [true, "b"], - ]) -); -notUtilIsDeepStrict(new Set(["a"]), new Set(["b"])); -utilIsDeepStrict( - new Map([ - [{}, "a"], - [{}, "b"], - ]), - new Map([ - [{}, "b"], - [{}, "a"], - ]) -); -notUtilIsDeepStrict( - new Map([ - [true, "a"], - ["1", "b"], - [1, "a"], - ]), - new Map([ - ["1", "a"], - [1, "b"], - [true, "a"], - ]) -); -notUtilIsDeepStrict( - new Map([ - [true, "a"], - ["1", "b"], - [1, "c"], - ]), - new Map([ - ["1", "a"], - [1, "b"], - [true, "a"], - ]) -); - -// Similar object keys -notUtilIsDeepStrict(new Set([{}, {}]), new Set([{}, 1])); -notUtilIsDeepStrict( - new Set([ - [{}, 1], - [{}, 1], - ]), - new Set([ - [{}, 1], - [1, 1], - ]) -); -notUtilIsDeepStrict( - new Map([ - [{}, 1], - [{}, 1], - ]), - new Map([ - [{}, 1], - [1, 1], - ]) -); -notUtilIsDeepStrict( - new Map([ - [{}, 1], - [true, 1], - ]), - new Map([ - [{}, 1], - [1, 1], - ]) -); - -// Similar primitive key / values -notUtilIsDeepStrict(new Set([1, true, false]), new Set(["1", 0, "0"])); -notUtilIsDeepStrict( - new Map([ - [1, 5], - [true, 5], - [false, 5], - ]), - new Map([ - ["1", 5], - [0, 5], - ["0", 5], - ]) -); - -// Undefined value in Map -utilIsDeepStrict(new Map([[1, undefined]]), new Map([[1, undefined]])); -notUtilIsDeepStrict(new Map([[1, null]]), new Map([["1", undefined]])); -notUtilIsDeepStrict(new Map([[1, undefined]]), new Map([[2, undefined]])); - -// null as key -utilIsDeepStrict(new Map([[null, 3]]), new Map([[null, 3]])); -notUtilIsDeepStrict(new Map([[null, undefined]]), new Map([[undefined, null]])); -notUtilIsDeepStrict(new Set([null]), new Set([undefined])); - -// GH-6416. Make sure circular refs don't throw. -{ - const b = {}; - b.b = b; - const c = {}; - c.b = c; - - utilIsDeepStrict(b, c); - - const d = {}; - d.a = 1; - d.b = d; - const e = {}; - e.a = 1; - e.b = {}; - - notUtilIsDeepStrict(d, e); -} - -// GH-14441. Circular structures should be consistent -{ - const a = {}; - const b = {}; - a.a = a; - b.a = {}; - b.a.a = a; - utilIsDeepStrict(a, b); -} - -{ - const a = new Set(); - const b = new Set(); - const c = new Set(); - a.add(a); - b.add(b); - c.add(a); - utilIsDeepStrict(b, c); -} - -// GH-7178. Ensure reflexivity of deepEqual with `arguments` objects. -{ - const args = (function () { - return arguments; - })(); - notUtilIsDeepStrict([], args); -} - -// More checking that arguments objects are handled correctly -{ - // eslint-disable-next-line func-style - const returnArguments = function () { - return arguments; - }; - - const someArgs = returnArguments("a"); - const sameArgs = returnArguments("a"); - const diffArgs = returnArguments("b"); - - notUtilIsDeepStrict(someArgs, ["a"]); - notUtilIsDeepStrict(someArgs, { 0: "a" }); - notUtilIsDeepStrict(someArgs, diffArgs); - utilIsDeepStrict(someArgs, sameArgs); -} - -{ - const values = [ - 123, - Infinity, - 0, - null, - undefined, - false, - true, - {}, - [], - () => {}, - ]; - utilIsDeepStrict(new Set(values), new Set(values)); - utilIsDeepStrict(new Set(values), new Set(values.reverse())); - - const mapValues = values.map((v) => [v, { a: 5 }]); - utilIsDeepStrict(new Map(mapValues), new Map(mapValues)); - utilIsDeepStrict(new Map(mapValues), new Map(mapValues.reverse())); -} - -{ - const s1 = new Set(); - const s2 = new Set(); - s1.add(1); - s1.add(2); - s2.add(2); - s2.add(1); - utilIsDeepStrict(s1, s2); -} - -{ - const m1 = new Map(); - const m2 = new Map(); - const obj = { a: 5, b: 6 }; - m1.set(1, obj); - m1.set(2, "hi"); - m1.set(3, [1, 2, 3]); - - m2.set(2, "hi"); // different order - m2.set(1, obj); - m2.set(3, [1, 2, 3]); // Deep equal, but not reference equal. - - utilIsDeepStrict(m1, m2); -} - -{ - const m1 = new Map(); - const m2 = new Map(); - - // m1 contains itself. - m1.set(1, m1); - m2.set(1, new Map()); - - notUtilIsDeepStrict(m1, m2); -} - -{ - const map1 = new Map([[1, 1]]); - const map2 = new Map([[1, "1"]]); - assert.strictEqual(util.isDeepStrictEqual(map1, map2), false); -} - -{ - // Two equivalent sets / maps with different key/values applied shouldn't be - // the same. This is a terrible idea to do in practice, but deepEqual should - // still check for it. - const s1 = new Set(); - const s2 = new Set(); - s1.x = 5; - notUtilIsDeepStrict(s1, s2); - - const m1 = new Map(); - const m2 = new Map(); - m1.x = 5; - notUtilIsDeepStrict(m1, m2); -} - -{ - // Circular references. - const s1 = new Set(); - s1.add(s1); - const s2 = new Set(); - s2.add(s2); - utilIsDeepStrict(s1, s2); - - const m1 = new Map(); - m1.set(2, m1); - const m2 = new Map(); - m2.set(2, m2); - utilIsDeepStrict(m1, m2); - - const m3 = new Map(); - m3.set(m3, 2); - const m4 = new Map(); - m4.set(m4, 2); - utilIsDeepStrict(m3, m4); -} - -// Handle sparse arrays -utilIsDeepStrict([1, , , 3], [1, , , 3]); -notUtilIsDeepStrict([1, , , 3], [1, , , 3, , ,]); - -// Handle different error messages -{ - const err1 = new Error("foo1"); - const err2 = new Error("foo2"); - const err3 = new TypeError("foo1"); - notUtilIsDeepStrict(err1, err2, assert.AssertionError); - notUtilIsDeepStrict(err1, err3, assert.AssertionError); - notUtilIsDeepStrict(err1, {}, assert.AssertionError); -} - -// Handle NaN -assert.strictEqual(util.isDeepStrictEqual(NaN, NaN), true); -assert.strictEqual(util.isDeepStrictEqual({ a: NaN }, { a: NaN }), true); -assert.strictEqual( - util.isDeepStrictEqual([1, 2, NaN, 4], [1, 2, NaN, 4]), - true -); - -// Handle boxed primitives -{ - const boxedString = new String("test"); - const boxedSymbol = Object(Symbol()); - notUtilIsDeepStrict(new Boolean(true), Object(false)); - notUtilIsDeepStrict(Object(true), new Number(1)); - notUtilIsDeepStrict(new Number(2), new Number(1)); - notUtilIsDeepStrict(boxedSymbol, Object(Symbol())); - notUtilIsDeepStrict(boxedSymbol, {}); - utilIsDeepStrict(boxedSymbol, boxedSymbol); - utilIsDeepStrict(Object(true), Object(true)); - utilIsDeepStrict(Object(2), Object(2)); - utilIsDeepStrict(boxedString, Object("test")); - boxedString.slow = true; - notUtilIsDeepStrict(boxedString, Object("test")); - boxedSymbol.slow = true; - notUtilIsDeepStrict(boxedSymbol, {}); - utilIsDeepStrict(Object(BigInt(1)), Object(BigInt(1))); - notUtilIsDeepStrict(Object(BigInt(1)), Object(BigInt(2))); - - const booleanish = new Boolean(true); - Object.defineProperty(booleanish, Symbol.toStringTag, { value: "String" }); - Object.setPrototypeOf(booleanish, String.prototype); - notUtilIsDeepStrict(booleanish, new String("true")); - - const numberish = new Number(42); - Object.defineProperty(numberish, Symbol.toStringTag, { value: "String" }); - Object.setPrototypeOf(numberish, String.prototype); - notUtilIsDeepStrict(numberish, new String("42")); - - const stringish = new String("0"); - Object.defineProperty(stringish, Symbol.toStringTag, { value: "Number" }); - Object.setPrototypeOf(stringish, Number.prototype); - notUtilIsDeepStrict(stringish, new Number(0)); - - const bigintish = new Object(BigInt(42)); - Object.defineProperty(bigintish, Symbol.toStringTag, { value: "String" }); - Object.setPrototypeOf(bigintish, String.prototype); - notUtilIsDeepStrict(bigintish, new String("42")); - - const symbolish = new Object(Symbol("fhqwhgads")); - Object.defineProperty(symbolish, Symbol.toStringTag, { value: "String" }); - Object.setPrototypeOf(symbolish, String.prototype); - notUtilIsDeepStrict(symbolish, new String("fhqwhgads")); -} - -// Minus zero -notUtilIsDeepStrict(0, -0); -utilIsDeepStrict(-0, -0); - -// Handle symbols (enumerable only) -{ - const symbol1 = Symbol(); - const obj1 = { [symbol1]: 1 }; - const obj2 = { [symbol1]: 1 }; - const obj3 = { [Symbol()]: 1 }; - const obj4 = {}; - // Add a non enumerable symbol as well. It is going to be ignored! - Object.defineProperty(obj2, Symbol(), { value: 1 }); - Object.defineProperty(obj4, symbol1, { value: 1 }); - notUtilIsDeepStrict(obj1, obj3); - utilIsDeepStrict(obj1, obj2); - notUtilIsDeepStrict(obj1, obj4); - // TypedArrays have a fast path. Test for this as well. - const a = new Uint8Array(4); - const b = new Uint8Array(4); - a[symbol1] = true; - b[symbol1] = false; - notUtilIsDeepStrict(a, b); - b[symbol1] = true; - utilIsDeepStrict(a, b); - // The same as TypedArrays is valid for boxed primitives - const boxedStringA = new String("test"); - const boxedStringB = new String("test"); - boxedStringA[symbol1] = true; - notUtilIsDeepStrict(boxedStringA, boxedStringB); - boxedStringA[symbol1] = true; - utilIsDeepStrict(a, b); -} diff --git a/cli/tests/node_compat/test/parallel/test-util-promisify.js b/cli/tests/node_compat/test/parallel/test-util-promisify.js deleted file mode 100644 index 8046f6fb8..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-promisify.js +++ /dev/null @@ -1,218 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -// Flags: --expose-internals -const common = require('../common'); -const assert = require('assert'); -const fs = require('fs'); -const vm = require('vm'); -const { promisify } = require('util'); -const { customPromisifyArgs } = require('internal/util'); - -const stat = promisify(fs.stat); - -// TODO(wafuwafu13): Fix -// { -// const promise = stat(__filename); -// assert(promise instanceof Promise); -// promise.then(common.mustCall((value) => { -// assert.deepStrictEqual(value, fs.statSync(__filename)); -// })); -// } - -{ - const promise = stat('/dontexist'); - promise.catch(common.mustCall((error) => { - assert(error.message.includes('ENOENT: no such file or directory, stat')); - })); -} - -{ - function fn() {} - - function promisifedFn() {} - fn[promisify.custom] = promisifedFn; - assert.strictEqual(promisify(fn), promisifedFn); - assert.strictEqual(promisify(promisify(fn)), promisifedFn); -} - -{ - function fn() {} - - function promisifiedFn() {} - - // util.promisify.custom is a shared symbol which can be accessed - // as `Symbol.for("nodejs.util.promisify.custom")`. - const kCustomPromisifiedSymbol = Symbol.for('nodejs.util.promisify.custom'); - fn[kCustomPromisifiedSymbol] = promisifiedFn; - - assert.strictEqual(kCustomPromisifiedSymbol, promisify.custom); - assert.strictEqual(promisify(fn), promisifiedFn); - assert.strictEqual(promisify(promisify(fn)), promisifiedFn); -} - -{ - function fn() {} - fn[promisify.custom] = 42; - assert.throws( - () => promisify(fn), - { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError' } - ); -} - -// TODO(wafuwafu13): Fix -// { -// const firstValue = 5; -// const secondValue = 17; - -// function fn(callback) { -// callback(null, firstValue, secondValue); -// } - -// fn[customPromisifyArgs] = ['first', 'second']; - -// promisify(fn)().then(common.mustCall((obj) => { -// assert.deepStrictEqual(obj, { first: firstValue, second: secondValue }); -// })); -// } - -{ - const fn = vm.runInNewContext('(function() {})'); - assert.notStrictEqual(Object.getPrototypeOf(promisify(fn)), - Function.prototype); -} - -{ - function fn(callback) { - callback(null, 'foo', 'bar'); - } - promisify(fn)().then(common.mustCall((value) => { - assert.deepStrictEqual(value, 'foo'); - })); -} - -{ - function fn(callback) { - callback(null); - } - promisify(fn)().then(common.mustCall((value) => { - assert.strictEqual(value, undefined); - })); -} - -{ - function fn(callback) { - callback(); - } - promisify(fn)().then(common.mustCall((value) => { - assert.strictEqual(value, undefined); - })); -} - -{ - function fn(err, val, callback) { - callback(err, val); - } - promisify(fn)(null, 42).then(common.mustCall((value) => { - assert.strictEqual(value, 42); - })); -} - -{ - function fn(err, val, callback) { - callback(err, val); - } - promisify(fn)(new Error('oops'), null).catch(common.mustCall((err) => { - assert.strictEqual(err.message, 'oops'); - })); -} - -{ - function fn(err, val, callback) { - callback(err, val); - } - - (async () => { - const value = await promisify(fn)(null, 42); - assert.strictEqual(value, 42); - })().then(common.mustCall()); -} - -{ - const o = {}; - const fn = promisify(function(cb) { - - cb(null, this === o); - }); - - o.fn = fn; - - o.fn().then(common.mustCall((val) => assert(val))); -} - -{ - const err = new Error('Should not have called the callback with the error.'); - const stack = err.stack; - - const fn = promisify(function(cb) { - cb(null); - cb(err); - }); - - (async () => { - await fn(); - await Promise.resolve(); - return assert.strictEqual(stack, err.stack); - })().then(common.mustCall()); -} - -{ - function c() { } - const a = promisify(function() { }); - const b = promisify(a); - assert.notStrictEqual(c, a); - assert.strictEqual(a, b); -} - -{ - let errToThrow; - const thrower = promisify(function(a, b, c, cb) { - errToThrow = new Error(); - throw errToThrow; - }); - thrower(1, 2, 3) - .then(assert.fail) - .then(assert.fail, (e) => assert.strictEqual(e, errToThrow)); -} - -{ - const err = new Error(); - - const a = promisify((cb) => cb(err))(); - const b = promisify(() => { throw err; })(); - - Promise.all([ - a.then(assert.fail, function(e) { - assert.strictEqual(err, e); - }), - b.then(assert.fail, function(e) { - assert.strictEqual(err, e); - }), - ]); -} - -[undefined, null, true, 0, 'str', {}, [], Symbol()].forEach((input) => { - assert.throws( - () => promisify(input), - { - code: 'ERR_INVALID_ARG_TYPE', - name: 'TypeError', - message: 'The "original" argument must be of type function.' + - common.invalidArgTypeHelper(input) - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-util-types-exists.js b/cli/tests/node_compat/test/parallel/test-util-types-exists.js deleted file mode 100644 index 0c04a38b0..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-types-exists.js +++ /dev/null @@ -1,13 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -assert.strictEqual(require('util/types'), require('util').types); diff --git a/cli/tests/node_compat/test/parallel/test-util-types.js b/cli/tests/node_compat/test/parallel/test-util-types.js deleted file mode 100644 index d401a282c..000000000 --- a/cli/tests/node_compat/test/parallel/test-util-types.js +++ /dev/null @@ -1,304 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -// Flags: --experimental-vm-modules --expose-internals -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const { types, inspect } = require('util'); -const vm = require('vm'); -// TODO(wafuwafu13): Implement "internalBinding" -// const { internalBinding } = require('internal/test/binding'); -// const { JSStream } = internalBinding('js_stream'); - -// TODO(wafuwafu13): Implement "JSStream" -// const external = (new JSStream())._externalStream; - -for (const [ value, _method ] of [ - // TODO(wafuwafu13): Implement "JSStream" - // [ external, 'isExternal' ], - [ new Date() ], - [ (function() { return arguments; })(), 'isArgumentsObject' ], - [ new Boolean(), 'isBooleanObject' ], - [ new Number(), 'isNumberObject' ], - [ new String(), 'isStringObject' ], - [ Object(Symbol()), 'isSymbolObject' ], - [ Object(BigInt(0)), 'isBigIntObject' ], - [ new Error(), 'isNativeError' ], - [ new RegExp() ], - [ async function() {}, 'isAsyncFunction' ], - [ function*() {}, 'isGeneratorFunction' ], - [ (function*() {})(), 'isGeneratorObject' ], - [ Promise.resolve() ], - [ new Map() ], - [ new Set() ], - [ (new Map())[Symbol.iterator](), 'isMapIterator' ], - [ (new Set())[Symbol.iterator](), 'isSetIterator' ], - [ new WeakMap() ], - [ new WeakSet() ], - [ new ArrayBuffer() ], - [ new Uint8Array() ], - [ new Uint8ClampedArray() ], - [ new Uint16Array() ], - [ new Uint32Array() ], - [ new Int8Array() ], - [ new Int16Array() ], - [ new Int32Array() ], - [ new Float32Array() ], - [ new Float64Array() ], - [ new BigInt64Array() ], - [ new BigUint64Array() ], - // [ Object.defineProperty(new Uint8Array(), - // Symbol.toStringTag, - // { value: 'foo' }) ], - [ new DataView(new ArrayBuffer()) ], - [ new SharedArrayBuffer() ], - [ new Proxy({}, {}), 'isProxy' ], -]) { - const method = _method || `is${value.constructor.name}`; - assert(method in types, `Missing ${method} for ${inspect(value)}`); - assert(types[method](value), `Want ${inspect(value)} to match ${method}`); - - for (const key of Object.keys(types)) { - if ((types.isArrayBufferView(value) || - types.isAnyArrayBuffer(value)) && key.includes('Array') || - key === 'isBoxedPrimitive') { - continue; - } - - assert.strictEqual(types[key](value), - key === method, - `${inspect(value)}: ${key}, ` + - `${method}, ${types[key](value)}`); - } -} - -// Check boxed primitives. -[ - new Boolean(), - new Number(), - new String(), - Object(Symbol()), - Object(BigInt(0)), -].forEach((entry) => assert(types.isBoxedPrimitive(entry))); - -{ - assert(!types.isUint8Array({ [Symbol.toStringTag]: 'Uint8Array' })); - assert(types.isUint8Array(vm.runInNewContext('new Uint8Array'))); - - assert(!types.isUint8ClampedArray({ - [Symbol.toStringTag]: 'Uint8ClampedArray' - })); - assert(types.isUint8ClampedArray( - vm.runInNewContext('new Uint8ClampedArray') - )); - - assert(!types.isUint16Array({ [Symbol.toStringTag]: 'Uint16Array' })); - assert(types.isUint16Array(vm.runInNewContext('new Uint16Array'))); - - assert(!types.isUint32Array({ [Symbol.toStringTag]: 'Uint32Array' })); - assert(types.isUint32Array(vm.runInNewContext('new Uint32Array'))); - - assert(!types.isInt8Array({ [Symbol.toStringTag]: 'Int8Array' })); - assert(types.isInt8Array(vm.runInNewContext('new Int8Array'))); - - assert(!types.isInt16Array({ [Symbol.toStringTag]: 'Int16Array' })); - assert(types.isInt16Array(vm.runInNewContext('new Int16Array'))); - - assert(!types.isInt32Array({ [Symbol.toStringTag]: 'Int32Array' })); - assert(types.isInt32Array(vm.runInNewContext('new Int32Array'))); - - assert(!types.isFloat32Array({ [Symbol.toStringTag]: 'Float32Array' })); - assert(types.isFloat32Array(vm.runInNewContext('new Float32Array'))); - - assert(!types.isFloat64Array({ [Symbol.toStringTag]: 'Float64Array' })); - assert(types.isFloat64Array(vm.runInNewContext('new Float64Array'))); - - assert(!types.isBigInt64Array({ [Symbol.toStringTag]: 'BigInt64Array' })); - assert(types.isBigInt64Array(vm.runInNewContext('new BigInt64Array'))); - - assert(!types.isBigUint64Array({ [Symbol.toStringTag]: 'BigUint64Array' })); - assert(types.isBigUint64Array(vm.runInNewContext('new BigUint64Array'))); -} - -{ - const primitive = true; - const arrayBuffer = new ArrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - const dataView = new DataView(arrayBuffer); - const uint8Array = new Uint8Array(arrayBuffer); - const uint8ClampedArray = new Uint8ClampedArray(arrayBuffer); - const uint16Array = new Uint16Array(arrayBuffer); - const uint32Array = new Uint32Array(arrayBuffer); - const int8Array = new Int8Array(arrayBuffer); - const int16Array = new Int16Array(arrayBuffer); - const int32Array = new Int32Array(arrayBuffer); - const float32Array = new Float32Array(arrayBuffer); - const float64Array = new Float64Array(arrayBuffer); - const bigInt64Array = new BigInt64Array(arrayBuffer); - const bigUint64Array = new BigUint64Array(arrayBuffer); - - const fakeBuffer = Object.create(Buffer.prototype); - const fakeDataView = Object.create(DataView.prototype); - const fakeUint8Array = Object.create(Uint8Array.prototype); - const fakeUint8ClampedArray = Object.create(Uint8ClampedArray.prototype); - const fakeUint16Array = Object.create(Uint16Array.prototype); - const fakeUint32Array = Object.create(Uint32Array.prototype); - const fakeInt8Array = Object.create(Int8Array.prototype); - const fakeInt16Array = Object.create(Int16Array.prototype); - const fakeInt32Array = Object.create(Int32Array.prototype); - const fakeFloat32Array = Object.create(Float32Array.prototype); - const fakeFloat64Array = Object.create(Float64Array.prototype); - const fakeBigInt64Array = Object.create(BigInt64Array.prototype); - const fakeBigUint64Array = Object.create(BigUint64Array.prototype); - - const stealthyDataView = - Object.setPrototypeOf(new DataView(arrayBuffer), Uint8Array.prototype); - const stealthyUint8Array = - Object.setPrototypeOf(new Uint8Array(arrayBuffer), ArrayBuffer.prototype); - const stealthyUint8ClampedArray = - Object.setPrototypeOf( - new Uint8ClampedArray(arrayBuffer), ArrayBuffer.prototype - ); - const stealthyUint16Array = - Object.setPrototypeOf(new Uint16Array(arrayBuffer), Uint16Array.prototype); - const stealthyUint32Array = - Object.setPrototypeOf(new Uint32Array(arrayBuffer), Uint32Array.prototype); - const stealthyInt8Array = - Object.setPrototypeOf(new Int8Array(arrayBuffer), Int8Array.prototype); - const stealthyInt16Array = - Object.setPrototypeOf(new Int16Array(arrayBuffer), Int16Array.prototype); - const stealthyInt32Array = - Object.setPrototypeOf(new Int32Array(arrayBuffer), Int32Array.prototype); - const stealthyFloat32Array = - Object.setPrototypeOf( - new Float32Array(arrayBuffer), Float32Array.prototype - ); - const stealthyFloat64Array = - Object.setPrototypeOf( - new Float64Array(arrayBuffer), Float64Array.prototype - ); - const stealthyBigInt64Array = - Object.setPrototypeOf( - new BigInt64Array(arrayBuffer), BigInt64Array.prototype - ); - const stealthyBigUint64Array = - Object.setPrototypeOf( - new BigUint64Array(arrayBuffer), BigUint64Array.prototype - ); - - const all = [ - primitive, arrayBuffer, buffer, fakeBuffer, - dataView, fakeDataView, stealthyDataView, - uint8Array, fakeUint8Array, stealthyUint8Array, - uint8ClampedArray, fakeUint8ClampedArray, stealthyUint8ClampedArray, - uint16Array, fakeUint16Array, stealthyUint16Array, - uint32Array, fakeUint32Array, stealthyUint32Array, - int8Array, fakeInt8Array, stealthyInt8Array, - int16Array, fakeInt16Array, stealthyInt16Array, - int32Array, fakeInt32Array, stealthyInt32Array, - float32Array, fakeFloat32Array, stealthyFloat32Array, - float64Array, fakeFloat64Array, stealthyFloat64Array, - bigInt64Array, fakeBigInt64Array, stealthyBigInt64Array, - bigUint64Array, fakeBigUint64Array, stealthyBigUint64Array, - ]; - - const expected = { - isArrayBufferView: [ - buffer, - dataView, stealthyDataView, - uint8Array, stealthyUint8Array, - uint8ClampedArray, stealthyUint8ClampedArray, - uint16Array, stealthyUint16Array, - uint32Array, stealthyUint32Array, - int8Array, stealthyInt8Array, - int16Array, stealthyInt16Array, - int32Array, stealthyInt32Array, - float32Array, stealthyFloat32Array, - float64Array, stealthyFloat64Array, - bigInt64Array, stealthyBigInt64Array, - bigUint64Array, stealthyBigUint64Array, - ], - isTypedArray: [ - buffer, - uint8Array, stealthyUint8Array, - uint8ClampedArray, stealthyUint8ClampedArray, - uint16Array, stealthyUint16Array, - uint32Array, stealthyUint32Array, - int8Array, stealthyInt8Array, - int16Array, stealthyInt16Array, - int32Array, stealthyInt32Array, - float32Array, stealthyFloat32Array, - float64Array, stealthyFloat64Array, - bigInt64Array, stealthyBigInt64Array, - bigUint64Array, stealthyBigUint64Array, - ], - isUint8Array: [ - buffer, uint8Array, stealthyUint8Array, - ], - isUint8ClampedArray: [ - uint8ClampedArray, stealthyUint8ClampedArray, - ], - isUint16Array: [ - uint16Array, stealthyUint16Array, - ], - isUint32Array: [ - uint32Array, stealthyUint32Array, - ], - isInt8Array: [ - int8Array, stealthyInt8Array, - ], - isInt16Array: [ - int16Array, stealthyInt16Array, - ], - isInt32Array: [ - int32Array, stealthyInt32Array, - ], - isFloat32Array: [ - float32Array, stealthyFloat32Array, - ], - isFloat64Array: [ - float64Array, stealthyFloat64Array, - ], - isBigInt64Array: [ - bigInt64Array, stealthyBigInt64Array, - ], - isBigUint64Array: [ - bigUint64Array, stealthyBigUint64Array, - ] - }; - - for (const testedFunc of Object.keys(expected)) { - const func = types[testedFunc]; - const yup = []; - for (const value of all) { - if (func(value)) { - yup.push(value); - } - } - console.log('Testing', testedFunc); - assert.deepStrictEqual(yup, expected[testedFunc]); - } -} - -// TODO(wafuwafu13): Implement "vm" -// (async () => { -// const m = new vm.SourceTextModule(''); -// await m.link(() => 0); -// await m.evaluate(); -// assert.ok(types.isModuleNamespaceObject(m.namespace)); -// })().then(common.mustCall()); - -{ - // eslint-disable-next-line node-core/crypto-check - if (common.hasCrypto) { - const crypto = require('crypto'); - assert.ok(!types.isKeyObject(crypto.createHash('sha1'))); - } - assert.ok(!types.isCryptoKey()); - assert.ok(!types.isKeyObject()); -} diff --git a/cli/tests/node_compat/test/parallel/test-util.js b/cli/tests/node_compat/test/parallel/test-util.js deleted file mode 100644 index eaffc7f6d..000000000 --- a/cli/tests/node_compat/test/parallel/test-util.js +++ /dev/null @@ -1,202 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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'; -// Flags: --expose-internals -const common = require('../common'); -const assert = require('assert'); -const util = require('util'); -const errors = require('internal/errors'); -// TODO(wafuwafu13): Enable this when "vm" is ready. -// const context = require('vm').runInNewContext; - -// isArray -assert.strictEqual(util.isArray([]), true); -assert.strictEqual(util.isArray(Array()), true); -assert.strictEqual(util.isArray(new Array()), true); -assert.strictEqual(util.isArray(new Array(5)), true); -assert.strictEqual(util.isArray(new Array('with', 'some', 'entries')), true); -// TODO(wafuwafu13): Enable this when "vm" is ready. -// assert.strictEqual(util.isArray(context('Array')()), true); -assert.strictEqual(util.isArray({}), false); -assert.strictEqual(util.isArray({ push: function() {} }), false); -assert.strictEqual(util.isArray(/regexp/), false); -assert.strictEqual(util.isArray(new Error()), false); -assert.strictEqual(util.isArray(Object.create(Array.prototype)), false); - -// isRegExp -assert.strictEqual(util.isRegExp(/regexp/), true); -assert.strictEqual(util.isRegExp(RegExp(), 'foo'), true); -assert.strictEqual(util.isRegExp(new RegExp()), true); -// TODO(wafuwafu13): Enable this when "vm" is ready. -// assert.strictEqual(util.isRegExp(context('RegExp')()), true); -assert.strictEqual(util.isRegExp({}), false); -assert.strictEqual(util.isRegExp([]), false); -assert.strictEqual(util.isRegExp(new Date()), false); -// TODO(wafuwafu13): Enable this. -assert.strictEqual(util.isRegExp(Object.create(RegExp.prototype)), false); - -// isDate -assert.strictEqual(util.isDate(new Date()), true); -assert.strictEqual(util.isDate(new Date(0), 'foo'), true); -// TODO(wafuwafu13): Enable this when "vm" is ready. -// assert.strictEqual(util.isDate(new (context('Date'))()), true); -assert.strictEqual(util.isDate(Date()), false); -assert.strictEqual(util.isDate({}), false); -assert.strictEqual(util.isDate([]), false); -assert.strictEqual(util.isDate(new Error()), false); -assert.strictEqual(util.isDate(Object.create(Date.prototype)), false); - -// isError -assert.strictEqual(util.isError(new Error()), true); -assert.strictEqual(util.isError(new TypeError()), true); -assert.strictEqual(util.isError(new SyntaxError()), true); -// TODO(wafuwafu13): Enable this when "vm" is ready. -// assert.strictEqual(util.isError(new (context('Error'))()), true); -// assert.strictEqual(util.isError(new (context('TypeError'))()), true); -// assert.strictEqual(util.isError(new (context('SyntaxError'))()), true); -assert.strictEqual(util.isError({}), false); -assert.strictEqual(util.isError({ name: 'Error', message: '' }), false); -assert.strictEqual(util.isError([]), false); -assert.strictEqual(util.isError(Object.create(Error.prototype)), true); - -// isObject -assert.strictEqual(util.isObject({}), true); -assert.strictEqual(util.isObject([]), true); -assert.strictEqual(util.isObject(new Number(3)), true); -assert.strictEqual(util.isObject(Number(4)), false); -assert.strictEqual(util.isObject(1), false); - -// isPrimitive -assert.strictEqual(util.isPrimitive({}), false); -assert.strictEqual(util.isPrimitive(new Error()), false); -assert.strictEqual(util.isPrimitive(new Date()), false); -assert.strictEqual(util.isPrimitive([]), false); -assert.strictEqual(util.isPrimitive(/regexp/), false); -assert.strictEqual(util.isPrimitive(function() {}), false); -assert.strictEqual(util.isPrimitive(new Number(1)), false); -assert.strictEqual(util.isPrimitive(new String('bla')), false); -assert.strictEqual(util.isPrimitive(new Boolean(true)), false); -assert.strictEqual(util.isPrimitive(1), true); -assert.strictEqual(util.isPrimitive('bla'), true); -assert.strictEqual(util.isPrimitive(true), true); -assert.strictEqual(util.isPrimitive(undefined), true); -assert.strictEqual(util.isPrimitive(null), true); -assert.strictEqual(util.isPrimitive(Infinity), true); -assert.strictEqual(util.isPrimitive(NaN), true); -assert.strictEqual(util.isPrimitive(Symbol('symbol')), true); - -// isBuffer -assert.strictEqual(util.isBuffer('foo'), false); -assert.strictEqual(util.isBuffer(Buffer.from('foo')), true); - -// _extend -assert.deepStrictEqual(util._extend({ a: 1 }), { a: 1 }); -assert.deepStrictEqual(util._extend({ a: 1 }, []), { a: 1 }); -assert.deepStrictEqual(util._extend({ a: 1 }, null), { a: 1 }); -assert.deepStrictEqual(util._extend({ a: 1 }, true), { a: 1 }); -assert.deepStrictEqual(util._extend({ a: 1 }, false), { a: 1 }); -assert.deepStrictEqual(util._extend({ a: 1 }, { b: 2 }), { a: 1, b: 2 }); -assert.deepStrictEqual(util._extend({ a: 1, b: 2 }, { b: 3 }), { a: 1, b: 3 }); - -// deprecated -assert.strictEqual(util.isBoolean(true), true); -assert.strictEqual(util.isBoolean(false), true); -assert.strictEqual(util.isBoolean('string'), false); - -assert.strictEqual(util.isNull(null), true); -assert.strictEqual(util.isNull(undefined), false); -assert.strictEqual(util.isNull(), false); -assert.strictEqual(util.isNull('string'), false); - -assert.strictEqual(util.isUndefined(undefined), true); -assert.strictEqual(util.isUndefined(), true); -assert.strictEqual(util.isUndefined(null), false); -assert.strictEqual(util.isUndefined('string'), false); - -assert.strictEqual(util.isNullOrUndefined(null), true); -assert.strictEqual(util.isNullOrUndefined(undefined), true); -assert.strictEqual(util.isNullOrUndefined(), true); -assert.strictEqual(util.isNullOrUndefined('string'), false); - -assert.strictEqual(util.isNumber(42), true); -assert.strictEqual(util.isNumber(), false); -assert.strictEqual(util.isNumber('string'), false); - -assert.strictEqual(util.isString('string'), true); -assert.strictEqual(util.isString(), false); -assert.strictEqual(util.isString(42), false); - -assert.strictEqual(util.isSymbol(Symbol()), true); -assert.strictEqual(util.isSymbol(), false); -assert.strictEqual(util.isSymbol('string'), false); - -assert.strictEqual(util.isFunction(() => {}), true); -assert.strictEqual(util.isFunction(function() {}), true); -assert.strictEqual(util.isFunction(), false); -assert.strictEqual(util.isFunction('string'), false); - -assert.strictEqual(util.toUSVString('string\ud801'), 'string\ufffd'); - -{ - assert.strictEqual(util.types.isNativeError(new Error()), true); - assert.strictEqual(util.types.isNativeError(new TypeError()), true); - assert.strictEqual(util.types.isNativeError(new SyntaxError()), true); - // TODO(wafuwafu13): Enable this when "vm" is ready. - // assert.strictEqual(util.types.isNativeError(new (context('Error'))()), true); - // assert.strictEqual( - // util.types.isNativeError(new (context('TypeError'))()), - // true - // ); - // assert.strictEqual( - // util.types.isNativeError(new (context('SyntaxError'))()), - // true - // ); - assert.strictEqual(util.types.isNativeError({}), false); - assert.strictEqual( - util.types.isNativeError({ name: 'Error', message: '' }), - false - ); - assert.strictEqual(util.types.isNativeError([]), false); - assert.strictEqual( - util.types.isNativeError(Object.create(Error.prototype)), - false - ); - assert.strictEqual( - util.types.isNativeError(new errors.codes.ERR_IPC_CHANNEL_CLOSED()), - true - ); -} - -assert.throws(() => { - util.stripVTControlCharacters({}); -}, { - code: 'ERR_INVALID_ARG_TYPE', - message: 'The "str" argument must be of type string.' + - common.invalidArgTypeHelper({}) -}); diff --git a/cli/tests/node_compat/test/parallel/test-vm-new-script-this-context.js b/cli/tests/node_compat/test/parallel/test-vm-new-script-this-context.js deleted file mode 100644 index 9a9d8fb13..000000000 --- a/cli/tests/node_compat/test/parallel/test-vm-new-script-this-context.js +++ /dev/null @@ -1,75 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 Script = require('vm').Script; - -// Run a string -let script = new Script('\'passed\';'); -const result = script.runInThisContext(script); -assert.strictEqual(result, 'passed'); - -// Thrown error -script = new Script('throw new Error(\'test\');'); -assert.throws(() => { - script.runInThisContext(script); -}, /^Error: test$/); - -global.hello = 5; -script = new Script('hello = 2'); -script.runInThisContext(script); -assert.strictEqual(global.hello, 2); - - -// Pass values -global.code = 'foo = 1;' + - 'bar = 2;' + - 'if (typeof baz !== "undefined") throw new Error("test fail");'; -global.foo = 2; -global.obj = { foo: 0, baz: 3 }; -script = new Script(global.code); -script.runInThisContext(script); -assert.strictEqual(global.obj.foo, 0); -assert.strictEqual(global.bar, 2); -assert.strictEqual(global.foo, 1); - -// Call a function -global.f = function() { global.foo = 100; }; -script = new Script('f()'); -script.runInThisContext(script); -assert.strictEqual(global.foo, 100); - -common.allowGlobals( - global.hello, - global.code, - global.foo, - global.obj, - global.f -); diff --git a/cli/tests/node_compat/test/parallel/test-vm-static-this.js b/cli/tests/node_compat/test/parallel/test-vm-static-this.js deleted file mode 100644 index c6804cfc0..000000000 --- a/cli/tests/node_compat/test/parallel/test-vm-static-this.js +++ /dev/null @@ -1,72 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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. - -/* eslint-disable strict */ -const common = require('../common'); -const assert = require('assert'); -const vm = require('vm'); - -// Run a string -const result = vm.runInThisContext('\'passed\';'); -assert.strictEqual(result, 'passed'); - -// thrown error -assert.throws(function() { - vm.runInThisContext('throw new Error(\'test\');'); -}, /test/); - -global.hello = 5; -vm.runInThisContext('hello = 2'); -assert.strictEqual(global.hello, 2); - - -// pass values -const code = 'foo = 1;' + - 'bar = 2;' + - 'if (typeof baz !== \'undefined\')' + - 'throw new Error(\'test fail\');'; -global.foo = 2; -global.obj = { foo: 0, baz: 3 }; -/* eslint-disable no-unused-vars */ -const baz = vm.runInThisContext(code); -/* eslint-enable no-unused-vars */ -assert.strictEqual(global.obj.foo, 0); -assert.strictEqual(global.bar, 2); -assert.strictEqual(global.foo, 1); - -// call a function -global.f = function() { global.foo = 100; }; -vm.runInThisContext('f()'); -assert.strictEqual(global.foo, 100); - -common.allowGlobals( - global.hello, - global.foo, - global.obj, - global.f -); diff --git a/cli/tests/node_compat/test/parallel/test-webcrypto-sign-verify.js b/cli/tests/node_compat/test/parallel/test-webcrypto-sign-verify.js deleted file mode 100644 index 23df883ee..000000000 --- a/cli/tests/node_compat/test/parallel/test-webcrypto-sign-verify.js +++ /dev/null @@ -1,154 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -const common = require('../common'); - -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); -const { subtle } = require('crypto').webcrypto; - -// This is only a partial test. The WebCrypto Web Platform Tests -// will provide much greater coverage. - -// Test Sign/Verify RSASSA-PKCS1-v1_5 -{ - async function test(data) { - const ec = new TextEncoder(); - const { publicKey, privateKey } = await subtle.generateKey({ - name: 'RSASSA-PKCS1-v1_5', - modulusLength: 1024, - publicExponent: new Uint8Array([1, 0, 1]), - hash: 'SHA-256' - }, true, ['sign', 'verify']); - - const signature = await subtle.sign({ - name: 'RSASSA-PKCS1-v1_5' - }, privateKey, ec.encode(data)); - - assert(await subtle.verify({ - name: 'RSASSA-PKCS1-v1_5' - }, publicKey, signature, ec.encode(data))); - } - - test('hello world').then(common.mustCall()); -} - -// Test Sign/Verify RSA-PSS -{ - async function test(data) { - const ec = new TextEncoder(); - const { publicKey, privateKey } = await subtle.generateKey({ - name: 'RSA-PSS', - modulusLength: 4096, - publicExponent: new Uint8Array([1, 0, 1]), - hash: 'SHA-256' - }, true, ['sign', 'verify']); - - const signature = await subtle.sign({ - name: 'RSA-PSS', - saltLength: 256, - }, privateKey, ec.encode(data)); - - assert(await subtle.verify({ - name: 'RSA-PSS', - saltLength: 256, - }, publicKey, signature, ec.encode(data))); - } - - test('hello world').then(common.mustCall()); -} - -// Test Sign/Verify ECDSA -{ - async function test(data) { - const ec = new TextEncoder(); - const { publicKey, privateKey } = await subtle.generateKey({ - name: 'ECDSA', - namedCurve: 'P-384', - }, true, ['sign', 'verify']); - - const signature = await subtle.sign({ - name: 'ECDSA', - hash: 'SHA-384', - }, privateKey, ec.encode(data)); - - assert(await subtle.verify({ - name: 'ECDSA', - hash: 'SHA-384', - }, publicKey, signature, ec.encode(data))); - } - - test('hello world').then(common.mustCall()); -} - -// Test Sign/Verify HMAC -{ - async function test(data) { - const ec = new TextEncoder(); - - const key = await subtle.generateKey({ - name: 'HMAC', - length: 256, - hash: 'SHA-256' - }, true, ['sign', 'verify']); - - const signature = await subtle.sign({ - name: 'HMAC', - }, key, ec.encode(data)); - - assert(await subtle.verify({ - name: 'HMAC', - }, key, signature, ec.encode(data))); - } - - test('hello world').then(common.mustCall()); -} - -// Test Sign/Verify Ed25519 -{ - async function test(data) { - const ec = new TextEncoder(); - const { publicKey, privateKey } = await subtle.generateKey({ - name: 'Ed25519', - }, true, ['sign', 'verify']); - - const signature = await subtle.sign({ - name: 'Ed25519', - }, privateKey, ec.encode(data)); - - assert(await subtle.verify({ - name: 'Ed25519', - }, publicKey, signature, ec.encode(data))); - } - - test('hello world').then(common.mustCall()); -} - -// Test Sign/Verify Ed448 -// TODO(cjihrig): Pending support in Deno core. -// { -// async function test(data) { -// const ec = new TextEncoder(); -// const { publicKey, privateKey } = await subtle.generateKey({ -// name: 'Ed448', -// }, true, ['sign', 'verify']); - -// const signature = await subtle.sign({ -// name: 'Ed448', -// }, privateKey, ec.encode(data)); - -// assert(await subtle.verify({ -// name: 'Ed448', -// }, publicKey, signature, ec.encode(data))); -// } - -// test('hello world').then(common.mustCall()); -// } diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js b/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js deleted file mode 100644 index e423c25d0..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-api-basics.js +++ /dev/null @@ -1,68 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// From: https://github.com/w3c/web-platform-tests/blob/master/encoding/api-basics.html -// This is the part that can be run without ICU - -require('../common'); - -const assert = require('assert'); - -function testDecodeSample(encoding, string, bytes) { - assert.strictEqual( - new TextDecoder(encoding).decode(new Uint8Array(bytes)), - string); - assert.strictEqual( - new TextDecoder(encoding).decode(new Uint8Array(bytes).buffer), - string); -} - -// `z` (ASCII U+007A), cent (Latin-1 U+00A2), CJK water (BMP U+6C34), -// G-Clef (non-BMP U+1D11E), PUA (BMP U+F8FF), PUA (non-BMP U+10FFFD) -// byte-swapped BOM (non-character U+FFFE) -const sample = 'z\xA2\u6C34\uD834\uDD1E\uF8FF\uDBFF\uDFFD\uFFFE'; - -{ - const encoding = 'utf-8'; - const string = sample; - const bytes = [ - 0x7A, 0xC2, 0xA2, 0xE6, 0xB0, 0xB4, - 0xF0, 0x9D, 0x84, 0x9E, 0xEF, 0xA3, - 0xBF, 0xF4, 0x8F, 0xBF, 0xBD, 0xEF, - 0xBF, 0xBE, - ]; - const encoded = new TextEncoder().encode(string); - assert.deepStrictEqual([].slice.call(encoded), bytes); - assert.strictEqual( - new TextDecoder(encoding).decode(new Uint8Array(bytes)), - string); - assert.strictEqual( - new TextDecoder(encoding).decode(new Uint8Array(bytes).buffer), - string); -} - -testDecodeSample( - 'utf-16le', - sample, - [ - 0x7A, 0x00, 0xA2, 0x00, 0x34, 0x6C, - 0x34, 0xD8, 0x1E, 0xDD, 0xFF, 0xF8, - 0xFF, 0xDB, 0xFD, 0xDF, 0xFE, 0xFF, - ] -); - -testDecodeSample( - 'utf-16', - sample, - [ - 0x7A, 0x00, 0xA2, 0x00, 0x34, 0x6C, - 0x34, 0xD8, 0x1E, 0xDD, 0xFF, 0xF8, - 0xFF, 0xDB, 0xFD, 0xDF, 0xFE, 0xFF, - ] -); diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js b/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js deleted file mode 100644 index 58488d25d..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-ignorebom.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// From: https://github.com/w3c/web-platform-tests/blob/7f567fa29c/encoding/textdecoder-ignorebom.html -// This is the part that can be run without ICU - -require('../common'); - -const assert = require('assert'); - -const cases = [ - { - encoding: 'utf-8', - bytes: [0xEF, 0xBB, 0xBF, 0x61, 0x62, 0x63] - }, - { - encoding: 'utf-16le', - bytes: [0xFF, 0xFE, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00] - }, -]; - -cases.forEach((testCase) => { - const BOM = '\uFEFF'; - let decoder = new TextDecoder(testCase.encoding, { ignoreBOM: true }); - const bytes = new Uint8Array(testCase.bytes); - assert.strictEqual(decoder.decode(bytes), `${BOM}abc`); - decoder = new TextDecoder(testCase.encoding, { ignoreBOM: false }); - assert.strictEqual(decoder.decode(bytes), 'abc'); - decoder = new TextDecoder(testCase.encoding); - assert.strictEqual(decoder.decode(bytes), 'abc'); -}); diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js b/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js deleted file mode 100644 index ef9cecc0f..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-encoding-custom-textdecoder-streaming.js +++ /dev/null @@ -1,45 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// From: https://github.com/w3c/web-platform-tests/blob/fa9436d12c/encoding/textdecoder-streaming.html -// This is the part that can be run without ICU - -require('../common'); - -const assert = require('assert'); - -const string = - '\x00123ABCabc\x80\xFF\u0100\u1000\uFFFD\uD800\uDC00\uDBFF\uDFFF'; -const octets = { - 'utf-8': [ - 0x00, 0x31, 0x32, 0x33, 0x41, 0x42, 0x43, 0x61, 0x62, 0x63, 0xc2, 0x80, - 0xc3, 0xbf, 0xc4, 0x80, 0xe1, 0x80, 0x80, 0xef, 0xbf, 0xbd, 0xf0, 0x90, - 0x80, 0x80, 0xf4, 0x8f, 0xbf, 0xbf], - 'utf-16le': [ - 0x00, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x41, 0x00, 0x42, 0x00, - 0x43, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x80, 0x00, 0xFF, 0x00, - 0x00, 0x01, 0x00, 0x10, 0xFD, 0xFF, 0x00, 0xD8, 0x00, 0xDC, 0xFF, 0xDB, - 0xFF, 0xDF] -}; - -Object.keys(octets).forEach((encoding) => { - for (let len = 1; len <= 5; ++len) { - const encoded = octets[encoding]; - const decoder = new TextDecoder(encoding); - let out = ''; - for (let i = 0; i < encoded.length; i += len) { - const sub = []; - for (let j = i; j < encoded.length && j < i + len; ++j) - sub.push(encoded[j]); - out += decoder.decode(new Uint8Array(sub), { stream: true }); - } - out += decoder.decode(); - assert.strictEqual(out, string); - } -}); diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js b/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js deleted file mode 100644 index e2bc96139..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-passive.js +++ /dev/null @@ -1,72 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -// Manually converted from https://github.com/web-platform-tests/wpt/blob/master/dom/events/AddEventListenerOptions-passive.html -// in order to define the `document` ourselves - -const { - fail, - ok, - strictEqual -} = require('assert'); - -{ - const document = new EventTarget(); - let supportsPassive = false; - const query_options = { - get passive() { - supportsPassive = true; - return false; - }, - get dummy() { - fail('dummy value getter invoked'); - return false; - } - }; - - document.addEventListener('test_event', null, query_options); - ok(supportsPassive); - - supportsPassive = false; - document.removeEventListener('test_event', null, query_options); - strictEqual(supportsPassive, false); -} -{ - function testPassiveValue(optionsValue, expectedDefaultPrevented) { - const document = new EventTarget(); - let defaultPrevented; - function handler(e) { - if (e.defaultPrevented) { - fail('Event prematurely marked defaultPrevented'); - } - e.preventDefault(); - defaultPrevented = e.defaultPrevented; - } - document.addEventListener('test', handler, optionsValue); - // TODO the WHATWG test is more extensive here and tests dispatching on - // document.body, if we ever support getParent we should amend this - const ev = new Event('test', { bubbles: true, cancelable: true }); - const uncanceled = document.dispatchEvent(ev); - - strictEqual(defaultPrevented, expectedDefaultPrevented); - strictEqual(uncanceled, !expectedDefaultPrevented); - - document.removeEventListener('test', handler, optionsValue); - } - testPassiveValue(undefined, true); - testPassiveValue({}, true); - testPassiveValue({ passive: false }, true); - - common.skip('TODO: passive listeners is still broken'); - testPassiveValue({ passive: 1 }, false); - testPassiveValue({ passive: true }, false); - testPassiveValue({ passive: 0 }, true); -} diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js b/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js deleted file mode 100644 index 80d09c4b7..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-events-add-event-listener-options-signal.js +++ /dev/null @@ -1,166 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -const { - strictEqual, -} = require('assert'); - -// Manually ported from: wpt@dom/events/AddEventListenerOptions-signal.any.js - -{ - // Passing an AbortSignal to addEventListener does not prevent - // removeEventListener - let count = 0; - function handler() { - count++; - } - const et = new EventTarget(); - const controller = new AbortController(); - et.addEventListener('test', handler, { signal: controller.signal }); - et.dispatchEvent(new Event('test')); - strictEqual(count, 1, 'Adding a signal still adds a listener'); - et.dispatchEvent(new Event('test')); - strictEqual(count, 2, 'The listener was not added with the once flag'); - controller.abort(); - et.dispatchEvent(new Event('test')); - strictEqual(count, 2, 'Aborting on the controller removes the listener'); - // See: https://github.com/nodejs/node/pull/37696 , adding an event listener - // should always return undefined. - strictEqual( - et.addEventListener('test', handler, { signal: controller.signal }), - undefined); - et.dispatchEvent(new Event('test')); - strictEqual(count, 2, 'Passing an aborted signal never adds the handler'); -} - -{ - // Passing an AbortSignal to addEventListener works with the once flag - let count = 0; - function handler() { - count++; - } - const et = new EventTarget(); - const controller = new AbortController(); - et.addEventListener('test', handler, { signal: controller.signal }); - et.removeEventListener('test', handler); - et.dispatchEvent(new Event('test')); - strictEqual(count, 0, 'The listener was still removed'); -} - -{ - // Removing a once listener works with a passed signal - let count = 0; - function handler() { - count++; - } - const et = new EventTarget(); - const controller = new AbortController(); - const options = { signal: controller.signal, once: true }; - et.addEventListener('test', handler, options); - controller.abort(); - et.dispatchEvent(new Event('test')); - strictEqual(count, 0, 'The listener was still removed'); -} - -{ - let count = 0; - function handler() { - count++; - } - const et = new EventTarget(); - const controller = new AbortController(); - const options = { signal: controller.signal, once: true }; - et.addEventListener('test', handler, options); - et.removeEventListener('test', handler); - et.dispatchEvent(new Event('test')); - strictEqual(count, 0, 'The listener was still removed'); -} - -{ - // Passing an AbortSignal to multiple listeners - let count = 0; - function handler() { - count++; - } - const et = new EventTarget(); - const controller = new AbortController(); - const options = { signal: controller.signal, once: true }; - et.addEventListener('first', handler, options); - et.addEventListener('second', handler, options); - controller.abort(); - et.dispatchEvent(new Event('first')); - et.dispatchEvent(new Event('second')); - strictEqual(count, 0, 'The listener was still removed'); -} - -{ - // Passing an AbortSignal to addEventListener works with the capture flag - let count = 0; - function handler() { - count++; - } - const et = new EventTarget(); - const controller = new AbortController(); - const options = { signal: controller.signal, capture: true }; - et.addEventListener('test', handler, options); - controller.abort(); - et.dispatchEvent(new Event('test')); - strictEqual(count, 0, 'The listener was still removed'); -} - -{ - // Aborting from a listener does not call future listeners - let count = 0; - function handler() { - count++; - } - const et = new EventTarget(); - const controller = new AbortController(); - const options = { signal: controller.signal }; - et.addEventListener('test', () => { - controller.abort(); - }, options); - et.addEventListener('test', handler, options); - et.dispatchEvent(new Event('test')); - strictEqual(count, 0, 'The listener was still removed'); -} - -{ - // Adding then aborting a listener in another listener does not call it - let count = 0; - function handler() { - count++; - } - const et = new EventTarget(); - const controller = new AbortController(); - et.addEventListener('test', () => { - et.addEventListener('test', handler, { signal: controller.signal }); - controller.abort(); - }, { signal: controller.signal }); - et.dispatchEvent(new Event('test')); - strictEqual(count, 0, 'The listener was still removed'); -} - -{ - // Aborting from a nested listener should remove it - const et = new EventTarget(); - const ac = new AbortController(); - let count = 0; - et.addEventListener('foo', () => { - et.addEventListener('foo', () => { - count++; - if (count > 5) ac.abort(); - et.dispatchEvent(new Event('foo')); - }, { signal: ac.signal }); - et.dispatchEvent(new Event('foo')); - }, { once: true }); - et.dispatchEvent(new Event('foo')); -} diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-events-customevent.js b/cli/tests/node_compat/test/parallel/test-whatwg-events-customevent.js deleted file mode 100644 index 749c838de..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-events-customevent.js +++ /dev/null @@ -1,40 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); - -const { strictEqual, throws, equal } = require('assert'); - -// Manually converted from https://github.com/web-platform-tests/wpt/blob/master/dom/events/CustomEvent.html -// in order to define the `document` ourselves - -{ - const type = 'foo'; - const target = new EventTarget(); - - target.addEventListener(type, common.mustCall((evt) => { - strictEqual(evt.type, type); - })); - - target.dispatchEvent(new Event(type)); -} - -{ - throws(() => { - new Event(); - }, TypeError); -} - -{ - const event = new Event('foo'); - equal(event.type, 'foo'); - equal(event.bubbles, false); - equal(event.cancelable, false); - equal(event.detail, null); -} diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js b/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js deleted file mode 100644 index e33590530..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-deepequal.js +++ /dev/null @@ -1,25 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// This tests that the internal flags in URL objects are consistent, as manifest -// through assert libraries. -// See https://github.com/nodejs/node/issues/24211 - -// Tests below are not from WPT. - -require('../common'); -const assert = require('assert'); - -assert.deepStrictEqual( - new URL('./foo', 'https://example.com/'), - new URL('https://example.com/foo') -); -assert.deepStrictEqual( - new URL('./foo', 'https://user:pass@example.com/'), - new URL('https://user:pass@example.com/foo') -); diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-global.js b/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-global.js deleted file mode 100644 index b7880d8c2..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-global.js +++ /dev/null @@ -1,33 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Tests below are not from WPT. - -require('../common'); -const assert = require('assert'); - -assert.deepStrictEqual( - Object.getOwnPropertyDescriptor(global, 'URL'), - { - value: URL, - writable: true, - configurable: true, - enumerable: false - } -); - -assert.deepStrictEqual( - Object.getOwnPropertyDescriptor(global, 'URLSearchParams'), - { - value: URLSearchParams, - writable: true, - configurable: true, - enumerable: false - } -); diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js b/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js deleted file mode 100644 index de175e357..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-href-side-effect.js +++ /dev/null @@ -1,22 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Tests below are not from WPT. -require('../common'); -const assert = require('assert'); - -const ref = new URL('http://example.com/path'); -const url = new URL('http://example.com/path'); -assert.throws(() => { - url.href = ''; -}, { - name: 'TypeError' -}); - -assert.deepStrictEqual(url, ref); diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js b/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js deleted file mode 100644 index add70bc34..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-url-custom-tostringtag.js +++ /dev/null @@ -1,39 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -// Tests below are not from WPT. - -require('../common'); -const assert = require('assert'); - -const toString = Object.prototype.toString; - -const url = new URL('http://example.org'); -const sp = url.searchParams; -const spIterator = sp.entries(); - -const test = [ - [url, 'URL'], - [sp, 'URLSearchParams'], - [spIterator, 'URLSearchParams Iterator'], - // Web IDL spec says we have to return 'URLPrototype', but it is too - // expensive to implement; therefore, use Chrome's behavior for now, until - // spec is changed. - [Object.getPrototypeOf(url), 'URL'], - [Object.getPrototypeOf(sp), 'URLSearchParams'], - [Object.getPrototypeOf(spIterator), 'URLSearchParams Iterator'], -]; - -test.forEach(([obj, expected]) => { - assert.strictEqual(obj[Symbol.toStringTag], expected, - `${obj[Symbol.toStringTag]} !== ${expected}`); - const str = toString.call(obj); - assert.strictEqual(str, `[object ${expected}]`, - `${str} !== [object ${expected}]`); -}); diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js b/cli/tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js deleted file mode 100644 index 1fcdefdf7..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-url-override-hostname.js +++ /dev/null @@ -1,27 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const assert = require('assert'); - -{ - const url = new (class extends URL { get hostname() { return 'bar.com'; } })('http://foo.com/'); - assert.strictEqual(url.href, 'http://foo.com/'); - assert.strictEqual(url.toString(), 'http://foo.com/'); - assert.strictEqual(url.toJSON(), 'http://foo.com/'); - assert.strictEqual(url.hash, ''); - assert.strictEqual(url.host, 'foo.com'); - assert.strictEqual(url.hostname, 'bar.com'); - assert.strictEqual(url.origin, 'http://foo.com'); - assert.strictEqual(url.password, ''); - assert.strictEqual(url.protocol, 'http:'); - assert.strictEqual(url.username, ''); - assert.strictEqual(url.search, ''); - assert.strictEqual(url.searchParams.toString(), ''); -} diff --git a/cli/tests/node_compat/test/parallel/test-whatwg-url-properties.js b/cli/tests/node_compat/test/parallel/test-whatwg-url-properties.js deleted file mode 100644 index 8a4f4e57b..000000000 --- a/cli/tests/node_compat/test/parallel/test-whatwg-url-properties.js +++ /dev/null @@ -1,111 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -require('../common'); -const assert = require('assert'); -const { URL, URLSearchParams } = require('url'); - -[ - { name: 'toString' }, - { name: 'toJSON' }, - // Deno's URL doesn't support nodejs custom inspect - // { name: Symbol.for('nodejs.util.inspect.custom') }, -].forEach(({ name }) => { - testMethod(URL.prototype, name); -}); - -[ - { name: 'href' }, - { name: 'protocol' }, - { name: 'username' }, - { name: 'password' }, - { name: 'host' }, - { name: 'hostname' }, - { name: 'port' }, - { name: 'pathname' }, - { name: 'search' }, - { name: 'hash' }, - { name: 'origin', readonly: true }, - { name: 'searchParams', readonly: true }, -].forEach(({ name, readonly = false }) => { - testAccessor(URL.prototype, name, readonly); -}); - -[ - { name: 'append' }, - { name: 'delete' }, - { name: 'get' }, - { name: 'getAll' }, - { name: 'has' }, - { name: 'set' }, - { name: 'sort' }, - { name: 'entries' }, - { name: 'forEach' }, - { name: 'keys' }, - { name: 'values' }, - { name: 'toString' }, - { name: Symbol.iterator, methodName: 'entries' }, - // Deno's URL doesn't support nodejs custom inspect - // { name: Symbol.for('nodejs.util.inspect.custom') }, -].forEach(({ name, methodName }) => { - testMethod(URLSearchParams.prototype, name, methodName); -}); - -function stringifyName(name) { - if (typeof name === 'symbol') { - const { description } = name; - if (description === undefined) { - return ''; - } - return `[${description}]`; - } - - return name; -} - -function testMethod(target, name, methodName = stringifyName(name)) { - const desc = Object.getOwnPropertyDescriptor(target, name); - assert.notStrictEqual(desc, undefined); - assert.strictEqual(desc.enumerable, typeof name === 'string'); - - const { value } = desc; - assert.strictEqual(typeof value, 'function'); - assert.strictEqual(value.name, methodName); - /* This can't pass with Deno's URL/URLSearchParams - assert.strictEqual( - Object.prototype.hasOwnProperty.call(value, 'prototype'), - false, - ); - */ -} - -function testAccessor(target, name, readonly = false) { - const desc = Object.getOwnPropertyDescriptor(target, name); - assert.notStrictEqual(desc, undefined); - assert.strictEqual(desc.enumerable, typeof name === 'string'); - - const methodName = stringifyName(name); - const { get, set } = desc; - assert.strictEqual(typeof get, 'function'); - assert.strictEqual(get.name, `get ${methodName}`); - assert.strictEqual( - Object.prototype.hasOwnProperty.call(get, 'prototype'), - false, - ); - - if (readonly) { - assert.strictEqual(set, undefined); - } else { - assert.strictEqual(typeof set, 'function'); - assert.strictEqual(set.name, `set ${methodName}`); - assert.strictEqual( - Object.prototype.hasOwnProperty.call(set, 'prototype'), - false, - ); - } -} diff --git a/cli/tests/node_compat/test/parallel/test-zlib-close-after-error.js b/cli/tests/node_compat/test/parallel/test-zlib-close-after-error.js deleted file mode 100644 index 55f1d6b02..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-close-after-error.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// https://github.com/nodejs/node/issues/6034 - -const common = require('../common'); -const assert = require('assert'); -const zlib = require('zlib'); - -const decompress = zlib.createGunzip(15); - -decompress.on('error', common.mustCall((err) => { - assert.strictEqual(decompress._closed, true); - decompress.close(); -})); - -assert.strictEqual(decompress._closed, false); -decompress.write('something invalid'); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-close-after-write.js b/cli/tests/node_compat/test/parallel/test-zlib-close-after-write.js deleted file mode 100644 index 94fa4eb20..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-close-after-write.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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 zlib = require('zlib'); - -zlib.gzip('hello', common.mustCall((err, out) => { - const unzip = zlib.createGunzip(); - unzip.write(out); - unzip.close(common.mustCall()); -})); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-convenience-methods.js b/cli/tests/node_compat/test/parallel/test-zlib-convenience-methods.js deleted file mode 100644 index cf6694b1f..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-convenience-methods.js +++ /dev/null @@ -1,144 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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'; -// Test convenience methods with and without options supplied - -const common = require('../common'); -const assert = require('assert'); -const zlib = require('zlib'); - -// Must be a multiple of 4 characters in total to test all ArrayBufferView -// types. -const expectStr = 'blah'.repeat(8); -const expectBuf = Buffer.from(expectStr); - -const opts = { - level: 9, - chunkSize: 1024, -}; - -const optsInfo = { - info: true -}; - -for (const [type, expect] of [ - ['string', expectStr], - ['Buffer', expectBuf], - // FIXME(bartlomieju): - // ...common.getBufferSources(expectBuf).map((obj) => - // [obj[Symbol.toStringTag], obj] - // ), -]) { - for (const method of [ - ['gzip', 'gunzip', 'Gzip', 'Gunzip'], - ['gzip', 'unzip', 'Gzip', 'Unzip'], - ['deflate', 'inflate', 'Deflate', 'Inflate'], - ['deflateRaw', 'inflateRaw', 'DeflateRaw', 'InflateRaw'], - // FIXME(bartlomieju): - // ['brotliCompress', 'brotliDecompress', - // 'BrotliCompress', 'BrotliDecompress'], - ]) { - zlib[method[0]](expect, opts, common.mustCall((err, result) => { - zlib[method[1]](result, opts, common.mustCall((err, result) => { - assert.strictEqual(result.toString(), expectStr, - `Should get original string after ${method[0]}/` + - `${method[1]} ${type} with options.`); - })); - })); - - zlib[method[0]](expect, common.mustCall((err, result) => { - zlib[method[1]](result, common.mustCall((err, result) => { - assert.strictEqual(result.toString(), expectStr, - `Should get original string after ${method[0]}/` + - `${method[1]} ${type} without options.`); - })); - })); - - // FIXME(bartlomieju): - // zlib[method[0]](expect, optsInfo, common.mustCall((err, result) => { - // assert.ok(result.engine instanceof zlib[method[2]], - // `Should get engine ${method[2]} after ${method[0]} ` + - // `${type} with info option.`); - - // const compressed = result.buffer; - // zlib[method[1]](compressed, optsInfo, common.mustCall((err, result) => { - // assert.strictEqual(result.buffer.toString(), expectStr, - // `Should get original string after ${method[0]}/` + - // `${method[1]} ${type} with info option.`); - // assert.ok(result.engine instanceof zlib[method[3]], - // `Should get engine ${method[3]} after ${method[0]} ` + - // `${type} with info option.`); - // })); - // })); - - { - const compressed = zlib[`${method[0]}Sync`](expect, opts); - const decompressed = zlib[`${method[1]}Sync`](compressed, opts); - assert.strictEqual(decompressed.toString(), expectStr, - `Should get original string after ${method[0]}Sync/` + - `${method[1]}Sync ${type} with options.`); - } - - - { - const compressed = zlib[`${method[0]}Sync`](expect); - const decompressed = zlib[`${method[1]}Sync`](compressed); - assert.strictEqual(decompressed.toString(), expectStr, - `Should get original string after ${method[0]}Sync/` + - `${method[1]}Sync ${type} without options.`); - } - - // FIXME(bartlomieju): - // { - // const compressed = zlib[`${method[0]}Sync`](expect, optsInfo); - // assert.ok(compressed.engine instanceof zlib[method[2]], - // `Should get engine ${method[2]} after ${method[0]} ` + - // `${type} with info option.`); - // const decompressed = zlib[`${method[1]}Sync`](compressed.buffer, - // optsInfo); - // assert.strictEqual(decompressed.buffer.toString(), expectStr, - // `Should get original string after ${method[0]}Sync/` + - // `${method[1]}Sync ${type} without options.`); - // assert.ok(decompressed.engine instanceof zlib[method[3]], - // `Should get engine ${method[3]} after ${method[0]} ` + - // `${type} with info option.`); - // } - } -} - -// FIXME(bartlomieju): -// assert.throws( -// () => zlib.gzip('abc'), -// { -// code: 'ERR_INVALID_ARG_TYPE', -// name: 'TypeError', -// message: 'The "callback" argument must be of type function. ' + -// 'Received undefined' -// } -// ); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js b/cli/tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js deleted file mode 100644 index 58c069c74..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-deflate-raw-inherits.js +++ /dev/null @@ -1,34 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); -const { DeflateRaw } = require('zlib'); -const { Readable } = require('stream'); - -// Validates that zlib.DeflateRaw can be inherited -// with Object.setPrototypeOf - -function NotInitialized(options) { - DeflateRaw.call(this, options); - this.prop = true; -} -Object.setPrototypeOf(NotInitialized.prototype, DeflateRaw.prototype); -Object.setPrototypeOf(NotInitialized, DeflateRaw); - -const dest = new NotInitialized(); - -const read = new Readable({ - read() { - this.push(Buffer.from('a test string')); - this.push(null); - } -}); - -read.pipe(dest); -dest.resume(); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-destroy-pipe.js b/cli/tests/node_compat/test/parallel/test-zlib-destroy-pipe.js deleted file mode 100644 index 274068f9f..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-destroy-pipe.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -const common = require('../common'); -const zlib = require('zlib'); -const { Writable } = require('stream'); - -// Verify that the zlib transform does not error in case -// it is destroyed with data still in flight - -const ts = zlib.createGzip(); - -const ws = new Writable({ - write: common.mustCall((chunk, enc, cb) => { - setImmediate(cb); - ts.destroy(); - }) -}); - -const buf = Buffer.allocUnsafe(1024 * 1024 * 20); -ts.end(buf); -ts.pipe(ws); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-empty-buffer.js b/cli/tests/node_compat/test/parallel/test-zlib-empty-buffer.js deleted file mode 100644 index 2281ba88e..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-empty-buffer.js +++ /dev/null @@ -1,35 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; -const common = require('../common'); -const zlib = require('zlib'); -const { inspect, promisify } = require('util'); -const assert = require('assert'); -const emptyBuffer = Buffer.alloc(0); - -(async function() { - for (const [ compress, decompress, method ] of [ - [ zlib.deflateRawSync, zlib.inflateRawSync, 'raw sync' ], - [ zlib.deflateSync, zlib.inflateSync, 'deflate sync' ], - [ zlib.gzipSync, zlib.gunzipSync, 'gzip sync' ], - // FIXME(bartlomieju): - // [ zlib.brotliCompressSync, zlib.brotliDecompressSync, 'br sync' ], - [ promisify(zlib.deflateRaw), promisify(zlib.inflateRaw), 'raw' ], - [ promisify(zlib.deflate), promisify(zlib.inflate), 'deflate' ], - [ promisify(zlib.gzip), promisify(zlib.gunzip), 'gzip' ], - // FIXME(bartlomieju): - // [ promisify(zlib.brotliCompress), promisify(zlib.brotliDecompress), 'br' ], - ]) { - const compressed = await compress(emptyBuffer); - const decompressed = await decompress(compressed); - assert.deepStrictEqual( - emptyBuffer, decompressed, - `Expected ${inspect(compressed)} to match ${inspect(decompressed)} ` + - `to match for ${method}`); - } -})().then(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-from-string.js b/cli/tests/node_compat/test/parallel/test-zlib-from-string.js deleted file mode 100644 index dc238220b..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-from-string.js +++ /dev/null @@ -1,90 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/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'; -// Test compressing and uncompressing a string with zlib - -const common = require('../common'); -const assert = require('assert'); -const zlib = require('zlib'); - -const inputString = 'ΩΩLorem ipsum dolor sit amet, consectetur adipiscing eli' + - 't. Morbi faucibus, purus at gravida dictum, libero arcu ' + - 'convallis lacus, in commodo libero metus eu nisi. Nullam' + - ' commodo, neque nec porta placerat, nisi est fermentum a' + - 'ugue, vitae gravida tellus sapien sit amet tellus. Aenea' + - 'n non diam orci. Proin quis elit turpis. Suspendisse non' + - ' diam ipsum. Suspendisse nec ullamcorper odio. Vestibulu' + - 'm arcu mi, sodales non suscipit id, ultrices ut massa. S' + - 'ed ac sem sit amet arcu malesuada fermentum. Nunc sed. '; -const expectedBase64Deflate = 'eJxdUUtOQzEMvMoc4OndgT0gJCT2buJWlpI4jePeqZfpmX' + - 'AKLRKbLOzx/HK73q6vOrhCunlF1qIDJhNUeW5I2ozT5OkD' + - 'lKWLJWkncJG5403HQXAkT3Jw29B9uIEmToMukglZ0vS6oc' + - 'iBh4JG8sV4oVLEUCitK2kxq1WzPnChHDzsaGKy491LofoA' + - 'bWh8do43oeuYhB5EPCjcLjzYJo48KrfQBvnJecNFJvHT1+' + - 'RSQsGoC7dn2t/xjhduTA1NWyQIZR0pbHwMDatnD+crPqKS' + - 'qGPHp1vnlsWM/07ubf7bheF7kqSj84Bm0R1fYTfaK8vqqq' + - 'fKBtNMhe3OZh6N95CTvMX5HJJi4xOVzCgUOIMSLH7wmeOH' + - 'aFE4RdpnGavKtrB5xzfO/Ll9'; -const expectedBase64Gzip = 'H4sIAAAAAAAAA11RS05DMQy8yhzg6d2BPSAkJPZu4laWkjiN4' + - '96pl+mZcAotEpss7PH8crverq86uEK6eUXWogMmE1R5bkjajN' + - 'Pk6QOUpYslaSdwkbnjTcdBcCRPcnDb0H24gSZOgy6SCVnS9Lq' + - 'hyIGHgkbyxXihUsRQKK0raTGrVbM+cKEcPOxoYrLj3Uuh+gBt' + - 'aHx2jjeh65iEHkQ8KNwuPNgmjjwqt9AG+cl5w0Um8dPX5FJCw' + - 'agLt2fa3/GOF25MDU1bJAhlHSlsfAwNq2cP5ys+opKoY8enW+' + - 'eWxYz/Tu5t/tuF4XuSpKPzgGbRHV9hN9ory+qqp8oG00yF7c5' + - 'mHo33kJO8xfkckmLjE5XMKBQ4gxIsfvCZ44doUThF2mcZq8q2' + - 'sHnHNzRtagj5AQAA'; - -zlib.deflate(inputString, common.mustCall((err, buffer) => { - zlib.inflate(buffer, common.mustCall((err, inflated) => { - assert.strictEqual(inflated.toString(), inputString); - })); -})); - -zlib.gzip(inputString, common.mustCall((err, buffer) => { - // Can't actually guarantee that we'll get exactly the same - // deflated bytes when we compress a string, since the header - // depends on stuff other than the input string itself. - // However, decrypting it should definitely yield the same - // result that we're expecting, and this should match what we get - // from inflating the known valid deflate data. - zlib.gunzip(buffer, common.mustCall((err, gunzipped) => { - assert.strictEqual(gunzipped.toString(), inputString); - })); -})); - -let buffer = Buffer.from(expectedBase64Deflate, 'base64'); -zlib.unzip(buffer, common.mustCall((err, buffer) => { - assert.strictEqual(buffer.toString(), inputString); -})); - -buffer = Buffer.from(expectedBase64Gzip, 'base64'); -zlib.unzip(buffer, common.mustCall((err, buffer) => { - assert.strictEqual(buffer.toString(), inputString); -})); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-invalid-input.js b/cli/tests/node_compat/test/parallel/test-zlib-invalid-input.js deleted file mode 100644 index d8ecae521..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-invalid-input.js +++ /dev/null @@ -1,68 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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'; -// Test uncompressing invalid input - -const common = require('../common'); -const assert = require('assert'); -const zlib = require('zlib'); - -const nonStringInputs = [ - 1, - true, - { a: 1 }, - ['a'], -]; - -// zlib.Unzip classes need to get valid data, or else they'll throw. -const unzips = [ - zlib.Unzip(), - zlib.Gunzip(), - zlib.Inflate(), - zlib.InflateRaw(), - // FIXME(bartlomieju): - // zlib.BrotliDecompress(), -]; - -nonStringInputs.forEach(common.mustCall((input) => { - assert.throws(() => { - zlib.gunzip(input); - }, { - name: 'TypeError', - code: 'ERR_INVALID_ARG_TYPE' - }); -}, nonStringInputs.length)); - -unzips.forEach(common.mustCall((uz, i) => { - uz.on('error', common.mustCall()); - uz.on('end', common.mustNotCall); - - // This will trigger error event - uz.write('this is not valid compressed data.'); -}, unzips.length)); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-no-stream.js b/cli/tests/node_compat/test/parallel/test-zlib-no-stream.js deleted file mode 100644 index 27b352406..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-no-stream.js +++ /dev/null @@ -1,21 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -/* eslint-disable node-core/required-modules */ -/* eslint-disable node-core/require-common-first */ - -'use strict'; - -// We are not loading common because it will load the stream module, -// defeating the purpose of this test. - -const { gzipSync } = require('zlib'); - -// Avoid regressions such as https://github.com/nodejs/node/issues/36615 - -// This must not throw -gzipSync('fooobar'); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js b/cli/tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js deleted file mode 100644 index 56409d411..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-random-byte-pipes.js +++ /dev/null @@ -1,166 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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'); -if (!common.hasCrypto) - common.skip('missing crypto'); - -const assert = require('assert'); -const crypto = require('crypto'); -const stream = require('stream'); -const zlib = require('zlib'); - -const Stream = stream.Stream; - -// Emit random bytes, and keep a shasum -class RandomReadStream extends Stream { - constructor(opt) { - super(); - - this.readable = true; - this._paused = false; - this._processing = false; - - this._hasher = crypto.createHash('sha1'); - opt = opt || {}; - - // base block size. - opt.block = opt.block || 256 * 1024; - - // Total number of bytes to emit - opt.total = opt.total || 256 * 1024 * 1024; - this._remaining = opt.total; - - // How variable to make the block sizes - opt.jitter = opt.jitter || 1024; - - this._opt = opt; - - this._process = this._process.bind(this); - - process.nextTick(this._process); - } - - pause() { - this._paused = true; - this.emit('pause'); - } - - resume() { - // console.error("rrs resume"); - this._paused = false; - this.emit('resume'); - this._process(); - } - - _process() { - if (this._processing) return; - if (this._paused) return; - - this._processing = true; - - if (!this._remaining) { - this._hash = this._hasher.digest('hex').toLowerCase().trim(); - this._processing = false; - - this.emit('end'); - return; - } - - // Figure out how many bytes to output - // if finished, then just emit end. - let block = this._opt.block; - const jitter = this._opt.jitter; - if (jitter) { - block += Math.ceil(Math.random() * jitter - (jitter / 2)); - } - block = Math.min(block, this._remaining); - const buf = Buffer.allocUnsafe(block); - for (let i = 0; i < block; i++) { - buf[i] = Math.random() * 256; - } - - this._hasher.update(buf); - - this._remaining -= block; - - this._processing = false; - - this.emit('data', buf); - process.nextTick(this._process); - } -} - -// A filter that just verifies a shasum -class HashStream extends Stream { - constructor() { - super(); - this.readable = this.writable = true; - this._hasher = crypto.createHash('sha1'); - } - - write(c) { - // Simulate the way that an fs.ReadStream returns false - // on *every* write, only to resume a moment later. - this._hasher.update(c); - process.nextTick(() => this.resume()); - return false; - } - - resume() { - this.emit('resume'); - process.nextTick(() => this.emit('drain')); - } - - end(c) { - if (c) { - this.write(c); - } - this._hash = this._hasher.digest('hex').toLowerCase().trim(); - this.emit('data', this._hash); - this.emit('end'); - } -} - -for (const [ createCompress, createDecompress ] of [ - [ zlib.createGzip, zlib.createGunzip ], - // TODO(kt3k): Enable this when we support brotli in zlib - // [ zlib.createBrotliCompress, zlib.createBrotliDecompress ], -]) { - const inp = new RandomReadStream({ total: 1024, block: 256, jitter: 16 }); - const out = new HashStream(); - const gzip = createCompress(); - const gunz = createDecompress(); - - inp.pipe(gzip).pipe(gunz).pipe(out); - - out.on('data', common.mustCall((c) => { - assert.strictEqual(c, inp._hash, `Hash '${c}' equals '${inp._hash}'.`); - })); -} diff --git a/cli/tests/node_compat/test/parallel/test-zlib-sync-no-event.js b/cli/tests/node_compat/test/parallel/test-zlib-sync-no-event.js deleted file mode 100644 index 62019677c..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-sync-no-event.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const zlib = require('zlib'); -const assert = require('assert'); - -const message = 'Come on, Fhqwhgads.'; -const buffer = Buffer.from(message); - -const zipper = new zlib.Gzip(); -zipper.on('close', common.mustNotCall()); - -const zipped = zipper._processChunk(buffer, zlib.constants.Z_FINISH); - -const unzipper = new zlib.Gunzip(); -unzipper.on('close', common.mustNotCall()); - -const unzipped = unzipper._processChunk(zipped, zlib.constants.Z_FINISH); -assert.notStrictEqual(zipped.toString(), message); -assert.strictEqual(unzipped.toString(), message); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-truncated.js b/cli/tests/node_compat/test/parallel/test-zlib-truncated.js deleted file mode 100644 index 60e730171..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-truncated.js +++ /dev/null @@ -1,71 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -// Tests zlib streams with truncated compressed input - -require('../common'); -const assert = require('assert'); -const zlib = require('zlib'); - -const inputString = 'ΩΩLorem ipsum dolor sit amet, consectetur adipiscing eli' + - 't. Morbi faucibus, purus at gravida dictum, libero arcu ' + - 'convallis lacus, in commodo libero metus eu nisi. Nullam' + - ' commodo, neque nec porta placerat, nisi est fermentum a' + - 'ugue, vitae gravida tellus sapien sit amet tellus. Aenea' + - 'n non diam orci. Proin quis elit turpis. Suspendisse non' + - ' diam ipsum. Suspendisse nec ullamcorper odio. Vestibulu' + - 'm arcu mi, sodales non suscipit id, ultrices ut massa. S' + - 'ed ac sem sit amet arcu malesuada fermentum. Nunc sed. '; - -const errMessage = /unexpected end of file/; - -[ - { comp: 'gzip', decomp: 'gunzip', decompSync: 'gunzipSync' }, - { comp: 'gzip', decomp: 'unzip', decompSync: 'unzipSync' }, - { comp: 'deflate', decomp: 'inflate', decompSync: 'inflateSync' }, - { comp: 'deflateRaw', decomp: 'inflateRaw', decompSync: 'inflateRawSync' }, -].forEach(function(methods) { - zlib[methods.comp](inputString, function(err, compressed) { - assert.ifError(err); - const truncated = compressed.slice(0, compressed.length / 2); - const toUTF8 = (buffer) => buffer.toString('utf-8'); - - // sync sanity - const decompressed = zlib[methods.decompSync](compressed); - assert.strictEqual(toUTF8(decompressed), inputString); - - // async sanity - zlib[methods.decomp](compressed, function(err, result) { - assert.ifError(err); - assert.strictEqual(toUTF8(result), inputString); - }); - - // Sync truncated input test - assert.throws(function() { - zlib[methods.decompSync](truncated); - }, errMessage); - - // Async truncated input test - zlib[methods.decomp](truncated, function(err, result) { - assert.match(err.message, errMessage); - }); - - const syncFlushOpt = { finishFlush: zlib.constants.Z_SYNC_FLUSH }; - - // Sync truncated input test, finishFlush = Z_SYNC_FLUSH - const result = toUTF8(zlib[methods.decompSync](truncated, syncFlushOpt)); - assert.strictEqual(result, inputString.substr(0, result.length)); - - // Async truncated input test, finishFlush = Z_SYNC_FLUSH - zlib[methods.decomp](truncated, syncFlushOpt, function(err, decompressed) { - assert.ifError(err); - const result = toUTF8(decompressed); - assert.strictEqual(result, inputString.substr(0, result.length)); - }); - }); -}); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js b/cli/tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js deleted file mode 100644 index 62b2050d3..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-unzip-one-byte-chunks.js +++ /dev/null @@ -1,37 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const zlib = require('zlib'); - -const data = Buffer.concat([ - zlib.gzipSync('abc'), - zlib.gzipSync('def'), -]); - -const resultBuffers = []; - -const unzip = zlib.createUnzip() - .on('error', (err) => { - assert.ifError(err); - }) - .on('data', (data) => resultBuffers.push(data)) - .on('finish', common.mustCall(() => { - const unzipped = Buffer.concat(resultBuffers).toString(); - assert.strictEqual(unzipped, 'abcdef', - `'${unzipped}' should match 'abcdef' after zipping ` + - 'and unzipping'); - })); - -for (let i = 0; i < data.length; i++) { - // Write each single byte individually. - unzip.write(Buffer.from([data[i]])); -} - -unzip.end(); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-write-after-end.js b/cli/tests/node_compat/test/parallel/test-zlib-write-after-end.js deleted file mode 100644 index 7c7e3ea35..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-write-after-end.js +++ /dev/null @@ -1,23 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -const common = require('../common'); -const zlib = require('zlib'); - -// Regression test for https://github.com/nodejs/node/issues/30976 -// Writes to a stream should finish even after the readable side has been ended. - -const data = zlib.deflateRawSync('Welcome'); - -const inflate = zlib.createInflateRaw(); - -inflate.resume(); -inflate.write(data, common.mustCall()); -inflate.write(Buffer.from([0x00]), common.mustCall()); -inflate.write(Buffer.from([0x00]), common.mustCall()); -inflate.flush(common.mustCall()); diff --git a/cli/tests/node_compat/test/parallel/test-zlib-write-after-flush.js b/cli/tests/node_compat/test/parallel/test-zlib-write-after-flush.js deleted file mode 100644 index 6f33668c7..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-write-after-flush.js +++ /dev/null @@ -1,57 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 zlib = require('zlib'); - -for (const [ createCompress, createDecompress ] of [ - [ zlib.createGzip, zlib.createGunzip ], - // FIXME(bartlomieju): - // [ zlib.createBrotliCompress, zlib.createBrotliDecompress ], -]) { - const gzip = createCompress(); - const gunz = createDecompress(); - - gzip.pipe(gunz); - - let output = ''; - const input = 'A line of data\n'; - gunz.setEncoding('utf8'); - gunz.on('data', (c) => output += c); - gunz.on('end', common.mustCall(() => { - assert.strictEqual(output, input); - })); - - // Make sure that flush/write doesn't trigger an assert failure - gzip.flush(); - gzip.write(input); - gzip.end(); - gunz.read(0); -} diff --git a/cli/tests/node_compat/test/parallel/test-zlib-zero-byte.js b/cli/tests/node_compat/test/parallel/test-zlib-zero-byte.js deleted file mode 100644 index fb12b2280..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-zero-byte.js +++ /dev/null @@ -1,53 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.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 zlib = require('zlib'); - -for (const Compressor of [ zlib.Gzip, - // FIXME(bartlomieju): - // zlib.BrotliCompress -]) { - const gz = Compressor(); - const emptyBuffer = Buffer.alloc(0); - let received = 0; - gz.on('data', function(c) { - received += c.length; - }); - - gz.on('end', common.mustCall(function() { - const expected = Compressor === zlib.Gzip ? 20 : 1; - assert.strictEqual(received, expected, - `${received}, ${expected}, ${Compressor.name}`); - })); - gz.on('finish', common.mustCall()); - gz.write(emptyBuffer); - gz.end(); -} diff --git a/cli/tests/node_compat/test/parallel/test-zlib-zero-windowBits.js b/cli/tests/node_compat/test/parallel/test-zlib-zero-windowBits.js deleted file mode 100644 index fe74fe6d8..000000000 --- a/cli/tests/node_compat/test/parallel/test-zlib-zero-windowBits.js +++ /dev/null @@ -1,41 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 16.13.0 -// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually - -'use strict'; - -require('../common'); -const assert = require('assert'); -const zlib = require('zlib'); - - -// windowBits is a special case in zlib. On the compression side, 0 is invalid. -// On the decompression side, it indicates that zlib should use the value from -// the header of the compressed stream. -{ - const inflate = zlib.createInflate({ windowBits: 0 }); - assert(inflate instanceof zlib.Inflate); -} - -{ - const gunzip = zlib.createGunzip({ windowBits: 0 }); - assert(gunzip instanceof zlib.Gunzip); -} - -{ - const unzip = zlib.createUnzip({ windowBits: 0 }); - assert(unzip instanceof zlib.Unzip); -} - -// FIXME(bartlomieju): -// { -// assert.throws(() => zlib.createGzip({ windowBits: 0 }), { -// code: 'ERR_OUT_OF_RANGE', -// name: 'RangeError', -// message: 'The value of "options.windowBits" is out of range. ' + -// 'It must be >= 9 and <= 15. Received 0' -// }); -// } diff --git a/cli/tests/node_compat/test/pseudo-tty/console-dumb-tty.js b/cli/tests/node_compat/test/pseudo-tty/console-dumb-tty.js deleted file mode 100644 index 9b4bd1520..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/console-dumb-tty.js +++ /dev/null @@ -1,16 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -process.env.TERM = 'dumb'; - -console.log({ foo: 'bar' }); -console.dir({ foo: 'bar' }); -console.log('%s q', 'string'); -console.log('%o with object format param', { foo: 'bar' }); diff --git a/cli/tests/node_compat/test/pseudo-tty/console_colors.js b/cli/tests/node_compat/test/pseudo-tty/console_colors.js deleted file mode 100644 index 2be464457..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/console_colors.js +++ /dev/null @@ -1,29 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); -const vm = require('vm'); -// Make this test OS-independent by overriding stdio getColorDepth(). -process.stdout.getColorDepth = () => 8; -process.stderr.getColorDepth = () => 8; - -console.log({ foo: 'bar' }); -console.log('%s q', 'string'); -console.log('%o with object format param', { foo: 'bar' }); - -console.log( - new Error('test\n at abc (../fixtures/node_modules/bar.js:4:4)\nfoobar'), -); - -try { - require('../fixtures/node_modules/node_modules/bar.js'); -} catch (err) { - console.log(err); -} - -vm.runInThisContext('console.log(new Error())'); diff --git a/cli/tests/node_compat/test/pseudo-tty/no_dropped_stdio.js b/cli/tests/node_compat/test/pseudo-tty/no_dropped_stdio.js deleted file mode 100644 index d2bbb92c5..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/no_dropped_stdio.js +++ /dev/null @@ -1,26 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// https://github.com/nodejs/node/issues/6456#issuecomment-219320599 -// https://gist.github.com/isaacs/1495b91ec66b21d30b10572d72ad2cdd -'use strict'; -const common = require('../common'); - -// 1000 bytes wrapped at 50 columns -// \n turns into a double-byte character -// (48 + {2}) * 20 = 1000 -let out = `${'o'.repeat(48)}\n`.repeat(20); -// Add the remaining 24 bytes and terminate with an 'O'. -// This results in 1025 bytes, just enough to overflow the 1kb OS X TTY buffer. -out += `${'o'.repeat(24)}O`; - -// In AIX, the child exits even before the python parent -// can setup the readloop. Provide a reasonable delay. -setTimeout(function() { - process.stdout.write(out); - process.exit(0); -}, common.isAIX ? 200 : 0); diff --git a/cli/tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js b/cli/tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js deleted file mode 100644 index 895124420..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/no_interleaved_stdio.js +++ /dev/null @@ -1,28 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -// https://github.com/nodejs/node/issues/6456#issuecomment-219320599 -// https://gist.github.com/isaacs/1495b91ec66b21d30b10572d72ad2cdd -'use strict'; -const common = require('../common'); - -// 1000 bytes wrapped at 50 columns -// \n turns into a double-byte character -// (48 + {2}) * 20 = 1000 -let out = `${'o'.repeat(48)}\n`.repeat(20); -// Add the remaining 24 bytes and terminate with an 'O'. -// This results in 1025 bytes, just enough to overflow the 1kb OS X TTY buffer. -out += `${'o'.repeat(24)}O`; - -const err = '__This is some stderr__'; - -// In AIX, the child exits even before the python parent -// can setup the readloop. Provide a reasonable delay. -setTimeout(function() { - process.stdout.write(out); - process.stderr.write(err); -}, common.isAIX ? 200 : 0); diff --git a/cli/tests/node_compat/test/pseudo-tty/package.json b/cli/tests/node_compat/test/pseudo-tty/package.json deleted file mode 100644 index 0967ef424..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js b/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js deleted file mode 100644 index 6a969ac9e..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning-2.js +++ /dev/null @@ -1,15 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -process.env.NODE_DISABLE_COLORS = '1'; -process.env.FORCE_COLOR = '3'; - -console.log(); diff --git a/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js b/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js deleted file mode 100644 index a9338105c..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/test-tty-color-support-warning.js +++ /dev/null @@ -1,16 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; - -require('../common'); - -process.env.NO_COLOR = '1'; -process.env.NODE_DISABLE_COLORS = '1'; -process.env.FORCE_COLOR = '3'; - -console.log(); diff --git a/cli/tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js b/cli/tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js deleted file mode 100644 index ee38cbd2c..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/test-tty-stdin-end.js +++ /dev/null @@ -1,14 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -// This test ensures that Node.js doesn't crash on `process.stdin.emit("end")`. -// https://github.com/nodejs/node/issues/1068 - -process.stdin.emit('end'); diff --git a/cli/tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js b/cli/tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js deleted file mode 100644 index bd30a9a2e..000000000 --- a/cli/tests/node_compat/test/pseudo-tty/test-tty-stdout-end.js +++ /dev/null @@ -1,11 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually. - -'use strict'; -require('../common'); - -process.stdout.end(); diff --git a/cli/tests/node_compat/test/pummel/package.json b/cli/tests/node_compat/test/pummel/package.json deleted file mode 100644 index 0967ef424..000000000 --- a/cli/tests/node_compat/test/pummel/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/cli/tests/node_compat/test/sequential/package.json b/cli/tests/node_compat/test/sequential/package.json deleted file mode 100644 index 0967ef424..000000000 --- a/cli/tests/node_compat/test/sequential/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/cli/tests/node_compat/test/sequential/test-child-process-exit.js b/cli/tests/node_compat/test/sequential/test-child-process-exit.js deleted file mode 100644 index c8930b059..000000000 --- a/cli/tests/node_compat/test/sequential/test-child-process-exit.js +++ /dev/null @@ -1,69 +0,0 @@ -// deno-fmt-ignore-file -// deno-lint-ignore-file - -// Copyright Joyent and Node contributors. All rights reserved. MIT license. -// Taken from Node 18.12.1 -// 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. - -// TODO(PolarETech): The process.argv[3] to be assigned to gen should be argv[2], -// and the arguments array passed to spawn() should not need to include "require.ts". - -'use strict'; -require('../common'); - -// Open a chain of five Node processes each a child of the next. The final -// process exits immediately. Each process in the chain is instructed to exit -// when its child exits. -// https://github.com/joyent/node/issues/1726 - -const assert = require('assert'); -const ch = require('child_process'); - -const gen = +(process.argv[3] || 0); -const maxGen = 5; - - -if (gen === maxGen) { - console.error('hit maxGen, exiting', maxGen); - return; -} - -const child = ch.spawn(process.execPath, ['require.ts', __filename, gen + 1], { - stdio: [ 'ignore', 'pipe', 'ignore' ] -}); -assert.ok(!child.stdin); -assert.ok(child.stdout); -assert.ok(!child.stderr); - -console.error('gen=%d, pid=%d', gen, process.pid); - -child.on('exit', function(code) { - console.error('exit %d from gen %d', code, gen + 1); -}); - -child.stdout.pipe(process.stdout); - -child.stdout.on('close', function() { - console.error('child.stdout close gen=%d', gen); -}); |