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 }