| // 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]), |
| ); |
| } |