mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
add a test for #getNonceLock
This commit is contained in:
parent
0d8c02db35
commit
fa8c74fe9b
@ -1,4 +1,4 @@
|
||||
const EthQuery = require('ethjs-query')
|
||||
const EthQuery = require('eth-query')
|
||||
|
||||
class NonceTracker {
|
||||
|
||||
@ -20,10 +20,10 @@ class NonceTracker {
|
||||
const currentBlock = await this._getCurrentBlock()
|
||||
const blockNumber = currentBlock.number
|
||||
const pendingTransactions = this.getPendingTransactions(address)
|
||||
const baseCount = await this.ethQuery.getTransactionCount(address, blockNumber)
|
||||
const nextNonce = baseCount + pendingTransactions
|
||||
const baseCount = await this._getTxCount(address, blockNumber)
|
||||
const nextNonce = parseInt(baseCount) + pendingTransactions.length + 1
|
||||
// return next nonce and release cb
|
||||
return { nextNonce, releaseLock }
|
||||
return { nextNonce: nextNonce.toString(16), releaseLock }
|
||||
}
|
||||
|
||||
async _getCurrentBlock() {
|
||||
@ -37,13 +37,23 @@ class NonceTracker {
|
||||
_takeLock(lockId) {
|
||||
let releaseLock = null
|
||||
// create and store lock
|
||||
const lock = new Promise((reject, resolve) => { releaseLock = resolve })
|
||||
const lock = new Promise((resolve, reject) => { releaseLock = resolve })
|
||||
this.lockMap[lockId] = lock
|
||||
// setup lock teardown
|
||||
lock.then(() => delete this.lockMap[lockId])
|
||||
lock.then(() => {
|
||||
delete this.lockMap[lockId]
|
||||
})
|
||||
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
|
||||
|
@ -10,6 +10,7 @@
|
||||
"dist": "npm install && gulp dist --disableLiveReload",
|
||||
"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\"",
|
||||
"single-test": "METAMASK_ENV=test mocha --require test/helper.js",
|
||||
"test-integration": "npm run buildMock && npm run buildCiUnits && testem ci -P 2",
|
||||
"lint": "gulp lint",
|
||||
"buildCiUnits": "node test/integration/index.js",
|
||||
|
46
test/unit/nonce-tracker-test.js
Normal file
46
test/unit/nonce-tracker-test.js
Normal file
@ -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…
Reference in New Issue
Block a user