blob: 31f873938a830c6ebbdccbed7eef1a24894211b0 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. 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' as io;
import 'package:yaml/yaml.dart';
enum Compiler {
dart2js,
dart2wasm
}
enum Renderer {
html,
canvaskit,
skwasm,
}
class CompileConfiguration {
CompileConfiguration(this.name, this.compiler, this.renderer);
final String name;
final Compiler compiler;
final Renderer renderer;
}
class TestSet {
TestSet(this.name, this.directory);
final String name;
final String directory;
}
class TestBundle {
TestBundle(this.name, this.testSet, this.compileConfigs);
final String name;
final TestSet testSet;
final List<CompileConfiguration> compileConfigs;
}
enum CanvasKitVariant {
full,
chromium,
}
enum BrowserName {
chrome,
edge,
firefox,
safari,
}
class RunConfiguration {
RunConfiguration(this.name, this.browser, this.variant);
final String name;
final BrowserName browser;
final CanvasKitVariant? variant;
}
class ArtifactDependencies {
ArtifactDependencies({
required this.canvasKit,
required this.canvasKitChromium,
required this.skwasm
});
ArtifactDependencies.none() :
canvasKit = false,
canvasKitChromium = false,
skwasm = false;
final bool canvasKit;
final bool canvasKitChromium;
final bool skwasm;
ArtifactDependencies operator|(ArtifactDependencies other) {
return ArtifactDependencies(
canvasKit: canvasKit || other.canvasKit,
canvasKitChromium: canvasKitChromium || other.canvasKitChromium,
skwasm: skwasm || other.skwasm,
);
}
ArtifactDependencies operator&(ArtifactDependencies other) {
return ArtifactDependencies(
canvasKit: canvasKit && other.canvasKit,
canvasKitChromium: canvasKitChromium && other.canvasKitChromium,
skwasm: skwasm && other.skwasm,
);
}
}
class TestSuite {
TestSuite(
this.name,
this.testBundle,
this.runConfig,
this.artifactDependencies
);
String name;
TestBundle testBundle;
RunConfiguration runConfig;
ArtifactDependencies artifactDependencies;
}
class FeltConfig {
FeltConfig(
this.compileConfigs,
this.testSets,
this.testBundles,
this.runConfigs,
this.testSuites,
);
factory FeltConfig.fromFile(String filePath) {
final io.File configFile = io.File(filePath);
final YamlMap yaml = loadYaml(configFile.readAsStringSync()) as YamlMap;
final List<CompileConfiguration> compileConfigs = <CompileConfiguration>[];
final Map<String, CompileConfiguration> compileConfigsByName = <String, CompileConfiguration>{};
for (final dynamic node in yaml['compile-configs'] as YamlList) {
final YamlMap configYaml = node as YamlMap;
final String name = configYaml['name'] as String;
final Compiler compiler = Compiler.values.byName(configYaml['compiler'] as String);
final Renderer renderer = Renderer.values.byName(configYaml['renderer'] as String);
final CompileConfiguration config = CompileConfiguration(name, compiler, renderer);
compileConfigs.add(config);
if (compileConfigsByName.containsKey(name)) {
throw AssertionError('Duplicate compile config name: $name');
}
compileConfigsByName[name] = config;
}
final List<TestSet> testSets = <TestSet>[];
final Map<String, TestSet> testSetsByName = <String, TestSet>{};
for (final dynamic node in yaml['test-sets'] as YamlList) {
final YamlMap testSetYaml = node as YamlMap;
final String name = testSetYaml['name'] as String;
final String directory = testSetYaml['directory'] as String;
final TestSet testSet = TestSet(name, directory);
testSets.add(testSet);
if (testSetsByName.containsKey(name)) {
throw AssertionError('Duplicate test set name: $name');
}
testSetsByName[name] = testSet;
}
final List<TestBundle> testBundles = <TestBundle>[];
final Map<String, TestBundle> testBundlesByName = <String, TestBundle>{};
for (final dynamic node in yaml['test-bundles'] as YamlList) {
final YamlMap testBundleYaml = node as YamlMap;
final String name = testBundleYaml['name'] as String;
final String testSetName = testBundleYaml['test-set'] as String;
final TestSet? testSet = testSetsByName[testSetName];
if (testSet == null) {
throw AssertionError('Test set not found with name: `$testSetName` (referenced by test bundle: `$name`)');
}
final dynamic compileConfigsValue = testBundleYaml['compile-configs'];
final List<CompileConfiguration> compileConfigs;
if (compileConfigsValue is String) {
compileConfigs = <CompileConfiguration>[compileConfigsByName[compileConfigsValue]!];
} else {
compileConfigs = (compileConfigsValue as List<dynamic>).map(
(dynamic configName) => compileConfigsByName[configName as String]!
).toList();
}
final TestBundle bundle = TestBundle(name, testSet, compileConfigs);
testBundles.add(bundle);
if (testBundlesByName.containsKey(name)) {
throw AssertionError('Duplicate test bundle name: $name');
}
testBundlesByName[name] = bundle;
}
final List<RunConfiguration> runConfigs = <RunConfiguration>[];
final Map<String, RunConfiguration> runConfigsByName = <String, RunConfiguration>{};
for (final dynamic node in yaml['run-configs'] as YamlList) {
final YamlMap runConfigYaml = node as YamlMap;
final String name = runConfigYaml['name'] as String;
final BrowserName browser = BrowserName.values.byName(runConfigYaml['browser'] as String);
final dynamic variantNode = runConfigYaml['canvaskit-variant'];
final CanvasKitVariant? variant = variantNode == null
? null
: CanvasKitVariant.values.byName(variantNode as String);
final RunConfiguration runConfig = RunConfiguration(name, browser, variant);
runConfigs.add(runConfig);
if (runConfigsByName.containsKey(name)) {
throw AssertionError('Duplicate run config name: $name');
}
runConfigsByName[name] = runConfig;
}
final List<TestSuite> testSuites = <TestSuite>[];
for (final dynamic node in yaml['test-suites'] as YamlList) {
final YamlMap testSuiteYaml = node as YamlMap;
final String name = testSuiteYaml['name'] as String;
final String testBundleName = testSuiteYaml['test-bundle'] as String;
final TestBundle? bundle = testBundlesByName[testBundleName];
if (bundle == null) {
throw AssertionError('Test bundle not found with name: `$testBundleName` (referenced by test suite: `$name`)');
}
final String runConfigName = testSuiteYaml['run-config'] as String;
final RunConfiguration? runConfig = runConfigsByName[runConfigName];
if (runConfig == null) {
throw AssertionError('Run config not found with name: `$runConfigName` (referenced by test suite: `$name`)');
}
bool canvasKit = false;
bool canvasKitChromium = false;
bool skwasm = false;
final dynamic depsNode = testSuiteYaml['artifact-deps'];
if (depsNode != null) {
for (final dynamic dep in depsNode as YamlList) {
switch (dep as String) {
case 'canvaskit':
if (canvasKit) {
throw AssertionError('Artifact dep $dep listed twice in suite $name.');
}
canvasKit = true;
case 'canvaskit_chromium':
if (canvasKitChromium) {
throw AssertionError('Artifact dep $dep listed twice in suite $name.');
}
canvasKitChromium = true;
case 'skwasm':
if (skwasm) {
throw AssertionError('Artifact dep $dep listed twice in suite $name.');
}
skwasm = true;
default:
throw AssertionError('Unrecognized artifact dependency: $dep');
}
}
}
final ArtifactDependencies artifactDeps = ArtifactDependencies(
canvasKit: canvasKit,
canvasKitChromium: canvasKitChromium,
skwasm: skwasm
);
final TestSuite suite = TestSuite(name, bundle, runConfig, artifactDeps);
testSuites.add(suite);
}
return FeltConfig(compileConfigs, testSets, testBundles, runConfigs, testSuites);
}
List<CompileConfiguration> compileConfigs;
List<TestSet> testSets;
List<TestBundle> testBundles;
List<RunConfiguration> runConfigs;
List<TestSuite> testSuites;
}