|
|
|
@ -206,6 +206,7 @@ describe('PendingTransactionTracker', function () { |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
describe('#resubmitPendingTxs', function () { |
|
|
|
|
const blockStub = { number: '0x0' }; |
|
|
|
|
beforeEach(function () { |
|
|
|
|
const txMeta2 = txMeta3 = txMeta |
|
|
|
|
txList = [txMeta, txMeta2, txMeta3].map((tx) => { |
|
|
|
@ -223,7 +224,7 @@ describe('PendingTransactionTracker', function () { |
|
|
|
|
Promise.all(txList.map((tx) => tx.processed)) |
|
|
|
|
.then((txCompletedList) => done()) |
|
|
|
|
.catch(done) |
|
|
|
|
pendingTxTracker.resubmitPendingTxs() |
|
|
|
|
pendingTxTracker.resubmitPendingTxs(blockStub) |
|
|
|
|
}) |
|
|
|
|
it('should not emit \'tx:failed\' if the txMeta throws a known txError', function (done) { |
|
|
|
|
knownErrors =[ |
|
|
|
@ -250,7 +251,7 @@ describe('PendingTransactionTracker', function () { |
|
|
|
|
.then((txCompletedList) => done()) |
|
|
|
|
.catch(done) |
|
|
|
|
|
|
|
|
|
pendingTxTracker.resubmitPendingTxs() |
|
|
|
|
pendingTxTracker.resubmitPendingTxs(blockStub) |
|
|
|
|
}) |
|
|
|
|
it('should emit \'tx:warning\' if it encountered a real error', function (done) { |
|
|
|
|
pendingTxTracker.once('tx:warning', (txMeta, err) => { |
|
|
|
@ -268,28 +269,74 @@ describe('PendingTransactionTracker', function () { |
|
|
|
|
.then((txCompletedList) => done()) |
|
|
|
|
.catch(done) |
|
|
|
|
|
|
|
|
|
pendingTxTracker.resubmitPendingTxs() |
|
|
|
|
pendingTxTracker.resubmitPendingTxs(blockStub) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
describe('#_resubmitTx', function () { |
|
|
|
|
it('should publishing the transaction', function (done) { |
|
|
|
|
const enoughBalance = '0x100000' |
|
|
|
|
pendingTxTracker.getBalance = (address) => { |
|
|
|
|
assert.equal(address, txMeta.txParams.from, 'Should pass the address') |
|
|
|
|
return enoughBalance |
|
|
|
|
} |
|
|
|
|
pendingTxTracker.publishTransaction = async (rawTx) => { |
|
|
|
|
assert.equal(rawTx, txMeta.rawTx, 'Should pass the rawTx') |
|
|
|
|
} |
|
|
|
|
const mockFirstRetryBlockNumber = '0x1' |
|
|
|
|
let txMetaToTestExponentialBackoff |
|
|
|
|
|
|
|
|
|
// Stubbing out current account state:
|
|
|
|
|
// Adding the fake tx:
|
|
|
|
|
pendingTxTracker._resubmitTx(txMeta) |
|
|
|
|
.then(() => done()) |
|
|
|
|
.catch((err) => { |
|
|
|
|
assert.ifError(err, 'should not throw an error') |
|
|
|
|
done(err) |
|
|
|
|
beforeEach(() => { |
|
|
|
|
pendingTxTracker.getBalance = (address) => { |
|
|
|
|
assert.equal(address, txMeta.txParams.from, 'Should pass the address') |
|
|
|
|
return enoughBalance |
|
|
|
|
} |
|
|
|
|
pendingTxTracker.publishTransaction = async (rawTx) => { |
|
|
|
|
assert.equal(rawTx, txMeta.rawTx, 'Should pass the rawTx') |
|
|
|
|
} |
|
|
|
|
sinon.spy(pendingTxTracker, 'publishTransaction') |
|
|
|
|
|
|
|
|
|
txMetaToTestExponentialBackoff = Object.assign({}, txMeta, { |
|
|
|
|
retryCount: 4, |
|
|
|
|
firstRetryBlockNumber: mockFirstRetryBlockNumber, |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
afterEach(() => { |
|
|
|
|
pendingTxTracker.publishTransaction.reset() |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should publish the transaction', function (done) { |
|
|
|
|
const enoughBalance = '0x100000' |
|
|
|
|
|
|
|
|
|
// Stubbing out current account state:
|
|
|
|
|
// Adding the fake tx:
|
|
|
|
|
pendingTxTracker._resubmitTx(txMeta) |
|
|
|
|
.then(() => done()) |
|
|
|
|
.catch((err) => { |
|
|
|
|
assert.ifError(err, 'should not throw an error') |
|
|
|
|
done(err) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
assert.equal(pendingTxTracker.publishTransaction.callCount, 1, 'Should call publish transaction') |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should not publish the transaction if the limit of retries has been exceeded', function (done) { |
|
|
|
|
const enoughBalance = '0x100000' |
|
|
|
|
const mockLatestBlockNumber = '0x5' |
|
|
|
|
|
|
|
|
|
pendingTxTracker._resubmitTx(txMetaToTestExponentialBackoff, mockLatestBlockNumber) |
|
|
|
|
.then(() => done()) |
|
|
|
|
.catch((err) => { |
|
|
|
|
assert.ifError(err, 'should not throw an error') |
|
|
|
|
done(err) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
assert.equal(pendingTxTracker.publishTransaction.callCount, 0, 'Should NOT call publish transaction') |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
it('should publish the transaction if the number of blocks since last retry exceeds the last set limit', function (done) { |
|
|
|
|
const enoughBalance = '0x100000' |
|
|
|
|
const mockLatestBlockNumber = '0x11' |
|
|
|
|
|
|
|
|
|
pendingTxTracker._resubmitTx(txMetaToTestExponentialBackoff, mockLatestBlockNumber) |
|
|
|
|
.then(() => done()) |
|
|
|
|
.catch((err) => { |
|
|
|
|
assert.ifError(err, 'should not throw an error') |
|
|
|
|
done(err) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
assert.equal(pendingTxTracker.publishTransaction.callCount, 1, 'Should call publish transaction') |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|