js: more testing of nativeMessaging connection
authorMaximilian Krambach <maximilian.krambach@intevation.de>
Wed, 9 May 2018 17:40:57 +0000 (19:40 +0200)
committerMaximilian Krambach <maximilian.krambach@intevation.de>
Wed, 9 May 2018 17:40:57 +0000 (19:40 +0200)
--

* There were some inconsistencies between utf-8, transfer and browsers'
  utf16, which broke characters that were split between individual
  messages. src/Connection now contains a workaround that reassembles
  javascripts' format from passed base64 strings. This needs someone
  more experienced looking.
* Added several new tests which were failing during initial debugging
  of this issue
* reorganized BrowsertestExtension to avoid cluttering.

12 files changed:
lang/js/BrowserTestExtension/browsertest.html
lang/js/BrowserTestExtension/index.html [new file with mode: 0644]
lang/js/BrowserTestExtension/longTests.html [new file with mode: 0644]
lang/js/BrowserTestExtension/popup.js
lang/js/BrowserTestExtension/runbrowsertest.js
lang/js/BrowserTestExtension/rununittests.js [new file with mode: 0644]
lang/js/BrowserTestExtension/tests/encryptDecryptTest.js
lang/js/BrowserTestExtension/tests/encryptTest.js
lang/js/BrowserTestExtension/tests/inputvalues.js
lang/js/BrowserTestExtension/tests/longRunningTests.js [new file with mode: 0644]
lang/js/BrowserTestExtension/unittests.html [new file with mode: 0644]
lang/js/src/Connection.js

index d12e03c..c379ef5 100644 (file)
     <script src="libs/chai.js"></script>
     <script src="setup_testing.js"></script>
     <script src="libs/gpgmejs.bundle.js"></script>
     <script src="libs/chai.js"></script>
     <script src="setup_testing.js"></script>
     <script src="libs/gpgmejs.bundle.js"></script>
-
     <script src="tests/inputvalues.js"></script>
     <script src="tests/inputvalues.js"></script>
-    <script src="libs/gpgmejs_unittests.bundle.js"></script>
 <!-- insert tests here-->
     <script src="tests/startup.js"></script>
     <script src="tests/encryptTest.js"></script>
     <script src="tests/encryptDecryptTest.js"></script>
 <!-- insert tests here-->
     <script src="tests/startup.js"></script>
     <script src="tests/encryptTest.js"></script>
     <script src="tests/encryptDecryptTest.js"></script>
-
 <!-- run tests -->
     <script src="runbrowsertest.js"></script>
     </body>
 <!-- run tests -->
     <script src="runbrowsertest.js"></script>
     </body>
diff --git a/lang/js/BrowserTestExtension/index.html b/lang/js/BrowserTestExtension/index.html
new file mode 100644 (file)
index 0000000..05d413b
--- /dev/null
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <link href="libs/mocha.css" rel="stylesheet" />
+    </head>
+<body>
+    <h3>gpgmejs - Tests</h3>
+    <p>
+        The unittests rely on a separately packaged version of gpgmejs,
+        with the different classes and functions exposed. These tests and their
+        input values can be found in gpgme/lang/js/test. They do not test the
+        overall functionality, but the individual behaviour of the components.
+        <ul>
+            <li>
+                <a href="unittests.html">
+                    Unittests of the individual functions and classes.
+                </a>
+            </li>
+        </ul>
+    </p>
+    <p>
+        The functionality tests, to be found in
+        gpgme/lang/js/BrowserTestExtension, check the overall functionality of
+        the standard  packaged version of gpgmejs.
+        <ul>
+            <li>
+                <a href="browsertest.html">
+                    Functionality tests using the bundled library.
+                </a>
+            </li>
+            <li>
+                <a href="longTests.html">
+                    Functionality tests with larger/longer running data sets.
+                </a>
+            </li>
+        </ul>
+        </p>
+    </body>
+</html>
diff --git a/lang/js/BrowserTestExtension/longTests.html b/lang/js/BrowserTestExtension/longTests.html
new file mode 100644 (file)
index 0000000..8ff969b
--- /dev/null
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <link href="libs/mocha.css" rel="stylesheet" />
+    </head>
+<body>
+    <h3>Browsertest</h3>
+    <div id="mocha"></div>
+    <!-- load unit tests -->
+    <script src="libs/mocha.js"></script>
+    <script src="libs/chai.js"></script>
+    <script src="setup_testing.js"></script>
+    <script src="libs/gpgmejs.bundle.js"></script>
+    <script src="tests/inputvalues.js"></script>
+<!-- insert tests here-->
+    <script src="tests/startup.js"></script>
+    <script src="tests/longRunningTests.js"></script>
+<!-- run tests -->
+    <script src="runbrowsertest.js"></script>
+    </body>
+</html>
index 4764df5..12beb1e 100644 (file)
@@ -39,6 +39,6 @@
 
 document.addEventListener('DOMContentLoaded', function() {
     chrome.tabs.create({
 
 document.addEventListener('DOMContentLoaded', function() {
     chrome.tabs.create({
-        url: './browsertest.html'
+        url: './index.html'
     });
 });
     });
 });
