| 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 |