diff --git a/lib/src/backends/record_replay/recording_file.dart b/lib/src/backends/record_replay/recording_file.dart index e07646bffb68e..4eeeeae36d4f2 100644 --- a/lib/src/backends/record_replay/recording_file.dart +++ b/lib/src/backends/record_replay/recording_file.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'dart:convert'; +import 'package:meta/meta.dart'; import 'package:file/file.dart'; import 'package:file/src/io.dart' as io; @@ -139,6 +140,52 @@ class RecordingFile extends RecordingFileSystemEntity .then(wrap); } +abstract class _ExternalReference extends ResultReference { + final File file; + final T _value; + + _ExternalReference(MutableRecording recording, String name, this._value) + : file = recording.newFile(name); + + @protected + void writeDataToFile(T value); + + @override + T get value { + writeDataToFile(_value); + return _value; + } + + @override + T get recordedValue => _value; + + @override + dynamic get serializedValue => '!${file.basename}'; +} + +abstract class _ExternalFutureReference extends FutureReference { + final File file; + + _ExternalFutureReference( + MutableRecording recording, String name, Future future) + : file = recording.newFile(name), + super(future); + + @protected + Future writeDataToFile(T value); + + @override + Future get value { + return super.value.then((T value) async { + await writeDataToFile(value); + return value; + }); + } + + @override + dynamic get serializedValue => '!${file.basename}'; +} + class _ByteArrayStreamReference extends StreamReference> { final File file; IOSink _sink; @@ -172,122 +219,65 @@ class _ByteArrayStreamReference extends StreamReference> { Future.wait(>[super.complete, _sink.done]).then((_) {}); } -class _ByteArrayFutureReference extends FutureReference> { - final File file; - +class _ByteArrayFutureReference extends _ExternalFutureReference> { _ByteArrayFutureReference( MutableRecording recording, String name, Future> future) - : file = recording.newFile(name), - super(future); + : super(recording, name, future); @override - Future> get value { - return super.value.then((List bytes) async { - await file.writeAsBytes(bytes, flush: true); - return bytes; - }); + Future writeDataToFile(List bytes) async { + await file.writeAsBytes(bytes, flush: true); } - - @override - dynamic get serializedValue => '!${file.basename}'; } -class _ByteArrayReference extends ResultReference> { - final File file; - final List bytes; - - _ByteArrayReference(MutableRecording recording, String name, this.bytes) - : file = recording.newFile(name); +class _ByteArrayReference extends _ExternalReference> { + _ByteArrayReference(MutableRecording recording, String name, List bytes) + : super(recording, name, bytes); @override - List get value { + void writeDataToFile(List bytes) { file.writeAsBytesSync(bytes, flush: true); - return bytes; } - - @override - List get recordedValue => bytes; - - @override - dynamic get serializedValue => '!${file.basename}'; } -class _FileContentFutureReference extends FutureReference { - final File file; - +class _FileContentFutureReference extends _ExternalFutureReference { _FileContentFutureReference( MutableRecording recording, String name, Future future) - : file = recording.newFile(name), - super(future); + : super(recording, name, future); @override - Future get value { - return super.value.then((String content) async { - await file.writeAsString(content, flush: true); - return content; - }); + Future writeDataToFile(String content) async { + await file.writeAsString(content, flush: true); } - - @override - dynamic get serializedValue => '!${file.basename}'; } -class _FileContentReference extends ResultReference { - final File file; - final String content; - - _FileContentReference(MutableRecording recording, String name, this.content) - : file = recording.newFile(name); +class _FileContentReference extends _ExternalReference { + _FileContentReference(MutableRecording recording, String name, String content) + : super(recording, name, content); @override - String get value { + void writeDataToFile(String content) { file.writeAsStringSync(content, flush: true); - return content; } - - @override - String get recordedValue => content; - - @override - dynamic get serializedValue => '!${file.basename}'; } -class _LinesFutureReference extends FutureReference> { - final File file; - +class _LinesFutureReference extends _ExternalFutureReference> { _LinesFutureReference( MutableRecording recording, String name, Future> future) - : file = recording.newFile(name), - super(future); + : super(recording, name, future); @override - Future> get value { - return super.value.then((List lines) async { - await file.writeAsString(lines.join('\n'), flush: true); - return lines; - }); + Future writeDataToFile(List lines) async { + await file.writeAsString(lines.join('\n'), flush: true); } - - @override - dynamic get serializedValue => '!${file.basename}'; } -class _LinesReference extends ResultReference> { - final File file; - final List lines; - - _LinesReference(MutableRecording recording, String name, this.lines) - : file = recording.newFile(name); +class _LinesReference extends _ExternalReference> { + _LinesReference(MutableRecording recording, String name, List lines) + : super(recording, name, lines); @override - List get value { + void writeDataToFile(List lines) { file.writeAsStringSync(lines.join('\n'), flush: true); - return lines; } - - @override - List get recordedValue => lines; - - @override - dynamic get serializedValue => '!${file.basename}'; }