diff --git a/test/api/apiTest.js b/test/api/apiTest.js new file mode 100644 index 00000000..f5117c44 --- /dev/null +++ b/test/api/apiTest.js @@ -0,0 +1,16 @@ +/* + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +'use strict'; + diff --git a/test/api/configTest.js b/test/api/configTest.js new file mode 100644 index 00000000..6c08d49b --- /dev/null +++ b/test/api/configTest.js @@ -0,0 +1,71 @@ +/* + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +'use strict'; + +var assert = require('chai').assert; + +var LamassuConfig = require('lamassu-config'); +var con = 'psql://lamassu:lamassu@localhost/lamassu'; +var config = new LamassuConfig(con); + +var jsonquest = require('jsonquest'); +var express = require('express'); +var app = express(); +var testPort = 4000; + +var cfg; + +describe('configurations test', function(){ + + beforeEach(function(done) { + + app.listen(testPort); + config.load(function(err, results) { + assert.isNull(err); + assert.ok(results.ok); + + cfg = results.config; + + done(); + }); + }); + + + it('should get configurations from remote server', function(done) { + this.timeout(1000000); + + var api = require('../../lib/atm-api'); + api.init(app, cfg); + + // make the request + setTimeout(function() { + jsonquest({ + host: 'localhost', + port: testPort, + path: '/config', + method: 'GET', + protocol: 'http' + }, function (err, res, body) { + assert.isNull(err); + assert.equal(res.statusCode, 200); + + assert.isNull(body.err); + assert.ok(body.results); + + done(); + }); + }, 2000); + }); +}); \ No newline at end of file diff --git a/test/api/sendTest.js b/test/api/sendTest.js new file mode 100644 index 00000000..97e44044 --- /dev/null +++ b/test/api/sendTest.js @@ -0,0 +1,125 @@ +/* + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +'use strict'; + +var async = require('async'); +var hock = require('hock'); +var createServer = require('../helpers/create-https-server.js'); +var assert = require('chai').assert; + +var LamassuConfig = require('lamassu-config'); +var con = 'psql://lamassu:lamassu@localhost/lamassu'; +var config = new LamassuConfig(con); + +var fnTable = {}; + +var app = { + get: function(route, fn) { + fnTable[route] = fn; + }, + post: function(route, fn) { + fnTable[route] = fn; + } +}; + +var cfg; +var port; + +var blockchainMock = hock.createHock(); + +// blockchain info +var guid = '3acf1633-db4d-44a9-9013-b13e85405404'; +var pwd = 'baz'; +var bitAddr = '1LhkU2R8nJaU8Zj6jB8VjWrMpvVKGqCZ64'; + + +describe('send test', function() { + + beforeEach(function(done) { + + async.parallel({ + blockchain: async.apply(createServer, blockchainMock.handler), + config: function(cb) { + config.load(cb); + } + }, function(err, results) { + assert.isNull(err); + + cfg = results.config.config; + port = results.blockchain.address().port; + + cfg.exchanges.plugins.current.transfer = 'blockchain'; + cfg.exchanges.plugins.settings.blockchain = { + host: 'localhost', + port: results.blockchain.address().port, + rejectUnauthorized: false, + password: pwd, + fromAddress: bitAddr, + guid: guid + }; + + done(); + }); + }); + + it('should send to blockchain', function(done) { + this.timeout(1000000); + + var amount= 100000000; + + var address_reponse = { + 'hash160':'660d4ef3a743e3e696ad990364e555c271ad504b', + 'address': bitAddr, + 'n_tx': 1, + 'n_unredeemed': 1, + 'total_received': 0, + 'total_sent': 0, + 'final_balance': 0, + 'txs': [] + }; + + var payment_response = { + 'message': 'Sent 0.1 BTC to 1LhkU2R8nJaU8Zj6jB8VjWrMpvVKGqCZ64', + 'tx_hash': 'f322d01ad784e5deeb25464a5781c3b20971c1863679ca506e702e3e33c18e9c', + 'notice': 'Some funds are pending confirmation and cannot be spent yet (Value 0.001 BTC)' + }; + + blockchainMock + .get('/address/1LhkU2R8nJaU8Zj6jB8VjWrMpvVKGqCZ64?format=json&limit=10&password=baz') + .reply(200, address_reponse) + .post('/merchant/3acf1633-db4d-44a9-9013-b13e85405404/payment?to=1LhkU2R8nJaU8Zj6jB8VjWrMpvVKGqCZ64&amount=100000000&from=1LhkU2R8nJaU8Zj6jB8VjWrMpvVKGqCZ64&password=baz') + .reply(200, payment_response); + + + var api = require('../../lib/atm-api'); + api.init(app, cfg); + + var params = { + body: { + address: bitAddr, + satoshis: amount + } + }; + + setTimeout(function() { + fnTable['/send'](params, {json: function(result) { + assert.isNull(result.err); + assert.equal(payment_response.tx_hash, result.results); + done(); + } + }); + }, 2000); + }); +}); \ No newline at end of file diff --git a/test/api/tickerTest.js b/test/api/tickerTest.js new file mode 100644 index 00000000..f4bbf14b --- /dev/null +++ b/test/api/tickerTest.js @@ -0,0 +1,119 @@ +/* + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +'use strict'; + +var hock = require('hock'); +var async = require('async'); +var createServer = require('../helpers/create-https-server.js'); +var assert = require('chai').assert; + +var LamassuConfig = require('lamassu-config'); +var con = 'psql://lamassu:lamassu@localhost/lamassu'; +var config = new LamassuConfig(con); + +var cfg; + +var blockchainMock = hock.createHock(); +var bitpayMock = hock.createHock(); + +var jsonquest = require('jsonquest'); +var express = require('express'); +var app = express(); +var testPort = 4000; + + + +describe('ticker test', function(){ + + beforeEach(function(done) { + + app.listen(testPort); + + async.parallel({ + blockchain: async.apply(createServer, blockchainMock.handler), + bitpay: async.apply(createServer, bitpayMock.handler), + config: config.load.bind(config) + }, function(err, results) { + assert.isNull(err); + + cfg = results.config.config; + + cfg.exchanges.settings.commission = 1; + + cfg.exchanges.plugins.current.ticker = 'bitpay'; + cfg.exchanges.plugins.current.trade = null; + cfg.exchanges.plugins.settings.bitpay = { + host: 'localhost', + port: results.bitpay.address().port, + rejectUnauthorized: false + }; + + cfg.exchanges.plugins.current.transfer = 'blockchain'; + cfg.exchanges.plugins.settings.blockchain = { + host: 'localhost', + port: results.blockchain.address().port, + rejectUnauthorized: false, + password: 'baz', + fromAddress: '1LhkU2R8nJaU8Zj6jB8VjWrMpvVKGqCZ64', + guid: '3acf1633-db4d-44a9-9013-b13e85405404' + }; + + done(); + }); + }); + + + it('should read ticker data from bitpay', function(done) { + this.timeout(1000000); + + bitpayMock + .get('/api/rates') + .reply(200, [ + { code: 'EUR', rate: 1337 }, + { code: 'USD', rate: 100 } + ]); + + blockchainMock + .get('/merchant/3acf1633-db4d-44a9-9013-b13e85405404/address_balance?address=1LhkU2R8nJaU8Zj6jB8VjWrMpvVKGqCZ64&confirmations=0&password=baz') + .reply(200, { balance: 100000000, total_received: 100000000 }) + .get('/merchant/3acf1633-db4d-44a9-9013-b13e85405404/address_balance?address=1LhkU2R8nJaU8Zj6jB8VjWrMpvVKGqCZ64&confirmations=1&password=baz') + .reply(200, { balance: 100000000, total_received: 100000000 }); + // That's 1 BTC. + + var api = require('../../lib/atm-api'); + api.init(app, cfg); + + // let ticker rate fetch finish... + setTimeout(function() { + jsonquest({ + host: 'localhost', + port: testPort, + path: '/poll/USD',//:currency + method: 'GET', + protocol: 'http' + }, function (err, res, body) { + assert.isNull(err); + assert.equal(res.statusCode, 200); + + assert.isNull(body.err); + assert.equal(Number(body.rate) > 0, true); + console.log(100 / cfg.exchanges.settings.lowBalanceMargin, body.fiat); + assert.equal(body.fiat, 100 / cfg.exchanges.settings.lowBalanceMargin); + + done(); + }); + }, 2000); + }); +}); diff --git a/test/api/tradeTest.js b/test/api/tradeTest.js new file mode 100644 index 00000000..387d4d3a --- /dev/null +++ b/test/api/tradeTest.js @@ -0,0 +1,70 @@ +/* + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +'use strict'; + +var assert = require('chai').assert; +var hock = require('hock'); + +var LamassuConfig = require('lamassu-config'); +var con = 'psql://lamassu:lamassu@localhost/lamassu'; +var config = new LamassuConfig(con); + +var fnTable = {}; +var app = { get: function(route, fn) { + fnTable[route] = fn; + }, + post: function(route, fn) { + fnTable[route] = fn; + } + }; +var cfg; + +var bitstampMock = hock.createHock(); + +/** + * the tests + */ +describe('trade test', function(){ + + beforeEach(function(done) { + config.load(function(err, result) { + assert.isNull(err); + cfg = result.config; + done(); + }); + }); + + + + it('should execute a trade against bitstamp', function(done) { + this.timeout(1000000); + + cfg.exchanges.plugins.trade = 'bitstamp'; + var api = require('../../lib/atm-api'); + api.init(app, cfg); + + // schedule two trades this should result in a single consolidated trade hitting the trading system + fnTable['/trade']({body: {fiat: 100, satoshis: 10, currency: 'USD'}}, {json: function(result) { + console.log(result); + }}); + + fnTable['/trade']({body: {fiat: 100, satoshis: 10, currency: 'USD'}}, {json: function(result) { + console.log(result); + }}); + + setTimeout(function() { done(); }, 1000000); + // check results and execute done() + }); +}); diff --git a/test/fiatBalanceTest.js b/test/fiatBalanceTest.js new file mode 100644 index 00000000..6f436d40 --- /dev/null +++ b/test/fiatBalanceTest.js @@ -0,0 +1,57 @@ +'use strict'; + +var assert = require('chai').assert; + +var LamassuConfig = require('lamassu-config'); +var con = 'psql://lamassu:lamassu@localhost/lamassu'; +var config = new LamassuConfig(con); + +var api = require('../lib/protocol/api/api.js'); +var RATE = 100; +var SATOSHI_FACTOR = Math.pow(10, 8); +var cfg; + +describe('fiatBalance test', function() { + before(function(done) { + config.load(function(err, result) { + assert.isNull(err); + cfg = result.exchanges; + api.init(cfg); + done(); + }); + }); + + after(function(done) { + config.end(); + done(); + }); + + it('should calculate balance correctly with transfer exchange only', function() { + // We have 2 bitcoins, want to trade 1 bitcoin for 100 fiat + var balance = api.fiatBalance(RATE / cfg.settings.commission, { + transferBalance: 2 * SATOSHI_FACTOR, + tradeBalance: null + }, 1 * SATOSHI_FACTOR, 100); + assert.equal(balance, 100 / cfg.settings.lowBalanceMargin); + }); + + it('should calculate balance correctly with both exchanges (trade > transfer)', function() { + // We have 2 bitcoins for transfer, 2000 fiat for trade, want to trade 1 + // bitcoin for 100 fiat + var balance = api.fiatBalance(RATE / cfg.settings.commission, { + transferBalance: 2 * SATOSHI_FACTOR, + tradeBalance: 2000 + }, 1 * SATOSHI_FACTOR, 100); + assert.equal(balance, 100 / cfg.settings.lowBalanceMargin); + }); + + it('should calculate balance correctly with both exchanges (transfer > trade)', function() { + // We have 2 bitcoins for transfer, 150 fiat for trade, want to trade 1 + // bitcoin for 100 fiat + var balance = api.fiatBalance(RATE / cfg.settings.commission, { + transferBalance: 2 * SATOSHI_FACTOR, + tradeBalance: 150 + }, 1 * SATOSHI_FACTOR, 100); + assert.equal(balance, 50 / cfg.settings.lowBalanceMargin); + }); +}); diff --git a/test/fixtures/certificate.pem b/test/fixtures/certificate.pem new file mode 100644 index 00000000..542541e1 --- /dev/null +++ b/test/fixtures/certificate.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICozCCAgwCCQCSX2bhri8GETANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMC +SUUxEjAQBgNVBAgTCVdhdGVyZm9yZDESMBAGA1UEBxMJV2F0ZXJmb3JkMREwDwYD +VQQKEwhuZWFyRm9ybTEMMAoGA1UECxMDZGV2MRQwEgYDVQQDEwtQZXRlciBFbGdl +cjEnMCUGCSqGSIb3DQEJARYYcGV0ZXIuZWxnZXJAbmVhcmZvcm0uY29tMB4XDTE0 +MDEyMDExMjc1NloXDTE0MDIxOTExMjc1NlowgZUxCzAJBgNVBAYTAklFMRIwEAYD +VQQIEwlXYXRlcmZvcmQxEjAQBgNVBAcTCVdhdGVyZm9yZDERMA8GA1UEChMIbmVh +ckZvcm0xDDAKBgNVBAsTA2RldjEUMBIGA1UEAxMLUGV0ZXIgRWxnZXIxJzAlBgkq +hkiG9w0BCQEWGHBldGVyLmVsZ2VyQG5lYXJmb3JtLmNvbTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAtZBpc6ZpF3rVSOq0D2zD2PMgR4hBzka0tD7coEDRWgjH +CFCtwtB97yuV3zq6V0zcApogXIIM6NQm6vcSAna9hqEiQCJV18GEAylC7Z/AW7HP +L63kYTMAXhdoztLFrkczUbtHwCB6wyUehszSzWaozpS9+ESpf/bPxMJjfhuqOvcC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQCF3oZsXXC4QIm5Say8AVPYlhyb0liUSmr8 +owvESnPFy2PYFHMwzLCE4wnVsXcRq4gK0rXiiuBQsNEw/v93RfLWV4DLAlf9DoB2 +sO3LA/LSj4ptjZ4Dki5NKfTK9b6QJoQkc/u68hEEOe/WYZPIxdaeki4aVCcnrv1v +zJ9YTluP7w== +-----END CERTIFICATE----- diff --git a/test/fixtures/certrequest.csr b/test/fixtures/certrequest.csr new file mode 100644 index 00000000..9b36b045 --- /dev/null +++ b/test/fixtures/certrequest.csr @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICBDCCAW0CAQAwgZUxCzAJBgNVBAYTAklFMRIwEAYDVQQIEwlXYXRlcmZvcmQx +EjAQBgNVBAcTCVdhdGVyZm9yZDERMA8GA1UEChMIbmVhckZvcm0xDDAKBgNVBAsT +A2RldjEUMBIGA1UEAxMLUGV0ZXIgRWxnZXIxJzAlBgkqhkiG9w0BCQEWGHBldGVy +LmVsZ2VyQG5lYXJmb3JtLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +tZBpc6ZpF3rVSOq0D2zD2PMgR4hBzka0tD7coEDRWgjHCFCtwtB97yuV3zq6V0zc +ApogXIIM6NQm6vcSAna9hqEiQCJV18GEAylC7Z/AW7HPL63kYTMAXhdoztLFrkcz +UbtHwCB6wyUehszSzWaozpS9+ESpf/bPxMJjfhuqOvcCAwEAAaAuMBMGCSqGSIb3 +DQEJBzEGEwRhc2RmMBcGCSqGSIb3DQEJAjEKEwhuZWFyRm9ybTANBgkqhkiG9w0B +AQUFAAOBgQC0+vxHKcdpeiUYYXJjUVHUC9xSR19l+8F7FNtehXyGNoxmpMwmEVkM +J1TUokG/HgBoh9vy8TxleHldDdA+9jjWfaPHk8LaRIkNguJ9IMvv3yctjcCD39lJ +Yb1mQWOYaDOsgsEqiN/U2K6yUneYGGKIndA/PrEmd1aBMOTQ7R9Tvg== +-----END CERTIFICATE REQUEST----- diff --git a/test/fixtures/privatekey.pem b/test/fixtures/privatekey.pem new file mode 100644 index 00000000..a3e93ede --- /dev/null +++ b/test/fixtures/privatekey.pem @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQC1kGlzpmkXetVI6rQPbMPY8yBHiEHORrS0PtygQNFaCMcIUK3C +0H3vK5XfOrpXTNwCmiBcggzo1Cbq9xICdr2GoSJAIlXXwYQDKULtn8Bbsc8vreRh +MwBeF2jO0sWuRzNRu0fAIHrDJR6GzNLNZqjOlL34RKl/9s/EwmN+G6o69wIDAQAB +AoGAS35aen3tIJgwavs8F1XQMTsWZuffBNgddvzUW8XXxqnzqB9zwJdUZcgnrwQK +SxZoPKS9Y/mnSIA+FmDZGjEpKEeLrFePYz9UHpSW3j3vmLwWNTyAFl/DjqyrCIpE ++qB309t9NYEdd7LTeJyfIfideyEDAZUaQ2VsVDQDypYeoUECQQDrNstTpkv24MLA +4rFiXSSiC5IT86QuXbmXeHNTdChhqFS8C5LVKqt4Prpq4QvwQksiHJkipp5zvy2V +zfvfVTNnAkEAxZvnnYR5XyIPMVRQtlV0iskbvnQovJ4l3B7UfHeP9DZ9uhAR4MUo +ttJGjDjUMo78w381KEAqePpKn+RhF70R8QJADqwEUtt0sZmjjFSXrAMTXehK3GO+ +QgYmpYQl7Xa5bh4J6xDtv85Bk+aVykTvcbUw6pfOFZM/Hwk11rpak7vE0QJAEFGD +mvppm3WQk55G3AfKi/t3kw68nnbg4YCaQ30MIjqtv0O8djdR2Wcb9FBtFY/BR9Ol +bCGAYGUq7HFLo041wQJBAL2x2OvwnYYtXXOBY27tox3B1hDye7jRI5Q/IvcRB7YE +00q8L0XVaV4lmyd7tfFDQq/bfDUgTuwvkSPnQcpJDDw= +-----END RSA PRIVATE KEY----- diff --git a/test/helpers/create-https-server.js b/test/helpers/create-https-server.js new file mode 100644 index 00000000..a7c9cf9f --- /dev/null +++ b/test/helpers/create-https-server.js @@ -0,0 +1,14 @@ +var fs = require('fs'); +var path = require('path'); +var https = require('https'); +var fixtures = path.join(__dirname, '..', 'fixtures'); + +module.exports = function(handler, callback) { + var server = https.createServer({ + key: fs.readFileSync(path.join(fixtures, 'privatekey.pem')), + cert: fs.readFileSync(path.join(fixtures, 'certificate.pem')) + }, handler); + server.listen(0, function() { + callback(null, server); + }); +};