Author: davidb
Date: Mon Sep 17 16:55:03 2012
New Revision: 1386716

URL: http://svn.apache.org/viewvc?rev=1386716&view=rev
Log:
Add some tests to the static weaving code.

Added:
    
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/ConsumerTest.java
    
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/
    
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/Test2Class.java
    
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/TestClass.java
Modified:
    
aries/trunk/spi-fly/spi-fly-static-tool/src/main/java/org/apache/aries/spifly/statictool/Main.java
    
aries/trunk/spi-fly/spi-fly-weaver/src/main/java/org/apache/aries/spifly/weaver/TCCLSetterVisitor.java

Modified: 
aries/trunk/spi-fly/spi-fly-static-tool/src/main/java/org/apache/aries/spifly/statictool/Main.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-static-tool/src/main/java/org/apache/aries/spifly/statictool/Main.java?rev=1386716&r1=1386715&r2=1386716&view=diff
==============================================================================
--- 
aries/trunk/spi-fly/spi-fly-static-tool/src/main/java/org/apache/aries/spifly/statictool/Main.java
 (original)
+++ 
aries/trunk/spi-fly/spi-fly-static-tool/src/main/java/org/apache/aries/spifly/statictool/Main.java
 Mon Sep 17 16:55:03 2012
@@ -41,7 +41,6 @@ import org.apache.aries.spifly.WeavingDa
 import org.apache.aries.spifly.api.SpiFlyConstants;
 import org.apache.aries.spifly.weaver.TCCLSetterVisitor;
 import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
 import org.osgi.framework.Constants;
 import org.osgi.framework.Version;
