| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analyzer.test.source.embedder_test; | 5 library analyzer.test.source.embedder_test; |
| 6 | 6 |
| 7 import 'dart:core' hide Resource; |
| 8 |
| 9 import 'package:analyzer/file_system/file_system.dart'; |
| 7 import 'package:analyzer/file_system/memory_file_system.dart'; | 10 import 'package:analyzer/file_system/memory_file_system.dart'; |
| 8 import 'package:analyzer/source/embedder.dart'; | 11 import 'package:analyzer/source/embedder.dart'; |
| 9 import 'package:analyzer/src/generated/java_io.dart'; | |
| 10 import 'package:analyzer/src/generated/source.dart'; | 12 import 'package:analyzer/src/generated/source.dart'; |
| 13 import 'package:analyzer/src/util/absolute_path.dart'; |
| 14 import 'package:path/path.dart' as path; |
| 11 import 'package:unittest/unittest.dart'; | 15 import 'package:unittest/unittest.dart'; |
| 12 | 16 |
| 13 import '../utils.dart'; | 17 import '../utils.dart'; |
| 14 | 18 |
| 15 main() { | 19 main() { |
| 16 initializeTestEnvironment(); | |
| 17 group('EmbedderUriResolverTest', () { | 20 group('EmbedderUriResolverTest', () { |
| 18 setUp(() { | 21 setUp(() { |
| 22 initializeTestEnvironment(path.context); |
| 19 buildResourceProvider(); | 23 buildResourceProvider(); |
| 20 }); | 24 }); |
| 21 tearDown(() { | 25 tearDown(() { |
| 26 initializeTestEnvironment(); |
| 22 clearResourceProvider(); | 27 clearResourceProvider(); |
| 23 }); | 28 }); |
| 24 test('test_NullEmbedderYamls', () { | 29 test('test_NullEmbedderYamls', () { |
| 25 var resolver = new EmbedderUriResolver(null); | 30 var resolver = new EmbedderUriResolver(null); |
| 26 expect(resolver.length, equals(0)); | 31 expect(resolver.length, equals(0)); |
| 27 }); | 32 }); |
| 28 test('test_NoEmbedderYamls', () { | 33 test('test_NoEmbedderYamls', () { |
| 29 var locator = new EmbedderYamlLocator({ | 34 var locator = new EmbedderYamlLocator({ |
| 30 'fox': [resourceProvider.getResource('/empty')] | 35 'fox': [pathTranslator.getResource('/empty')] |
| 31 }); | 36 }); |
| 32 expect(locator.embedderYamls.length, equals(0)); | 37 expect(locator.embedderYamls.length, equals(0)); |
| 33 }); | 38 }); |
| 34 test('test_EmbedderYaml', () { | 39 test('test_EmbedderYaml', () { |
| 35 var locator = new EmbedderYamlLocator({ | 40 var locator = new EmbedderYamlLocator({ |
| 36 'fox': [resourceProvider.getResource('/tmp')] | 41 'fox': [pathTranslator.getResource('/tmp')] |
| 37 }); | 42 }); |
| 38 var resolver = new EmbedderUriResolver(locator.embedderYamls); | 43 var resolver = new EmbedderUriResolver(locator.embedderYamls); |
| 39 | 44 |
| 40 expectResolved(dartUri, filePath) { | 45 expectResolved(dartUri, posixPath) { |
| 41 Source source = resolver.resolveAbsolute(Uri.parse(dartUri)); | 46 Source source = resolver.resolveAbsolute(Uri.parse(dartUri)); |
| 42 expect(source, isNotNull, reason: dartUri); | 47 expect(source, isNotNull, reason: dartUri); |
| 43 expect(source.fullName, filePath.replaceAll('/', JavaFile.separator)); | 48 expect(source.fullName, posixToOSPath(posixPath)); |
| 44 } | 49 } |
| 45 | 50 |
| 46 // We have four mappings. | 51 // We have four mappings. |
| 47 expect(resolver.length, equals(4)); | 52 expect(resolver.length, equals(4)); |
| 48 // Check that they map to the correct paths. | 53 // Check that they map to the correct paths. |
| 49 expectResolved('dart:fox', '/tmp/slippy.dart'); | 54 expectResolved('dart:fox', '/tmp/slippy.dart'); |
| 50 expectResolved('dart:bear', '/tmp/grizzly.dart'); | 55 expectResolved('dart:bear', '/tmp/grizzly.dart'); |
| 51 expectResolved('dart:relative', '/relative.dart'); | 56 expectResolved('dart:relative', '/relative.dart'); |
| 52 expectResolved('dart:deep', '/tmp/deep/directory/file.dart'); | 57 expectResolved('dart:deep', '/tmp/deep/directory/file.dart'); |
| 53 }); | 58 }); |
| 54 test('test_BadYAML', () { | 59 test('test_BadYAML', () { |
| 55 var locator = new EmbedderYamlLocator(null); | 60 var locator = new EmbedderYamlLocator(null); |
| 56 locator.addEmbedderYaml(null, r'''{{{,{{}}},}}'''); | 61 locator.addEmbedderYaml(null, r'''{{{,{{}}},}}'''); |
| 57 expect(locator.embedderYamls.length, equals(0)); | 62 expect(locator.embedderYamls.length, equals(0)); |
| 58 }); | 63 }); |
| 59 test('test_restoreAbsolute', () { | 64 test('test_restoreAbsolute', () { |
| 60 var locator = new EmbedderYamlLocator({ | 65 var locator = new EmbedderYamlLocator({ |
| 61 'fox': [resourceProvider.getResource('/tmp')] | 66 'fox': [pathTranslator.getResource('/tmp')] |
| 62 }); | 67 }); |
| 63 var resolver = new EmbedderUriResolver(locator.embedderYamls); | 68 var resolver = new EmbedderUriResolver(locator.embedderYamls); |
| 64 | 69 |
| 65 expectRestore(String dartUri, [String expected]) { | 70 expectRestore(String dartUri, [String expected]) { |
| 66 var source = resolver.resolveAbsolute(Uri.parse(dartUri)); | 71 var parsedUri = Uri.parse(dartUri); |
| 72 var source = resolver.resolveAbsolute(parsedUri); |
| 67 expect(source, isNotNull); | 73 expect(source, isNotNull); |
| 68 // Restore source's uri. | 74 // Restore source's uri. |
| 69 var restoreUri = resolver.restoreAbsolute(source); | 75 var restoreUri = resolver.restoreAbsolute(source); |
| 70 expect(restoreUri, isNotNull, reason: dartUri); | 76 expect(restoreUri, isNotNull, reason: dartUri); |
| 71 // Verify that it is 'dart:fox'. | 77 // Verify that it is 'dart:fox'. |
| 72 expect(restoreUri.toString(), equals(expected ?? dartUri)); | 78 expect(restoreUri.toString(), equals(expected ?? dartUri)); |
| 73 List<String> split = (expected ?? dartUri).split(':'); | 79 List<String> split = (expected ?? dartUri).split(':'); |
| 74 expect(restoreUri.scheme, equals(split[0])); | 80 expect(restoreUri.scheme, equals(split[0])); |
| 75 expect(restoreUri.path, equals(split[1])); | 81 expect(restoreUri.path, equals(split[1])); |
| 76 } | 82 } |
| 77 | 83 |
| 78 try { | 84 expectRestore('dart:deep'); |
| 79 expectRestore('dart:deep'); | 85 expectRestore('dart:deep/file.dart', 'dart:deep'); |
| 80 expectRestore('dart:deep/file.dart', 'dart:deep'); | 86 expectRestore('dart:deep/part.dart'); |
| 81 expectRestore('dart:deep/part.dart'); | 87 expectRestore('dart:deep/deep/file.dart'); |
| 82 expectRestore('dart:deep/deep/file.dart'); | |
| 83 if (JavaFile.separator == '\\') { | |
| 84 // See https://github.com/dart-lang/sdk/issues/25498 | |
| 85 fail('expected to fail on Windows'); | |
| 86 } | |
| 87 } catch (_) { | |
| 88 // Test is broken on Windows, but should run elsewhere | |
| 89 if (JavaFile.separator != '\\') { | |
| 90 rethrow; | |
| 91 } | |
| 92 } | |
| 93 }); | 88 }); |
| 94 | 89 |
| 95 test('test_EmbedderSdk_fromFileUri', () { | 90 test('test_EmbedderSdk_fromFileUri', () { |
| 96 var locator = new EmbedderYamlLocator({ | 91 var locator = new EmbedderYamlLocator({ |
| 97 'fox': [resourceProvider.getResource('/tmp')] | 92 'fox': [pathTranslator.getResource('/tmp')] |
| 98 }); | 93 }); |
| 99 var resolver = new EmbedderUriResolver(locator.embedderYamls); | 94 var resolver = new EmbedderUriResolver(locator.embedderYamls); |
| 100 var sdk = resolver.dartSdk; | 95 var sdk = resolver.dartSdk; |
| 101 | 96 |
| 102 expectSource(String filePath, String dartUri) { | 97 expectSource(String posixPath, String dartUri) { |
| 103 var uri = Uri.parse(filePath); | 98 var uri = Uri.parse(posixToOSFileUri(posixPath)); |
| 104 var source = sdk.fromFileUri(uri); | 99 var source = sdk.fromFileUri(uri); |
| 105 expect(source, isNotNull, reason: filePath); | 100 expect(source, isNotNull, reason: posixPath); |
| 106 expect(source.uri.toString(), dartUri); | 101 expect(source.uri.toString(), dartUri); |
| 107 expect(source.fullName, filePath.replaceAll('/', JavaFile.separator)); | 102 expect(source.fullName, posixToOSPath(posixPath)); |
| 108 } | 103 } |
| 109 | 104 |
| 110 //TODO(danrubel) fix embedder on Windows | 105 expectSource('/tmp/slippy.dart', 'dart:fox'); |
| 111 isWindows() => JavaFile.separator == '\\'; | 106 expectSource('/tmp/deep/directory/file.dart', 'dart:deep'); |
| 112 try { | 107 expectSource('/tmp/deep/directory/part.dart', 'dart:deep/part.dart'); |
| 113 expectSource('/tmp/slippy.dart', 'dart:fox'); | |
| 114 expectSource('/tmp/deep/directory/file.dart', 'dart:deep'); | |
| 115 expectSource('/tmp/deep/directory/part.dart', 'dart:deep/part.dart'); | |
| 116 if (isWindows()) fail('expected to fail on windows'); | |
| 117 } catch (e) { | |
| 118 if (!isWindows()) rethrow; | |
| 119 } | |
| 120 }); | 108 }); |
| 121 test('test_EmbedderSdk_getSdkLibrary', () { | 109 test('test_EmbedderSdk_getSdkLibrary', () { |
| 122 var locator = new EmbedderYamlLocator({ | 110 var locator = new EmbedderYamlLocator({ |
| 123 'fox': [resourceProvider.getResource('/tmp')] | 111 'fox': [pathTranslator.getResource('/tmp')] |
| 124 }); | 112 }); |
| 125 var resolver = new EmbedderUriResolver(locator.embedderYamls); | 113 var resolver = new EmbedderUriResolver(locator.embedderYamls); |
| 126 var sdk = resolver.dartSdk; | 114 var sdk = resolver.dartSdk; |
| 127 var lib = sdk.getSdkLibrary('dart:fox'); | 115 var lib = sdk.getSdkLibrary('dart:fox'); |
| 128 expect(lib, isNotNull); | 116 expect(lib, isNotNull); |
| 129 expect(lib.path, '/tmp/slippy.dart'); | 117 expect(lib.path, posixToOSPath('/tmp/slippy.dart')); |
| 130 expect(lib.shortName, 'fox'); | 118 expect(lib.shortName, 'fox'); |
| 131 }); | 119 }); |
| 132 test('test_EmbedderSdk_mapDartUri', () { | 120 test('test_EmbedderSdk_mapDartUri', () { |
| 133 var locator = new EmbedderYamlLocator({ | 121 var locator = new EmbedderYamlLocator({ |
| 134 'fox': [resourceProvider.getResource('/tmp')] | 122 'fox': [pathTranslator.getResource('/tmp')] |
| 135 }); | 123 }); |
| 136 var resolver = new EmbedderUriResolver(locator.embedderYamls); | 124 var resolver = new EmbedderUriResolver(locator.embedderYamls); |
| 137 var sdk = resolver.dartSdk; | 125 var sdk = resolver.dartSdk; |
| 138 | 126 |
| 139 expectSource(String dartUri, String filePath) { | 127 expectSource(String dartUri, String posixPath) { |
| 140 var source = sdk.mapDartUri(dartUri); | 128 var source = sdk.mapDartUri(dartUri); |
| 141 expect(source, isNotNull, reason: filePath); | 129 expect(source, isNotNull, reason: posixPath); |
| 142 expect(source.uri.toString(), dartUri); | 130 expect(source.uri.toString(), dartUri); |
| 143 expect(source.fullName, filePath.replaceAll('/', JavaFile.separator)); | 131 expect(source.fullName, posixToOSPath(posixPath)); |
| 144 } | 132 } |
| 145 | 133 |
| 146 expectSource('dart:fox', '/tmp/slippy.dart'); | 134 expectSource('dart:fox', '/tmp/slippy.dart'); |
| 147 expectSource('dart:deep', '/tmp/deep/directory/file.dart'); | 135 expectSource('dart:deep', '/tmp/deep/directory/file.dart'); |
| 148 expectSource('dart:deep/part.dart', '/tmp/deep/directory/part.dart'); | 136 expectSource('dart:deep/part.dart', '/tmp/deep/directory/part.dart'); |
| 149 }); | 137 }); |
| 150 }); | 138 }); |
| 151 } | 139 } |
| 152 | 140 |
| 153 MemoryResourceProvider resourceProvider; | 141 ResourceProvider resourceProvider; |
| 142 TestPathTranslator pathTranslator; |
| 154 | 143 |
| 155 buildResourceProvider() { | 144 buildResourceProvider() { |
| 156 resourceProvider = new MemoryResourceProvider(); | 145 var rawProvider = new MemoryResourceProvider(isWindows: isWindows); |
| 157 resourceProvider.newFolder('/empty'); | 146 resourceProvider = new TestResourceProvider(rawProvider); |
| 158 resourceProvider.newFolder('/tmp'); | 147 pathTranslator = new TestPathTranslator(rawProvider) |
| 159 resourceProvider.newFile( | 148 ..newFolder('/empty') |
| 160 '/tmp/_embedder.yaml', | 149 ..newFolder('/tmp') |
| 161 r''' | 150 ..newFile( |
| 151 '/tmp/_embedder.yaml', |
| 152 r''' |
| 162 embedder_libs: | 153 embedder_libs: |
| 163 "dart:fox": "slippy.dart" | 154 "dart:fox": "slippy.dart" |
| 164 "dart:bear": "grizzly.dart" | 155 "dart:bear": "grizzly.dart" |
| 165 "dart:relative": "../relative.dart" | 156 "dart:relative": "../relative.dart" |
| 166 "dart:deep": "deep/directory/file.dart" | 157 "dart:deep": "deep/directory/file.dart" |
| 167 "fart:loudly": "nomatter.dart" | 158 "fart:loudly": "nomatter.dart" |
| 168 '''); | 159 '''); |
| 169 } | 160 } |
| 170 | 161 |
| 171 clearResourceProvider() { | 162 clearResourceProvider() { |
| 172 resourceProvider = null; | 163 resourceProvider = null; |
| 164 pathTranslator = null; |
| 173 } | 165 } |
| 166 |
| 167 // TODO(danrubel) if this approach works well for running tests |
| 168 // in a platform specific way, then move all of the following functionality |
| 169 // into a separate test utility library. |
| 170 |
| 171 bool get isWindows => path.Style.platform == path.Style.windows; |
| 172 |
| 173 /** |
| 174 * Assert that the given path is posix. |
| 175 */ |
| 176 void expectAbsolutePosixPath(String posixPath) { |
| 177 expect(posixPath, startsWith('/'), |
| 178 reason: 'Expected absolute posix path, but found $posixPath'); |
| 179 } |
| 180 |
| 181 /** |
| 182 * Translate the given posixPath to a path appropriate for the |
| 183 * platform on which the tests are executing. |
| 184 */ |
| 185 String posixToOSPath(String posixPath) { |
| 186 expectAbsolutePosixPath(posixPath); |
| 187 if (isWindows) { |
| 188 String windowsPath = posixPath.replaceAll('/', '\\'); |
| 189 if (posixPath.startsWith('/')) { |
| 190 return 'C:$windowsPath'; |
| 191 } |
| 192 return windowsPath; |
| 193 } |
| 194 return posixPath; |
| 195 } |
| 196 |
| 197 /** |
| 198 * Translate the given posixPath to a file URI appropriate for the |
| 199 * platform on which the tests are executing. |
| 200 */ |
| 201 String posixToOSFileUri(String posixPath) { |
| 202 expectAbsolutePosixPath(posixPath); |
| 203 return isWindows ? 'file:///C:$posixPath' : 'file://$posixPath'; |
| 204 } |
| 205 |
| 206 /** |
| 207 * A convenience utility for setting up a test [MemoryResourceProvider]. |
| 208 * All supplied paths are assumed to be in [path.posix] format |
| 209 * and are automatically translated to [path.context]. |
| 210 * |
| 211 * This class intentionally does not implement [ResourceProvider] |
| 212 * directly or indirectly so that it cannot be used as a resource provider. |
| 213 * We do not want functionality under test to interact with a resource provider |
| 214 * that automatically translates paths. |
| 215 */ |
| 216 class TestPathTranslator { |
| 217 final MemoryResourceProvider _provider; |
| 218 |
| 219 TestPathTranslator(this._provider); |
| 220 |
| 221 Resource getResource(String posixPath) => |
| 222 _provider.getResource(posixToOSPath(posixPath)); |
| 223 |
| 224 File newFile(String posixPath, String content) => |
| 225 _provider.newFile(posixToOSPath(posixPath), content); |
| 226 |
| 227 Folder newFolder(String posixPath) => |
| 228 _provider.newFolder(posixToOSPath(posixPath)); |
| 229 } |
| 230 |
| 231 /** |
| 232 * A resource provider for testing that asserts that any supplied paths |
| 233 * are appropriate for the OS platform on which the tests are running. |
| 234 */ |
| 235 class TestResourceProvider implements ResourceProvider { |
| 236 final ResourceProvider _provider; |
| 237 |
| 238 TestResourceProvider(this._provider) { |
| 239 expect(_provider.absolutePathContext.separator, isWindows ? '\\' : '/'); |
| 240 } |
| 241 |
| 242 @override |
| 243 AbsolutePathContext get absolutePathContext => _provider.absolutePathContext; |
| 244 |
| 245 @override |
| 246 File getFile(String path) => _provider.getFile(_assertPath(path)); |
| 247 |
| 248 @override |
| 249 Folder getFolder(String path) => _provider.getFolder(_assertPath(path)); |
| 250 |
| 251 @override |
| 252 Resource getResource(String path) => _provider.getResource(_assertPath(path)); |
| 253 |
| 254 @override |
| 255 Folder getStateLocation(String pluginId) => |
| 256 _provider.getStateLocation(pluginId); |
| 257 |
| 258 @override |
| 259 path.Context get pathContext => _provider.pathContext; |
| 260 |
| 261 /** |
| 262 * Assert that the given path is valid for the OS platform on which the |
| 263 * tests are running. |
| 264 */ |
| 265 String _assertPath(String path) { |
| 266 if (isWindows) { |
| 267 if (path.contains('/')) { |
| 268 fail('Expected windows path, but found: $path'); |
| 269 } |
| 270 } else { |
| 271 if (path.contains('\\')) { |
| 272 fail('Expected posix path, but found: $path'); |
| 273 } |
| 274 } |
| 275 return path; |
| 276 } |
| 277 } |
| OLD | NEW |