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

Side by Side Diff: sdk/lib/_internal/pub_generated/test/validator/dependency_test.dart

Issue 557563002: Store the async-await compiled pub code directly in the repo. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 3 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 | Annotate | Revision Log
OLDNEW
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 import 'dart:async'; 1 import 'dart:async';
6 import 'dart:convert'; 2 import 'dart:convert';
7
8 import 'package:http/http.dart' as http; 3 import 'package:http/http.dart' as http;
9 import 'package:http/testing.dart'; 4 import 'package:http/testing.dart';
10 import 'package:path/path.dart' as path; 5 import 'package:path/path.dart' as path;
11 import 'package:scheduled_test/scheduled_test.dart'; 6 import 'package:scheduled_test/scheduled_test.dart';
12
13 import '../../lib/src/entrypoint.dart'; 7 import '../../lib/src/entrypoint.dart';
14 import '../../lib/src/validator.dart'; 8 import '../../lib/src/validator.dart';
15 import '../../lib/src/validator/dependency.dart'; 9 import '../../lib/src/validator/dependency.dart';
16 import '../descriptor.dart' as d; 10 import '../descriptor.dart' as d;
17 import '../test_pub.dart'; 11 import '../test_pub.dart';
18 import 'utils.dart'; 12 import 'utils.dart';
19
20 Validator dependency(Entrypoint entrypoint) => 13 Validator dependency(Entrypoint entrypoint) =>
21 new DependencyValidator(entrypoint); 14 new DependencyValidator(entrypoint);
22
23 expectDependencyValidationError(String error) { 15 expectDependencyValidationError(String error) {
24 expect(schedulePackageValidation(dependency), 16 expect(
17 schedulePackageValidation(dependency),
25 completion(pairOf(anyElement(contains(error)), isEmpty))); 18 completion(pairOf(anyElement(contains(error)), isEmpty)));
26 } 19 }
27
28 expectDependencyValidationWarning(String warning) { 20 expectDependencyValidationWarning(String warning) {
29 expect(schedulePackageValidation(dependency), 21 expect(
22 schedulePackageValidation(dependency),
30 completion(pairOf(isEmpty, anyElement(contains(warning))))); 23 completion(pairOf(isEmpty, anyElement(contains(warning)))));
31 } 24 }
32
33 /// Sets up a test package with dependency [dep] and mocks a server with
34 /// [hostedVersions] of the package available.
35 setUpDependency(Map dep, {List<String> hostedVersions}) { 25 setUpDependency(Map dep, {List<String> hostedVersions}) {
36 useMockClient(new MockClient((request) { 26 useMockClient(new MockClient((request) {
37 expect(request.method, equals("GET")); 27 expect(request.method, equals("GET"));
38 expect(request.url.path, equals("/api/packages/foo")); 28 expect(request.url.path, equals("/api/packages/foo"));
39
40 if (hostedVersions == null) { 29 if (hostedVersions == null) {
41 return new Future.value(new http.Response("not found", 404)); 30 return new Future.value(new http.Response("not found", 404));
42 } else { 31 } else {
43 return new Future.value(new http.Response(JSON.encode({ 32 return new Future.value(new http.Response(JSON.encode({
44 "name": "foo", 33 "name": "foo",
45 "uploaders": ["nweiz@google.com"], 34 "uploaders": ["nweiz@google.com"],
46 "versions": hostedVersions.map((version) => 35 "versions": hostedVersions.map(
47 packageVersionApiMap(packageMap('foo', version))).toList() 36 (version) => packageVersionApiMap(packageMap('foo', version))).toLis t()
48 }), 200)); 37 }), 200));
49 } 38 }
50 })); 39 }));
51 40 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
52 d.dir(appPath, [ 41 "foo": dep
53 d.libPubspec("test_pkg", "1.0.0", deps: {"foo": dep}) 42 })]).create();
54 ]).create();
55 } 43 }
56
57 main() { 44 main() {
58 initConfig(); 45 initConfig();
59
60 integration('should consider a package valid if it looks normal', () { 46 integration('should consider a package valid if it looks normal', () {
61 d.validPackage.create(); 47 d.validPackage.create();
62 expectNoValidationError(dependency); 48 expectNoValidationError(dependency);
63 }); 49 });
64
65 group('should consider a package invalid if it', () { 50 group('should consider a package invalid if it', () {
66 setUp(d.validPackage.create); 51 setUp(d.validPackage.create);
67
68 group('has a git dependency', () { 52 group('has a git dependency', () {
69 group('where a hosted version exists', () { 53 group('where a hosted version exists', () {
70 integration("and should suggest the hosted primary version", () { 54 integration("and should suggest the hosted primary version", () {
71 setUpDependency({'git': 'git://github.com/dart-lang/foo'}, 55 setUpDependency({
72 hostedVersions: ["3.0.0-pre", "2.0.0", "1.0.0"]); 56 'git': 'git://github.com/dart-lang/foo'
57 }, hostedVersions: ["3.0.0-pre", "2.0.0", "1.0.0"]);
73 expectDependencyValidationWarning(' foo: ">=2.0.0 <3.0.0"'); 58 expectDependencyValidationWarning(' foo: ">=2.0.0 <3.0.0"');
74 }); 59 });
75 60 integration(
76 integration("and should suggest the hosted prerelease version if " 61 "and should suggest the hosted prerelease version if "
77 "it's the only version available", () { 62 "it's the only version available",
78 setUpDependency({'git': 'git://github.com/dart-lang/foo'}, 63 () {
79 hostedVersions: ["3.0.0-pre", "2.0.0-pre"]); 64 setUpDependency({
65 'git': 'git://github.com/dart-lang/foo'
66 }, hostedVersions: ["3.0.0-pre", "2.0.0-pre"]);
80 expectDependencyValidationWarning(' foo: ">=3.0.0-pre <4.0.0"'); 67 expectDependencyValidationWarning(' foo: ">=3.0.0-pre <4.0.0"');
81 }); 68 });
82 69 integration(
83 integration("and should suggest a tighter constraint if primary is " 70 "and should suggest a tighter constraint if primary is " "pre-1.0.0" ,
84 "pre-1.0.0", () { 71 () {
85 setUpDependency({'git': 'git://github.com/dart-lang/foo'}, 72 setUpDependency({
86 hostedVersions: ["0.0.1", "0.0.2"]); 73 'git': 'git://github.com/dart-lang/foo'
74 }, hostedVersions: ["0.0.1", "0.0.2"]);
87 expectDependencyValidationWarning(' foo: ">=0.0.2 <0.1.0"'); 75 expectDependencyValidationWarning(' foo: ">=0.0.2 <0.1.0"');
88 }); 76 });
89 }); 77 });
90
91 group('where no hosted version exists', () { 78 group('where no hosted version exists', () {
92 integration("and should use the other source's version", () { 79 integration("and should use the other source's version", () {
93 setUpDependency({ 80 setUpDependency({
94 'git': 'git://github.com/dart-lang/foo', 81 'git': 'git://github.com/dart-lang/foo',
95 'version': '>=1.0.0 <2.0.0' 82 'version': '>=1.0.0 <2.0.0'
96 }); 83 });
97 expectDependencyValidationWarning(' foo: ">=1.0.0 <2.0.0"'); 84 expectDependencyValidationWarning(' foo: ">=1.0.0 <2.0.0"');
98 }); 85 });
99 86 integration(
100 integration("and should use the other source's unquoted version if " 87 "and should use the other source's unquoted version if " "concrete",
101 "concrete", () { 88 () {
102 setUpDependency({ 89 setUpDependency({
103 'git': 'git://github.com/dart-lang/foo', 90 'git': 'git://github.com/dart-lang/foo',
104 'version': '0.2.3' 91 'version': '0.2.3'
105 }); 92 });
106 expectDependencyValidationWarning(' foo: 0.2.3'); 93 expectDependencyValidationWarning(' foo: 0.2.3');
107 }); 94 });
108 }); 95 });
109 }); 96 });
110
111 group('has a path dependency', () { 97 group('has a path dependency', () {
112 group('where a hosted version exists', () { 98 group('where a hosted version exists', () {
113 integration("and should suggest the hosted primary version", () { 99 integration("and should suggest the hosted primary version", () {
114 setUpDependency({'path': path.join(sandboxDir, 'foo')}, 100 setUpDependency({
115 hostedVersions: ["3.0.0-pre", "2.0.0", "1.0.0"]); 101 'path': path.join(sandboxDir, 'foo')
102 }, hostedVersions: ["3.0.0-pre", "2.0.0", "1.0.0"]);
116 expectDependencyValidationError(' foo: ">=2.0.0 <3.0.0"'); 103 expectDependencyValidationError(' foo: ">=2.0.0 <3.0.0"');
117 }); 104 });
118 105 integration(
119 integration("and should suggest the hosted prerelease version if " 106 "and should suggest the hosted prerelease version if "
120 "it's the only version available", () { 107 "it's the only version available",
121 setUpDependency({'path': path.join(sandboxDir, 'foo')}, 108 () {
122 hostedVersions: ["3.0.0-pre", "2.0.0-pre"]); 109 setUpDependency({
110 'path': path.join(sandboxDir, 'foo')
111 }, hostedVersions: ["3.0.0-pre", "2.0.0-pre"]);
123 expectDependencyValidationError(' foo: ">=3.0.0-pre <4.0.0"'); 112 expectDependencyValidationError(' foo: ">=3.0.0-pre <4.0.0"');
124 }); 113 });
125 114 integration(
126 integration("and should suggest a tighter constraint if primary is " 115 "and should suggest a tighter constraint if primary is " "pre-1.0.0" ,
127 "pre-1.0.0", () { 116 () {
128 setUpDependency({'path': path.join(sandboxDir, 'foo')}, 117 setUpDependency({
129 hostedVersions: ["0.0.1", "0.0.2"]); 118 'path': path.join(sandboxDir, 'foo')
119 }, hostedVersions: ["0.0.1", "0.0.2"]);
130 expectDependencyValidationError(' foo: ">=0.0.2 <0.1.0"'); 120 expectDependencyValidationError(' foo: ">=0.0.2 <0.1.0"');
131 }); 121 });
132 }); 122 });
133
134 group('where no hosted version exists', () { 123 group('where no hosted version exists', () {
135 integration("and should use the other source's version", () { 124 integration("and should use the other source's version", () {
136 setUpDependency({ 125 setUpDependency({
137 'path': path.join(sandboxDir, 'foo'), 126 'path': path.join(sandboxDir, 'foo'),
138 'version': '>=1.0.0 <2.0.0' 127 'version': '>=1.0.0 <2.0.0'
139 }); 128 });
140 expectDependencyValidationError(' foo: ">=1.0.0 <2.0.0"'); 129 expectDependencyValidationError(' foo: ">=1.0.0 <2.0.0"');
141 }); 130 });
142 131 integration(
143 integration("and should use the other source's unquoted version if " 132 "and should use the other source's unquoted version if " "concrete",
144 "concrete", () { 133 () {
145 setUpDependency({ 134 setUpDependency({
146 'path': path.join(sandboxDir, 'foo'), 135 'path': path.join(sandboxDir, 'foo'),
147 'version': '0.2.3' 136 'version': '0.2.3'
148 }); 137 });
149 expectDependencyValidationError(' foo: 0.2.3'); 138 expectDependencyValidationError(' foo: 0.2.3');
150 }); 139 });
151 }); 140 });
152 }); 141 });
153
154 group('has an unconstrained dependency', () { 142 group('has an unconstrained dependency', () {
155 group('and it should not suggest a version', () { 143 group('and it should not suggest a version', () {
156 integration("if there's no lockfile", () { 144 integration("if there's no lockfile", () {
157 d.dir(appPath, [ 145 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
158 d.libPubspec("test_pkg", "1.0.0", deps: {
159 "foo": "any" 146 "foo": "any"
160 }) 147 })]).create();
161 ]).create(); 148 expect(
162 149 schedulePackageValidation(dependency),
163 expect(schedulePackageValidation(dependency), completion( 150 completion(pairOf(isEmpty, everyElement(isNot(contains("\n foo:") )))));
164 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))));
165 }); 151 });
166 152 integration(
167 integration("if the lockfile doesn't have an entry for the " 153 "if the lockfile doesn't have an entry for the " "dependency",
168 "dependency", () { 154 () {
169 d.dir(appPath, [ 155 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
170 d.libPubspec("test_pkg", "1.0.0", deps: {
171 "foo": "any" 156 "foo": "any"
172 }), 157 }), d.file("pubspec.lock", JSON.encode({
173 d.file("pubspec.lock", JSON.encode({
174 'packages': { 158 'packages': {
175 'bar': { 159 'bar': {
176 'version': '1.2.3', 160 'version': '1.2.3',
177 'source': 'hosted', 161 'source': 'hosted',
178 'description': { 162 'description': {
179 'name': 'bar', 163 'name': 'bar',
180 'url': 'http://pub.dartlang.org' 164 'url': 'http://pub.dartlang.org'
181 } 165 }
182 } 166 }
183 } 167 }
184 })) 168 }))]).create();
185 ]).create(); 169 expect(
186 170 schedulePackageValidation(dependency),
187 expect(schedulePackageValidation(dependency), completion( 171 completion(pairOf(isEmpty, everyElement(isNot(contains("\n foo:") )))));
188 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))));
189 }); 172 });
190 }); 173 });
191
192 group('with a lockfile', () { 174 group('with a lockfile', () {
193 integration('and it should suggest a constraint based on the locked ' 175 integration(
194 'version', () { 176 'and it should suggest a constraint based on the locked ' 'version',
195 d.dir(appPath, [ 177 () {
196 d.libPubspec("test_pkg", "1.0.0", deps: { 178 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
197 "foo": "any" 179 "foo": "any"
198 }), 180 }), d.file("pubspec.lock", JSON.encode({
199 d.file("pubspec.lock", JSON.encode({
200 'packages': { 181 'packages': {
201 'foo': { 182 'foo': {
202 'version': '1.2.3', 183 'version': '1.2.3',
203 'source': 'hosted', 184 'source': 'hosted',
204 'description': { 185 'description': {
205 'name': 'foo', 186 'name': 'foo',
206 'url': 'http://pub.dartlang.org' 187 'url': 'http://pub.dartlang.org'
207 } 188 }
208 } 189 }
209 } 190 }
210 })) 191 }))]).create();
211 ]).create();
212
213 expectDependencyValidationWarning(' foo: ">=1.2.3 <2.0.0"'); 192 expectDependencyValidationWarning(' foo: ">=1.2.3 <2.0.0"');
214 }); 193 });
215 194 integration(
216 integration('and it should suggest a concrete constraint if the locked ' 195 'and it should suggest a concrete constraint if the locked '
217 'version is pre-1.0.0', () { 196 'version is pre-1.0.0',
218 d.dir(appPath, [ 197 () {
219 d.libPubspec("test_pkg", "1.0.0", deps: { 198 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
220 "foo": "any" 199 "foo": "any"
221 }), 200 }), d.file("pubspec.lock", JSON.encode({
222 d.file("pubspec.lock", JSON.encode({
223 'packages': { 201 'packages': {
224 'foo': { 202 'foo': {
225 'version': '0.1.2', 203 'version': '0.1.2',
226 'source': 'hosted', 204 'source': 'hosted',
227 'description': { 205 'description': {
228 'name': 'foo', 206 'name': 'foo',
229 'url': 'http://pub.dartlang.org' 207 'url': 'http://pub.dartlang.org'
230 } 208 }
231 } 209 }
232 } 210 }
233 })) 211 }))]).create();
234 ]).create();
235
236 expectDependencyValidationWarning(' foo: ">=0.1.2 <0.2.0"'); 212 expectDependencyValidationWarning(' foo: ">=0.1.2 <0.2.0"');
237 }); 213 });
238 }); 214 });
239 }); 215 });
240 216 integration(
241 integration('with a single-version dependency and it should suggest a ' 217 'with a single-version dependency and it should suggest a '
242 'constraint based on the version', () { 218 'constraint based on the version',
243 d.dir(appPath, [ 219 () {
244 d.libPubspec("test_pkg", "1.0.0", deps: { 220 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
245 "foo": "1.2.3" 221 "foo": "1.2.3"
246 }) 222 })]).create();
247 ]).create();
248
249 expectDependencyValidationWarning(' foo: ">=1.2.3 <2.0.0"'); 223 expectDependencyValidationWarning(' foo: ">=1.2.3 <2.0.0"');
250 }); 224 });
251
252 group('has a dependency without a lower bound', () { 225 group('has a dependency without a lower bound', () {
253 group('and it should not suggest a version', () { 226 group('and it should not suggest a version', () {
254 integration("if there's no lockfile", () { 227 integration("if there's no lockfile", () {
255 d.dir(appPath, [ 228 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
256 d.libPubspec("test_pkg", "1.0.0", deps: {
257 "foo": "<3.0.0" 229 "foo": "<3.0.0"
258 }) 230 })]).create();
259 ]).create(); 231 expect(
260 232 schedulePackageValidation(dependency),
261 expect(schedulePackageValidation(dependency), completion( 233 completion(pairOf(isEmpty, everyElement(isNot(contains("\n foo:") )))));
262 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))));
263 }); 234 });
264 235 integration(
265 integration("if the lockfile doesn't have an entry for the " 236 "if the lockfile doesn't have an entry for the " "dependency",
266 "dependency", () { 237 () {
267 d.dir(appPath, [ 238 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
268 d.libPubspec("test_pkg", "1.0.0", deps: {
269 "foo": "<3.0.0" 239 "foo": "<3.0.0"
270 }), 240 }), d.file("pubspec.lock", JSON.encode({
271 d.file("pubspec.lock", JSON.encode({
272 'packages': { 241 'packages': {
273 'bar': { 242 'bar': {
274 'version': '1.2.3', 243 'version': '1.2.3',
275 'source': 'hosted', 244 'source': 'hosted',
276 'description': { 245 'description': {
277 'name': 'bar', 246 'name': 'bar',
278 'url': 'http://pub.dartlang.org' 247 'url': 'http://pub.dartlang.org'
279 } 248 }
280 } 249 }
281 } 250 }
282 })) 251 }))]).create();
283 ]).create(); 252 expect(
284 253 schedulePackageValidation(dependency),
285 expect(schedulePackageValidation(dependency), completion( 254 completion(pairOf(isEmpty, everyElement(isNot(contains("\n foo:") )))));
286 pairOf(isEmpty, everyElement(isNot(contains("\n foo:"))))));
287 }); 255 });
288 }); 256 });
289
290 group('with a lockfile', () { 257 group('with a lockfile', () {
291 integration('and it should suggest a constraint based on the locked ' 258 integration(
292 'version', () { 259 'and it should suggest a constraint based on the locked ' 'version',
293 d.dir(appPath, [ 260 () {
294 d.libPubspec("test_pkg", "1.0.0", deps: { 261 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
295 "foo": "<3.0.0" 262 "foo": "<3.0.0"
296 }), 263 }), d.file("pubspec.lock", JSON.encode({
297 d.file("pubspec.lock", JSON.encode({
298 'packages': { 264 'packages': {
299 'foo': { 265 'foo': {
300 'version': '1.2.3', 266 'version': '1.2.3',
301 'source': 'hosted', 267 'source': 'hosted',
302 'description': { 268 'description': {
303 'name': 'foo', 269 'name': 'foo',
304 'url': 'http://pub.dartlang.org' 270 'url': 'http://pub.dartlang.org'
305 } 271 }
306 } 272 }
307 } 273 }
308 })) 274 }))]).create();
309 ]).create();
310
311 expectDependencyValidationWarning(' foo: ">=1.2.3 <3.0.0"'); 275 expectDependencyValidationWarning(' foo: ">=1.2.3 <3.0.0"');
312 }); 276 });
313
314 integration('and it should preserve the upper-bound operator', () { 277 integration('and it should preserve the upper-bound operator', () {
315 d.dir(appPath, [ 278 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
316 d.libPubspec("test_pkg", "1.0.0", deps: {
317 "foo": "<=3.0.0" 279 "foo": "<=3.0.0"
318 }), 280 }), d.file("pubspec.lock", JSON.encode({
319 d.file("pubspec.lock", JSON.encode({
320 'packages': { 281 'packages': {
321 'foo': { 282 'foo': {
322 'version': '1.2.3', 283 'version': '1.2.3',
323 'source': 'hosted', 284 'source': 'hosted',
324 'description': { 285 'description': {
325 'name': 'foo', 286 'name': 'foo',
326 'url': 'http://pub.dartlang.org' 287 'url': 'http://pub.dartlang.org'
327 } 288 }
328 } 289 }
329 } 290 }
330 })) 291 }))]).create();
331 ]).create();
332
333 expectDependencyValidationWarning(' foo: ">=1.2.3 <=3.0.0"'); 292 expectDependencyValidationWarning(' foo: ">=1.2.3 <=3.0.0"');
334 }); 293 });
335 294 integration(
336 integration('and it should expand the suggested constraint if the ' 295 'and it should expand the suggested constraint if the '
337 'locked version matches the upper bound', () { 296 'locked version matches the upper bound',
338 d.dir(appPath, [ 297 () {
339 d.libPubspec("test_pkg", "1.0.0", deps: { 298 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
340 "foo": "<=1.2.3" 299 "foo": "<=1.2.3"
341 }), 300 }), d.file("pubspec.lock", JSON.encode({
342 d.file("pubspec.lock", JSON.encode({
343 'packages': { 301 'packages': {
344 'foo': { 302 'foo': {
345 'version': '1.2.3', 303 'version': '1.2.3',
346 'source': 'hosted', 304 'source': 'hosted',
347 'description': { 305 'description': {
348 'name': 'foo', 306 'name': 'foo',
349 'url': 'http://pub.dartlang.org' 307 'url': 'http://pub.dartlang.org'
350 } 308 }
351 } 309 }
352 } 310 }
353 })) 311 }))]).create();
354 ]).create();
355
356 expectDependencyValidationWarning(' foo: ">=1.2.3 <2.0.0"'); 312 expectDependencyValidationWarning(' foo: ">=1.2.3 <2.0.0"');
357 }); 313 });
358 }); 314 });
359 }); 315 });
360
361 group('with a dependency without an upper bound', () { 316 group('with a dependency without an upper bound', () {
362 integration('and it should suggest a constraint based on the lower bound', 317 integration(
318 'and it should suggest a constraint based on the lower bound',
363 () { 319 () {
364 d.dir(appPath, [ 320 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
365 d.libPubspec("test_pkg", "1.0.0", deps: {
366 "foo": ">=1.2.3" 321 "foo": ">=1.2.3"
367 }) 322 })]).create();
368 ]).create();
369
370 expectDependencyValidationWarning(' foo: ">=1.2.3 <2.0.0"'); 323 expectDependencyValidationWarning(' foo: ">=1.2.3 <2.0.0"');
371 }); 324 });
372
373 integration('and it should preserve the lower-bound operator', () { 325 integration('and it should preserve the lower-bound operator', () {
374 d.dir(appPath, [ 326 d.dir(appPath, [d.libPubspec("test_pkg", "1.0.0", deps: {
375 d.libPubspec("test_pkg", "1.0.0", deps: {
376 "foo": ">1.2.3" 327 "foo": ">1.2.3"
377 }) 328 })]).create();
378 ]).create();
379
380 expectDependencyValidationWarning(' foo: ">1.2.3 <2.0.0"'); 329 expectDependencyValidationWarning(' foo: ">1.2.3 <2.0.0"');
381 }); 330 });
382 }); 331 });
383 }); 332 });
384 } 333 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698