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
110
111
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 }