OLD | NEW |
| (Empty) |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS d.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 library pub_tests; | |
6 | |
7 import 'package:scheduled_test/scheduled_stream.dart'; | |
8 import 'package:scheduled_test/scheduled_test.dart'; | |
9 | |
10 import '../descriptor.dart' as d; | |
11 import '../test_pub.dart'; | |
12 import '../serve/utils.dart'; | |
13 | |
14 const REPLACE_FROM_LIBRARY_TRANSFORMER = """ | |
15 import 'dart:async'; | |
16 | |
17 import 'package:barback/barback.dart'; | |
18 import 'package:bar/bar.dart'; | |
19 | |
20 class ReplaceTransformer extends Transformer { | |
21 ReplaceTransformer.asPlugin(); | |
22 | |
23 String get allowedExtensions => '.dart'; | |
24 | |
25 Future apply(Transform transform) { | |
26 return transform.primaryInput.readAsString().then((contents) { | |
27 transform.addOutput(new Asset.fromString( | |
28 transform.primaryInput.id, | |
29 contents.replaceAll("Hello", replacement))); | |
30 }); | |
31 } | |
32 } | |
33 """; | |
34 | |
35 // TODO(nweiz): Currently scheduled_test.setUp doesn't play well with test_pub, | |
36 // since it only assigns the sandbox directory once the main test body has | |
37 // run. Fix this and move this to a real setUp call. | |
38 void setUp() { | |
39 servePackages((builder) { | |
40 builder.serveRepoPackage('barback'); | |
41 | |
42 builder.serve("foo", "1.2.3", | |
43 deps: {'barback': 'any'}, | |
44 contents: [ | |
45 d.dir("lib", [ | |
46 d.file("transformer.dart", replaceTransformer("Hello", "Goodbye")) | |
47 ]) | |
48 ]); | |
49 | |
50 builder.serve("bar", "1.2.3", | |
51 deps: {'barback': 'any'}, | |
52 contents: [ | |
53 d.dir("lib", [ | |
54 d.file("transformer.dart", replaceTransformer("Goodbye", "See ya")) | |
55 ]) | |
56 ]); | |
57 | |
58 builder.serve("baz", "1.2.3"); | |
59 }); | |
60 | |
61 d.dir(appPath, [ | |
62 d.pubspec({ | |
63 "name": "myapp", | |
64 "dependencies": { | |
65 "foo": "1.2.3", | |
66 "bar": "1.2.3" | |
67 }, | |
68 "transformers": ["foo"] | |
69 }), | |
70 d.dir("bin", [ | |
71 d.file("myapp.dart", "main() => print('Hello!');") | |
72 ]) | |
73 ]).create(); | |
74 | |
75 pubGet(); | |
76 } | |
77 | |
78 main() { | |
79 initConfig(); | |
80 | |
81 integration("caches a transformer snapshot", () { | |
82 setUp(); | |
83 | |
84 var process = pubRun(args: ['myapp']); | |
85 process.stdout.expect("Goodbye!"); | |
86 process.shouldExit(); | |
87 | |
88 d.dir(appPath, [ | |
89 d.dir(".pub/transformers", [ | |
90 d.file("manifest.txt", "0.1.2+3\nfoo"), | |
91 d.matcherFile("transformers.snapshot", isNot(isEmpty)) | |
92 ]) | |
93 ]).validate(); | |
94 | |
95 // Run the executable again to make sure loading the transformer from the | |
96 // cache works. | |
97 process = pubRun(args: ['myapp']); | |
98 process.stdout.expect("Goodbye!"); | |
99 process.shouldExit(); | |
100 }); | |
101 | |
102 integration("recaches if the SDK version is out-of-date", () { | |
103 setUp(); | |
104 | |
105 d.dir(appPath, [ | |
106 d.dir(".pub/transformers", [ | |
107 // The version 0.0.1 is different than the test version 0.1.2+3. | |
108 d.file("manifest.txt", "0.0.1\nfoo"), | |
109 d.file("transformers.snapshot", "junk") | |
110 ]) | |
111 ]).create(); | |
112 | |
113 var process = pubRun(args: ['myapp']); | |
114 process.stdout.expect("Goodbye!"); | |
115 process.shouldExit(); | |
116 | |
117 d.dir(appPath, [ | |
118 d.dir(".pub/transformers", [ | |
119 d.file("manifest.txt", "0.1.2+3\nfoo"), | |
120 d.matcherFile("transformers.snapshot", isNot(isEmpty)) | |
121 ]) | |
122 ]).validate(); | |
123 }); | |
124 | |
125 integration("recaches if the transformers change", () { | |
126 setUp(); | |
127 | |
128 var process = pubRun(args: ['myapp']); | |
129 process.stdout.expect("Goodbye!"); | |
130 process.shouldExit(); | |
131 | |
132 d.dir(appPath, [ | |
133 d.dir(".pub/transformers", [ | |
134 d.file("manifest.txt", "0.1.2+3\nfoo"), | |
135 d.matcherFile("transformers.snapshot", isNot(isEmpty)) | |
136 ]) | |
137 ]).validate(); | |
138 | |
139 d.dir(appPath, [ | |
140 d.pubspec({ | |
141 "name": "myapp", | |
142 "dependencies": { | |
143 "foo": "1.2.3", | |
144 "bar": "1.2.3" | |
145 }, | |
146 "transformers": ["foo", "bar"] | |
147 }), | |
148 d.dir("bin", [ | |
149 d.file("myapp.dart", "main() => print('Hello!');") | |
150 ]) | |
151 ]).create(); | |
152 | |
153 process = pubRun(args: ['myapp']); | |
154 process.stdout.expect("See ya!"); | |
155 process.shouldExit(); | |
156 | |
157 d.dir(appPath, [ | |
158 d.dir(".pub/transformers", [ | |
159 d.file("manifest.txt", "0.1.2+3\nbar,foo"), | |
160 d.matcherFile("transformers.snapshot", isNot(isEmpty)) | |
161 ]) | |
162 ]).validate(); | |
163 }); | |
164 | |
165 integration("recaches if the transformer version changes", () { | |
166 setUp(); | |
167 | |
168 var process = pubRun(args: ['myapp']); | |
169 process.stdout.expect("Goodbye!"); | |
170 process.shouldExit(); | |
171 | |
172 d.dir(appPath, [ | |
173 d.dir(".pub/transformers", [ | |
174 d.file("manifest.txt", "0.1.2+3\nfoo"), | |
175 d.matcherFile("transformers.snapshot", isNot(isEmpty)) | |
176 ]) | |
177 ]).validate(); | |
178 | |
179 servePackages((builder) { | |
180 builder.serve("foo", "2.0.0", | |
181 deps: {'barback': 'any'}, | |
182 contents: [ | |
183 d.dir("lib", [ | |
184 d.file("transformer.dart", replaceTransformer("Hello", "New")) | |
185 ]) | |
186 ]); | |
187 }); | |
188 | |
189 d.dir(appPath, [ | |
190 d.pubspec({ | |
191 "name": "myapp", | |
192 "dependencies": {"foo": "any"}, | |
193 "transformers": ["foo"] | |
194 }) | |
195 ]).create(); | |
196 | |
197 pubUpgrade(); | |
198 | |
199 process = pubRun(args: ['myapp']); | |
200 process.stdout.expect("New!"); | |
201 process.shouldExit(); | |
202 | |
203 d.dir(appPath, [ | |
204 d.dir(".pub/transformers", [ | |
205 d.file("manifest.txt", "0.1.2+3\nfoo"), | |
206 d.matcherFile("transformers.snapshot", isNot(isEmpty)) | |
207 ]) | |
208 ]).validate(); | |
209 }); | |
210 | |
211 integration("recaches if a transitive dependency version changes", () { | |
212 servePackages((builder) { | |
213 builder.serveRepoPackage('barback'); | |
214 | |
215 builder.serve("foo", "1.2.3", | |
216 deps: { | |
217 'barback': 'any', | |
218 'bar': 'any' | |
219 }, | |
220 contents: [ | |
221 d.dir("lib", [ | |
222 d.file("transformer.dart", REPLACE_FROM_LIBRARY_TRANSFORMER) | |
223 ]) | |
224 ]); | |
225 | |
226 builder.serve("bar", "1.2.3", contents: [ | |
227 d.dir("lib", [ | |
228 d.file("bar.dart", "final replacement = 'Goodbye';") | |
229 ]) | |
230 ]); | |
231 }); | |
232 | |
233 d.dir(appPath, [ | |
234 d.pubspec({ | |
235 "name": "myapp", | |
236 "dependencies": {"foo": "1.2.3"}, | |
237 "transformers": ["foo"] | |
238 }), | |
239 d.dir("bin", [ | |
240 d.file("myapp.dart", "main() => print('Hello!');") | |
241 ]) | |
242 ]).create(); | |
243 | |
244 pubGet(); | |
245 | |
246 var process = pubRun(args: ['myapp']); | |
247 process.stdout.expect("Goodbye!"); | |
248 process.shouldExit(); | |
249 | |
250 servePackages((builder) { | |
251 builder.serve("bar", "2.0.0", contents: [ | |
252 d.dir("lib", [ | |
253 d.file("bar.dart", "final replacement = 'See ya';") | |
254 ]) | |
255 ]); | |
256 }); | |
257 | |
258 d.dir(appPath, [ | |
259 d.pubspec({ | |
260 "name": "myapp", | |
261 "dependencies": {"foo": "any"}, | |
262 "transformers": ["foo"] | |
263 }) | |
264 ]).create(); | |
265 | |
266 pubUpgrade(); | |
267 | |
268 process = pubRun(args: ['myapp']); | |
269 process.stdout.expect("See ya!"); | |
270 process.shouldExit(); | |
271 }); | |
272 | |
273 // Issue 21298. | |
274 integration("doesn't recache when a transformer is removed", () { | |
275 setUp(); | |
276 | |
277 d.dir(appPath, [ | |
278 d.pubspec({ | |
279 "name": "myapp", | |
280 "dependencies": { | |
281 "foo": "1.2.3", | |
282 "bar": "1.2.3" | |
283 }, | |
284 "transformers": ["foo", "bar"] | |
285 }), | |
286 d.dir("bin", [ | |
287 d.file("myapp.dart", "main() => print('Hello!');") | |
288 ]) | |
289 ]).create(); | |
290 | |
291 var process = pubRun(args: ['myapp']); | |
292 process.stdout.expect("See ya!"); | |
293 process.shouldExit(); | |
294 | |
295 d.dir(appPath, [ | |
296 d.pubspec({ | |
297 "name": "myapp", | |
298 "dependencies": { | |
299 "foo": "1.2.3", | |
300 // Add a new dependency to trigger another "pub get". This works | |
301 // around issue 20498. | |
302 "baz": "1.2.3" | |
303 }, | |
304 "transformers": ["foo"] | |
305 }), | |
306 d.dir("bin", [ | |
307 d.file("myapp.dart", "main() => print('Hello!');") | |
308 ]) | |
309 ]).create(); | |
310 | |
311 process = pubRun(args: ['myapp']); | |
312 process.stdout.expect( | |
313 "Your pubspec has changed, so we need to update your lockfile:"); | |
314 process.stdout.expect(consumeThrough("Goodbye!")); | |
315 process.shouldExit(); | |
316 | |
317 // "bar" should still be in the manifest, since there's no reason to | |
318 // recompile the cache. | |
319 d.dir(appPath, [ | |
320 d.dir(".pub/transformers", [ | |
321 d.file("manifest.txt", "0.1.2+3\nbar,foo"), | |
322 d.matcherFile("transformers.snapshot", isNot(isEmpty)) | |
323 ]) | |
324 ]).validate(); | |
325 }); | |
326 } | |
327 | |
328 String replaceTransformer(String input, String output) { | |
329 return """ | |
330 import 'dart:async'; | |
331 | |
332 import 'package:barback/barback.dart'; | |
333 | |
334 class ReplaceTransformer extends Transformer { | |
335 ReplaceTransformer.asPlugin(); | |
336 | |
337 String get allowedExtensions => '.dart'; | |
338 | |
339 Future apply(Transform transform) { | |
340 return transform.primaryInput.readAsString().then((contents) { | |
341 transform.addOutput(new Asset.fromString( | |
342 transform.primaryInput.id, | |
343 contents.replaceAll("$input", "$output"))); | |
344 }); | |
345 } | |
346 } | |
347 """; | |
348 } | |
OLD | NEW |