updated bitconid integration test to use exposed message constructors

This commit is contained in:
Braydon Fuller 2015-03-13 12:06:07 -04:00
parent 641443f6dd
commit 4ecb34e123
24 changed files with 159 additions and 25 deletions

View File

@ -94,7 +94,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
}); });
cb(); cb();
}); });
var message = messages.build('getaddr'); var message = messages.GetAddr();
peer.sendMessage(message); peer.sendMessage(message);
}); });
}); });
@ -108,9 +108,9 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
should.exist(message.transaction); should.exist(message.transaction);
cb(); cb();
}); });
peer.once('inv', function(m) { peer.once('inv', function(message) {
var message = messages.build('getdata', {inventory: m.inventory}); var get = messages.GetData(message.inventory);
peer.sendMessage(message); peer.sendMessage(get);
}); });
}); });
}); });
@ -125,7 +125,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
message.inventory.should.deep.equal(inv); message.inventory.should.deep.equal(inv);
cb(); cb();
}); });
var message = messages.build('inv', {inventory: inv}); var message = messages.Inventory(inv);
message.inventory[0].hash.length.should.equal(32); message.inventory[0].hash.length.should.equal(32);
peer.sendMessage(message); peer.sendMessage(message);
}); });
@ -136,23 +136,22 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
(message.block instanceof Block).should.equal(true); (message.block instanceof Block).should.equal(true);
cb(); cb();
}); });
var inventory = Inventory.forBlock(blockHash[network.name]); var message = messages.GetData.forBlock(blockHash[network.name]);
var message = messages.build('getdata', {inventory: [inventory]});
peer.sendMessage(message); peer.sendMessage(message);
}); });
}); });
var fakeHash = 'e2dfb8afe1575bfacae1a0b4afc49af7ddda69285857267bae0e22be15f74a3a'; var fakeHash = 'e2dfb8afe1575bfacae1a0b4afc49af7ddda69285857267bae0e22be15f74a3a';
it('handles request tx data not found', function(cb) { it('handles request tx data not found', function(cb) {
connect(function(peer) { connect(function(peer) {
var inventory = Inventory.forTransaction(fakeHash); var expected = messages.NotFound.forTransaction(fakeHash);
var expected = messages.build('notfound', {inventory: [inventory]});
peer.once('notfound', function(message) { peer.once('notfound', function(message) {
message.command.should.equal('notfound'); (message instanceof messages.NotFound).should.equal(true);
message.inventory[0].type.should.equal(Inventory.TYPE.TX); message.inventory[0].type.should.equal(Inventory.TYPE.TX);
message.inventory[0].hash.toString('hex').should.equal(inventory.hash.toString('hex')); var expectedHash = expected.inventory[0].hash.toString('hex');
message.inventory[0].hash.toString('hex').should.equal(expectedHash);
cb(); cb();
}); });
var message = messages.build('getdata', {inventory: [inventory]}); var message = messages.GetData.forTransaction(fakeHash);
peer.sendMessage(message); peer.sendMessage(message);
}); });
}); });
@ -161,11 +160,11 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
it('gets headers', function(cb) { it('gets headers', function(cb) {
connect(function(peer) { connect(function(peer) {
peer.once('headers', function(message) { peer.once('headers', function(message) {
message.command.should.equal('headers'); (message instanceof messages.Headers).should.equal(true);
message.headers.length.should.equal(3); message.headers.length.should.equal(3);
cb(); cb();
}); });
var message = messages.build('getheaders', {starts: from, stop: stop}); var message = messages.GetHeaders({starts: from, stop: stop});
peer.sendMessage(message); peer.sendMessage(message);
}); });
}); });
@ -178,7 +177,7 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
cb(); cb();
} }
}); });
var message = messages.build('getblocks', {starts: from, stop: stop}); var message = messages.GetBlocks({starts: from, stop: stop});
peer.sendMessage(message); peer.sendMessage(message);
}); });
}); });
@ -196,16 +195,14 @@ describe('Integration with ' + network.name + ' bitcoind', function() {
}; };
it('sends block inv and receives getdata', function(cb) { it('sends block inv and receives getdata', function(cb) {
var randomHash = new Buffer(Random.getRandomBuffer(32)); // slow buffer var randomHash = new Buffer(Random.getRandomBuffer(32)); // slow buffer
var inventory = Inventory.forBlock(randomHash); var expected = messages.GetData.forBlock(randomHash);
var expected = messages.build('getdata', {inventory: [inventory]}); var message = messages.Inventory.forBlock(randomHash);
var message = messages.build('inv', {inventory: [inventory]});
testInvGetData(expected, message, cb); testInvGetData(expected, message, cb);
}); });
it('sends tx inv and receives getdata', function(cb) { it('sends tx inv and receives getdata', function(cb) {
var randomHash = new Buffer(Random.getRandomBuffer(32)); // slow buffer var randomHash = new Buffer(Random.getRandomBuffer(32)); // slow buffer
var inventory = Inventory.forTransaction(randomHash); var expected = messages.GetData.forTransaction(randomHash);
var expected = messages.build('getdata', {inventory: [inventory]}); var message = messages.Inventory.forTransaction(randomHash);
var message = messages.build('inv', {inventory: [inventory]});
testInvGetData(expected, message, cb); testInvGetData(expected, message, cb);
}); });
}); });

