1 package com.atlassian.plugin.util.zip;
2
3 import com.atlassian.plugin.test.PluginTestUtils;
4 import junit.framework.TestCase;
5 import org.apache.commons.io.FileUtils;
6 import org.apache.commons.io.IOUtils;
7
8 import java.io.File;
9 import java.io.FileInputStream;
10 import java.io.FileOutputStream;
11 import java.io.IOException;
12 import java.util.zip.ZipEntry;
13 import java.util.zip.ZipOutputStream;
14
15 public class TestUrlUnzipper extends TestCase
16 {
17
18 private File basedir;
19 private File destdir;
20 private File zip;
21 private File sourcedir;
22 private File source1;
23
24 @Override
25 protected void setUp() throws Exception {
26 basedir = PluginTestUtils.createTempDirectory(TestUrlUnzipper.class);
27 FileUtils.cleanDirectory(basedir);
28 destdir = new File(basedir, "dest");
29 destdir.mkdir();
30 zip = new File(basedir, "test.zip");
31 sourcedir = new File(basedir, "source");
32 sourcedir.mkdir();
33 source1 = new File(sourcedir, "source1.jar");
34 FileUtils.writeStringToFile(source1, "source1");
35 source1.setLastModified(source1.lastModified() - 100000);
36 }
37
38 @Override
39 protected void tearDown() throws Exception {
40 }
41
42 public void testConditionalUnzip() throws IOException, InterruptedException {
43 zip(sourcedir, zip);
44 UrlUnzipper unzipper = new UrlUnzipper(zip.toURL(), destdir);
45 unzipper.conditionalUnzip();
46
47 assertEquals(1, destdir.listFiles().length);
48 File dest1 = destdir.listFiles()[0];
49 assertEquals(source1.lastModified(), dest1.lastModified());
50 assertEquals("source1", FileUtils.readFileToString(dest1));
51
52 FileUtils.writeStringToFile(source1, "source1-modified");
53 zip(sourcedir, zip);
54 unzipper = new UrlUnzipper(zip.toURL(), destdir);
55 unzipper.conditionalUnzip();
56
57 assertEquals(1, destdir.listFiles().length);
58 dest1 = destdir.listFiles()[0];
59 assertEquals(source1.lastModified(), dest1.lastModified());
60 assertEquals("source1-modified", FileUtils.readFileToString(dest1));
61
62 }
63
64 public void testConditionalUnzipCleansZipDirectory() throws IOException, InterruptedException
65 {
66 File f = new File(destdir, "bogusfile.txt");
67 zip(sourcedir, zip);
68 UrlUnzipper unzipper = new UrlUnzipper(zip.toURL(), destdir);
69 unzipper.conditionalUnzip();
70 assertEquals(1, destdir.listFiles().length);
71 assertEquals("source1.jar", destdir.listFiles()[0].getName());
72 }
73
74 public void testConditionalUnzipWithNoUnzipIfNoFileMod() throws IOException, InterruptedException {
75 zip(sourcedir, zip);
76 UrlUnzipper unzipper = new UrlUnzipper(zip.toURL(), destdir);
77 unzipper.conditionalUnzip();
78
79 assertEquals(1, destdir.listFiles().length);
80 File dest1 = destdir.listFiles()[0];
81 assertEquals(source1.lastModified(), dest1.lastModified());
82 assertEquals("source1", FileUtils.readFileToString(dest1));
83
84 long ts = source1.lastModified();
85 FileUtils.writeStringToFile(source1, "source1-modified");
86 source1.setLastModified(ts);
87 zip(sourcedir, zip);
88 unzipper = new UrlUnzipper(zip.toURL(), destdir);
89 unzipper.conditionalUnzip();
90
91 assertEquals(1, destdir.listFiles().length);
92 dest1 = destdir.listFiles()[0];
93 assertEquals(source1.lastModified(), dest1.lastModified());
94 assertEquals("source1", FileUtils.readFileToString(dest1));
95
96 }
97
98 private void zip(File basedir, File destfile) throws IOException {
99 ZipOutputStream zout = new ZipOutputStream(new FileOutputStream(destfile));
100 for (File child : basedir.listFiles())
101 {
102 ZipEntry entry = new ZipEntry(child.getName());
103 entry.setTime(child.lastModified());
104 zout.putNextEntry(entry);
105 FileInputStream input = new FileInputStream(child);
106 IOUtils.copy(input, zout);
107 input.close();
108
109
110 child.setLastModified(entry.getTime());
111 }
112 zout.close();
113 }
114 }