From cce8d9e3600e8ba0ced12013b0b208fff9f9c8a8 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 12 Oct 2016 20:03:14 -0700 Subject: Began adding browser-native encryptor module Added new Qunit build process that will browserify the contents of `test/integration/lib` into the QUnit browser, allowing much more modular testing, including unit testing of our modules in our target browsers. Made a basic unit test file of this form for the new encryptor module, which fails miserably because I've only just begun to work with it. I've started with this blog post as a starting point, and will be adjusting it to our needs from there: http://qnimate.com/passphrase-based-encryption-using-web-cryptography-api/ --- test/integration/lib/encryptor-test.js | 17 +++++++++++++++++ test/integration/lib/first-time.js | 25 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 test/integration/lib/encryptor-test.js create mode 100644 test/integration/lib/first-time.js (limited to 'test/integration/lib') diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js new file mode 100644 index 000000000..21d6ee6f7 --- /dev/null +++ b/test/integration/lib/encryptor-test.js @@ -0,0 +1,17 @@ +var encryptor = require('../../../app/scripts/lib/encryptor') + +QUnit.test('encryptor', function(assert) { + var password, data, encrypted + + password = 'a sample passw0rd' + data = { foo: 'data to encrypt' } + + encryptor.encrypt(password, data) + .then(function(result) { + assert.equal(typeof result, 'string', 'returns a string') + }) + .catch(function(reason) { + assert.ifError(reason, 'threw an error') + }) + +}) diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js new file mode 100644 index 000000000..af9b94e24 --- /dev/null +++ b/test/integration/lib/first-time.js @@ -0,0 +1,25 @@ +QUnit.test('agree to terms', function (assert) { + var done = assert.async() + + // Select the mock app root + var app = $('iframe').contents().find('#app-content .mock-app-root') + + app.find('.markdown').prop('scrollTop', 100000000) + + wait().then(function() { + app.find('button').click() + }).then(function() { + return wait() + }).then(function() { + var title = app.find('h1').text() + assert.equal(title, 'MetaMask', 'title screen') + + var buttons = app.find('button') + assert.equal(buttons.length, 1, 'one button: create new vault') + + done() + }) + + // Wait for view to transition: +}) + -- cgit From c9cfcd5253b29ef7240e556a847f525c38729fa0 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Fri, 14 Oct 2016 13:21:00 -0700 Subject: Got encrypting working, not yet decrypting --- test/integration/lib/encryptor-test.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js index 21d6ee6f7..f5cdea835 100644 --- a/test/integration/lib/encryptor-test.js +++ b/test/integration/lib/encryptor-test.js @@ -1,14 +1,25 @@ var encryptor = require('../../../app/scripts/lib/encryptor') QUnit.test('encryptor', function(assert) { + var done = assert.async(); var password, data, encrypted password = 'a sample passw0rd' data = { foo: 'data to encrypt' } encryptor.encrypt(password, data) - .then(function(result) { - assert.equal(typeof result, 'string', 'returns a string') + .then(function(encryptedStr) { + + assert.equal(typeof encryptedStr, 'string', 'returns a string') + + // Now try decrypting!jk + // + return encryptor.decrypt(password, encryptedStr) + + }) + .then(function (decryptedObj) { + assert.equal(decryptedObj, data, 'decrypted what was encrypted') + done() }) .catch(function(reason) { assert.ifError(reason, 'threw an error') -- cgit From 1c791c4d2e7f280b634a5fe1bb449d5d05c9db7c Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Fri, 14 Oct 2016 15:59:07 -0700 Subject: Got basic encryptor working --- test/integration/lib/encryptor-test.js | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js index f5cdea835..3297ad177 100644 --- a/test/integration/lib/encryptor-test.js +++ b/test/integration/lib/encryptor-test.js @@ -1,6 +1,27 @@ var encryptor = require('../../../app/scripts/lib/encryptor') -QUnit.test('encryptor', function(assert) { +QUnit.test('encryptor:serializeBufferForStorage', function (assert) { + assert.expect(1) + var buf = new Buffer(2) + buf[0] = 16 + buf[1] = 1 + + var output = encryptor.serializeBufferForStorage(buf) + + var expect = '0x1001' + assert.equal(expect, output) +}) + +QUnit.test('encryptor:serializeBufferFromStorage', function (assert) { + assert.expect(2) + var input = '0x1001' + var output = encryptor.serializeBufferFromStorage(input) + + assert.equal(output[0], 16) + assert.equal(output[1], 1) +}) + +QUnit.test('encryptor:encrypt & decrypt', function(assert) { var done = assert.async(); var password, data, encrypted @@ -9,19 +30,15 @@ QUnit.test('encryptor', function(assert) { encryptor.encrypt(password, data) .then(function(encryptedStr) { - assert.equal(typeof encryptedStr, 'string', 'returns a string') - - // Now try decrypting!jk - // return encryptor.decrypt(password, encryptedStr) - }) .then(function (decryptedObj) { - assert.equal(decryptedObj, data, 'decrypted what was encrypted') + assert.deepEqual(decryptedObj, data, 'decrypted what was encrypted') done() }) .catch(function(reason) { + debugger assert.ifError(reason, 'threw an error') }) -- cgit From 036b0e4ccabded3c3dda39f8d81b9fa3fc07dd9c Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Fri, 14 Oct 2016 16:28:08 -0700 Subject: Linted --- test/integration/lib/encryptor-test.js | 1 - 1 file changed, 1 deletion(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js index 3297ad177..88ebed51b 100644 --- a/test/integration/lib/encryptor-test.js +++ b/test/integration/lib/encryptor-test.js @@ -38,7 +38,6 @@ QUnit.test('encryptor:encrypt & decrypt', function(assert) { done() }) .catch(function(reason) { - debugger assert.ifError(reason, 'threw an error') }) -- cgit From 0deed1775237bc8d48eb41e83b5a661b55e4b6be Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Thu, 20 Oct 2016 12:07:53 -0700 Subject: Fix tests --- test/integration/lib/encryptor-test.js | 1 + 1 file changed, 1 insertion(+) (limited to 'test/integration/lib') diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js index 88ebed51b..1c8a7605a 100644 --- a/test/integration/lib/encryptor-test.js +++ b/test/integration/lib/encryptor-test.js @@ -39,6 +39,7 @@ QUnit.test('encryptor:encrypt & decrypt', function(assert) { }) .catch(function(reason) { assert.ifError(reason, 'threw an error') + done(reason) }) }) -- cgit From 678301a20e6112d79a052c13f921bb75c451c613 Mon Sep 17 00:00:00 2001 From: Kevin Serrano Date: Tue, 25 Oct 2016 13:24:03 -0700 Subject: Phase out extra warning screen. --- test/integration/lib/first-time.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js index af9b94e24..caa6102fe 100644 --- a/test/integration/lib/first-time.js +++ b/test/integration/lib/first-time.js @@ -5,7 +5,7 @@ QUnit.test('agree to terms', function (assert) { var app = $('iframe').contents().find('#app-content .mock-app-root') app.find('.markdown').prop('scrollTop', 100000000) - + debugger; wait().then(function() { app.find('button').click() }).then(function() { @@ -22,4 +22,3 @@ QUnit.test('agree to terms', function (assert) { // Wait for view to transition: }) - -- cgit From b3cb3e9ec67a138767bb2d6833c9056a66d46b92 Mon Sep 17 00:00:00 2001 From: Kevin Serrano Date: Tue, 25 Oct 2016 13:24:57 -0700 Subject: Remove debugger statement. --- test/integration/lib/first-time.js | 1 - 1 file changed, 1 deletion(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js index caa6102fe..7cabf1f0a 100644 --- a/test/integration/lib/first-time.js +++ b/test/integration/lib/first-time.js @@ -5,7 +5,6 @@ QUnit.test('agree to terms', function (assert) { var app = $('iframe').contents().find('#app-content .mock-app-root') app.find('.markdown').prop('scrollTop', 100000000) - debugger; wait().then(function() { app.find('button').click() }).then(function() { -- cgit From ba7d6b437f2e03a9e2bb46dcda846cee1f816ce1 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Thu, 3 Nov 2016 16:06:57 -0700 Subject: Fix password validation and persistence issue Was wiping the vault on each successful password attempt... :P --- test/integration/lib/encryptor-test.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'test/integration/lib') diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js index 1c8a7605a..d42608152 100644 --- a/test/integration/lib/encryptor-test.js +++ b/test/integration/lib/encryptor-test.js @@ -43,3 +43,25 @@ QUnit.test('encryptor:encrypt & decrypt', function(assert) { }) }) + +QUnit.test('encryptor:encrypt & decrypt with wrong password', function(assert) { + var done = assert.async(); + var password, data, encrypted, wrongPassword + + password = 'a sample passw0rd' + wrongPassword = 'a wrong password' + data = { foo: 'data to encrypt' } + + encryptor.encrypt(password, data) + .then(function(encryptedStr) { + assert.equal(typeof encryptedStr, 'string', 'returns a string') + return encryptor.decrypt(wrongPassword, encryptedStr) + }) + .then(function (decryptedObj) { + assert.equal(!decryptedObj, true, 'Wrong password should not decrypt') + done() + }) + .catch(function(reason) { + done() + }) +}) -- cgit From 93c0a6826aa70fa14874579b1009bee7248a7c51 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Mon, 7 Nov 2016 14:11:01 -0800 Subject: Fix integration test suite --- test/integration/lib/first-time.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js index 7cabf1f0a..a73b0cba3 100644 --- a/test/integration/lib/first-time.js +++ b/test/integration/lib/first-time.js @@ -1,23 +1,15 @@ QUnit.test('agree to terms', function (assert) { var done = assert.async() + let app - // Select the mock app root - var app = $('iframe').contents().find('#app-content .mock-app-root') - - app.find('.markdown').prop('scrollTop', 100000000) wait().then(function() { - app.find('button').click() - }).then(function() { + app = $('iframe').contents().find('#app-content .mock-app-root') + app.find('.markdown').prop('scrollTop', 100000000) return wait() }).then(function() { var title = app.find('h1').text() assert.equal(title, 'MetaMask', 'title screen') - var buttons = app.find('button') - assert.equal(buttons.length, 1, 'one button: create new vault') - done() }) - - // Wait for view to transition: }) -- cgit From 3cd839d27f78d9e59248a85be72a31cff9a3404c Mon Sep 17 00:00:00 2001 From: Kevin Serrano Date: Fri, 18 Nov 2016 15:40:12 -0800 Subject: Create failing test to check submitPassword in keyringController. --- test/integration/lib/keyring-controller-test.js | 46 +++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 test/integration/lib/keyring-controller-test.js (limited to 'test/integration/lib') diff --git a/test/integration/lib/keyring-controller-test.js b/test/integration/lib/keyring-controller-test.js new file mode 100644 index 000000000..bea485270 --- /dev/null +++ b/test/integration/lib/keyring-controller-test.js @@ -0,0 +1,46 @@ +var KeyringController = require('../../../app/scripts/keyring-controller') +var ConfigManager = require('../../../app/scripts/lib/config-manager') + +var oldStyleVault = require('../mocks/oldVault.json') + +var STORAGE_KEY = 'metamask-config' +var PASSWORD = '12345678' +var FIRST_ADDRESS = '0x4dd5d356c5A016A220bCD69e82e5AF680a430d00'.toLowerCase() + + +QUnit.module('Old Style Vaults', { + beforeEach: function () { + window.localStorage[STORAGE_KEY] = JSON.stringify(oldStyleVault) + + this.configManager = new ConfigManager({ + loadData: () => { return JSON.parse(window.localStorage[STORAGE_KEY]) }, + setData: (data) => { window.localStorage[STORAGE_KEY] = JSON.stringify(data) }, + }) + + this.keyringController = new KeyringController({ + configManager: this.configManager, + getNetwork: () => { return '2' }, + }) + + this.ethStore = { + addAccount: () => {}, + removeAccount: () => {}, + } + + this.keyringController.setStore(this.ethStore) + } +}) + +QUnit.test('keyringController:isInitialized', function (assert) { + assert.ok(this.keyringController.getState().isInitialized) +}) + +QUnit.test('keyringController:submitPassword', function (assert) { + var done = assert.async() + + this.keyringController.submitPassword(PASSWORD, (err, state) => { + assert.notOk(err) + assert.ok(state.identities[FIRST_ADDRESS]) + done() + }) +}) -- cgit From 05c8658ff343af61b1a40a5624ecba77adb2ef00 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 22 Nov 2016 17:40:29 -0800 Subject: Fix new encryptor migration logic --- test/integration/lib/keyring-controller-test.js | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'test/integration/lib') diff --git a/test/integration/lib/keyring-controller-test.js b/test/integration/lib/keyring-controller-test.js index bea485270..678744834 100644 --- a/test/integration/lib/keyring-controller-test.js +++ b/test/integration/lib/keyring-controller-test.js @@ -44,3 +44,14 @@ QUnit.test('keyringController:submitPassword', function (assert) { done() }) }) + +QUnit.test('keyringController:setLocked', function (assert) { + var done = assert.async() + var self = this + + this.keyringController.setLocked(function(err) { + assert.notOk(self.keyringController.password, 'password should be deallocated') + assert.deepEqual(self.keyringController.keyrings, [], 'keyrings should be deallocated') + done() + }) +}) -- cgit From 80e76b45ee67900b5a60da1ddcd8b310f1e92413 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Mon, 28 Nov 2016 12:43:44 -0800 Subject: Denodeify most of KeyringController Mostly Fixes #893 A couple methods cache callbacks, and will require a larger refactor to fully denodeify. Specifically, our methods involving web3 requests to sign a tx, sign a message, and approve or cancel either of those. I think we should postpone those until the TxManager refactor, since it will likely handle this response caching itself. --- test/integration/lib/keyring-controller-test.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/keyring-controller-test.js b/test/integration/lib/keyring-controller-test.js index 678744834..ae5ecc578 100644 --- a/test/integration/lib/keyring-controller-test.js +++ b/test/integration/lib/keyring-controller-test.js @@ -38,8 +38,8 @@ QUnit.test('keyringController:isInitialized', function (assert) { QUnit.test('keyringController:submitPassword', function (assert) { var done = assert.async() - this.keyringController.submitPassword(PASSWORD, (err, state) => { - assert.notOk(err) + this.keyringController.submitPassword(PASSWORD) + .then((state) => { assert.ok(state.identities[FIRST_ADDRESS]) done() }) @@ -49,9 +49,14 @@ QUnit.test('keyringController:setLocked', function (assert) { var done = assert.async() var self = this - this.keyringController.setLocked(function(err) { + this.keyringController.setLocked() + .then(function() { assert.notOk(self.keyringController.password, 'password should be deallocated') assert.deepEqual(self.keyringController.keyrings, [], 'keyrings should be deallocated') done() }) + .catch((reason) => { + assert.ifError(reason) + done() + }) }) -- cgit From 549bbfd05f0507a33c9df95111a71b0097f3b355 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 30 Nov 2016 14:43:18 -0800 Subject: Made integration test create a first vault --- test/integration/lib/first-time.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'test/integration/lib') diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js index a73b0cba3..e7d4ffaa2 100644 --- a/test/integration/lib/first-time.js +++ b/test/integration/lib/first-time.js @@ -1,3 +1,5 @@ +const PASSWORD = 'password123' + QUnit.test('agree to terms', function (assert) { var done = assert.async() let app @@ -6,10 +8,30 @@ QUnit.test('agree to terms', function (assert) { app = $('iframe').contents().find('#app-content .mock-app-root') app.find('.markdown').prop('scrollTop', 100000000) return wait() + }).then(function() { + var title = app.find('h1').text() assert.equal(title, 'MetaMask', 'title screen') + var pwBox = app.find('#password-box')[0] + var confBox = app.find('#password-box-confirm')[0] + + pwBox.value = PASSWORD + confBox.value = PASSWORD + return wait() + + }).then(function() { + + var createButton = app.find('button.primary')[0] + createButton.click() + + return wait(1500) + }).then(function() { + + var terms = app.find('h3.terms-header')[0] + assert.equal(terms.textContent, 'MetaMask Terms & Conditions', 'Showing TOS') + done() }) }) -- cgit From fe533bbef2486bd22e4e23ee43927cff0e1d958e Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 30 Nov 2016 15:18:26 -0800 Subject: Add more integration tests Integration tests now: - Scroll through terms - Accept terms - Confirm seed phrase - Verify account detail screen --- test/integration/lib/first-time.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'test/integration/lib') diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js index e7d4ffaa2..76b10f568 100644 --- a/test/integration/lib/first-time.js +++ b/test/integration/lib/first-time.js @@ -32,6 +32,31 @@ QUnit.test('agree to terms', function (assert) { var terms = app.find('h3.terms-header')[0] assert.equal(terms.textContent, 'MetaMask Terms & Conditions', 'Showing TOS') + // Scroll through terms + var scrollable = app.find('.markdown')[0] + scrollable.scrollTop = scrollable.scrollHeight + + return wait(10) + }).then(function() { + + var button = app.find('button')[0] // Agree button + button.click() + + return wait(1000) + }).then(function() { + + var created = app.find('h3')[0] + assert.equal(created.textContent, 'Vault Created', 'Vault created screen') + + var button = app.find('button')[0] // Agree button + button.click() + + return wait(1000) + }).then(function() { + + var detail = app.find('.account-detail-section')[0] + assert.ok(detail, 'Account detail section loaded.') done() + }) }) -- cgit From 049e351c9d78dc13a81ba962b04ef96694b13682 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 30 Nov 2016 16:01:51 -0800 Subject: Add integration tests for logging out and back in --- test/integration/lib/first-time.js | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js index 76b10f568..d2fe31878 100644 --- a/test/integration/lib/first-time.js +++ b/test/integration/lib/first-time.js @@ -56,7 +56,33 @@ QUnit.test('agree to terms', function (assert) { var detail = app.find('.account-detail-section')[0] assert.ok(detail, 'Account detail section loaded.') - done() + var sandwich = app.find('.sandwich-expando')[0] + sandwich.click() + + return wait() + }).then(function() { + + var sandwich = app.find('.menu-droppo')[0] + var lock = sandwich.children[2] + assert.ok(lock, 'Lock menu item found') + lock.click() + + return wait(1000) + }).then(function() { + + var pwBox = app.find('#password-box')[0] + pwBox.value = PASSWORD + + var createButton = app.find('button.primary')[0] + createButton.click() + + return wait(1500) + }).then(function() { + + var detail = app.find('.account-detail-section')[0] + assert.ok(detail, 'Account detail section loaded again.') + + done() }) }) -- cgit From 1880cda9b95f3274d56e1f4abc513d1d7ddd59c2 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 30 Nov 2016 19:34:17 -0800 Subject: Fix vault encrypting & unlocking bug This is only a bug in dev, but was committed yesterday. Sometimes the `encrypt` method was being passed values other than the password as the encryption key, leading to un-unlockable vaults. To find this, and avoid it for all time hereafter, I added several more steps to our oft-neglected integration test suite, which now fully initializes a vault, locks it, and unlocks it again, to make sure all of those steps definitely work always. --- test/integration/lib/encryptor-test.js | 4 ++++ test/integration/lib/first-time.js | 2 ++ 2 files changed, 6 insertions(+) (limited to 'test/integration/lib') diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js index d42608152..897d22740 100644 --- a/test/integration/lib/encryptor-test.js +++ b/test/integration/lib/encryptor-test.js @@ -1,5 +1,7 @@ var encryptor = require('../../../app/scripts/lib/encryptor') +QUnit.module('encryptor') + QUnit.test('encryptor:serializeBufferForStorage', function (assert) { assert.expect(1) var buf = new Buffer(2) @@ -65,3 +67,5 @@ QUnit.test('encryptor:encrypt & decrypt with wrong password', function(assert) { done() }) }) + + diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js index d2fe31878..12c573db1 100644 --- a/test/integration/lib/first-time.js +++ b/test/integration/lib/first-time.js @@ -1,5 +1,7 @@ const PASSWORD = 'password123' +QUnit.module('first time usage') + QUnit.test('agree to terms', function (assert) { var done = assert.async() let app -- cgit From ab9e15b782620002c0a2477829db3e56a25a7d5c Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Thu, 8 Dec 2016 14:22:02 -0800 Subject: Mostly added bad account detection Currently riddled with logs, because the migrator is inexplicably returning before generating the new style accounts for comparison. --- test/integration/lib/keyring-controller-test.js | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'test/integration/lib') diff --git a/test/integration/lib/keyring-controller-test.js b/test/integration/lib/keyring-controller-test.js index ae5ecc578..e37b5df50 100644 --- a/test/integration/lib/keyring-controller-test.js +++ b/test/integration/lib/keyring-controller-test.js @@ -2,6 +2,7 @@ var KeyringController = require('../../../app/scripts/keyring-controller') var ConfigManager = require('../../../app/scripts/lib/config-manager') var oldStyleVault = require('../mocks/oldVault.json') +var badStyleVault = require('../mocks/badVault.json') var STORAGE_KEY = 'metamask-config' var PASSWORD = '12345678' @@ -41,6 +42,63 @@ QUnit.test('keyringController:submitPassword', function (assert) { this.keyringController.submitPassword(PASSWORD) .then((state) => { assert.ok(state.identities[FIRST_ADDRESS]) + assert.equal(state.lostAccounts.length, 0, 'no lost accounts') + done() + }) +}) + +QUnit.test('keyringController:setLocked', function (assert) { + var done = assert.async() + var self = this + + this.keyringController.setLocked() + .then(function() { + assert.notOk(self.keyringController.password, 'password should be deallocated') + assert.deepEqual(self.keyringController.keyrings, [], 'keyrings should be deallocated') + done() + }) + .catch((reason) => { + assert.ifError(reason) + done() + }) +}) + +QUnit.module('Old Style Vaults with bad HD seed', { + beforeEach: function () { + window.localStorage[STORAGE_KEY] = JSON.stringify(badStyleVault) + + this.configManager = new ConfigManager({ + loadData: () => { return JSON.parse(window.localStorage[STORAGE_KEY]) }, + setData: (data) => { window.localStorage[STORAGE_KEY] = JSON.stringify(data) }, + }) + + this.keyringController = new KeyringController({ + configManager: this.configManager, + getNetwork: () => { return '2' }, + }) + + this.ethStore = { + addAccount: () => {}, + removeAccount: () => {}, + } + + this.keyringController.setStore(this.ethStore) + } +}) + +QUnit.test('keyringController:isInitialized', function (assert) { + assert.ok(this.keyringController.getState().isInitialized) +}) + +QUnit.test('keyringController:submitPassword', function (assert) { + var done = assert.async() + + this.keyringController.submitPassword(PASSWORD) + .then((state) => { + assert.ok(state.identities[FIRST_ADDRESS]) + assert.equal(state.lostAccounts.length, 1, 'one lost account') + assert.equal(state.lostAccounts[0], 'e15D894BeCB0354c501AE69429B05143679F39e0'.toLowerCase()) + assert.deepEqual(this.configManager.getLostAccounts(), state.lostAccounts, 'persisted') done() }) }) -- cgit From 7b9749e30c4f8228fe62c1ad81515117cf7504bc Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Fri, 9 Dec 2016 12:24:25 -0800 Subject: Got bad account detection working and added to state --- test/integration/lib/keyring-controller-test.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/keyring-controller-test.js b/test/integration/lib/keyring-controller-test.js index e37b5df50..666795a6d 100644 --- a/test/integration/lib/keyring-controller-test.js +++ b/test/integration/lib/keyring-controller-test.js @@ -8,6 +8,8 @@ var STORAGE_KEY = 'metamask-config' var PASSWORD = '12345678' var FIRST_ADDRESS = '0x4dd5d356c5A016A220bCD69e82e5AF680a430d00'.toLowerCase() +var BAD_STYLE_FIRST_ADDRESS = '0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9' + QUnit.module('Old Style Vaults', { beforeEach: function () { @@ -87,7 +89,7 @@ QUnit.module('Old Style Vaults with bad HD seed', { }) QUnit.test('keyringController:isInitialized', function (assert) { - assert.ok(this.keyringController.getState().isInitialized) + assert.ok(this.keyringController.getState().isInitialized, 'vault is initialized') }) QUnit.test('keyringController:submitPassword', function (assert) { @@ -95,9 +97,9 @@ QUnit.test('keyringController:submitPassword', function (assert) { this.keyringController.submitPassword(PASSWORD) .then((state) => { - assert.ok(state.identities[FIRST_ADDRESS]) + assert.ok(state.identities[BAD_STYLE_FIRST_ADDRESS]) assert.equal(state.lostAccounts.length, 1, 'one lost account') - assert.equal(state.lostAccounts[0], 'e15D894BeCB0354c501AE69429B05143679F39e0'.toLowerCase()) + assert.equal(state.lostAccounts[0], '0xe15D894BeCB0354c501AE69429B05143679F39e0'.toLowerCase()) assert.deepEqual(this.configManager.getLostAccounts(), state.lostAccounts, 'persisted') done() }) -- cgit From 26f1e6cbd2af9d6bb0c58871635466c459cc87d8 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Mon, 19 Dec 2016 21:55:02 -0800 Subject: Remove encryptor in favor of external browser-passworder I broke out the encryptor lib into its own module on npm called browser-passworder. --- test/integration/lib/encryptor-test.js | 71 ---------------------------------- 1 file changed, 71 deletions(-) delete mode 100644 test/integration/lib/encryptor-test.js (limited to 'test/integration/lib') diff --git a/test/integration/lib/encryptor-test.js b/test/integration/lib/encryptor-test.js deleted file mode 100644 index 897d22740..000000000 --- a/test/integration/lib/encryptor-test.js +++ /dev/null @@ -1,71 +0,0 @@ -var encryptor = require('../../../app/scripts/lib/encryptor') - -QUnit.module('encryptor') - -QUnit.test('encryptor:serializeBufferForStorage', function (assert) { - assert.expect(1) - var buf = new Buffer(2) - buf[0] = 16 - buf[1] = 1 - - var output = encryptor.serializeBufferForStorage(buf) - - var expect = '0x1001' - assert.equal(expect, output) -}) - -QUnit.test('encryptor:serializeBufferFromStorage', function (assert) { - assert.expect(2) - var input = '0x1001' - var output = encryptor.serializeBufferFromStorage(input) - - assert.equal(output[0], 16) - assert.equal(output[1], 1) -}) - -QUnit.test('encryptor:encrypt & decrypt', function(assert) { - var done = assert.async(); - var password, data, encrypted - - password = 'a sample passw0rd' - data = { foo: 'data to encrypt' } - - encryptor.encrypt(password, data) - .then(function(encryptedStr) { - assert.equal(typeof encryptedStr, 'string', 'returns a string') - return encryptor.decrypt(password, encryptedStr) - }) - .then(function (decryptedObj) { - assert.deepEqual(decryptedObj, data, 'decrypted what was encrypted') - done() - }) - .catch(function(reason) { - assert.ifError(reason, 'threw an error') - done(reason) - }) - -}) - -QUnit.test('encryptor:encrypt & decrypt with wrong password', function(assert) { - var done = assert.async(); - var password, data, encrypted, wrongPassword - - password = 'a sample passw0rd' - wrongPassword = 'a wrong password' - data = { foo: 'data to encrypt' } - - encryptor.encrypt(password, data) - .then(function(encryptedStr) { - assert.equal(typeof encryptedStr, 'string', 'returns a string') - return encryptor.decrypt(wrongPassword, encryptedStr) - }) - .then(function (decryptedObj) { - assert.equal(!decryptedObj, true, 'Wrong password should not decrypt') - done() - }) - .catch(function(reason) { - done() - }) -}) - - -- cgit From b3533f9bf7bc28988d2f2f280ab6ebc04cf66161 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 20 Dec 2016 17:29:44 -0800 Subject: Fixed another lostAccount test --- test/integration/lib/keyring-controller-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/keyring-controller-test.js b/test/integration/lib/keyring-controller-test.js index 666795a6d..4673e65c2 100644 --- a/test/integration/lib/keyring-controller-test.js +++ b/test/integration/lib/keyring-controller-test.js @@ -44,7 +44,7 @@ QUnit.test('keyringController:submitPassword', function (assert) { this.keyringController.submitPassword(PASSWORD) .then((state) => { assert.ok(state.identities[FIRST_ADDRESS]) - assert.equal(state.lostAccounts.length, 0, 'no lost accounts') + assert.ok(state.lostAccounts, 'no lost accounts') done() }) }) -- cgit From ebeaf3b3d6cf79e2e0f251b9b2da765f0fe6d0e1 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 21 Dec 2016 17:21:10 -0800 Subject: Restructured migration Migrator now returns a lostAccount array that includes objects these objects include keys of address and privateKey, this allows the MetamaskController to restore the lost accounts even without customizing the idStore or the KeyringController. Also includes a patch that allows idStore to synchronously export private keys. --- test/integration/lib/first-time.js | 2 +- test/integration/lib/idStore-migrator-test.js | 74 ++++++++++++++ test/integration/lib/keyring-controller-test.js | 122 ------------------------ 3 files changed, 75 insertions(+), 123 deletions(-) create mode 100644 test/integration/lib/idStore-migrator-test.js delete mode 100644 test/integration/lib/keyring-controller-test.js (limited to 'test/integration/lib') diff --git a/test/integration/lib/first-time.js b/test/integration/lib/first-time.js index 12c573db1..1811ccbd4 100644 --- a/test/integration/lib/first-time.js +++ b/test/integration/lib/first-time.js @@ -79,7 +79,7 @@ QUnit.test('agree to terms', function (assert) { var createButton = app.find('button.primary')[0] createButton.click() - return wait(1500) + return wait(1000) }).then(function() { var detail = app.find('.account-detail-section')[0] diff --git a/test/integration/lib/idStore-migrator-test.js b/test/integration/lib/idStore-migrator-test.js new file mode 100644 index 000000000..338896171 --- /dev/null +++ b/test/integration/lib/idStore-migrator-test.js @@ -0,0 +1,74 @@ +var KeyringController = require('../../../app/scripts/keyring-controller') +var ConfigManager = require('../../../app/scripts/lib/config-manager') +var IdStoreMigrator = require('../../../app/scripts/lib/idStore-migrator') + +var oldStyleVault = require('../mocks/oldVault.json') +var badStyleVault = require('../mocks/badVault.json') + +var STORAGE_KEY = 'metamask-config' +var PASSWORD = '12345678' +var FIRST_ADDRESS = '0x4dd5d356c5A016A220bCD69e82e5AF680a430d00'.toLowerCase() +var SEED = 'fringe damage bounce extend tunnel afraid alert sound all soldier all dinner' + +var BAD_STYLE_FIRST_ADDRESS = '0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9' + +QUnit.module('Old Style Vaults', { + beforeEach: function () { + window.localStorage[STORAGE_KEY] = JSON.stringify(oldStyleVault) + + this.configManager = new ConfigManager({ + loadData: () => { return JSON.parse(window.localStorage[STORAGE_KEY]) }, + setData: (data) => { window.localStorage[STORAGE_KEY] = JSON.stringify(data) }, + }) + + this.migrator = new IdStoreMigrator({ + configManager: this.configManager, + }) + } +}) + +QUnit.test('migrator:isInitialized', function (assert) { + assert.ok(this.migrator) +}) + +QUnit.test('migrator:migratedVaultForPassword', function (assert) { + var done = assert.async() + + this.migrator.migratedVaultForPassword(PASSWORD) + .then((result) => { + const { serialized, lostAccounts } = result + assert.equal(serialized.data.mnemonic, SEED, 'seed phrase recovered') + assert.equal(lostAccounts.length, 0, 'no lost accounts') + done() + }) +}) + +QUnit.module('Old Style Vaults with bad HD seed', { + beforeEach: function () { + window.localStorage[STORAGE_KEY] = JSON.stringify(badStyleVault) + + this.configManager = new ConfigManager({ + loadData: () => { return JSON.parse(window.localStorage[STORAGE_KEY]) }, + setData: (data) => { window.localStorage[STORAGE_KEY] = JSON.stringify(data) }, + }) + + this.migrator = new IdStoreMigrator({ + configManager: this.configManager, + }) + } +}) + +QUnit.test('migrator:migratedVaultForPassword', function (assert) { + var done = assert.async() + + this.migrator.migratedVaultForPassword(PASSWORD) + .then((result) => { + const { serialized, lostAccounts } = result + + assert.equal(lostAccounts.length, 1, 'one lost account') + assert.equal(lostAccounts[0].address, '0xe15D894BeCB0354c501AE69429B05143679F39e0'.toLowerCase()) + assert.ok(lostAccounts[0].privateKey, 'private key exported') + done() + }) +}) + diff --git a/test/integration/lib/keyring-controller-test.js b/test/integration/lib/keyring-controller-test.js deleted file mode 100644 index 4673e65c2..000000000 --- a/test/integration/lib/keyring-controller-test.js +++ /dev/null @@ -1,122 +0,0 @@ -var KeyringController = require('../../../app/scripts/keyring-controller') -var ConfigManager = require('../../../app/scripts/lib/config-manager') - -var oldStyleVault = require('../mocks/oldVault.json') -var badStyleVault = require('../mocks/badVault.json') - -var STORAGE_KEY = 'metamask-config' -var PASSWORD = '12345678' -var FIRST_ADDRESS = '0x4dd5d356c5A016A220bCD69e82e5AF680a430d00'.toLowerCase() - -var BAD_STYLE_FIRST_ADDRESS = '0xac39b311dceb2a4b2f5d8461c1cdaf756f4f7ae9' - - -QUnit.module('Old Style Vaults', { - beforeEach: function () { - window.localStorage[STORAGE_KEY] = JSON.stringify(oldStyleVault) - - this.configManager = new ConfigManager({ - loadData: () => { return JSON.parse(window.localStorage[STORAGE_KEY]) }, - setData: (data) => { window.localStorage[STORAGE_KEY] = JSON.stringify(data) }, - }) - - this.keyringController = new KeyringController({ - configManager: this.configManager, - getNetwork: () => { return '2' }, - }) - - this.ethStore = { - addAccount: () => {}, - removeAccount: () => {}, - } - - this.keyringController.setStore(this.ethStore) - } -}) - -QUnit.test('keyringController:isInitialized', function (assert) { - assert.ok(this.keyringController.getState().isInitialized) -}) - -QUnit.test('keyringController:submitPassword', function (assert) { - var done = assert.async() - - this.keyringController.submitPassword(PASSWORD) - .then((state) => { - assert.ok(state.identities[FIRST_ADDRESS]) - assert.ok(state.lostAccounts, 'no lost accounts') - done() - }) -}) - -QUnit.test('keyringController:setLocked', function (assert) { - var done = assert.async() - var self = this - - this.keyringController.setLocked() - .then(function() { - assert.notOk(self.keyringController.password, 'password should be deallocated') - assert.deepEqual(self.keyringController.keyrings, [], 'keyrings should be deallocated') - done() - }) - .catch((reason) => { - assert.ifError(reason) - done() - }) -}) - -QUnit.module('Old Style Vaults with bad HD seed', { - beforeEach: function () { - window.localStorage[STORAGE_KEY] = JSON.stringify(badStyleVault) - - this.configManager = new ConfigManager({ - loadData: () => { return JSON.parse(window.localStorage[STORAGE_KEY]) }, - setData: (data) => { window.localStorage[STORAGE_KEY] = JSON.stringify(data) }, - }) - - this.keyringController = new KeyringController({ - configManager: this.configManager, - getNetwork: () => { return '2' }, - }) - - this.ethStore = { - addAccount: () => {}, - removeAccount: () => {}, - } - - this.keyringController.setStore(this.ethStore) - } -}) - -QUnit.test('keyringController:isInitialized', function (assert) { - assert.ok(this.keyringController.getState().isInitialized, 'vault is initialized') -}) - -QUnit.test('keyringController:submitPassword', function (assert) { - var done = assert.async() - - this.keyringController.submitPassword(PASSWORD) - .then((state) => { - assert.ok(state.identities[BAD_STYLE_FIRST_ADDRESS]) - assert.equal(state.lostAccounts.length, 1, 'one lost account') - assert.equal(state.lostAccounts[0], '0xe15D894BeCB0354c501AE69429B05143679F39e0'.toLowerCase()) - assert.deepEqual(this.configManager.getLostAccounts(), state.lostAccounts, 'persisted') - done() - }) -}) - -QUnit.test('keyringController:setLocked', function (assert) { - var done = assert.async() - var self = this - - this.keyringController.setLocked() - .then(function() { - assert.notOk(self.keyringController.password, 'password should be deallocated') - assert.deepEqual(self.keyringController.keyrings, [], 'keyrings should be deallocated') - done() - }) - .catch((reason) => { - assert.ifError(reason) - done() - }) -}) -- cgit From e95c93756968284fbe0c968fd79b9d05498d280f Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Fri, 23 Dec 2016 17:09:24 -0800 Subject: Add additional migration test --- test/integration/lib/idStore-migrator-test.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'test/integration/lib') diff --git a/test/integration/lib/idStore-migrator-test.js b/test/integration/lib/idStore-migrator-test.js index 338896171..4ae30411d 100644 --- a/test/integration/lib/idStore-migrator-test.js +++ b/test/integration/lib/idStore-migrator-test.js @@ -1,6 +1,7 @@ -var KeyringController = require('../../../app/scripts/keyring-controller') var ConfigManager = require('../../../app/scripts/lib/config-manager') var IdStoreMigrator = require('../../../app/scripts/lib/idStore-migrator') +var SimpleKeyring = require('../../../app/scripts/keyrings/simple') +var normalize = require('../../../app/scripts/lib/sig-util').normalize var oldStyleVault = require('../mocks/oldVault.json') var badStyleVault = require('../mocks/badVault.json') @@ -68,7 +69,23 @@ QUnit.test('migrator:migratedVaultForPassword', function (assert) { assert.equal(lostAccounts.length, 1, 'one lost account') assert.equal(lostAccounts[0].address, '0xe15D894BeCB0354c501AE69429B05143679F39e0'.toLowerCase()) assert.ok(lostAccounts[0].privateKey, 'private key exported') - done() + + var lostAccount = lostAccounts[0] + var privateKey = lostAccount.privateKey + + var simple = new SimpleKeyring() + simple.deserialize([privateKey]) + .then(() => { + return simple.getAccounts() + }) + .then((accounts) => { + assert.equal(normalize(accounts[0]), lostAccount.address, 'recovered address.') + done() + }) + .catch((reason) => { + assert.ifError(reason) + done(reason) + }) }) }) -- cgit