blob: 5feacb08c8ec670616e59520b9b343bf84e24b83 [file] [log] [blame] [edit]
// Copyright (c) 2016, 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 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/source/source.dart';
import 'package:analyzer/src/summary/package_bundle_reader.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
import 'package:analyzer/src/workspace/blaze.dart';
import 'package:analyzer/src/workspace/workspace.dart';
import 'package:analyzer_testing/resource_provider_mixin.dart';
import 'package:async/async.dart';
import 'package:pub_semver/pub_semver.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../generated/test_support.dart';
import '../dart/resolution/context_collection_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(BlazeFileUriResolverTest);
defineReflectiveTests(BlazePackageUriResolverTest);
defineReflectiveTests(BlazeWorkspaceTest);
defineReflectiveTests(BlazeWorkspacePackageTest);
defineReflectiveTests(BlazeLanguageVersionTest);
});
}
@reflectiveTest
class BlazeFileUriResolverTest with ResourceProviderMixin {
late final BlazeWorkspace workspace;
late final BlazeFileUriResolver resolver;
void test_resolveAbsolute_blazeBin_exists() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-bin/my/test/a.dart',
]);
_assertResolve(
toUriStr('/workspace/blaze-bin/my/test/a.dart'),
getFile('/workspace/blaze-bin/my/test/a.dart'),
restoredUriStr: toUriStr('/workspace/my/test/a.dart'),
);
}
void test_resolveAbsolute_notFile_dartUri() {
_addResources(['/workspace/${file_paths.blazeWorkspaceMarker}']);
Uri uri = Uri(scheme: 'dart', path: 'core');
var source = resolver.resolveAbsolute(uri);
expect(source, isNull);
}
void test_resolveAbsolute_notFile_httpsUri() {
_addResources(['/workspace/${file_paths.blazeWorkspaceMarker}']);
Uri uri = Uri(scheme: 'https', path: '127.0.0.1/test.dart');
var source = resolver.resolveAbsolute(uri);
expect(source, isNull);
}
void test_resolveAbsolute_outsideOfWorkspace() {
_addResources(['/workspace/${file_paths.blazeWorkspaceMarker}']);
expect(resolver.resolveAbsolute(toUri('/foo')), isNull);
}
void test_resolveAbsolute_workspaceRoot() {
_addResources(['/workspace/${file_paths.blazeWorkspaceMarker}']);
expect(resolver.resolveAbsolute(toUri('/workspace')), isNull);
}
void test_resolveAbsolute_writableUri_blazeBin_hasWritable() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/my/test/a.dart',
'/workspace/blaze-bin/my/test/a.dart',
]);
_assertResolve(
toUriStr('/workspace/my/test/a.dart'),
getFile('/workspace/blaze-bin/my/test/a.dart'),
);
}
void test_resolveAbsolute_writableUri_blazeBin_noWritable() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-bin/my/test/a.dart',
]);
_assertResolve(
toUriStr('/workspace/my/test/a.dart'),
getFile('/workspace/blaze-bin/my/test/a.dart'),
);
}
void test_resolveAbsolute_writableUri_blazeGenfiles_hasWritable() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/my/test/a.dart',
'/workspace/blaze-genfiles/my/test/a.dart',
]);
_assertResolve(
toUriStr('/workspace/my/test/a.dart'),
getFile('/workspace/blaze-genfiles/my/test/a.dart'),
);
}
void test_resolveAbsolute_writableUri_blazeGenfiles_noWritable() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/my/test/a.dart',
]);
_assertResolve(
toUriStr('/workspace/my/test/a.dart'),
getFile('/workspace/blaze-genfiles/my/test/a.dart'),
);
}
void test_resolveAbsolute_writableUri_writable() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/my/lib/a.dart',
]);
_assertResolve(
toUriStr('/workspace/my/lib/a.dart'),
getFile('/workspace/my/lib/a.dart'),
);
}
void test_resolveAbsolute_writableUri_writable_doesNotExist() {
_addResources(['/workspace/${file_paths.blazeWorkspaceMarker}']);
_assertResolve(
toUriStr('/workspace/my/lib/a.dart'),
getFile('/workspace/my/lib/a.dart'),
exists: false,
);
}
void _addResources(List<String> paths) {
for (String path in paths) {
if (path.endsWith('/')) {
newFolder(path.substring(0, path.length - 1));
} else {
newFile(path, '');
}
}
workspace = BlazeWorkspace.find(
resourceProvider,
getFolder('/workspace').path,
)!;
resolver = BlazeFileUriResolver(workspace);
}
void _assertResolve(
String uriStr,
File file, {
bool exists = true,
String? restoredUriStr,
}) {
var uri = Uri.parse(uriStr);
var source = resolver.resolveAbsolute(uri)!;
var path = source.fullName;
expect(path, file.path);
expect(source.uri, uri);
expect(source.exists(), exists);
restoredUriStr ??= uriStr;
expect(resolver.pathToUri(path), Uri.parse(restoredUriStr));
}
}
@reflectiveTest
class BlazeLanguageVersionTest extends BlazeWorkspaceResolutionTest {
void test_buildFile_nonNullable_languageVersion_fromWorkspace() async {
newFile('$workspaceRootPath/dart/build_defs/bzl/language.bzl', r'''
_version = "3.1"
_version_for_analyzer = _version
language = struct(
version = _version,
version_for_analyzer = _version_for_analyzer,
)
''');
await resolveFileCode('$myPackageRootPath/lib/a.dart', '');
_assertLanguageVersion(package: Version.parse('3.1.0'), override: null);
}
void _assertLanguageVersion({
required Version package,
required Version? override,
}) {
var element = result.libraryElement;
expect(element.languageVersion.package, package);
expect(element.languageVersion.override, override);
}
}
@reflectiveTest
class BlazePackageUriResolverTest with ResourceProviderMixin {
late final BlazeWorkspace workspace;
late final BlazePackageUriResolver resolver;
void test_resolveAbsolute_bin() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/my/foo/lib/foo1.dart',
'/workspace/blaze-bin/my/foo/lib/foo1.dart',
]);
_assertResolve(
'package:my.foo/foo1.dart',
'/workspace/blaze-bin/my/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_bin_notInWorkspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/blaze-bin/my/foo/lib/foo1.dart',
]);
_assertResolve(
'package:my.foo/foo1.dart',
'/workspace/blaze-bin/my/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_file_bin_pathHasSpace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/my/foo/test',
]);
_assertResolve(
toUriStr('/workspace/blaze-bin/my/test/a .dart'),
'/workspace/my/test/a .dart',
exists: false,
restore: false,
);
}
void test_resolveAbsolute_file_bin_to_genfiles() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/my/foo/test/foo1.dart',
'/workspace/blaze-bin/',
]);
_assertResolve(
toUriStr('/workspace/blaze-bin/my/foo/test/foo1.dart'),
'/workspace/blaze-genfiles/my/foo/test/foo1.dart',
restore: false,
);
}
void test_resolveAbsolute_file_genfiles_to_workspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/my/foo/test/foo1.dart',
]);
_assertResolve(
toUriStr('/workspace/blaze-genfiles/my/foo/test/foo1.dart'),
'/workspace/my/foo/test/foo1.dart',
restore: false,
);
}
void test_resolveAbsolute_file_not_in_workspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/other/my/foo/test/foo1.dart',
]);
_assertNoResolve(toUriStr('/other/my/foo/test/foo1.dart'));
}
void test_resolveAbsolute_file_workspace_to_genfiles() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/my/foo/test/foo1.dart',
]);
_assertResolve(
toUriStr('/workspace/my/foo/test/foo1.dart'),
'/workspace/blaze-genfiles/my/foo/test/foo1.dart',
restore: false,
);
}
void test_resolveAbsolute_genfiles() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/my/foo/lib/foo1.dart',
'/workspace/blaze-genfiles/my/foo/lib/foo1.dart',
]);
_assertResolve(
'package:my.foo/foo1.dart',
'/workspace/blaze-genfiles/my/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_genfiles_notInWorkspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/blaze-genfiles/my/foo/lib/foo1.dart',
]);
_assertResolve(
'package:my.foo/foo1.dart',
'/workspace/blaze-genfiles/my/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_null_doubleDot() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
var uri = Uri.parse('package:foo..bar/baz.dart');
var source = resolver.resolveAbsolute(uri);
expect(source, isNull);
}
void test_resolveAbsolute_null_doubleSlash() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
var uri = Uri.parse('package:foo//bar/baz.dart');
var source = resolver.resolveAbsolute(uri);
expect(source, isNull);
}
void test_resolveAbsolute_null_emptyFileUriPart() {
_addResources(['/workspace/${file_paths.blazeWorkspaceMarker}']);
var uri = Uri.parse('package:foo.bar/');
var source = resolver.resolveAbsolute(uri);
expect(source, isNull);
}
void test_resolveAbsolute_null_noSlash() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
var source = resolver.resolveAbsolute(Uri.parse('package:foo'));
expect(source, isNull);
}
void test_resolveAbsolute_null_notPackage() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
var source = resolver.resolveAbsolute(Uri.parse('dart:async'));
expect(source, isNull);
}
void test_resolveAbsolute_null_startsWithSlash() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/my/foo/lib/bar.dart',
]);
var source = resolver.resolveAbsolute(Uri.parse('package:/foo/bar.dart'));
expect(source, isNull);
}
void test_resolveAbsolute_thirdParty_bin() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/third_party/dart/foo/lib/foo1.dart',
'/workspace/blaze-bin/third_party/dart/foo/lib/foo1.dart',
]);
_assertResolve(
'package:foo/foo1.dart',
'/workspace/blaze-bin/third_party/dart/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_thirdParty_bin_notInWorkspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/blaze-bin/third_party/dart/foo/lib/foo1.dart',
]);
_assertResolve(
'package:foo/foo1.dart',
'/workspace/blaze-bin/third_party/dart/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_thirdParty_doesNotExist() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/third_party/dart/foo/lib/foo1.dart',
]);
_assertResolve(
'package:foo/foo2.dart',
'/workspace/third_party/dart/foo/lib/foo2.dart',
exists: false,
);
}
void test_resolveAbsolute_thirdParty_exists() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/third_party/dart/foo/lib/foo1.dart',
]);
_assertResolve(
'package:foo/foo1.dart',
'/workspace/third_party/dart/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_thirdParty_genfiles() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/third_party/dart/foo/lib/foo1.dart',
'/workspace/blaze-genfiles/third_party/dart/foo/lib/foo1.dart',
]);
_assertResolve(
'package:foo/foo1.dart',
'/workspace/blaze-genfiles/third_party/dart/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_thirdParty_genfiles_notInWorkspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/blaze-genfiles/third_party/dart/foo/lib/foo1.dart',
]);
_assertResolve(
'package:foo/foo1.dart',
'/workspace/blaze-genfiles/third_party/dart/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_workspace_doesNotExist() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
_assertResolve(
'package:my.foo/doesNotExist.dart',
'/workspace/my/foo/lib/doesNotExist.dart',
exists: false,
);
}
void test_resolveAbsolute_workspace_exists() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/my/foo/lib/foo1.dart',
]);
_assertResolve(
'package:my.foo/foo1.dart',
'/workspace/my/foo/lib/foo1.dart',
);
}
void test_resolveAbsolute_workspace_exists_hasSpace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/my/foo/lib/foo .dart',
]);
_assertResolve(
'package:my.foo/foo .dart',
'/workspace/my/foo/lib/foo .dart',
restore: false,
);
}
void test_restoreAbsolute_noPackageName_workspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/lib/foo1.dart',
'/workspace/foo/lib/foo2.dart',
]);
_assertRestore('/workspace/lib/foo1.dart', null);
_assertRestore('/workspace/foo/lib/foo2.dart', null);
}
void test_restoreAbsolute_noPathInLib_bin() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/blaze-bin/my/foo/lib/foo1.dart',
]);
_assertRestore('/workspace/blaze-bin', null);
_assertRestore('/workspace/blaze-bin/my', null);
_assertRestore('/workspace/blaze-bin/my/foo', null);
_assertRestore('/workspace/blaze-bin/my/foo/lib', null);
}
void test_restoreAbsolute_noPathInLib_genfiles() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/blaze-genfiles/my/foo/lib/foo1.dart',
]);
_assertRestore('/workspace/blaze-genfiles', null);
_assertRestore('/workspace/blaze-genfiles/my', null);
_assertRestore('/workspace/blaze-genfiles/my/foo', null);
_assertRestore('/workspace/blaze-genfiles/my/foo/lib', null);
}
void test_restoreAbsolute_noPathInLib_workspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/my/foo/lib/foo1.dart',
]);
_assertRestore('/workspace', null);
_assertRestore('/workspace/my', null);
_assertRestore('/workspace/my/foo', null);
_assertRestore('/workspace/my/foo/lib', null);
}
void test_restoreAbsolute_thirdPartyNotDart_workspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
'/workspace/third_party/something/lib/foo.dart',
]);
_assertRestore(
'/workspace/third_party/something/lib/foo.dart',
'package:third_party.something/foo.dart',
);
}
void test_restoreAbsolute_workspace_nestedLib() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/my/components/lib/src/foo/lib/foo.dart',
]);
_assertRestore(
'/workspace/my/components/lib/src/foo/lib/foo.dart',
'package:my.components.lib.src.foo/foo.dart',
);
}
void _addResources(
List<String> paths, {
String workspacePath = '/workspace',
}) {
for (String path in paths) {
if (path.endsWith('/')) {
newFolder(path.substring(0, path.length - 1));
} else {
newFile(path, '');
}
}
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath(workspacePath),
)!;
resolver = BlazePackageUriResolver(workspace);
}
void _assertNoResolve(String uriStr) {
var uri = Uri.parse(uriStr);
expect(resolver.resolveAbsolute(uri), isNull);
}
void _assertResolve(
String uriStr,
String posixPath, {
bool exists = true,
bool restore = true,
}) {
Uri uri = Uri.parse(uriStr);
var source = resolver.resolveAbsolute(uri)!;
var path = source.fullName;
expect(path, convertPath(posixPath));
expect(source.uri, uri);
expect(source.exists(), exists);
// If enabled, test also "restoreAbsolute".
if (restore) {
expect(resolver.pathToUri(path), uri);
}
}
void _assertRestore(String posixPath, String? expectedUriStr) {
var expectedUri = expectedUriStr != null ? Uri.parse(expectedUriStr) : null;
String path = convertPath(posixPath);
expect(resolver.pathToUri(path), expectedUri);
}
}
@reflectiveTest
class BlazeWorkspacePackageTest with ResourceProviderMixin {
late final BlazeWorkspace workspace;
late BlazeWorkspacePackage package;
void test_contains_differentPackage_summarySource() {
_setUpPackage();
var source = _inSummarySource('package:some.other.code/file.dart');
expect(package.contains(source), isFalse);
}
void test_contains_differentPackageInWorkspace() {
_setUpPackage();
// A file that is _not_ in this package is not required to have a BUILD
// file above it, for simplicity and reduced I/O.
expect(
package.contains(_testSource('/ws/some/other/code/file.dart')),
isFalse,
);
}
void test_contains_differentWorkspace() {
_setUpPackage();
expect(package.contains(_testSource('/ws2/some/file.dart')), isFalse);
}
void test_contains_samePackage() {
_setUpPackage();
var targetFile = newFile('/ws/some/code/lib/code2.dart', '');
var targetFile2 = newFile('/ws/some/code/lib/src/code3.dart', '');
var targetBinFile = newFile('/ws/some/code/bin/code.dart', '');
var targetTestFile = newFile('/ws/some/code/test/code_test.dart', '');
expect(package.contains(_testSource(targetFile.path)), isTrue);
expect(package.contains(_testSource(targetFile2.path)), isTrue);
expect(package.contains(_testSource(targetBinFile.path)), isTrue);
expect(package.contains(_testSource(targetTestFile.path)), isTrue);
}
void test_contains_samePackage_summarySource() {
_setUpPackage();
newFile('/ws/some/code/lib/code2.dart', '');
newFile('/ws/some/code/lib/src/code3.dart', '');
var file2Source = _inSummarySource('package:some.code/code2.dart');
var file3Source = _inSummarySource('package:some.code/src/code2.dart');
expect(package.contains(file2Source), isTrue);
expect(package.contains(file3Source), isTrue);
}
void test_contains_subPackage() {
_setUpPackage();
newFile('/ws/some/code/testing/BUILD', '');
newFile('/ws/some/code/testing/lib/testing.dart', '');
expect(
package.contains(_testSource('/ws/some/code/testing/lib/testing.dart')),
isFalse,
);
}
void test_findPackageFor_buildFileExists() {
_setUpPackage();
expect(package.root.path, convertPath('/ws/some/code'));
expect(package.workspace, equals(workspace));
}
void test_findPackageFor_generatedFileInBlazeOutAndBin() {
_addResources([
'/ws/blaze-out/host/bin/some/code/code.packages',
'/ws/blaze-out/host/bin/some/code/code.dart',
'/ws/blaze-bin/some/code/code.dart',
]);
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/ws/some/code/testing'),
)!;
// Make sure that we can find the package of the generated file.
var file = workspace.findFile(convertPath('/ws/some/code/code.dart'));
package = workspace.findPackageFor(file!.path)!;
expect(package.root.path, convertPath('/ws/some/code'));
expect(package.workspace, equals(workspace));
}
void test_findPackageFor_inBlazeOut_notPackage() {
var path = convertPath(
'/ws/blaze-out/k8-opt/bin/news/lib/news_base.pb.dart',
);
newFile('/ws/news/BUILD', '');
newFile(path, '');
workspace = BlazeWorkspace.find(resourceProvider, path)!;
var package = workspace.findPackageFor(path);
expect(package, isNull);
}
void test_findPackageFor_missingMarkerFiles() {
_addResources([
'/ws/${file_paths.blazeWorkspaceMarker}',
'/ws/blaze-genfiles',
]);
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/ws/some/code'),
)!;
var targetFile = newFile('/ws/some/code/lib/code.dart', '');
WorkspacePackageImpl? package = workspace.findPackageFor(targetFile.path);
expect(package, isNull);
}
void test_findPackageFor_noBuildFile_disabledPackagesFile() {
_addResources([
'/ws/blaze-out/host/bin/some/code/code.packages',
'/ws/some/code/lib/code.dart',
]);
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/ws/some/code'),
lookForBuildFileSubstitutes: false,
)!;
WorkspacePackageImpl? package = workspace.findPackageFor(
convertPath('/ws/some/code/lib/code.dart'),
);
expect(package, isNull);
}
void test_findPackageFor_packagesFileExistsInOneOfSeveralBinPaths() {
_addResources([
'/ws/blaze-out/host/bin/some/code/code.packages',
'/ws/blaze-out/k8-opt/bin/some/code/',
'/ws/some/code/lib/code.dart',
]);
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/ws/some/code'),
)!;
package = workspace.findPackageFor(
convertPath('/ws/some/code/lib/code.dart'),
)!;
expect(package.root.path, convertPath('/ws/some/code'));
expect(package.workspace, equals(workspace));
}
void test_findPackageFor_packagesFileExistsInOnlyBinPath() {
_addResources([
'/ws/blaze-out/host/bin/some/code/code.packages',
'/ws/some/code/lib/code.dart',
]);
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/ws/some/code'),
)!;
package = workspace.findPackageFor(
convertPath('/ws/some/code/lib/code.dart'),
)!;
expect(package.root.path, convertPath('/ws/some/code'));
expect(package.workspace, equals(workspace));
}
void test_findPackageFor_packagesFileInBinExists_subPackage() {
_addResources([
'/ws/blaze-out/host/bin/some/code/code.packages',
'/ws/blaze-out/host/bin/some/code/testing/testing.packages',
'/ws/some/code/lib/code.dart',
'/ws/some/code/testing/lib/testing.dart',
]);
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/ws/some/code/testing'),
)!;
package = workspace.findPackageFor(
convertPath('/ws/some/code/testing/lib/testing.dart'),
)!;
expect(package.root.path, convertPath('/ws/some/code/testing'));
expect(package.workspace, equals(workspace));
}
test_isInTestDirectory() {
_setUpPackage();
expect(
package.isInTestDirectory(getFile('/ws/some/code/lib/a.dart')),
isFalse,
);
expect(
package.isInTestDirectory(getFile('/ws/some/code/test/a.dart')),
isTrue,
);
}
void test_packagesAvailableTo() {
_setUpPackage();
var path = convertPath('/ws/some/code/lib/code.dart');
var packages = package.packagesAvailableTo(path);
expect(packages.packages, isEmpty);
}
/// Create new files and directories from [paths].
void _addResources(List<String> paths) {
for (String path in paths) {
if (path.endsWith('/')) {
newFolder(path.substring(0, path.length - 1));
} else {
newFile(path, '');
}
}
}
Source _inSummarySource(String uriStr) {
var uri = Uri.parse(uriStr);
return InSummarySource(
uri: uri,
summaryPath: '',
kind: InSummarySourceKind.library,
);
}
void _setUpPackage() {
_addResources([
'/ws/${file_paths.blazeWorkspaceMarker}',
'/ws/blaze-genfiles/',
'/ws/some/code/BUILD',
'/ws/some/code/lib/code.dart',
]);
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/ws/some/code'),
)!;
package = workspace.findPackageFor(
convertPath('/ws/some/code/lib/code.dart'),
)!;
}
Source _testSource(String path) {
path = convertPath(path);
return TestSource(path);
}
}
@reflectiveTest
class BlazeWorkspaceTest with ResourceProviderMixin {
late final BlazeWorkspace workspace;
void test_blazeNotifications() async {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-bin/my/module/test1.dart',
]);
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
)!;
var notifications = StreamQueue(workspace.blazeCandidateFiles);
var file1 = workspace.findFile(
convertPath('/workspace/my/module/test1.dart'),
)!;
expect(file1.exists, true);
var info = await notifications.next;
expect(info.requestedPath, convertPath('my/module/test1.dart'));
expect(
info.candidatePaths,
containsAll([
convertPath('/workspace/blaze-bin/my/module/test1.dart'),
convertPath('/workspace/blaze-genfiles/my/module/test1.dart'),
]),
);
var file2 = workspace.findFile(
convertPath('/workspace/my/module/test2.dart'),
)!;
expect(file2.exists, false);
info = await notifications.next;
expect(info.requestedPath, convertPath('my/module/test2.dart'));
expect(
info.candidatePaths,
containsAll([
convertPath('/workspace/blaze-bin/my/module/test2.dart'),
convertPath('/workspace/blaze-genfiles/my/module/test2.dart'),
]),
);
}
void test_find_fail_notAbsolute() {
expect(
() => BlazeWorkspace.find(resourceProvider, convertPath('not_absolute')),
throwsA(const TypeMatcher<ArgumentError>()),
);
}
void test_find_hasBlazeBinFolderInOutFolder() {
_addResources([
'/workspace/blaze-out/host/bin/',
'/workspace/my/module/BUILD',
]);
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
)!;
expect(workspace.root, convertPath('/workspace'));
expect(
workspace.binPaths.first,
convertPath('/workspace/blaze-out/host/bin'),
);
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
expect(
workspace
.findPackageFor(
convertPath('/workspace/blaze-out/host/bin/my/module/lib/foo.dart'),
)!
.root
.path,
convertPath('/workspace/my/module'),
);
}
void test_find_hasBlazeOutFolder_missingBinFolder() {
_addResources([
'/workspace/blaze-genfiles/',
'/workspace/blaze-out/',
'/workspace/my/module/',
]);
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
)!;
expect(workspace.root, convertPath('/workspace'));
expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
}
void test_find_hasMultipleBlazeBinFolderInOutFolder() {
_addResources([
'/workspace/blaze-out/host/bin/',
'/workspace/blaze-out/k8-fastbuild/bin/',
'/workspace/my/module/',
]);
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
)!;
expect(workspace.root, convertPath('/workspace'));
expect(workspace.binPaths, hasLength(3));
expect(
workspace.binPaths,
contains(convertPath('/workspace/blaze-out/host/bin')),
);
expect(
workspace.binPaths,
contains(convertPath('/workspace/blaze-out/k8-fastbuild/bin')),
);
expect(workspace.binPaths, contains(convertPath('/workspace/blaze-bin')));
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
}
void test_find_hasWorkspaceFile() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
)!;
expect(workspace.root, convertPath('/workspace'));
expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
}
void test_find_hasWorkspaceFile_forModuleInWorkspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
)!;
expect(workspace.root, convertPath('/workspace'));
expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
}
void test_find_hasWorkspaceFile_forWorkspace() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace'),
)!;
expect(workspace.root, convertPath('/workspace'));
expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
}
void test_find_hasWorkspaceFile_forWorkspace_blaze() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/blaze-genfiles/',
]);
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace'),
)!;
expect(workspace.root, convertPath('/workspace'));
expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
}
void test_find_null_noWorkspaceMarkers() {
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
);
expect(workspace, isNull);
}
void test_find_null_noWorkspaceMarkers_inRoot() {
var workspace = BlazeWorkspace.find(resourceProvider, convertPath('/'));
expect(workspace, isNull);
}
void test_find_null_symlinkPrefix() {
newFile('/workspace/${file_paths.blazeWorkspaceMarker}', '');
var workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
)!;
expect(workspace.root, convertPath('/workspace'));
expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
}
void test_findFile() {
_addResources([
'/workspace/${file_paths.blazeWorkspaceMarker}',
'/workspace/my/module/test1.dart',
'/workspace/my/module/test2.dart',
'/workspace/my/module/test3.dart',
'/workspace/blaze-bin/my/module/test2.dart',
'/workspace/blaze-genfiles/my/module/test3.dart',
]);
workspace = BlazeWorkspace.find(
resourceProvider,
convertPath('/workspace/my/module'),
)!;
_expectFindFile(
'/workspace/my/module/test1.dart',
equals: '/workspace/my/module/test1.dart',
);
_expectFindFile(
'/workspace/my/module/test2.dart',
equals: '/workspace/blaze-bin/my/module/test2.dart',
);
_expectFindFile(
'/workspace/my/module/test3.dart',
equals: '/workspace/blaze-genfiles/my/module/test3.dart',
);
}
void test_forBuild() {
// We don't have to create any resources, `forBuild()` does not check.
var workspace = BlazeWorkspace.forBuild(root: getFolder('/workspace'));
expect(workspace.root, convertPath('/workspace'));
expect(workspace.binPaths.single, convertPath('/workspace/blaze-bin'));
expect(workspace.genfiles, convertPath('/workspace/blaze-genfiles'));
}
/// Create new files and directories from [paths].
void _addResources(List<String> paths) {
for (String path in paths) {
if (path.endsWith('/')) {
newFolder(path.substring(0, path.length - 1));
} else {
newFile(path, '');
}
}
}
/// Expect that [BlazeWorkspace.findFile], given [path], returns [equals].
void _expectFindFile(String path, {required String equals}) =>
expect(workspace.findFile(convertPath(path))!.path, convertPath(equals));
}