Permalink
Browse files

test: add common.mustNotCall()

This commit adds a mustNotCall() helper for testing. This provides
an alternative to using common.fail() as a callback, or creating
a callback function for the sole purpose of calling common.fail().

PR-URL: #11152
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com>
Reviewed-By: Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Reviewed-By: Yuta Hiroto <hello@about-hiroppy.com>
  • Loading branch information...
cjihrig authored and italoacasas committed Feb 3, 2017
1 parent 44b17a2 commit f0eba7811d521bbc99dd6ae487ed1abce781a0b8
Showing with 243 additions and 234 deletions.
  1. +6 −0 test/common.js
  2. +2 −2 test/debugger/test-debugger-remote.js
  3. +3 −2 test/inspector/inspector-helper.js
  4. +1 −1 test/internet/test-dns.js
  5. +1 −1 test/internet/test-http-dns-fail.js
  6. +1 −1 test/internet/test-net-connect-timeout.js
  7. +2 −2 test/internet/test-net-connect-unref.js
  8. +2 −2 test/parallel/test-async-wrap-throw-from-callback.js
  9. +1 −1 test/parallel/test-child-process-kill.js
  10. +1 −1 test/parallel/test-child-process-recv-handle.js
  11. +1 −1 test/parallel/test-child-process-send-returns-boolean.js
  12. +1 −1 test/parallel/test-child-process-spawn-shell.js
  13. +1 −1 test/parallel/test-child-process-spawn-typeerror.js
  14. +1 −1 test/parallel/test-child-process-stdin.js
  15. +1 −1 test/parallel/test-child-process-stdout-flush.js
  16. +2 −2 test/parallel/test-cluster-bind-privileged-port.js
  17. +6 −5 test/parallel/test-cluster-bind-twice.js
  18. +4 −4 test/parallel/test-cluster-eaddrinuse.js
  19. +1 −1 test/parallel/test-cluster-listening-port.js
  20. +1 −1 test/parallel/test-cluster-net-listen.js
  21. +1 −1 test/parallel/test-cluster-rr-ref.js
  22. +1 −1 test/parallel/test-cluster-setup-master-argv.js
  23. +3 −3 test/parallel/test-cluster-shared-handle-bind-error.js
  24. +2 −2 test/parallel/test-cluster-shared-handle-bind-privileged-port.js
  25. +1 −1 test/parallel/test-console-instance.js
  26. +8 −5 test/parallel/test-crypto-pbkdf2.js
  27. +1 −1 test/parallel/test-crypto-verify-failure.js
  28. +2 −2 test/parallel/test-dgram-error-message-address.js
  29. +1 −1 test/parallel/test-dgram-unref.js
  30. +1 −1 test/parallel/test-domain-multi.js
  31. +1 −1 test/parallel/test-event-emitter-remove-listeners.js
  32. +3 −3 test/parallel/test-force-repl.js
  33. +1 −1 test/parallel/test-fs-access.js
  34. +3 −3 test/parallel/test-fs-null-bytes.js
  35. +1 −1 test/parallel/test-fs-read-stream-err.js
  36. +1 −1 test/parallel/test-http-abort-before-end.js
  37. +1 −1 test/parallel/test-http-abort-queued-2.js
  38. +3 −3 test/parallel/test-http-bind-twice.js
  39. +1 −1 test/parallel/test-http-client-abort-event.js
  40. +1 −1 test/parallel/test-http-client-abort-no-agent.js
  41. +1 −1 test/parallel/test-http-client-abort-unix-socket.js
  42. +40 −0 test/parallel/test-http-client-check-http-token.js
  43. +1 −3 test/parallel/test-http-client-reject-chunked-with-content-length.js
  44. +1 −3 test/parallel/test-http-client-reject-cr-no-lf.js
  45. +1 −1 test/parallel/test-http-client-unescaped-path.js
  46. +1 −1 test/parallel/test-http-conn-reset.js
  47. +2 −2 test/parallel/test-http-connect-req-res.js
  48. +2 −2 test/parallel/test-http-connect.js
  49. +2 −6 test/parallel/test-http-destroyed-socket-write2.js
  50. +3 −6 test/parallel/test-http-double-content-length.js
  51. +5 −5 test/parallel/test-http-host-headers.js
  52. +1 −1 test/parallel/test-http-parser.js
  53. +1 −1 test/parallel/test-http-pipeline-flood.js
  54. +1 −3 test/parallel/test-http-server-reject-chunked-with-content-length.js
  55. +2 −6 test/parallel/test-http-server-reject-cr-no-lf.js
  56. +1 −4 test/parallel/test-http-server-unconsume-consume.js
  57. +1 −1 test/parallel/test-http-set-trailers.js
  58. +1 −1 test/parallel/test-https-agent-session-eviction.js
  59. +1 −1 test/parallel/test-https-client-checkServerIdentity.js
  60. +2 −2 test/parallel/test-https-client-reject.js
  61. +2 −2 test/parallel/test-https-connecting-to-http.js
  62. +3 −3 test/parallel/test-https-set-timeout-server.js
  63. +1 −1 test/parallel/test-https-timeout-server-2.js
  64. +1 −1 test/parallel/test-https-timeout-server.js
  65. +2 −2 test/parallel/test-listen-fd-ebadf.js
  66. +2 −2 test/parallel/test-net-better-error-messages-listen-path.js
  67. +2 −2 test/parallel/test-net-better-error-messages-listen.js
  68. +1 −1 test/parallel/test-net-better-error-messages-path.js
  69. +1 −1 test/parallel/test-net-better-error-messages-port-hostname.js
  70. +1 −1 test/parallel/test-net-better-error-messages-port.js
  71. +3 −3 test/parallel/test-net-bind-twice.js
  72. +1 −3 test/parallel/test-net-connect-handle-econnrefused.js
  73. +3 −2 test/parallel/test-net-connect-immediate-destroy.js
  74. +1 −3 test/parallel/test-net-connect-paused-connection.js
  75. +2 −1 test/parallel/test-net-dns-lookup-skip.js
  76. +2 −2 test/parallel/test-net-listen-close-server-callback-is-not-function.js
  77. +2 −2 test/parallel/test-net-listen-close-server.js
  78. +1 −1 test/parallel/test-net-listen-error.js
  79. +1 −1 test/parallel/test-net-listen-fd0.js
  80. +2 −2 test/parallel/test-net-listen-port-option.js
  81. +2 −2 test/parallel/test-net-pause-resume-connecting.js
  82. +2 −2 test/parallel/test-net-pingpong.js
  83. +2 −3 test/parallel/test-net-pipe-connect-errors.js
  84. +1 −3 test/parallel/test-net-reconnect-error.js
  85. +1 −1 test/parallel/test-net-server-unref-persistent.js
  86. +1 −1 test/parallel/test-net-server-unref.js
  87. +1 −3 test/parallel/test-net-settimeout.js
  88. +1 −1 test/parallel/test-next-tick.js
  89. +1 −1 test/parallel/test-pipe-address.js
  90. +1 −1 test/parallel/test-pipe-unref.js
  91. +1 −1 test/parallel/test-process-exit-from-before-exit.js
  92. +3 −3 test/parallel/test-regress-GH-5727.js
  93. +1 −1 test/parallel/test-repl-tab.js
  94. +1 −1 test/parallel/test-signal-handler.js
  95. +1 −1 test/parallel/test-stream-pipe-unpipe-streams.js
  96. +2 −2 test/parallel/test-stream-readable-event.js
  97. +1 −3 test/parallel/test-stream-writev.js
  98. +1 −1 test/parallel/test-timer-close.js
  99. +1 −3 test/parallel/test-timers-immediate.js
  100. +2 −6 test/parallel/test-timers-regress-GH-9765.js
  101. +1 −3 test/parallel/test-timers-same-timeout-wrong-list-deleted.js
  102. +1 −1 test/parallel/test-timers-unref-remove-other-unref-timers.js
  103. +2 −2 test/parallel/test-tls-cipher-list.js
  104. +1 −1 test/parallel/test-tls-client-abort.js
  105. +1 −1 test/parallel/test-tls-client-abort2.js
  106. +1 −1 test/parallel/test-tls-client-mindhsize.js
  107. +3 −3 test/parallel/test-tls-client-reject.js
  108. +1 −1 test/parallel/test-tls-close-error.js
  109. +2 −2 test/parallel/test-tls-connect.js
  110. +1 −1 test/parallel/test-tls-ecdh-disable.js
  111. +1 −3 test/parallel/test-tls-empty-sni-context.js
  112. +1 −1 test/parallel/test-tls-handshake-error.js
  113. +1 −1 test/parallel/test-tls-junk-closes-server.js
  114. +1 −1 test/parallel/test-tls-no-sslv3.js
  115. +1 −1 test/parallel/test-tls-timeout-server.js
  116. +1 −1 test/parallel/test-tls-zero-clear-in.js
  117. +3 −3 test/parallel/test-vm-debug-context.js
  118. +1 −1 test/parallel/test-zerolengthbufferbug.js
  119. +2 −2 test/pummel/test-fs-watch-file.js
  120. +1 −1 test/pummel/test-fs-watch-non-recursive.js
  121. +1 −1 test/pummel/test-net-timeout2.js
  122. +1 −3 test/sequential/test-child-process-emfile.js
  123. +2 −3 test/sequential/test-http-server-consumed-timeout.js
  124. +5 −5 test/sequential/test-net-server-address.js
