blob: a6575478885fd0f79e0c82455d9c65a3bcb3f308 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 org.jetbrains.jps.incremental.artifacts;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.util.PathUtil;
import org.jetbrains.jps.model.artifact.JpsArtifact;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import static com.intellij.util.io.TestFileSystemBuilder.fs;
import static org.jetbrains.jps.incremental.artifacts.LayoutElementTestUtil.root;
/**
* @author nik
*/
public class ArtifactBuilderOverwriteTest extends ArtifactBuilderTestCase {
public void testOverwriteArchives() {
final String aFile = createFile("aaa.txt", "a");
final String bFile = createFile("bbb.txt", "b");
final JpsArtifact a = addArtifact(
root()
.archive("x.jar").fileCopy(aFile).end()
.archive("x.jar")
.fileCopy(bFile));
buildAll();
assertOutput(a, fs()
.archive("x.jar")
.file("aaa.txt", "a")
);
buildAllAndAssertUpToDate();
change(aFile, "a2");
buildAll();
assertDeletedAndCopied("out/artifacts/a/x.jar", "aaa.txt");
assertOutput(a, fs().archive("x.jar").file("aaa.txt", "a2"));
buildAllAndAssertUpToDate();
change(bFile, "b2");
buildAllAndAssertUpToDate();
delete(bFile);
buildAllAndAssertUpToDate();
}
public void testOverwriteNestedArchive() {
final String cFile = createFile("c.txt", "c");
final String eFile = createFile("e.txt", "e");
final JpsArtifact a = addArtifact(
root()
.archive("a.jar").archive("b.jar").fileCopy(cFile).end().end()
.archive("a.jar").archive("d.jar").fileCopy(eFile));
buildAll();
assertOutput(a, fs().archive("a.jar").archive("b.jar").file("c.txt", "c"));
buildAllAndAssertUpToDate();
change(eFile, "e2");
buildAllAndAssertUpToDate();
change(cFile, "c2");
buildAll();
assertDeletedAndCopied("out/artifacts/a/a.jar", "c.txt");
assertOutput(a, fs().archive("a.jar").archive("b.jar").file("c.txt", "c2"));
buildAllAndAssertUpToDate();
delete(eFile);
buildAllAndAssertUpToDate();
}
public void testOverwriteFileByArchive() {
final String xFile = createFile("x.txt", "1");
final String jarFile = createFile("lib/junit.jar", "123");
JpsArtifact a = addArtifact(root()
.archive("junit.jar").fileCopy(xFile).end().parentDirCopy(jarFile));
buildAll();
assertOutput(a, fs().archive("junit.jar").file("x.txt", "1"));
buildAllAndAssertUpToDate();
change(xFile, "2");
buildAll();
assertDeletedAndCopied("out/artifacts/a/junit.jar", "x.txt");
assertOutput(a, fs().archive("junit.jar").file("x.txt", "2"));
buildAllAndAssertUpToDate();
change(jarFile, "321");
buildAllAndAssertUpToDate();
delete(jarFile);
buildAllAndAssertUpToDate();
}
public void testOverwriteArchiveByFile() {
final String xFile = createFile("d/x.txt", "1");
final String jarFile = createFile("lib/jdom.jar", "123");
JpsArtifact a = addArtifact(root().parentDirCopy(jarFile)
.archive("jdom.jar").parentDirCopy(xFile));
buildAll();
assertOutput(a, fs().file("jdom.jar", "123"));
buildAllAndAssertUpToDate();
change(xFile, "2");
buildAllAndAssertUpToDate();
change(jarFile, "321");
buildAll();
assertDeletedAndCopied("out/artifacts/a/jdom.jar", "lib/jdom.jar");
assertOutput(a, fs().file("jdom.jar", "321"));
buildAllAndAssertUpToDate();
delete(xFile);
buildAllAndAssertUpToDate();
}
public void testOverwriteCopiedFileByExtracted() {
String jar = createArchive("x.jar", "x.txt", "1");
String file = createFile("x.txt", "2");
JpsArtifact a = addArtifact(root().extractedDir(jar, "").fileCopy(file));
buildAll();
assertOutput(a, fs().file("x.txt", "1"));
buildAllAndAssertUpToDate();
change(file, "3");
buildAllAndAssertUpToDate();
assertOutput(a, fs().file("x.txt", "1"));
delete(jar);
createArchive("x.jar", "x.txt", "4");
buildAll();
assertOutput(a, fs().file("x.txt", "4"));
delete(jar);
buildAll();
assertOutput(a, fs().file("x.txt", "3"));
}
public void testOverwriteExtractedFileByCopied() {
String file = createFile("x.txt", "1");
String jar = createArchive("x.jar", "x.txt", "2");
JpsArtifact a = addArtifact(root().fileCopy(file).extractedDir(jar, ""));
buildAll();
assertOutput(a, fs().file("x.txt", "1"));
buildAllAndAssertUpToDate();
delete(jar);
createArchive("x.jar", "x.txt", "3");
buildAll();
assertOutput(a, fs().file("x.txt", "1"));
delete(file);
buildAll();
assertOutput(a, fs().file("x.txt", "3"));
}
private String createArchive(String relativeArchivePath, String fileNameInArchive, String text) {
try {
File file = new File(getOrCreateProjectDir(), relativeArchivePath);
ZipOutputStream output = new ZipOutputStream(new FileOutputStream(file));
try {
output.putNextEntry(new ZipEntry(fileNameInArchive));
output.write(text.getBytes(CharsetToolkit.UTF8));
output.closeEntry();
}
finally {
output.close();
}
return FileUtil.toSystemIndependentName(file.getAbsolutePath());
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
public void testFileOrder() {
final String firstFile = createFile("d1/xxx.txt", "first");
final String secondFile = createFile("d2/xxx.txt", "second");
final String fooFile = createFile("d3/xxx.txt", "foo");
final JpsArtifact a = addArtifact(
root().dir("ddd")
.dirCopy(PathUtil.getParentPath(firstFile))
.dirCopy(PathUtil.getParentPath(fooFile)).parentDirCopy(secondFile).end()
);
buildAll();
assertOutput(a, fs().dir("ddd").file("xxx.txt", "first"));
buildAllAndAssertUpToDate();
change(firstFile, "first2");
buildAll();
assertDeletedAndCopied("out/artifacts/a/ddd/xxx.txt", "d1/xxx.txt");
assertOutput(a, fs().dir("ddd").file("xxx.txt", "first2"));
buildAllAndAssertUpToDate();
change(secondFile);
buildAllAndAssertUpToDate();
change(fooFile);
buildAllAndAssertUpToDate();
delete(fooFile);
buildAllAndAssertUpToDate();
delete(secondFile);
buildAllAndAssertUpToDate();
}
public void testDeleteOverwritingFiles() {
final String firstFile = createFile("d1/xxx.txt", "1");
final String secondFile = createFile("d2/xxx.txt", "2");
final JpsArtifact a = addArtifact("a",
root().dir("ddd").dirCopy(PathUtil.getParentPath(firstFile)).parentDirCopy(secondFile).fileCopy(createFile("y.txt"))
);
buildAll();
assertOutput(a, fs().dir("ddd").file("xxx.txt", "1").file("y.txt"));
delete(firstFile);
buildAll();
assertDeletedAndCopied("out/artifacts/a/ddd/xxx.txt", "d2/xxx.txt");
assertOutput(a, fs().dir("ddd").file("xxx.txt", "2").file("y.txt"));
buildAllAndAssertUpToDate();
delete(secondFile);
buildAll();
assertDeleted("out/artifacts/a/ddd/xxx.txt");
assertOutput(a, fs().dir("ddd").file("y.txt"));
}
public void testUpdateManifest() {
final String manifestText1 = "Manifest-Version: 1.0\r\nMain-Class: A\r\n\r\n";
final String manifest = createFile("d/MANIFEST.MF", manifestText1);
final JpsArtifact a = addArtifact("a", root().archive("a.jar").dir("META-INF").parentDirCopy(manifest).fileCopy(createFile("a.txt")));
buildAll();
assertOutput(a, fs().archive("a.jar").dir("META-INF").file("MANIFEST.MF", manifestText1).file("a.txt"));
final String manifestText2 = "Manifest-Version: 1.0\r\nMain-Class: B\r\n\r\n";
change(manifest, manifestText2);
buildAll();
assertDeletedAndCopied("out/artifacts/a/a.jar", "d/MANIFEST.MF", "a.txt");
assertOutput(a, fs().archive("a.jar").dir("META-INF").file("MANIFEST.MF", manifestText2).file("a.txt"));
buildAllAndAssertUpToDate();
delete(manifest);
buildAll();
assertDeletedAndCopied("out/artifacts/a/a.jar", "a.txt");
assertOutput(a, fs().archive("a.jar").dir("META-INF").file("a.txt"));
}
}