blob: 16a346d8eabdc81eb51315b2fffa510b6798941c [file] [log] [blame]
// Copyright (c) 2024, 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 'model.dart';
/// Returns the [DynamicModuleTest] associated with a folder under [uri].
DynamicModuleTest loadTest(Uri uri) {
var folder = Directory.fromUri(uri);
var testUri = folder.uri; // normalized in case the trailing '/' was missing.
final name = testUri.pathSegments.lastWhere((s) => s.isNotEmpty);
String? main;
String? interface;
final dynamicModules = <String, String>{};
for (var entry in folder.listSync(recursive: true)) {
var entryUri = entry.uri;
if (entry is! File) continue;
var filePath = entryUri.path.substring(testUri.path.length);
if (filePath == 'dynamic_interface.yaml') {
interface = filePath;
continue;
}
if (!filePath.endsWith('.dart')) continue;
if (filePath == 'main.dart') {
main = filePath;
} else if (filePath.startsWith('modules/entry')) {
var moduleName = filePath.substring('modules/'.length);
assert(!dynamicModules.containsKey(moduleName));
dynamicModules[moduleName] = filePath;
}
}
// Validate the test is well structured
if (main == null) {
throw UnsupportedError("missing main.dart entrypoint in '$name'");
}
if (interface == null) {
throw UnsupportedError("missing dynamic_interface.yaml in '$name'");
}
if (dynamicModules.isEmpty) {
throw UnsupportedError("no dynamic modules found in '$name'");
}
return DynamicModuleTest(name, testUri, main, interface, dynamicModules);
}
/// Returns all [DynamicModuleTests]s under [uri], one per subfolder.
List<DynamicModuleTest> loadAllTests(Uri uri) {
var folder = Directory.fromUri(uri);
final result = <DynamicModuleTest>[];
for (var entry in folder.listSync(recursive: false)) {
if (entry is! Directory) continue;
result.add(loadTest(entry.uri));
}
return result;
}