From 41b304c5a5d47aec30a0b9994ab2f58174564e44 Mon Sep 17 00:00:00 2001 From: Chris Kleeschulte Date: Fri, 10 Nov 2017 16:54:54 -0500 Subject: [PATCH] Completed websocket tests. --- regtest/subscriptions.js | 139 ++++++++++++++++++++++++++++++++++----- 1 file changed, 122 insertions(+), 17 deletions(-) diff --git a/regtest/subscriptions.js b/regtest/subscriptions.js index 3c8e86a..b737f6f 100644 --- a/regtest/subscriptions.js +++ b/regtest/subscriptions.js @@ -46,6 +46,8 @@ var blocks= []; var pks = []; var initialTx; var startingPk; +var txs = []; +var txids = []; var bitcoin = { args: { @@ -365,13 +367,40 @@ var getFirstIncomingFunds = function(callback) { satoshis: unspent.amount * 1e8, address: unspent.address }; + initialTx.from(utxo).to(pks[0].toAddress(), 20*1e8).change(startingPk.toAddress()).fee(50000).sign(startingPk); - rpc.sendRawTransaction(initialTx.serialize(), callback); + + var body = '{"rawtx":"' + initialTx.serialize() + '"}'; + + var httpOpts = { + hostname: 'localhost', + port: 53001, + path: 'http://localhost:53001/api/tx/send', + method: 'POST', + body: body, + headers: { + 'Content-Type': 'application/json', + 'Content-Length': body.length + }, + }; + + request(httpOpts, function(err, data) { + + if (err) { + return callback(err); + } + + console.log('Sent initial tx: ', initialTx.hash); + txids.push(data.txid); + callback(); + + }); }); }); }; var sendTx = function(callback) { + var index; for(var i = 0; i < initialTx.outputs.length; i++) { if (initialTx.outputs[i].script.toAddress().toString() === pks[0].toAddress().toString()) { @@ -379,6 +408,7 @@ var sendTx = function(callback) { break; } } + var utxo = { address: pks[0].toAddress().toString(), script: initialTx.outputs[index].script.toHex(), @@ -415,8 +445,8 @@ var sendTx = function(callback) { callback(); }); - }; + describe('Subscriptions', function() { this.timeout(60000); @@ -445,14 +475,8 @@ describe('Subscriptions', function() { if (err) { return next(err); } - blocksGenerated += 10; - rpc.generate(10, function(err, res) { - if (err) { - return next(err); - } - blocks = res.result; - next(); - }); + blocksGenerated += 101; + rpc.generate(101, next); }); }); }, @@ -463,6 +487,7 @@ describe('Subscriptions', function() { function(next) { console.log('step 3: make local private keys.'); makeLocalPrivateKeys(); + next(); }, function(next) { console.log('step 4: setup initial tx.'); @@ -478,21 +503,101 @@ describe('Subscriptions', function() { }); }); - it('should get transaction after websocket reception of transaction', function(done) { + it('should be able to be able to GET a transaction after receiving a websocket notification that a tx has arrived in the mempool.', function(done) { + var socket = io('ws://localhost:53001', { transports: [ 'websocket' ] }); + socket.emit('subscribe', 'mempool/transaction'); + // send a transaction - socket.on('message', function(msg) { - console.log(msg); - done(); + socket.on('mempool/transaction', function(msg) { + + console.log('got mempool tx event from webscoket.'); + + var httpOpts = { + hostname: 'localhost', + port: 53001, + path: '/api/tx/' + txs[0].hash, + method: 'GET', + headers: { + 'Content-Type': 'application/json' + } + }; + + expect(msg.hash).to.equal(txs[0].hash); + + request(httpOpts, function(err, data) { + + if (err) { + return done(err); + } + + expect(data.txid).to.equal(msg.hash); + done(); + + }); + }); - sendTx(); + + socket.on('connect', function() { + sendTx(function(err) { + console.log(txs[0].hash + ' sent.'); + }); + }); + }); - it('should get block after websocket reception of block', function(done) { - done(); + it('should be able to GET a block after receiving a websocket notification that a tx has arrived in the mempool.', function(done) { + + var blockHash; + + var socket = io('ws://localhost:53001', { + transports: [ 'websocket' ] + }); + + socket.emit('subscribe', 'block/block'); + + // send a transaction + socket.on('block/block', function(msg) { + + console.log('got block event from webscoket.'); + + var httpOpts = { + hostname: 'localhost', + port: 53001, + path: '/api/block/' + msg.hash, + method: 'GET', + headers: { + 'Content-Type': 'application/json' + } + }; + + expect(msg.hash).to.equal(blockHash); + + request(httpOpts, function(err, data) { + + if (err) { + return done(err); + } + + expect(data.hash).to.equal(msg.hash); + done(); + + }); + + }); + + socket.on('connect', function() { + rpc.generate(1, function(err, res) { + if (err) { + return done(err); + } + blockHash = res.result[0]; + }); + }); + }); });