blob: b06b1d5c8fc2aa9c2ac32364aab30bdd29fad475 [file] [log] [blame] [edit]
// Copyright (c) 2023, 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:path/path.dart' as p;
import 'package:test_common/utilities.dart';
enum IndexBaseMode { noBase, base }
/// Project definitions from projects defined in webdev/fixtures.
class TestProject {
final String packageName;
final String packageDirectory;
final String webAssetsPath;
final String dartEntryFileName;
final String htmlEntryFileName;
/// The top level directory in which we run the test server, e.g.
/// "/workstation/webdev/fixtures/_testSound".
String get absolutePackageDirectory =>
absolutePath(pathFromFixtures: packageDirectory);
/// The directory to build and serve, e.g. "example".
String get directoryToServe => p.split(webAssetsPath).first;
/// The path to the HTML file to serve, relative to the [directoryToServe],
/// e.g. "hello_world/index.html".
String get filePathToServe {
final pathParts = p.split(webAssetsPath).where(
(pathPart) => pathPart != directoryToServe,
);
return webCompatiblePath([...pathParts, htmlEntryFileName]);
}
/// The path to the Dart entry file, e.g,
/// "/workstation/webdev/fixtures/_testSound/example/hello_world/main.dart":
String get dartEntryFilePath => absolutePath(
pathFromFixtures: p.joinAll(
[
packageDirectory,
webAssetsPath,
dartEntryFileName,
],
),
);
/// The URI for the package_config.json is located in:
/// <project directory>/.dart_tool/package_config
Uri get packageConfigFile => p.toUri(
p.join(
absolutePackageDirectory,
'.dart_tool',
'package_config.json',
),
);
/// The package URI of the Dart entry file, e.g,
/// "org-dartlang-app:example/hello_world/main.dart":
Uri get dartEntryFilePackageUri => Uri.parse('org-dartlang-app:///${p.join(
webAssetsPath,
dartEntryFileName,
)}');
const TestProject.testPackage({
IndexBaseMode baseMode = IndexBaseMode.noBase,
}) : this._(
packageName: '_test_package_sound',
packageDirectory: '_testPackageSound',
webAssetsPath: 'web',
dartEntryFileName: 'main.dart',
htmlEntryFileName:
baseMode == IndexBaseMode.base ? 'base_index.html' : 'index.html',
);
static const testCircular1 = TestProject._(
packageName: '_test_circular1_sound',
packageDirectory: '_testCircular1Sound',
webAssetsPath: 'web',
dartEntryFileName: 'main.dart',
htmlEntryFileName: 'index.html',
);
const TestProject.testCircular2({
IndexBaseMode baseMode = IndexBaseMode.noBase,
}) : this._(
packageName: '_test_circular2_sound',
packageDirectory: '_testCircular2Sound',
webAssetsPath: 'web',
dartEntryFileName: 'main.dart',
htmlEntryFileName:
baseMode == IndexBaseMode.base ? 'base_index.html' : 'index.html',
);
static const test = TestProject._(
packageName: '_test_sound',
packageDirectory: '_testSound',
webAssetsPath: 'example/hello_world',
dartEntryFileName: 'main.dart',
htmlEntryFileName: 'index.html',
);
static final testScopes = TestProject._(
packageName: '_test_sound',
packageDirectory: '_testSound',
webAssetsPath: webCompatiblePath(['example', 'scopes']),
dartEntryFileName: 'main.dart',
htmlEntryFileName: 'scopes.html',
);
static final testAppendBody = TestProject._(
packageName: '_test_sound',
packageDirectory: '_testSound',
webAssetsPath: webCompatiblePath(['example', 'append_body']),
dartEntryFileName: 'main.dart',
htmlEntryFileName: 'index.html',
);
static const testExperiment = TestProject._(
packageName: '_experiment_sound',
packageDirectory: '_experimentSound',
webAssetsPath: 'web',
dartEntryFileName: 'main.dart',
htmlEntryFileName: 'index.html',
);
static const testHotRestart1 = TestProject._(
packageName: '_test_hot_restart1',
packageDirectory: '_testHotRestart1Sound',
webAssetsPath: 'web',
dartEntryFileName: 'main.dart',
htmlEntryFileName: 'index.html',
);
/// This series of hot restart tests is divided across multiple packages in
/// order to test correctness when only a subset of libraries are updated.
static const testHotRestart2 = TestProject._(
packageName: '_test_hot_restart2',
packageDirectory: '_testHotRestart2Sound',
webAssetsPath: 'web',
dartEntryFileName: 'main.dart',
htmlEntryFileName: 'index.html',
);
const TestProject._({
required this.packageName,
required this.packageDirectory,
required this.webAssetsPath,
required this.dartEntryFileName,
required this.htmlEntryFileName,
});
void validate() {
// Verify that the web assets path has no starting slash:
assert(!webAssetsPath.startsWith('/'));
}
/// Clean up the project.
/// Called when we need to rebuild sdk and the app from
/// previous test configurations.
Future<void> cleanUp() async {
await Process.run(
'dart',
['run', 'build_runner', 'clean'],
workingDirectory: absolutePackageDirectory,
);
}
/// The path to the Dart specified file in the 'lib' directory, e.g,
/// "/workstation/webdev/fixtures/_testSound/lib/library.dart":
String dartLibFilePath(String dartLibFileName) => absolutePath(
pathFromFixtures: p.joinAll(
[
packageDirectory,
'lib',
dartLibFileName,
],
),
);
}