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

Side by Side Diff: test/test_pub.dart

Issue 1166783002: Factor in the Dart repo's state for snapshotting. (Closed) Base URL: git@github.com:dart-lang/pub.git@master
Patch Set: Hash the executable rather than the repo. 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 unified diff | Download patch
« no previous file with comments | « pubspec.yaml ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 /// Test infrastructure for testing pub. 5 /// Test infrastructure for testing pub.
6 /// 6 ///
7 /// Unlike typical unit tests, most pub tests are integration tests that stage 7 /// Unlike typical unit tests, most pub tests are integration tests that stage
8 /// some stuff on the file system, run pub, and then validate the results. This 8 /// some stuff on the file system, run pub, and then validate the results. This
9 /// library provides an API to build tests like that. 9 /// library provides an API to build tests like that.
10 library test_pub; 10 library test_pub;
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 workingDirectory: _pathInSandbox(appPath), 552 workingDirectory: _pathInSandbox(appPath),
553 description: args.isEmpty ? 'pub' : 'pub ${args.first}'); 553 description: args.isEmpty ? 'pub' : 'pub ${args.first}');
554 } 554 }
555 555
556 /// Ensure that a snapshot of the current pub source exists at 556 /// Ensure that a snapshot of the current pub source exists at
557 /// ".pub/pub.snapshot". 557 /// ".pub/pub.snapshot".
558 void _ensureSnapshot() { 558 void _ensureSnapshot() {
559 ensureDir(p.join(pubRoot, '.pub')); 559 ensureDir(p.join(pubRoot, '.pub'));
560 560
561 var version = sdk.version.toString(); 561 var version = sdk.version.toString();
562 var hash = _hashChanges(); 562 var pubHash = _hashChanges();
563 var dartHash = runningFromDartRepo ? _hashExecutable() : null;
563 564
564 var snapshotPath = p.join(pubRoot, '.pub', 'pub.test.snapshot'); 565 var snapshotPath = p.join(pubRoot, '.pub', 'pub.test.snapshot');
565 var hashPath = p.join(pubRoot, '.pub', 'pub.hash'); 566 var pubHashPath = p.join(pubRoot, '.pub', 'pub.hash');
567 var dartHashPath = p.join(pubRoot, '.pub', 'dart.hash');
566 var versionPath = p.join(pubRoot, '.pub', 'pub.version'); 568 var versionPath = p.join(pubRoot, '.pub', 'pub.version');
567 if (fileExists(hashPath) && fileExists(versionPath)) { 569 if (fileExists(pubHashPath) && fileExists(versionPath) &&
568 var oldHash = readTextFile(hashPath); 570 (!runningFromDartRepo || fileExists(dartHashPath))) {
571 var oldPubHash = readTextFile(pubHashPath);
572 var oldDartHash = runningFromDartRepo ? readTextFile(dartHashPath) : null;
569 var oldVersion = readTextFile(versionPath); 573 var oldVersion = readTextFile(versionPath);
570 574
571 if (oldHash == hash && oldVersion == version && fileExists(snapshotPath)) { 575 if (oldPubHash == pubHash && oldDartHash == dartHash &&
576 oldVersion == version && fileExists(snapshotPath)) {
572 return; 577 return;
573 } 578 }
574 } 579 }
575 580
576 var args = ['--snapshot=$snapshotPath']; 581 var args = ['--snapshot=$snapshotPath'];
577 if (Platform.packageRoot.isNotEmpty) { 582 if (Platform.packageRoot.isNotEmpty) {
578 args.add('--package-root=${Platform.packageRoot}'); 583 args.add('--package-root=${Platform.packageRoot}');
579 } 584 }
580 args.add(p.join(pubRoot, 'bin', 'pub.dart')); 585 args.add(p.join(pubRoot, 'bin', 'pub.dart'));
581 586
582 var dartSnapshot = runProcessSync(Platform.executable, args); 587 var dartSnapshot = runProcessSync(Platform.executable, args);
583 if (dartSnapshot.exitCode != 0) throw "Failed to run dart --snapshot."; 588 if (dartSnapshot.exitCode != 0) throw "Failed to run dart --snapshot.";
584 589
585 writeTextFile(hashPath, hash); 590 writeTextFile(pubHashPath, pubHash);
591 if (runningFromDartRepo) writeTextFile(dartHashPath, dartHash);
586 writeTextFile(versionPath, version); 592 writeTextFile(versionPath, version);
587 } 593 }
588 594
589 /// Returns a hash that encapsulates the current state of the repo. 595 /// Returns a hash that encapsulates the current state of the repo.
590 String _hashChanges() { 596 String _hashChanges() {
591 var hash = new SHA1(); 597 var hash = new SHA1();
592 598
593 // Include the current Git commit. 599 // Include the current Git commit.
594 hash.add(UTF8.encode( 600 hash.add(UTF8.encode(
595 gitlib.runSync(['rev-parse', 'HEAD'], workingDir: pubRoot).first)); 601 gitlib.runSync(['rev-parse', 'HEAD'], workingDir: pubRoot).first));
(...skipping 10 matching lines...) Expand all
606 var untracked = gitlib.runSync( 612 var untracked = gitlib.runSync(
607 ['ls-files', '--others', '--exclude-standard', 'lib', 'bin'], 613 ['ls-files', '--others', '--exclude-standard', 'lib', 'bin'],
608 workingDir: pubRoot); 614 workingDir: pubRoot);
609 for (var path in untracked) { 615 for (var path in untracked) {
610 hash.add(readBinaryFile(path)); 616 hash.add(readBinaryFile(path));
611 } 617 }
612 618
613 return CryptoUtils.bytesToHex(hash.close()); 619 return CryptoUtils.bytesToHex(hash.close());
614 } 620 }
615 621
622 /// Return a SHA1 hash of the Dart executable used to run this script.
623 ///
624 /// This is used when running within the Dart repo to ensure that the snapshot
625 /// is invalidated when the executable changes.
626 String _hashExecutable() {
627 var hash = new SHA1();
628 hash.add(new File(Platform.executable).readAsBytesSync());
629 return CryptoUtils.bytesToHex(hash.close());
630 }
631
616 /// A subclass of [ScheduledProcess] that parses pub's verbose logging output 632 /// A subclass of [ScheduledProcess] that parses pub's verbose logging output
617 /// and makes [stdout] and [stderr] work as though pub weren't running in 633 /// and makes [stdout] and [stderr] work as though pub weren't running in
618 /// verbose mode. 634 /// verbose mode.
619 class PubProcess extends ScheduledProcess { 635 class PubProcess extends ScheduledProcess {
620 Stream<Pair<log.Level, String>> _log; 636 Stream<Pair<log.Level, String>> _log;
621 Stream<String> _stdout; 637 Stream<String> _stdout;
622 Stream<String> _stderr; 638 Stream<String> _stderr;
623 639
624 PubProcess.start(executable, arguments, 640 PubProcess.start(executable, arguments,
625 {workingDirectory, environment, String description, 641 {workingDirectory, environment, String description,
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 _lastMatcher.matches(item.last, matchState); 1065 _lastMatcher.matches(item.last, matchState);
1050 } 1066 }
1051 1067
1052 Description describe(Description description) { 1068 Description describe(Description description) {
1053 return description.addAll("(", ", ", ")", [_firstMatcher, _lastMatcher]); 1069 return description.addAll("(", ", ", ")", [_firstMatcher, _lastMatcher]);
1054 } 1070 }
1055 } 1071 }
1056 1072
1057 /// A [StreamMatcher] that matches multiple lines of output. 1073 /// A [StreamMatcher] that matches multiple lines of output.
1058 StreamMatcher emitsLines(String output) => inOrder(output.split("\n")); 1074 StreamMatcher emitsLines(String output) => inOrder(output.split("\n"));
OLDNEW
« no previous file with comments | « pubspec.yaml ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698