Skip to content

Commit a8be3ed

Browse files
committed
test: initial refactor of the tests to use "proxy" module
1 parent 85e07a2 commit a8be3ed

4 files changed

Lines changed: 179 additions & 41 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"debug": "~0.7.2"
2727
},
2828
"devDependencies": {
29-
"mocha": "~1.12.0"
29+
"mocha": "~1.12.0",
30+
"proxy": "~0.2.0"
3031
}
3132
}

test/server.crt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICATCCAWoCCQCSMIVZI8DGgTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB
3+
VTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0
4+
cyBQdHkgTHRkMB4XDTEzMDkwOTIyNTI1MVoXDTE0MDkwOTIyNTI1MVowRTELMAkG
5+
A1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0
6+
IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwQO2
7+
jlSxR12EvpF1hROxQAyQzDsxVv7AjDGhSVhizn7anxo5mCE9+5jHRJ6hgxF/3RJO
8+
q157J49W7hlgiJfN3X4Q3WCqkTnfj1wFr8aSjWUl6TWeLMrhKZgzGCmZH0GV4Kpu
9+
4jQ4lyjl/dIBw8HiJmKvaEagdUb5UJCKBDrDtvECAwEAATANBgkqhkiG9w0BAQUF
10+
AAOBgQB33WAM5Yr2jkaeRog6rEglMC8i+Jab12amnFFJEMoWnH6csXVGSXxCtlX8
11+
FWnCoNb/D71dnEusS4JxbYluRg2Xrdfb/pmHje9pE2TTprZRBFAIoh4CmDh129Ka
12+
HJwYPZi59XRnac8ghiF2l4d2yOQPznrJDekj6pfLVdIcVowSvg==
13+
-----END CERTIFICATE-----

test/server.key

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIICXgIBAAKBgQDBA7aOVLFHXYS+kXWFE7FADJDMOzFW/sCMMaFJWGLOftqfGjmY
3+
IT37mMdEnqGDEX/dEk6rXnsnj1buGWCIl83dfhDdYKqROd+PXAWvxpKNZSXpNZ4s
4+
yuEpmDMYKZkfQZXgqm7iNDiXKOX90gHDweImYq9oRqB1RvlQkIoEOsO28QIDAQAB
5+
AoGBAJGXlm34bp0Rat9A46/VMd/JWrPjdo1TrrRRf4LO3AE9aPWYl5cshA+zp6QY
6+
MGaonZWJiLP1mdo2YnFJzSpbr9mzEBEIjCsKdzeKbmnaEpCZY5YUj/ypVWYVJqXx
7+
jZ6/9VEIxCrB9WmXi9fs97IZtZJcHI4M+0FXakjF9AmxtVvRAkEA5MNakvgLPn5s
8+
GH5yuu0P0vSQ6d7EEgcM/89pjEpfKCvsYBh92VvmKspjBV71OuQ3Eh7/0GB/5UGC
9+
gaJwID7ibQJBANf+wBky99/+ffzwrUGavIbLO4NOwnbQsz7v49PwJHoGIhlfoLW7
10+
21JwDwWUteFyYOwzHxRdKedolT5Ul+PxNBUCQCXYU7Ggq2uJSqS6toxKD6Yco6St
11+
H87Dr9jaHWICI7/nlFFJe/hrhaZqmPsYfIVjn+C1lCiK7l2k+swrbVVIUfkCQQCA
12+
8MgWgvGsWw00+SxElK3kveAaI+M88JuAf85+z8XGvnCOuyKCOtHT5adiCoOFQTWQ
13+
63erPW5tgWZOnktKPMx9AkEAru3G68AjJN6e14aHkK9KFD0DV1RjrIe7E5iQq5Tn
14+
QXyiyiu624him6pov6UIGs5429z+gl3JjRM3A2rl//j//w==
15+
-----END RSA PRIVATE KEY-----

test/test.js

Lines changed: 149 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,65 +3,174 @@
33
* Module dependencies.
44
*/
55

6+
var fs = require('fs');
67
var url = require('url');
8+
var http = require('http');
79
var https = require('https');
810
var assert = require('assert');
11+
var Proxy = require('proxy');
912
var HttpsProxyAgent = require('../');
1013

