aboutsummaryrefslogtreecommitdiff
path: root/test/fixtures/tls-connect.js
diff options
context:
space:
mode:
authorSam Roberts <vieuxtech@gmail.com>2016-12-17 07:05:45 -0800
committerSam Roberts <vieuxtech@gmail.com>2017-01-12 11:10:03 -0800
commit99b0c2e7a7b299e127234334e5bd23cf600902d9 (patch)
treef4592d14f175b83c7a30e44ccf6cf40dfd215a9a /test/fixtures/tls-connect.js
parent7f20c8a3d4eacfe5a5661628b2ab08ce631fdaf0 (diff)
downloadandroid-node-v8-99b0c2e7a7b299e127234334e5bd23cf600902d9.tar.gz
android-node-v8-99b0c2e7a7b299e127234334e5bd23cf600902d9.tar.bz2
android-node-v8-99b0c2e7a7b299e127234334e5bd23cf600902d9.zip
test: move common tls connect setup into fixtures
TLS connection setup boilerplate is common to many TLS tests, factor it into a test fixture so tests are clearer to read and faster to write. PR-URL: https://github.com/nodejs/node/pull/10389 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Diffstat (limited to 'test/fixtures/tls-connect.js')
-rw-r--r--test/fixtures/tls-connect.js101
1 files changed, 101 insertions, 0 deletions
diff --git a/test/fixtures/tls-connect.js b/test/fixtures/tls-connect.js
new file mode 100644
index 0000000000..72f83736bf
--- /dev/null
+++ b/test/fixtures/tls-connect.js
@@ -0,0 +1,101 @@
+// One shot call to connect a TLS client and server based on options to
+// tls.createServer() and tls.connect(), so assertions can be made on both ends
+// of the connection.
+'use strict';
+
+const common = require('../common');
+const fs = require('fs');
+const join = require('path').join;
+const tls = require('tls');
+const util = require('util');
+
+module.exports = exports = checkCrypto;
+
+function checkCrypto() {
+ if (!common.hasCrypto) {
+ common.skip('missing crypto');
+ process.exit(0);
+ }
+ return exports;
+}
+
+exports.assert = require('assert');
+exports.debug = util.debuglog('test');
+exports.tls = tls;
+
+// Pre-load keys from common fixtures for ease of use by tests.
+const keys = exports.keys = {
+ agent1: load('agent1', 'ca1'),
+ agent2: load('agent2', 'agent2'),
+ agent3: load('agent3', 'ca2'),
+ agent4: load('agent4', 'ca2'),
+ agent5: load('agent5', 'ca2'),
+ agent6: load('agent6', 'ca1'),
+ agent7: load('agent7', 'fake-cnnic-root'),
+ ec: load('ec', 'ec'),
+};
+
+function load(cert, issuer) {
+ issuer = issuer || cert; // Assume self-signed if no issuer
+ const id = {
+ key: read(cert + '-key.pem'),
+ cert: read(cert + '-cert.pem'),
+ ca: read(issuer + '-cert.pem'),
+ };
+ return id;
+}
+
+function read(file) {
+ return fs.readFileSync(join(common.fixturesDir, 'keys', file), 'binary');
+}
+
+exports.connect = function connect(options, callback) {
+ callback = common.mustCall(callback);
+
+ const server = {};
+ const client = {};
+ const pair = {
+ server: server,
+ client: client,
+ };
+
+ tls.createServer(options.server, function(conn) {
+ server.conn = conn;
+ conn.pipe(conn);
+ maybeCallback()
+ }).listen(0, function() {
+ server.server = this;
+
+ const optClient = util._extend({
+ port: this.address().port,
+ }, options.client);
+
+ tls.connect(optClient)
+ .on('secureConnect', function() {
+ client.conn = this;
+ maybeCallback();
+ })
+ .on('error', function(err) {
+ client.err = err;
+ client.conn = this;
+ maybeCallback();
+ });
+ });
+
+ function maybeCallback() {
+ if (!callback)
+ return;
+ if (server.conn && (client.conn || client.err)) {
+ const err = pair.client.err || pair.server.err;
+ callback(err, pair, cleanup);
+ callback = null;
+
+ function cleanup() {
+ if (server.server)
+ server.server.close();
+ if (client.conn)
+ client.conn.end();
+ }
+ }
+ }
+}