package com.github.dockerjava.core; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.GZIPInputStream; import com.github.dockerjava.core.util.CompressArchiveUtil; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.testng.annotations.Test; public class CompressArchiveUtilTest { @Test public void testExecutableFlagIsPreserved() throws Exception { File executableFile = createExecutableFile(); File archive = CompressArchiveUtil.archiveTARFiles(executableFile.getParentFile(), asList(executableFile), "archive"); File expectedFile = extractFileByName(archive, "executableFile.sh.result"); assertThat("should be executable", expectedFile.canExecute()); } private File createExecutableFile() throws IOException { File baseDir = new File(FileUtils.getTempDirectoryPath()); File executableFile = new File(baseDir, "executableFile.sh"); executableFile.createNewFile(); executableFile.setExecutable(true); assertThat(executableFile.canExecute(), is(true)); return executableFile; } private File extractFileByName(File archive, String filenameToExtract) throws IOException { File baseDir = new File(FileUtils.getTempDirectoryPath()); File expectedFile = new File(baseDir, filenameToExtract); expectedFile.delete(); assertThat(expectedFile.exists(), is(false)); TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(new GZIPInputStream( new BufferedInputStream(new FileInputStream(archive)))); TarArchiveEntry entry; while ((entry = tarArchiveInputStream.getNextTarEntry()) != null) { String individualFiles = entry.getName(); // there should be only one file in this archive assertThat(individualFiles, equalTo("executableFile.sh")); IOUtils.copy(tarArchiveInputStream, new FileOutputStream(expectedFile)); if ((entry.getMode() & 0755) == 0755) { expectedFile.setExecutable(true); } } tarArchiveInputStream.close(); return expectedFile; } }