View File

@ -13,7 +13,6 @@ function Inventory(obj) {
throw new TypeError('Unexpected hash, expected to be a buffer'); throw new TypeError('Unexpected hash, expected to be a buffer');
} }
this.hash = obj.hash; this.hash = obj.hash;
} }
Inventory.forItem = function(type, hash) { Inventory.forItem = function(type, hash) {

View File

@ -10,6 +10,9 @@ var BufferWriter = bitcore.encoding.BufferWriter;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function AddrMessage(options) { function AddrMessage(options) {
if (!(this instanceof AddrMessage)) {
return new AddrMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'addr'; this.command = 'addr';
this.magicNumber = magicNumber; this.magicNumber = magicNumber;

View File

@ -10,6 +10,9 @@ var BufferWriter = bitcore.encoding.BufferWriter;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function AlertMessage(options) { function AlertMessage(options) {
if (!(this instanceof AlertMessage)) {
return new AlertMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.command = 'alert'; this.command = 'alert';

View File

@ -8,6 +8,9 @@ var Block = bitcore.Block;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function BlockMessage(options) { function BlockMessage(options) {
if (!(this instanceof BlockMessage)) {
return new BlockMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'block'; this.command = 'block';
this.magicNumber = magicNumber; this.magicNumber = magicNumber;

View File

@ -18,6 +18,9 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
* @param{Buffer} data - Array of bytes representing bloom filter data * @param{Buffer} data - Array of bytes representing bloom filter data
*/ */
function FilteraddMessage(options) { function FilteraddMessage(options) {
if (!(this instanceof FilteraddMessage)) {
return new FilteraddMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.command = 'filteradd'; this.command = 'filteradd';

View File

@ -8,6 +8,9 @@ var BufferUtil = bitcore.util.buffer;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function FilterclearMessage(options) { function FilterclearMessage(options) {
if (!(this instanceof FilterclearMessage)) {
return new FilterclearMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.command = 'filterclear'; this.command = 'filterclear';

View File

@ -11,6 +11,9 @@ var _ = bitcore.deps._;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function FilterloadMessage(options) { function FilterloadMessage(options) {
if (!(this instanceof FilterloadMessage)) {
return new FilterloadMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.command = 'filterload'; this.command = 'filterload';

View File

@ -8,6 +8,9 @@ var BufferUtil = bitcore.util.buffer;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function GetaddrMessage(options) { function GetaddrMessage(options) {
if (!(this instanceof GetaddrMessage)) {
return new GetaddrMessage(options);
}
if (!options) { if (!options) {
options = {}; options = {};
} }

View File

@ -20,6 +20,9 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
* @param{Buffer} [stop] - hash of the last block * @param{Buffer} [stop] - hash of the last block
*/ */
function GetblocksMessage(options) { function GetblocksMessage(options) {
if (!(this instanceof GetblocksMessage)) {
return new GetblocksMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'getblocks'; this.command = 'getblocks';
this.version = protocolVersion; this.version = protocolVersion;

View File

@ -6,17 +6,43 @@ var bitcore = require('bitcore');
var utils = require('../utils'); var utils = require('../utils');
var BufferReader = bitcore.encoding.BufferReader; var BufferReader = bitcore.encoding.BufferReader;
var BufferWriter = bitcore.encoding.BufferWriter; var BufferWriter = bitcore.encoding.BufferWriter;
var Inventory = require('../../inventory');
var _ = bitcore.deps._;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function GetdataMessage(options) { function GetdataMessage(options) {
if (!(this instanceof GetdataMessage)) {
return new GetdataMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'getdata'; this.command = 'getdata';
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.inventory = options.inventory;
var inventory;
if (_.isArray(options)) {
inventory = options;
} else {
inventory = options.inventory;
}
utils.checkInventory(inventory);
this.inventory = inventory;
} }
inherits(GetdataMessage, Message); inherits(GetdataMessage, Message);
GetdataMessage.forTransaction = function(hash) {
return new GetdataMessage([Inventory.forTransaction(hash)]);
};
GetdataMessage.forBlock = function(hash) {
return new GetdataMessage([Inventory.forBlock(hash)]);
};
GetdataMessage.forFilteredBlock = function(hash) {
return new GetdataMessage([Inventory.forFilteredBlock(hash)]);
};
GetdataMessage.fromObject = function(options) { GetdataMessage.fromObject = function(options) {
return new GetdataMessage(options); return new GetdataMessage(options);
}; };

View File

@ -18,6 +18,9 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
* @param{Buffer} [stop] - hash of the last block * @param{Buffer} [stop] - hash of the last block
*/ */
function GetheadersMessage(options) { function GetheadersMessage(options) {
if (!(this instanceof GetheadersMessage)) {
return new GetheadersMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'getheaders'; this.command = 'getheaders';
this.version = protocolVersion; this.version = protocolVersion;

View File

@ -18,6 +18,9 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
* @param{Array} blockheaders - array of block headers * @param{Array} blockheaders - array of block headers
*/ */
function HeadersMessage(options) { function HeadersMessage(options) {
if (!(this instanceof HeadersMessage)) {
return new HeadersMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.command = 'headers'; this.command = 'headers';

View File

@ -6,17 +6,42 @@ var bitcore = require('bitcore');
var utils = require('../utils'); var utils = require('../utils');
var BufferReader = bitcore.encoding.BufferReader; var BufferReader = bitcore.encoding.BufferReader;
var BufferWriter = bitcore.encoding.BufferWriter; var BufferWriter = bitcore.encoding.BufferWriter;
var Inventory = require('../../inventory');
var _ = bitcore.deps._;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function InvMessage(options) { function InvMessage(options) {
if (!(this instanceof InvMessage)) {
return new InvMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'inv'; this.command = 'inv';
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.inventory = options.inventory;
var inventory;
if (_.isArray(options)) {
inventory = options;
} else {
inventory = options.inventory;
}
utils.checkInventory(inventory);
this.inventory = inventory;
} }
inherits(InvMessage, Message); inherits(InvMessage, Message);
InvMessage.forTransaction = function(hash) {
return new InvMessage([Inventory.forTransaction(hash)]);
};
InvMessage.forBlock = function(hash) {
return new InvMessage([Inventory.forBlock(hash)]);
};
InvMessage.forFilteredBlock = function(hash) {
return new InvMessage([Inventory.forFilteredBlock(hash)]);
};
InvMessage.fromObject = function(options) { InvMessage.fromObject = function(options) {
return new InvMessage(options); return new InvMessage(options);
}; };

View File

@ -8,6 +8,9 @@ var BufferUtil = bitcore.util.buffer;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function MempoolMessage(options) { function MempoolMessage(options) {
if (!(this instanceof MempoolMessage)) {
return new MempoolMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.command = 'mempool'; this.command = 'mempool';

View File

@ -17,6 +17,9 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
* @param {MerkleBlock} block * @param {MerkleBlock} block
*/ */
function MerkleblockMessage(options) { function MerkleblockMessage(options) {
if (!(this instanceof MerkleblockMessage)) {
return new MerkleblockMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.command = 'merkleblock'; this.command = 'merkleblock';

View File

@ -6,17 +6,42 @@ var bitcore = require('bitcore');
var utils = require('../utils'); var utils = require('../utils');
var BufferReader = bitcore.encoding.BufferReader; var BufferReader = bitcore.encoding.BufferReader;
var BufferWriter = bitcore.encoding.BufferWriter; var BufferWriter = bitcore.encoding.BufferWriter;
var Inventory = require('../../inventory');
var _ = bitcore.deps._;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function NotfoundMessage(options) { function NotfoundMessage(options) {
if (!(this instanceof NotfoundMessage)) {
return new NotfoundMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'notfound'; this.command = 'notfound';
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.inventory = options.inventory;
var inventory;
if (_.isArray(options)) {
inventory = options;
} else {
inventory = options.inventory;
}
utils.checkInventory(inventory);
this.inventory = inventory;
} }
inherits(NotfoundMessage, Message); inherits(NotfoundMessage, Message);
NotfoundMessage.forTransaction = function(hash) {
return new NotfoundMessage([Inventory.forTransaction(hash)]);
};
NotfoundMessage.forBlock = function(hash) {
return new NotfoundMessage([Inventory.forBlock(hash)]);
};
NotfoundMessage.forFilteredBlock = function(hash) {
return new NotfoundMessage([Inventory.forFilteredBlock(hash)]);
};
NotfoundMessage.fromObject = function(options) { NotfoundMessage.fromObject = function(options) {
return new NotfoundMessage(options); return new NotfoundMessage(options);
}; };

View File

@ -9,6 +9,9 @@ var BufferReader = bitcore.encoding.BufferReader;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function PingMessage(options) { function PingMessage(options) {
if (!(this instanceof PingMessage)) {
return new PingMessage(options);
}
if (!options) { if (!options) {
options = {}; options = {};
} }

View File

@ -9,6 +9,9 @@ var BufferReader = bitcore.encoding.BufferReader;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function PongMessage(options) { function PongMessage(options) {
if (!(this instanceof PongMessage)) {
return new PongMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'pong'; this.command = 'pong';
this.magicNumber = magicNumber; this.magicNumber = magicNumber;

View File

@ -9,6 +9,9 @@ var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
// todo: add payload: https://en.bitcoin.it/wiki/Protocol_documentation#reject // todo: add payload: https://en.bitcoin.it/wiki/Protocol_documentation#reject
function RejectMessage(options) { function RejectMessage(options) {
if (!(this instanceof RejectMessage)) {
return new RejectMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.magicNumber = magicNumber; this.magicNumber = magicNumber;
this.command = 'reject'; this.command = 'reject';

View File

@ -8,6 +8,9 @@ var Transaction = bitcore.Transaction;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function TransactionMessage(options) { function TransactionMessage(options) {
if (!(this instanceof TransactionMessage)) {
return new TransactionMessage(options);
}
Message.call(this, options); Message.call(this, options);
this.command = 'tx'; this.command = 'tx';
this.magicNumber = magicNumber; this.magicNumber = magicNumber;

View File

@ -8,6 +8,9 @@ var BufferUtil = bitcore.util.buffer;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0); var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function VerackMessage(options) { function VerackMessage(options) {
if (!(this instanceof VerackMessage)) {
return new VerackMessage(options);
}
if(!options) { if(!options) {
options = {}; options = {};
} }

View File

@ -24,6 +24,9 @@ var packageInfo = require('../../../package.json');
* @param{Buffer} obj.nonce - a random 8 byte buffer * @param{Buffer} obj.nonce - a random 8 byte buffer
*/ */
function VersionMessage(obj) { function VersionMessage(obj) {
if (!(this instanceof VersionMessage)) {
return new VersionMessage(obj);
}
/* jshint maxcomplexity: 10 */ /* jshint maxcomplexity: 10 */
Message.call(this, obj); Message.call(this, obj);
this.command = 'version'; this.command = 'version';

View File

@ -7,6 +7,14 @@ var _ = bitcore.deps._;
var utils; var utils;
module.exports = utils = { module.exports = utils = {
checkInventory: function(inventory) {
$.checkArgument(
_.isUndefined(inventory) ||
inventory.length === 0 ||
(!_.isUndefined(inventory[0].type) && !_.isUndefined(inventory[0].hash)),
'Inventory must be an array of inventory objects'
);
},
checkFinished: function checkFinished(parser) { checkFinished: function checkFinished(parser) {
if(!parser.finished()) { if(!parser.finished()) {
throw new Error('Data still available after parsing'); throw new Error('Data still available after parsing');