add a test for #getNonceLock

feature/default_network_editable
frankiebee 8 years ago
parent 0d8c02db35
commit fa8c74fe9b
  1. 22
      app/scripts/lib/nonce-tracker.js
  2. 1
      package.json
  3. 46
      test/unit/nonce-tracker-test.js

@ -1,4 +1,4 @@
const EthQuery = require('ethjs-query') const EthQuery = require('eth-query')
class NonceTracker { class NonceTracker {
@ -20,10 +20,10 @@ class NonceTracker {
const currentBlock = await this._getCurrentBlock() const currentBlock = await this._getCurrentBlock()
const blockNumber = currentBlock.number const blockNumber = currentBlock.number
const pendingTransactions = this.getPendingTransactions(address) const pendingTransactions = this.getPendingTransactions(address)
const baseCount = await this.ethQuery.getTransactionCount(address, blockNumber) const baseCount = await this._getTxCount(address, blockNumber)
const nextNonce = baseCount + pendingTransactions const nextNonce = parseInt(baseCount) + pendingTransactions.length + 1
// return next nonce and release cb // return next nonce and release cb
return { nextNonce, releaseLock } return { nextNonce: nextNonce.toString(16), releaseLock }
} }
async _getCurrentBlock() { async _getCurrentBlock() {
@ -37,13 +37,23 @@ class NonceTracker {
_takeLock(lockId) { _takeLock(lockId) {
let releaseLock = null let releaseLock = null
// create and store lock // create and store lock
const lock = new Promise((reject, resolve) => { releaseLock = resolve }) const lock = new Promise((resolve, reject) => { releaseLock = resolve })
this.lockMap[lockId] = lock this.lockMap[lockId] = lock
// setup lock teardown // setup lock teardown
lock.then(() => delete this.lockMap[lockId]) lock.then(() => {
delete this.lockMap[lockId]
})
return releaseLock return releaseLock
} }
_getTxCount (address, blockNumber) {
return new Promise((resolve, reject) => {
this.ethQuery.getTransactionCount(address, blockNumber, (err, result) => {
err ? reject(err) : resolve(result)
})
})
}
} }
module.exports = NonceTracker module.exports = NonceTracker

@ -10,6 +10,7 @@
"dist": "npm install && gulp dist --disableLiveReload", "dist": "npm install && gulp dist --disableLiveReload",
"test": "npm run lint && npm run test-unit && npm run test-integration", "test": "npm run lint && npm run test-unit && npm run test-integration",
"test-unit": "METAMASK_ENV=test mocha --require test/helper.js --recursive \"test/unit/**/*.js\"", "test-unit": "METAMASK_ENV=test mocha --require test/helper.js --recursive \"test/unit/**/*.js\"",
"single-test": "METAMASK_ENV=test mocha --require test/helper.js",
"test-integration": "npm run buildMock && npm run buildCiUnits && testem ci -P 2", "test-integration": "npm run buildMock && npm run buildCiUnits && testem ci -P 2",
"lint": "gulp lint", "lint": "gulp lint",
"buildCiUnits": "node test/integration/index.js", "buildCiUnits": "node test/integration/index.js",

@ -0,0 +1,46 @@
const assert = require('assert')
const NonceTracker = require('../../app/scripts/lib/nonce-tracker')
describe('Nonce Tracker', function () {
let nonceTracker, provider, getPendingTransactions, pendingTxs
const noop = () => {}
beforeEach(function () {
pendingTxs =[{
'status': 'submitted',
'txParams': {
'from': '0x7d3517b0d011698406d6e0aed8453f0be2697926',
'gas': '0x30d40',
'value': '0x0',
'nonce': '0x1',
},
}]
getPendingTransactions = () => pendingTxs
provider = { sendAsync: (_, cb) => { cb(undefined , {result: '0x0'}) }, }
nonceTracker = new NonceTracker({
blockTracker: {
getCurrentBlock: () => '0x11b568',
once: (...args) => {
setTimeout(() => {
args.pop()()
}, 5000)
}
},
provider,
getPendingTransactions,
})
})
describe('#getNonceLock', function () {
it('should work', async function (done) {
this.timeout(15000)
const nonceLock = await nonceTracker.getNonceLock('0x7d3517b0d011698406d6e0aed8453f0be2697926')
assert.equal(nonceLock.nextNonce, '2', 'nonce should be 2')
nonceLock.releaseLock()
done()
})
})
})
Loading…
Cancel
Save