Use new web interop for node in tests
diff --git a/pubspec.yaml b/pubspec.yaml index be54f62..63b46e2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml
@@ -4,7 +4,7 @@ repository: https://github.com/simolus3/tar/ environment: - sdk: '>=3.0.0 <4.0.0' + sdk: '>=3.3.0 <4.0.0' dependencies: async: ^2.6.0 @@ -14,7 +14,6 @@ dev_dependencies: charcode: ^1.2.0 extra_pedantic: ^4.0.0 - file: ^6.1.2 - node_io: ^2.1.0 + file: ^7.0.0 path: ^1.8.0 test: ^1.20.0
diff --git a/test/reader_test.dart b/test/reader_test.dart index f0a2147..c22c84c 100644 --- a/test/reader_test.dart +++ b/test/reader_test.dart
@@ -25,7 +25,7 @@ test('v7', () => _testWith('reference/v7.tar', ignoreLongFileName: true)); test('can skip tar files', () async { - final input = fs.file('reference/posix.tar').openRead(); + final input = openRead('reference/posix.tar'); final reader = TarReader(input); expect(await reader.moveNext(), isTrue); @@ -49,7 +49,7 @@ }); test("can't use moveNext() while a stream is active", () async { - final input = fs.file('reference/posix.tar').openRead(); + final input = openRead('reference/posix.tar'); final reader = TarReader(input); expect(await reader.moveNext(), isTrue); @@ -60,7 +60,7 @@ }); test("can't use moveNext() after canceling the reader", () async { - final input = fs.file('reference/posix.tar').openRead(); + final input = openRead('reference/posix.tar'); final reader = TarReader(input); await reader.cancel(); @@ -68,7 +68,7 @@ }); test("can't read a stream multiple times", () async { - final input = fs.file('reference/posix.tar').openRead(); + final input = openRead('reference/posix.tar'); final reader = TarReader(input); await reader.moveNext(); @@ -84,7 +84,7 @@ }); test("can't read a stream while a call to moveNext() is active", () async { - final input = fs.file('reference/posix.tar').openRead(); + final input = openRead('reference/posix.tar'); final reader = TarReader(input); await reader.moveNext(); @@ -100,7 +100,7 @@ }); test("can't read the stream of an old tar entry", () async { - final input = fs.file('reference/posix.tar').openRead(); + final input = openRead('reference/posix.tar'); final reader = TarReader(input); await reader.moveNext(); final oldContents = reader.current.contents; @@ -117,7 +117,7 @@ }); test('can cancel a stream and then read further entries', () async { - final input = fs.file('reference/posix.tar').openRead(); + final input = openRead('reference/posix.tar'); final reader = TarReader(input); addTearDown(reader.cancel); @@ -131,7 +131,7 @@ }); test('cancelling the reader closes the current subscription', () async { - final input = fs.file('reference/posix.tar').openRead(); + final input = openRead('reference/posix.tar'); final reader = TarReader(input); // Skip forward to the first actual file @@ -181,8 +181,7 @@ test('if the stream emits an error in content', () async { // Craft a stream that starts with a valid tar file, but then emits an // error in the middle of an entry. First 512 bytes are headers. - final iterator = - ChunkedStreamReader(fs.file('reference/v7.tar').openRead()); + final iterator = ChunkedStreamReader(openRead('reference/v7.tar')); final controller = StreamController<List<int>>(); controller.onListen = () async { // headers + 3 bytes of content @@ -266,7 +265,7 @@ group('tests from dart-neats PR', () { Stream<List<int>> open(String name) { - return fs.file('reference/neats_test/$name').openRead(); + return openRead('reference/neats_test/$name'); } final tests = [ @@ -943,8 +942,8 @@ }); test('does not read large headers', () { - final reader = TarReader( - fs.file('reference/headers/evil_large_header.tar').openRead()); + final reader = + TarReader(openRead('reference/headers/evil_large_header.tar')); expect( reader.moveNext(), @@ -960,27 +959,24 @@ .having((e) => e.message, 'message', contains('Unexpected end')); test('at header', () { - final reader = TarReader( - fs.file('reference/bad/truncated_in_header.tar').openRead()); + final reader = + TarReader(openRead('reference/bad/truncated_in_header.tar')); expect(reader.moveNext(), throwsA(expectedException)); }); test('in content', () { - final reader = - TarReader(fs.file('reference/bad/truncated_in_body.tar').openRead()); + final reader = TarReader(openRead('reference/bad/truncated_in_body.tar')); expect(reader.moveNext(), throwsA(expectedException)); }); }); test('throws for invalid utf8 in pax key', () async { - final reader = - TarReader(fs.file('reference/bad/invalid_pax_header.tar').openRead()); + final reader = TarReader(openRead('reference/bad/invalid_pax_header.tar')); expect(reader.moveNext(), throwsA(isA<TarException>())); }); test('throws for zero-length pax data', () async { - final reader = - TarReader(fs.file('reference/bad/invalid_pax_len.tar').openRead()); + final reader = TarReader(openRead('reference/bad/invalid_pax_len.tar')); expect(reader.moveNext(), throwsA(isA<TarException>())); }); @@ -1046,7 +1042,7 @@ Future<void> _testWith(String file, {bool ignoreLongFileName = false}) async { final entries = <String, Uint8List>{}; - await TarReader.forEach(fs.file(file).openRead(), (entry) async { + await TarReader.forEach(openRead(file), (entry) async { entries[entry.name] = await entry.contents.readFully(); }); @@ -1062,7 +1058,7 @@ } Future<void> _testLargeFile(String file) async { - final reader = TarReader(fs.file(file).openRead()); + final reader = TarReader(openRead(file)); await reader.moveNext(); expect(reader.current.size, 9663676416);
diff --git a/test/utils.dart b/test/utils.dart index 0149de1..e8a385c 100644 --- a/test/utils.dart +++ b/test/utils.dart
@@ -1,3 +1 @@ -export 'package:file/file.dart'; - export 'utils_vm.dart' if (dart.library.js) 'utils_node.dart';
diff --git a/test/utils_node.dart b/test/utils_node.dart index 61a2af4..c8f45c4 100644 --- a/test/utils_node.dart +++ b/test/utils_node.dart
@@ -1,7 +1,68 @@ -import 'package:file/file.dart'; +import 'dart:js_interop'; -import 'package:node_io/node_io.dart'; +Stream<List<int>> openRead(String path) { + return Stream.multi((listener) { + ReadStream stream; + try { + stream = fs.createReadStream(path.toJS); + } on Object catch (e, s) { + listener + ..addError(e, s) + // ignore: discarded_futures + ..close(); + return; + } -FileSystem get fs { - return nodeFileSystem; + stream.on( + 'error'.toJS, + (JSObject error) { + listener.addErrorSync(error); + }.toJS, + ); + stream.on( + 'data'.toJS, + (JSAny event) { + final buffer = event as Buffer; + final toDart = buffer.buffer.toDart + .asUint8List(buffer.byteOffset.toDartInt, buffer.length.toDartInt); + listener.addSync(toDart); + }.toJS, + ); + stream.on('end'.toJS, (() => listener.closeSync()).toJS); + + listener + ..onPause = () { + stream.pause(); + } + ..onResume = () { + stream.resume(); + } + ..onCancel = () { + stream.destroy(); + }; + }); +} + +@JS() +external JSObject require(JSString module); + +FileSystemModule get fs => require('fs'.toJS) as FileSystemModule; + +extension type FileSystemModule._(JSObject _) implements JSObject { + external ReadStream createReadStream(JSString path); +} + +extension type ReadStream._(JSObject _) implements JSObject { + external void destroy(); + external void pause(); + external void resume(); + + external void on(JSString eventName, JSFunction listener); + external void removeAllListeners(JSString eventName); +} + +extension type Buffer._(JSObject _) implements JSObject { + external JSArrayBuffer get buffer; + external JSNumber get byteOffset; + external JSNumber get length; }
diff --git a/test/utils_vm.dart b/test/utils_vm.dart index b24f6f1..4f1320e 100644 --- a/test/utils_vm.dart +++ b/test/utils_vm.dart
@@ -1,6 +1,6 @@ -import 'package:file/file.dart'; import 'package:file/local.dart'; -FileSystem get fs { - return const LocalFileSystem(); +Stream<List<int>> openRead(String path) { + const fs = LocalFileSystem(); + return fs.file(path).openRead(); }