/*
* 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.pub;
import com.google.dart.engine.utilities.io.PrintStringWriter;
import com.google.dart.tools.core.builder.BuildEvent;
import com.google.dart.tools.core.internal.builder.TestProjects;
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 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.DartCore.PUBSPEC_LOCK_FILE_NAME;
import static com.google.dart.tools.core.internal.builder.TestProjects.MONITOR;
import static com.google.dart.tools.core.internal.builder.TestProjects.newEmptyProject;
import static com.google.dart.tools.core.internal.builder.TestProjects.newPubProject1;
import junit.framework.TestCase;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import static org.eclipse.core.resources.IResourceDelta.ADDED;
import static org.eclipse.core.resources.IResourceDelta.REMOVED;
public class PubBuildParticipantTest extends TestCase {
/**
* A specialized {@link PubBuildParticipant} that records in which directories pub is run rather
* than actually executing pub.
*/
private static class Target extends PubBuildParticipant {
private IContainer runPubContainer;
private IResource lockFileProcessed;
private IResource pubspecProcessed;
public void assertProcessLockFile(IResource expected) {
boolean success = true;
if (expected != lockFileProcessed) {
success = false;
}
if (success) {
return;
}
printFailMessage(expected, lockFileProcessed);
}
public void assertProcessPubspecFile(IResource expected) {
boolean success = true;
if (expected != pubspecProcessed) {
success = false;
}
if (success) {
return;
}
printFailMessage(expected, pubspecProcessed);
}
public void assertRunPub(IContainer expected) {
boolean success = true;
if (expected != runPubContainer) {
success = false;
}
if (success) {
return;
}
printFailMessage(expected, runPubContainer);
}
@Override
protected void processLockFileContents(IResource lockFile, IProject project,
IProgressMonitor monitor) {
assertNotNull(lockFile);
assertNotNull(project);
assertNotNull(monitor);
lockFileProcessed = lockFile;
}
@Override
protected void processPubspecContents(IResource pubspec, IProject project,
IProgressMonitor monitor) {
assertNotNull(project);
assertNotNull(monitor);
pubspecProcessed = pubspec;
}
@Override
protected void runPub(IContainer container, IProgressMonitor monitor) {
assertNotNull(container);
assertNotNull(monitor);
runPubContainer = container;
}
private void printFailMessage(Object expected, Object actual) {
PrintStringWriter writer = new PrintStringWriter();
writer.println("expected:");
writer.println(" " + expected);
writer.println("actual:");
writer.println(" " + actual);
fail(writer.toString().trim());
}
}
// Assert pub is not run
public void test_build_full_emptyProject() throws Exception {
Target target = new Target();
MockContainer project = newEmptyProject();
target.build(new BuildEvent(project, null, MONITOR), MONITOR);
target.assertRunPub(null);
target.assertProcessPubspecFile(null);
target.assertProcessLockFile(null);
}
// Assert pub is run on project containing pubspec.yaml
// Assert pubspec file is processed
public void test_build_full_pub() throws Exception {
Target target = new Target();
MockContainer project = newEmptyProject();
MockFile file = new MockFile(project, PUBSPEC_FILE_NAME);
project.add(file);
MockFile lockFile = new MockFile(project, PUBSPEC_LOCK_FILE_NAME);
project.add(lockFile);
target.build(new BuildEvent(project, null, MONITOR), MONITOR);
target.assertRunPub(project);
target.assertProcessPubspecFile(file);
target.assertProcessLockFile(lockFile);
}
// Assert pub is not run on pubspec.yaml in folder under "packages" directory hierarchy
// or in hidden ".svn" directory
public void test_build_full_pubInPackages() throws Exception {
Target target = new Target();
MockContainer project = newPubProject1();
target.build(new BuildEvent(project, null, MONITOR), MONITOR);
target.assertRunPub(project);
target.assertProcessLockFile(null);
}
// Assert pub is run when pubspec.yaml is added
public void test_build_incremental_pubAdded() throws Exception {
Target target = new Target();
MockContainer project = TestProjects.newPubProject1();
MockFile file = new MockFile(project, PUBSPEC_FILE_NAME);
MockFile lockFile = new MockFile(project, PUBSPEC_LOCK_FILE_NAME);
project.add(lockFile);
MockDelta delta = new MockDelta(project);
delta.add(file, ADDED);
target.build(new BuildEvent(project, delta, MONITOR), MONITOR);
target.assertRunPub(project);
target.assertProcessPubspecFile(file);
target.assertProcessLockFile(lockFile);
}
// Assert pub is run when pubspec.yaml has changed
public void test_build_incremental_pubChanged() throws Exception {
Target target = new Target();
MockContainer project = TestProjects.newPubProject1();
MockFile file = new MockFile(project, PUBSPEC_FILE_NAME);
MockFile lockFile = new MockFile(project, PUBSPEC_LOCK_FILE_NAME);
project.add(lockFile);
MockDelta delta = new MockDelta(project);
delta.add(file);
target.build(new BuildEvent(project, delta, MONITOR), MONITOR);
target.assertRunPub(project);
target.assertProcessPubspecFile(file);
target.assertProcessLockFile(lockFile);
}
// Assert pub is not run on pubspec.yaml in file under "packages" directory hierarchy
// or in hidden ".svn" directory
public void test_build_incremental_pubInPackagesAdded() throws Exception {
Target target = new Target();
MockContainer project = TestProjects.newPubProject1();
MockDelta delta = new MockDelta(project);
delta.add(PACKAGES_DIRECTORY_NAME).add("foo").add(PUBSPEC_FILE_NAME);
delta.add(".svn").add(PUBSPEC_FILE_NAME);
target.build(new BuildEvent(project, delta, MONITOR), MONITOR);
target.assertRunPub(null);
target.assertProcessPubspecFile(null);
target.assertProcessLockFile(null);
}
// Assert pub is not run on pubspec.yaml in file under "packages" directory hierarchy
// or in hidden ".svn" directory
public void test_build_incremental_pubInPackagesChanged() throws Exception {
Target target = new Target();
MockContainer project = TestProjects.newPubProject1();
MockDelta delta = new MockDelta(project);
delta.add(PACKAGES_DIRECTORY_NAME).add("foo").add(PUBSPEC_FILE_NAME);
delta.add(".svn").add(PUBSPEC_FILE_NAME);
target.build(new BuildEvent(project, delta, MONITOR), MONITOR);
target.assertRunPub(null);
target.assertProcessPubspecFile(null);
target.assertProcessLockFile(null);
}
// Assert pub not is run when pubspec.yaml is removed
public void test_build_incremental_pubRemoved() throws Exception {
Target target = new Target();
MockContainer project = TestProjects.newPubProject1();
MockDelta delta = new MockDelta(project);
delta.add(PUBSPEC_FILE_NAME, REMOVED);
target.build(new BuildEvent(project, delta, MONITOR), MONITOR);
target.assertRunPub(null);
target.assertProcessPubspecFile(null);
target.assertProcessLockFile(null);
}
}