OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'package:analyzer/dart/ast/ast.dart'; | 5 import 'package:analyzer/dart/ast/ast.dart'; |
6 import 'package:analyzer/dart/ast/token.dart'; | 6 import 'package:analyzer/dart/ast/token.dart'; |
7 import 'package:analyzer/dart/element/element.dart'; | 7 import 'package:analyzer/dart/element/element.dart'; |
8 import 'package:analyzer/error/listener.dart'; | 8 import 'package:analyzer/error/listener.dart'; |
9 import 'package:analyzer/file_system/file_system.dart'; | 9 import 'package:analyzer/file_system/file_system.dart'; |
10 import 'package:analyzer/src/context/cache.dart'; | 10 import 'package:analyzer/src/context/cache.dart'; |
11 import 'package:analyzer/src/dart/scanner/reader.dart'; | 11 import 'package:analyzer/src/dart/scanner/reader.dart'; |
12 import 'package:analyzer/src/dart/scanner/scanner.dart'; | 12 import 'package:analyzer/src/dart/scanner/scanner.dart'; |
13 import 'package:analyzer/src/generated/engine.dart'; | 13 import 'package:analyzer/src/generated/engine.dart'; |
14 import 'package:analyzer/src/generated/parser.dart'; | 14 import 'package:analyzer/src/generated/parser.dart'; |
15 import 'package:analyzer/src/generated/source.dart'; | 15 import 'package:analyzer/src/generated/source.dart'; |
16 import 'package:analyzer/src/summary/bazel_summary.dart'; | 16 import 'package:analyzer/src/summary/bazel_summary.dart'; |
17 import 'package:analyzer/src/summary/format.dart'; | 17 import 'package:analyzer/src/summary/format.dart'; |
| 18 import 'package:analyzer/src/summary/idl.dart'; |
18 import 'package:analyzer/src/summary/summarize_ast.dart'; | 19 import 'package:analyzer/src/summary/summarize_ast.dart'; |
19 import 'package:analyzer/src/summary/summarize_elements.dart'; | 20 import 'package:analyzer/src/summary/summarize_elements.dart'; |
20 import 'package:analyzer/src/util/fast_uri.dart'; | 21 import 'package:analyzer/src/util/fast_uri.dart'; |
21 import 'package:analyzer/task/dart.dart'; | 22 import 'package:analyzer/task/dart.dart'; |
22 import 'package:path/path.dart' as pathos; | 23 import 'package:path/path.dart' as pathos; |
23 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 24 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
24 import 'package:unittest/unittest.dart'; | 25 import 'package:unittest/unittest.dart'; |
25 | 26 |
26 import '../../utils.dart'; | 27 import '../../utils.dart'; |
27 import '../context/abstract_context.dart'; | 28 import '../context/abstract_context.dart'; |
28 | 29 |
29 main() { | 30 main() { |
30 initializeTestEnvironment(); | 31 initializeTestEnvironment(); |
31 defineReflectiveTests(BazelResultProviderTest); | 32 defineReflectiveTests(BazelResultProviderTest); |
32 defineReflectiveTests(SummaryProviderTest); | 33 defineReflectiveTests(SummaryProviderTest); |
33 } | 34 } |
34 | 35 |
35 const OUT_ROOT = '$SRC_ROOT/bazel-bin'; | 36 const OUT_ROOT = '$SRC_ROOT/bazel-bin'; |
36 const SRC_ROOT = '/company/src/user/project/root'; | 37 const SRC_ROOT = '/company/src/user/project/root'; |
37 | 38 |
38 @reflectiveTest | 39 @reflectiveTest |
39 class BazelResultProviderTest extends _BaseTest { | 40 class BazelResultProviderTest extends _BaseTest { |
40 BazelResultProvider provider; | 41 BazelResultProvider provider; |
41 | 42 |
42 @override | 43 @override |
43 void setUp() { | 44 void setUp() { |
44 super.setUp(); | 45 super.setUp(); |
45 provider = new BazelResultProvider( | 46 provider = new BazelResultProvider(new SummaryProvider( |
46 new SummaryProvider(resourceProvider, _getOutputFolder, context)); | 47 resourceProvider, |
| 48 '_.temp', |
| 49 _getOutputFolder, |
| 50 resourceProvider.getFolder('/tmp/dart/bazel/linked'), |
| 51 context)); |
47 } | 52 } |
48 | 53 |
49 test_failure_inconsistent_directDependency() { | 54 test_failure_inconsistent_directDependency() { |
50 _setComponentFile('aaa', 'a.dart', 'class A {}'); | 55 _setComponentFile('aaa', 'a.dart', 'class A {}'); |
51 _setComponentFile( | 56 _setComponentFile( |
52 'bbb', | 57 'bbb', |
53 'b.dart', | 58 'b.dart', |
54 r''' | 59 r''' |
55 import 'package:components.aaa/a.dart'; | 60 import 'package:components.aaa/a.dart'; |
56 class B extends A {} | 61 class B extends A {} |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 } | 134 } |
130 } | 135 } |
131 | 136 |
132 @reflectiveTest | 137 @reflectiveTest |
133 class SummaryProviderTest extends _BaseTest { | 138 class SummaryProviderTest extends _BaseTest { |
134 SummaryProvider manager; | 139 SummaryProvider manager; |
135 | 140 |
136 @override | 141 @override |
137 void setUp() { | 142 void setUp() { |
138 super.setUp(); | 143 super.setUp(); |
139 manager = new SummaryProvider(resourceProvider, _getOutputFolder, context); | 144 _createManager(); |
| 145 } |
| 146 |
| 147 test_getLinkedPackages_cached() { |
| 148 _setComponentFile('aaa', 'a.dart', 'class A {}'); |
| 149 _setComponentFile( |
| 150 'bbb', |
| 151 'b.dart', |
| 152 r''' |
| 153 import 'package:components.aaa/a.dart'; |
| 154 class B extends A {} |
| 155 '''); |
| 156 _writeUnlinkedBundle('components.aaa'); |
| 157 _writeUnlinkedBundle('components.bbb'); |
| 158 Source source = _resolveUri('package:components.bbb/b.dart'); |
| 159 |
| 160 // Session 1. |
| 161 // Create linked bundles and store them in files. |
| 162 { |
| 163 List<Package> packages = manager.getLinkedPackages(source); |
| 164 expect(packages, hasLength(2)); |
| 165 } |
| 166 |
| 167 // Session 2. |
| 168 // Recreate manager (with disabled linking) and ask again. |
| 169 { |
| 170 _createManager(allowLinking: false); |
| 171 List<Package> packages = manager.getLinkedPackages(source); |
| 172 expect(packages, hasLength(2)); |
| 173 } |
| 174 } |
| 175 |
| 176 test_getLinkedPackages_cached_declaredVariables_export() { |
| 177 _testImpl_getLinkedPackages_cached_declaredVariables('export'); |
| 178 } |
| 179 |
| 180 test_getLinkedPackages_cached_declaredVariables_import() { |
| 181 _testImpl_getLinkedPackages_cached_declaredVariables('import'); |
140 } | 182 } |
141 | 183 |
142 test_getLinkedPackages_null_inconsistent_directDependency() { | 184 test_getLinkedPackages_null_inconsistent_directDependency() { |
143 _setComponentFile('aaa', 'a.dart', 'class A {}'); | 185 _setComponentFile('aaa', 'a.dart', 'class A {}'); |
144 _setComponentFile( | 186 _setComponentFile( |
145 'bbb', | 187 'bbb', |
146 'b.dart', | 188 'b.dart', |
147 r''' | 189 r''' |
148 import 'package:components.aaa/a.dart'; | 190 import 'package:components.aaa/a.dart'; |
149 class B extends A {} | 191 class B extends A {} |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 _writeUnlinkedBundle('components.aaa'); | 342 _writeUnlinkedBundle('components.aaa'); |
301 // Ask the package for the URI. | 343 // Ask the package for the URI. |
302 Source source1 = _resolveUri('package:components.aaa/a1.dart'); | 344 Source source1 = _resolveUri('package:components.aaa/a1.dart'); |
303 Source source2 = _resolveUri('package:components.aaa/a2.dart'); | 345 Source source2 = _resolveUri('package:components.aaa/a2.dart'); |
304 Package package = manager.getUnlinkedForUri(source1.uri); | 346 Package package = manager.getUnlinkedForUri(source1.uri); |
305 expect(package, isNotNull); | 347 expect(package, isNotNull); |
306 // The same instance is returned to another URI in the same package. | 348 // The same instance is returned to another URI in the same package. |
307 expect(manager.getUnlinkedForUri(source2.uri), same(package)); | 349 expect(manager.getUnlinkedForUri(source2.uri), same(package)); |
308 } | 350 } |
309 | 351 |
310 test_getUnlinkedForUri_inconsistent() { | 352 test_getUnlinkedForUri_inconsistent_fileContent() { |
311 File file1 = _setComponentFile('aaa', 'a1.dart', 'class A1 {}'); | 353 File file1 = _setComponentFile('aaa', 'a1.dart', 'class A1 {}'); |
312 _setComponentFile('aaa', 'a2.dart', 'class A2 {}'); | 354 _setComponentFile('aaa', 'a2.dart', 'class A2 {}'); |
313 _writeUnlinkedBundle('components.aaa'); | 355 _writeUnlinkedBundle('components.aaa'); |
314 // Update one of the files, so the bundle is not consistent. | 356 // Update one of the files, so the bundle is not consistent. |
315 file1.writeAsStringSync('\nclass A1 {}'); | 357 file1.writeAsStringSync('\nclass A1 {}'); |
316 Source source1 = _resolveUri('package:components.aaa/a1.dart'); | 358 Source source1 = _resolveUri('package:components.aaa/a1.dart'); |
317 Source source2 = _resolveUri('package:components.aaa/a2.dart'); | 359 Source source2 = _resolveUri('package:components.aaa/a2.dart'); |
318 expect(manager.getUnlinkedForUri(source1.uri), isNull); | 360 expect(manager.getUnlinkedForUri(source1.uri), isNull); |
319 expect(manager.getUnlinkedForUri(source2.uri), isNull); | 361 expect(manager.getUnlinkedForUri(source2.uri), isNull); |
320 } | 362 } |
| 363 |
| 364 test_getUnlinkedForUri_inconsistent_majorVersion() { |
| 365 _setComponentFile('aaa', 'a.dart', 'class A {}'); |
| 366 _writeUnlinkedBundle('components.aaa'); |
| 367 Source source = _resolveUri('package:components.aaa/a.dart'); |
| 368 |
| 369 // Create manager with a different major version. |
| 370 // The unlinked bundle cannot be used. |
| 371 _createManager(majorVersion: 12345); |
| 372 Package package = manager.getUnlinkedForUri(source.uri); |
| 373 expect(package, isNull); |
| 374 } |
| 375 |
| 376 void _createManager( |
| 377 {bool allowLinking: true, |
| 378 int majorVersion: PackageBundleAssembler.currentMajorVersion}) { |
| 379 manager = new SummaryProvider(resourceProvider, '_.temp', _getOutputFolder, |
| 380 resourceProvider.getFolder('/tmp/dart/bazel/linked'), context, |
| 381 allowLinking: allowLinking, majorVersion: majorVersion); |
| 382 } |
| 383 |
| 384 void _testImpl_getLinkedPackages_cached_declaredVariables( |
| 385 String importOrExport) { |
| 386 _setComponentFile( |
| 387 'aaa', |
| 388 'user.dart', |
| 389 ''' |
| 390 $importOrExport 'foo.dart' |
| 391 if (dart.library.io) 'foo_io.dart' |
| 392 if (dart.library.html) 'foo_html.dart'; |
| 393 '''); |
| 394 _setComponentFile('aaa', 'foo.dart', 'class B {}'); |
| 395 _setComponentFile('aaa', 'foo_io.dart', 'class B {}'); |
| 396 _setComponentFile('aaa', 'foo_dart.dart', 'class B {}'); |
| 397 _writeUnlinkedBundle('components.aaa'); |
| 398 Source source = _resolveUri('package:components.aaa/user.dart'); |
| 399 |
| 400 void _assertDependencyInUser(PackageBundle bundle, String shortName) { |
| 401 for (var i = 0; i < bundle.linkedLibraryUris.length; i++) { |
| 402 if (bundle.linkedLibraryUris[i].endsWith('user.dart')) { |
| 403 LinkedLibrary library = bundle.linkedLibraries[i]; |
| 404 expect(library.dependencies.map((d) => d.uri), |
| 405 unorderedEquals(['', 'dart:core', shortName])); |
| 406 return; |
| 407 } |
| 408 } |
| 409 fail('Not found user.dart in $bundle'); |
| 410 } |
| 411 |
| 412 // Session 1. |
| 413 // Create linked bundles and store them in files. |
| 414 { |
| 415 List<Package> packages = manager.getLinkedPackages(source); |
| 416 expect(packages, hasLength(1)); |
| 417 _assertDependencyInUser(packages.single.linked, 'foo.dart'); |
| 418 } |
| 419 |
| 420 // Session 2. |
| 421 // Recreate manager and don't allow it to perform new linking. |
| 422 // Set a declared variable, which is not used in the package. |
| 423 // We still can get the cached linked bundle. |
| 424 { |
| 425 context.declaredVariables.define('not.used.variable', 'baz'); |
| 426 _createManager(allowLinking: false); |
| 427 List<Package> packages = manager.getLinkedPackages(source); |
| 428 expect(packages, hasLength(1)); |
| 429 _assertDependencyInUser(packages.single.linked, 'foo.dart'); |
| 430 } |
| 431 |
| 432 // Session 3. |
| 433 // Recreate manager and don't allow it to perform new linking. |
| 434 // Set the value of a referenced declared variable. |
| 435 // So, we cannot use the previously cached linked bundle. |
| 436 { |
| 437 context.declaredVariables.define('dart.library.io', 'does-not-matter'); |
| 438 _createManager(allowLinking: false); |
| 439 List<Package> packages = manager.getLinkedPackages(source); |
| 440 expect(packages, isEmpty); |
| 441 } |
| 442 |
| 443 // Session 4. |
| 444 // Enable new linking, and configure to use 'foo_html.dart'. |
| 445 { |
| 446 context.declaredVariables.define('dart.library.html', 'true'); |
| 447 _createManager(allowLinking: true); |
| 448 List<Package> packages = manager.getLinkedPackages(source); |
| 449 expect(packages, hasLength(1)); |
| 450 _assertDependencyInUser(packages.single.linked, 'foo_html.dart'); |
| 451 } |
| 452 } |
321 } | 453 } |
322 | 454 |
323 class _BaseTest extends AbstractContextTest { | 455 class _BaseTest extends AbstractContextTest { |
324 @override | 456 @override |
325 void setUp() { | 457 void setUp() { |
326 super.setUp(); | 458 super.setUp(); |
327 // Include a 'package' URI resolver. | 459 // Include a 'package' URI resolver. |
328 sourceFactory = new SourceFactory(<UriResolver>[ | 460 sourceFactory = new SourceFactory(<UriResolver>[ |
329 sdkResolver, | 461 sdkResolver, |
330 resourceResolver, | 462 resourceResolver, |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 } | 589 } |
458 } | 590 } |
459 return null; | 591 return null; |
460 } | 592 } |
461 | 593 |
462 @override | 594 @override |
463 Uri restoreAbsolute(Source source) { | 595 Uri restoreAbsolute(Source source) { |
464 throw new UnimplementedError(); | 596 throw new UnimplementedError(); |
465 } | 597 } |
466 } | 598 } |
OLD | NEW |