1212import java .io .FileInputStream ;
1313import java .io .FileOutputStream ;
1414import java .io .IOException ;
15+ import java .nio .file .Files ;
16+ import java .nio .file .Path ;
1517import java .util .zip .GZIPInputStream ;
1618
1719import static java .util .Arrays .asList ;
18- import static org .hamcrest .CoreMatchers .equalTo ;
1920import static org .hamcrest .CoreMatchers .is ;
2021import static org .hamcrest .MatcherAssert .assertThat ;
2122
@@ -26,9 +27,11 @@ public void testExecutableFlagIsPreserved() throws Exception {
2627 File executableFile = createExecutableFile ();
2728 File archive = CompressArchiveUtil .archiveTARFiles (executableFile .getParentFile (), asList (executableFile ),
2829 "archive" );
29- File expectedFile = extractFileByName (archive , "executableFile.sh.result" );
30+ File expectedFile = extractFileByName (archive , "executableFile.sh" , "executableFile.sh .result" );
3031
3132 assertThat ("should be executable" , expectedFile .canExecute ());
33+ expectedFile .delete ();
34+ archive .delete ();
3235 }
3336
3437 private File createExecutableFile () throws IOException {
@@ -40,25 +43,64 @@ private File createExecutableFile() throws IOException {
4043 return executableFile ;
4144 }
4245
43- private File extractFileByName (File archive , String filenameToExtract ) throws IOException {
46+ private File extractFileByName (File archive , String filenameToExtract , String outputName ) throws IOException {
4447 File baseDir = new File (FileUtils .getTempDirectoryPath ());
45- File expectedFile = new File (baseDir , filenameToExtract );
48+ File expectedFile = new File (baseDir , outputName );
4649 expectedFile .delete ();
4750 assertThat (expectedFile .exists (), is (false ));
4851
4952 TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream (new GZIPInputStream (
5053 new BufferedInputStream (new FileInputStream (archive ))));
5154 TarArchiveEntry entry ;
55+ boolean found = false ;
5256 while ((entry = tarArchiveInputStream .getNextTarEntry ()) != null ) {
5357 String individualFiles = entry .getName ();
54- // there should be only one file in this archive
55- assertThat (individualFiles , equalTo ("executableFile.sh" ));
56- IOUtils .copy (tarArchiveInputStream , new FileOutputStream (expectedFile ));
57- if ((entry .getMode () & 0755 ) == 0755 ) {
58- expectedFile .setExecutable (true );
58+ if (individualFiles .equals (filenameToExtract ) || individualFiles .endsWith ("/" + filenameToExtract )) {
59+ found = true ;
60+ IOUtils .copy (tarArchiveInputStream , new FileOutputStream (expectedFile ));
61+ if ((entry .getMode () & 0755 ) == 0755 ) {
62+ expectedFile .setExecutable (true );
63+ }
64+ break ;
5965 }
6066 }
67+ assertThat ("should extracted the file" , found );
6168 tarArchiveInputStream .close ();
6269 return expectedFile ;
6370 }
71+
72+ @ Test
73+ public void testSymbolicLinkDir () throws IOException {
74+ Path uploadDir = Files .createTempDirectory ("upload" );
75+ Path linkTarget = Files .createTempDirectory ("ink-target" );
76+ Path tmpFile = Files .createTempFile (linkTarget , "link-dir" , "rand" );
77+ Files .createSymbolicLink (uploadDir .resolve ("link-folder" ), linkTarget );
78+ Path tarGzFile = Files .createTempFile ("docker-java" , ".tar.gz" );
79+ //follow link only works for childrenOnly=false
80+ CompressArchiveUtil .tar (uploadDir , tarGzFile , true , false );
81+ File expectedFile = extractFileByName (tarGzFile .toFile (), tmpFile .toFile ().getName (), "foo1" );
82+ assertThat (expectedFile .canRead (), is (true ));
83+ uploadDir .toFile ().delete ();
84+ linkTarget .toFile ().delete ();
85+ tarGzFile .toFile ().delete ();
86+ }
87+
88+ @ Test
89+ public void testSymbolicLinkFile () throws IOException {
90+ Path uploadDir = Files .createTempDirectory ("upload" );
91+ Path tmpFile = Files .createTempFile ("src" , "" );
92+ Files .createSymbolicLink (uploadDir .resolve ("link-file" ), tmpFile );
93+ Path tarGzFile = Files .createTempFile ("docker-java" , ".tar.gz" );
94+ boolean childrenOnly = false ;
95+ CompressArchiveUtil .tar (uploadDir , tarGzFile , true , childrenOnly );
96+ File expectedFile = extractFileByName (tarGzFile .toFile (), "link-file" , "foo1" );
97+ assertThat (expectedFile .canRead (), is (true ));
98+ childrenOnly = true ;
99+ CompressArchiveUtil .tar (uploadDir , tarGzFile , true , childrenOnly );
100+ extractFileByName (tarGzFile .toFile (), "link-file" , "foo1" );
101+ assertThat (expectedFile .canRead (), is (true ));
102+ uploadDir .toFile ().delete ();
103+ tmpFile .toFile ().delete ();
104+ tarGzFile .toFile ().delete ();
105+ }
64106}
0 commit comments