Chromium Code Reviews| Index: pkg/barback/test/package_graph/transform_test.dart |
| diff --git a/pkg/barback/test/package_graph/transform_test.dart b/pkg/barback/test/package_graph/transform_test.dart |
| index d62d460516ca5d7b17f7122655a800a9237da4da..8c9dbba22e2640e5d12372e88f1cee72df7e0f4a 100644 |
| --- a/pkg/barback/test/package_graph/transform_test.dart |
| +++ b/pkg/barback/test/package_graph/transform_test.dart |
| @@ -129,6 +129,18 @@ main() { |
| buildShouldSucceed(); |
| }); |
| + test("outputs are inaccessible once used", () { |
| + initGraph(["app|foo.a"], {"app": [ |
| + [new RewriteTransformer("a", "b")], |
| + [new RewriteTransformer("a", "c")] |
| + ]}); |
| + updateSources(["app|foo.a"]); |
| + expectAsset("app|foo.b", "foo.b"); |
| + expectNoAsset("app|foo.a"); |
| + expectNoAsset("app|foo.c"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| test("does not reapply transform when inputs are not modified", () { |
| var transformer = new RewriteTransformer("blub", "blab"); |
| initGraph(["app|foo.blub"], {"app": [[transformer]]}); |
| @@ -268,6 +280,23 @@ main() { |
| buildShouldSucceed(); |
| }); |
| + test("discards outputs from a transform whose primary input is removed " |
| + "during processing", () { |
| + var rewrite = new RewriteTransformer("txt", "out"); |
| + initGraph(["app|foo.txt"], {"app": [[rewrite]]}); |
| + |
| + rewrite.pauseApply(); |
| + updateSources(["app|foo.txt"]); |
| + schedule(() => rewrite.started); |
| + schedule(() { |
| + removeSources(["app|foo.txt"]); |
| + rewrite.resumeApply(); |
| + }); |
| + |
| + expectNoAsset("app|foo.out"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| test("reapplies a transform when a non-primary input changes", () { |
| initGraph({ |
| "app|a.txt": "a.inc", |
| @@ -285,6 +314,46 @@ main() { |
| buildShouldSucceed(); |
| }); |
| + test("applies a transform when it becomes newly primary", () { |
|
Bob Nystrom
2013/07/31 20:05:41
Nice.
|
| + initGraph({ |
| + "app|foo.txt": "this", |
| + }, {"app": [[new CheckContentTransformer("that", " and the other")]]}); |
| + |
| + updateSources(["app|foo.txt"]); |
| + expectAsset("app|foo.txt", "this"); |
| + buildShouldSucceed(); |
| + |
| + modifyAsset("app|foo.txt", "that"); |
| + schedule(() => updateSources(["app|foo.txt"])); |
| + |
| + expectAsset("app|foo.txt", "that and the other"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("applies the correct transform if an asset is removed and added during " |
| + "isPrimary", () { |
| + var check1 = new CheckContentTransformer("first", "#1"); |
| + var check2 = new CheckContentTransformer("second", "#2"); |
| + initGraph({ |
| + "app|foo.txt": "first", |
| + }, {"app": [[check1, check2]]}); |
| + |
| + check1.pauseIsPrimary("app|foo.txt"); |
| + updateSources(["app|foo.txt"]); |
| + // Ensure that we're waiting on check1's isPrimary |
| + schedule(pumpEventQueue); |
| + |
| + schedule(() => removeSources(["app|foo.txt"])); |
|
Bob Nystrom
2013/07/31 20:05:41
What happens if you don't remove first and just mo
nweiz
2013/07/31 22:47:53
Added test.
|
| + modifyAsset("app|foo.txt", "second"); |
| + schedule(() { |
| + updateSources(["app|foo.txt"]); |
| + check1.resumeIsPrimary("app|foo.txt"); |
| + }); |
| + |
| + expectAsset("app|foo.txt", "second#2"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| test("restarts processing if a change occurs during processing", () { |
| var transformer = new RewriteTransformer("txt", "out"); |
| initGraph(["app|foo.txt"], {"app": [[transformer]]}); |
| @@ -312,6 +381,34 @@ main() { |
| }); |
| }); |
| + test("aborts processing if the primary input is removed during processing", |
| + () { |
| + var transformer = new RewriteTransformer("txt", "out"); |
| + initGraph(["app|foo.txt"], {"app": [[transformer]]}); |
| + |
| + transformer.pauseApply(); |
| + |
| + schedule(() { |
| + updateSources(["app|foo.txt"]); |
| + |
| + // Wait for the transform to start. |
| + return transformer.started; |
| + }); |
| + |
| + schedule(() { |
| + // Now remove its primary input while it's running. |
| + removeSources(["app|foo.txt"]); |
| + transformer.resumeApply(); |
| + }); |
| + |
| + expectNoAsset("app|foo.out"); |
| + buildShouldSucceed(); |
| + |
| + schedule(() { |
| + expect(transformer.numRuns, equals(1)); |
| + }); |
| + }); |
| + |
| test("handles an output moving from one transformer to another", () { |
| // In the first run, "shared.out" is created by the "a.a" transformer. |
| initGraph({ |
| @@ -400,6 +497,281 @@ main() { |
| buildShouldSucceed(); |
| }); |
| + test("doesn't return an asset until it's finished rebuilding", () { |
| + initGraph(["app|foo.in"], {"app": [ |
| + [new RewriteTransformer("in", "mid")], |
| + [new RewriteTransformer("mid", "out")] |
| + ]}); |
| + |
| + updateSources(["app|foo.in"]); |
| + expectAsset("app|foo.out", "foo.mid.out"); |
| + buildShouldSucceed(); |
| + |
| + pauseProvider(); |
| + modifyAsset("app|foo.in", "new"); |
| + schedule(() => updateSources(["app|foo.in"])); |
| + expectAssetDoesNotComplete("app|foo.out"); |
| + buildShouldNotBeDone(); |
| + |
| + resumeProvider(); |
| + expectAsset("app|foo.out", "new.mid.out"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("doesn't return an asset until its in-place transform is done", () { |
| + var rewrite = new RewriteTransformer("txt", "txt"); |
| + initGraph(["app|foo.txt"], {"app": [[rewrite]]}); |
| + |
| + rewrite.pauseApply(); |
| + updateSources(["app|foo.txt"]); |
| + expectAssetDoesNotComplete("app|foo.txt"); |
| + |
| + schedule(rewrite.resumeApply); |
| + expectAsset("app|foo.txt", "foo.txt"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("doesn't return an asset until we know it won't be transformed", |
| + () { |
| + var rewrite = new RewriteTransformer("txt", "txt"); |
| + initGraph(["app|foo.a"], {"app": [[rewrite]]}); |
| + |
| + rewrite.pauseIsPrimary("app|foo.a"); |
| + updateSources(["app|foo.a"]); |
| + expectAssetDoesNotComplete("app|foo.a"); |
| + |
| + schedule(() => rewrite.resumeIsPrimary("app|foo.a")); |
| + expectAsset("app|foo.a", "foo"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("doesn't return a modified asset until we know it will still be " |
| + "transformed", () { |
| + var rewrite = new RewriteTransformer("txt", "txt"); |
| + initGraph(["app|foo.txt"], {"app": [[rewrite]]}); |
| + |
| + updateSources(["app|foo.txt"]); |
| + expectAsset("app|foo.txt", "foo.txt"); |
| + buildShouldSucceed(); |
| + |
| + schedule(() => rewrite.pauseIsPrimary("app|foo.txt")); |
| + schedule(() => updateSources(["app|foo.txt"])); |
| + expectAssetDoesNotComplete("app|foo.txt"); |
| + |
| + schedule(() => rewrite.resumeIsPrimary("app|foo.txt")); |
| + expectAsset("app|foo.txt", "foo.txt"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("doesn't return an asset that's removed during isPrimary", () { |
| + var rewrite = new RewriteTransformer("txt", "txt"); |
| + initGraph(["app|foo.txt"], {"app": [[rewrite]]}); |
| + |
| + rewrite.pauseIsPrimary("app|foo.txt"); |
| + updateSources(["app|foo.txt"]); |
| + // Make sure we're waiting on isPrimary |
|
Bob Nystrom
2013/07/31 20:05:41
"." here and elsewhere.
nweiz
2013/07/31 22:47:53
Done.
|
| + schedule(pumpEventQueue); |
| + |
| + schedule(() { |
| + removeSources(["app|foo.txt"]); |
| + rewrite.resumeIsPrimary("app|foo.txt"); |
| + }); |
| + expectNoAsset("app|foo.txt"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("doesn't transform an asset that goes from primary to non-primary " |
| + "during isPrimary", () { |
| + var check = new CheckContentTransformer("do", "ne"); |
| + initGraph({ |
| + "app|foo.txt": "do" |
| + }, {"app": [[check]]}); |
| + |
| + check.pauseIsPrimary("app|foo.txt"); |
| + updateSources(["app|foo.txt"]); |
| + // Make sure we're waiting on isPrimary |
| + schedule(pumpEventQueue); |
| + |
| + modifyAsset("app|foo.txt", "don't"); |
| + schedule(() { |
| + updateSources(["app|foo.txt"]); |
| + check.resumeIsPrimary("app|foo.txt"); |
| + }); |
| + |
| + expectAsset("app|foo.txt", "don't"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("transforms an asset that goes from non-primary to primary " |
| + "during isPrimary", () { |
| + var check = new CheckContentTransformer("do", "ne"); |
| + initGraph({ |
| + "app|foo.txt": "don't" |
| + }, {"app": [[check]]}); |
| + |
| + check.pauseIsPrimary("app|foo.txt"); |
| + updateSources(["app|foo.txt"]); |
| + // Make sure we're waiting on isPrimary |
| + schedule(pumpEventQueue); |
| + |
| + modifyAsset("app|foo.txt", "do"); |
| + schedule(() { |
| + updateSources(["app|foo.txt"]); |
| + check.resumeIsPrimary("app|foo.txt"); |
| + }); |
| + |
| + expectAsset("app|foo.txt", "done"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("doesn't return an asset that's removed during another transformer's " |
| + "isPrimary", () { |
| + var rewrite1 = new RewriteTransformer("txt", "txt"); |
| + var rewrite2 = new RewriteTransformer("md", "md"); |
| + initGraph(["app|foo.txt", "app|foo.md"], {"app": [[rewrite1, rewrite2]]}); |
| + |
| + rewrite2.pauseIsPrimary("app|foo.md"); |
| + updateSources(["app|foo.txt", "app|foo.md"]); |
| + // Make sure we're waiting on the correct isPrimary |
| + schedule(pumpEventQueue); |
| + |
| + schedule(() { |
| + removeSources(["app|foo.txt"]); |
| + rewrite2.resumeIsPrimary("app|foo.md"); |
| + }); |
| + expectNoAsset("app|foo.txt"); |
| + expectAsset("app|foo.md", "foo.md"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("doesn't transform an asset that goes from primary to non-primary " |
| + "during another transformer's isPrimary", () { |
| + var rewrite = new RewriteTransformer("md", "md"); |
| + var check = new CheckContentTransformer("do", "ne"); |
| + initGraph({ |
| + "app|foo.txt": "do", |
| + "app|foo.md": "foo" |
| + }, {"app": [[rewrite, check]]}); |
| + |
| + rewrite.pauseIsPrimary("app|foo.md"); |
| + updateSources(["app|foo.txt", "app|foo.md"]); |
| + // Make sure we're waiting on the correct isPrimary |
| + schedule(pumpEventQueue); |
| + |
| + modifyAsset("app|foo.txt", "don't"); |
| + schedule(() { |
| + updateSources(["app|foo.txt"]); |
| + rewrite.resumeIsPrimary("app|foo.md"); |
| + }); |
| + |
| + expectAsset("app|foo.txt", "don't"); |
| + expectAsset("app|foo.md", "foo.md"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("transforms an asset that goes from non-primary to primary " |
| + "during another transformer's isPrimary", () { |
| + var rewrite = new RewriteTransformer("md", "md"); |
| + var check = new CheckContentTransformer("do", "ne"); |
| + initGraph({ |
| + "app|foo.txt": "don't", |
| + "app|foo.md": "foo" |
| + }, {"app": [[rewrite, check]]}); |
| + |
| + rewrite.pauseIsPrimary("app|foo.md"); |
| + updateSources(["app|foo.txt", "app|foo.md"]); |
| + // Make sure we're waiting on the correct isPrimary |
| + schedule(pumpEventQueue); |
| + |
| + modifyAsset("app|foo.txt", "do"); |
| + schedule(() { |
| + updateSources(["app|foo.txt"]); |
| + rewrite.resumeIsPrimary("app|foo.md"); |
| + }); |
| + |
| + expectAsset("app|foo.txt", "done"); |
| + expectAsset("app|foo.md", "foo.md"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("removes pipelined transforms when the root primary input is removed", |
| + () { |
| + initGraph(["app|foo.txt"], {"app": [ |
| + [new RewriteTransformer("txt", "mid")], |
| + [new RewriteTransformer("mid", "out")] |
| + ]}); |
| + |
| + updateSources(["app|foo.txt"]); |
| + expectAsset("app|foo.out", "foo.mid.out"); |
| + buildShouldSucceed(); |
| + |
| + schedule(() => removeSources(["app|foo.txt"])); |
| + expectNoAsset("app|foo.out"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("removes pipelined transforms when the parent ceases to generate the " |
| + "primary input", () { |
| + initGraph({"app|foo.txt": "foo.mid"}, {'app': [ |
| + [new OneToManyTransformer('txt')], |
| + [new RewriteTransformer('mid', 'out')] |
| + ]}); |
| + |
| + updateSources(['app|foo.txt']); |
| + expectAsset('app|foo.out', 'spread txt.out'); |
| + buildShouldSucceed(); |
| + |
| + modifyAsset("app|foo.txt", "bar.mid"); |
| + schedule(() => updateSources(["app|foo.txt"])); |
| + expectNoAsset('app|foo.out'); |
| + expectAsset('app|bar.out', 'spread txt.out'); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("returns an asset even if an unrelated build is running", () { |
| + initGraph([ |
| + "app|foo.in", |
| + "app|bar.in", |
| + ], {"app": [[new RewriteTransformer("in", "out")]]}); |
| + |
| + updateSources(["app|foo.in", "app|bar.in"]); |
| + expectAsset("app|foo.out", "foo.out"); |
| + expectAsset("app|bar.out", "bar.out"); |
| + buildShouldSucceed(); |
| + |
| + pauseProvider(); |
| + modifyAsset("app|foo.in", "new"); |
| + schedule(() => updateSources(["app|foo.in"])); |
| + expectAssetDoesNotComplete("app|foo.out"); |
| + expectAsset("app|bar.out", "bar.out"); |
| + buildShouldNotBeDone(); |
| + |
| + resumeProvider(); |
| + expectAsset("app|foo.out", "new.out"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| + test("doesn't report AssetNotFound until all builds are finished", () { |
| + initGraph([ |
| + "app|foo.in", |
| + ], {"app": [[new RewriteTransformer("in", "out")]]}); |
| + |
| + updateSources(["app|foo.in"]); |
| + expectAsset("app|foo.out", "foo.out"); |
| + buildShouldSucceed(); |
| + |
| + pauseProvider(); |
| + schedule(() => updateSources(["app|foo.in"])); |
| + expectAssetDoesNotComplete("app|foo.out"); |
| + expectAssetDoesNotComplete("app|non-existent.out"); |
| + buildShouldNotBeDone(); |
| + |
| + resumeProvider(); |
| + expectAsset("app|foo.out", "foo.out"); |
| + expectNoAsset("app|non-existent.out"); |
| + buildShouldSucceed(); |
| + }); |
| + |
| test("doesn't emit a result until all builds are finished", () { |
| var rewrite = new RewriteTransformer("txt", "out"); |
| initGraph([ |