• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3// Verify that exceptions from a callback don't result in
4// failed CHECKs when trying to print the exception message.
5
6// This test is convoluted because it needs to trigger a callback
7// into JS land at just the right time when an exception is pending,
8// and does so by exploiting a weakness in the streams infrastructure.
9// I won't shed any tears if this test ever becomes invalidated.
10
11const common = require('../common');
12
13if (!common.hasCrypto)
14  common.skip('missing crypto');
15
16if (process.argv[2] === 'child') {
17  const fixtures = require('../common/fixtures');
18  const https = require('https');
19  const net = require('net');
20  const tls = require('tls');
21  const { Duplex } = require('stream');
22  const { mustCall } = common;
23
24  const cert = fixtures.readKey('rsa_cert.crt');
25  const key = fixtures.readKey('rsa_private.pem');
26
27  net.createServer(mustCall(onplaintext)).listen(0, mustCall(onlisten));
28
29  function onlisten() {
30    const { port } = this.address();
31    https.get({ port, rejectUnauthorized: false });
32  }
33
34  function onplaintext(c) {
35    const d = new class extends Duplex {
36      _read(n) {
37        const data = c.read(n);
38        if (data) d.push(data);
39      }
40      _write(...xs) {
41        c.write(...xs);
42      }
43    }();
44    c.on('data', d.push.bind(d));
45
46    const options = { key, cert };
47    const fail = () => { throw new Error('eyecatcher'); };
48    tls.createServer(options, mustCall(fail)).emit('connection', d);
49  }
50} else {
51  const assert = require('assert');
52  const { spawnSync } = require('child_process');
53  const result = spawnSync(process.execPath, [__filename, 'child']);
54  const stderr = result.stderr.toString();
55  const ok = stderr.includes('Error: eyecatcher');
56  assert(ok, stderr);
57}
58