text: 'use strict';
  const common = require('../common');
  if (!common.hasCrypto)
    common.skip('missing crypto');
  
  const assert = require('assert');
  const tls = require('tls');
  const stream = require('stream');
  const fs = require('fs');
  const net = require('net');
  
  const connected = {
    client: 0,
    server: 0
  };
  
  const server = tls.createServer({
    key: fs.readFileSync(`${common.fixturesDir}/keys/agent1-key.pem`),
    cert: fs.readFileSync(`${common.fixturesDir}/keys/agent1-cert.pem`)
  }, function(c) {
    console.log('new client');
    connected.server++;
    c.end('ohai');
  }).listen(0, function() {
    const raw = net.connect(this.address().port);
  
    let pending = false;
    raw.on('readable', function() {
      if (pending)
        p._read();
    });
  
    const p = new stream.Duplex({
      read: function read() {
        pending = false;
  
        const chunk = raw.read();
        if (chunk) {
          console.log('read', chunk);
          this.push(chunk);
        } else {
          pending = true;
        }
      },
      write: function write(data, enc, cb) {
        console.log('write', data, enc);
        raw.write(data, enc, cb);
      }
    });
  
    const socket = tls.connect({
      socket: p,
      rejectUnauthorized: false
    }, function() {
      console.log('client secure');
  
      connected.client++;
  
      socket.end('hello');
      socket.resume();
      socket.destroy();
    });
  
    socket.once('close', function() {
      console.log('client close');
      server.close();
    });
  });
  
  process.once('exit', function() {
    assert.strictEqual(connected.client, 1);
    assert.strictEqual(connected.server, 1);
  });
  