Author: davidb
Date: Fri May 25 12:42:59 2018
New Revision: 1832236

URL: http://svn.apache.org/viewvc?rev=1832236&view=rev
Log:
ARIES-1801 SPI Fly does not work with a dynamic class object

Test case that works with dynamic class object.

Modified:
    
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java
    
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java

Modified: 
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java?rev=1832236&r1=1832235&r2=1832236&view=diff
==============================================================================
--- 
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java
 (original)
+++ 
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/ClientWeavingHookTest.java
 Fri May 25 12:42:59 2018
@@ -18,6 +18,25 @@
  */
 package org.apache.aries.spifly.dynamic;
 
+import org.apache.aries.mytest.MySPI;
+import org.apache.aries.spifly.BaseActivator;
+import org.apache.aries.spifly.SpiFlyConstants;
+import org.apache.aries.spifly.Streams;
+import org.easymock.EasyMock;
+import org.easymock.IAnswer;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleReference;
+import org.osgi.framework.Version;
+import org.osgi.framework.hooks.weaving.WeavingHook;
+import org.osgi.framework.hooks.weaving.WovenClass;
+import org.osgi.framework.wiring.BundleRevision;
+import org.osgi.framework.wiring.BundleWiring;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
@@ -43,25 +62,6 @@ import java.util.concurrent.ConcurrentHa
 
 import javax.xml.parsers.DocumentBuilderFactory;
 
-import org.apache.aries.mytest.MySPI;
-import org.apache.aries.spifly.BaseActivator;
-import org.apache.aries.spifly.SpiFlyConstants;
-import org.apache.aries.spifly.Streams;
-import org.easymock.EasyMock;
-import org.easymock.IAnswer;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleReference;
-import org.osgi.framework.Version;
-import org.osgi.framework.hooks.weaving.WeavingHook;
-import org.osgi.framework.hooks.weaving.WovenClass;
-import org.osgi.framework.wiring.BundleRevision;
-import org.osgi.framework.wiring.BundleWiring;
-
 public class ClientWeavingHookTest {
     DynamicWeavingActivator activator;
 
@@ -115,6 +115,43 @@ public class ClientWeavingHookTest {
         Object result = method.invoke(cls.newInstance(), "hello");
         Assert.assertEquals(Collections.singleton("olleh"), result);
     }
+
+    @Test
+    public void testBasicServiceLoaderUsage2() throws Exception {
+        Dictionary<String, String> consumerHeaders = new Hashtable<String, 
String>();
+        consumerHeaders.put(SpiFlyConstants.SPI_CONSUMER_HEADER, "*");
+
+        // Register the bundle that provides the SPI implementation.
+        Bundle providerBundle = mockProviderBundle("impl1", 1);
+        activator.registerProviderBundle("org.apache.aries.mytest.MySPI", 
providerBundle, new HashMap<String, Object>());
+
+        Bundle consumerBundle = mockConsumerBundle(consumerHeaders, 
providerBundle);
+        activator.addConsumerWeavingData(consumerBundle, 
SpiFlyConstants.SPI_CONSUMER_HEADER);
+
+        Bundle spiFlyBundle = mockSpiFlyBundle("spifly", 
Version.parseVersion("1.9.4"), consumerBundle, providerBundle);
+        WeavingHook wh = new 
ClientWeavingHook(spiFlyBundle.getBundleContext(), activator);
+
+        // Weave the TestClient class.
+        URL clsUrl = getClass().getResource("TestClient.class");
+        Assert.assertNotNull("Precondition", clsUrl);
+
+        String clientClassName = "org.apache.aries.spifly.dynamic.TestClient";
+        WovenClass wc = new MyWovenClass(clsUrl, clientClassName, 
consumerBundle);
+        Assert.assertEquals("Precondition", 0, wc.getDynamicImports().size());
+        wh.weave(wc);
+        Assert.assertEquals(1, wc.getDynamicImports().size());
+        String di1 = 
"org.apache.aries.spifly;bundle-symbolic-name=spifly;bundle-version=1.9.4";
+        String di2 = 
"org.apache.aries.spifly;bundle-version=1.9.4;bundle-symbolic-name=spifly";
+        String di = wc.getDynamicImports().get(0);
+        Assert.assertTrue("Weaving should have added a dynamic import", 
di1.equals(di) || di2.equals(di));
+
+        // Invoke the woven class and check that it properly sets the TCCL so 
that the
+        // META-INF/services/org.apache.aries.mytest.MySPI file from impl1 is 
visible.
+        Class<?> cls = wc.getDefinedClass();
+        Method method = cls.getMethod("testService2", new Class [] 
{String.class});
+        Object result = method.invoke(cls.newInstance(), "hello");
+        Assert.assertEquals(Collections.singleton("olleh"), result);
+    }
 
     @Test
     public void testTCCLResetting() throws Exception {

Modified: 
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java?rev=1832236&r1=1832235&r2=1832236&view=diff
==============================================================================
--- 
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java
 (original)
+++ 
aries/trunk/spi-fly/spi-fly-dynamic-bundle/src/test/java/org/apache/aries/spifly/dynamic/TestClient.java
 Fri May 25 12:42:59 2018
@@ -18,12 +18,12 @@
  */
 package org.apache.aries.spifly.dynamic;
 
+import org.apache.aries.mytest.MySPI;
+
 import java.util.HashSet;
 import java.util.ServiceLoader;
 import java.util.Set;
 
-import org.apache.aries.mytest.MySPI;
-
 public class TestClient {
        /**
         * Load using a constant as parameter.
@@ -37,7 +37,7 @@ public class TestClient {
         }
         return results;
     }
-    
+
        /**
         * Load using a variable as parameter.
         */
@@ -47,11 +47,25 @@ public class TestClient {
         // Try to irritate TCCLSetterVisitor by forcing an (irrelevant) LDC.
         @SuppressWarnings("unused")
                Class<?> causeLDC = String.class;
-        
+
         ServiceLoader<MySPI> loader = ServiceLoader.load(service);
         for (MySPI mySPI : loader) {
             results.add(mySPI.someMethod(input));
         }
         return results;
     }
+
+    /**
+     * Slightly different example where the class is loaded using 
Class.forName()
+     */
+    public Set<String> testService2(String input) throws Exception {
+        Set<String> results = new HashSet<String>();
+
+        Class<?> cls = Class.forName("org.apache.aries.mytest.MySPI");
+        ServiceLoader<?> loader = ServiceLoader.load(cls);
+        for (Object obj : loader) {
+            results.add(((MySPI) obj).someMethod(input));
+        }
+        return results;
+    }
 }


Reply via email to