bitcore-node-zcash/integration/regtest-node.js

204 lines
4.7 KiB
JavaScript
Raw Normal View History

2015-08-21 08:17:26 -07:00
'use strict';
// These tests require bitcore-node Bitcoin Core bindings to be compiled with
// the environment variable BITCORENODE_ENV=test. This enables the use of regtest
2015-08-21 08:17:26 -07:00
// functionality by including the wallet in the build.
2015-08-24 06:56:38 -07:00
// To run the tests: $ mocha -R spec integration/regtest-node.js
2015-08-21 08:17:26 -07:00
var index = require('..');
2015-08-24 06:56:38 -07:00
var async = require('async');
var log = index.log;
2015-08-24 06:56:38 -07:00
log.debug = function() {};
2015-08-21 08:17:26 -07:00
if (process.env.BITCORENODE_ENV !== 'test') {
log.info('Please set the environment variable BITCORENODE_ENV=test and make sure bindings are compiled for testing');
process.exit();
}
var chai = require('chai');
var bitcore = require('bitcore');
var rimraf = require('rimraf');
var node;
var should = chai.should();
var BitcoinRPC = require('bitcoind-rpc');
2015-08-31 06:00:00 -07:00
var index = require('..');
var BitcoreNode = index.Node;
var AddressModule = index.modules.AddressModule;
var BitcoinModule = index.modules.BitcoinModule;
2015-08-21 08:17:26 -07:00
var testWIF = 'cSdkPxkAjA4HDr5VHgsebAPDEh9Gyub4HK8UJr2DFGGqKKy4K5sG';
var testKey;
var client;
describe('Node Functionality', function() {
before(function(done) {
this.timeout(30000);
// Add the regtest network
bitcore.Networks.remove(bitcore.Networks.testnet);
bitcore.Networks.add({
name: 'regtest',
alias: 'regtest',
pubkeyhash: 0x6f,
privatekey: 0xef,
scripthash: 0xc4,
xpubkey: 0x043587cf,
xprivkey: 0x04358394,
networkMagic: 0xfabfb5da,
port: 18444,
dnsSeeds: [ ]
});
var datadir = __dirname + '/data';
testKey = bitcore.PrivateKey(testWIF);
rimraf(datadir + '/regtest', function(err) {
if (err) {
throw err;
}
var configuration = {
datadir: datadir,
2015-08-31 06:00:00 -07:00
network: 'regtest',
modules: [
{
name: 'bitcoind',
module: BitcoinModule,
dependencies: BitcoinModule.dependencies
},
{
name: 'address',
module: AddressModule,
dependencies: AddressModule.dependencies
}
]
2015-08-21 08:17:26 -07:00
};
node = new BitcoreNode(configuration);
node.on('error', function(err) {
log.error(err);
});
node.on('ready', function() {
client = new BitcoinRPC({
protocol: 'https',
2015-08-21 08:17:26 -07:00
host: '127.0.0.1',
port: 18332,
user: 'bitcoin',
pass: 'local321',
rejectUnauthorized: false
2015-08-21 08:17:26 -07:00
});
2015-08-24 06:56:38 -07:00
var syncedHandler = function() {
2015-08-21 08:17:26 -07:00
if (node.chain.tip.__height === 150) {
2015-08-24 06:56:38 -07:00
node.removeListener('synced', syncedHandler);
2015-08-21 08:17:26 -07:00
done();
}
2015-08-24 06:56:38 -07:00
};
node.on('synced', syncedHandler);
2015-08-21 08:17:26 -07:00
client.generate(150, function(err, response) {
if (err) {
throw err;
}
});
});
});
});
after(function(done) {
this.timeout(20000);
2015-08-31 06:00:00 -07:00
node.stop(function(err, result) {
if(err) {
throw err;
}
2015-08-21 08:17:26 -07:00
done();
});
});
2015-08-24 06:56:38 -07:00
it('will handle a reorganization', function(done) {
2015-08-21 08:17:26 -07:00
2015-08-24 06:56:38 -07:00
var count;
var blockHash;
async.series([
function(next) {
client.getBlockCount(function(err, response) {
if (err) {
return next(err);
}
count = response.result;
next();
});
},
function(next) {
2015-08-21 08:17:26 -07:00
client.getBlockHash(count, function(err, response) {
if (err) {
2015-08-24 06:56:38 -07:00
return next(err);
2015-08-21 08:17:26 -07:00
}
2015-08-24 06:56:38 -07:00
blockHash = response.result;
next();
2015-08-21 08:17:26 -07:00
});
2015-08-24 06:56:38 -07:00
},
function(next) {
client.invalidateBlock(blockHash, next);
},
function(next) {
client.getBlockCount(function(err, response) {
if (err) {
return next(err);
}
response.result.should.equal(count - 1);
next();
});
}
], function(err) {
if (err) {
throw err;
}
var blocksRemoved = 0;
var blocksAdded = 0;
2015-08-21 08:17:26 -07:00
2015-08-24 06:56:38 -07:00
var removeBlock = function() {
blocksRemoved++;
};
2015-08-21 08:17:26 -07:00
2015-08-24 06:56:38 -07:00
node.chain.on('removeblock', removeBlock);
var addBlock = function() {
blocksAdded++;
if (blocksAdded === 2 && blocksRemoved === 1) {
node.chain.removeListener('addblock', addBlock);
node.chain.removeListener('removeblock', removeBlock);
done();
}
};
node.chain.on('addblock', addBlock);
2015-08-21 08:17:26 -07:00
// We need to add a transaction to the mempool so that the next block will
// have a different hash as the hash has been invalidated.
client.sendToAddress(testKey.toAddress().toString(), 10, function(err) {
if (err) {
throw err;
}
client.generate(2, function(err, response) {
if (err) {
throw err;
}
});
});
});
2015-08-24 06:56:38 -07:00
});
2015-08-21 08:17:26 -07:00
});