1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.discovery.test;
18  
19  
20  import java.net.URL;
21  import java.util.Properties;
22  
23  import junit.framework.Test;
24  import junit.framework.TestCase;
25  import junit.framework.TestSuite;
26  
27  import org.apache.commons.discovery.Resource;
28  import org.apache.commons.discovery.ResourceClass;
29  import org.apache.commons.discovery.ResourceClassIterator;
30  import org.apache.commons.discovery.ResourceIterator;
31  import org.apache.commons.discovery.jdk.JDKHooks;
32  import org.apache.commons.discovery.resource.ClassLoaders;
33  import org.apache.commons.discovery.resource.DiscoverResources;
34  import org.apache.commons.discovery.resource.classes.DiscoverClasses;
35  import org.apache.commons.discovery.tools.DefaultClassHolder;
36  import org.apache.commons.discovery.tools.DiscoverClass;
37  import org.apache.commons.discovery.tools.DiscoverSingleton;
38  import org.apache.commons.discovery.tools.ManagedProperties;
39  import org.apache.commons.discovery.tools.PropertiesHolder;
40  import org.apache.commons.discovery.tools.SPInterface;
41  
42  
43  /***
44    * @author Richard A. Sitze
45    * @version $Revision: 480374 $
46   */
47  public class TestAll extends TestCase {
48      private static final int logLevel =
49          org.apache.commons.discovery.log.SimpleLog.LOG_LEVEL_INFO;
50  //        org.apache.commons.discovery.log.SimpleLog.LOG_LEVEL_DEBUG;
51  
52      
53      public TestAll(String testName) {
54          super(testName);
55      }
56      
57      public static Test suite() {
58          return new TestSuite(TestAll.class);
59      }
60  
61      public void testFindDefaultImpl_1() {
62          org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
63  
64          TestInterface1 ti = null;
65          
66          try {
67              ti = (TestInterface1)DiscoverSingleton.find(TestInterface1.class,
68                                                          TestImpl1_1.class.getName());
69  
70              assertTrue(ti.getClass().getName() + "!=" + TestImpl1_1.class.getName(),
71                         ti.getClass().getName().equals(TestImpl1_1.class.getName()));
72          } finally {
73              DiscoverSingleton.release();
74          }
75      }
76      
77      public void testFindDefaultImpl_2() {
78          org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
79  
80          TestInterface1 ti = null;
81  
82          try {
83              ti = (TestInterface1)DiscoverSingleton.find(TestInterface1.class,
84                                                          TestImpl1_2.class.getName());
85  
86              assertTrue(ti.getClass().getName() + "!=" + TestImpl1_2.class.getName(),
87                         ti.getClass().getName().equals(TestImpl1_2.class.getName()));
88          } finally {
89              DiscoverSingleton.release();
90          }
91      }
92      
93      public void testCache() {
94          org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
95  
96          TestInterface1 ti = null;
97          
98          try {
99              ti = (TestInterface1)DiscoverSingleton.find(TestInterface1.class,
100                                                         TestImpl1_1.class.getName());
101 
102             assertTrue("1. " + ti.getClass().getName() + "!=" + TestImpl1_1.class.getName(),
103                        ti.getClass().getName().equals(TestImpl1_1.class.getName()));
104             
105             // no release, should get cached value..
106             
107             ti = (TestInterface1)DiscoverSingleton.find(TestInterface1.class,
108                                                         TestImpl1_2.class.getName());
109 
110             // factory should be cached
111             assertTrue("2. " + ti.getClass().getName() + "!=" + TestImpl1_1.class.getName(),
112                        ti.getClass().getName().equals(TestImpl1_1.class.getName()));
113         } finally {
114             DiscoverSingleton.release();
115         }
116     }
117     
118     public void testRelease() {
119         org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
120 
121         TestInterface1 ti = null;
122         
123         try {
124             ti = (TestInterface1)DiscoverSingleton.find(TestInterface1.class,
125                                                         TestImpl1_1.class.getName());
126 
127             assertTrue("1. " + ti.getClass().getName() + "!=" + TestImpl1_1.class.getName(),
128                        ti.getClass().getName().equals(TestImpl1_1.class.getName()));
129             
130             DiscoverSingleton.release();
131             
132             ti = (TestInterface1)DiscoverSingleton.find(TestInterface1.class,
133                                                         TestImpl1_2.class.getName());
134 
135             // factory should be cached
136             assertTrue("2. " + ti.getClass().getName() + "!=" + TestImpl1_2.class.getName(),
137                        ti.getClass().getName().equals(TestImpl1_2.class.getName()));
138         } finally {
139             DiscoverSingleton.release();
140         }
141     }
142     
143     public void testFindPropertyImpl_1() {
144         org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
145 
146         TestInterface1 ti = null;
147 
148         try {
149             Properties props = new Properties();
150             
151             props.setProperty(TestInterface1.class.getName(),
152                               TestImpl1_2.class.getName());
153             
154             ti = (TestInterface1)DiscoverSingleton.find(TestInterface1.class, props);
155 
156             assertTrue(ti.getClass().getName() + "!=" + TestImpl1_2.class.getName(),
157                        ti.getClass().getName().equals(TestImpl1_2.class.getName()));
158         } finally {
159             DiscoverSingleton.release();
160         }
161     }
162     
163     public void testMyFactoryManagedProperty() {
164         org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
165 
166         TestInterface1 ti = null;
167 
168         try {
169             ManagedProperties.setProperty(TestInterface1.class.getName(),
170                                           TestImpl1_2.class.getName());
171                               
172             ti = (TestInterface1)DiscoverSingleton.find(TestInterface1.class);
173 
174             assertTrue(ti.getClass().getName() + "!=" + TestImpl1_2.class.getName(),
175                        ti.getClass().getName().equals(TestImpl1_2.class.getName()));
176         } finally {
177             DiscoverSingleton.release();
178             
179             /***
180              * Cleanup, don't want to affect next test..
181              */
182             ManagedProperties.setProperty(TestInterface1.class.getName(), null);
183         }
184     }
185     
186 
187     public void testFindPropFileDefault() {
188         org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
189 
190         TestInterface1 ti = null;
191         
192         try {
193             ti = (TestInterface1)DiscoverSingleton.find(null,
194                                    new SPInterface(TestInterface1.class),
195                                    new PropertiesHolder("TestInterface.properties"),
196                                    new DefaultClassHolder(TestImpl1_2.class.getName()));
197 
198             assertTrue(ti.getClass().getName() + "!=" + TestImpl1_1.class.getName(),
199                        ti.getClass().getName().equals(TestImpl1_1.class.getName()));
200         } finally {
201             DiscoverSingleton.release();
202         }
203     }
204 
205     public void testFindServiceFileDefault() {
206         org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
207 
208         TestInterface2 ti = null;
209         
210         try {
211             ti = (TestInterface2)DiscoverSingleton.find(null,
212                                    new SPInterface(TestInterface2.class),
213                                    null,
214                                    new DefaultClassHolder(TestImpl2_2.class.getName()));
215 
216             assertTrue(ti.getClass().getName() + "!=" + TestImpl2_1.class.getName(),
217                        ti.getClass().getName().equals(TestImpl2_1.class.getName()));
218         } finally {
219             DiscoverSingleton.release();
220         }
221     }
222 
223     public void testLowLevelFind() {
224         org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
225 
226         ClassLoaders loaders = ClassLoaders.getAppLoaders(TestInterface2.class, getClass(), false);
227         String name = "org.apache.commons.discovery.test.TestImpl2_1";
228         
229         DiscoverClasses discovery = new DiscoverClasses(loaders);
230         ResourceClassIterator iter = discovery.findResourceClasses(name);
231         while (iter.hasNext()) {
232             ResourceClass resource = iter.nextResourceClass();
233             try {                
234                 Class implClass = resource.loadClass();
235                 if ( implClass != null ) {
236                     assertEquals("org.apache.commons.discovery.test.TestImpl2_1", implClass.getName());
237                     return;
238                 }
239             }
240             catch (Exception e) {
241                 fail("Could not load service: " + resource );
242             }
243         }
244         fail("failed to load class resource: " + name);
245     }
246     
247     public void testFindResources() {
248         org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
249 
250         ClassLoaders loaders = new ClassLoaders();
251 
252         /***
253          * To many class loaders when searching for multiple
254          * resources means that we can find the same (same URL)
255          * resource for each loader...
256          * let's keep this to a minimum.
257          */
258         ClassLoader cl = getClass().getClassLoader();
259         if (cl != null)
260             loaders.put(getClass().getClassLoader(), true);
261         else
262             loaders.put(JDKHooks.getJDKHooks().getSystemClassLoader(), true);
263         
264 
265         String name = "testResource";
266         
267         String partialPaths[] = { "/test/", "/testAlt1/", "/testAlt2/" };
268         int expected = partialPaths.length;
269         
270         DiscoverResources discovery = new DiscoverResources(loaders);
271         ResourceIterator iter = discovery.findResources(name);
272         int count = 0;
273         
274         while (iter.hasNext()) {
275             Resource resource = iter.nextResource();
276             URL url = resource.getResource();
277             if ( url != null ) {
278                 if (url.getFile().indexOf(partialPaths[count]) == -1) {
279                     fail(url + " does not contain " + partialPaths[count]);
280                 }
281                 count++;
282             }
283         }
284         
285         if (count != expected) {
286             fail("located " + count + " resources, failed to locate all " + expected + " resources: " + name);
287         }
288     }
289 
290     public void testViaDiscoverClass() {
291         org.apache.commons.discovery.log.SimpleLog.setLevel(logLevel);
292 
293         ClassLoaders loaders = ClassLoaders.getAppLoaders(TestInterface2.class, getClass(), false);
294         
295         DiscoverClass discover = new DiscoverClass(loaders);
296         Class implClass = discover.find(TestInterface2.class);
297         
298         assertTrue("Failed to find an implementation class", implClass != null);
299         assertEquals("org.apache.commons.discovery.test.TestImpl2_1", implClass.getName());
300         
301     }
302     
303     /***
304      * This allows the tests to run as a standalone application.
305      */
306     public static void main(String args[]) {
307         String[] testCaseName = { TestAll.class.getName() };
308         junit.textui.TestRunner.main(testCaseName);
309     }
310 }