OLD | NEW |
| (Empty) |
1 // Copyright (c) 2014, 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 library barback.test.package_graph.lazy_asset_test; | |
6 | |
7 import 'package:barback/barback.dart'; | |
8 import 'package:barback/src/utils.dart'; | |
9 import 'package:scheduled_test/scheduled_test.dart'; | |
10 | |
11 import '../utils.dart'; | |
12 | |
13 main() { | |
14 initConfig(); | |
15 test("requesting a lazy asset should cause it to be generated", () { | |
16 initGraph(["app|foo.blub"], {"app": [ | |
17 [new LazyRewriteTransformer("blub", "blab")] | |
18 ]}); | |
19 updateSources(["app|foo.blub"]); | |
20 expectAsset("app|foo.blab", "foo.blab"); | |
21 buildShouldSucceed(); | |
22 }); | |
23 | |
24 test("calling getAllAssets should cause a lazy asset to be generated", () { | |
25 var transformer = new LazyRewriteTransformer("blub", "blab"); | |
26 initGraph(["app|foo.blub"], {"app": [[transformer]]}); | |
27 updateSources(["app|foo.blub"]); | |
28 expectAllAssets(["app|foo.blub", "app|foo.blab"]); | |
29 buildShouldSucceed(); | |
30 expect(transformer.numRuns, completion(equals(1))); | |
31 }); | |
32 | |
33 test("requesting a lazy asset multiple times should only cause it to be " | |
34 "generated once", () { | |
35 var transformer = new LazyRewriteTransformer("blub", "blab"); | |
36 initGraph(["app|foo.blub"], {"app": [[transformer]]}); | |
37 updateSources(["app|foo.blub"]); | |
38 expectAsset("app|foo.blab", "foo.blab"); | |
39 expectAsset("app|foo.blab", "foo.blab"); | |
40 expectAsset("app|foo.blab", "foo.blab"); | |
41 buildShouldSucceed(); | |
42 expect(transformer.numRuns, completion(equals(1))); | |
43 }); | |
44 | |
45 test("a lazy asset can be consumed by a non-lazy transformer", () { | |
46 initGraph(["app|foo.blub"], {"app": [ | |
47 [new LazyRewriteTransformer("blub", "blab")], | |
48 [new RewriteTransformer("blab", "blib")] | |
49 ]}); | |
50 updateSources(["app|foo.blub"]); | |
51 expectAsset("app|foo.blib", "foo.blab.blib"); | |
52 buildShouldSucceed(); | |
53 }); | |
54 | |
55 test("a lazy asset isn't eagerly compiled", () { | |
56 var transformer = new LazyRewriteTransformer("blub", "blab"); | |
57 initGraph(["app|foo.blub"], {"app": [[transformer]]}); | |
58 updateSources(["app|foo.blub"]); | |
59 buildShouldSucceed(); | |
60 expect(transformer.numRuns, completion(equals(0))); | |
61 }); | |
62 | |
63 test("a lazy asset emitted by a group isn't eagerly compiled", () { | |
64 var transformer = new LazyRewriteTransformer("blub", "blab"); | |
65 initGraph(["app|foo.blub"], {"app": [ | |
66 [new TransformerGroup([[transformer]])] | |
67 ]}); | |
68 updateSources(["app|foo.blub"]); | |
69 buildShouldSucceed(); | |
70 expect(transformer.numRuns, completion(equals(0))); | |
71 }); | |
72 | |
73 test("a lazy asset piped into a non-lazy transformer is eagerly compiled", | |
74 () { | |
75 var transformer = new LazyRewriteTransformer("blub", "blab"); | |
76 initGraph(["app|foo.blub"], {"app": [ | |
77 [transformer], | |
78 [new RewriteTransformer("blab", "blib")] | |
79 ]}); | |
80 updateSources(["app|foo.blub"]); | |
81 buildShouldSucceed(); | |
82 expect(transformer.numRuns, completion(equals(1))); | |
83 }); | |
84 | |
85 test("a lazy asset piped into a declaring transformer isn't eagerly " | |
86 "compiled", () { | |
87 var transformer1 = new LazyRewriteTransformer("blub", "blab"); | |
88 var transformer2 = new DeclaringRewriteTransformer("blab", "blib"); | |
89 initGraph(["app|foo.blub"], {"app": [ | |
90 [transformer1], [transformer2] | |
91 ]}); | |
92 updateSources(["app|foo.blub"]); | |
93 buildShouldSucceed(); | |
94 expect(transformer1.numRuns, completion(equals(0))); | |
95 expect(transformer2.numRuns, completion(equals(0))); | |
96 }); | |
97 | |
98 test("a lazy asset piped into a declaring transformer is compiled " | |
99 "on-demand", () { | |
100 initGraph(["app|foo.blub"], {"app": [ | |
101 [new LazyRewriteTransformer("blub", "blab")], | |
102 [new DeclaringRewriteTransformer("blab", "blib")] | |
103 ]}); | |
104 updateSources(["app|foo.blub"]); | |
105 expectAsset("app|foo.blib", "foo.blab.blib"); | |
106 buildShouldSucceed(); | |
107 }); | |
108 | |
109 test("a lazy asset piped through many declaring transformers isn't eagerly " | |
110 "compiled", () { | |
111 var transformer1 = new LazyRewriteTransformer("one", "two"); | |
112 var transformer2 = new DeclaringRewriteTransformer("two", "three"); | |
113 var transformer3 = new DeclaringRewriteTransformer("three", "four"); | |
114 var transformer4 = new DeclaringRewriteTransformer("four", "five"); | |
115 initGraph(["app|foo.one"], {"app": [ | |
116 [transformer1], [transformer2], [transformer3], [transformer4] | |
117 ]}); | |
118 updateSources(["app|foo.one"]); | |
119 buildShouldSucceed(); | |
120 expect(transformer1.numRuns, completion(equals(0))); | |
121 expect(transformer2.numRuns, completion(equals(0))); | |
122 expect(transformer3.numRuns, completion(equals(0))); | |
123 expect(transformer4.numRuns, completion(equals(0))); | |
124 }); | |
125 | |
126 test("a lazy asset piped through many declaring transformers is compiled " | |
127 "on-demand", () { | |
128 initGraph(["app|foo.one"], {"app": [ | |
129 [new LazyRewriteTransformer("one", "two")], | |
130 [new DeclaringRewriteTransformer("two", "three")], | |
131 [new DeclaringRewriteTransformer("three", "four")], | |
132 [new DeclaringRewriteTransformer("four", "five")] | |
133 ]}); | |
134 updateSources(["app|foo.one"]); | |
135 expectAsset("app|foo.five", "foo.two.three.four.five"); | |
136 buildShouldSucceed(); | |
137 }); | |
138 | |
139 test("a lazy asset piped into a non-lazy transformer that doesn't use its " | |
140 "outputs isn't eagerly compiled", () { | |
141 var transformer = new LazyRewriteTransformer("blub", "blab"); | |
142 initGraph(["app|foo.blub"], {"app": [ | |
143 [transformer], | |
144 [new RewriteTransformer("txt", "out")] | |
145 ]}); | |
146 updateSources(["app|foo.blub"]); | |
147 buildShouldSucceed(); | |
148 expect(transformer.numRuns, completion(equals(0))); | |
149 }); | |
150 | |
151 test("a lazy asset piped into a non-lazy transformer that doesn't use its " | |
152 "outputs is compiled on-demand", () { | |
153 initGraph(["app|foo.blub"], {"app": [ | |
154 [new LazyRewriteTransformer("blub", "blab")], | |
155 [new RewriteTransformer("txt", "out")] | |
156 ]}); | |
157 updateSources(["app|foo.blub"]); | |
158 expectAsset("app|foo.blab", "foo.blab"); | |
159 buildShouldSucceed(); | |
160 }); | |
161 | |
162 test("a lazy transformer followed by a non-lazy transformer is re-run " | |
163 "eagerly", () { | |
164 var rewrite = new LazyRewriteTransformer("one", "two"); | |
165 initGraph(["app|foo.one"], {"app": [ | |
166 [rewrite], | |
167 [new RewriteTransformer("two", "three")] | |
168 ]}); | |
169 | |
170 updateSources(["app|foo.one"]); | |
171 expectAsset("app|foo.three", "foo.two.three"); | |
172 buildShouldSucceed(); | |
173 | |
174 updateSources(["app|foo.one"]); | |
175 buildShouldSucceed(); | |
176 | |
177 expect(rewrite.numRuns, completion(equals(2))); | |
178 }); | |
179 | |
180 test("a lazy transformer followed by a declaring transformer isn't re-run " | |
181 "eagerly", () { | |
182 var rewrite = new LazyRewriteTransformer("one", "two"); | |
183 initGraph(["app|foo.one"], {"app": [ | |
184 [rewrite], | |
185 [new DeclaringRewriteTransformer("two", "three")] | |
186 ]}); | |
187 | |
188 updateSources(["app|foo.one"]); | |
189 expectAsset("app|foo.three", "foo.two.three"); | |
190 buildShouldSucceed(); | |
191 | |
192 updateSources(["app|foo.one"]); | |
193 buildShouldSucceed(); | |
194 | |
195 expect(rewrite.numRuns, completion(equals(1))); | |
196 }); | |
197 | |
198 test("a declaring transformer added after a materialized lazy transformer " | |
199 "is still deferred", () { | |
200 var lazy = new LazyRewriteTransformer("one", "two"); | |
201 var declaring = new DeclaringRewriteTransformer("two", "three"); | |
202 initGraph(["app|foo.one"], {"app": [[lazy]]}); | |
203 | |
204 updateSources(["app|foo.one"]); | |
205 expectAsset("app|foo.two", "foo.two"); | |
206 buildShouldSucceed(); | |
207 | |
208 updateTransformers("app", [[lazy], [declaring]]); | |
209 expectAsset("app|foo.three", "foo.two.three"); | |
210 buildShouldSucceed(); | |
211 | |
212 updateSources(["app|foo.one"]); | |
213 buildShouldSucceed(); | |
214 | |
215 expect(lazy.numRuns, completion(equals(1))); | |
216 expect(declaring.numRuns, completion(equals(1))); | |
217 }); | |
218 | |
219 test("a lazy asset works as a cross-package input", () { | |
220 initGraph({ | |
221 "pkg1|foo.blub": "foo", | |
222 "pkg2|a.txt": "pkg1|foo.blab" | |
223 }, {"pkg1": [ | |
224 [new LazyRewriteTransformer("blub", "blab")], | |
225 ], "pkg2": [ | |
226 [new ManyToOneTransformer("txt")] | |
227 ]}); | |
228 | |
229 updateSources(["pkg1|foo.blub", "pkg2|a.txt"]); | |
230 expectAsset("pkg2|a.out", "foo.blab"); | |
231 buildShouldSucceed(); | |
232 }); | |
233 | |
234 test("a lazy transformer can consume secondary inputs lazily", () { | |
235 initGraph({ | |
236 "app|a.inc": "a", | |
237 "app|a.txt": "a.inc" | |
238 }, {"app": [ | |
239 [new LazyManyToOneTransformer("txt")] | |
240 ]}); | |
241 | |
242 updateSources(["app|a.inc", "app|a.txt"]); | |
243 expectAsset("app|a.out", "a"); | |
244 buildShouldSucceed(); | |
245 }); | |
246 | |
247 test("after being materialized a lazy transformer is still lazy", () { | |
248 var transformer = new LazyRewriteTransformer("blub", "blab"); | |
249 initGraph(["app|foo.blub"], {"app": [[transformer]]}); | |
250 | |
251 updateSources(["app|foo.blub"]); | |
252 buildShouldSucceed(); | |
253 | |
254 // Request the asset once to force it to be materialized. | |
255 expectAsset("app|foo.blab", "foo.blab"); | |
256 buildShouldSucceed(); | |
257 | |
258 updateSources(["app|foo.blub"]); | |
259 buildShouldSucceed(); | |
260 | |
261 expect(transformer.numRuns, completion(equals(1))); | |
262 }); | |
263 | |
264 test("after being materialized a lazy transformer can be materialized again", | |
265 () { | |
266 var transformer = new LazyRewriteTransformer("blub", "blab"); | |
267 initGraph(["app|foo.blub"], {"app": [[transformer]]}); | |
268 | |
269 updateSources(["app|foo.blub"]); | |
270 buildShouldSucceed(); | |
271 | |
272 // Request the asset once to force it to be materialized. | |
273 expectAsset("app|foo.blab", "foo.blab"); | |
274 buildShouldSucceed(); | |
275 | |
276 modifyAsset("app|foo.blub", "bar"); | |
277 updateSources(["app|foo.blub"]); | |
278 expectAsset("app|foo.blab", "bar.blab"); | |
279 buildShouldSucceed(); | |
280 }); | |
281 | |
282 test("an error emitted in a lazy transformer's declareOutputs method is " | |
283 "caught and reported", () { | |
284 initGraph(["app|foo.txt"], {"app": [ | |
285 [new LazyBadTransformer("app|foo.out")] | |
286 ]}); | |
287 | |
288 updateSources(["app|foo.txt"]); | |
289 buildShouldFail([isTransformerException(equals(LazyBadTransformer.ERROR))]); | |
290 }); | |
291 | |
292 test("an error emitted in a lazy transformer's declareOuputs method prevents " | |
293 "it from being materialized", () { | |
294 var transformer = new LazyBadTransformer("app|foo.out"); | |
295 initGraph(["app|foo.txt"], {"app": [[transformer]]}); | |
296 | |
297 updateSources(["app|foo.txt"]); | |
298 expectNoAsset("app|foo.out"); | |
299 buildShouldFail([isTransformerException(equals(LazyBadTransformer.ERROR))]); | |
300 expect(transformer.numRuns, completion(equals(0))); | |
301 }); | |
302 | |
303 test("a lazy transformer passes through inputs it doesn't apply to", () { | |
304 initGraph(["app|foo.txt"], {"app": [ | |
305 [new LazyRewriteTransformer("blub", "blab")] | |
306 ]}); | |
307 | |
308 updateSources(["app|foo.txt"]); | |
309 expectAsset("app|foo.txt"); | |
310 buildShouldSucceed(); | |
311 }); | |
312 | |
313 test("a lazy transformer passes through inputs it doesn't overwrite", () { | |
314 initGraph(["app|foo.txt"], {"app": [ | |
315 [new LazyRewriteTransformer("txt", "out")] | |
316 ]}); | |
317 | |
318 updateSources(["app|foo.txt"]); | |
319 expectAsset("app|foo.txt"); | |
320 buildShouldSucceed(); | |
321 }); | |
322 | |
323 test("a lazy transformer doesn't pass through inputs it overwrites", () { | |
324 initGraph(["app|foo.txt"], {"app": [ | |
325 [new LazyRewriteTransformer("txt", "txt")] | |
326 ]}); | |
327 | |
328 updateSources(["app|foo.txt"]); | |
329 expectAsset("app|foo.txt", "foo.txt"); | |
330 buildShouldSucceed(); | |
331 }); | |
332 | |
333 test("a lazy transformer doesn't pass through inputs it consumes", () { | |
334 initGraph(["app|foo.txt"], {"app": [ | |
335 [new LazyRewriteTransformer("txt", "out")..consumePrimary = true] | |
336 ]}); | |
337 | |
338 updateSources(["app|foo.txt"]); | |
339 expectNoAsset("app|foo.txt"); | |
340 buildShouldSucceed(); | |
341 }); | |
342 | |
343 test("a lazy transformer that doesn't apply does nothing when forced", () { | |
344 initGraph(["app|foo.txt"], {"app": [ | |
345 [new LazyRewriteTransformer("blub", "blab")] | |
346 ]}); | |
347 | |
348 updateSources(["app|foo.txt"]); | |
349 expectNoAsset("app|foo.blab"); | |
350 | |
351 // Getting all assets will force every lazy transformer. This shouldn't | |
352 // cause the rewrite to apply, because foo.txt isn't primary. | |
353 expectAllAssets(["app|foo.txt"]); | |
354 buildShouldSucceed(); | |
355 }); | |
356 | |
357 test("a lazy transformer that generates fewer outputs than it declares is " | |
358 "forced when a declared but ungenerated output is requested", () { | |
359 initGraph({"app|foo.txt": "no"}, {"app": [ | |
360 [new LazyCheckContentAndRenameTransformer( | |
361 oldExtension: "txt", oldContent: "yes", | |
362 newExtension: "out", newContent: "done")] | |
363 ]}); | |
364 | |
365 updateSources(["app|foo.txt"]); | |
366 expectNoAsset("app|foo.out"); | |
367 buildShouldSucceed(); | |
368 | |
369 modifyAsset("app|foo.txt", "yes"); | |
370 updateSources(["app|foo.txt"]); | |
371 expectAsset("app|foo.out", "done"); | |
372 buildShouldSucceed(); | |
373 }); | |
374 | |
375 // Regression tests. | |
376 | |
377 test("a lazy transformer that doesn't apply updates its passed-through asset", | |
378 () { | |
379 initGraph(["app|foo.txt"], {"app": [ | |
380 [new LazyRewriteTransformer("blub", "blab")] | |
381 ]}); | |
382 | |
383 // Pause the provider so that the transformer will start forwarding the | |
384 // asset while it's dirty. | |
385 pauseProvider(); | |
386 updateSources(["app|foo.txt"]); | |
387 expectAssetDoesNotComplete("app|foo.txt"); | |
388 | |
389 resumeProvider(); | |
390 expectAsset("app|foo.txt", "foo"); | |
391 buildShouldSucceed(); | |
392 | |
393 modifyAsset("app|foo.txt", "bar"); | |
394 updateSources(["app|foo.txt"]); | |
395 expectAsset("app|foo.txt", "bar"); | |
396 buildShouldSucceed(); | |
397 }); | |
398 | |
399 test("a lazy transformer is forced while the previous lazy transformer is " | |
400 "available, then the previous transformer becomes unavailable", () { | |
401 var assets = new LazyAssetsTransformer(["app|out.one", "app|out.two"]); | |
402 var rewrite = new LazyRewriteTransformer("two", "three"); | |
403 initGraph(["app|foo.in"], {"app": [[assets], [rewrite]]}); | |
404 | |
405 updateSources(["app|foo.in"]); | |
406 // Request out.one so that [assets] runs but the second does not. | |
407 expectAsset("app|out.one", "app|out.one"); | |
408 buildShouldSucceed(); | |
409 | |
410 // Start the [rewrite] running. The output from [assets] should still be | |
411 // available. | |
412 rewrite.pauseApply(); | |
413 expectAssetDoesNotComplete("app|out.three"); | |
414 | |
415 // Mark [assets] as dirty. It should re-run, since [rewrite] still needs its | |
416 // input. | |
417 updateSources(["app|foo.in"]); | |
418 rewrite.resumeApply(); | |
419 | |
420 expectAsset("app|out.three", "app|out.two.three"); | |
421 buildShouldSucceed(); | |
422 | |
423 // [assets] should run once for each time foo.in was updated. | |
424 expect(assets.numRuns, completion(equals(2))); | |
425 | |
426 // [rewrite] should run once against [assets]'s original output and once | |
427 // against its new output. | |
428 expect(rewrite.numRuns, completion(equals(2))); | |
429 }); | |
430 } | |
OLD | NEW |