UNPKG

base64-ct

Version:

Safe, constant-time Base64 encoding and decoding in pure JavaScript, with support for common Base64 variants.

129 lines (128 loc) 5.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const main_1 = require("../src/main"); describe('Base64', () => { describe('Traditional Base64', () => { const codec = new main_1.Base64(true); test('should encode and decode empty buffer', () => { const data = new Uint8Array([]); const encoded = codec.encode(data); expect(encoded).toBe(''); const decoded = codec.decode(encoded); expect(decoded).toEqual(data); }); test('should encode and decode simple string', () => { const data = new TextEncoder().encode('Hello, World!'); const encoded = codec.encode(data); expect(encoded).toBe('SGVsbG8sIFdvcmxkIQ=='); const decoded = codec.decode(encoded); expect(decoded).toEqual(data); }); test('should handle binary data', () => { const data = new Uint8Array([0, 255, 128, 64, 32, 16, 8, 4, 2, 1]); const encoded = codec.encode(data); const decoded = codec.decode(encoded); expect(decoded).toEqual(data); }); test('should reject invalid padding', () => { expect(() => codec.decode('SGVsbG8sIFdvcmxkIQ')).toThrow('Invalid base64 padding'); }); test('should handle ignored characters', () => { const codecWithIgnore = new main_1.Base64(true, ' \n'); const data = new TextEncoder().encode('Hello'); const encoded = 'SGVs bG8='; const decoded = codecWithIgnore.decode(encoded); expect(decoded).toEqual(data); }); }); describe('URL-safe Base64', () => { const codec = new main_1.Base64UrlSafe(false); test('should encode and decode empty buffer', () => { const data = new Uint8Array([]); const encoded = codec.encode(data); expect(encoded).toBe(''); const decoded = codec.decode(encoded); expect(decoded).toEqual(data); }); test('should encode and decode simple string', () => { const data = new TextEncoder().encode('Hello, World!'); const encoded = codec.encode(data); expect(encoded).toBe('SGVsbG8sIFdvcmxkIQ'); const decoded = codec.decode(encoded); expect(decoded).toEqual(data); }); test('should handle binary data', () => { const data = new Uint8Array([0, 255, 128, 64, 32, 16, 8, 4, 2, 1]); const encoded = codec.encode(data); const decoded = codec.decode(encoded); expect(decoded).toEqual(data); }); test('should handle ignored characters', () => { const codecWithIgnore = new main_1.Base64UrlSafe(false, ' \n'); const data = new TextEncoder().encode('Hello'); const encoded = 'SGVs\nbG8 '; const decoded = codecWithIgnore.decode(encoded); expect(decoded).toEqual(data); }); }); describe('Edge Cases', () => { test('should handle single byte', () => { const data = new Uint8Array([65]); // 'A' const encoded = new main_1.Base64(true).encode(data); expect(encoded).toBe('QQ=='); const decoded = new main_1.Base64(true).decode(encoded); expect(decoded).toEqual(data); }); test('should handle two bytes', () => { const data = new Uint8Array([65, 66]); // 'AB' const encoded = new main_1.Base64(true).encode(data); expect(encoded).toBe('QUI='); const decoded = new main_1.Base64(true).decode(encoded); expect(decoded).toEqual(data); }); test('should handle three bytes', () => { const data = new Uint8Array([65, 66, 67]); // 'ABC' const encoded = new main_1.Base64(true).encode(data); expect(encoded).toBe('QUJD'); const decoded = new main_1.Base64(true).decode(encoded); expect(decoded).toEqual(data); }); }); describe('Error Cases', () => { test('should reject invalid characters', () => { const codec = new main_1.Base64(true); expect(() => codec.decode('SGVsbG8sIFdvcmxkIQ@')).toThrow(); }); test('should reject non-canonical padding', () => { const codec = new main_1.Base64(true); expect(() => codec.decode('SGVsbG8sIFdvcmxkIQ===')).toThrow('Invalid base64 padding length'); }); test('should reject non-canonical encoding', () => { const codec = new main_1.Base64(true); expect(() => codec.decode('AAB=')).toThrow('Non-canonical base64 encoding'); }); test('should reject invalid padding position', () => { const codec = new main_1.Base64(true); expect(() => codec.decode('A=BC')).toThrow('Non-canonical base64 encoding'); }); }); describe('Boundary Cases', () => { test('should handle maximum valid input', () => { const data = new Uint8Array(1024).fill(0xFF); const codec = new main_1.Base64(true); const encoded = codec.encode(data); const decoded = codec.decode(encoded); expect(decoded).toEqual(data); }); test('should handle all possible byte values', () => { const data = new Uint8Array(256); for (let i = 0; i < 256; i++) { data[i] = i; } const codec = new main_1.Base64(true); const encoded = codec.encode(data); const decoded = codec.decode(encoded); expect(decoded).toEqual(data); }); }); });