Merge branch 'master' of github.com:MetaMask/metamask-extension into i18n-translator-redux

feature/default_network_editable
kumavis 7 years ago
commit 5290570c8f
  1. 43
      .circleci/config.yml
  2. 7
      app/scripts/lib/tx-state-manager.js
  3. 50
      app/scripts/migrations/023.js
  4. 1
      app/scripts/migrations/index.js
  5. 99
      test/unit/migrations/023-test.js
  6. 6
      test/unit/tx-state-manager-test.js

@ -6,6 +6,9 @@ workflows:
jobs: jobs:
- prep-deps-npm - prep-deps-npm
- prep-deps-firefox - prep-deps-firefox
- prep-build:
requires:
- prep-deps-npm
- prep-scss: - prep-scss:
requires: requires:
- prep-deps-npm - prep-deps-npm
@ -14,6 +17,7 @@ workflows:
- prep-deps-npm - prep-deps-npm
- test-e2e: - test-e2e:
requires: requires:
- prep-build
- prep-deps-npm - prep-deps-npm
- test-unit: - test-unit:
requires: requires:
@ -36,6 +40,15 @@ workflows:
- prep-deps-npm - prep-deps-npm
- prep-deps-firefox - prep-deps-firefox
- prep-scss - prep-scss
- all-tests-pass:
requires:
- test-lint
- test-unit
- test-e2e
- test-integration-mascara-chrome
- test-integration-mascara-firefox
- test-integration-flat-chrome
- test-integration-flat-firefox
jobs: jobs:
prep-deps-npm: prep-deps-npm:
@ -68,6 +81,23 @@ jobs:
paths: paths:
- firefox - firefox
prep-build:
docker:
- image: circleci/node:8-browsers
steps:
- checkout
- restore_cache:
key: dependency-cache-{{ checksum "package-lock.json" }}
- run:
name: build:dist
command: npm run dist
- run:
name: build:debug
command: find dist/ -type f -exec md5sum {} \; | sort -k 2
- save_cache:
key: build-cache-{{ .Revision }}
paths:
- dist
prep-scss: prep-scss:
docker: docker:
@ -106,9 +136,8 @@ jobs:
- checkout - checkout
- restore_cache: - restore_cache:
key: dependency-cache-{{ checksum "package-lock.json" }} key: dependency-cache-{{ checksum "package-lock.json" }}
- run: - restore_cache:
name: Build key: build-cache-{{ .Revision }}
command: npm run dist
- run: - run:
name: Test name: Test
command: npm run test:e2e command: npm run test:e2e
@ -217,3 +246,11 @@ jobs:
- run: - run:
name: test:integration:mascara name: test:integration:mascara
command: npm run test:mascara command: npm run test:mascara
all-tests-pass:
docker:
- image: circleci/node:8-browsers
steps:
- run:
name: All Tests Passed
command: echo 'weew - everything passed!'

