blob: 3068ede49343b2429eae334fd63a60b877ef5a0e [file] [log] [blame]
import 'dart:convert';
import 'dart:io';
import 'package:test/test.dart';
import 'package:tar/tar.dart' as tar;
void main() {
group('POSIX.1-2001', () {
test('reads files', () => _testWith('reference/posix.tar'));
test('reads large files',
() => _testLargeFile('reference/headers/large_posix.tar'));
});
test('(new) GNU Tar format', () => _testWith('reference/gnu.tar'));
test('ustar', () => _testWith('reference/ustar.tar'));
test('v7', () => _testWith('reference/v7.tar', ignoreLongFileName: true));
test('does not read large headers', () {
final tarEntries = File('reference/headers/evil_large_header.tar')
.openRead()
.transform(tar.reader);
expect(tarEntries, emitsError(isStateError));
});
test('throws on unexpected EOF', () {
final tarEntries =
File('reference/bad_truncated.tar').openRead().transform(tar.reader);
expect(
tarEntries,
emitsError(
isA<StateError>()
.having((e) => e.message, 'message', contains('Unexpected end')),
),
);
});
}
Future<void> _testWith(String file, {bool ignoreLongFileName = false}) async {
final tarEntries = File(file).openRead().transform(tar.reader);
final entries = {
await for (final entry in tarEntries) entry.name: await entry.readFully()
};
final testEntry = entries['reference/res/test.txt']!;
expect(utf8.decode(testEntry.data), 'Test file content!\n');
if (!ignoreLongFileName) {
final longName = entries['reference/res/'
'subdirectory_with_a_long_name/'
'file_with_a_path_length_of_more_than_100_characters_so_that_it_gets_split.txt']!;
expect(utf8.decode(longName.data), 'ditto');
}
}
void _testLargeFile(String file) {
final entries = File(file).openRead().transform(tar.reader);
expect(entries,
emits(isA<tar.Entry>().having((e) => e.size, 'size', 9663676416)));
}