From 17c6f90113d81f67125b3433634ba1a2c1addb94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Obernd=C3=B6rfer?= Date: Mon, 13 Jan 2014 15:42:03 +0100 Subject: [PATCH] Unit tests for web worker. Only active for browsers. --- Gruntfile.js | 5 ++ src/worker/async_proxy.js | 5 +- src/worker/worker.js | 16 ++--- test/unittests.js | 3 + test/worker/api.js | 137 ++++++++++++++++++++++++++++++++++++++ test/worker/index.js | 4 ++ 6 files changed, 160 insertions(+), 10 deletions(-) create mode 100644 test/worker/api.js create mode 100644 test/worker/index.js diff --git a/Gruntfile.js b/Gruntfile.js index 6eff3230..1e0ec693 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -23,6 +23,11 @@ module.exports = function(grunt) { external: [ 'crypto', 'node-localstorage' ] } }, + worker: { + files: { + 'dist/openpgp.worker.js': [ './src/worker/worker.js' ] + } + }, unittests: { files: { 'test/lib/unittests-bundle.js': [] diff --git a/src/worker/async_proxy.js b/src/worker/async_proxy.js index 7bedf69d..6b5b7852 100644 --- a/src/worker/async_proxy.js +++ b/src/worker/async_proxy.js @@ -28,9 +28,10 @@ function AsyncProxy(path) { } AsyncProxy.prototype.onMessage = function(event) { - switch (event.data.event) { + var msg = event.data; + switch (msg.event) { case 'method-return': - this.tasks.shift()(event.data.err, event.data.data); + this.tasks.shift()(msg.err ? new Error(msg.err) : null, msg.data); break; default: throw new Error('Unknown Worker Event.'); diff --git a/src/worker/worker.js b/src/worker/worker.js index 1a9ff2b2..a8b9c9a4 100644 --- a/src/worker/worker.js +++ b/src/worker/worker.js @@ -15,7 +15,7 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -var window = {}; // to make UMD bundles work +window = {}; // to make UMD bundles work importScripts('openpgp.js'); @@ -33,7 +33,7 @@ onmessage = function (event) { msg.keys = msg.keys.map(packetlistCloneToKey); data = window.openpgp.encryptMessage(msg.keys, msg.text); } catch (e) { - err = e; + err = e.message; } postMessage({event: 'method-return', data: data, err: err}); break; @@ -43,7 +43,7 @@ onmessage = function (event) { msg.privateKey = packetlistCloneToKey(msg.privateKey); data = window.openpgp.signAndEncryptMessage(msg.publicKeys, msg.privateKey, msg.text); } catch (e) { - err = e; + err = e.message; } postMessage({event: 'method-return', data: data, err: err}); break; @@ -53,7 +53,7 @@ onmessage = function (event) { msg.message = packetlistCloneToMessage(msg.message.packets); data = window.openpgp.decryptMessage(msg.privateKey, msg.message); } catch (e) { - err = e; + err = e.message; } postMessage({event: 'method-return', data: data, err: err}); break; @@ -64,7 +64,7 @@ onmessage = function (event) { msg.message = packetlistCloneToMessage(msg.message.packets); data = window.openpgp.decryptAndVerifyMessage(msg.privateKey, msg.publicKeys, msg.message); } catch (e) { - err = e; + err = e.message; } postMessage({event: 'method-return', data: data, err: err}); break; @@ -73,7 +73,7 @@ onmessage = function (event) { msg.privateKeys = msg.privateKeys.map(packetlistCloneToKey); data = window.openpgp.signClearMessage(msg.privateKeys, msg.text); } catch (e) { - err = e; + err = e.message; } postMessage({event: 'method-return', data: data, err: err}); break; @@ -84,7 +84,7 @@ onmessage = function (event) { msg.message = new window.openpgp.cleartext.CleartextMessage(msg.message.text, packetlist); data = window.openpgp.verifyClearSignedMessage(msg.publicKeys, msg.message); } catch (e) { - err = e; + err = e.message; } postMessage({event: 'method-return', data: data, err: err}); break; @@ -93,7 +93,7 @@ onmessage = function (event) { data = window.openpgp.generateKeyPair(msg.keyType, msg.numBits, msg.userId, msg.passphrase); data.key = data.key.toPacketlist(); } catch (e) { - err = e; + err = e.message; } postMessage({event: 'method-return', data: data, err: err}); break; diff --git a/test/unittests.js b/test/unittests.js index 4b66c6de..5705bf17 100644 --- a/test/unittests.js +++ b/test/unittests.js @@ -1,4 +1,7 @@ describe('Unit Tests', function () { require('./general'); require('./crypto'); + if (typeof window !== 'undefined') { + require('./worker'); + } }); diff --git a/test/worker/api.js b/test/worker/api.js new file mode 100644 index 00000000..8826312b --- /dev/null +++ b/test/worker/api.js @@ -0,0 +1,137 @@ +'use strict'; + +var openpgp = typeof window != 'undefined' && window.openpgp ? window.openpgp : require('../../src/index'); + +var chai = require('chai'), + expect = chai.expect; + +describe('High level API', function() { + + var proxy; + + this.timeout(50000); + + var pub_key = + ['-----BEGIN PGP PUBLIC KEY BLOCK-----', + 'Version: GnuPG v2.0.19 (GNU/Linux)', + 'Type: RSA/RSA', + '', + 'mI0EUmEvTgEEANyWtQQMOybQ9JltDqmaX0WnNPJeLILIM36sw6zL0nfTQ5zXSS3+', + 'fIF6P29lJFxpblWk02PSID5zX/DYU9/zjM2xPO8Oa4xo0cVTOTLj++Ri5mtr//f5', + 'GLsIXxFrBJhD/ghFsL3Op0GXOeLJ9A5bsOn8th7x6JucNKuaRB6bQbSPABEBAAG0', + 'JFRlc3QgTWNUZXN0aW5ndG9uIDx0ZXN0QGV4YW1wbGUuY29tPoi5BBMBAgAjBQJS', + 'YS9OAhsvBwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQSmNhOk1uQJQwDAP6', + 'AgrTyqkRlJVqz2pb46TfbDM2TDF7o9CBnBzIGoxBhlRwpqALz7z2kxBDmwpQa+ki', + 'Bq3jZN/UosY9y8bhwMAlnrDY9jP1gdCo+H0sD48CdXybblNwaYpwqC8VSpDdTndf', + '9j2wE/weihGp/DAdy/2kyBCaiOY1sjhUfJ1GogF49rC4jQRSYS9OAQQA6R/PtBFa', + 'JaT4jq10yqASk4sqwVMsc6HcifM5lSdxzExFP74naUMMyEsKHP53QxTF0Grqusag', + 'Qg/ZtgT0CN1HUM152y7ACOdp1giKjpMzOTQClqCoclyvWOFB+L/SwGEIJf7LSCEr', + 'woBuJifJc8xAVr0XX0JthoW+uP91eTQ3XpsAEQEAAYkBPQQYAQIACQUCUmEvTgIb', + 'LgCoCRBKY2E6TW5AlJ0gBBkBAgAGBQJSYS9OAAoJEOCE90RsICyXuqIEANmmiRCA', + 'SF7YK7PvFkieJNwzeK0V3F2lGX+uu6Y3Q/Zxdtwc4xR+me/CSBmsURyXTO29OWhP', + 'GLszPH9zSJU9BdDi6v0yNprmFPX/1Ng0Abn/sCkwetvjxC1YIvTLFwtUL/7v6NS2', + 'bZpsUxRTg9+cSrMWWSNjiY9qUKajm1tuzPDZXAUEAMNmAN3xXN/Kjyvj2OK2ck0X', + 'W748sl/tc3qiKPMJ+0AkMF7Pjhmh9nxqE9+QCEl7qinFqqBLjuzgUhBU4QlwX1GD', + 'AtNTq6ihLMD5v1d82ZC7tNatdlDMGWnIdvEMCv2GZcuIqDQ9rXWs49e7tq1NncLY', + 'hz3tYjKhoFTKEIq3y3Pp', + '=h/aX', + '-----END PGP PUBLIC KEY BLOCK-----'].join('\n'); + + var priv_key = + ['-----BEGIN PGP PRIVATE KEY BLOCK-----', + 'Version: GnuPG v2.0.19 (GNU/Linux)', + 'Type: RSA/RSA', + 'Pwd: hello world', + '', + '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', + '=lw5e', + '-----END PGP PRIVATE KEY BLOCK-----'].join('\n'); + + var plaintext = 'short message\nnext line\n한국어/조선말'; + + var pubKey, privKey; + + it('Test initialization', function (done) { + pubKey = openpgp.key.readArmored(pub_key).keys[0]; + expect(pubKey).to.exist; + + privKey = openpgp.key.readArmored(priv_key).keys[0]; + expect(privKey).to.exist; + + done(); + }); + + it('Initialize AsyncProxy', function (done) { + proxy = new openpgp.AsyncProxy('../dist/openpgp.worker.js'); + expect(proxy).to.exist; + done(); + }); + + it('Generate key', function (done) { + proxy.generateKeyPair(3, 1024, 'Test McTestington ', 'hello world', function(err, data) { + expect(err).to.not.exist; + expect(data).to.exist; + expect(data.publicKeyArmored).to.match(/^-----BEGIN PGP PUBLIC/); + expect(data.privateKeyArmored).to.match(/^-----BEGIN PGP PRIVATE/); + expect(data.key).to.be.an.instanceof(openpgp.key.Key); + done(); + }); + }); + + it('Encrypt and decrypt text', function (done) { + proxy.encryptMessage([pubKey], plaintext, function(err, data) { + expect(err).to.not.exist; + expect(data).to.exist; + expect(data).to.match(/^-----BEGIN PGP MESSAGE/); + var msg = openpgp.message.readArmored(data); + expect(msg).to.be.an.instanceof(openpgp.message.Message); + proxy.decryptMessage(privKey, msg, function(err, data) { + expect(data).to.not.exist; + expect(err).to.exist; + expect(err.message).to.equal('Private key is not decrypted.'); + privKey.decrypt('hello world'); + proxy.decryptMessage(privKey, msg, function(err, data) { + expect(err).to.not.exist; + expect(data).to.exist; + expect(data).to.equal(plaintext); + done(); + }); + }); + }); + }); + +}); + + diff --git a/test/worker/index.js b/test/worker/index.js new file mode 100644 index 00000000..341bd56a --- /dev/null +++ b/test/worker/index.js @@ -0,0 +1,4 @@ +describe('Web Worker', function () { + require('./api.js'); +}); +