ccdb4994d25e4897cdee71a56936d3da8209f643
[gpgme.git] / lang / js / BrowserTestExtension / tests / encryptTest.js
1 /* gpgme.js - Javascript integration for gpgme
2  * Copyright (C) 2018 Bundesamt für Sicherheit in der Informationstechnik
3  *
4  * This file is part of GPGME.
5  *
6  * GPGME is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * GPGME is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  * SPDX-License-Identifier: LGPL-2.1+
19  *
20  * Author(s):
21  *     Maximilian Krambach <mkrambach@intevation.de>
22  */
23
24 /* global describe, it, expect, before, Gpgmejs */
25 /* global inputvalues, fixedLengthString */
26
27 describe('Encryption', function () {
28     let context = null;
29     const good_fpr = inputvalues.encrypt.good.fingerprint;
30     before(function (done){
31         const prm = Gpgmejs.init();
32         prm.then(function (gpgmejs){
33             context = gpgmejs;
34             done();
35         });
36     });
37
38     it('Successful encrypt', function (done) {
39         const data = inputvalues.encrypt.good.data;
40         context.encrypt({ data: data, publicKeys: good_fpr })
41             .then(function (answer) {
42                 expect(answer).to.not.be.empty;
43                 expect(answer.data).to.be.a('string');
44                 expect(answer.data).to.include('BEGIN PGP MESSAGE');
45                 expect(answer.data).to.include('END PGP MESSAGE');
46                 done();
47             });
48     });
49
50     const sizes = [5,20,50];
51     for (let i=0; i < sizes.length; i++) {
52         it('Successful encrypt a ' + sizes[i] + 'MB message', function (done) {
53             const data = fixedLengthString(sizes[i]);
54             context.encrypt({ data: data, publicKeys: good_fpr })
55                 .then(function (answer) {
56                     expect(answer).to.not.be.empty;
57                     expect(answer.data).to.be.a('string');
58                     expect(answer.data).to.include('BEGIN PGP MESSAGE');
59                     expect(answer.data).to.include('END PGP MESSAGE');
60                     done();
61                 });
62         }).timeout(20000);
63     }
64
65     it('Sending encryption without keys fails', function (done) {
66         const data = inputvalues.encrypt.good.data;
67         context.encrypt({ data: data }).then(function (answer) {
68             expect(answer).to.be.undefined;
69         }, function (error){
70             expect(error).to.be.an('Error');
71             expect(error.code).to.equal('MSG_INCOMPLETE');
72             done();
73         });
74     });
75
76     it('Sending encryption without data fails', function (done) {
77         context.encrypt({ data: null, publicKeys: good_fpr })
78             .then(function (answer) {
79                 expect(answer).to.be.undefined;
80             }, function (error) {
81                 expect(error).to.be.an.instanceof(Error);
82                 expect(error.code).to.equal('MSG_INCOMPLETE');
83                 done();
84             });
85     });
86
87     it('Sending encryption with non existing keys fails', function (done) {
88         const data = inputvalues.encrypt.good.data;
89         const bad_fpr = inputvalues.encrypt.bad.fingerprint;
90         context.encrypt({ data:data, publicKeys: bad_fpr })
91             .then(function (answer) {
92                 expect(answer).to.be.undefined;
93             }, function (error){
94                 expect(error).to.be.an('Error');
95                 expect(error.code).to.not.be.undefined;
96                 expect(error.code).to.equal('GNUPG_ERROR');
97                 done();
98             });
99     }).timeout(5000);
100
101     it('Overly large message ( > 64MB) is rejected', function (done) {
102         const data = fixedLengthString(65);
103         context.encrypt({ data: data, publicKeys: good_fpr })
104             .then(function (answer) {
105                 expect(answer).to.be.undefined;
106             }, function (error){
107                 expect(error).to.be.an.instanceof(Error);
108                 // TODO: there is a 64 MB hard limit at least in chrome at:
109                 // chromium//extensions/renderer/messaging_util.cc:
110                 // kMaxMessageLength
111                 // The error will be a browser error, not from gnupg or from
112                 // this library
113                 done();
114             });
115     }).timeout(8000);
116
117     // TODO check different valid parameter
118 });