add tests to search for tip

This commit is contained in:
Matias Alejo Garcia 2016-12-22 12:23:15 -03:00
parent 757d96fa0d
commit 4ff241e9e8
No known key found for this signature in database
GPG Key ID: 02470DB551277AB3
4 changed files with 67 additions and 38 deletions

View File

@ -223,6 +223,10 @@ BlockchainMonitor.prototype._fetchAndProcessBlock = function(network, hash, cb)
};
BlockchainMonitor.prototype._getBlockPrevHash = function(block) {
return block.header.toObject().prevHash;
};
BlockchainMonitor.prototype._handleNewBlockchainTip = function(network, hash, cb) {
var self = this;
@ -241,6 +245,7 @@ BlockchainMonitor.prototype._handleNewBlockchainTip = function(network, hash, cb
}
function fetchAndProcess(network, hash, next) {
self._fetchAndProcessBlock(network, hash, function(err, block) {
if (err) return next(err);
@ -250,19 +255,21 @@ BlockchainMonitor.prototype._handleNewBlockchainTip = function(network, hash, cb
throw ('Block not found!' + network + hash);
};
var header = block.header.toObject();
// to make it testeable, it is on a different function
var prevHash = self._getBlockPrevHash(block);
if (_.indexOf(tip.hashes, header.prevHash) == -1) {
log.info('', 'Prevhash does not match stored tip hashes... ' + header.prevHash);
return fetchAndProcess(network, header.prevHash, next);
if (_.indexOf(tip.hashes, prevHash) == -1) {
log.info('', 'Prevhash does not match stored tip hashes... ' + prevHash);
return fetchAndProcess(network, prevHash, next);
}
return cb();
return next();
});
};
fetchAndProcess(network, hash, function(err) {
if (err) return cb(err);
// Block is chained with our processed blocks
tip.hashes.unshift(hash);
var hashes = tip.hashes.splice(0, Defaults.MAX_REORG_DEPTH);

View File

@ -895,13 +895,9 @@ Storage.prototype.fetchRecentAddresses = function(walletId, minUsedOn, cb) {
this.db.collection(collections.ADDRESSES).find({
walletId: walletId,
$or: [{
lastUsedOn: {
$gte: minUsedOn,
}
}, {
lastUsedOn: undefined,
}],
lastUsedOn: {
$gte: minUsedOn,
},
}).toArray(function(err, result) {
if (err) return cb(err);
if (!result) return cb();

View File

@ -25,7 +25,7 @@ socket.on = function(eventName, handler) {
};
describe('Blockchain monitor', function() {
var server, wallet;
var server, wallet, bcmonitor;
before(function(done) {
helpers.before(done);
@ -43,7 +43,7 @@ describe('Blockchain monitor', function() {
helpers.createAndJoinWallet(2, 3, function(s, w) {
server = s;
wallet = w;
var bcmonitor = new BlockchainMonitor();
bcmonitor = new BlockchainMonitor();
bcmonitor.start({
lockOpts: {},
messageBroker: server.messageBroker,
@ -135,9 +135,7 @@ describe('Blockchain monitor', function() {
it('should process incoming blocks', function(done) {
var incoming = {
hash: '123',
};
var incoming = '1234';
blockchainExplorer.getBlock = sinon.stub().yields(null, {
rawblock: TestData.block.rawblock
@ -157,36 +155,57 @@ describe('Blockchain monitor', function() {
//
helpers.insertFakeAddresses(server, wallet, fakeAddresses, function(err) {
helpers.insertFakeAddresses(server, wallet, fakeAddresses, null, function(err) {
should.not.exist(err);
socket.handlers['block'](incoming);
setTimeout(function() {
var clock = sinon.useFakeTimers(TestData.block.time, 'Date');
storage.fetchRecentAddresses(wallet.id, (Date.now() / 1000) - 100, function(err, addr) {
_.pluck(addr, 'address').should.be.deep.equal(fakeAddresses);
clock.restore();
done();
});
}, 50);
var clock = sinon.useFakeTimers(TestData.block.time, 'Date');
storage.fetchRecentAddresses(wallet.id, (Date.now() / 1000) - 100, function(err, addr) {
_.pluck(addr, 'address').should.be.deep.equal([]);
clock.restore();
// addresses should be marked with block's timestamp
socket.handlers['block'](incoming);
var storeOld = bcmonitor._storeAndBroadcastNotification;
bcmonitor._storeAndBroadcastNotification = function() {
bcmonitor._storeAndBroadcastNotification = storeOld;
var clock = sinon.useFakeTimers(TestData.block.time, 'Date');
storage.fetchRecentAddresses(wallet.id, (Date.now() / 1000) - 100, function(err, addr) {
_.pluck(addr, 'address').should.be.deep.equal(fakeAddresses);
clock.restore();
done();
});
}
});
});
});
});
// TODO
it('should process all blocks until the tip is found', function(done) {
var incoming = {
hash: '123',
};
var incoming = '1234';
blockchainExplorer.getBlock = sinon.stub().yields(null, {
rawblock: TestData.block.rawblock
});
server.storage.getBlockchainTip = sinon.stub().yields(null);
var i = 0;
var prevOld = bcmonitor._getBlockPrevHash;
var tipHashes = [0, 0, TestData.block.prev, 0];
var expected = _.clone(tipHashes);
expected.unshift(incoming);
bcmonitor._getBlockPrevHash = function() {
return (i++ > 5) ? TestData.block.prev : '00';
};
server.storage.getBlockchainTip = sinon.stub().yields(null, {
hashes: tipHashes
});
var spy = sinon.spy(server.storage, 'updateBlockchainTip');
var fakeAddresses = TestData.block.addresses.splice(0, 3);
@ -194,11 +213,17 @@ describe('Blockchain monitor', function() {
should.not.exist(err);
var aLongTimeAgo = Date.now() - (1000 * 10 * 86400);
socket.handlers['block'](incoming);
setTimeout(function() {
var storeOld = bcmonitor._storeAndBroadcastNotification;
bcmonitor._storeAndBroadcastNotification = function() {
bcmonitor._getBlockPrevHash = prevOld;
bcmonitor._storeAndBroadcastNotification = storeOld;
spy.getCall(0).args[1].should.deep.equal(expected);
done();
}, 50);
};
});
});

View File

@ -419,12 +419,13 @@ helpers.createAddresses = function(server, wallet, main, change, cb) {
};
helpers.insertFakeAddresses = function(server, wallet, addresses, cb) {
helpers.insertFakeAddresses = function(server, wallet, addresses, lastUsedOn, cb) {
async.each(addresses, function(addr, i_cb) {
var addressObj = Model.Address.create({
walletId: wallet.id,
address: addr,
});
addressObj.lastUsedOn = _.isUndefined(lastUsedOn) ? Math.floor(Date.now()/1000) : lastUsedOn;
server.storage.storeAddressAndWallet(wallet, addressObj, function(err) {
return i_cb(err);
});