'use strict'; // Verify that exceptions from a callback don't result in // failed CHECKs when trying to print the exception message. // This test is convoluted because it needs to trigger a callback // into JS land at just the right time when an exception is pending, // and does so by exploiting a weakness in the streams infrastructure. // I won't shed any tears if this test ever becomes invalidated. const common = require('../common'); if (!common.hasCrypto) common.skip('missing crypto'); if (process.argv[2] === 'child') { const fixtures = require('../common/fixtures'); const https = require('https'); const net = require('net'); const tls = require('tls'); const { Duplex } = require('stream'); const { mustCall } = common; const cert = fixtures.readSync('test_cert.pem'); const key = fixtures.readSync('test_key.pem'); net.createServer(mustCall(onplaintext)).listen(0, mustCall(onlisten)); function onlisten() { const { port } = this.address(); https.get({ port, rejectUnauthorized: false }); } function onplaintext(c) { const d = new class extends Duplex { _read(n) { const data = c.read(n); if (data) d.push(data); } _write(...xs) { c.write(...xs); } }(); c.on('data', d.push.bind(d)); const options = { key, cert }; const fail = () => { throw new Error('eyecatcher'); }; tls.createServer(options, mustCall(fail)).emit('connection', d); } } else { const assert = require('assert'); const { spawnSync } = require('child_process'); const result = spawnSync(process.execPath, [__filename, 'child']); const stderr = result.stderr.toString(); const ok = stderr.includes('Error: eyecatcher'); assert(ok, stderr); }