booletwa
Version:
Generate TWA projects from a Web Manifest
146 lines (133 loc) • 5.13 kB
text/typescript
/*
* Copyright 2019 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {KeyTool, CreateKeyOptions, KeyOptions} from '../../../lib/jdk/KeyTool';
import {Config} from '../../../lib/Config';
import util = require('../../../lib/util');
import {JdkHelper} from '../../../lib/jdk/JdkHelper';
import * as fs from 'fs';
import {MockLog} from '../../..';
const SHA1 = '38:03:D6:95:91:7C:9C:EE:4A:A0:58:43:A7:43:A5:D2:76:52:EF:9B';
const SHA256 = 'F5:08:9F:8A:D4:C8:4A:15:6D:0A:B1:3F:61:96:BE:C7:87:8C:DE:05:59:92:B2:A3:2D:05:' +
'05:A5:62:A5:2F:34';
const LIST_OUTPUT = `Alias name: key0
Creation date: 28 Jan 2019
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Test Test, OU=Test, O=Test, L=London, ST=London, C=GB
Issuer: CN=Test Test, OU=Test, O=Test, L=London, ST=London, C=GB
Serial number: ea67d3d
Valid from: Mon Jan 28 14:58:00 GMT 2019 until: Fri Jan 22 14:58:00 GMT 2044
Certificate fingerprints:
SHA1: ${SHA1}
SHA256: ${SHA256}
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
`;
describe('KeyTool', () => {
const config = new Config('/home/user/jdk8', '/home/user/sdktools');
const process = {
platform: 'linux',
env: {
'PATH': '',
},
} as unknown as NodeJS.Process;
const jdkHelper = new JdkHelper(process, config);
describe('#createSigningKey', () => {
const keyOptions = {
path: '/',
alias: 'keyalias',
keypassword: 'keypass',
password: 'pass',
fullName: 'Test, Us`er',
organization: 'Test, Organization$',
organizationalUnit: 'Tes,ters',
country: 'GB',
} as CreateKeyOptions;
it('Executes the correct command to create a key', async () => {
const keyTool = new KeyTool(jdkHelper, new MockLog());
spyOn(fs, 'existsSync').and.returnValue(false);
spyOn(util, 'execute').and.stub();
await keyTool.createSigningKey(keyOptions);
expect(util.execute).toHaveBeenCalledWith([
'keytool',
'-genkeypair',
'-dname "cn=Test\\, Us\\`er, ou=Tes\\,ters, ' +
`o=Test\\, Organization\\$, c=${keyOptions.country}"`,
`-alias "${keyOptions.alias}"`,
`-keypass "${keyOptions.keypassword}"`,
`-keystore "${keyOptions.path}"`,
`-storepass "${keyOptions.password}"`,
'-validity 20000',
'-keyalg RSA',
], jdkHelper.getEnv());
});
it('Skips creation when a key already exists', async () => {
const keyTool = new KeyTool(jdkHelper, new MockLog());
spyOn(fs, 'existsSync').and.returnValue(true);
spyOn(util, 'execute').and.stub();
await keyTool.createSigningKey(keyOptions);
expect(util.execute).not.toHaveBeenCalled();
});
it('Deletes and writes a new key when overwrite = true', async () => {
const keyTool = new KeyTool(jdkHelper, new MockLog());
spyOn(fs, 'existsSync').and.returnValue(true);
spyOn(fs.promises, 'unlink').and.resolveTo();
spyOn(util, 'execute').and.stub();
await keyTool.createSigningKey(keyOptions, true);
expect(fs.promises.unlink).toHaveBeenCalledWith(keyOptions.path);
expect(util.execute).toHaveBeenCalled();
});
});
describe('#list', () => {
const keyOptions = {
path: '/',
alias: 'keyalias',
keypassword: 'keypass',
password: 'pass',
} as KeyOptions;
it('Executes the correct command to list keys', async () => {
const keyTool = new KeyTool(jdkHelper, new MockLog());
spyOn(fs, 'existsSync').and.returnValue(true);
spyOn(util, 'execute').and.resolveTo({stdout: '', stderr: ''});
await keyTool.list(keyOptions);
expect(util.execute).toHaveBeenCalledWith([
'keytool',
'-J-Duser.language=en',
'-list',
'-v',
'-keystore "/"',
'-alias "keyalias"',
'-storepass "pass"',
'-keypass "keypass"',
], jdkHelper.getEnv());
});
it('Throws error if keyOptions.path doesn\'t exist', async () => {
const keyTool = new KeyTool(jdkHelper, new MockLog());
spyOn(fs, 'existsSync').and.returnValue(false);
await expectAsync(keyTool.list(keyOptions)).toBeRejectedWithError();
});
});
describe('#parseKeyInfo', () => {
it('parses fingerprints', () => {
const keyInfo = KeyTool.parseKeyInfo(LIST_OUTPUT);
expect(keyInfo.fingerprints.size).toBe(2);
expect(keyInfo.fingerprints.get('SHA1')).toBe(SHA1);
expect(keyInfo.fingerprints.get('SHA256')).toBe(SHA256);
});
});
});