package org.ovirt.engine.core.utils.archivers.tar;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.util.Arrays;
import org.apache.commons.lang.SystemUtils;
import org.junit.Test;
public class TarTest {
private void writeFile(File file, String content, boolean executable) throws IOException {
File f = file.getParentFile();
if (f == null) {
throw new IOException("File not found " + f);
}
if (!f.mkdirs()) {
// void
}
try (OutputStream os = new FileOutputStream(file)) {
os.write(content.getBytes("UTF-8"));
file.setExecutable(executable);
}
}
private void digestDirectory(MessageDigest md, File base, File file) throws Exception {
File fullFile = new File(base, file.getPath());
md.update(file.getPath().getBytes("UTF-8"));
if (fullFile.isDirectory()) {
String[] files = fullFile.list();
Arrays.sort(files);
for (String f : files) {
digestDirectory(md, base, new File(file, f));
}
}
else {
MessageDigest fmd = MessageDigest.getInstance(md.getAlgorithm());
try (InputStream fis = new FileInputStream(fullFile);
InputStream is = new DigestInputStream(fis, fmd)) {
byte[] buf = new byte[1024];
int n;
while ((n = is.read(buf)) != -1) {
// do nothing
}
md.update(fmd.digest());
}
}
}
@Test
public void testSimple() throws Exception {
assumeTrue(SystemUtils.IS_OS_UNIX);
File tmpTar = null;
File tmpDir1 = null;
File tmpDir2 = null;
try {
tmpTar = File.createTempFile("test1", "tar");
tmpDir1 = File.createTempFile("test1", "tmp");
if (!tmpDir1.delete()) {
throw new IOException("Cannot delete " + tmpDir1);
}
if (!tmpDir1.mkdir()) {
throw new IOException("Cannot create " + tmpDir1);
}
tmpDir2 = File.createTempFile("test1", "tmp");
if (!tmpDir2.delete()) {
throw new IOException("Cannot delete " + tmpDir2);
}
if (!tmpDir2.mkdir()) {
throw new IOException("Cannot create " + tmpDir2);
}
writeFile(new File(tmpDir1, "script1"), "script1", true);
writeFile(new File(tmpDir1, "script2"), "script2", true);
writeFile(new File(tmpDir1, "file1"), "file1", false);
writeFile(new File(tmpDir1, "file2"), "file2", false);
writeFile(new File(tmpDir1, "dir1/file3"), "file2", false);
writeFile(new File(tmpDir1, "dir1/dir2/file4"), "file4", false);
try (OutputStream os = new FileOutputStream(tmpTar)) {
Tar.doTar(os, tmpDir1);
}
new ProcessBuilder("tar", "-C", tmpDir2.getPath(), "-xf", tmpTar.getPath()).start().waitFor();
MessageDigest md1 = MessageDigest.getInstance("SHA");
MessageDigest md2 = MessageDigest.getInstance("SHA");
digestDirectory(md1, tmpDir1, new File("."));
digestDirectory(md2, tmpDir2, new File("."));
assertArrayEquals(md1.digest(), md2.digest());
assertTrue(new File(tmpDir2, "script1").canExecute());
assertFalse(new File(tmpDir2, "file1").canExecute());
}
finally {
for (File file : new File[] {tmpDir1, tmpDir2, tmpTar}) {
if (file != null) {
if (!file.delete()) {
// void
}
}
}
}
}
@Test(expected=FileNotFoundException.class)
public void testNoBase() throws IOException {
Tar.doTar(new ByteArrayOutputStream(), new File("/asdasdsadasdasdsa"));
}
}