diff --git a/lang/js/BrowserTestExtension/rununittests.js b/lang/js/BrowserTestExtension/rununittests.js
new file mode 100644 (file)
index 0000000..f85ed8b
--- /dev/null
@@ -0,0 +1,21 @@
+/* gpgme.js - Javascript integration for gpgme
+ * Copyright (C) 2018 Bundesamt für Sicherheit in der Informationstechnik
+ *
+ * This file is part of GPGME.
+ *
+ * GPGME is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * GPGME is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1+
+ */
+Gpgmejs_test.unittests();
+mocha.run();
index e28dd66..a66e153 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 describe('Encryption and Decryption', function () {
  */
 
 describe('Encryption and Decryption', function () {
-    it('Successful encrypt and decrypt', function (done) {
+    it('Successful encrypt and decrypt simple string', function (done) {
         let prm = Gpgmejs.init();
         prm.then(function (context) {
             context.encrypt(
         let prm = Gpgmejs.init();
         prm.then(function (context) {
             context.encrypt(
@@ -39,54 +39,6 @@ describe('Encryption and Decryption', function () {
                 });
         });
     });
                 });
         });
     });
-
-    /**
-     * Fails with random data! Some bytes (up to 100) of the original are missing in
-     * the result
-*/
-/**
-    for (let j = 0; j < 10; j++){
-    it('Successful encrypt and decrypt specific sets: ',
-            function (done) {
-                let prm = Gpgmejs.init();
-                let data = bigBoringString(5); //see ./inputvalues.js
-                expect(Object.prototype.toString.call(data)).to.equal("[object String]");
-                prm.then(function (context) {
-                    context.encrypt(data,
-                        inputvalues.encrypt.good.fingerprint).then(
-                        function (answer) {
-                            expect(answer).to.not.be.empty;
-                            expect(answer.data).to.be.a("string");
-                            expect(answer.data).to.include(
-                                'BEGIN PGP MESSAGE');
-                            expect(answer.data).to.include(
-                                'END PGP MESSAGE');
-                            context.decrypt(answer.data).then(
-                                function (result) {
-                                    if (data.length !== result.data.length) {
-
-                                        for (let k = 0; k < data.length; k++) {
-                                            if (data[k] !== result.data[k]) {
-                                                console.log(k);
-                                                console.log(data[k - 2] + data[k - 1] + data[k] + data[k + 1]);
-                                                console.log(result.data[k - 2] + result.data[k - 1] + result.data[k] + result.data[k + 1]);
-                                                break;
-                                            }
-                                        }
-                                    }
-                                    expect(result).to.not.be.empty;
-                                    expect(result.data).to.be.a('string');
-                                    expect(result.data).to.equal(data);
-                                    context.connection.disconnect();
-                                    done();
-
-                                });
-                        });
-                });
-            }).timeout(5000);
-        }
-
-
     it('Roundtrip does not destroy trailing whitespace',
         function (done) {
             let prm = Gpgmejs.init();
     it('Roundtrip does not destroy trailing whitespace',
         function (done) {
             let prm = Gpgmejs.init();
@@ -112,88 +64,22 @@ describe('Encryption and Decryption', function () {
                             });
                     });
             });
                             });
                     });
             });
-        }).timeout(3000);
-
-    it('Test with simple non-ascii input',
-        function (done) {
-            let prm = Gpgmejs.init();
-            prm.then(function (context) {
-                let data = '';
-                for (let i=0; i < 1024 * 1024 * 0.1; i++){
-                    data += inputvalues.encrypt.good.data_nonascii;
-                }
-                context.encrypt(data,
-                    inputvalues.encrypt.good.fingerprint).then(
-                    function (answer) {
-                        expect(answer).to.not.be.empty;
-                        expect(answer.data).to.be.a("string");
-                        expect(answer.data).to.include(
-                            'BEGIN PGP MESSAGE');
-                        expect(answer.data).to.include(
-                            'END PGP MESSAGE');
-                        console.log(answer);
-                        context.decrypt(answer.data).then(
-                            function (result) {
-                                expect(result).to.not.be.empty;
-                                expect(result.data).to.be.a('string');
-                                if (data.length !== result.data.length) {
-
-                                    for (let k = 0; k < data.length; k++) {
-                                        if (data[k] !== result.data[k]) {
-                                            console.log(k);
-                                            console.log(data[k - 2] + data[k - 1] + data[k] + data[k + 1]);
-                                            console.log(result.data[k - 2] + result.data[k - 1] + result.data[k] + result.data[k + 1]);
-                                            break;
-                                        }
-                                    }
-                                }
-                                console.log(data.length - result.data.length);
-                                expect(result.data).to.equal(data);
-                                context.connection.disconnect();
-                                done();
+        }).timeout(5000);
 
 
-                            });
-                    });
-            });
-        }).timeout(3000);
-*/
-/**
-    for (let i=0; i< 100; i++) {
-        it('Successful encrypt random data '+ (i+1) + '/100', function (done) {
-            let prm = Gpgmejs.init();
-            let data = bigString(0.2); // << set source data here
+    for (let j = 0; j < inputvalues.encrypt.good.data_nonascii_32.length; j++){
+        it('Roundtrip with >1MB non-ascii input meeting default chunksize (' + (j + 1) + '/' + inputvalues.encrypt.good.data_nonascii_32.length + ')',
+            function (done) {
+                let input = inputvalues.encrypt.good.data_nonascii_32[j];
+                expect(input).to.have.length(32);
+                let prm = Gpgmejs.init();
                 prm.then(function (context) {
                 prm.then(function (context) {
+                    let data = '';
+                    for (let i=0; i < 34 * 1024; i++){
+                        data += input;
+                    }
                     context.encrypt(data,
                         inputvalues.encrypt.good.fingerprint).then(
                     context.encrypt(data,
                         inputvalues.encrypt.good.fingerprint).then(
-                            function (answer){
-                                expect(answer).to.not.be.empty;
-                                expect(answer.data).to.be.a("string");
-                                expect(answer.data).to.include(
-                                    'BEGIN PGP MESSAGE');
-                                expect(answer.data).to.include(
-                                    'END PGP MESSAGE');
-                                context.decrypt(answer.data).then(
-                                    function(result){
-                                        expect(result).to.not.be.empty;
-                                        expect(result.data).to.be.a('string');
-                                        expect(result.data).to.equal(data);
-                                        context.connection.disconnect();
-                                        done();
-                                });
-                        });
-                });
-        }).timeout(5000);
-    };
-*/
-
-/** still fails
-    it('Successful encrypt 0.8 MB Uint8Array', function (done) {
-        let prm = Gpgmejs.init();
-        let data = bigUint8(0.8);
-        prm.then(function (context) {
-                context.encrypt(data,
-                    inputvalues.encrypt.good.fingerprint).then(
-                        function (answer){
+                        function (answer) {
                             expect(answer).to.not.be.empty;
                             expect(answer.data).to.be.a("string");
                             expect(answer.data).to.include(
                             expect(answer).to.not.be.empty;
                             expect(answer.data).to.be.a("string");
                             expect(answer.data).to.include(
@@ -201,38 +87,39 @@ describe('Encryption and Decryption', function () {
                             expect(answer.data).to.include(
                                 'END PGP MESSAGE');
                             context.decrypt(answer.data).then(
                             expect(answer.data).to.include(
                                 'END PGP MESSAGE');
                             context.decrypt(answer.data).then(
-                                function(result){
+                                function (result) {
                                     expect(result).to.not.be.empty;
                                     expect(result.data).to.be.a('string');
                                     expect(result.data).to.equal(data);
                                     expect(result).to.not.be.empty;
                                     expect(result.data).to.be.a('string');
                                     expect(result.data).to.equal(data);
-                                    done();
-                            });
-                    });
-            });
-    }).timeout(5000);
-*/
-
-    it('Decrypt simple non-ascii',
-        function (done) {
-            let prm = Gpgmejs.init();
-            prm.then(function (context) {
-                data = encryptedData;
-                context.decrypt(data).then(
-                    function (result) {
-                        expect(result).to.not.be.empty;
-                        expect(result.data).to.be.a('string');
-                        expect(result.data).to.equal(inputvalues.encrypt.good.data_nonascii);
-                        context.encrypt(inputvalues.encrypt.good.data_nonascii, inputvalues.encrypt.good.fingerprint).then(
-                            function(result){
-                                context.decrypt(result.data).then(function(answer){
-                                    expect(answer.data).to.equal(inputvalues.encrypt.good.data_nonascii);
                                     context.connection.disconnect();
                                     done();
                                 });
                                     context.connection.disconnect();
                                     done();
                                 });
+                        });
+                });
+        }).timeout(5000);
+    };
+
+    it('Encrypt-decrypt simple non-ascii', function (done) {
+        //FAILS TODO: Check newline at the end
+        let prm = Gpgmejs.init();
+        prm.then(function (context) {
+            data = encryptedData;
+            context.decrypt(data).then(
+                function (result) {
+                    expect(result).to.not.be.empty;
+                    expect(result.data).to.be.a('string');
+                    expect(result.data).to.equal(inputvalues.encrypt.good.data_nonascii);
+                    context.encrypt(inputvalues.encrypt.good.data_nonascii, inputvalues.encrypt.good.fingerprint).then(
+                        function(result){
+                            context.decrypt(result.data).then(function(answer){
+                                expect(answer.data).to.equal('¡Äußerste µ€ før ñoquis@hóme! Добрый день');
+                                context.connection.disconnect();
+                                done();
                             });
                         });
                             });
                         });
+                    });
 
 
-            });
-    }).timeout(8000);
+        });
+    }).timeout(6000);
 
 
-});
\ No newline at end of file
+});
index 2e95151..5ef68a3 100644 (file)
@@ -49,7 +49,7 @@ describe('Encryption', function () {
                     done();
                 });
         });
                     done();
                 });
         });
