| Index: packages/analyzer/test/generated/source_factory_test.dart
|
| diff --git a/packages/analyzer/test/generated/source_factory_test.dart b/packages/analyzer/test/generated/source_factory_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c16f1f8f6e31aea1429bf116fc35cd25d3c503db
|
| --- /dev/null
|
| +++ b/packages/analyzer/test/generated/source_factory_test.dart
|
| @@ -0,0 +1,352 @@
|
| +// Copyright (c) 2015, 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.
|
| +
|
| +library analyzer.test.generated.source_factory;
|
| +
|
| +import 'dart:convert';
|
| +
|
| +import 'package:analyzer/file_system/file_system.dart';
|
| +import 'package:analyzer/file_system/memory_file_system.dart';
|
| +import 'package:analyzer/source/package_map_resolver.dart';
|
| +import 'package:analyzer/src/generated/java_core.dart';
|
| +import 'package:analyzer/src/generated/java_engine_io.dart';
|
| +import 'package:analyzer/src/generated/java_io.dart';
|
| +import 'package:analyzer/src/generated/source.dart';
|
| +import 'package:analyzer/src/generated/source_io.dart';
|
| +import 'package:analyzer/src/generated/utilities_dart.dart' as utils;
|
| +import 'package:package_config/packages.dart';
|
| +import 'package:package_config/packages_file.dart' as pkgfile show parse;
|
| +import 'package:package_config/src/packages_impl.dart';
|
| +import 'package:path/path.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +import '../reflective_tests.dart';
|
| +import '../utils.dart';
|
| +import 'test_support.dart';
|
| +
|
| +main() {
|
| + initializeTestEnvironment();
|
| + runReflectiveTests(SourceFactoryTest);
|
| + runPackageMapTests();
|
| +}
|
| +
|
| +Source createSource({String path, String uri}) =>
|
| + //TODO(pquitslund): find some way to pass an actual URI into source creation
|
| + new MemoryResourceProvider()
|
| + .getFile(path)
|
| + .createSource(uri != null ? Uri.parse(uri) : null);
|
| +
|
| +void runPackageMapTests() {
|
| + final Uri baseUri = new Uri.file('test/base');
|
| + final List<UriResolver> testResolvers = [new FileUriResolver()];
|
| +
|
| + Packages createPackageMap(Uri base, String configFileContents) {
|
| + List<int> bytes = UTF8.encode(configFileContents);
|
| + Map<String, Uri> map = pkgfile.parse(bytes, base);
|
| + return new MapPackages(map);
|
| + }
|
| +
|
| + Map<String, List<Folder>> getPackageMap(String config) {
|
| + Packages packages = createPackageMap(baseUri, config);
|
| + SourceFactory factory = new SourceFactory(testResolvers, packages);
|
| + return factory.packageMap;
|
| + }
|
| +
|
| + String resolvePackageUri(
|
| + {String uri,
|
| + String config,
|
| + Source containingSource,
|
| + UriResolver customResolver}) {
|
| + Packages packages = createPackageMap(baseUri, config);
|
| + List<UriResolver> resolvers = testResolvers.toList();
|
| + if (customResolver != null) {
|
| + resolvers.add(customResolver);
|
| + }
|
| + SourceFactory factory = new SourceFactory(resolvers, packages);
|
| + Source source = factory.resolveUri(containingSource, uri);
|
| + return source != null ? source.fullName : null;
|
| + }
|
| +
|
| + Uri restorePackageUri(
|
| + {Source source, String config, UriResolver customResolver}) {
|
| + Packages packages = createPackageMap(baseUri, config);
|
| + List<UriResolver> resolvers = testResolvers.toList();
|
| + if (customResolver != null) {
|
| + resolvers.add(customResolver);
|
| + }
|
| + SourceFactory factory = new SourceFactory(resolvers, packages);
|
| + return factory.restoreUri(source);
|
| + }
|
| +
|
| + group('SourceFactoryTest', () {
|
| + group('package mapping', () {
|
| + group('resolveUri', () {
|
| + test('URI in mapping', () {
|
| + String uri = resolvePackageUri(
|
| + config: '''
|
| +unittest:file:///home/somebody/.pub/cache/unittest-0.9.9/lib/
|
| +async:file:///home/somebody/.pub/cache/async-1.1.0/lib/
|
| +quiver:file:///home/somebody/.pub/cache/quiver-1.2.1/lib
|
| +''',
|
| + uri: 'package:unittest/unittest.dart');
|
| + expect(
|
| + uri,
|
| + equals(
|
| + '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart'));
|
| + });
|
| + test('URI in mapping (no scheme)', () {
|
| + String uri = resolvePackageUri(
|
| + config: '''
|
| +unittest:/home/somebody/.pub/cache/unittest-0.9.9/lib/
|
| +async:/home/somebody/.pub/cache/async-1.1.0/lib/
|
| +quiver:/home/somebody/.pub/cache/quiver-1.2.1/lib
|
| +''',
|
| + uri: 'package:unittest/unittest.dart');
|
| + expect(
|
| + uri,
|
| + equals(
|
| + '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart'));
|
| + });
|
| + test('URI not in mapping', () {
|
| + String uri = resolvePackageUri(
|
| + config: 'unittest:/home/somebody/.pub/cache/unittest-0.9.9/lib/',
|
| + uri: 'package:foo/foo.dart');
|
| + expect(uri, isNull);
|
| + });
|
| + test('Non-package URI', () {
|
| + var testResolver = new CustomUriResolver(uriPath: 'test_uri');
|
| + String uri = resolvePackageUri(
|
| + config: 'unittest:/home/somebody/.pub/cache/unittest-0.9.9/lib/',
|
| + uri: 'custom:custom.dart',
|
| + customResolver: testResolver);
|
| + expect(uri, testResolver.uriPath);
|
| + });
|
| + test('Invalid URI', () {
|
| + // TODO(pquitslund): fix clients to handle errors appropriately
|
| + // CLI: print message 'invalid package file format'
|
| + // SERVER: best case tell user somehow and recover...
|
| + expect(
|
| + () => resolvePackageUri(
|
| + config: 'foo:<:&%>', uri: 'package:foo/bar.dart'),
|
| + throwsA(new isInstanceOf('FormatException')));
|
| + });
|
| + test('Valid URI that cannot be further resolved', () {
|
| + String uri = resolvePackageUri(
|
| + config: 'foo:http://www.google.com', uri: 'package:foo/bar.dart');
|
| + expect(uri, isNull);
|
| + });
|
| + test('Relative URIs', () {
|
| + Source containingSource = createSource(
|
| + path: '/foo/bar/baz/foo.dart', uri: 'package:foo/foo.dart');
|
| + String uri = resolvePackageUri(
|
| + config: 'foo:/foo/bar/baz',
|
| + uri: 'bar.dart',
|
| + containingSource: containingSource);
|
| + expect(uri, isNotNull);
|
| + expect(uri, equals('/foo/bar/baz/bar.dart'));
|
| + });
|
| + });
|
| + group('restoreUri', () {
|
| + test('URI in mapping', () {
|
| + Uri uri = restorePackageUri(
|
| + config: '''
|
| +unittest:/home/somebody/.pub/cache/unittest-0.9.9/lib/
|
| +async:/home/somebody/.pub/cache/async-1.1.0/lib/
|
| +quiver:/home/somebody/.pub/cache/quiver-1.2.1/lib
|
| +''',
|
| + source: new FileBasedSource(FileUtilities2.createFile(
|
| + '/home/somebody/.pub/cache/unittest-0.9.9/lib/unittest.dart')));
|
| + expect(uri, isNotNull);
|
| + expect(uri.toString(), equals('package:unittest/unittest.dart'));
|
| + });
|
| + });
|
| + group('packageMap', () {
|
| + test('non-file URIs filtered', () {
|
| + Map<String, List<Folder>> map = getPackageMap('''
|
| +quiver:/home/somebody/.pub/cache/quiver-1.2.1/lib
|
| +foo:http://www.google.com
|
| +''');
|
| + expect(map.keys, unorderedEquals(['quiver']));
|
| + });
|
| + });
|
| + });
|
| + });
|
| +
|
| + group('URI utils', () {
|
| + group('URI', () {
|
| + test('startsWith', () {
|
| + expect(utils.startsWith(Uri.parse('/foo/bar/'), Uri.parse('/foo/')),
|
| + isTrue);
|
| + expect(utils.startsWith(Uri.parse('/foo/bar/'), Uri.parse('/foo/bar/')),
|
| + isTrue);
|
| + expect(utils.startsWith(Uri.parse('/foo/bar'), Uri.parse('/foo/b')),
|
| + isFalse);
|
| + // Handle odd URIs (https://github.com/dart-lang/sdk/issues/24126)
|
| + expect(utils.startsWith(Uri.parse('/foo/bar'), Uri.parse('')), isFalse);
|
| + expect(utils.startsWith(Uri.parse(''), Uri.parse('/foo/bar')), isFalse);
|
| + });
|
| + });
|
| + });
|
| +}
|
| +
|
| +class CustomUriResolver extends UriResolver {
|
| + String uriPath;
|
| + CustomUriResolver({this.uriPath});
|
| +
|
| + @override
|
| + Source resolveAbsolute(Uri uri, [Uri actualUri]) =>
|
| + createSource(path: uriPath);
|
| +}
|
| +
|
| +@reflectiveTest
|
| +class SourceFactoryTest {
|
| + void test_creation() {
|
| + expect(new SourceFactory([]), isNotNull);
|
| + }
|
| +
|
| + void test_fromEncoding_invalidUri() {
|
| + SourceFactory factory = new SourceFactory([]);
|
| + expect(() => factory.fromEncoding("<:&%>"),
|
| + throwsA(new isInstanceOf<IllegalArgumentException>()));
|
| + }
|
| +
|
| + void test_fromEncoding_noResolver() {
|
| + SourceFactory factory = new SourceFactory([]);
|
| + expect(() => factory.fromEncoding("foo:/does/not/exist.dart"),
|
| + throwsA(new isInstanceOf<IllegalArgumentException>()));
|
| + }
|
| +
|
| + void test_fromEncoding_valid() {
|
| + String encoding = "file:///does/not/exist.dart";
|
| + SourceFactory factory = new SourceFactory(
|
| + [new UriResolver_SourceFactoryTest_test_fromEncoding_valid(encoding)]);
|
| + expect(factory.fromEncoding(encoding), isNotNull);
|
| + }
|
| +
|
| + void test_resolveUri_absolute() {
|
| + UriResolver_absolute resolver = new UriResolver_absolute();
|
| + SourceFactory factory = new SourceFactory([resolver]);
|
| + factory.resolveUri(null, "dart:core");
|
| + expect(resolver.invoked, isTrue);
|
| + }
|
| +
|
| + void test_resolveUri_nonAbsolute_absolute() {
|
| + SourceFactory factory =
|
| + new SourceFactory([new UriResolver_nonAbsolute_absolute()]);
|
| + String absolutePath = "/does/not/matter.dart";
|
| + Source containingSource =
|
| + new FileBasedSource(FileUtilities2.createFile("/does/not/exist.dart"));
|
| + Source result = factory.resolveUri(containingSource, absolutePath);
|
| + expect(result.fullName,
|
| + FileUtilities2.createFile(absolutePath).getAbsolutePath());
|
| + }
|
| +
|
| + void test_resolveUri_nonAbsolute_relative() {
|
| + SourceFactory factory =
|
| + new SourceFactory([new UriResolver_nonAbsolute_relative()]);
|
| + Source containingSource =
|
| + new FileBasedSource(FileUtilities2.createFile("/does/not/have.dart"));
|
| + Source result = factory.resolveUri(containingSource, "exist.dart");
|
| + expect(result.fullName,
|
| + FileUtilities2.createFile("/does/not/exist.dart").getAbsolutePath());
|
| + }
|
| +
|
| + void test_resolveUri_nonAbsolute_relative_package() {
|
| + MemoryResourceProvider provider = new MemoryResourceProvider();
|
| + Context context = provider.pathContext;
|
| + String packagePath =
|
| + context.joinAll([context.separator, 'path', 'to', 'package']);
|
| + String libPath = context.joinAll([packagePath, 'lib']);
|
| + String dirPath = context.joinAll([libPath, 'dir']);
|
| + String firstPath = context.joinAll([dirPath, 'first.dart']);
|
| + String secondPath = context.joinAll([dirPath, 'second.dart']);
|
| +
|
| + provider.newFolder(packagePath);
|
| + Folder libFolder = provider.newFolder(libPath);
|
| + provider.newFolder(dirPath);
|
| + File firstFile = provider.newFile(firstPath, '');
|
| + provider.newFile(secondPath, '');
|
| +
|
| + PackageMapUriResolver resolver = new PackageMapUriResolver(provider, {
|
| + 'package': [libFolder]
|
| + });
|
| + SourceFactory factory = new SourceFactory([resolver]);
|
| + Source librarySource =
|
| + firstFile.createSource(Uri.parse('package:package/dir/first.dart'));
|
| +
|
| + Source result = factory.resolveUri(librarySource, 'second.dart');
|
| + expect(result, isNotNull);
|
| + expect(result.fullName, secondPath);
|
| + expect(result.uri.toString(), 'package:package/dir/second.dart');
|
| + }
|
| +
|
| + void test_restoreUri() {
|
| + JavaFile file1 = FileUtilities2.createFile("/some/file1.dart");
|
| + JavaFile file2 = FileUtilities2.createFile("/some/file2.dart");
|
| + Source source1 = new FileBasedSource(file1);
|
| + Source source2 = new FileBasedSource(file2);
|
| + Uri expected1 = parseUriWithException("file:///my_file.dart");
|
| + SourceFactory factory =
|
| + new SourceFactory([new UriResolver_restoreUri(source1, expected1)]);
|
| + expect(factory.restoreUri(source1), same(expected1));
|
| + expect(factory.restoreUri(source2), same(null));
|
| + }
|
| +}
|
| +
|
| +class UriResolver_absolute extends UriResolver {
|
| + bool invoked = false;
|
| +
|
| + UriResolver_absolute();
|
| +
|
| + @override
|
| + Source resolveAbsolute(Uri uri, [Uri actualUri]) {
|
| + invoked = true;
|
| + return null;
|
| + }
|
| +}
|
| +
|
| +class UriResolver_nonAbsolute_absolute extends UriResolver {
|
| + @override
|
| + Source resolveAbsolute(Uri uri, [Uri actualUri]) {
|
| + return new FileBasedSource(new JavaFile.fromUri(uri), actualUri);
|
| + }
|
| +}
|
| +
|
| +class UriResolver_nonAbsolute_relative extends UriResolver {
|
| + @override
|
| + Source resolveAbsolute(Uri uri, [Uri actualUri]) {
|
| + return new FileBasedSource(new JavaFile.fromUri(uri), actualUri);
|
| + }
|
| +}
|
| +
|
| +class UriResolver_restoreUri extends UriResolver {
|
| + Source source1;
|
| + Uri expected1;
|
| + UriResolver_restoreUri(this.source1, this.expected1);
|
| +
|
| + @override
|
| + Source resolveAbsolute(Uri uri, [Uri actualUri]) => null;
|
| +
|
| + @override
|
| + Uri restoreAbsolute(Source source) {
|
| + if (identical(source, source1)) {
|
| + return expected1;
|
| + }
|
| + return null;
|
| + }
|
| +}
|
| +
|
| +class UriResolver_SourceFactoryTest_test_fromEncoding_valid
|
| + extends UriResolver {
|
| + String encoding;
|
| + UriResolver_SourceFactoryTest_test_fromEncoding_valid(this.encoding);
|
| +
|
| + @override
|
| + Source resolveAbsolute(Uri uri, [Uri actualUri]) {
|
| + if (uri.toString() == encoding) {
|
| + return new TestSource();
|
| + }
|
| + return null;
|
| + }
|
| +}
|
|
|