blob: e3a74e03e4aafd02cc8ce84aa8f354431b41b935 [file] [log] [blame]
// 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');
}