/* * Copyright 2012 Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.core.internal.builder; import com.google.dart.engine.utilities.io.PrintStringWriter; import com.google.dart.tools.core.builder.BuildEvent; import com.google.dart.tools.core.builder.CleanEvent; import com.google.dart.tools.core.mock.MockContainer; import com.google.dart.tools.core.mock.MockDelta; import com.google.dart.tools.core.mock.MockFile; import com.google.dart.tools.core.test.AbstractDartCoreTest; import static com.google.dart.tools.core.DartCore.BUILD_DART_FILE_NAME; import static com.google.dart.tools.core.DartCore.PACKAGES_DIRECTORY_NAME; import static com.google.dart.tools.core.DartCore.PUBSPEC_FILE_NAME; import static com.google.dart.tools.core.internal.builder.TestProjects.MONITOR; import static com.google.dart.tools.core.internal.builder.TestProjects.newPubProject2; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import static org.eclipse.core.resources.IResourceDelta.ADDED; import java.util.HashMap; import java.util.List; public class BuildDartParticipantTest extends AbstractDartCoreTest { /** * A specialized {@link BuildDartParticipant} that records which build files were supposed to be * executed rather than executing those build files. */ private final class Target extends BuildDartParticipant { private HashMap<IFile, List<String>> calls = new HashMap<IFile, List<String>>(); public void assertCall(IFile builderFile, String... expected) { List<String> actual = calls.get(builderFile); if (actual == null) { fail("Expected call to " + builderFile); } if (expected.length == actual.size()) { boolean success = true; for (int i = 0; i < expected.length; i++) { if (!expected[i].equals(actual.get(i))) { success = false; break; } } if (success) { return; } } PrintStringWriter writer = new PrintStringWriter(); writer.println("expected:"); for (String arg : expected) { writer.println(" " + arg); } writer.println("actual:"); for (String arg : actual) { writer.println(" " + arg); } fail(writer.toString().trim()); } public void assertCalls(IResource... expected) { if (expected.length == calls.size()) { boolean success = true; for (IResource resource : expected) { if (calls.get(resource) == null) { success = false; break; } } if (success) { return; } } PrintStringWriter writer = new PrintStringWriter(); writer.println("expected:"); for (IResource resource : expected) { writer.println(" " + resource); } writer.println("actual:"); for (IResource resource : calls.keySet()) { writer.println(" " + resource); } fail(writer.toString().trim()); } @Override protected void runBuildDart(IFile builderFile, List<String> buildArgs, IProgressMonitor monitor) throws CoreException { assertNotNull(builderFile); assertNotNull(buildArgs); for (String arg : buildArgs) { assertNotNull(arg); } assertNotNull(monitor); if (calls.put(builderFile, buildArgs) != null) { fail("Should not be called more than once: " + builderFile); } } } public void test_build_clean() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); MockFile builder1 = project.getMockFile("myapp/" + BUILD_DART_FILE_NAME); target.clean(new CleanEvent(project, MONITOR), MONITOR); target.assertCalls(builder0, builder1); target.assertCall(builder0, "--clean"); target.assertCall(builder1, "--clean"); } public void test_build_dart0_added() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); MockDelta delta = new MockDelta(project); MockFile dart = project.getMockFile("some.dart"); delta.add(dart, ADDED); target.build(new BuildEvent(project, delta, MONITOR), MONITOR); target.assertCalls(builder0); target.assertCall(builder0, "--changed=" + dart.getName()); } public void test_build_dart0_changed() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); MockDelta delta = new MockDelta(project); MockFile dart = project.getMockFile("some.dart"); delta.add(dart); target.build(new BuildEvent(project, delta, MONITOR), MONITOR); target.assertCalls(builder0); target.assertCall(builder0, "--changed=" + dart.getName()); } public void test_build_dart01_changed() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); //MockFile builder1 = project.getMockFile("myapp/" + BUILD_DART_FILE_NAME); MockDelta delta = new MockDelta(project); MockFile dart0 = project.getMockFile("some.dart"); MockFile dart1 = project.getMockFile("some1.dart"); MockFile dart2 = project.getMockFile("myapp/other.dart"); delta.add(dart0); delta.add(dart1); delta.add("myapp").add("other.dart"); delta.add("packages").add("pkg1").add("some_folder").add("bar.dart"); target.build(new BuildEvent(project, delta, MONITOR), MONITOR); // Ensure that build includes nested resources but excludes file nested under "packages" target.assertCalls(builder0); target.assertCall( builder0, "--changed=" + dart0.getName(), "--changed=" + dart1.getName(), "--changed=" + dart2.getFullPath().removeFirstSegments(1).toOSString()); //target.assertCall(builder1, "--changed=" + dart2.getName()); } public void test_build_dart1_added() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); //MockFile builder1 = project.getMockFile("myapp/" + BUILD_DART_FILE_NAME); MockFile dart = project.getMockFile("myapp/other.dart"); MockDelta delta = new MockDelta(project); delta.add("myapp").add("other.dart", ADDED); target.build(new BuildEvent(project, delta, MONITOR), MONITOR); target.assertCalls(builder0); target.assertCall(builder0, "--changed=" + dart.getFullPath().removeFirstSegments(1).toOSString()); //target.assertCall(builder1, "--changed=" + dart.getName()); } public void test_build_dart1_changed() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); //MockFile builder1 = project.getMockFile("myapp/" + BUILD_DART_FILE_NAME); MockFile dart = project.getMockFile("myapp/other.dart"); MockDelta delta = new MockDelta(project); delta.add("myapp").add(dart); target.build(new BuildEvent(project, delta, MONITOR), MONITOR); target.assertCalls(builder0); target.assertCall(builder0, "--changed=" + dart.getFullPath().removeFirstSegments(1).toOSString()); //target.assertCall(builder1, "--changed=" + dart.getName()); } public void test_build_dart2_changed() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockDelta delta = new MockDelta(project); delta.add(".svn").add("foo.dart"); target.build(new BuildEvent(project, delta, MONITOR), MONITOR); target.assertCalls(); } public void test_build_dart3_changed() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockDelta delta = new MockDelta(project); delta.add(PACKAGES_DIRECTORY_NAME).add("pkg1").add("bar.dart"); target.build(new BuildEvent(project, delta, MONITOR), MONITOR); target.assertCalls(); } public void test_build_dart4_changed() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); project.remove("myapp/" + BUILD_DART_FILE_NAME); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); MockFile dart = project.getMockFile("myapp/other.dart"); MockDelta delta = new MockDelta(project); delta.add("myapp").add("other.dart"); delta.add("packages").add("pkg1").add("some_folder").add("bar.dart"); target.build(new BuildEvent(project, delta, MONITOR), MONITOR); // Ensure changed includes proper path to nested file but not files nested under "packages" target.assertCalls(builder0); target.assertCall(builder0, "--changed=" + dart.getFullPath().removeFirstSegments(1).toOSString()); } public void test_build_full1() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); target.build(new BuildEvent(project, null, MONITOR), MONITOR); target.assertCalls(builder0); target.assertCall(builder0, "--full"); } public void test_build_full2() throws Exception { Target target = new Target(); MockContainer project = newPubProject2(); project.remove(PUBSPEC_FILE_NAME); MockFile builder0 = project.getMockFile(BUILD_DART_FILE_NAME); target.build(new BuildEvent(project, null, MONITOR), MONITOR); // Should invoke builder0 even though it does not have a pubspec siblng // but because it is in the project root... legacy // And invoke builder1 because it is in an application directory (directory containing pubspec) target.assertCalls(builder0); target.assertCall(builder0, "--full"); } }