// Flags: --expose-internals 'use strict'; const common = require('../common'); const strictEqual = require('assert').strictEqual; const { internalBinding } = require('internal/test/binding'); // child_process { const spawn = require('child_process').spawn; const cmd = common.isWindows ? 'rundll32' : 'ls'; const cp = spawn(cmd); strictEqual(cp._handle.hasRef(), true, 'process_wrap: not initially refed'); cp.unref(); strictEqual(cp._handle.hasRef(), false, 'process_wrap: unref() ineffective'); cp.ref(); strictEqual(cp._handle.hasRef(), true, 'process_wrap: ref() ineffective'); cp._handle.close(common.mustCall(() => strictEqual(cp._handle.hasRef(), false, 'process_wrap: not unrefed on close'))); } const dgram = require('dgram'); const { kStateSymbol } = require('internal/dgram'); // dgram ipv4 { const sock4 = dgram.createSocket('udp4'); const handle = sock4[kStateSymbol].handle; strictEqual(handle.hasRef(), true, 'udp_wrap: ipv4: not initially refed'); sock4.unref(); strictEqual(handle.hasRef(), false, 'udp_wrap: ipv4: unref() ineffective'); sock4.ref(); strictEqual(handle.hasRef(), true, 'udp_wrap: ipv4: ref() ineffective'); handle.close(common.mustCall(() => strictEqual(handle.hasRef(), false, 'udp_wrap: ipv4: not unrefed on close'))); } // dgram ipv6 { const sock6 = dgram.createSocket('udp6'); const handle = sock6[kStateSymbol].handle; strictEqual(handle.hasRef(), true, 'udp_wrap: ipv6: not initially refed'); sock6.unref(); strictEqual(handle.hasRef(), false, 'udp_wrap: ipv6: unref() ineffective'); sock6.ref(); strictEqual(handle.hasRef(), true, 'udp_wrap: ipv6: ref() ineffective'); handle.close(common.mustCall(() => strictEqual(handle.hasRef(), false, 'udp_wrap: ipv6: not unrefed on close'))); } // pipe { const { Pipe, constants: PipeConstants } = internalBinding('pipe_wrap'); const handle = new Pipe(PipeConstants.SOCKET); strictEqual(handle.hasRef(), true, 'pipe_wrap: not initially refed'); handle.unref(); strictEqual(handle.hasRef(), false, 'pipe_wrap: unref() ineffective'); handle.ref(); strictEqual(handle.hasRef(), true, 'pipe_wrap: ref() ineffective'); handle.close(common.mustCall(() => strictEqual(handle.hasRef(), false, 'pipe_wrap: not unrefed on close'))); } // tcp { const net = require('net'); const server = net.createServer(() => {}).listen(0); strictEqual(server._handle.hasRef(), true, 'tcp_wrap: not initially refed'); strictEqual(server._unref, false, 'tcp_wrap: _unref initially incorrect'); server.unref(); strictEqual(server._handle.hasRef(), false, 'tcp_wrap: unref() ineffective'); strictEqual(server._unref, true, 'tcp_wrap: _unref not updated on unref()'); server.ref(); strictEqual(server._handle.hasRef(), true, 'tcp_wrap: ref() ineffective'); strictEqual(server._unref, false, 'tcp_wrap: _unref not updated on ref()'); server._handle.close(common.mustCall(() => strictEqual(server._handle.hasRef(), false, 'tcp_wrap: not unrefed on close'))); } // See also test/pseudo-tty/test-handle-wrap-isrefed-tty.js