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

Unified Diff: test/descriptor/packages.dart

Issue 1096723002: Make pub generate .packages file. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Created 5 years, 6 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 | « test/descriptor.dart ('k') | test/get/cache_transformed_dependency_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/descriptor/packages.dart
diff --git a/test/descriptor/packages.dart b/test/descriptor/packages.dart
new file mode 100644
index 0000000000000000000000000000000000000000..5fbdb288436ea6ce077baf26eaaa061113854b3d
--- /dev/null
+++ b/test/descriptor/packages.dart
@@ -0,0 +1,110 @@
+// Copyright (c) 2013, 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.
+
+/// Pub-specific scheduled_test descriptors.
+library descriptor.packages_file;
+
+import "dart:io" show File;
+import "dart:async" show Future;
+import "dart:convert" show UTF8;
+
+import 'package:package_config/packages_file.dart' as packages_file;
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../test_pub.dart';
+
+/// Describes a `.packages` file and its contents.
+class PackagesFileDescriptor extends Descriptor {
+ // RegExp recognizing semantic version numbers.
+ static final _semverRE =
+ new RegExp(r"^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)"
+ r"(?:-[a-zA-Z\d-]+)?(?:\+[a-zA-Z\d-]+)?$");
+
+ final _dependencies;
+
+ /// Describes a `.packages` file with the given dependencies.
+ ///
+ /// Dependencies maps package name to semantic version.
+ PackagesFileDescriptor([Map<String, String> dependencies])
+ : _dependencies = dependencies,
+ super('.packages');
+
+ Future create([String parent]) => schedule(() {
+ if (parent == null) parent = defaultRoot;
+ var contents = const <int>[];
+ if (_dependencies != null) {
+ var mapping = {};
+ _dependencies.forEach((package, version) {
+ var packagePath;
+ if (_semverRE.hasMatch(version)) {
+ // If it's a semver, it's a cache reference.
+ packagePath = p.join(cachePath, "$package-$version");
+ } else {
+ // Otherwise it's a path relative to the .pubspec file,
+ // which is also the relative path wrt. the .packages file.
+ packagePath = version;
+ }
+ mapping[package] = p.toUri(p.join(packagePath, "lib", ""));
+ });
+ var buffer = new StringBuffer();
+ packages_file.write(buffer, mapping);
+ contents = UTF8.encode(buffer.toString());
+ }
+ return new File(p.join(parent, name)).writeAsBytes(contents);
+ }, "creating file '$name'");
+
+ Future validate([String parent]) =>
+ schedule(() => validateNow(parent), "validating file '$name'");
+
+ Future validateNow([String parent]) {
+ // Copied from FileDescriptor in scheduled_test.
+ if (parent == null) parent = defaultRoot;
+ var fullPath = p.join(parent, name);
+ if (!new File(fullPath).existsSync()) {
+ fail("File not found: '$fullPath'.");
+ }
+ return new File(fullPath).readAsBytes()
+ .then((bytes) => _validateNow(bytes, fullPath));
+ }
+
+ /// A function that throws an error if [binaryContents] doesn't match the
+ /// expected contents of the descriptor.
+ void _validateNow(List<int> binaryContents, String fullPath) {
+ var fileUri = p.toUri(fullPath);
+ var map = packages_file.parse(binaryContents, fileUri);
+
+ for (var package in _dependencies.keys) {
+ if (!map.containsKey(package)) {
+ fail(".packages does not contain $package entry");
+ }
+ var version = _dependencies[package];
+ if (_semverRE.hasMatch(version)) {
+ if (!map[package].path.contains(version)) {
+ fail(".packages of $package has incorrect version. "
+ "Expected $version, found location: ${map[package]}.");
+ }
+ } else {
+ var packagePath = fileUri.resolve("$version/lib/");
+ if (!packagePath.path.endsWith('/')) {
+ packagePath = packagePath.replace(path: packagePath.path + '/');
+ }
+ if ("${map[package]}" != "$packagePath") {
+ fail("Relative path: Expected $packagePath, found ${map[package]}");
+ }
+ }
+ }
+
+ if (map.length != _dependencies.length) {
+ for (var key in map.keys) {
+ if (!_dependencies.containsKey(key)) {
+ fail(".packages file contains unexpected entry: $key");
+ }
+ }
+ }
+ }
+
+ String describe() => name;
+}
« no previous file with comments | « test/descriptor.dart ('k') | test/get/cache_transformed_dependency_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698