Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(576)

Unified Diff: test/base64_test.dart

Issue 1159093002: Implement a Base64 codec (Closed) Base URL: https://github.com/dart-lang/crypto.git@master
Patch Set: Remove newlines after dart-docs Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « lib/src/crypto_utils.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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''');
}
« no previous file with comments | « lib/src/crypto_utils.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698