View Javadoc

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); // there's only one..
71          assertEquals("source1.jar", destdir.listFiles()[0].getName()); // ..and it's not randomfile.txt
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             // not sure why this is necessary...
110             child.setLastModified(entry.getTime());
111         }
112         zout.close();
113     }
114 }