@@ -81,6 +80,11 @@ public class Main {
         File tempDir = new File(System.getProperty("java.io.tmpdir") + 
File.separator + jarFile.getName() + "_" + System.currentTimeMillis());
         Manifest manifest = unJar(jarFile, tempDir);
         String consumerHeader = 
manifest.getMainAttributes().getValue(SpiFlyConstants.SPI_CONSUMER_HEADER);
+//        if (consumerHeader == null) {
+//            String reqCap = 
manifest.getMainAttributes().getValue(SpiFlyConstants.REQUIRE_CAPABILITY);
+//            sdasda
+//        }
+
         if (consumerHeader != null) {
             String bcp = 
manifest.getMainAttributes().getValue(Constants.BUNDLE_CLASSPATH);
             weaveDir(tempDir, consumerHeader, bcp);
@@ -107,8 +111,12 @@ public class Main {
         Version maxVersion = new Version(osgiVersion.getMajor(), 
osgiVersion.getMinor() + 1, 0);
 
         String ip = manifest.getMainAttributes().getValue(IMPORT_PACKAGE);
+        if (ip == null)
+            ip = "";
+
         StringBuilder sb = new StringBuilder(ip);
-        sb.append(",");
+        if (ip.length() > 0)
+            sb.append(",");
         sb.append(Util.class.getPackage().getName());
         sb.append(";version=\"[");
         sb.append(minVersion);
@@ -140,6 +148,9 @@ public class Main {
     }
 
     private static void weaveDir(File dir, String consumerHeader, String 
bundleClassPath) throws Exception {
+        // TODO support Require-Capability in addition to SPI-Consumer
+        Set<WeavingData> wd = 
ConsumerHeaderProcessor.processHeader(SpiFlyConstants.SPI_CONSUMER_HEADER, 
consumerHeader);
+
         String dirName = dir.getAbsolutePath();
 
         DirTree dt = new DirTree(dir);
@@ -153,16 +164,19 @@ public class Main {
             className = className.substring(0, className.length() - 
".class".length());
             className = className.replace(File.separator, ".");
 
-            // TODO support Require-Capability in addition to SPI-Consumer
-            Set<WeavingData> wd = 
ConsumerHeaderProcessor.processHeader(SpiFlyConstants.SPI_CONSUMER_HEADER, 
consumerHeader);
             InputStream is = new FileInputStream(f);
             byte[] b;
             try {
                 ClassReader cr = new ClassReader(is);
                 ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | 
ClassWriter.COMPUTE_FRAMES);
-                ClassVisitor cv = new TCCLSetterVisitor(cw, className, wd);
+                TCCLSetterVisitor cv = new TCCLSetterVisitor(cw, className, 
wd);
                 cr.accept(cv, ClassReader.SKIP_FRAMES);
-                b = cw.toByteArray();
+                if (cv.isWoven()) {
+                    b = cw.toByteArray();
+                } else {
+                    // if not woven, store the original bytes
+                    b = Streams.suck(new FileInputStream(f));
+                }
             } finally {
                 is.close();
             }

Added: 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/ConsumerTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/ConsumerTest.java?rev=1386716&view=auto
==============================================================================
--- 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/ConsumerTest.java
 (added)
+++ 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/ConsumerTest.java
 Mon Sep 17 16:55:03 2012
@@ -0,0 +1,99 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.spifly.statictool;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
+
+import org.apache.aries.spifly.Streams;
+import org.apache.aries.spifly.api.SpiFlyConstants;
+import org.apache.aries.spifly.statictool.bundle.Test2Class;
+import org.apache.aries.spifly.statictool.bundle.TestClass;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ConsumerTest {
+    @Test
+    public void testConsumerBundle() throws Exception {
+        String testClassFileName = TestClass.class.getName().replace('.', '/') 
+ ".class";
+        URL testClassURL = getClass().getResource("/" + testClassFileName);
+        String test2ClassFileName = Test2Class.class.getName().replace('.', 
'/') + ".class";
+        URL test2ClassURL = getClass().getResource("/" + test2ClassFileName);
+
+        File jarFile = new File(System.getProperty("java.io.tmpdir") + 
"/testjar_" + System.currentTimeMillis() + ".jar");
+        File expectedFile = null;
+        try {
+            // Create the jarfile to be used for testing
+            Manifest mf = new Manifest();
+            Attributes mainAttributes = mf.getMainAttributes();
+            mainAttributes.putValue("Manifest-Version", "1.0");
+            mainAttributes.putValue("Bundle-ManifestVersion", "2.0");
+            mainAttributes.putValue("Bundle-SymbolicName", "testbundle");
+            mainAttributes.putValue("Foo", "Bar Bar");
+            mainAttributes.putValue(SpiFlyConstants.SPI_CONSUMER_HEADER, 
Test2Class.class.getName() + "#getTCCL()");
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            mf.write(baos);
+            JarOutputStream jos = new JarOutputStream(new 
FileOutputStream(jarFile), mf);
+            jos.putNextEntry(new ZipEntry(testClassFileName));
+            Streams.pump(testClassURL.openStream(), jos);
+            jos.putNextEntry(new ZipEntry(test2ClassFileName));
+            Streams.pump(test2ClassURL.openStream(), jos);
+            jos.close();
+
+            Main.main(jarFile.getCanonicalPath());
+
+            expectedFile = new File(jarFile.getParent(), 
jarFile.getName().replaceAll("[.]jar", "_spifly.jar"));
+            Assert.assertTrue("A processed separate bundle should have been 
created", expectedFile.exists());
+
+            // Check manifest in generated bundle.
+            JarFile transformedJarFile = new JarFile(expectedFile);
+            Manifest expectedMF = transformedJarFile.getManifest();
+            Assert.assertEquals("1.0", 
expectedMF.getMainAttributes().getValue("Manifest-Version"));
+            Assert.assertEquals("2.0", 
expectedMF.getMainAttributes().getValue("Bundle-ManifestVersion"));
+            Assert.assertEquals("testbundle", 
expectedMF.getMainAttributes().getValue("Bundle-SymbolicName"));
+            Assert.assertEquals("Bar Bar", 
expectedMF.getMainAttributes().getValue("Foo"));
+            
Assert.assertNull(expectedMF.getMainAttributes().get(SpiFlyConstants.SPI_CONSUMER_HEADER));
+
+            JarFile initialJarFile = new JarFile(jarFile);
+            byte[] orgBytes = Streams.suck(initialJarFile.getInputStream(new 
ZipEntry(testClassFileName)));
+            byte[] transBytes = 
Streams.suck(transformedJarFile.getInputStream(new 
ZipEntry(testClassFileName)));
+            Assert.assertFalse("The transformed class should be different", 
Arrays.equals(orgBytes, transBytes));
+
+            byte[] orgBytes2 = Streams.suck(initialJarFile.getInputStream(new 
ZipEntry(test2ClassFileName)));
+            byte[] nonTransBytes = 
Streams.suck(transformedJarFile.getInputStream(new 
ZipEntry(test2ClassFileName)));
+            Assert.assertArrayEquals(orgBytes2, nonTransBytes);
+
+            initialJarFile.close();
+            transformedJarFile.close();
+        } finally {
+            jarFile.delete();
+
+            if (expectedFile != null)
+                expectedFile.delete();
+        }
+    }
+}

Added: 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/Test2Class.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/Test2Class.java?rev=1386716&view=auto
==============================================================================
--- 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/Test2Class.java
 (added)
+++ 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/Test2Class.java
 Mon Sep 17 16:55:03 2012
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.spifly.statictool.bundle;
+
+public class Test2Class {
+    public static ClassLoader getTCCL() {
+        return Thread.currentThread().getContextClassLoader();
+    }
+}

Added: 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/TestClass.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/TestClass.java?rev=1386716&view=auto
==============================================================================
--- 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/TestClass.java
 (added)
+++ 
aries/trunk/spi-fly/spi-fly-static-tool/src/test/java/org/apache/aries/spifly/statictool/bundle/TestClass.java
 Mon Sep 17 16:55:03 2012
@@ -0,0 +1,25 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.spifly.statictool.bundle;
+
+public class TestClass {
+    public void doit() {
+        Test2Class.getTCCL();
+    }
+}

Modified: 
aries/trunk/spi-fly/spi-fly-weaver/src/main/java/org/apache/aries/spifly/weaver/TCCLSetterVisitor.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-weaver/src/main/java/org/apache/aries/spifly/weaver/TCCLSetterVisitor.java?rev=1386716&r1=1386715&r2=1386716&view=diff
==============================================================================
--- 
aries/trunk/spi-fly/spi-fly-weaver/src/main/java/org/apache/aries/spifly/weaver/TCCLSetterVisitor.java
 (original)
+++ 
aries/trunk/spi-fly/spi-fly-weaver/src/main/java/org/apache/aries/spifly/weaver/TCCLSetterVisitor.java
 Mon Sep 17 16:55:03 2012
@@ -64,6 +64,10 @@ public class TCCLSetterVisitor extends C
         this.weavingData = weavingData;
     }
 
+    public boolean isWoven() {
+        return woven;
+    }
+
     @Override
     public MethodVisitor visitMethod(int access, String name, String desc,
             String signature, String[] exceptions) {


Reply via email to