1114
describe('HttpsProxyAgent', function () {
1215

13-
this.slow(5000);
14-
this.timeout(10000);
16+
var server;
17+
var serverPort;
1518

16-
var link = process.env.LINK || 'https://graph.facebook.com/tootallnate';
19+
var sslServer;
20+
var sslServerPort;
1721

18-
it('should throw an Error if no "proxy" is given', function () {
19-
assert.throws(function () {
20-
new HttpsProxyAgent();
22+
var proxy;
23+
var proxyPort;
24+
25+
var sslProxy;
26+
var sslProxyPort;
27+
28+
before(function (done) {
29+
// setup target HTTP server
30+
server = http.createServer();
31+
server.listen(function () {
32+
serverPort = server.address().port;
33+
done();
2134
});
2235
});
2336

24-
it('should work over an HTTP proxy', function (done) {
25-
var proxy = process.env.HTTP_PROXY || process.env.http_proxy || 'http://10.1.10.200:3128';
26-
var agent = new HttpsProxyAgent(proxy);
37+
before(function (done) {
38+
// setup HTTP proxy server
39+
proxy = Proxy();
40+
proxy.listen(function () {
41+
proxyPort = proxy.address().port;
42+
done();
43+
});
44+
});
2745

28-
var opts = url.parse(link);
29-
opts.agent = agent;
46+
before(function (done) {
47+
// setup target HTTPS server
48+
var options = {
49+
key: fs.readFileSync(__dirname + '/server.key'),
50+
cert: fs.readFileSync(__dirname + '/server.crt')
51+
};
52+
sslServer = https.createServer(options);
53+
sslServer.listen(function () {
54+
sslServerPort = sslServer.address().port;
55+
done();
56+
});
57+
});
3058

31-
https.get(opts, function (res) {
32-
var data = '';
33-
res.setEncoding('utf8');
34-
res.on('data', function (b) {
35-
data += b;
36-
});
37-
res.on('end', function () {
38-
data = JSON.parse(data);
39-
assert.equal('tootallnate', data.username);
40-
done();
59+
before(function (done) {
60+
// setup SSL HTTP proxy server
61+
var options = {
62+
key: fs.readFileSync(__dirname + '/server.key'),
63+
cert: fs.readFileSync(__dirname + '/server.crt')
64+
};
65+
sslProxy = Proxy(https.createServer(options));
66+
sslProxy.listen(function () {
67+
sslProxyPort = sslProxy.address().port;
68+
done();
69+
});
70+
});
71+
72+
// shut down test HTTP server
73+
after(function (done) {
74+
server.once('close', function () { done(); });
75+
server.close();
76+
});
77+
78+
after(function (done) {
79+
proxy.once('close', function () { done(); });
80+
proxy.close();
81+
});
82+
83+
after(function (done) {
84+
sslServer.once('close', function () { done(); });
85+
sslServer.close();
86+
});
87+
88+
after(function (done) {
89+
sslProxy.once('close', function () { done(); });
90+
sslProxy.close();
91+
});
92+
93+
describe('constructor', function () {
94+
it('should throw an Error if no "proxy" argument is given', function () {
95+
assert.throws(function () {
96+
new HttpsProxyAgent();
4197
});
4298
});
99+
it('should accept a "string" proxy argument', function () {
100+
var agent = new HttpsProxyAgent('http://127.0.0.1:' + proxyPort);
101+
assert.equal('127.0.0.1', agent.proxy.host);
102+
assert.equal(proxyPort, agent.proxy.port);
103+
});
104+
it('should accept a `url.parse()` result object argument', function () {
105+
var opts = url.parse('http://127.0.0.1:' + proxyPort);
106+
var agent = new HttpsProxyAgent(opts);
107+
assert.equal('127.0.0.1', agent.proxy.host);
108+
assert.equal(proxyPort, agent.proxy.port);
109+
});
43110
});
44111

45-
it('should work over an HTTPS proxy', function (done) {
46-
var proxy = process.env.HTTPS_PROXY || process.env.https_proxy || 'https://10.1.10.200:3130';
47-
proxy = url.parse(proxy);
48-
proxy.rejectUnauthorized = false;
49-
var agent = new HttpsProxyAgent(proxy);
50-
51-
var opts = url.parse(link);
52-
opts.agent = agent;
53-
opts.rejectUnauthorized = false;
54-
55-
https.get(opts, function (res) {
56-
var data = '';
57-
res.setEncoding('utf8');
58-
res.on('data', function (b) {
59-
data += b;
112+
describe('"https" module', function () {
113+
it('should work over an HTTP proxy', function (done) {
114+
// set HTTP "request" event handler for this test
115+
sslServer.once('request', function (req, res) {
116+
res.end(JSON.stringify(req.headers));
117+
});
118+
119+
var proxy = process.env.HTTP_PROXY || process.env.http_proxy || 'http://127.0.0.1:' + proxyPort;
120+
proxy = url.parse(proxy);
121+
// `rejectUnauthorized` shoudn't *technically* be necessary here,
122+
// but up until node v0.11.6, the `http.Agent` class didn't have
123+
// access to the *entire* request "options" object. Thus,
124+
// `https-proxy-agent` will *also* merge in options you pass here
125+
// to the destination endpoints…
126+
proxy.rejectUnauthorized = false;
127+
var agent = new HttpsProxyAgent(proxy);
128+
129+
var opts = url.parse('https://127.0.0.1:' + sslServerPort);
130+
opts.rejectUnauthorized = false;
131+
opts.agent = agent;
132+
133+
https.get(opts, function (res) {
134+
var data = '';
135+
res.setEncoding('utf8');
136+
res.on('data', function (b) {
137+
data += b;
138+
});
139+
res.on('end', function () {
140+
data = JSON.parse(data);
141+
assert.equal('127.0.0.1:' + sslServerPort, data.host);
142+
done();
143+
});
144+
});
145+
});
146+
it('should work over an HTTPS proxy', function (done) {
147+
// set HTTP "request" event handler for this test
148+
sslServer.once('request', function (req, res) {
149+
res.end(JSON.stringify(req.headers));
60150
});
61-
res.on('end', function () {
62-
data = JSON.parse(data);
63-
assert.equal('tootallnate', data.username);
64-
done();
151+
152+
var proxy = process.env.HTTPS_PROXY || process.env.https_proxy || 'https://127.0.0.1:' + sslProxyPort;
153+
proxy = url.parse(proxy);
154+
// `rejectUnauthorized` is actually necessary this time since the HTTPS
155+
// proxy server itself is using a self-signed SSL certificate…
156+
proxy.rejectUnauthorized = false;
157+
var agent = new HttpsProxyAgent(proxy);
158+
159+
var opts = url.parse('https://127.0.0.1:' + sslServerPort);
160+
opts.agent = agent;
161+
opts.rejectUnauthorized = false;
162+
163+
https.get(opts, function (res) {
164+
var data = '';
165+
res.setEncoding('utf8');
166+
res.on('data', function (b) {
167+
data += b;
168+
});
169+
res.on('end', function () {
170+
data = JSON.parse(data);
171+
assert.equal('127.0.0.1:' + sslServerPort, data.host);
172+
done();
173+
});
65174
});
66175
});
67176
});

0 commit comments

Comments
 (0)