Skip to content
This repository has been archived by the owner on Jun 11, 2024. It is now read-only.

Fix transaction pool bug in "transactionInPool" plus tests - Closes #707 #708

Closed
wants to merge 13 commits into from
4 changes: 3 additions & 1 deletion logic/transactionPool.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,9 @@ TransactionPool.prototype.transactionInPool = function (id) {
self.bundled.index[id],
self.queued.index[id],
self.multisignature.index[id]
].filter(Boolean).length > 0;
].some(function (index) {
return typeof(index) === 'number';
});
};

/**
Expand Down
1 change: 1 addition & 0 deletions test/unit/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ require('./logic/blockReward.js');
require('./logic/peer');
require('./logic/peers');
require('./logic/transaction');
require('./logic/transactionPool');
require('./logic/transfer');
require('./logic/vote');

Expand Down
121 changes: 121 additions & 0 deletions test/unit/logic/transactionPool.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
'use strict';/*eslint*/

var TransactionPool = require('../../../logic/transactionPool');
var TransactionLogic = require('../../../logic/transaction');
var DelegateModule = require('../../../modules/delegates');

var TransferLogic = require('../../../logic/transfer');

var transactionTypes = require('../../../helpers/transactionTypes');
var AccountModule = require('../../../modules/accounts');
var BlocksModule = require('../../../modules/blocks');
var AccountLogic = require('../../../logic/account');
var modulesLoader = require('../../common/initModule').modulesLoader;
var async = require('async');
var expect = require('chai').expect;
var node = require('../../node');

describe('transactionPool', function () {

var txPool;

before(function (done) {
// Init transaction logic
async.auto({
accountLogic: function (cb) {
modulesLoader.initLogicWithDb(AccountLogic, cb);
},
blockModule: ['accountLogic', function (result, cb) {
modulesLoader.initModuleWithDb(BlocksModule, cb, {
logic: { /* dependencies not included */ },
});
}],
transactionLogic: ['accountLogic', function (result, cb) {
modulesLoader.initLogicWithDb(TransactionLogic, cb, {
account: result.accountLogic
});
}],
delegateModule: ['transactionLogic', function (result, cb) {
modulesLoader.initModuleWithDb(DelegateModule, cb, {
logic: {
transaction: result.transactionLogic
}
});
}],
}, function (err, result) {
modulesLoader.initModuleWithDb(AccountModule, function (err, __accountModule) {
expect(err).to.not.exist;

var account = __accountModule;
var accountLogic = result.accountLogic;

// For correctly initializing setting blocks module
result.blockModule.lastBlock.set({ height: 10 });

result.delegateModule.onBind({
accounts: __accountModule,
blocks: result.blockModule
});
var sendLogic = result.transactionLogic.attachAssetType(transactionTypes.SEND, new TransferLogic());
sendLogic.bind(account);

account.onBind({
delegates: result.delegateModule,
accounts: account,
});

var accountModuleDependencies = result;
txPool = new TransactionPool(
modulesLoader.scope.config.broadcasts.broadcastInterval,
modulesLoader.scope.config.broadcasts.releaseLimit,
result.transactionLogic,
modulesLoader.scope.bus, // Bus
modulesLoader.logger // Logger
);
txPool.bind(account, null, modulesLoader.scope.loader);
done();
}, {
logic: {
account: result.accountLogic,
transaction: result.transactionLogic
}
});
});
});

describe('receiveTransactions', function () {

it('should do nothing for empty array', function (done) {
txPool.receiveTransactions([], false, function (err, data) {
expect(err).to.not.exist;
expect(data).to.be.empty;
done();
});
});

it('should return error for invalid tx', function (done) {
txPool.receiveTransactions([{ id: '123' }], false, function (err, data) {
expect(err).to.exist;
done();
});
});

it('should process tx if valid and insert tx into queue', function (done) {
var account = node.randomAccount();
const tx = node.lisk.transaction.createTransaction(account.address, 100000000000, node.gAccount.password);

txPool.receiveTransactions([tx], false, function (err, data) {
expect(err).to.not.exist;
expect(txPool.transactionInPool(tx.id)).to.be.true;
done();
});
});
});

describe('transactionInPool', function () {

it('should return false for an unknown id', function () {
expect(txPool.transactionInPool('11111')).to.be.false;
});
});
});