Index: test/base64_test.dart |
diff --git a/test/base64_test.dart b/test/base64_test.dart |
index b5647b035bf4cfe55091663915d38c9f01fa5b64..725ac3fef3005a91d6dfb325bf0814fe9c3e0799 100644 |
--- a/test/base64_test.dart |
+++ b/test/base64_test.dart |
@@ -6,6 +6,7 @@ |
library base64_test; |
import 'dart:math'; |
+import 'dart:async'; |
import "package:crypto/crypto.dart"; |
import "package:test/test.dart"; |
@@ -16,7 +17,23 @@ void main() { |
test('decoder for malformed input', _testDecoderForMalformedInput); |
test('encode decode lists', _testEncodeDecodeLists); |
test('url safe encode-decode', _testUrlSafeEncodeDecode); |
+ test('consistent safe/unsafe character decoding', |
+ _testConsistentSafeUnsafeDecode); |
+ test('streaming encoder', _testStreamingEncoder); |
+ test('streaming decoder', _testStreamingDecoder); |
+ test('streaming decoder for malformed input', |
+ _testStreamingDecoderForMalformedInput); |
+ test('streaming encoder for different decompositions of a list of bytes', |
+ _testStreamingEncoderForDecompositions); |
+ test('streaming decoder for different decompositions of a string', |
+ _testStreamingDecoderForDecompositions); |
+ test('consistent safe/unsafe character streaming decoding', |
+ _testConsistentSafeUnsafeStreamDecode); |
+ test('old api', _testOldApi); |
+ test('url safe streaming encoder/decoder', _testUrlSafeStreaming); |
test('performance', _testPerformance); |
+ |
+ |
} |
// Data from http://tools.ietf.org/html/rfc4648. |
@@ -24,6 +41,45 @@ const _INPUTS = |
const [ '', 'f', 'fo', 'foo', 'foob', 'fooba', 'foobar']; |
const _RESULTS = |
const [ '', 'Zg==', 'Zm8=', 'Zm9v', 'Zm9vYg==', 'Zm9vYmE=', 'Zm9vYmFy']; |
+var _STREAMING_ENCODER_INPUT = |
+ [[102, 102], [111, 102], |
+ [111, 111, 102, 111, 111, 98, 102, 111, |
+ 111, 98, 97, 102, 111, 111, 98, 97, 114]]; |
+ |
+const _STREAMING_ENCODED = 'ZmZvZm9vZm9vYmZvb2JhZm9vYmFy'; |
+const _STREAMING_DECODER_INPUT = |
+ const ['YmFz', 'ZTY', '0I', 'GRlY29kZXI=']; |
+const _STREAMING_DECODED = |
+ const [98, 97, 115, 101, 54, 52, 32, 100, 101, 99, 111, 100, 101, 114]; |
+const _STREAMING_DECODER_INPUT_FOR_ZEROES = |
+ const ['AAAA', 'AAA=', 'AA==', '']; |
+var _STREAMING_DECODED_ZEROES = [0, 0, 0, 0, 0, 0]; |
+ |
+var _DECOMPOSITIONS_FOR_DECODING = [ |
+ ["A", "", "BCD"], ["A", "BCD", "", ""], ["A", "B", "", "", "CD", ""], |
+ ["", "A", "BC", "", "D"], ["", "AB", "C", "", "", "D"], ["AB", "CD", ""], |
+ ["", "ABC", "", "D"], ["", "ABC", "D", ""], ["", "", "ABCD", ""], |
+ ["A", "B", "C", "D"], ["", "A", "B", "C", "D", ""], |
+ ["", "A", "B", "", "", "C", "", "D", ""]]; |
+ |
+const _DECOMPOSITION_DECODED = const [0, 16, 131]; |
+ |
+var _DECOMPOSITIONS_FOR_ENCODING = [ |
+ [[196, 16], [], [158], [196]], |
+ [[196, 16], [158, 196], [], []], |
+ [[196], [], [16], [], [], [158], [], [196]], |
+ [[196], [], [16], [158, 196], [], []], |
+ [[], [196], [], [], [16, 158], [], [196]], |
+ [[], [196], [16, 158, 196], []], |
+ [[196, 16, 158], [], [], [196]], |
+ [[196, 16, 158], [], [196], []], |
+ [[196, 16, 158, 196], [], [], []]]; |
+ |
+const _DECOMPOSITION_ENCODED = 'xBCexA=='; |
+ |
+const _INCONSISTENT_SAFE_RESULT = 'A+_x'; |
+ |
+const _INCONSISTENT_SAFE_STREAMING_RESULT = const ['A+AAA', '_x=']; |
// Test data with only zeroes. |
var inputsWithZeroes = [[0, 0, 0], [0, 0], [0], []]; |
@@ -61,52 +117,132 @@ const _LONG_LINE_RESULT_NO_BREAK = |
void _testEncoder() { |
for (var i = 0; i < _INPUTS.length; i++) { |
- expect(CryptoUtils.bytesToBase64(_INPUTS[i].codeUnits), _RESULTS[i]); |
+ expect(BASE64.encode(_INPUTS[i].codeUnits), _RESULTS[i]); |
} |
for (var i = 0; i < inputsWithZeroes.length; i++) { |
- expect(CryptoUtils.bytesToBase64(inputsWithZeroes[i]), |
- _RESULTS_WITH_ZEROS[i]); |
+ expect(BASE64.encode(inputsWithZeroes[i]), |
+ _RESULTS_WITH_ZEROS[i]); |
} |
- expect( |
- CryptoUtils.bytesToBase64(_LONG_LINE.codeUnits, addLineSeparator : true), |
- _LONG_LINE_RESULT); |
- expect(CryptoUtils.bytesToBase64(_LONG_LINE.codeUnits), |
- _LONG_LINE_RESULT_NO_BREAK); |
+ expect(BASE64.encode(_LONG_LINE.codeUnits, addLineSeparator : true), |
+ _LONG_LINE_RESULT); |
+ expect(BASE64.encode(_LONG_LINE.codeUnits), |
+ _LONG_LINE_RESULT_NO_BREAK); |
} |
void _testDecoder() { |
for (var i = 0; i < _RESULTS.length; i++) { |
expect( |
- new String.fromCharCodes(CryptoUtils.base64StringToBytes(_RESULTS[i])), |
+ new String.fromCharCodes(BASE64.decode(_RESULTS[i])), |
_INPUTS[i]); |
} |
+ |
for (var i = 0; i < _RESULTS_WITH_ZEROS.length; i++) { |
- expect(CryptoUtils.base64StringToBytes(_RESULTS_WITH_ZEROS[i]), |
+ expect(BASE64.decode(_RESULTS_WITH_ZEROS[i]), |
inputsWithZeroes[i]); |
} |
- var longLineDecoded = CryptoUtils.base64StringToBytes(_LONG_LINE_RESULT); |
+ |
+ var longLineDecoded = BASE64.decode(_LONG_LINE_RESULT); |
expect(new String.fromCharCodes(longLineDecoded), _LONG_LINE); |
- var longLineResultNoBreak = |
- CryptoUtils.base64StringToBytes(_LONG_LINE_RESULT); |
+ |
+ var longLineResultNoBreak = BASE64.decode(_LONG_LINE_RESULT); |
expect(new String.fromCharCodes(longLineResultNoBreak), _LONG_LINE); |
} |
+Future _testStreamingEncoder() async { |
+ expect( |
+ await new Stream.fromIterable(_STREAMING_ENCODER_INPUT) |
+ .transform(BASE64.encoder) |
+ .join(), |
+ _STREAMING_ENCODED); |
+} |
+ |
+Future _testStreamingDecoder() async { |
+ expect( |
+ await new Stream.fromIterable(_STREAMING_DECODER_INPUT) |
+ .transform(BASE64.decoder) |
+ .expand((l) => l) |
+ .toList(), |
+ _STREAMING_DECODED); |
+ |
+ expect( |
+ await new Stream.fromIterable(_STREAMING_DECODER_INPUT_FOR_ZEROES) |
+ .transform(BASE64.decoder) |
+ .expand((l) => l) |
+ .toList(), |
+ _STREAMING_DECODED_ZEROES); |
+} |
+ |
+Future _testStreamingDecoderForMalformedInput() async { |
+ expect(new Stream.fromIterable(['ABz']) |
+ .transform(BASE64.decoder) |
+ .toList(), |
+ throwsFormatException); |
+ |
+ expect(new Stream.fromIterable(['AB', 'Lx', 'z', 'xx']) |
+ .transform(BASE64.decoder) |
+ .toList(), |
+ throwsFormatException); |
+} |
+ |
+Future _testStreamingEncoderForDecompositions() async { |
+ for(var decomposition in _DECOMPOSITIONS_FOR_ENCODING) { |
+ expect( |
+ await new Stream.fromIterable(decomposition) |
+ .transform(BASE64.encoder) |
+ .join(), |
+ _DECOMPOSITION_ENCODED); |
+ } |
+} |
+ |
+Future _testStreamingDecoderForDecompositions() async { |
+ for(var decomposition in _DECOMPOSITIONS_FOR_DECODING) { |
+ expect( |
+ await new Stream.fromIterable(decomposition) |
+ .transform(BASE64.decoder) |
+ .expand((x) => x) |
+ .toList(), |
+ _DECOMPOSITION_DECODED); |
+ } |
+} |
+ |
void _testDecoderForMalformedInput() { |
expect(() { |
- CryptoUtils.base64StringToBytes('AB~'); |
+ BASE64.decode('AB~'); |
}, throwsFormatException); |
expect(() { |
- CryptoUtils.base64StringToBytes('A'); |
+ BASE64.decode('A'); |
}, throwsFormatException); |
} |
+Future _testUrlSafeStreaming() async { |
+ String encUrlSafe = '-_A='; |
+ List<List<int>> dec = [BASE64.decode('+/A=')]; |
+ var streamedResult = await new Stream.fromIterable(dec) |
+ .transform(new Base64Encoder(urlSafe: true)).join(); |
+ |
+ expect(streamedResult, encUrlSafe); |
+} |
+ |
+void _testConsistentSafeUnsafeDecode() { |
+ expect(() { |
+ BASE64.decode(_INCONSISTENT_SAFE_RESULT); |
+ }, throwsFormatException); |
+} |
+ |
+Future _testConsistentSafeUnsafeStreamDecode() { |
+ expect(new Stream.fromIterable(_INCONSISTENT_SAFE_STREAMING_RESULT) |
+ .transform(BASE64.decoder) |
+ .toList(), |
+ throwsFormatException); |
+} |
+ |
void _testUrlSafeEncodeDecode() { |
- List<int> decUrlSafe = CryptoUtils.base64StringToBytes('-_A='); |
- List<int> dec = CryptoUtils.base64StringToBytes('+/A='); |
+ List<int> decUrlSafe = BASE64.decode('-_A='); |
+ List<int> dec = BASE64.decode('+/A='); |
expect(decUrlSafe, orderedEquals(dec)); |
- expect(CryptoUtils.bytesToBase64(dec, urlSafe: true), '-_A='); |
- expect(CryptoUtils.bytesToBase64(dec), '+/A='); |
+ expect(BASE64.encode(dec, urlSafe: true), '-_A='); |
+ expect(BASE64.encode(dec), '+/A='); |
} |
void _testEncodeDecodeLists() { |
@@ -116,8 +252,8 @@ void _testEncodeDecodeLists() { |
for (int k = 0; k < i; k++) { |
x[k] = j; |
} |
- var enc = CryptoUtils.bytesToBase64(x); |
- var dec = CryptoUtils.base64StringToBytes(enc); |
+ var enc = BASE64.encode(x); |
+ var dec = BASE64.decode(enc); |
expect(dec, orderedEquals(x)); |
} |
} |
@@ -130,6 +266,13 @@ void _fillRandom(List<int> l) { |
} |
} |
+void _testOldApi() { |
+ for (int i = 0; i < _INPUTS.length; i++) { |
+ expect(CryptoUtils.bytesToBase64(_INPUTS[i].codeUnits), _RESULTS[i]); |
+ expect(CryptoUtils.base64StringToBytes(_RESULTS[i]), _INPUTS[i].codeUnits); |
+ } |
+} |
+ |
void _testPerformance() { |
var l = new List<int>(1024); |
var iters = 5000; |
@@ -137,17 +280,17 @@ void _testPerformance() { |
String enc; |
var w = new Stopwatch()..start(); |
for( int i = 0; i < iters; ++i ) { |
- enc = CryptoUtils.bytesToBase64(l); |
+ enc = BASE64.encode(l); |
} |
int ms = w.elapsedMilliseconds; |
int perSec = (iters * l.length) * 1000 ~/ ms; |
// print("Encode 1024 bytes for $iters times: $ms msec. $perSec b/s"); |
w..reset(); |
for( int i = 0; i < iters; ++i ) { |
- CryptoUtils.base64StringToBytes(enc); |
+ BASE64.decode(enc); |
} |
ms = w.elapsedMilliseconds; |
perSec = (iters * l.length) * 1000 ~/ ms; |
- // print('''Decode into ${l.length} bytes for $iters |
+ // ('''Decode into ${l.length} bytes for $iters |
// times: $ms msec. $perSec b/s'''); |
} |