add tests
This commit is contained in:
parent
b0ab45f3f7
commit
a9e5ee6f1a
15
lib/node.js
15
lib/node.js
@ -279,14 +279,18 @@ Node.prototype._syncBitcoind = function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, function(err) {
|
}, function(err) {
|
||||||
|
|
||||||
self.bitcoindSyncing = false;
|
|
||||||
self.chain.lastSavedMetadataThreshold = 0;
|
|
||||||
if (err) {
|
if (err) {
|
||||||
Error.captureStackTrace(err);
|
Error.captureStackTrace(err);
|
||||||
return self.emit('error', err);
|
return self.emit('error', err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(self.stopping) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.bitcoindSyncing = false;
|
||||||
|
self.chain.lastSavedMetadataThreshold = 0;
|
||||||
|
|
||||||
// If bitcoind is completely synced
|
// If bitcoind is completely synced
|
||||||
if (self.bitcoind.isSynced()) {
|
if (self.bitcoind.isSynced()) {
|
||||||
self.emit('synced');
|
self.emit('synced');
|
||||||
@ -417,7 +421,6 @@ Node.prototype._initialize = function() {
|
|||||||
this.chain.on('ready', function() {
|
this.chain.on('ready', function() {
|
||||||
log.info('Bitcoin Chain Ready');
|
log.info('Bitcoin Chain Ready');
|
||||||
self._syncBitcoind();
|
self._syncBitcoind();
|
||||||
self.emit('ready');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.chain.on('error', function(err) {
|
this.chain.on('error', function(err) {
|
||||||
@ -437,8 +440,10 @@ Node.prototype._initialize = function() {
|
|||||||
|
|
||||||
this.start(function(err) {
|
this.start(function(err) {
|
||||||
if(err) {
|
if(err) {
|
||||||
log.error('Failed starting services: ' + err);
|
return self.emit('error', err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.emit('ready');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,24 @@ describe('Bitcoin Chain', function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('#start', function() {
|
||||||
|
it('should call the callback when base chain is initialized', function(done) {
|
||||||
|
var chain = new Chain();
|
||||||
|
chain.initialize = function() {
|
||||||
|
chain.emit('initialized');
|
||||||
|
};
|
||||||
|
|
||||||
|
chain.start(done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#stop', function() {
|
||||||
|
it('should call the callback', function(done) {
|
||||||
|
var chain = new Chain();
|
||||||
|
chain.stop(done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('#_writeBlock', function() {
|
describe('#_writeBlock', function() {
|
||||||
it('should update hashes and call putBlock', function(done) {
|
it('should update hashes and call putBlock', function(done) {
|
||||||
var chain = new Chain();
|
var chain = new Chain();
|
||||||
|
|||||||
@ -16,7 +16,7 @@ var Transaction = bitcore.Transaction;
|
|||||||
describe('Bitcoin DB', function() {
|
describe('Bitcoin DB', function() {
|
||||||
var coinbaseAmount = 50 * 1e8;
|
var coinbaseAmount = 50 * 1e8;
|
||||||
|
|
||||||
describe('#initialize', function() {
|
describe('#start', function() {
|
||||||
it('should emit ready', function(done) {
|
it('should emit ready', function(done) {
|
||||||
var db = new DB({store: memdown});
|
var db = new DB({store: memdown});
|
||||||
db._modules = ['mod1', 'mod2'];
|
db._modules = ['mod1', 'mod2'];
|
||||||
@ -24,8 +24,29 @@ describe('Bitcoin DB', function() {
|
|||||||
on: sinon.spy()
|
on: sinon.spy()
|
||||||
};
|
};
|
||||||
db.addModule = sinon.spy();
|
db.addModule = sinon.spy();
|
||||||
db.on('ready', done);
|
var readyFired = false;
|
||||||
db.initialize();
|
db.on('ready', function() {
|
||||||
|
readyFired = true;
|
||||||
|
});
|
||||||
|
db.start(function() {
|
||||||
|
readyFired.should.equal(true);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#stop', function() {
|
||||||
|
it('should close the store', function(done) {
|
||||||
|
var db = new DB({store: memdown});
|
||||||
|
db.store = {
|
||||||
|
close: sinon.stub().callsArg(0)
|
||||||
|
};
|
||||||
|
|
||||||
|
db.stop(function(err) {
|
||||||
|
should.not.exist(err);
|
||||||
|
db.store.close.calledOnce.should.equal(true);
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -273,7 +273,50 @@ describe('Bitcoind Node', function() {
|
|||||||
});
|
});
|
||||||
node._syncBitcoind();
|
node._syncBitcoind();
|
||||||
});
|
});
|
||||||
|
it('will stop syncing when the node is stopping', function(done) {
|
||||||
|
var node = new Node({});
|
||||||
|
node.Block = Block;
|
||||||
|
node.bitcoindHeight = 1;
|
||||||
|
var blockBuffer = new Buffer(blockData);
|
||||||
|
var block = Block.fromBuffer(blockBuffer);
|
||||||
|
node.bitcoind = {
|
||||||
|
getBlock: sinon.stub().callsArgWith(1, null, blockBuffer),
|
||||||
|
isSynced: sinon.stub().returns(true)
|
||||||
|
};
|
||||||
|
node.chain = {
|
||||||
|
tip: {
|
||||||
|
__height: 0,
|
||||||
|
hash: block.prevHash
|
||||||
|
},
|
||||||
|
saveMetadata: sinon.stub(),
|
||||||
|
emit: sinon.stub(),
|
||||||
|
cache: {
|
||||||
|
hashes: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
node.db = {
|
||||||
|
_onChainAddBlock: function(block, callback) {
|
||||||
|
node.chain.tip.__height += 1;
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
node.stopping = true;
|
||||||
|
|
||||||
|
var synced = false;
|
||||||
|
|
||||||
|
node.on('synced', function() {
|
||||||
|
synced = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
node._syncBitcoind();
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
synced.should.equal(false);
|
||||||
|
done();
|
||||||
|
}, 10);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#_loadNetwork', function() {
|
describe('#_loadNetwork', function() {
|
||||||
it('should use the testnet network if testnet is specified', function() {
|
it('should use the testnet network if testnet is specified', function() {
|
||||||
var config = {
|
var config = {
|
||||||
@ -414,101 +457,26 @@ describe('Bitcoind Node', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#_initializeBitcoind', function() {
|
|
||||||
it('will call db.initialize() on ready event', function(done) {
|
|
||||||
var node = new Node({});
|
|
||||||
node.bitcoind = new EventEmitter();
|
|
||||||
node.bitcoind.getInfo = sinon.stub().returns({blocks: 10});
|
|
||||||
node.db = {
|
|
||||||
initialize: sinon.spy()
|
|
||||||
};
|
|
||||||
sinon.stub(chainlib.log, 'info');
|
|
||||||
node.bitcoind.on('ready', function() {
|
|
||||||
setImmediate(function() {
|
|
||||||
chainlib.log.info.callCount.should.equal(1);
|
|
||||||
chainlib.log.info.restore();
|
|
||||||
node.db.initialize.callCount.should.equal(1);
|
|
||||||
node.bitcoindHeight.should.equal(10);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
node._initializeBitcoind();
|
|
||||||
node.bitcoind.emit('ready');
|
|
||||||
});
|
|
||||||
it('will call emit an error from libbitcoind', function(done) {
|
|
||||||
var node = new Node({});
|
|
||||||
node.bitcoind = new EventEmitter();
|
|
||||||
node.on('error', function(err) {
|
|
||||||
should.exist(err);
|
|
||||||
err.message.should.equal('test error');
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
node._initializeBitcoind();
|
|
||||||
node.bitcoind.emit('error', new Error('test error'));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#_initializeDatabase', function() {
|
|
||||||
it('will call chain.initialize() on ready event', function(done) {
|
|
||||||
var node = new Node({});
|
|
||||||
node.db = new EventEmitter();
|
|
||||||
node.db.addModule = sinon.spy();
|
|
||||||
var module = {};
|
|
||||||
node.db._modules = [module];
|
|
||||||
node.chain = {
|
|
||||||
initialize: sinon.spy()
|
|
||||||
};
|
|
||||||
sinon.stub(chainlib.log, 'info');
|
|
||||||
node.db.on('ready', function() {
|
|
||||||
setImmediate(function() {
|
|
||||||
chainlib.log.info.callCount.should.equal(1);
|
|
||||||
chainlib.log.info.restore();
|
|
||||||
node.chain.initialize.callCount.should.equal(1);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
node._initializeDatabase();
|
|
||||||
node.db.emit('ready');
|
|
||||||
});
|
|
||||||
it('will call emit an error from db', function(done) {
|
|
||||||
var node = new Node({});
|
|
||||||
node.db = new EventEmitter();
|
|
||||||
node.on('error', function(err) {
|
|
||||||
should.exist(err);
|
|
||||||
err.message.should.equal('test error');
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
node._initializeDatabase();
|
|
||||||
node.db.emit('error', new Error('test error'));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#_initializeChain', function() {
|
|
||||||
it('will call emit an error from chain', function(done) {
|
|
||||||
var node = new Node({});
|
|
||||||
node.chain = new EventEmitter();
|
|
||||||
node.on('error', function(err) {
|
|
||||||
should.exist(err);
|
|
||||||
err.message.should.equal('test error');
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
node._initializeChain();
|
|
||||||
node.chain.emit('error', new Error('test error'));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#_initialize', function() {
|
describe('#_initialize', function() {
|
||||||
|
var node = new Node({});
|
||||||
|
node.chain = {
|
||||||
|
on: sinon.spy()
|
||||||
|
};
|
||||||
|
node.Block = 'Block';
|
||||||
|
node.bitcoind = {
|
||||||
|
on: sinon.spy()
|
||||||
|
};
|
||||||
|
node.db = {
|
||||||
|
on: sinon.spy()
|
||||||
|
};
|
||||||
|
|
||||||
it('should initialize', function(done) {
|
it('should initialize', function(done) {
|
||||||
var node = new Node({});
|
node.once('ready', function() {
|
||||||
node.chain = {};
|
done();
|
||||||
node.Block = 'Block';
|
});
|
||||||
node.bitcoind = 'bitcoind';
|
|
||||||
node.db = {};
|
node.start = sinon.stub().callsArg(0);
|
||||||
|
|
||||||
node._initializeBitcoind = sinon.spy();
|
|
||||||
node._initializeDatabase = sinon.spy();
|
|
||||||
node._initializeChain = sinon.spy();
|
|
||||||
node._initialize();
|
node._initialize();
|
||||||
|
|
||||||
// references
|
// references
|
||||||
@ -518,18 +486,21 @@ describe('Bitcoind Node', function() {
|
|||||||
node.chain.db.should.equal(node.db);
|
node.chain.db.should.equal(node.db);
|
||||||
node.chain.db.should.equal(node.db);
|
node.chain.db.should.equal(node.db);
|
||||||
|
|
||||||
// events
|
|
||||||
node._initializeBitcoind.callCount.should.equal(1);
|
|
||||||
node._initializeDatabase.callCount.should.equal(1);
|
|
||||||
node._initializeChain.callCount.should.equal(1);
|
|
||||||
|
|
||||||
// start syncing
|
// start syncing
|
||||||
node.setSyncStrategy = sinon.spy();
|
node.setSyncStrategy = sinon.spy();
|
||||||
node.on('ready', function() {
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should emit an error if an error occurred starting services', function(done) {
|
||||||
|
node.once('error', function(err) {
|
||||||
|
should.exist(err);
|
||||||
|
err.message.should.equal('error');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
node.emit('ready');
|
|
||||||
|
|
||||||
|
node.start = sinon.stub().callsArgWith(0, new Error('error'));
|
||||||
|
|
||||||
|
node._initialize();
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user