-    }).timeout(5000);
+    }).timeout(10000);
 
 /**
     it('Successful encrypt 20 MB', function (done) {
 
 /**
     it('Successful encrypt 20 MB', function (done) {
index bc8c97b..e23b778 100644 (file)
@@ -23,7 +23,23 @@ var inputvalues = {
         good:{
             data : 'Hello World.',
             fingerprint : 'D41735B91236FDB882048C5A2301635EEFF0CB05',
         good:{
             data : 'Hello World.',
             fingerprint : 'D41735B91236FDB882048C5A2301635EEFF0CB05',
-            data_nonascii: '¡Äußerste µ€ før ñoquis@hóme! Добрый день\n'
+            data_nonascii: '¡Äußerste µ€ før ñoquis@hóme! Добрый день',
+            data_nonascii_32: [
+                'K€K€K€K€K€K€K€K€K€K€K€K€K€K€K€K€',
+                'µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€', //fails result has 3 chars more
+                '€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€', //fails 3 chars
+                '²³²³²³²³²³²³²³²³²³²³²³²³²³²³²³²³',
+                'µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€A€µ€µ€µ€µ€', //fails 2 chars
+                'µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µ€µAµ€µ€µ€µ€', //is okay if 2 chunksizes.
+                'üüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüü',
+                'µAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA€',
+                'µAAAAµAAAAAAAAAAAAAAAAAAAAAAAAA€',
+                'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAµ€',
+                'µAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA°',
+                '€AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA€',
+                'µ||||||||||||||||||||||||||||||€',
+                'æſæſ³¼„¬“³³¬“¬½”æſæſ³¼„¬“³³¬“¬½”'
+            ]
         },
         bad: {
             fingerprint: 'CDC3A2B2860625CCBFC5AAAAAC6D1B604967FC4A'
         },
         bad: {
             fingerprint: 'CDC3A2B2860625CCBFC5AAAAAC6D1B604967FC4A'
@@ -56,7 +72,7 @@ function bigUint8(megabytes){
 function bigBoringString(megabytes){
     let maxlength = 1024 * 1024 * megabytes;
     let string = '';
 function bigBoringString(megabytes){
     let maxlength = 1024 * 1024 * megabytes;
     let string = '';
-    let chars = ' ä0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+    let chars = ' 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
     for (let i= 0; i < maxlength; i++){
         string = string + chars[Math.floor(Math.random() * chars.length)];
     }
     for (let i= 0; i < maxlength; i++){
         string = string + chars[Math.floor(Math.random() * chars.length)];
     }
@@ -101,4 +117,101 @@ var encryptedData =
     'isGL7jOlDCBKwep67ted0cTRPLWkk3NSuLIlvD5xs6L4z3rPu92gXYgbZoMMdP0N\n' +
     'kSAQYOHplfA7YJWkrlRm\n' +
     '=zap6\n' +
     'isGL7jOlDCBKwep67ted0cTRPLWkk3NSuLIlvD5xs6L4z3rPu92gXYgbZoMMdP0N\n' +
     'kSAQYOHplfA7YJWkrlRm\n' +
     '=zap6\n' +
-    '-----END PGP MESSAGE-----\n';
\ No newline at end of file
+    '-----END PGP MESSAGE-----\n';
+var encryptedBroken = '-----BEGIN PGP MESSAGE-----\n' +
+'\n' +
+'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\n' +
+'E14StpggdK8=\n' +
+'=enm3\n' +
+'-----END PGP MESSAGE-----\n';
\ No newline at end of file
diff --git a/lang/js/BrowserTestExtension/tests/longRunningTests.js b/lang/js/BrowserTestExtension/tests/longRunningTests.js
new file mode 100644 (file)
index 0000000..0f32ca9
--- /dev/null
@@ -0,0 +1,53 @@
+describe('Long running Encryption/Decryption', function () {
+    for (let i=0; i< 100; i++) {
+        it('Successful encrypt/decrypt completely random data ' + (i+1) + '/100', function (done) {
+            let prm = Gpgmejs.init();
+            let data = bigString(2);
+                prm.then(function (context) {
+                    context.encrypt(data,
+                        inputvalues.encrypt.good.fingerprint).then(
+                            function (answer){
+                                expect(answer).to.not.be.empty;
+                                expect(answer.data).to.be.a("string");
+                                expect(answer.data).to.include(
+                                    'BEGIN PGP MESSAGE');
+                                expect(answer.data).to.include(
+                                    'END PGP MESSAGE');
+                                context.decrypt(answer.data).then(
+                                    function(result){
+                                        expect(result).to.not.be.empty;
+                                        expect(result.data).to.be.a('string');
+                                        expect(result.data).to.equal(data);
+                                        context.connection.disconnect();
+                                        done();
+                                });
+                        });
+                });
+        }).timeout(5000);
+    };
+
+    it('Successful encrypt 1 MB Uint8Array', function (done) {
+        let prm = Gpgmejs.init();
+        let data = bigUint8(1);
+        prm.then(function (context) {
+                context.encrypt(data,
+                    inputvalues.encrypt.good.fingerprint).then(
+                        function (answer){
+                            expect(answer).to.not.be.empty;
+                            expect(answer.data).to.be.a("string");
+                            expect(answer.data).to.include(
+                                'BEGIN PGP MESSAGE');
+                            expect(answer.data).to.include(
+                                'END PGP MESSAGE');
+                            context.decrypt(answer.data).then(
+                                function(result){
+                                    expect(result).to.not.be.empty;
+                                    expect(result.data).to.be.a('string');
+                                    expect(result.data).to.equal(data);
+                                    done();
+                            });
+                    });
+            });
+    }).timeout(5000);
+
+});
diff --git a/lang/js/BrowserTestExtension/unittests.html b/lang/js/BrowserTestExtension/unittests.html
new file mode 100644 (file)
index 0000000..6f7da3f
--- /dev/null
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <link href="libs/mocha.css" rel="stylesheet" />
+
+    </head>
+<body>
+    <h3>Unit tests</h3>
+    <div id="mocha"></div>
+    <script src="libs/mocha.js"></script>
+    <script src="libs/chai.js"></script>
+    <script src="setup_testing.js"></script>
+    <script src="libs/gpgmejs_unittests.bundle.js"></script>
+    <script src="rununittests.js"></script>
+    </body>
+</html>
index 2c8792d..64621f6 100644 (file)
@@ -181,7 +181,8 @@ class Answer{
                         if (!this._response.hasOwnProperty(key)){
                             this._response[key] = '';
                         }
                         if (!this._response.hasOwnProperty(key)){
                             this._response[key] = '';
                         }
-                        this._response[key] = this._response[key].concat(msg[key]);
+                        // console.log(msg[key]);
+                        this._response[key] += msg[key];
                     }
                     //params should not change through the message
                     else if (poa.params.indexOf(key) >= 0){
                     }
                     //params should not change through the message
                     else if (poa.params.indexOf(key) >= 0){
@@ -214,6 +215,22 @@ class Answer{
      * TODO: does not care yet if completed.
      */
     get message(){
      * TODO: does not care yet if completed.
      */
     get message(){
+        let keys = Object.keys(this._response);
+        let poa = permittedOperations[this.operation].answer;
+        for (let i=0; i < keys.length; i++) {
+            if (poa.data.indexOf(keys[i]) >= 0){
+                if (this._response.base64 == true){
+                    let respatob =  atob(this._response[keys[i]]);
+
+                    let result = decodeURIComponent(
+                        respatob.split('').map(function(c) {
+                            return '%' +
+                            ('00' + c.charCodeAt(0).toString(16)).slice(-2);
+                        }).join(''));
+                    this._response[keys[i]] = result;
+                }
+            }
+        }
         return this._response;
     }
 }
         return this._response;
     }
 }