fcoin/test/util/node-context.js
2017-01-30 19:44:50 -08:00

151 lines
3.0 KiB
JavaScript

'use strict';
var assert = require('assert');
var FullNode = require('../../lib/node/fullnode');
var Network = require('../../lib/protocol/network');
var co = require('../../lib/utils/co');
var Logger = require('../../lib/node/logger');
function NodeContext(network, size) {
if (!(this instanceof NodeContext))
return new NodeContext(network, size);
this.network = Network.get(network);
this.size = size || 4;
this.nodes = [];
this.init();
};
NodeContext.prototype.init = function() {
var i, port, last, node;
for (i = 0; i < this.size; i++) {
port = this.network.port + i;
last = port - 1;
if (last < this.network.port) {
// last = this.network.port + this.size - 1;
last = port;
}
node = new FullNode({
network: this.network,
db: 'memory',
network: 'regtest',
logger: new Logger({
level: 'debug',
file: false,
console: false
}),
listen: true,
publicHost: '127.0.0.1',
publicPort: port,
httpPort: port + 100,
host: '127.0.0.1',
port: port,
seeds: [
'127.0.0.1:' + last
]
});
node.on('error', function(err) {
node.logger.error(err);
});
this.nodes.push(node);
}
};
NodeContext.prototype.open = function open() {
var jobs = [];
var i, node;
for (i = 0; i < this.nodes.length; i++) {
node = this.nodes[i];
jobs.push(node.open());
}
return Promise.all(jobs);
};
NodeContext.prototype.close = function close() {
var jobs = [];
var i, node;
for (i = 0; i < this.nodes.length; i++) {
node = this.nodes[i];
jobs.push(node.close());
}
return Promise.all(jobs);
};
NodeContext.prototype.connect = co(function* connect() {
var i, node;
for (i = 0; i < this.nodes.length; i++) {
node = this.nodes[i];
yield node.connect();
yield co.timeout(1000);
}
});
NodeContext.prototype.disconnect = co(function* disconnect() {
var i, node;
for (i = this.nodes.length - 1; i >= 0; i--) {
node = this.nodes[i];
yield node.disconnect();
yield co.timeout(1000);
}
});
NodeContext.prototype.startSync = function startSync() {
var jobs = [];
var i, node;
for (i = 0; i < this.nodes.length; i++) {
node = this.nodes[i];
node.chain.synced = true;
node.chain.emit('full');
node.startSync();
}
};
NodeContext.prototype.stopSync = function stopSync() {
var jobs = [];
var i, node;
for (i = 0; i < this.nodes.length; i++) {
node = this.nodes[i];
node.stopSync();
}
};
NodeContext.prototype.generate = co(function* generate(index, blocks) {
var node = this.nodes[index];
var i, block;
assert(node);
for (i = 0; i < blocks; i++) {
block = yield node.miner.mineBlock();
yield node.chain.add(block);
}
});
NodeContext.prototype.height = function height(index) {
var node = this.nodes[index];
assert(node);
return node.chain.height;
};
NodeContext.prototype.sync = co(function* sync() {
yield co.timeout(3000);
});
module.exports = NodeContext;