twonly-app-dependencies/hashlib_codecs/test/base64_test.dart
2025-12-07 16:10:41 +01:00

173 lines
5.2 KiB
Dart

import 'dart:convert' as cvt;
import 'package:hashlib_codecs/hashlib_codecs.dart';
import 'package:test/test.dart';
import './utils.dart';
void main() {
group('Test base64', () {
test('parameter overrides', () {
var inp = [0x3, 0xF1];
var out = "A/E=";
var npo = "A/E";
var act = toBase64(inp);
expect(act, equals(out));
act = toBase64(
inp,
codec: Base64Codec.standard,
);
expect(act, equals(out));
act = toBase64(
inp,
codec: Base64Codec.standard,
padding: false,
);
expect(act, equals(npo));
act = toBase64(
inp,
codec: Base64Codec.standard,
url: true,
);
expect(act, equals(out));
act = toBase64(
inp,
codec: Base64Codec.standard,
padding: false,
url: true,
);
expect(act, equals(npo));
});
test('encoding [0, 0, 0, 0] => AAAAAA==', () {
var inp = [0, 0, 0, 0];
var out = "AAAAAA==";
expect(toBase64(inp), equals(out));
});
test('decoding AAAAAA== => [0, 0, 0, 0]', () {
var inp = [0, 0, 0, 0];
var out = "AAAAAA==";
expect(fromBase64(out), equals(inp));
});
test('encoding no padding [0, 0, 0, 0] => AAAAAA', () {
var inp = [0, 0, 0, 0];
var out = "AAAAAA";
var act = toBase64(inp, padding: false);
expect(act, equals(out));
});
test('decoding no padding AAAAAA => [0, 0, 0, 0]', () {
var inp = [0, 0, 0, 0];
var out = "AAAAAA";
expect(fromBase64(out), equals(inp));
});
test('encoding no padding', () {
for (int i = 0; i < 100; ++i) {
var b = randomBytes(i);
var r = cvt.base64Encode(b).replaceAll('=', '');
var a = toBase64(b, padding: false);
expect(a, r, reason: 'length $i');
}
});
test('decoding no padding', () {
for (int i = 0; i < 100; ++i) {
var b = randomBytes(i);
var r = cvt.base64Encode(b).replaceAll('=', '');
expect(fromBase64(r), equals(b), reason: 'length $i');
}
});
test('encoding with padding', () {
for (int i = 0; i < 100; ++i) {
var b = randomBytes(i);
var r = cvt.base64Encode(b);
expect(toBase64(b), r, reason: 'length $i');
}
});
test('decoding with padding', () {
for (int i = 0; i < 100; ++i) {
var b = randomBytes(i);
var r = cvt.base64Encode(b);
expect(fromBase64(r), equals(b), reason: 'length $i');
}
});
test('encoding <-> decoding no padding', () {
for (int i = 0; i < 100; ++i) {
var b = randomBytes(i);
var r = toBase64(b, padding: false);
expect(fromBase64(r), equals(b), reason: 'length $i');
}
});
test('encoding <-> decoding with padding', () {
for (int i = 0; i < 100; ++i) {
var b = randomBytes(i);
var r = toBase64(b);
expect(fromBase64(r), equals(b), reason: 'length $i');
}
});
test('[bcrypt] encoding <-> decoding', () {
for (int i = 0; i < 100; ++i) {
var b = randomBytes(i);
var r = toBase64(b, codec: Base64Codec.bcrypt);
var a = fromBase64(r, codec: Base64Codec.bcrypt);
expect(a, equals(b), reason: 'length $i');
}
});
group('decoding with invalid chars', () {
test('Hashlib!', () {
try {
fromBase64("Hashlib!");
throw Exception('No error thrown');
} on FormatException catch (err) {
expect(err.message, equals("Invalid character 33"));
}
});
test('a.10', () {
try {
fromBase64("a.10");
throw Exception('No error thrown');
} on FormatException catch (err) {
expect(err.message, equals("Invalid character 46"));
}
});
test('s*methings', () {
try {
fromBase64("s*methings");
throw Exception('No error thrown');
} on FormatException catch (err) {
expect(err.message, equals("Invalid character 42"));
}
});
});
test("decoding with PHC string format B64 (16 bytes)", () {
var inp = "gZiV/M1gPc22ElAH/Jh1Hw";
var out = fromBase64(inp, padding: false);
var res = toBase64(out, padding: false);
expect(res, inp);
// String "CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno"
});
test("decoding with PHC string format B64 (32 bytes)", () {
var inp = "CWOrkoo7oJBQ/iyh7uJ0LO2aLEfrHwTWllSAxT0zRno";
var out = fromBase64(inp, padding: false);
var res = toBase64(out, padding: false);
expect(res, inp);
});
group('decoding with invalid length', () {
test('H', () {
expect(() => fromBase64("H"), throwsFormatException);
});
test('Ha', () {
expect(() => fromBase64("Ha"), throwsFormatException);
});
test('HaB', () {
expect(() => fromBase64("HaB"), throwsFormatException);
});
test('Hashl', () {
expect(() => fromBase64("Hashl"), throwsFormatException);
});
test('Hashli', () {
expect(() => fromBase64("Hashli"), throwsFormatException);
});
test('Hashlib', () {
expect(() => fromBase64("Hashlib"), throwsFormatException);
});
});
});
}