View Javadoc

1   package com.atlassian.core.util.zip;
2   
3   import java.io.File;
4   import java.io.IOException;
5   import java.io.OutputStream;
6   
7   import com.google.common.base.Charsets;
8   
9   import org.apache.commons.io.FileUtils;
10  import org.apache.commons.io.IOUtils;
11  import org.junit.Rule;
12  import org.junit.Test;
13  import org.junit.rules.TemporaryFolder;
14  
15  import static com.atlassian.core.util.zip.ZipMatchers.hasEntry;
16  import static com.atlassian.core.util.zip.ZipMatchers.hasEntryWithName;
17  import static org.hamcrest.MatcherAssert.assertThat;
18  import static org.hamcrest.core.AllOf.allOf;
19  
20  public class TestZipArchiver
21  {
22  
23      @Rule
24      public TemporaryFolder temporaryFolder = new TemporaryFolder();
25  
26      @Test
27      public void testAppendMultipleDirectories() throws Exception
28      {
29          final File folderToCompress1 = temporaryFolder.newFolder("folderToCompress1");
30          addFileToFolder("name1", "Content1", folderToCompress1);
31          addFileToFolder("name2", "Content2", folderToCompress1);
32  
33          final File folderToCompress2 = temporaryFolder.newFolder("folderToCompress2");
34          addFileToFolder("second_name1", "SecondContent1", folderToCompress2);
35          addFileToFolder("second_name2", "SecondContent2", folderToCompress2);
36  
37          final File archiveFile = temporaryFolder.newFile("testArchive.zip");
38          final ZipArchiver zipArchiver = new ZipArchiver(archiveFile);
39  
40          zipArchiver.addFolder(folderToCompress1, "firstDirectory");
41          zipArchiver.addFolder(folderToCompress2, ArchiveParams.builder()
42                  .withArchiveFolderName("secondDirectory")
43                  .build());
44          zipArchiver.close();
45  
46          assertThat(archiveFile, allOf(
47                  hasEntry("firstDirectory/name1", "Content1"),
48                  hasEntry("firstDirectory/name2", "Content2"),
49                  hasEntry("secondDirectory/second_name1", "SecondContent1"),
50                  hasEntry("secondDirectory/second_name2", "SecondContent2")
51          ));
52      }
53  
54      @Test
55      public void testCompressEmptyFolderStructure() throws Exception
56      {
57          final File rootToCompress = temporaryFolder.newFolder("folderToCompress1");
58          final File child = new File(rootToCompress, "child");
59          final File grandChild = new File(child, "grandchild");
60  
61          child.mkdir();
62          grandChild.mkdir();
63  
64          final File archiveFile = temporaryFolder.newFile("testArchive.zip");
65          final ZipArchiver zipArchiver = new ZipArchiver(archiveFile);
66  
67          zipArchiver.addFolder(rootToCompress, "root");
68          zipArchiver.close();
69  
70          assertThat(archiveFile, allOf(
71                  hasEntryWithName("root/"),
72                  hasEntryWithName("root/child/"),
73                  hasEntryWithName("root/child/grandchild/")
74                  ));
75      }
76  
77      @Test
78      public void testAppendMultipleFiles() throws Exception
79      {
80          final File firstFile = temporaryFolder.newFile();
81          FileUtils.writeByteArrayToFile(firstFile, "FirstFileContent".getBytes("UTF-8"));
82  
83          final File secondFile = temporaryFolder.newFile();
84          FileUtils.writeByteArrayToFile(secondFile, "SecondFileContent".getBytes("UTF-8"));
85  
86          final File archiveFile = temporaryFolder.newFile("testArchive.zip");
87          final ZipArchiver zipArchiver = new ZipArchiver(archiveFile);
88  
89          zipArchiver.addFile(firstFile, "firstFilePath");
90          zipArchiver.addFile(secondFile, "secondFilePath");
91          zipArchiver.close();
92  
93          assertThat(archiveFile, allOf(
94                  hasEntry("firstFilePath", "FirstFileContent"),
95                  hasEntry("secondFilePath", "SecondFileContent")));
96      }
97  
98      @Test
99      public void testAppendMultipleEntriesFromStream() throws Exception
100     {
101         final File archiveFile = temporaryFolder.newFile("testArchive.zip");
102         final ZipArchiver zipArchiver = new ZipArchiver(archiveFile);
103 
104         zipArchiver.addEntry(IOUtils.toInputStream("FirstEntryContent", "UTF-8"), "firstEntry");
105         zipArchiver.addEntry(IOUtils.toInputStream("SecondEntryContent", "UTF-8"), "secondEntry");
106         zipArchiver.close();
107 
108         assertThat(archiveFile, allOf(
109                 hasEntry("firstEntry", "FirstEntryContent"),
110                 hasEntry("secondEntry", "SecondEntryContent")));
111     }
112 
113     @Test
114     public void testAppendMultipleEntriesViaReturnedEntryOutputStream() throws Exception
115     {
116         final File archiveFile = temporaryFolder.newFile("testArchive.zip");
117         final ZipArchiver zipArchiver = new ZipArchiver(archiveFile);
118 
119         final OutputStream firstEntryContentStream = zipArchiver.addNextEntry("firstEntry");
120         IOUtils.copy(IOUtils.toInputStream("FirstEntryContent", "UTF-8"), firstEntryContentStream);
121 
122         final OutputStream secondEntryContentStream = zipArchiver.addNextEntry("secondEntry");
123         IOUtils.copy(IOUtils.toInputStream("SecondEntryContent", "UTF-8"), secondEntryContentStream);
124 
125         zipArchiver.close();
126 
127         assertThat(archiveFile, allOf(
128                 hasEntry("firstEntry", "FirstEntryContent"),
129                 hasEntry("secondEntry", "SecondEntryContent")));
130     }
131 
132     private void addFileToFolder(final String newFileName, final String content, final File folder)
133             throws IOException
134     {
135         final File file = new File(folder, newFileName);
136         FileUtils.writeByteArrayToFile(file, content.getBytes(Charsets.UTF_8));
137     }
138 }