1   package com.atlassian.plugin.osgi.factory.transform;
2   
3   import com.atlassian.plugin.PluginAccessor;
4   import com.atlassian.plugin.JarPluginArtifact;
5   import com.atlassian.plugin.osgi.hostcomponents.HostComponentRegistration;
6   import com.atlassian.plugin.osgi.container.impl.DefaultOsgiPersistentCache;
7   import com.atlassian.plugin.osgi.factory.transform.model.SystemExports;
8   import com.atlassian.plugin.test.PluginJarBuilder;
9   import com.atlassian.plugin.test.PluginTestUtils;
10  
11  import org.osgi.framework.Constants;
12  
13  import java.io.File;
14  import java.io.IOException;
15  import java.net.URISyntaxException;
16  import java.util.ArrayList;
17  import java.util.HashMap;
18  import java.util.Map;
19  import java.util.jar.Attributes;
20  import java.util.jar.JarFile;
21  import java.util.zip.ZipEntry;
22  import java.util.zip.ZipFile;
23  
24  import junit.framework.TestCase;
25  
26  public class TestDefaultPluginTransformer extends TestCase
27  {
28      private DefaultPluginTransformer transformer;
29      private File tmpDir;
30  
31      @Override
32      protected void setUp() throws Exception
33      {
34          super.setUp();
35          tmpDir = PluginTestUtils.createTempDirectory("plugin-transformer");
36          transformer = new DefaultPluginTransformer(new DefaultOsgiPersistentCache(tmpDir), SystemExports.NONE, null, PluginAccessor.Descriptor.FILENAME);
37      }
38  
39      @Override
40      protected void tearDown() throws Exception
41      {
42          super.tearDown();
43          tmpDir = null;
44          transformer = null;
45      }
46  
47      public void testAddFilesToZip() throws URISyntaxException, IOException
48      {
49          final File file = PluginTestUtils.getFileForResource("myapp-1.0-plugin.jar");
50  
51          final Map<String, byte[]> files = new HashMap<String, byte[]>()
52          {
53              {
54                  put("foo", "bar".getBytes());
55              }
56          };
57          final File copy = transformer.addFilesToExistingZip(file, files);
58          assertNotNull(copy);
59          assertTrue(!copy.getName().equals(file.getName()));
60          assertTrue(copy.length() != file.length());
61  
62          final ZipFile zip = new ZipFile(copy);
63          final ZipEntry entry = zip.getEntry("foo");
64          assertNotNull(entry);
65      }
66  
67      public void testTransform() throws Exception
68      {
69          final File file = new PluginJarBuilder()
70                  .addFormattedJava("my.Foo",
71                          "package my;",
72                          "public class Foo {",
73                          "  com.atlassian.plugin.osgi.factory.transform.Fooable bar;",
74                          "}")
75                  .addPluginInformation("foo", "foo", "1.1")
76                  .build();
77  
78          final File copy = transformer.transform(new JarPluginArtifact(file), new ArrayList<HostComponentRegistration>()
79          {
80              {
81                  add(new StubHostComponentRegistration(Fooable.class));
82              }
83          });
84  
85          assertNotNull(copy);
86          assertTrue(copy.getName().contains(String.valueOf(file.lastModified())));
87          assertTrue(copy.getName().endsWith(".jar"));
88          assertEquals(tmpDir.getAbsolutePath(), copy.getParentFile().getParentFile().getAbsolutePath());
89          final JarFile jar = new JarFile(copy);
90          final Attributes attrs = jar.getManifest().getMainAttributes();
91  
92          assertEquals("1.1", attrs.getValue(Constants.BUNDLE_VERSION));
93  
94          assertNotNull(jar.getEntry("META-INF/spring/atlassian-plugins-host-components.xml"));
95      }
96  
97      public void testGenerateCacheName() throws IOException
98      {
99          File tmp = File.createTempFile("asdf", ".jar", tmpDir);
100         assertTrue(DefaultPluginTransformer.generateCacheName(tmp).endsWith(".jar"));
101         tmp = File.createTempFile("asdf", "asdf", tmpDir);
102         assertTrue(DefaultPluginTransformer.generateCacheName(tmp).endsWith(String.valueOf(tmp.lastModified())));
103 
104         tmp = File.createTempFile("asdf", "asdf.", tmpDir);
105         assertTrue(DefaultPluginTransformer.generateCacheName(tmp).endsWith(String.valueOf(tmp.lastModified())));
106 
107         tmp = File.createTempFile("asdf", "asdf.s", tmpDir);
108         assertTrue(DefaultPluginTransformer.generateCacheName(tmp).endsWith(String.valueOf(".s")));
109 
110     }
111 
112 }