|  | // 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:convert'; | 
|  | import 'dart:io'; | 
|  |  | 
|  | import 'package:dev_compiler/src/kernel/module_metadata.dart'; | 
|  | import 'package:test/test.dart'; | 
|  |  | 
|  | /// Test creating, reading and writing debugger metadata. | 
|  | void main() { | 
|  | group('Module metadata', () { | 
|  | late Directory tempDir; | 
|  | late File file; | 
|  |  | 
|  | setUpAll(() { | 
|  | var systemTempDir = Directory.systemTemp; | 
|  | tempDir = systemTempDir.createTempSync('foo bar'); | 
|  | var input = tempDir.uri.resolve('module.metadata'); | 
|  | file = File.fromUri(input)..createSync(); | 
|  | }); | 
|  |  | 
|  | tearDownAll(() { | 
|  | tempDir.delete(recursive: true); | 
|  | }); | 
|  |  | 
|  | test('create, write, and read', () async { | 
|  | // Create metadata. | 
|  | var version = ModuleMetadataVersion.current.version; | 
|  | var module = createMetadata(version); | 
|  | testMetadataFields(module, version); | 
|  |  | 
|  | // Write metadata. | 
|  | file.writeAsBytesSync(utf8.encode(json.encode(module))); | 
|  | expect(file.existsSync(), true); | 
|  |  | 
|  | // Read metadata. | 
|  | var moduleJson = json.decode(utf8.decode(file.readAsBytesSync())); | 
|  | var newModule = | 
|  | ModuleMetadata.fromJson(moduleJson as Map<String, dynamic>); | 
|  | testMetadataFields(newModule, version); | 
|  | }); | 
|  |  | 
|  | test('read later backward-compatible patch version', () async { | 
|  | // Create metadata with next patch version. | 
|  | var version = ModuleMetadataVersion( | 
|  | ModuleMetadataVersion.current.majorVersion, | 
|  | ModuleMetadataVersion.current.minorVersion, | 
|  | ModuleMetadataVersion.current.patchVersion + 1) | 
|  | .version; | 
|  |  | 
|  | var module = createMetadata(version); | 
|  |  | 
|  | // Write metadata. | 
|  | file.writeAsBytesSync(utf8.encode(json.encode(module))); | 
|  | expect(file.existsSync(), true); | 
|  |  | 
|  | // Read metadata. | 
|  | var moduleJson = json.decode(utf8.decode(file.readAsBytesSync())); | 
|  | var newModule = | 
|  | ModuleMetadata.fromJson(moduleJson as Map<String, dynamic>); | 
|  | testMetadataFields(newModule, version); | 
|  | }); | 
|  |  | 
|  | test('read later backward-compatible minor version', () async { | 
|  | // Create metadata with next minor version. | 
|  | var version = ModuleMetadataVersion( | 
|  | ModuleMetadataVersion.current.majorVersion, | 
|  | ModuleMetadataVersion.current.minorVersion + 1, | 
|  | ModuleMetadataVersion.current.patchVersion + 1) | 
|  | .version; | 
|  | var module = createMetadata(version); | 
|  |  | 
|  | // Write metadata. | 
|  | file.writeAsBytesSync(utf8.encode(json.encode(module))); | 
|  | expect(file.existsSync(), true); | 
|  |  | 
|  | // Read metadata. | 
|  | var moduleJson = json.decode(utf8.decode(file.readAsBytesSync())); | 
|  | var newModule = | 
|  | ModuleMetadata.fromJson(moduleJson as Map<String, dynamic>); | 
|  | testMetadataFields(newModule, version); | 
|  | }); | 
|  |  | 
|  | test('fail to read later non-backward-compatible major version', () async { | 
|  | // Create metadata with next minor version. | 
|  | var version = ModuleMetadataVersion( | 
|  | ModuleMetadataVersion.current.majorVersion + 1, | 
|  | ModuleMetadataVersion.current.minorVersion + 1, | 
|  | ModuleMetadataVersion.current.patchVersion + 1) | 
|  | .version; | 
|  | var module = createMetadata(version); | 
|  |  | 
|  | // Write metadata. | 
|  | file.writeAsBytesSync(utf8.encode(json.encode(module))); | 
|  | expect(file.existsSync(), true); | 
|  |  | 
|  | // Try read metadata, expect to fail. | 
|  | var moduleJson = json.decode(utf8.decode(file.readAsBytesSync())); | 
|  | ModuleMetadata? newModule; | 
|  | try { | 
|  | newModule = ModuleMetadata.fromJson(moduleJson as Map<String, dynamic>); | 
|  | } catch (e) { | 
|  | expect( | 
|  | e.toString(), 'Exception: Unsupported metadata version $version'); | 
|  | } | 
|  |  | 
|  | expect(newModule, null); | 
|  | }); | 
|  | }); | 
|  | } | 
|  |  | 
|  | ModuleMetadata createMetadata(String version) => ModuleMetadata( | 
|  | 'module', 'closure', 'module.map', 'module.js', 'module.full.dill', true, | 
|  | version: version) | 
|  | ..addLibrary(LibraryMetadata('library', 'package:library/test.dart', | 
|  | 'file:///source/library/lib/test.dart', ['src/test2.dart'])); | 
|  |  | 
|  | void testMetadataFields(ModuleMetadata module, String version) { | 
|  | // Reader always creates current metadata version. | 
|  | expect(module.version, version); | 
|  | expect(module.name, 'module'); | 
|  | expect(module.closureName, 'closure'); | 
|  | expect(module.sourceMapUri, 'module.map'); | 
|  | expect(module.moduleUri, 'module.js'); | 
|  | expect(module.fullDillUri, 'module.full.dill'); | 
|  | expect(module.soundNullSafety, true); | 
|  |  | 
|  | var libUri = module.libraries.keys.first; | 
|  | var lib = module.libraries[libUri]!; | 
|  | expect(libUri, 'package:library/test.dart'); | 
|  | expect(lib.name, 'library'); | 
|  | expect(lib.importUri, 'package:library/test.dart'); | 
|  | expect(lib.fileUri, 'file:///source/library/lib/test.dart'); | 
|  | expect(lib.partUris[0], 'src/test2.dart'); | 
|  | } |