| Index: sdk/lib/_internal/pub/test/version_solver_test.dart
|
| diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
|
| index 35af3ac94b923c677cfbd32023dad888d1cc1a58..47d71988750061b628ebe4ed55ae6a1c29506f5b 100644
|
| --- a/sdk/lib/_internal/pub/test/version_solver_test.dart
|
| +++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
|
| @@ -40,6 +40,7 @@ main() {
|
| group('root dependency', rootDependency);
|
| group('dev dependency', devDependency);
|
| group('unsolvable', unsolvable);
|
| + group('bad source', badSource);
|
| group('backtracking', backtracking);
|
| group('SDK constraint', sdkConstraint);
|
| }
|
| @@ -404,6 +405,55 @@ unsolvable() {
|
| }, error: couldNotSolve, maxTries: 4);
|
| }
|
|
|
| +badSource() {
|
| + testResolve('fail if the root package has a bad source in dep', {
|
| + 'myapp 0.0.0': {
|
| + 'foo from bad': 'any'
|
| + },
|
| + }, error: unknownSource('myapp', 'foo', 'bad'));
|
| +
|
| + testResolve('fail if the root package has a bad source in dev dep', {
|
| + 'myapp 0.0.0': {
|
| + '(dev) foo from bad': 'any'
|
| + },
|
| + }, error: unknownSource('myapp', 'foo', 'bad'));
|
| +
|
| + testResolve('fail if all versions have bad source in dep', {
|
| + 'myapp 0.0.0': {
|
| + 'foo': 'any'
|
| + },
|
| + 'foo 1.0.0': {
|
| + 'bar from bad': 'any'
|
| + },
|
| + 'foo 1.0.1': {
|
| + 'baz from bad': 'any'
|
| + },
|
| + 'foo 1.0.3': {
|
| + 'bang from bad': 'any'
|
| + },
|
| + }, error: unknownSource('foo', 'bar', 'bad'), maxTries: 3);
|
| +
|
| + testResolve('ignore versions with bad source in dep', {
|
| + 'myapp 1.0.0': {
|
| + 'foo': 'any'
|
| + },
|
| + 'foo 1.0.0': {
|
| + 'bar': 'any'
|
| + },
|
| + 'foo 1.0.1': {
|
| + 'bar from bad': 'any'
|
| + },
|
| + 'foo 1.0.3': {
|
| + 'bar from bad': 'any'
|
| + },
|
| + 'bar 1.0.0': {}
|
| + }, result: {
|
| + 'myapp from root': '1.0.0',
|
| + 'foo': '1.0.0',
|
| + 'bar': '1.0.0'
|
| + }, maxTries: 3);
|
| +}
|
| +
|
| backtracking() {
|
| testResolve('circular dependency on older version', {
|
| 'myapp 0.0.0': {
|
| @@ -775,7 +825,7 @@ _testResolve(void testFn(String description, Function body),
|
| // remote server.
|
| root = package;
|
| } else {
|
| - source.addPackage(name, package);
|
| + cache.sources[source].addPackage(name, package);
|
| }
|
| });
|
| });
|
| @@ -797,7 +847,7 @@ _testResolve(void testFn(String description, Function body),
|
| lockfile.forEach((name, version) {
|
| version = new Version.parse(version);
|
| realLockFile.packages[name] =
|
| - new PackageId(name, source1, version, name);
|
| + new PackageId(name, source1.name, version, name);
|
| });
|
| }
|
|
|
| @@ -856,6 +906,11 @@ FailMatcherBuilder sourceMismatch(String package1, String package2) {
|
| SourceMismatchException);
|
| }
|
|
|
| +unknownSource(String depender, String dependency, String source) {
|
| + return (maxTries) => new SolveFailMatcher([depender, dependency, source],
|
| + maxTries, UnknownSourceException);
|
| +}
|
| +
|
| class SolveSuccessMatcher implements Matcher {
|
| /// The expected concrete package selections.
|
| final Map<String, PackageId> _expected;
|
| @@ -877,7 +932,7 @@ class SolveSuccessMatcher implements Matcher {
|
| MatchState state, bool verbose) {
|
| if (!result.succeeded) {
|
| description.add('Solver failed with:\n${result.error}');
|
| - return;
|
| + return null;
|
| }
|
|
|
| description.add('Resolved:\n${_listPackages(result.packages)}\n');
|
| @@ -1033,6 +1088,7 @@ class MockSource extends Source {
|
| throw new Exception('MockSource does not have a package matching '
|
| '"$description".');
|
| }
|
| +
|
| return _packages[description].keys.toList();
|
| });
|
| }
|
| @@ -1098,7 +1154,7 @@ Package mockPackage(String description, String version,
|
| }
|
|
|
| void parseSource(String description,
|
| - callback(bool isDev, String name, Source source)) {
|
| + callback(bool isDev, String name, String source)) {
|
| var isDev = false;
|
|
|
| if (description.startsWith("(dev) ")) {
|
| @@ -1107,18 +1163,12 @@ void parseSource(String description,
|
| }
|
|
|
| var name = description;
|
| - var source = source1;
|
| -
|
| - var sourceNames = {
|
| - 'mock1': source1,
|
| - 'mock2': source2,
|
| - 'root': null
|
| - };
|
| -
|
| + var source = "mock1";
|
| var match = new RegExp(r"(.*) from (.*)").firstMatch(description);
|
| if (match != null) {
|
| name = match[1];
|
| - source = sourceNames[match[2]];
|
| + source = match[2];
|
| + if (source == "root") source = null;
|
| }
|
|
|
| callback(isDev, name, source);
|
|
|