diff --git a/test/util/node-context.js b/test/util/node-context.js new file mode 100644 index 00000000..80ea1ccf --- /dev/null +++ b/test/util/node-context.js @@ -0,0 +1,150 @@ +'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;