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

View File

@ -13,7 +13,6 @@ function Inventory(obj) {
throw new TypeError('Unexpected hash, expected to be a buffer');
}
this.hash = obj.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);
function AddrMessage(options) {
if (!(this instanceof AddrMessage)) {
return new AddrMessage(options);
}
Message.call(this, options);
this.command = 'addr';
this.magicNumber = magicNumber;

View File

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

View File

@ -8,6 +8,9 @@ var Block = bitcore.Block;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function BlockMessage(options) {
if (!(this instanceof BlockMessage)) {
return new BlockMessage(options);
}
Message.call(this, options);
this.command = 'block';
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
*/
function FilteraddMessage(options) {
if (!(this instanceof FilteraddMessage)) {
return new FilteraddMessage(options);
}
Message.call(this, options);
this.magicNumber = magicNumber;
this.command = 'filteradd';

View File

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

View File

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

View File

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

View File

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

View File

@ -6,17 +6,43 @@ var bitcore = require('bitcore');
var utils = require('../utils');
var BufferReader = bitcore.encoding.BufferReader;
var BufferWriter = bitcore.encoding.BufferWriter;
var Inventory = require('../../inventory');
var _ = bitcore.deps._;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function GetdataMessage(options) {
if (!(this instanceof GetdataMessage)) {
return new GetdataMessage(options);
}
Message.call(this, options);
this.command = 'getdata';
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);
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) {
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
*/
function GetheadersMessage(options) {
if (!(this instanceof GetheadersMessage)) {
return new GetheadersMessage(options);
}
Message.call(this, options);
this.command = 'getheaders';
this.version = protocolVersion;

View File

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

View File

@ -6,17 +6,42 @@ var bitcore = require('bitcore');
var utils = require('../utils');
var BufferReader = bitcore.encoding.BufferReader;
var BufferWriter = bitcore.encoding.BufferWriter;
var Inventory = require('../../inventory');
var _ = bitcore.deps._;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function InvMessage(options) {
if (!(this instanceof InvMessage)) {
return new InvMessage(options);
}
Message.call(this, options);
this.command = 'inv';
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);
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) {
return new InvMessage(options);
};

View File

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

View File

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

View File

@ -6,17 +6,42 @@ var bitcore = require('bitcore');
var utils = require('../utils');
var BufferReader = bitcore.encoding.BufferReader;
var BufferWriter = bitcore.encoding.BufferWriter;
var Inventory = require('../../inventory');
var _ = bitcore.deps._;
var magicNumber = bitcore.Networks.defaultNetwork.networkMagic.readUInt32LE(0);
function NotfoundMessage(options) {
if (!(this instanceof NotfoundMessage)) {
return new NotfoundMessage(options);
}
Message.call(this, options);
this.command = 'notfound';
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);
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) {
return new NotfoundMessage(options);
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -7,6 +7,14 @@ var _ = bitcore.deps._;
var 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) {
if(!parser.finished()) {
throw new Error('Data still available after parsing');