2015-12-29 11:36:51 -08:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var _ = require('lodash');
|
|
|
|
var async = require('async');
|
|
|
|
|
|
|
|
var chai = require('chai');
|
|
|
|
var sinon = require('sinon');
|
|
|
|
var should = chai.should();
|
|
|
|
var log = require('npmlog');
|
|
|
|
log.debug = log.verbose;
|
|
|
|
log.level = 'info';
|
|
|
|
|
|
|
|
var WalletService = require('../../lib/server');
|
|
|
|
var BlockchainMonitor = require('../../lib/blockchainmonitor');
|
|
|
|
|
|
|
|
var TestData = require('../testdata');
|
|
|
|
var helpers = require('./helpers');
|
|
|
|
var storage, blockchainExplorer;
|
|
|
|
|
|
|
|
var socket = {
|
|
|
|
handlers: {},
|
|
|
|
};
|
|
|
|
socket.on = function(eventName, handler) {
|
|
|
|
this.handlers[eventName] = handler;
|
|
|
|
};
|
|
|
|
|
|
|
|
describe('Blockchain monitor', function() {
|
|
|
|
var server, wallet;
|
|
|
|
|
|
|
|
before(function(done) {
|
|
|
|
helpers.before(done);
|
|
|
|
});
|
|
|
|
after(function(done) {
|
|
|
|
helpers.after(done);
|
|
|
|
});
|
|
|
|
beforeEach(function(done) {
|
|
|
|
helpers.beforeEach(function(res) {
|
|
|
|
storage = res.storage;
|
|
|
|
blockchainExplorer = res.blockchainExplorer;
|
|
|
|
blockchainExplorer.initSocket = sinon.stub().returns(socket);
|
|
|
|
|
|
|
|
helpers.createAndJoinWallet(2, 3, function(s, w) {
|
|
|
|
server = s;
|
|
|
|
wallet = w;
|
|
|
|
|
|
|
|
var bcmonitor = new BlockchainMonitor();
|
|
|
|
bcmonitor.start({
|
|
|
|
lockOpts: {},
|
|
|
|
messageBroker: server.messageBroker,
|
|
|
|
storage: storage,
|
|
|
|
blockchainExplorers: {
|
2017-08-25 12:04:14 -07:00
|
|
|
'btc': {
|
|
|
|
'testnet': blockchainExplorer,
|
|
|
|
'livenet': blockchainExplorer
|
|
|
|
}
|
2015-12-29 11:36:51 -08:00
|
|
|
},
|
|
|
|
}, function(err) {
|
|
|
|
should.not.exist(err);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should notify copayers of incoming txs', function(done) {
|
|
|
|
server.createAddress({}, function(err, address) {
|
|
|
|
should.not.exist(err);
|
|
|
|
|
|
|
|
var incoming = {
|
|
|
|
txid: '123',
|
|
|
|
vout: [{}],
|
|
|
|
};
|
|
|
|
incoming.vout[0][address.address] = 1500;
|
|
|
|
socket.handlers['tx'](incoming);
|
|
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
server.getNotifications({}, function(err, notifications) {
|
|
|
|
should.not.exist(err);
|
|
|
|
var notification = _.find(notifications, {
|
|
|
|
type: 'NewIncomingTx'
|
|
|
|
});
|
|
|
|
should.exist(notification);
|
|
|
|
notification.walletId.should.equal(wallet.id);
|
|
|
|
notification.data.txid.should.equal('123');
|
|
|
|
notification.data.address.should.equal(address.address);
|
|
|
|
notification.data.amount.should.equal(1500);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
}, 100);
|
|
|
|
});
|
|
|
|
});
|
2017-04-14 10:10:33 -07:00
|
|
|
|
|
|
|
it('should not notify copayers of incoming txs more than once', function(done) {
|
|
|
|
server.createAddress({}, function(err, address) {
|
|
|
|
should.not.exist(err);
|
|
|
|
|
|
|
|
var incoming = {
|
|
|
|
txid: '123',
|
|
|
|
vout: [{}],
|
|
|
|
};
|
|
|
|
incoming.vout[0][address.address] = 1500;
|
|
|
|
socket.handlers['tx'](incoming);
|
|
|
|
setTimeout(function() {
|
|
|
|
socket.handlers['tx'](incoming);
|
|
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
server.getNotifications({}, function(err, notifications) {
|
|
|
|
should.not.exist(err);
|
|
|
|
var notification = _.filter(notifications, {
|
|
|
|
type: 'NewIncomingTx'
|
|
|
|
});
|
|
|
|
notification.length.should.equal(1);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
}, 100);
|
|
|
|
}, 50);
|
|
|
|
});
|
|
|
|
});
|
2017-05-17 11:10:16 -07:00
|
|
|
|
|
|
|
it('should notify copayers of tx confirmation', function(done) {
|
|
|
|
server.createAddress({}, function(err, address) {
|
|
|
|
should.not.exist(err);
|
|
|
|
|
|
|
|
var incoming = {
|
|
|
|
txid: '123',
|
|
|
|
vout: [{}],
|
|
|
|
};
|
|
|
|
incoming.vout[0][address.address] = 1500;
|
|
|
|
|
|
|
|
server.txConfirmationSubscribe({
|
|
|
|
txid: '123'
|
|
|
|
}, function(err) {
|
|
|
|
should.not.exist(err);
|
|
|
|
|
|
|
|
blockchainExplorer.getTxidsInBlock = sinon.stub().callsArgWith(1, null, ['123', '456']);
|
|
|
|
socket.handlers['block']('block1');
|
|
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
blockchainExplorer.getTxidsInBlock = sinon.stub().callsArgWith(1, null, ['123', '456']);
|
|
|
|
socket.handlers['block']('block2');
|
|
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
server.getNotifications({}, function(err, notifications) {
|
|
|
|
should.not.exist(err);
|
|
|
|
var notifications = _.filter(notifications, {
|
|
|
|
type: 'TxConfirmation'
|
|
|
|
});
|
|
|
|
notifications.length.should.equal(1);
|
|
|
|
var n = notifications[0];
|
|
|
|
n.walletId.should.equal(wallet.id);
|
|
|
|
n.creatorId.should.equal(server.copayerId);
|
|
|
|
n.data.txid.should.equal('123');
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
}, 50);
|
|
|
|
}, 50);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2015-12-29 11:36:51 -08:00
|
|
|
});
|