| 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))); |
| } |