Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(482)

Side by Side Diff: pkg/analyzer/test/src/summary/bazel_summary_test.dart

Issue 2386743002: Cache linked bundles for Bazel packages in files.. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698