blob: 14ff6c0abb188196bb00cd6f1dcddfbb4cfa723a [file] [log] [blame]
package com.intellij.updater;
import com.intellij.openapi.util.io.FileUtil;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.channels.FileLock;
import java.util.*;
import static org.junit.Assert.assertEquals;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class PatchTest extends PatchTestCase {
private Patch myPatch;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
myPatch = new Patch(myOlderDir, myNewerDir, Collections.<String>emptyList(), Collections.<String>emptyList(),
Collections.<String>emptyList(), TEST_UI);
}
@Test
public void testBasics() throws Exception {
List<PatchAction> expectedActions = Arrays.asList(
new CreateAction("newDir/newFile.txt"),
new UpdateAction("Readme.txt", CHECKSUMS.README_TXT),
new UpdateZipAction("lib/annotations.jar",
Arrays.asList("org/jetbrains/annotations/NewClass.class"),
Arrays.asList("org/jetbrains/annotations/Nullable.class"),
Arrays.asList("org/jetbrains/annotations/TestOnly.class"),
CHECKSUMS.ANNOTATIONS_JAR),
new UpdateZipAction("lib/bootstrap.jar",
Collections.<String>emptyList(),
Collections.<String>emptyList(),
Arrays.asList("com/intellij/ide/ClassloaderUtil.class"),
CHECKSUMS.BOOTSTRAP_JAR),
new DeleteAction("bin/idea.bat", CHECKSUMS.IDEA_BAT));
List<PatchAction> actualActions = new ArrayList<PatchAction>(myPatch.getActions());
Collections.sort(expectedActions, COMPARATOR);
Collections.sort(actualActions, COMPARATOR);
assertEquals(expectedActions, actualActions);
}
@Test
public void testCreatingWithIgnoredFiles() throws Exception {
myPatch = new Patch(myOlderDir,
myNewerDir,
Arrays.asList("Readme.txt", "bin/idea.bat"),
Collections.<String>emptyList(),
Collections.<String>emptyList(),
TEST_UI);
List<PatchAction> expectedActions = Arrays.asList(
new CreateAction("newDir/newFile.txt"),
new UpdateZipAction("lib/annotations.jar",
Arrays.asList("org/jetbrains/annotations/NewClass.class"),
Arrays.asList("org/jetbrains/annotations/Nullable.class"),
Arrays.asList("org/jetbrains/annotations/TestOnly.class"),
CHECKSUMS.ANNOTATIONS_JAR),
new UpdateZipAction("lib/bootstrap.jar",
Collections.<String>emptyList(),
Collections.<String>emptyList(),
Arrays.asList("com/intellij/ide/ClassloaderUtil.class"),
CHECKSUMS.BOOTSTRAP_JAR));
List<PatchAction> actualActions = new ArrayList<PatchAction>(myPatch.getActions());
Collections.sort(expectedActions, COMPARATOR);
Collections.sort(actualActions, COMPARATOR);
assertEquals(expectedActions, actualActions);
}
@Test
public void testValidation() throws Exception {
FileUtil.writeToFile(new File(myOlderDir, "bin/idea.bat"), "changed".getBytes());
new File(myOlderDir, "extraDir").mkdirs();
new File(myOlderDir, "extraDir/extraFile.txt").createNewFile();
new File(myOlderDir, "newDir").mkdirs();
new File(myOlderDir, "newDir/newFile.txt").createNewFile();
FileUtil.writeToFile(new File(myOlderDir, "Readme.txt"), "changed".getBytes());
FileUtil.writeToFile(new File(myOlderDir, "lib/annotations.jar"), "changed".getBytes());
FileUtil.delete(new File(myOlderDir, "lib/bootstrap.jar"));
assertEquals(
new HashSet<ValidationResult>(Arrays.asList(
new ValidationResult(ValidationResult.Kind.CONFLICT,
"newDir/newFile.txt",
ValidationResult.Action.CREATE,
ValidationResult.ALREADY_EXISTS_MESSAGE,
ValidationResult.Option.REPLACE, ValidationResult.Option.KEEP),
new ValidationResult(ValidationResult.Kind.ERROR,
"Readme.txt",
ValidationResult.Action.UPDATE,
ValidationResult.MODIFIED_MESSAGE,
ValidationResult.Option.IGNORE),
new ValidationResult(ValidationResult.Kind.ERROR,
"lib/annotations.jar",
ValidationResult.Action.UPDATE,
ValidationResult.MODIFIED_MESSAGE,
ValidationResult.Option.IGNORE),
new ValidationResult(ValidationResult.Kind.ERROR,
"lib/bootstrap.jar",
ValidationResult.Action.UPDATE,
ValidationResult.ABSENT_MESSAGE,
ValidationResult.Option.IGNORE),
new ValidationResult(ValidationResult.Kind.CONFLICT,
"bin/idea.bat",
ValidationResult.Action.DELETE,
ValidationResult.MODIFIED_MESSAGE,
ValidationResult.Option.DELETE, ValidationResult.Option.KEEP))),
new HashSet<ValidationResult>(myPatch.validate(myOlderDir, TEST_UI)));
}
@Test
public void testValidationWithOptionalFiles() throws Exception {
FileUtil.writeToFile(new File(myOlderDir, "lib/annotations.jar"), "changed".getBytes());
assertEquals(new HashSet<ValidationResult>(Arrays.asList(
new ValidationResult(ValidationResult.Kind.ERROR,
"lib/annotations.jar",
ValidationResult.Action.UPDATE,
ValidationResult.MODIFIED_MESSAGE,
ValidationResult.Option.IGNORE))),
new HashSet<ValidationResult>(myPatch.validate(myOlderDir, TEST_UI)));
myPatch = new Patch(myOlderDir, myNewerDir, Collections.<String>emptyList(), Collections.<String>emptyList(),
Arrays.asList("lib/annotations.jar"), TEST_UI);
FileUtil.delete(new File(myOlderDir, "lib/annotations.jar"));
assertEquals(Collections.<ValidationResult>emptyList(),
myPatch.validate(myOlderDir, TEST_UI));
}
@Test
public void testValidatingNonAccessibleFiles() throws Exception {
File f = new File(myOlderDir, "Readme.txt");
FileOutputStream s = new FileOutputStream(f, true);
try {
FileLock lock = s.getChannel().lock();
try {
List<ValidationResult> result = myPatch.validate(myOlderDir, TEST_UI);
assertEquals(
new HashSet<ValidationResult>(Arrays.asList(
new ValidationResult(ValidationResult.Kind.ERROR,
"Readme.txt",
ValidationResult.Action.UPDATE,
ValidationResult.ACCESS_DENIED_MESSAGE,
ValidationResult.Option.IGNORE))),
new HashSet<ValidationResult>(result));
}
finally {
lock.release();
}
}
finally {
s.close();
}
}
@Test
public void testSaveLoad() throws Exception {
File f = getTempFile("file");
try {
FileOutputStream out = new FileOutputStream(f);
try {
myPatch.write(out);
}
finally {
out.close();
}
FileInputStream in = new FileInputStream(f);
try {
assertEquals(myPatch.getActions(), new Patch(in).getActions());
}
finally {
in.close();
}
}
finally {
f.delete();
}
}
private static final Comparator<PatchAction> COMPARATOR = new Comparator<PatchAction>() {
@Override
public int compare(PatchAction o1, PatchAction o2) {
return o1.toString().compareTo(o2.toString());
}
};
}