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

Unified Diff: pkg/analysis_server/test/source/optimizing_pub_package_map_provider_test.dart

Issue 1089453002: Avoid redundant calls to "pub list" when multiple dependencies change. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add missing source file. Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analysis_server/test/mocks.dart ('k') | pkg/analysis_server/test/source/test_all.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analysis_server/test/source/optimizing_pub_package_map_provider_test.dart
diff --git a/pkg/analysis_server/test/source/optimizing_pub_package_map_provider_test.dart b/pkg/analysis_server/test/source/optimizing_pub_package_map_provider_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..c604130d98ee63dec332983218ef5db3da9fb008
--- /dev/null
+++ b/pkg/analysis_server/test/source/optimizing_pub_package_map_provider_test.dart
@@ -0,0 +1,231 @@
+// 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 test.source.optimizing_pub_package_map_provider;
+
+import 'dart:convert';
+import 'dart:io' as io;
+
+import 'package:analysis_server/src/source/optimizing_pub_package_map_provider.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+main() {
+ groupSep = ' | ';
+ runReflectiveTests(OptimizingPubPackageMapProviderTest);
+ runReflectiveTests(OptimizingPubPackageMapInfoTest);
+}
+
+@reflectiveTest
+class OptimizingPubPackageMapInfoTest {
+ MemoryResourceProvider resourceProvider;
+
+ int createFile(String path) {
+ return resourceProvider.newFile(path, 'contents').modificationStamp;
+ }
+
+ void createFolder(String path) {
+ resourceProvider.newFolder(path);
+ }
+
+ void modifyFile(String path) {
+ resourceProvider.modifyFile(path, 'contents');
+ }
+
+ void setUp() {
+ resourceProvider = new MemoryResourceProvider();
+ }
+
+ test_isChangedDependency_fileNotPresent() {
+ String path = '/dep';
+ int timestamp = 1;
+ OptimizingPubPackageMapInfo info =
+ new OptimizingPubPackageMapInfo({}, [path].toSet(), {path: timestamp});
+ expect(info.isChangedDependency(path, resourceProvider), isTrue);
+ }
+
+ test_isChangedDependency_matchingTimestamp() {
+ String path = '/dep';
+ int timestamp = createFile(path);
+ OptimizingPubPackageMapInfo info =
+ new OptimizingPubPackageMapInfo({}, [path].toSet(), {path: timestamp});
+ expect(info.isChangedDependency(path, resourceProvider), isFalse);
+ }
+
+ test_isChangedDependency_mismatchedTimestamp() {
+ String path = '/dep';
+ int timestamp = createFile(path);
+ OptimizingPubPackageMapInfo info =
+ new OptimizingPubPackageMapInfo({}, [path].toSet(), {path: timestamp});
+ modifyFile(path);
+ expect(info.isChangedDependency(path, resourceProvider), isTrue);
+ }
+
+ test_isChangedDependency_nonDependency() {
+ OptimizingPubPackageMapInfo info =
+ new OptimizingPubPackageMapInfo({}, ['/dep1'].toSet(), {});
+ expect(info.isChangedDependency('/dep2', resourceProvider), isFalse);
+ }
+
+ test_isChangedDependency_nonFile() {
+ String path = '/dep';
+ int timestamp = 1;
+ createFolder(path);
+ OptimizingPubPackageMapInfo info =
+ new OptimizingPubPackageMapInfo({}, [path].toSet(), {path: timestamp});
+ expect(info.isChangedDependency(path, resourceProvider), isTrue);
+ }
+
+ test_isChangedDependency_noTimestampInfo() {
+ String path = '/dep';
+ OptimizingPubPackageMapInfo info =
+ new OptimizingPubPackageMapInfo({}, [path].toSet(), {});
+ expect(info.isChangedDependency(path, resourceProvider), isTrue);
+ }
+}
+
+@reflectiveTest
+class OptimizingPubPackageMapProviderTest {
+ MemoryResourceProvider resourceProvider;
+ OptimizingPubPackageMapProvider provider;
+ Folder projectFolder;
+ io.ProcessResult pubListResult;
+
+ void setPubListError() {
+ pubListResult = new io.ProcessResult(0, 1, '', 'ERROR');
+ }
+
+ void setPubListResult({Map<String, String> packages: const {},
+ List<String> input_files: const []}) {
+ pubListResult = new io.ProcessResult(0, 0,
+ JSON.encode({'packages': packages, 'input_files': input_files}), '');
+ }
+
+ void setUp() {
+ resourceProvider = new MemoryResourceProvider();
+ provider = new OptimizingPubPackageMapProvider(
+ resourceProvider, null, _runPubList);
+ projectFolder = resourceProvider.newFolder('/my/proj');
+ }
+
+ test_computePackageMap_noPreviousInfo() {
+ String dep = posix.join(projectFolder.path, 'dep');
+ String pkgName = 'foo';
+ String pkgPath = '/pkg/foo';
+ setPubListResult(packages: {pkgName: pkgPath}, input_files: [dep]);
+ OptimizingPubPackageMapInfo info =
+ provider.computePackageMap(projectFolder);
+ expect(info.dependencies, hasLength(1));
+ expect(info.dependencies, contains(dep));
+ expect(info.packageMap, hasLength(1));
+ expect(info.packageMap, contains(pkgName));
+ expect(info.packageMap[pkgName], hasLength(1));
+ expect(info.packageMap[pkgName][0].path, pkgPath);
+ expect(info.modificationTimes, isEmpty);
+ }
+
+ test_computePackageMap_noPreviousInfo_pubListError() {
+ String pubspecLock = posix.join(projectFolder.path, 'pubspec.lock');
+ String pkgName = 'foo';
+ String pkgPath = '/pkg/foo';
+ setPubListError();
+ OptimizingPubPackageMapInfo info =
+ provider.computePackageMap(projectFolder);
+ expect(info.dependencies, hasLength(1));
+ expect(info.dependencies, contains(pubspecLock));
+ expect(info.packageMap, isNull);
+ expect(info.modificationTimes, isEmpty);
+ }
+
+ test_computePackageMap_withPreviousInfo() {
+ String dep = posix.join(projectFolder.path, 'dep');
+ int timestamp = resourceProvider.newFile(dep, 'contents').modificationStamp;
+ setPubListResult(input_files: [dep]);
+ OptimizingPubPackageMapInfo info1 =
+ provider.computePackageMap(projectFolder);
+ OptimizingPubPackageMapInfo info2 =
+ provider.computePackageMap(projectFolder, info1);
+ expect(info2.dependencies, hasLength(1));
+ expect(info2.dependencies, contains(dep));
+ expect(info2.modificationTimes, hasLength(1));
+ expect(info2.modificationTimes, contains(dep));
+ expect(info2.modificationTimes[dep], timestamp);
+ }
+
+ test_computePackageMap_withPreviousInfo_newDependency() {
+ String dep = posix.join(projectFolder.path, 'dep');
+ resourceProvider.newFile(dep, 'contents').modificationStamp;
+ setPubListResult(input_files: []);
+ OptimizingPubPackageMapInfo info1 =
+ provider.computePackageMap(projectFolder);
+ setPubListResult(input_files: [dep]);
+ OptimizingPubPackageMapInfo info2 =
+ provider.computePackageMap(projectFolder, info1);
+ expect(info2.modificationTimes, isEmpty);
+ }
+
+ test_computePackageMap_withPreviousInfo_oldDependencyNoLongerAFile() {
+ String dep = posix.join(projectFolder.path, 'dep');
+ resourceProvider.newFile(dep, 'contents').modificationStamp;
+ setPubListResult(input_files: [dep]);
+ OptimizingPubPackageMapInfo info1 =
+ provider.computePackageMap(projectFolder);
+ resourceProvider.deleteFile(dep);
+ resourceProvider.newFolder(dep);
+ OptimizingPubPackageMapInfo info2 =
+ provider.computePackageMap(projectFolder, info1);
+ expect(info2.modificationTimes, isEmpty);
+ }
+
+ test_computePackageMap_withPreviousInfo_oldDependencyNoLongerPresent() {
+ String dep = posix.join(projectFolder.path, 'dep');
+ resourceProvider.newFile(dep, 'contents').modificationStamp;
+ setPubListResult(input_files: [dep]);
+ OptimizingPubPackageMapInfo info1 =
+ provider.computePackageMap(projectFolder);
+ resourceProvider.deleteFile(dep);
+ OptimizingPubPackageMapInfo info2 =
+ provider.computePackageMap(projectFolder, info1);
+ expect(info2.modificationTimes, isEmpty);
+ }
+
+ test_computePackageMap_withPreviousInfo_oldDependencyNoLongerRelevant() {
+ String dep = posix.join(projectFolder.path, 'dep');
+ resourceProvider.newFile(dep, 'contents').modificationStamp;
+ setPubListResult(input_files: [dep]);
+ OptimizingPubPackageMapInfo info1 =
+ provider.computePackageMap(projectFolder);
+ setPubListResult(input_files: []);
+ OptimizingPubPackageMapInfo info2 =
+ provider.computePackageMap(projectFolder, info1);
+ expect(info2.modificationTimes, isEmpty);
+ }
+
+ test_computePackageMap_withPreviousInfo_pubListError() {
+ String dep = posix.join(projectFolder.path, 'dep');
+ String pubspecLock = posix.join(projectFolder.path, 'pubspec.lock');
+ int timestamp = resourceProvider.newFile(dep, 'contents').modificationStamp;
+ setPubListResult(input_files: [dep]);
+ OptimizingPubPackageMapInfo info1 =
+ provider.computePackageMap(projectFolder);
+ setPubListError();
+ OptimizingPubPackageMapInfo info2 =
+ provider.computePackageMap(projectFolder, info1);
+ expect(info2.dependencies, hasLength(2));
+ expect(info2.dependencies, contains(dep));
+ expect(info2.dependencies, contains(pubspecLock));
+ expect(info2.modificationTimes, hasLength(1));
+ expect(info2.modificationTimes, contains(dep));
+ expect(info2.modificationTimes[dep], timestamp);
+ }
+
+ io.ProcessResult _runPubList(Folder folder) {
+ expect(folder, projectFolder);
+ return pubListResult;
+ }
+}
« no previous file with comments | « pkg/analysis_server/test/mocks.dart ('k') | pkg/analysis_server/test/source/test_all.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698