all test working again with level DB
This commit is contained in:
parent
e4095cbf8e
commit
548572bfa3
|
@ -63,7 +63,6 @@ function spec() {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
|
||||||
txOut.forEach(function(txItem){
|
txOut.forEach(function(txItem){
|
||||||
|
|
||||||
var v = parseInt(txItem.value_sat);
|
var v = parseInt(txItem.value_sat);
|
||||||
|
|
||||||
self.totalReceivedSat += v;
|
self.totalReceivedSat += v;
|
||||||
|
@ -76,7 +75,7 @@ function spec() {
|
||||||
else {
|
else {
|
||||||
// spent
|
// spent
|
||||||
self.totalSentSat += v;
|
self.totalSentSat += v;
|
||||||
self.transactions.push(txItem.spendTxid);
|
self.transactions.push(txItem.spendTxId);
|
||||||
self.txApperances +=2;
|
self.txApperances +=2;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -18,8 +18,12 @@ function spec() {
|
||||||
BitcoreBlock= require('bitcore/Block').class(),
|
BitcoreBlock= require('bitcore/Block').class(),
|
||||||
config = require('../config/config');
|
config = require('../config/config');
|
||||||
|
|
||||||
var BlockDb = function() {
|
var BlockDb = function(db) {
|
||||||
this.db = levelup(config.leveldb + '/blocks');
|
this.db = db || levelup(config.leveldb + '/blocks');
|
||||||
|
};
|
||||||
|
|
||||||
|
BlockDb.prototype.close = function(cb) {
|
||||||
|
this.db.close(cb);
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockDb.prototype.drop = function(cb) {
|
BlockDb.prototype.drop = function(cb) {
|
||||||
|
|
19
lib/Sync.js
19
lib/Sync.js
|
@ -13,7 +13,7 @@ function spec() {
|
||||||
|
|
||||||
|
|
||||||
function Sync() {
|
function Sync() {
|
||||||
this.blockDb = new BlockDb();
|
this.bDb = new BlockDb();
|
||||||
this.txDb = new TransactionDb();
|
this.txDb = new TransactionDb();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,17 +52,18 @@ function spec() {
|
||||||
else return cb();
|
else return cb();
|
||||||
};
|
};
|
||||||
|
|
||||||
Sync.prototype.close = function() {
|
Sync.prototype.close = function(cb) {
|
||||||
if ( this.db && this.db.readyState ) {
|
var self = this;
|
||||||
this.db.close();
|
self.txDb.close(function() {
|
||||||
}
|
self.bDb.close(cb);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
Sync.prototype.destroy = function(next) {
|
Sync.prototype.destroy = function(next) {
|
||||||
var self = this;
|
var self = this;
|
||||||
async.series([
|
async.series([
|
||||||
function(b) { self.blockDb.drop(b); },
|
function(b) { self.bDb.drop(b); },
|
||||||
function(b) { self.txDb.drop(b); },
|
function(b) { self.txDb.drop(b); },
|
||||||
], next);
|
], next);
|
||||||
};
|
};
|
||||||
|
@ -74,7 +75,7 @@ function spec() {
|
||||||
self.txDb.createFromBlock(block, function(err, insertedTxs, updateAddrs) {
|
self.txDb.createFromBlock(block, function(err, insertedTxs, updateAddrs) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
|
||||||
self.blockDb.add(block, function(err){
|
self.bDb.add(block, function(err){
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
self._handleBroadcast(block, insertedTxs, updateAddrs);
|
self._handleBroadcast(block, insertedTxs, updateAddrs);
|
||||||
return cb();
|
return cb();
|
||||||
|
@ -100,13 +101,13 @@ console.log('[Sync.js.109] WARN: Reach reog depth limit'); //TODO
|
||||||
},
|
},
|
||||||
function (w_c) {
|
function (w_c) {
|
||||||
//check with RPC if the block is mainchain
|
//check with RPC if the block is mainchain
|
||||||
self.blockDb.fromHashWithInfo(hash, function (err, info) {
|
self.bDb.fromHashWithInfo(hash, function (err, info) {
|
||||||
|
|
||||||
if (!info) {
|
if (!info) {
|
||||||
console.log('[Sync.js.107:hash:ORPHAN]',hash); //TODO
|
console.log('[Sync.js.107:hash:ORPHAN]',hash); //TODO
|
||||||
self.txDb.setOrphan(hash, function(err) {
|
self.txDb.setOrphan(hash, function(err) {
|
||||||
if (err) return w_c(err);
|
if (err) return w_c(err);
|
||||||
self.blockDb.setOrphan(hash, function(err, prevHash){
|
self.bDb.setOrphan(hash, function(err, prevHash){
|
||||||
hash = prevHash;
|
hash = prevHash;
|
||||||
return w_c(err);
|
return w_c(err);
|
||||||
});
|
});
|
||||||
|
|
|
@ -6,7 +6,7 @@ require('classtool');
|
||||||
function spec() {
|
function spec() {
|
||||||
|
|
||||||
// blockHash -> txid mapping (to reorgs)
|
// blockHash -> txid mapping (to reorgs)
|
||||||
var ROOT = 'tx-b-'; //tx-b-<txid>-<block> => 1
|
var ROOT = 'tx-b-'; //tx-b-<txid>-<block> => 1/0 (connected or not)
|
||||||
|
|
||||||
// to show tx outs
|
// to show tx outs
|
||||||
var OUTS_ROOT = 'txouts-'; //txouts-<txid>-<n> => [addr, btc_sat]
|
var OUTS_ROOT = 'txouts-'; //txouts-<txid>-<n> => [addr, btc_sat]
|
||||||
|
@ -29,8 +29,12 @@ function spec() {
|
||||||
config = require('../config/config'),
|
config = require('../config/config'),
|
||||||
assert = require('assert');
|
assert = require('assert');
|
||||||
|
|
||||||
var TransactionDb = function() {
|
var TransactionDb = function(db) {
|
||||||
this.db = levelup(config.leveldb + '/txs');
|
this.db = db || levelup(config.leveldb + '/txs');
|
||||||
|
};
|
||||||
|
|
||||||
|
TransactionDb.prototype.close = function(cb) {
|
||||||
|
this.db.close(cb);
|
||||||
};
|
};
|
||||||
|
|
||||||
TransactionDb.prototype.drop = function(cb) {
|
TransactionDb.prototype.drop = function(cb) {
|
||||||
|
@ -221,7 +225,6 @@ function spec() {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
function(err) {
|
function(err) {
|
||||||
console.log('[TransactionDb.js.165]', ret); //TODO
|
|
||||||
return cb(err,ret);
|
return cb(err,ret);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -20,6 +20,11 @@ describe('TransactionDb fromIdWithInfo', function(){
|
||||||
return c();
|
return c();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
after(function(c) {
|
||||||
|
txDb.close(c);
|
||||||
|
});
|
||||||
|
|
||||||
var txid = '7e621eeb02874ab039a8566fd36f4591e65eca65313875221842c53de6907d6c';
|
var txid = '7e621eeb02874ab039a8566fd36f4591e65eca65313875221842c53de6907d6c';
|
||||||
it('tx info ' + txid, function(done) {
|
it('tx info ' + txid, function(done) {
|
||||||
txDb.fromIdWithInfo(txid, function(err, tx) {
|
txDb.fromIdWithInfo(txid, function(err, tx) {
|
||||||
|
@ -116,6 +121,16 @@ describe('TransactionDb fromIdWithInfo', function(){
|
||||||
|
|
||||||
describe('TransactionDb Outs', function(){
|
describe('TransactionDb Outs', function(){
|
||||||
|
|
||||||
|
before(function(c) {
|
||||||
|
txDb = new TransactionDb();
|
||||||
|
return c();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
after(function(c) {
|
||||||
|
txDb.close(c);
|
||||||
|
});
|
||||||
|
|
||||||
txItemsValid.forEach( function(v) {
|
txItemsValid.forEach( function(v) {
|
||||||
if (v.disabled) return;
|
if (v.disabled) return;
|
||||||
it('test a processing tx ' + v.txid, function(done) {
|
it('test a processing tx ' + v.txid, function(done) {
|
||||||
|
|
|
@ -15,37 +15,43 @@ var
|
||||||
|
|
||||||
var spentValid = JSON.parse(fs.readFileSync('test/integration/spent.json'));
|
var spentValid = JSON.parse(fs.readFileSync('test/integration/spent.json'));
|
||||||
|
|
||||||
describe('TransactionDb Expenses', function(){
|
var txDb;
|
||||||
var tdb = new TransactionDb();
|
|
||||||
|
|
||||||
before(function(done) {
|
describe('TransactionDb Expenses', function(){
|
||||||
|
|
||||||
|
before(function(c) {
|
||||||
|
txDb = new TransactionDb();
|
||||||
|
|
||||||
// lets spend!
|
// lets spend!
|
||||||
async.each(Object.keys(spentValid),
|
async.each(Object.keys(spentValid),
|
||||||
function(txid,c_out) {
|
function(txid,c_out) {
|
||||||
async.each(spentValid[txid],
|
async.each(spentValid[txid],
|
||||||
function(i,c_in) {
|
function(i,c_in) {
|
||||||
tdb.createFromArray([i.txid], null, function(err) {
|
txDb.createFromArray([i.txid], null, function(err) {
|
||||||
return c_in();
|
return c_in();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
function(err) {
|
function(err) {
|
||||||
console.log('Done spending ', txid); //TODO
|
|
||||||
return c_out();
|
return c_out();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
function(err) {
|
function(err) {
|
||||||
return done();
|
return c();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
after(function(c) {
|
||||||
|
txDb.close(c);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
Object.keys(spentValid).forEach( function(txid) {
|
Object.keys(spentValid).forEach( function(txid) {
|
||||||
it('test result of spending tx ' + txid, function(done) {
|
it('test result of spending tx ' + txid, function(done) {
|
||||||
var s = spentValid[txid];
|
var s = spentValid[txid];
|
||||||
var c=0;
|
var c=0;
|
||||||
tdb.fromTxId( txid, function(err, readItems) {
|
txDb.fromTxId( txid, function(err, readItems) {
|
||||||
s.forEach( function(v) {
|
s.forEach( function(v) {
|
||||||
assert.equal(readItems[c].spendTxId,v.txid);
|
assert.equal(readItems[c].spendTxId,v.txid);
|
||||||
assert.equal(readItems[c].spendIndex,v.n);
|
assert.equal(readItems[c].spendIndex,v.n);
|
||||||
|
|
|
@ -17,6 +17,11 @@ describe('Address balances', function(){
|
||||||
return c();
|
return c();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
after(function(c) {
|
||||||
|
txDb.close(c);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
addrValid.forEach( function(v) {
|
addrValid.forEach( function(v) {
|
||||||
if (v.disabled) {
|
if (v.disabled) {
|
||||||
|
@ -43,7 +48,7 @@ describe('Address balances', function(){
|
||||||
if (v.transactions) {
|
if (v.transactions) {
|
||||||
|
|
||||||
v.transactions.forEach( function(tx) {
|
v.transactions.forEach( function(tx) {
|
||||||
assert(a.transactions.indexOf(tx)>-1);
|
assert(a.transactions.indexOf(tx)>-1,'have tx '+tx);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
done();
|
done();
|
||||||
|
|
|
@ -37,14 +37,14 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"addr": "mgqvRGJMwR9JU5VhJ3x9uX9MTkzTsmmDgQ",
|
"addr": "mgqvRGJMwR9JU5VhJ3x9uX9MTkzTsmmDgQ",
|
||||||
"balance": 43.1,
|
"txApperances": 27,
|
||||||
"txApperances": 19
|
"balance": 5.1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"addr": "mzW2hdZN2um7WBvTDerdahKqRgj3md9C29",
|
"addr": "mzW2hdZN2um7WBvTDerdahKqRgj3md9C29",
|
||||||
"txApperances": 2034,
|
"txApperances": 6033,
|
||||||
"balance": 1049.69744099,
|
"balance": 1049.69744101,
|
||||||
"totalReceived": 1049.69744099,
|
"totalReceived": 1049.69744101,
|
||||||
"totalSent": 0
|
"totalSent": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -67,6 +67,7 @@
|
||||||
"balance": 10580.50027254,
|
"balance": 10580.50027254,
|
||||||
"totalReceived": 12157.65075053,
|
"totalReceived": 12157.65075053,
|
||||||
"totalSent": 1577.15047799,
|
"totalSent": 1577.15047799,
|
||||||
|
"txApperances": 459,
|
||||||
"transactions": [
|
"transactions": [
|
||||||
"91800d80bb4c69b238c9bfd94eb5155ab821e6b25cae5c79903d12853bbb4ed5",
|
"91800d80bb4c69b238c9bfd94eb5155ab821e6b25cae5c79903d12853bbb4ed5",
|
||||||
"f6e80d4fd1a2377406856c67d0cee5ac7e5120993ff97e617ca9aac33b4c6b1e",
|
"f6e80d4fd1a2377406856c67d0cee5ac7e5120993ff97e617ca9aac33b4c6b1e",
|
||||||
|
|
|
@ -11,12 +11,23 @@ var
|
||||||
config = require('../../config/config'),
|
config = require('../../config/config'),
|
||||||
BlockDb = require('../../lib/BlockDb').class();
|
BlockDb = require('../../lib/BlockDb').class();
|
||||||
|
|
||||||
|
var bDb;
|
||||||
|
|
||||||
describe('BlockDb fromHashWithInfo', function(){
|
describe('BlockDb fromHashWithInfo', function(){
|
||||||
|
|
||||||
var bdb = new BlockDb();
|
|
||||||
|
before(function(c) {
|
||||||
|
bDb = new BlockDb();
|
||||||
|
return c();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
after(function(c) {
|
||||||
|
bDb.close(c);
|
||||||
|
});
|
||||||
|
|
||||||
it('should poll block\'s info from bitcoind', function(done) {
|
it('should poll block\'s info from bitcoind', function(done) {
|
||||||
bdb.fromHashWithInfo(TESTING_BLOCK, function(err, b2) {
|
bDb.fromHashWithInfo(TESTING_BLOCK, function(err, b2) {
|
||||||
if (err) done(err);
|
if (err) done(err);
|
||||||
assert.equal(b2.hash, TESTING_BLOCK);
|
assert.equal(b2.hash, TESTING_BLOCK);
|
||||||
assert.equal(b2.info.hash, TESTING_BLOCK);
|
assert.equal(b2.info.hash, TESTING_BLOCK);
|
||||||
|
@ -25,7 +36,7 @@ describe('BlockDb fromHashWithInfo', function(){
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it('return true in has', function(done) {
|
it('return true in has', function(done) {
|
||||||
bdb.has(TESTING_BLOCK, function(err, has) {
|
bDb.has(TESTING_BLOCK, function(err, has) {
|
||||||
assert.equal(has, true);
|
assert.equal(has, true);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -34,12 +45,12 @@ describe('BlockDb fromHashWithInfo', function(){
|
||||||
var b16 = '00000000c4cbd75af741f3a2b2ff72d9ed4d83a048462c1efe331be31ccf006b';
|
var b16 = '00000000c4cbd75af741f3a2b2ff72d9ed4d83a048462c1efe331be31ccf006b';
|
||||||
var b17 = '00000000fe198cce4c8abf9dca0fee1182cb130df966cc428ad2a230df8da743';
|
var b17 = '00000000fe198cce4c8abf9dca0fee1182cb130df966cc428ad2a230df8da743';
|
||||||
|
|
||||||
bdb.has(b17, function(err, has) {
|
bDb.has(b17, function(err, has) {
|
||||||
assert(has);
|
assert(has);
|
||||||
bdb.setOrphan(b17, function(err, oldPrev) {
|
bDb.setOrphan(b17, function(err, oldPrev) {
|
||||||
assert.equal(oldPrev, b16);
|
assert.equal(oldPrev, b16);
|
||||||
bdb.setPrev(b17, b16, function(err, oldPrev) {
|
bDb.setPrev(b17, b16, function(err, oldPrev) {
|
||||||
bdb.getPrev(b17, function(err, p) {
|
bDb.getPrev(b17, function(err, p) {
|
||||||
assert.equal(p, b16);
|
assert.equal(p, b16);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,7 +13,7 @@ var assert = require('assert'),
|
||||||
|
|
||||||
//var txItemsValid = JSON.parse(fs.readFileSync('test/model/txitems.json'));
|
//var txItemsValid = JSON.parse(fs.readFileSync('test/model/txitems.json'));
|
||||||
|
|
||||||
describe('TransactionOut', function(){
|
describe('BlockExtractor', function(){
|
||||||
|
|
||||||
var be = new BlockExtractor(config.bitcoind.dataDir, config.network);
|
var be = new BlockExtractor(config.bitcoind.dataDir, config.network);
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ describe('TransactionOut', function(){
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read 100000 blocks with no error ', function(done) {
|
it.skip('should read 100000 blocks with no error ', function(done) {
|
||||||
|
|
||||||
var i=0;
|
var i=0;
|
||||||
while(i++<100000) {
|
while(i++<100000) {
|
||||||
|
|
|
@ -1,25 +1,13 @@
|
||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
'use strict';
|
||||||
|
|
||||||
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
|
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
|
||||||
|
|
||||||
var
|
var assert = require('assert'),
|
||||||
assert = require('assert'),
|
Status = require('../../app/models/Status').class();
|
||||||
config = require('../../config/config'),
|
|
||||||
Status = require('../../app/models/Status').class(),
|
|
||||||
mongoose= require('mongoose');
|
|
||||||
|
|
||||||
describe('Status', function(){
|
describe('Status', function(){
|
||||||
|
|
||||||
before(function(done) {
|
|
||||||
mongoose.connect(config.db);
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
|
|
||||||
after(function(done) {
|
|
||||||
mongoose.connection.close();
|
|
||||||
done();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('getInfo', function(done) {
|
it('getInfo', function(done) {
|
||||||
var d = new Status();
|
var d = new Status();
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ var b = [
|
||||||
|
|
||||||
var fix = function(s,cb) {
|
var fix = function(s,cb) {
|
||||||
async.each([1,2,3,4], function(i,c) {
|
async.each([1,2,3,4], function(i,c) {
|
||||||
s.blockDb.setPrev(b[i],b[i-1], function() {
|
s.bDb.setPrev(b[i],b[i-1], function() {
|
||||||
return c();
|
return c();
|
||||||
});
|
});
|
||||||
}, cb);
|
}, cb);
|
||||||
|
@ -28,12 +28,12 @@ var fix = function(s,cb) {
|
||||||
|
|
||||||
var test = function(s,cb) {
|
var test = function(s,cb) {
|
||||||
async.each([2,3,4], function(i,c) {
|
async.each([2,3,4], function(i,c) {
|
||||||
s.blockDb.getPrev(b[i], function(err, p) {
|
s.bDb.getPrev(b[i], function(err, p) {
|
||||||
assert.equal(p,0);
|
assert.equal(p,0);
|
||||||
return c();
|
return c();
|
||||||
});
|
});
|
||||||
}, function() {
|
}, function() {
|
||||||
s.blockDb.getPrev(b[1], function(err, p) {
|
s.bDb.getPrev(b[1], function(err, p) {
|
||||||
assert.equal(p,b[0]);
|
assert.equal(p,b[0]);
|
||||||
return cb();
|
return cb();
|
||||||
});
|
});
|
||||||
|
@ -44,12 +44,12 @@ var test = function(s,cb) {
|
||||||
|
|
||||||
var testNo = function(s,cb) {
|
var testNo = function(s,cb) {
|
||||||
async.each([2,3,4], function(i,c) {
|
async.each([2,3,4], function(i,c) {
|
||||||
s.blockDb.getPrev(b[i], function(err, p) {
|
s.bDb.getPrev(b[i], function(err, p) {
|
||||||
assert.equal(p,b[i-1]);
|
assert.equal(p,b[i-1]);
|
||||||
return c();
|
return c();
|
||||||
});
|
});
|
||||||
}, function() {
|
}, function() {
|
||||||
s.blockDb.getPrev(b[1], function(err, p) {
|
s.bDb.getPrev(b[1], function(err, p) {
|
||||||
assert.equal(p,b[0]);
|
assert.equal(p,b[0]);
|
||||||
return cb();
|
return cb();
|
||||||
});
|
});
|
||||||
|
@ -68,15 +68,19 @@ describe('Sync checkOrphan', function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
after(function(done) {
|
after(function(done) {
|
||||||
fix(s,done);
|
|
||||||
|
fix(s,function() {
|
||||||
|
s.close(done);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('checkOrphan', function(done) {
|
it('checkOrphan', function(done) {
|
||||||
this.timeout(100000);
|
this.timeout(100000);
|
||||||
|
|
||||||
s.blockDb.has(b[0], function(err, has) {
|
s.bDb.has(b[0], function(err, has) {
|
||||||
assert(has);
|
assert(has);
|
||||||
s.blockDb.has(b[1], function(err, has) {
|
s.bDb.has(b[1], function(err, has) {
|
||||||
assert(has);
|
assert(has);
|
||||||
s.checkOrphan(b[4],b[1], function() {
|
s.checkOrphan(b[4],b[1], function() {
|
||||||
testNo(s,done);
|
testNo(s,done);
|
||||||
|
|
Loading…
Reference in New Issue