// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:async'; import 'dart:convert'; import 'dart:developer'; import 'dart:io' as io; import 'package:test/test.dart'; import 'package:vm_service/vm_service.dart'; import 'common/test_helper.dart'; Future setupFiles() async { final dir = await io.Directory.systemTemp.createTemp('file_service'); var writingFile; var readingFile; void closeDown() { if (writingFile != null) { writingFile.closeSync(); } if (readingFile != null) { readingFile.closeSync(); } dir.deleteSync(recursive: true); } Future cleanup(ignored_a, ignored_b) { closeDown(); final result = jsonEncode({'type': 'foobar'}); return Future.value(ServiceExtensionResponse.result(result)); } Future setup(ignored_a, ignored_b) async { try { final filePath = dir.path + io.Platform.pathSeparator + "file"; final f = io.File(filePath); writingFile = await f.open(mode: io.FileMode.write); await writingFile.writeByte(42); await writingFile.writeByte(42); await writingFile.writeByte(42); final file = io.File.fromUri(io.Platform.script); readingFile = await file.open(); await readingFile.readByte(); await readingFile.readByte(); await readingFile.readByte(); await readingFile.readByte(); await readingFile.readByte(); // The utility functions should close the files after them, so we // don't expect the calls below to result in open files. final writeTemp = dir.path + io.Platform.pathSeparator + "other_file"; final utilFile = io.File(writeTemp); await utilFile.writeAsString('foobar'); final readTemp = io.File(writeTemp); await readTemp.readAsString(); } catch (e) { closeDown(); rethrow; } final result = jsonEncode({'type': 'foobar'}); return Future.value(ServiceExtensionResponse.result(result)); } registerExtension('ext.dart.io.cleanup', cleanup); registerExtension('ext.dart.io.setup', setup); } var fileTests = [ (VmService service, IsolateRef isolate) async { final isolateId = isolate.id!; await service.callServiceExtension( 'ext.dart.io.setup', isolateId: isolate.id, ); try { final result = await service.getOpenFiles(isolateId); expect(result, isA()); expect(result.files.length, equals(2)); final writing = await service.getOpenFileById( isolateId, result.files[0].id, ); expect(writing.readBytes, 0); expect(writing.readCount, 0); expect(writing.writeCount, 3); expect(writing.writeBytes, 3); expect(writing.lastWriteTime.millisecondsSinceEpoch, greaterThan(0)); expect(writing.lastReadTime.millisecondsSinceEpoch, 0); final reading = await service.getOpenFileById( isolateId, result.files[1].id, ); expect(reading.readBytes, 5); expect(reading.readCount, 5); expect(reading.writeCount, 0); expect(reading.writeBytes, 0); expect(reading.lastWriteTime.millisecondsSinceEpoch, 0); expect(reading.lastReadTime.millisecondsSinceEpoch, greaterThan(0)); } finally { await service.callServiceExtension( 'ext.dart.io.cleanup', isolateId: isolate.id, ); } }, ]; main([args = const []]) async => runIsolateTests( args, fileTests, 'file_service_test.dart', testeeBefore: setupFiles, );