Regtest testing
- Removed config option for build scripts, replaced with env variable - Updated README - Added regtest option under test build, wallet built-in - added network key to bindings - datadir for the bitcoind object instead of directory - added new config_options scripts for test and debug
This commit is contained in:
parent
cda1e2a438
commit
cf6225c495
11
README.md
11
README.md
@ -21,7 +21,7 @@ var BitcoinNode = require('bitcoind.js');
|
|||||||
|
|
||||||
var configuration = {
|
var configuration = {
|
||||||
datadir: '~/.bitcoin',
|
datadir: '~/.bitcoin',
|
||||||
testnet: true
|
network: 'testnet'
|
||||||
};
|
};
|
||||||
|
|
||||||
var node = new BitcoinNode(configuration);
|
var node = new BitcoinNode(configuration);
|
||||||
@ -110,7 +110,7 @@ $ tail -f ~/.bitcoin/debug.log
|
|||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
There are two main parts of the build, compiling Bitcoin Core and the Node.js bindings. You can run both by using `npm install` and `npm run debug_install`.
|
There are two main parts of the build, compiling Bitcoin Core and the Node.js bindings. You can run both by using `npm install` and set environment variable, $BITCOINDJS_ENV to 'test' or 'debug'. Both 'test' and 'debug' build libbitcoind with debug symbols whereas 'test' adds wallet capability so that regtest can be used.
|
||||||
|
|
||||||
### Node.js Bindings
|
### Node.js Bindings
|
||||||
|
|
||||||
@ -130,6 +130,11 @@ To be able to debug you'll need to have `gdb` and `node` compiled for debugging
|
|||||||
$ gdb --args node_g path/to/example.js
|
$ gdb --args node_g path/to/example.js
|
||||||
```
|
```
|
||||||
|
|
||||||
|
To run mocha from within gdb (notice _mocha and not mocha so that the tests run in the same process):
|
||||||
|
```bash
|
||||||
|
$ gdb --args node /path/to/_mocha -R spec integration/index.js
|
||||||
|
```
|
||||||
|
|
||||||
To run integration tests against testnet or livenet data:
|
To run integration tests against testnet or livenet data:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -176,7 +181,7 @@ $ cd /path/to/bitcoind.js
|
|||||||
$ ./bin/build-libbitcoind
|
$ ./bin/build-libbitcoind
|
||||||
```
|
```
|
||||||
|
|
||||||
The first argument is 'debug', this will compile node bindings and bitcoind with debug flags. The `PATCH_VERSION` file dictates what version/tag the patch goes clean against.
|
The `PATCH_VERSION` file dictates what version/tag the patch goes clean against.
|
||||||
|
|
||||||
There is a config_options.sh that has the configure options used to build libbitcoind. `make` will then compile `libbitcoind/src/.libs/libbitcoind.{so|dylib}`. This will completely ignore compiling tests, QT object files and the wallet features in `bitcoind/libbitcoind.{so|dylib}`.
|
There is a config_options.sh that has the configure options used to build libbitcoind. `make` will then compile `libbitcoind/src/.libs/libbitcoind.{so|dylib}`. This will completely ignore compiling tests, QT object files and the wallet features in `bitcoind/libbitcoind.{so|dylib}`.
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,7 @@ var fixtureData = {
|
|||||||
|
|
||||||
var bitcoind = require('../').daemon({
|
var bitcoind = require('../').daemon({
|
||||||
datadir: process.env.BITCOINDJS_DIR || '~/.bitcoin',
|
datadir: process.env.BITCOINDJS_DIR || '~/.bitcoin',
|
||||||
testnet: true
|
network: 'testnet'
|
||||||
});
|
});
|
||||||
|
|
||||||
bitcoind.on('error', function(err) {
|
bitcoind.on('error', function(err) {
|
||||||
|
|||||||
@ -3,6 +3,7 @@ set -e
|
|||||||
|
|
||||||
root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.."
|
root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/.."
|
||||||
cd "${root_dir}"
|
cd "${root_dir}"
|
||||||
|
options=`cat ${root_dir}/bin/config_options.sh`
|
||||||
|
|
||||||
os_dir=$(./platform/os.sh osdir)
|
os_dir=$(./platform/os.sh osdir)
|
||||||
|
|
||||||
@ -10,8 +11,13 @@ os_dir=$(./platform/os.sh osdir)
|
|||||||
export LD_LIBRARY_PATH="${root_dir}/libbitcoind/src/leveldb":"${os_dir}":$LD_LIBRARY_PATH
|
export LD_LIBRARY_PATH="${root_dir}/libbitcoind/src/leveldb":"${os_dir}":$LD_LIBRARY_PATH
|
||||||
|
|
||||||
debug=
|
debug=
|
||||||
if test x"$1" = x'debug'; then
|
if [ "${BITCOINDJS_ENV}" == "debug" ]; then
|
||||||
debug=--enable-debug
|
options=`cat ${root_dir}/bin/config_options_debug.sh`
|
||||||
|
fi
|
||||||
|
|
||||||
|
test=
|
||||||
|
if [ "${BITCOINDJS_ENV}" == "test" ]; then
|
||||||
|
options=`cat ${root_dir}/bin/config_options_test.sh`
|
||||||
fi
|
fi
|
||||||
|
|
||||||
btc_dir="${root_dir}/libbitcoind"
|
btc_dir="${root_dir}/libbitcoind"
|
||||||
@ -50,12 +56,11 @@ if [ "${only_make}" = false ]; then
|
|||||||
|
|
||||||
echo './autogen.sh'
|
echo './autogen.sh'
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
options=`cat ${root_dir}/bin/config_options.sh`
|
|
||||||
full_options="${options}${os_dir} ${debug}"
|
|
||||||
echo "running the configure script with the following options:\n :::[\"${full_options}\"]:::"
|
|
||||||
${full_options}
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
full_options="${options}${os_dir}"
|
||||||
|
echo "running the configure script with the following options:\n :::[\"${full_options}\"]:::"
|
||||||
|
${full_options}
|
||||||
echo 'make V=1'
|
echo 'make V=1'
|
||||||
make V=1
|
make V=1
|
||||||
|
|
||||||
|
|||||||
2
bin/config_options_debug.sh
Normal file
2
bin/config_options_debug.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
./configure --enable_debug --enable-tests=no --enable-daemonlib --with-gui=no --without-qt --without-miniupnpc --without-bdb --disable-wallet --without-utils --prefix=
|
||||||
|
|
||||||
2
bin/config_options_test.sh
Normal file
2
bin/config_options_test.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
./configure --enable-tests=no --enable-daemonlib --with-gui=no --without-qt --without-miniupnpc --prefix=
|
||||||
|
|
||||||
15
example/daemon.js
Normal file
15
example/daemon.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
process.title = 'bitcoind.js';
|
||||||
|
|
||||||
|
var daemon = require('../').daemon({
|
||||||
|
directory: process.env.BITCOINDJS_DIR || '~/.bitcoin'
|
||||||
|
});
|
||||||
|
|
||||||
|
daemon.on('error', function(err) {
|
||||||
|
daemon.log('error="%s"', err.message);
|
||||||
|
});
|
||||||
|
|
||||||
|
daemon.on('open', function(status) {
|
||||||
|
daemon.log('status="%s"', status);
|
||||||
|
});
|
||||||
@ -37,14 +37,6 @@ function Daemon(options) {
|
|||||||
|
|
||||||
this.options = options || {};
|
this.options = options || {};
|
||||||
|
|
||||||
if (typeof this.options === 'string') {
|
|
||||||
this.options = { datadir: this.options };
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.options.directory) {
|
|
||||||
this.options.datadir = this.options.directory;
|
|
||||||
delete this.options.directory;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.options.datadir) {
|
if (!this.options.datadir) {
|
||||||
this.options.datadir = '~/.bitcoind.js';
|
this.options.datadir = '~/.bitcoind.js';
|
||||||
@ -54,7 +46,13 @@ function Daemon(options) {
|
|||||||
|
|
||||||
this.datadir = this.options.datadir;
|
this.datadir = this.options.datadir;
|
||||||
this.config = this.datadir + '/bitcoin.conf';
|
this.config = this.datadir + '/bitcoin.conf';
|
||||||
this.network = Daemon[this.options.testnet ? 'testnet' : 'livenet'];
|
this.network = Daemon['livenet'];
|
||||||
|
|
||||||
|
if (this.options.network === 'testnet') {
|
||||||
|
this.network = Daemon['testnet'];
|
||||||
|
} else if(this.options.network === 'regtest') {
|
||||||
|
this.network = Daemon['regtest'];
|
||||||
|
}
|
||||||
|
|
||||||
if (!fs.existsSync(this.datadir)) {
|
if (!fs.existsSync(this.datadir)) {
|
||||||
mkdirp.sync(this.datadir);
|
mkdirp.sync(this.datadir);
|
||||||
@ -83,7 +81,6 @@ function Daemon(options) {
|
|||||||
fs.writeFileSync(data + peers);
|
fs.writeFileSync(data + peers);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy config into testnet dir
|
|
||||||
if (this.network.name === 'testnet') {
|
if (this.network.name === 'testnet') {
|
||||||
if (!fs.existsSync(this.datadir + '/testnet3')) {
|
if (!fs.existsSync(this.datadir + '/testnet3')) {
|
||||||
fs.mkdirSync(this.datadir + '/testnet3');
|
fs.mkdirSync(this.datadir + '/testnet3');
|
||||||
@ -93,6 +90,15 @@ function Daemon(options) {
|
|||||||
fs.readFileSync(this.config));
|
fs.readFileSync(this.config));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.network.name === 'regtest') {
|
||||||
|
if (!fs.existsSync(this.datadir + '/regtest')) {
|
||||||
|
fs.mkdirSync(this.datadir + '/regtest');
|
||||||
|
}
|
||||||
|
fs.writeFileSync(
|
||||||
|
this.datadir + '/regtest/bitcoin.conf',
|
||||||
|
fs.readFileSync(this.config));
|
||||||
|
}
|
||||||
|
|
||||||
Object.keys(exports).forEach(function(key) {
|
Object.keys(exports).forEach(function(key) {
|
||||||
self[key] = exports[key];
|
self[key] = exports[key];
|
||||||
});
|
});
|
||||||
@ -120,6 +126,13 @@ Daemon.testnet = {
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Bitcoin.regtest = {
|
||||||
|
name: 'regtest',
|
||||||
|
peers: [
|
||||||
|
// hardcoded peers
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
// Make sure signal handlers are not overwritten
|
// Make sure signal handlers are not overwritten
|
||||||
Daemon._signalQueue = [];
|
Daemon._signalQueue = [];
|
||||||
Daemon._processOn = process.on;
|
Daemon._processOn = process.on;
|
||||||
|
|||||||
@ -30,7 +30,6 @@
|
|||||||
"preinstall": "./bin/build-libbitcoind",
|
"preinstall": "./bin/build-libbitcoind",
|
||||||
"install": "./bin/build-bindings",
|
"install": "./bin/build-bindings",
|
||||||
"start": "node example",
|
"start": "node example",
|
||||||
"debug_install": "./bin/build-libbitcoind debug && ./bin/build-bindings debug",
|
|
||||||
"test": "NODE_ENV=test mocha --recursive",
|
"test": "NODE_ENV=test mocha --recursive",
|
||||||
"coverage": "istanbul cover _mocha -- --recursive"
|
"coverage": "istanbul cover _mocha -- --recursive"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -76,6 +76,7 @@ static volatile bool shutdown_complete = false;
|
|||||||
static char *g_data_dir = NULL;
|
static char *g_data_dir = NULL;
|
||||||
static bool g_rpc = false;
|
static bool g_rpc = false;
|
||||||
static bool g_testnet = false;
|
static bool g_testnet = false;
|
||||||
|
static bool g_regtest = false;
|
||||||
static bool g_txindex = false;
|
static bool g_txindex = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -105,6 +106,7 @@ struct async_node_data {
|
|||||||
std::string datadir;
|
std::string datadir;
|
||||||
bool rpc;
|
bool rpc;
|
||||||
bool testnet;
|
bool testnet;
|
||||||
|
bool regtest;
|
||||||
bool txindex;
|
bool txindex;
|
||||||
Eternal<Function> callback;
|
Eternal<Function> callback;
|
||||||
};
|
};
|
||||||
@ -298,6 +300,7 @@ NAN_METHOD(StartBitcoind) {
|
|||||||
std::string datadir = std::string("");
|
std::string datadir = std::string("");
|
||||||
bool rpc = false;
|
bool rpc = false;
|
||||||
bool testnet = false;
|
bool testnet = false;
|
||||||
|
bool regtest = false;
|
||||||
bool txindex = false;
|
bool txindex = false;
|
||||||
|
|
||||||
if (args.Length() >= 2 && args[0]->IsObject() && args[1]->IsFunction()) {
|
if (args.Length() >= 2 && args[0]->IsObject() && args[1]->IsFunction()) {
|
||||||
@ -309,8 +312,14 @@ NAN_METHOD(StartBitcoind) {
|
|||||||
if (options->Get(NanNew<String>("rpc"))->IsBoolean()) {
|
if (options->Get(NanNew<String>("rpc"))->IsBoolean()) {
|
||||||
rpc = options->Get(NanNew<String>("rpc"))->ToBoolean()->IsTrue();
|
rpc = options->Get(NanNew<String>("rpc"))->ToBoolean()->IsTrue();
|
||||||
}
|
}
|
||||||
if (options->Get(NanNew<String>("testnet"))->IsBoolean()) {
|
if (options->Get(NanNew<String>("network"))->IsString()) {
|
||||||
testnet = options->Get(NanNew<String>("testnet"))->ToBoolean()->IsTrue();
|
String::Utf8Value network_(options->Get(NanNew<String>("network"))->ToString());
|
||||||
|
std::string network = std::string(*network_);
|
||||||
|
if (network == "testnet") {
|
||||||
|
testnet = true;
|
||||||
|
} else if (network == "regtest") {
|
||||||
|
regtest = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (options->Get(NanNew<String>("txindex"))->IsBoolean()) {
|
if (options->Get(NanNew<String>("txindex"))->IsBoolean()) {
|
||||||
txindex = options->Get(NanNew<String>("txindex"))->ToBoolean()->IsTrue();
|
txindex = options->Get(NanNew<String>("txindex"))->ToBoolean()->IsTrue();
|
||||||
@ -337,6 +346,7 @@ NAN_METHOD(StartBitcoind) {
|
|||||||
data->datadir = datadir;
|
data->datadir = datadir;
|
||||||
data->rpc = rpc;
|
data->rpc = rpc;
|
||||||
data->testnet = testnet;
|
data->testnet = testnet;
|
||||||
|
data->regtest = regtest;
|
||||||
data->txindex = txindex;
|
data->txindex = txindex;
|
||||||
|
|
||||||
Eternal<Function> eternal(isolate, callback);
|
Eternal<Function> eternal(isolate, callback);
|
||||||
@ -370,6 +380,7 @@ async_start_node(uv_work_t *req) {
|
|||||||
}
|
}
|
||||||
g_rpc = (bool)data->rpc;
|
g_rpc = (bool)data->rpc;
|
||||||
g_testnet = (bool)data->testnet;
|
g_testnet = (bool)data->testnet;
|
||||||
|
g_regtest = (bool)data->regtest;
|
||||||
g_txindex = (bool)data->txindex;
|
g_txindex = (bool)data->txindex;
|
||||||
tcgetattr(STDIN_FILENO, &orig_termios);
|
tcgetattr(STDIN_FILENO, &orig_termios);
|
||||||
start_node();
|
start_node();
|
||||||
@ -475,6 +486,11 @@ start_node_thread(void) {
|
|||||||
argc++;
|
argc++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_regtest) {
|
||||||
|
argv[argc] = (char *)"-regtest";
|
||||||
|
argc++;
|
||||||
|
}
|
||||||
|
|
||||||
argv[argc] = (char *)"-txindex";
|
argv[argc] = (char *)"-txindex";
|
||||||
argc++;
|
argc++;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user