blob: 6d3f096e4f9ea745f3687955a8cf5483093bfcd0 [file] [log] [blame]
// Copyright (c) 2022, 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:io';
import 'package:front_end/src/api_unstable/vm.dart';
import 'package:test/test.dart';
import 'package:vm/kernel_front_end.dart';
import 'package:vm/native_assets/diagnostic_message.dart';
import 'package:vm/native_assets/validator.dart';
main() {
test('no file', () async {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final uri = Directory.systemTemp.uri.resolve('file_does_not_exist.yaml');
Object? result =
await NativeAssetsValidator(errorDetector).loadAndValidate(uri);
expect(result, null);
expect(errorDetector.hasCompilationErrors, true);
expect(errors.single.message,
equals("Native assets file ${uri.toFilePath()} doesn't exist."));
});
test('valid', () {
final errorDetector = ErrorDetector();
final yamlString = '''
format-version: [1,0,0]
native-assets:
linux_x64:
'package:foo/foo.dart': ['absolute', '/path/to/libfoo.so']
''';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(result, {
'format-version': [1, 0, 0],
'native-assets': {
'linux_x64': {
'package:foo/foo.dart': ['absolute', '/path/to/libfoo.so']
}
}
});
expect(errorDetector.hasCompilationErrors, false);
});
test('not yaml', () {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final yamlString = '&&&';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(errorDetector.hasCompilationErrors, true);
expect(result, null);
expect(errors.single.message, equals('File not formatted as yaml: &&&.'));
});
test('no format-version', () {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final yamlString = '''
native-assets:
linux_x64:
'package:foo/foo.dart': ['absolute', '/path/to/libfoo.so']
''';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(errorDetector.hasCompilationErrors, true);
expect(result, null);
expect(errors.single.message, startsWith('Expected format-version in'));
});
test('wrong format-version', () {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final yamlString = '''
format-version: [9000, 0, 1]
native-assets:
linux_x64:
'package:foo/foo.dart': ['absolute', '/path/to/libfoo.so']
''';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(errorDetector.hasCompilationErrors, true);
expect(result, null);
expect(errors.single.message,
startsWith('Unexpected format version: [9000, 0, 1].'));
});
test('no native-assets', () {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final yamlString = '''
format-version: [1, 0, 0]
''';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(errorDetector.hasCompilationErrors, true);
expect(result, null);
expect(errors.single.message, startsWith('Expected native-assets in'));
});
test('invalid target warning', () {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final yamlString = '''
format-version: [1,0,0]
native-assets:
target_does_not_exist:
'package:foo/foo.dart': ['absolute', '/path/to/libfoo.so']
''';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(errorDetector.hasCompilationErrors, false);
// Invalid targets only issue warnings.
expect(errors.single.severity, Severity.warning);
expect(errors.single.message,
startsWith('Unexpected target: target_does_not_exist.'));
// Filters out unsupported targets.
expect(result, {
'format-version': [1, 0, 0],
'native-assets': {}
});
});
test('invalid path', () {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final yamlString = '''
format-version: [1,0,0]
native-assets:
linux_x64:
'package:foo/foo.dart': ['path_type_does_not_exist']
''';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(errorDetector.hasCompilationErrors, true);
expect(result, null);
expect(errors.single.message,
startsWith('Unexpected path type: path_type_does_not_exist.'));
});
test('invalid absolute path', () {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final yamlString = '''
format-version: [1,0,0]
native-assets:
linux_x64:
'package:foo/foo.dart': ['absolute']
''';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(errorDetector.hasCompilationErrors, true);
expect(result, null);
expect(
errors.single.message,
equals(
'Unexpected asset path: [absolute]. Expected list with 2 elements.'));
});
test('invalid process path', () {
final errors = <NativeAssetsDiagnosticMessage>[];
final errorDetector = ErrorDetector(
previousErrorHandler: (message) =>
errors.add(message as NativeAssetsDiagnosticMessage));
final yamlString = '''
format-version: [1,0,0]
native-assets:
linux_x64:
'package:foo/foo.dart': ['process' , '/path/to/libfoo.so']
''';
final result =
NativeAssetsValidator(errorDetector).parseAndValidate(yamlString);
expect(errorDetector.hasCompilationErrors, true);
expect(result, null);
expect(
errors.single.message,
equals(
'Unexpected asset path: [process, /path/to/libfoo.so]. Expected list with 1 elements.'));
});
}