mirror of https://github.com/certd/certd
				
				
				
			
		
			
				
	
	
		
			146 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
| /**
 | |
|  * Utility method tests
 | |
|  */
 | |
| 
 | |
| const dns = require('dns').promises;
 | |
| const fs = require('fs').promises;
 | |
| const path = require('path');
 | |
| const { assert } = require('chai');
 | |
| const util = require('./../src/util');
 | |
| const { readCertificateInfo } = require('./../src/crypto');
 | |
| 
 | |
| describe('util', () => {
 | |
|     const testCertPath1 = path.join(__dirname, 'fixtures', 'certificate.crt');
 | |
|     const testCertPath2 = path.join(__dirname, 'fixtures', 'letsencrypt.crt');
 | |
| 
 | |
|     it('retry()', async () => {
 | |
|         let attempts = 0;
 | |
|         const backoffOpts = {
 | |
|             min: 100,
 | |
|             max: 500,
 | |
|         };
 | |
| 
 | |
|         await assert.isRejected(util.retry(() => {
 | |
|             throw new Error('oops');
 | |
|         }, backoffOpts));
 | |
| 
 | |
|         const r = await util.retry(() => {
 | |
|             attempts += 1;
 | |
| 
 | |
|             if (attempts < 3) {
 | |
|                 throw new Error('oops');
 | |
|             }
 | |
| 
 | |
|             return 'abc';
 | |
|         }, backoffOpts);
 | |
| 
 | |
|         assert.strictEqual(r, 'abc');
 | |
|         assert.strictEqual(attempts, 3);
 | |
|     });
 | |
| 
 | |
|     it('parseLinkHeader()', () => {
 | |
|         const r1 = util.parseLinkHeader('<https://example.com/a>;rel="alternate"');
 | |
|         assert.isArray(r1);
 | |
|         assert.strictEqual(r1.length, 1);
 | |
|         assert.strictEqual(r1[0], 'https://example.com/a');
 | |
| 
 | |
|         const r2 = util.parseLinkHeader('<https://example.com/b>;rel="test"');
 | |
|         assert.isArray(r2);
 | |
|         assert.strictEqual(r2.length, 0);
 | |
| 
 | |
|         const r3 = util.parseLinkHeader('<http://example.com/c>; rel="test"', 'test');
 | |
|         assert.isArray(r3);
 | |
|         assert.strictEqual(r3.length, 1);
 | |
|         assert.strictEqual(r3[0], 'http://example.com/c');
 | |
| 
 | |
|         const r4 = util.parseLinkHeader(`<https://example.com/a>; rel="alternate",
 | |
|             <https://example.com/x>; rel="nope",
 | |
|             <https://example.com/b>;rel="alternate",
 | |
|             <https://example.com/c>;   rel="alternate"`);
 | |
|         assert.isArray(r4);
 | |
|         assert.strictEqual(r4.length, 3);
 | |
|         assert.strictEqual(r4[0], 'https://example.com/a');
 | |
|         assert.strictEqual(r4[1], 'https://example.com/b');
 | |
|         assert.strictEqual(r4[2], 'https://example.com/c');
 | |
|     });
 | |
| 
 | |
|     it('parseRetryAfterHeader()', () => {
 | |
|         const r1 = util.parseRetryAfterHeader('');
 | |
|         assert.strictEqual(r1, 0);
 | |
| 
 | |
|         const r2 = util.parseRetryAfterHeader('abcdef');
 | |
|         assert.strictEqual(r2, 0);
 | |
| 
 | |
|         const r3 = util.parseRetryAfterHeader('123');
 | |
|         assert.strictEqual(r3, 123);
 | |
| 
 | |
|         const r4 = util.parseRetryAfterHeader('123.456');
 | |
|         assert.strictEqual(r4, 123);
 | |
| 
 | |
|         const r5 = util.parseRetryAfterHeader('-555');
 | |
|         assert.strictEqual(r5, 0);
 | |
| 
 | |
|         const r6 = util.parseRetryAfterHeader('Wed, 21 Oct 2015 07:28:00 GMT');
 | |
|         assert.strictEqual(r6, 0);
 | |
| 
 | |
|         const now = new Date();
 | |
|         const future = new Date(now.getTime() + 123000);
 | |
|         const r7 = util.parseRetryAfterHeader(future.toUTCString());
 | |
|         assert.isTrue(r7 > 100);
 | |
|     });
 | |
| 
 | |
|     it('findCertificateChainForIssuer()', async () => {
 | |
|         const certs = [
 | |
|             (await fs.readFile(testCertPath1)).toString(),
 | |
|             (await fs.readFile(testCertPath2)).toString(),
 | |
|         ];
 | |
| 
 | |
|         const r1 = util.findCertificateChainForIssuer(certs, 'abc123');
 | |
|         const r2 = util.findCertificateChainForIssuer(certs, 'example.com');
 | |
|         const r3 = util.findCertificateChainForIssuer(certs, 'E6');
 | |
| 
 | |
|         [r1, r2, r3].forEach((r) => {
 | |
|             assert.isString(r);
 | |
|             assert.isNotEmpty(r);
 | |
|         });
 | |
| 
 | |
|         assert.strictEqual(readCertificateInfo(r1).issuer.commonName, 'example.com');
 | |
|         assert.strictEqual(readCertificateInfo(r2).issuer.commonName, 'example.com');
 | |
|         assert.strictEqual(readCertificateInfo(r3).issuer.commonName, 'E6');
 | |
|     });
 | |
| 
 | |
|     it('formatResponseError()', () => {
 | |
|         const e1 = util.formatResponseError({ data: { error: 'aaa' } });
 | |
|         assert.strictEqual(e1, 'aaa');
 | |
| 
 | |
|         const e2 = util.formatResponseError({ data: { error: { detail: 'bbb' } } });
 | |
|         assert.strictEqual(e2, 'bbb');
 | |
| 
 | |
|         const e3 = util.formatResponseError({ data: { detail: 'ccc' } });
 | |
|         assert.strictEqual(e3, 'ccc');
 | |
| 
 | |
|         const e4 = util.formatResponseError({ data: { a: 123 } });
 | |
|         assert.strictEqual(e4, '{"a":123}');
 | |
| 
 | |
|         const e5 = util.formatResponseError({});
 | |
|         assert.isString(e5);
 | |
|         assert.isEmpty(e5);
 | |
|     });
 | |
| 
 | |
|     it('getAuthoritativeDnsResolver()', async () => {
 | |
|         /* valid domain - should not use global default */
 | |
|         const r1 = await util.getAuthoritativeDnsResolver('example.com');
 | |
|         assert.instanceOf(r1, dns.Resolver);
 | |
|         assert.isNotEmpty(r1.getServers());
 | |
|         assert.notDeepEqual(r1.getServers(), dns.getServers());
 | |
| 
 | |
|         /* invalid domain - fallback to global default */
 | |
|         const r2 = await util.getAuthoritativeDnsResolver('invalid.xtldx');
 | |
|         assert.instanceOf(r2, dns.Resolver);
 | |
|         assert.deepStrictEqual(r2.getServers(), dns.getServers());
 | |
|     });
 | |
| 
 | |
|     /* TODO: Figure out how to test this */
 | |
|     it('retrieveTlsAlpnCertificate()');
 | |
| });
 |