@ -38,11 +38,6 @@ module.exports = class TransactionStateManager extends EventEmitter {
}, opts) }, opts)
} }
// Returns the number of txs for the current network.
getTxCount () {
return this.getTxList().length
}
getTxList () { getTxList () {
const network = this.getNetwork() const network = this.getNetwork()
const fullTxList = this.getFullTxList() const fullTxList = this.getFullTxList()
@ -88,7 +83,7 @@ module.exports = class TransactionStateManager extends EventEmitter {
txMeta.history.push(snapshot) txMeta.history.push(snapshot)
const transactions = this.getFullTxList() const transactions = this.getFullTxList()
const txCount = this.getTxCount() const txCount = transactions.length
const txHistoryLimit = this.txHistoryLimit const txHistoryLimit = this.txHistoryLimit
// checks if the length of the tx history is // checks if the length of the tx history is

@ -0,0 +1,50 @@
const version = 23
/*
This migration removes transactions that are no longer usefull down to 40 total
*/
const clone = require('clone')
module.exports = {
version,
migrate: function (originalVersionedData) {
const versionedData = clone(originalVersionedData)
versionedData.meta.version = version
try {
const state = versionedData.data
const newState = transformState(state)
versionedData.data = newState
} catch (err) {
console.warn(`MetaMask Migration #${version}` + err.stack)
}
return Promise.resolve(versionedData)
},
}
function transformState (state) {
const newState = state
const transactions = newState.TransactionController.transactions
if (transactions.length <= 40) return newState
let reverseTxList = transactions.reverse()
let stripping = true
while (reverseTxList.length > 40 && stripping) {
let txIndex = reverseTxList.findIndex((txMeta) => {
return (txMeta.status === 'failed' ||
txMeta.status === 'rejected' ||
txMeta.status === 'confirmed' ||
txMeta.status === 'dropped')
})
if (txIndex < 0) stripping = false
else reverseTxList.splice(txIndex, 1)
}
newState.TransactionController.transactions = reverseTxList.reverse()
return newState
}

@ -33,4 +33,5 @@ module.exports = [
require('./020'), require('./020'),
require('./021'), require('./021'),
require('./022'), require('./022'),
require('./023'),
] ]

@ -0,0 +1,99 @@
const assert = require('assert')
const migration23 = require('../../../app/scripts/migrations/023')
const properTime = (new Date()).getTime()
const storage = {
"meta": {},
"data": {
"TransactionController": {
"transactions": [
]
},
},
}
const transactions = []
const transactions40 = []
const transactions20 = []
const txStates = [
'unapproved',
'approved',
'signed',
'submitted',
'confirmed',
'rejected',
'failed',
'dropped',
]
const deletableTxStates = [
'confirmed',
'rejected',
'failed',
'dropped',
]
let nonDeletableCount = 0
let status
while (transactions.length <= 100) {
status = txStates[Math.floor(Math.random() * Math.floor(txStates.length - 1))]
if (!deletableTxStates.find((s) => s === status)) nonDeletableCount++
transactions.push({status})
}
while (transactions40.length < 40) {
status = txStates[Math.floor(Math.random() * Math.floor(txStates.length - 1))]
transactions40.push({status})
}
while (transactions20.length < 20) {
status = txStates[Math.floor(Math.random() * Math.floor(txStates.length - 1))]
transactions20.push({status})
}
storage.data.TransactionController.transactions = transactions
describe('storage is migrated successfully and the proper transactions are remove from state', () => {
it('should remove transactions that are unneeded', (done) => {
migration23.migrate(storage)
.then((migratedData) => {
let leftoverNonDeletableTxCount = 0
const migratedTransactions = migratedData.data.TransactionController.transactions
migratedTransactions.forEach((tx) => {
if (!deletableTxStates.find((s) => s === tx.status)) {
leftoverNonDeletableTxCount++
}
})
assert.equal(leftoverNonDeletableTxCount, nonDeletableCount, 'migration shouldnt delete transactions we want to keep')
assert((migratedTransactions.length >= 40), `should be equal or greater to 40 if they are non deletable states got ${migratedTransactions.length} transactions`)
done()
}).catch(done)
})
it('should not remove any transactions because 40 is the expectable limit', (done) => {
storage.meta.version = 22
storage.data.TransactionController.transactions = transactions40
migration23.migrate(storage)
.then((migratedData) => {
const migratedTransactions = migratedData.data.TransactionController.transactions
assert.equal(migratedTransactions.length, 40, 'migration shouldnt delete when at limit')
done()
}).catch(done)
})
it('should not remove any transactions because 20 txs is under the expectable limit', (done) => {
storage.meta.version = 22
storage.data.TransactionController.transactions = transactions20
migration23.migrate(storage)
.then((migratedData) => {
const migratedTransactions = migratedData.data.TransactionController.transactions
assert.equal(migratedTransactions.length, 20, 'migration shouldnt delete when under limit')
done()
}).catch(done)
})
})

@ -240,12 +240,12 @@ describe('TransactionStateManager', function () {
}) })
describe('#wipeTransactions', function () { describe('#wipeTransactions', function () {
const specificAddress = '0xaa' const specificAddress = '0xaa'
const otherAddress = '0xbb' const otherAddress = '0xbb'
it('should remove only the transactions from a specific address', function () { it('should remove only the transactions from a specific address', function () {
const txMetas = [ const txMetas = [
{ id: 0, status: 'unapproved', txParams: { from: specificAddress, to: otherAddress }, metamaskNetworkId: currentNetworkId }, { id: 0, status: 'unapproved', txParams: { from: specificAddress, to: otherAddress }, metamaskNetworkId: currentNetworkId },
{ id: 1, status: 'confirmed', txParams: { from: otherAddress, to: specificAddress }, metamaskNetworkId: currentNetworkId }, { id: 1, status: 'confirmed', txParams: { from: otherAddress, to: specificAddress }, metamaskNetworkId: currentNetworkId },
@ -268,7 +268,7 @@ describe('TransactionStateManager', function () {
{ id: 1, status: 'confirmed', txParams: { from: specificAddress, to: otherAddress }, metamaskNetworkId: otherNetworkId }, { id: 1, status: 'confirmed', txParams: { from: specificAddress, to: otherAddress }, metamaskNetworkId: otherNetworkId },
{ id: 2, status: 'confirmed', txParams: { from: specificAddress, to: otherAddress }, metamaskNetworkId: otherNetworkId }, { id: 2, status: 'confirmed', txParams: { from: specificAddress, to: otherAddress }, metamaskNetworkId: otherNetworkId },
] ]
txMetas.forEach((txMeta) => txStateManager.addTx(txMeta, noop)) txMetas.forEach((txMeta) => txStateManager.addTx(txMeta, noop))
txStateManager.wipeTransactions(specificAddress) txStateManager.wipeTransactions(specificAddress)

Loading…
Cancel
Save