View Javadoc
1   package com.atlassian.plugin.osgi.hostcomponents.impl;
2   
3   import com.atlassian.plugin.hostcontainer.HostContainer;
4   import com.atlassian.plugin.osgi.hostcomponents.HostComponentRegistration;
5   import org.junit.Test;
6   import org.junit.runner.RunWith;
7   import org.mockito.junit.MockitoJUnitRunner;
8   import org.osgi.framework.BundleContext;
9   
10  import java.io.Serializable;
11  import java.util.Arrays;
12  import java.util.Dictionary;
13  import java.util.Hashtable;
14  
15  import static org.hamcrest.Matchers.equalTo;
16  import static org.junit.Assert.assertEquals;
17  import static org.junit.Assert.assertNotNull;
18  import static org.mockito.Mockito.eq;
19  import static org.mockito.Mockito.mock;
20  import static org.mockito.Mockito.verify;
21  import static org.mockito.Mockito.verifyZeroInteractions;
22  import static org.mockito.hamcrest.MockitoHamcrest.argThat;
23  
24  @RunWith(MockitoJUnitRunner.class)
25  public class TestDefaultComponentRegistrar {
26      @Test
27      public void testRegister() {
28          DefaultComponentRegistrar registrar = new DefaultComponentRegistrar();
29          Class[] ifs = new Class[]{Serializable.class};
30          registrar.register(ifs).forInstance("Foo").withName("foo").withProperty("jim", "bar");
31          HostComponentRegistration reg = registrar.getRegistry().get(0);
32  
33          assertNotNull(reg);
34          assertEquals("Foo", reg.getInstance());
35          assertEquals(Serializable.class.getName(), reg.getMainInterfaces()[0]);
36          assertEquals("foo", reg.getProperties().get(DefaultPropertyBuilder.BEAN_NAME));
37          assertEquals("bar", reg.getProperties().get("jim"));
38      }
39  
40      @Test
41      public void testRegisterMultiple() {
42          DefaultComponentRegistrar registrar = new DefaultComponentRegistrar();
43          Class[] ifs = new Class[]{Serializable.class};
44          registrar.register(ifs).forInstance("Foo").withName("foo").withProperty("jim", "bar");
45          registrar.register(ifs).forInstance("Foo").withName("foo").withProperty("sarah", "bar");
46          assertEquals(2, registrar.getRegistry().size());
47      }
48  
49      @Test(expected = IllegalArgumentException.class)
50      public void testRegisterOnlyInterfaces() {
51          DefaultComponentRegistrar registrar = new DefaultComponentRegistrar();
52          Class[] ifs = new Class[]{Object.class};
53          registrar.register(ifs).forInstance("Foo").withName("foo").withProperty("jim", "bar");
54      }
55  
56      @Test
57      public void testWriteRegistry() {
58          Class[] ifs = new Class[]{Serializable.class};
59          DefaultComponentRegistrar registrar = new DefaultComponentRegistrar();
60          registrar.register(ifs).forInstance("Foo").withName("foo");
61  
62          BundleContext ctx = mock(BundleContext.class);
63          registrar.writeRegistry(ctx);
64  
65          verifyRegistration(ctx, ifs, "Foo", "foo");
66      }
67  
68      @Test
69      public void testWriteRegistryRemovesHostContainer() {
70          Class[] ifs = new Class[]{HostContainer.class};
71          DefaultComponentRegistrar registrar = new DefaultComponentRegistrar();
72          registrar.register(ifs).forInstance("Foo").withName("foo");
73  
74          BundleContext ctx = mock(BundleContext.class);
75          registrar.writeRegistry(ctx);
76  
77          verifyZeroInteractions(ctx);
78          assertEquals(0, registrar.getRegistry().size());
79      }
80  
81      @Test
82      public void testWriteRegistryNoInterface() {
83          Class[] ifs = new Class[]{};
84          DefaultComponentRegistrar registrar = new DefaultComponentRegistrar();
85          registrar.register(ifs).forInstance("Foo").withName("foo");
86  
87          BundleContext ctx = mock(BundleContext.class);
88          registrar.writeRegistry(ctx);
89  
90          verifyRegistration(ctx, ifs, "Foo", "foo");
91      }
92  
93      @Test
94      public void testWriteRegistryGenBeanName() {
95          Class[] ifs = new Class[]{Serializable.class};
96          DefaultComponentRegistrar registrar = new DefaultComponentRegistrar();
97          registrar.register(ifs).forInstance("Foo");
98  
99          BundleContext ctx = mock(BundleContext.class);
100         registrar.writeRegistry(ctx);
101 
102         verifyRegistration(ctx, ifs, "Foo", "hostComponent-" + Arrays.asList(registrar.getRegistry().get(0).getMainInterfaces()).hashCode());
103     }
104 
105     private void verifyRegistration(BundleContext ctx, Class[] ifs, Object instance, String name) {
106         Dictionary<String, String> properties = new Hashtable<>();
107         properties.put(DefaultPropertyBuilder.BEAN_NAME, name);
108         properties.put(DefaultComponentRegistrar.HOST_COMPONENT_FLAG, "true");
109         // argThat(equalTo(instance)) is used instead of eq(instance) as hamcrest does
110         // proxy.equals(original) where are mockito does original.equals(proxy) and
111         // unfortunately original.equals(proxy) != proxy.equals(original)
112         verify(ctx).registerService(eq(toClassNames(ifs)), argThat(equalTo(instance)), eq(properties));
113     }
114 
115     private static String[] toClassNames(Class[] classes) {
116         String[] classNames = new String[classes.length];
117         for (int i = 0; i < classNames.length; i++) {
118             classNames[i] = classes[i].getName();
119         }
120         return classNames;
121     }
122 
123 }