View
@@ -494,6 +494,12 @@ function fail(msg) {
}
exports.fail = fail;
+exports.mustNotCall = function(msg) {
+ return function mustNotCall() {
+ fail(msg || 'function should not have been called');
+ };
+};
+
exports.skip = function(msg) {
console.log(`1..0 # Skipped: ${msg}`);
};
@@ -15,8 +15,8 @@ const interfacer = spawn(process.execPath, ['debug', `localhost:${PORT}`]);
interfacer.stdout.setEncoding('utf-8');
// fail the test if either of the processes exit normally
-const debugBreakExit = common.fail.bind(null, 'child should not exit normally');
-const debugExit = common.fail.bind(null, 'interfacer should not exit normally');
+const debugBreakExit = common.mustNotCall('child should not exit normally');
+const debugExit = common.mustNotCall('interfacer should not exit normally');
child.on('exit', debugBreakExit);
interfacer.on('exit', debugExit);
@@ -116,7 +116,8 @@ function makeBufferingDataCallback(dataCallback) {
}
function timeout(message, multiplicator) {
- return setTimeout(() => common.fail(message), TIMEOUT * (multiplicator || 1));
+ return setTimeout(common.mustNotCall(message),
+ TIMEOUT * (multiplicator || 1));
}
const TestSession = function(socket, harness) {
@@ -398,7 +399,7 @@ Harness.prototype.wsHandshake = function(devtoolsUrl, tests, readyCallback) {
});
}
enqueue(tests);
- }).on('response', () => common.fail('Upgrade was not received'));
+ }).on('response', common.mustNotCall('Upgrade was not received'));
};
Harness.prototype.runFrontendSession = function(tests) {
@@ -45,7 +45,7 @@ function checkWrap(req) {
TEST(function test_reverse_bogus(done) {
assert.throws(() => {
- dns.reverse('bogus ip', common.fail);
+ dns.reverse('bogus ip', common.mustNotCall());
}, /^Error: getHostByAddr EINVAL$/);
done();
});
@@ -16,7 +16,7 @@ function httpreq(count) {
port: 80,
path: '/',
method: 'GET'
- }, common.fail);
+ }, common.mustNotCall());
req.on('error', common.mustCall((e) => {
assert.strictEqual(e.code, 'ENOTFOUND');
@@ -26,4 +26,4 @@ socket.on('timeout', common.mustCall(function() {
socket.destroy();
}));
-socket.on('connect', common.fail);
+socket.on('connect', common.mustNotCall());
@@ -8,6 +8,6 @@ const client = net.createConnection(53, '8.8.8.8', function() {
client.unref();
});
-client.on('close', common.fail);
+client.on('close', common.mustNotCall());
-setTimeout(common.fail, TIMEOUT).unref();
+setTimeout(common.mustNotCall(), TIMEOUT).unref();
@@ -37,10 +37,10 @@ if (typeof process.argv[2] === 'string') {
async_wrap.setupHooks({ init, pre, post, destroy });
async_wrap.enable();
- process.on('uncaughtException', common.fail);
+ process.on('uncaughtException', common.mustNotCall());
const d = domain.create();
- d.on('error', common.fail);
+ d.on('error', common.mustNotCall());
d.run(() => {
// Using randomBytes because timers are not yet supported.
crypto.randomBytes(0, () => { });
@@ -5,7 +5,7 @@ const spawn = require('child_process').spawn;
const cat = spawn(common.isWindows ? 'cmd' : 'cat');
cat.stdout.on('end', common.mustCall(function() {}));
-cat.stderr.on('data', common.fail);
+cat.stderr.on('data', common.mustNotCall());
cat.stderr.on('end', common.mustCall(function() {}));
cat.on('exit', common.mustCall(function(code, signal) {
@@ -24,7 +24,7 @@ function master() {
});
proc.stdout.on('data', common.mustCall((data) => {
assert.strictEqual(data.toString(), 'ok\r\n');
- net.createServer(common.fail).listen(0, function() {
+ net.createServer(common.mustNotCall()).listen(0, function() {
handle = this._handle;
proc.send('one');
proc.send('two', handle);
@@ -20,7 +20,7 @@ s.on('exit', function() {
handle.close();
});
-net.createServer(common.fail).listen(0, function() {
+net.createServer(common.mustNotCall()).listen(0, function() {
handle = this._handle;
assert.strictEqual(s.send('one', handle), true);
assert.strictEqual(s.send('two', handle), true);
@@ -7,7 +7,7 @@ const cp = require('child_process');
const doesNotExist = cp.spawn('does-not-exist', {shell: true});
assert.notStrictEqual(doesNotExist.spawnfile, 'does-not-exist');
-doesNotExist.on('error', common.fail);
+doesNotExist.on('error', common.mustNotCall());
doesNotExist.on('exit', common.mustCall((code, signal) => {
assert.strictEqual(signal, null);
@@ -13,7 +13,7 @@ const empty = common.fixturesDir + '/empty.js';
assert.throws(function() {
const child = spawn(invalidcmd, 'this is not an array');
- child.on('error', common.fail);
+ child.on('error', common.mustNotCall());
}, TypeError);
// verify that valid argument combinations do not throw
@@ -24,7 +24,7 @@ cat.stdout.on('data', function(chunk) {
cat.stdout.on('end', common.mustCall(function() {}));
-cat.stderr.on('data', common.fail);
+cat.stderr.on('data', common.mustNotCall());
cat.stderr.on('end', common.mustCall(function() {}));
@@ -12,7 +12,7 @@ const child = spawn(process.argv[0], [sub, n]);
let count = 0;
child.stderr.setEncoding('utf8');
-child.stderr.on('data', common.fail);
+child.stderr.on('data', common.mustNotCall());
child.stdout.setEncoding('utf8');
child.stdout.on('data', (data) => {
@@ -19,8 +19,8 @@ if (cluster.isMaster) {
assert.strictEqual(exitCode, 0);
}));
} else {
- const s = net.createServer(common.fail);
- s.listen(42, common.fail.bind(null, 'listen should have failed'));
+ const s = net.createServer(common.mustNotCall());
+ s.listen(42, common.mustNotCall('listen should have failed'));
s.on('error', common.mustCall((err) => {
assert.strictEqual(err.code, 'EACCES');
process.disconnect();
@@ -60,21 +60,22 @@ if (!id) {
} else if (id === 'one') {
if (cluster.isMaster) return startWorker();
- http.createServer(common.fail).listen(common.PORT, common.mustCall(() => {
- process.send('READY');
- }));
+ http.createServer(common.mustNotCall())
+ .listen(common.PORT, common.mustCall(() => {
+ process.send('READY');
+ }));
process.on('message', common.mustCall((m) => {
if (m === 'QUIT') process.exit();
}));
} else if (id === 'two') {
if (cluster.isMaster) return startWorker();
- const server = http.createServer(common.fail);
+ const server = http.createServer(common.mustNotCall());
process.on('message', common.mustCall((m) => {
if (m === 'QUIT') process.exit();
assert.strictEqual(m, 'START');
- server.listen(common.PORT, common.fail);
+ server.listen(common.PORT, common.mustNotCall());
server.on('error', common.mustCall((e) => {
assert.strictEqual(e.code, 'EADDRINUSE');
process.send(e.code);
@@ -11,7 +11,7 @@ const net = require('net');
const id = '' + process.argv[2];
if (id === 'undefined') {
- const server = net.createServer(common.fail);
+ const server = net.createServer(common.mustNotCall());
server.listen(common.PORT, function() {
const worker = fork(__filename, ['worker']);
worker.on('message', function(msg) {
@@ -22,14 +22,14 @@ if (id === 'undefined') {
});
});
} else if (id === 'worker') {
- let server = net.createServer(common.fail);
- server.listen(common.PORT, common.fail);
+ let server = net.createServer(common.mustNotCall());
+ server.listen(common.PORT, common.mustNotCall());
server.on('error', common.mustCall(function(e) {
assert(e.code, 'EADDRINUSE');
process.send('stop-listening');
process.once('message', function(msg) {
if (msg !== 'stopped-listening') return;
- server = net.createServer(common.fail);
+ server = net.createServer(common.mustNotCall());
server.listen(common.PORT, common.mustCall(function() {
server.close();
}));
@@ -15,5 +15,5 @@ if (cluster.isMaster) {
worker.kill();
}));
} else {
- net.createServer(common.fail).listen(0);
+ net.createServer(common.mustNotCall()).listen(0);
}
@@ -11,5 +11,5 @@ if (cluster.isMaster) {
}));
} else {
// listen() without port should not trigger a libuv assert
- net.createServer(common.fail).listen(process.exit);
+ net.createServer(common.mustNotCall()).listen(process.exit);
}
@@ -9,7 +9,7 @@ if (cluster.isMaster) {
if (msg === 'done') this.kill();
});
} else {
- const server = net.createServer(common.fail);
+ const server = net.createServer(common.mustNotCall());
server.listen(common.PORT, function() {
server.unref();
server.ref();
@@ -3,7 +3,7 @@ const common = require('../common');
const assert = require('assert');
const cluster = require('cluster');
-setTimeout(common.fail.bind(assert, 'setup not emitted'), 1000).unref();
+setTimeout(common.mustNotCall('setup not emitted'), 1000).unref();
cluster.on('setup', common.mustCall(function() {
const clusterArgs = cluster.settings.args;
@@ -8,7 +8,7 @@ if (cluster.isMaster) {
// Master opens and binds the socket and shares it with the worker.
cluster.schedulingPolicy = cluster.SCHED_NONE;
// Hog the TCP port so that when the worker tries to bind, it'll fail.
- const server = net.createServer(common.fail);
+ const server = net.createServer(common.mustNotCall());
server.listen(common.PORT, common.mustCall(() => {
const worker = cluster.fork();
@@ -18,8 +18,8 @@ if (cluster.isMaster) {
}));
}));
} else {
- const s = net.createServer(common.fail);
- s.listen(common.PORT, common.fail.bind(null, 'listen should have failed'));
+ const s = net.createServer(common.mustNotCall());
+ s.listen(common.PORT, common.mustNotCall('listen should have failed'));
s.on('error', common.mustCall((err) => {
assert.strictEqual(err.code, 'EADDRINUSE');
process.disconnect();
@@ -21,8 +21,8 @@ if (cluster.isMaster) {
assert.strictEqual(exitCode, 0);
}));
} else {
- const s = net.createServer(common.fail);
- s.listen(42, common.fail.bind(null, 'listen should have failed'));
+ const s = net.createServer(common.mustNotCall());
+ s.listen(42, common.mustNotCall('listen should have failed'));
s.on('error', common.mustCall(function(err) {
assert.strictEqual(err.code, 'EACCES');
process.disconnect();
@@ -9,7 +9,7 @@ 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.fail;
+process.stdout.write = process.stderr.write = common.mustNotCall();
// make sure that the "Console" function exists
assert.strictEqual('function', typeof Console);
@@ -63,27 +63,30 @@ assert.throws(function() {
// Should not work with Infinity key length
assert.throws(function() {
- crypto.pbkdf2('password', 'salt', 1, Infinity, 'sha256', common.fail);
+ crypto.pbkdf2('password', 'salt', 1, Infinity, 'sha256',
+ common.mustNotCall());
}, /^TypeError: Bad key length$/);
// Should not work with negative Infinity key length
assert.throws(function() {
- crypto.pbkdf2('password', 'salt', 1, -Infinity, 'sha256', common.fail);
+ crypto.pbkdf2('password', 'salt', 1, -Infinity, 'sha256',
+ common.mustNotCall());
}, /^TypeError: Bad key length$/);
// Should not work with NaN key length
assert.throws(function() {
- crypto.pbkdf2('password', 'salt', 1, NaN, 'sha256', common.fail);
+ crypto.pbkdf2('password', 'salt', 1, NaN, 'sha256', common.mustNotCall());
}, /^TypeError: Bad key length$/);
// Should not work with negative key length
assert.throws(function() {
- crypto.pbkdf2('password', 'salt', 1, -1, 'sha256', common.fail);
+ crypto.pbkdf2('password', 'salt', 1, -1, 'sha256', common.mustNotCall());
}, /^TypeError: Bad key length$/);
// Should not work with key length that does not fit into 32 signed bits
assert.throws(function() {
- crypto.pbkdf2('password', 'salt', 1, 4073741824, 'sha256', common.fail);
+ crypto.pbkdf2('password', 'salt', 1, 4073741824, 'sha256',
+ common.mustNotCall());
}, /^TypeError: Bad key length$/);
// Should not get FATAL ERROR with empty password and salt
@@ -41,7 +41,7 @@ server.listen(0, common.mustCall(() => {
}, common.mustCall(() => {
verify();
}))
- .on('error', common.fail)
+ .on('error', common.mustNotCall())
.on('close', common.mustCall(() => {
server.close();
})).resume();
@@ -6,7 +6,7 @@ const dgram = require('dgram');
// IPv4 Test
const socket_ipv4 = dgram.createSocket('udp4');
-socket_ipv4.on('listening', common.fail);
+socket_ipv4.on('listening', common.mustNotCall());
socket_ipv4.on('error', common.mustCall(function(e) {
assert.strictEqual(e.port, undefined);
@@ -21,7 +21,7 @@ socket_ipv4.bind(0, '1.1.1.1');
// IPv6 Test
const socket_ipv6 = dgram.createSocket('udp6');
-socket_ipv6.on('listening', common.fail);
+socket_ipv6.on('listening', common.mustNotCall());
socket_ipv6.on('error', common.mustCall(function(e) {
// EAFNOSUPPORT or EPROTONOSUPPORT means IPv6 is disabled on this system.
@@ -6,4 +6,4 @@ const s = dgram.createSocket('udp4');
s.bind();
s.unref();
-setTimeout(common.fail, 1000).unref();
+setTimeout(common.mustNotCall(), 1000).unref();
@@ -8,7 +8,7 @@ const http = require('http');
const a = domain.create();
a.enter(); // this will be our "root" domain
-a.on('error', common.fail);
+a.on('error', common.mustNotCall());
const server = http.createServer((req, res) => {
// child domain of a.
@@ -20,7 +20,7 @@ function listener2() {}
{
const ee = new EventEmitter();
ee.on('hello', listener1);
- ee.on('removeListener', common.fail);
+ ee.on('removeListener', common.mustNotCall());
ee.removeListener('hello', listener2);
assert.deepStrictEqual([listener1], ee.listeners('hello'));
}
@@ -5,9 +5,9 @@ const spawn = require('child_process').spawn;
// spawn a node child process in "interactive" mode (force the repl)
const cp = spawn(process.execPath, ['-i']);
-const timeoutId = setTimeout(function() {
- common.fail('timeout!');
-}, common.platformTimeout(5000)); // give node + the repl 5 seconds to start
+// give node + the repl 5 seconds to start
+const timeoutId = setTimeout(common.mustNotCall(),
+ common.platformTimeout(5000));
cp.stdout.setEncoding('utf8');
@@ -82,7 +82,7 @@ fs.access(readOnlyFile, fs.W_OK, common.mustCall((err) => {
}));
assert.throws(() => {
- fs.access(100, fs.F_OK, () => { common.fail('callback should not run'); });
+ fs.access(100, fs.F_OK, common.mustNotCall());
}, /^TypeError: path must be a string or Buffer$/);
assert.throws(() => {
Oops, something went wrong.

0 comments on commit f0eba78

Please sign in to comment.