1 package com.atlassian.plugins.rest.module.scanner;
2
3 import com.atlassian.rest.test.jar.AnAnnotation;
4 import com.atlassian.rest.test.jar.AnnotatedClass;
5 import com.atlassian.rest.test.jar.ClassWithAnnotatedMethod;
6 import com.atlassian.rest.test.jar2.AnotherAnnotatedClass;
7 import com.atlassian.rest.test.jar2.jar3.YetAnotherAnnotatedClass;
8 import org.junit.Before;
9 import org.junit.Test;
10 import static org.junit.Assert.*;
11 import static org.mockito.Mockito.mock;
12 import static org.mockito.Mockito.when;
13 import org.osgi.framework.Bundle;
14
15 import java.io.File;
16 import java.util.ArrayList;
17 import java.util.Arrays;
18 import java.util.List;
19 import java.util.Set;
20
21 public class AnnotatedClassScannerTest
22 {
23 private AnnotatedClassScanner scanner;
24 private Bundle bundle;
25
26 @Before
27 public void setUp() throws Exception
28 {
29 bundle = mock(Bundle.class);
30 when(bundle.getLocation()).thenReturn(getTestJar().getAbsolutePath());
31 when(bundle.loadClass(AnnotatedClass.class.getName())).thenReturn(AnnotatedClass.class);
32 when(bundle.loadClass(AnotherAnnotatedClass.class.getName())).thenReturn(AnotherAnnotatedClass.class);
33 when(bundle.loadClass(YetAnotherAnnotatedClass.class.getName())).thenReturn(YetAnotherAnnotatedClass.class);
34 when(bundle.loadClass(ClassWithAnnotatedMethod.class.getName())).thenReturn(ClassWithAnnotatedMethod.class);
35
36 scanner = new AnnotatedClassScanner(bundle, AnAnnotation.class);
37 }
38
39 @Test
40 public void testScanWithNoBasePackage()
41 {
42 testScan(Arrays.asList(AnnotatedClass.class, AnotherAnnotatedClass.class, YetAnotherAnnotatedClass.class, ClassWithAnnotatedMethod.class));
43 }
44
45 @Test
46 public void testScanWithBasePackage()
47 {
48 testScan(Arrays.asList(AnnotatedClass.class, ClassWithAnnotatedMethod.class), "com.atlassian.rest.test.jar");
49 }
50
51 @Test
52 public void testScanWithBasePackageUsingSlashes()
53 {
54 testScan(Arrays.asList(AnnotatedClass.class, ClassWithAnnotatedMethod.class), "com/atlassian/rest/test/jar");
55 }
56
57 @Test
58 public void testScanWithBasePackageAndSubPackages()
59 {
60 testScan(Arrays.asList(AnotherAnnotatedClass.class, YetAnotherAnnotatedClass.class), "com/atlassian/rest/test/jar2");
61 }
62
63 @Test
64 public void testScanWithMultipleBasePackagesAndSubPackages()
65 {
66 testScan(Arrays.asList(AnnotatedClass.class, ClassWithAnnotatedMethod.class, AnotherAnnotatedClass.class, YetAnotherAnnotatedClass.class), "com/atlassian/rest/test/jar", "com/atlassian/rest/test/jar2");
67 }
68
69 @Test
70 public void testScanWithMultipleBasePackages()
71 {
72 testScan(Arrays.asList(AnnotatedClass.class, ClassWithAnnotatedMethod.class, YetAnotherAnnotatedClass.class), "com/atlassian/rest/test/jar", "com/atlassian/rest/test/jar2/jar3");
73 }
74
75 @Test
76 public void testGetBundleFileEscapesBundleLocationBeforeResolvingFile()
77 {
78 final String bundlePath = "some%20path";
79 when(bundle.getLocation()).thenReturn("file:" + bundlePath);
80
81 final File bundleFile = scanner.getBundleFile(bundle);
82
83 assertEquals(bundlePath.replace("%20", " "), bundleFile.getPath());
84 }
85
86 public void testScan(List<Class<?>> expected, String... packages)
87 {
88 final Set<Class<?>> classes = scanner.scan(packages);
89 assertCollectionEquals(expected, new ArrayList<Class<?>>(classes));
90 }
91
92 private static void assertCollectionEquals(List<Class<?>> expected, List<Class<?>> actual)
93 {
94 try
95 {
96 assertEquals(expected.size(), actual.size());
97 }
98 catch (AssertionError error)
99 {
100 System.err.println("Expected " + expected + " but got " + actual);
101 throw error;
102 }
103 for (Class<?> aClass : expected)
104 {
105 try
106 {
107 assertTrue(actual.contains(aClass));
108 }
109 catch (AssertionError error)
110 {
111 System.err.println("Expected <" + aClass + "> in " + actual);
112 throw error;
113 }
114 }
115 }
116
117 private File getTestJar()
118 {
119 return new File(this.getClass().getClassLoader().getResource("atlassian-rest-test-jar.jar").getFile());
120 }
121 }