1 package com.atlassian.plugin.osgi.factory;
2
3 import com.atlassian.plugin.ModuleDescriptor;
4 import com.atlassian.plugin.ModuleDescriptorFactory;
5 import com.atlassian.plugin.descriptors.UnrecognisedModuleDescriptor;
6 import com.atlassian.plugin.osgi.factory.descriptor.ComponentModuleDescriptor;
7 import org.junit.Before;
8 import org.junit.Test;
9 import org.osgi.util.tracker.ServiceTracker;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotNull;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.when;
15
16 public class TestOsgiChainedModuleDescriptorFactoryCreator {
17
18 private OsgiChainedModuleDescriptorFactoryCreator.ServiceTrackerFactory serviceTrackerFactory;
19 private ServiceTracker tracker;
20 private OsgiChainedModuleDescriptorFactoryCreator.ResourceLocator resourceLocator;
21 private ModuleDescriptorFactory moduleDescriptorFactory;
22 private OsgiChainedModuleDescriptorFactoryCreator creator;
23 private ModuleDescriptor fooModuleDescriptor;
24
25 @Before
26 public void setUp() throws Exception {
27 serviceTrackerFactory = mock(OsgiChainedModuleDescriptorFactoryCreator.ServiceTrackerFactory.class);
28 tracker = mock(ServiceTracker.class);
29 when(serviceTrackerFactory.create(ModuleDescriptorFactory.class.getName())).thenReturn(tracker);
30 resourceLocator = mock(OsgiChainedModuleDescriptorFactoryCreator.ResourceLocator.class);
31 fooModuleDescriptor = mock(ModuleDescriptor.class);
32 moduleDescriptorFactory = createModuleDescriptorFactory("foo", fooModuleDescriptor);
33 creator = new OsgiChainedModuleDescriptorFactoryCreator(serviceTrackerFactory);
34 }
35
36 @Test
37 public void testCreate() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
38 ModuleDescriptor dynModuleDescriptor = mock(ModuleDescriptor.class);
39 ModuleDescriptorFactory dynModuleDescriptorFactory = createModuleDescriptorFactory("dyn", dynModuleDescriptor);
40 when(tracker.getServices()).thenReturn(new Object[]{dynModuleDescriptorFactory});
41 ModuleDescriptorFactory createdFactory = creator.create(resourceLocator, moduleDescriptorFactory);
42 assertNotNull(createdFactory);
43 assertEquals(ComponentModuleDescriptor.class, createdFactory.getModuleDescriptor("component").getClass());
44 assertEquals(dynModuleDescriptor, createdFactory.getModuleDescriptor("dyn"));
45 assertEquals(fooModuleDescriptor, createdFactory.getModuleDescriptor("foo"));
46 assertEquals(UnrecognisedModuleDescriptor.class, createdFactory.getModuleDescriptor("unknown").getClass());
47 }
48
49 @Test
50 public void testCreateWithOsgiDescriptorOverridingHost() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
51 fooModuleDescriptor = mock(ModuleDescriptor.class);
52 moduleDescriptorFactory = createModuleDescriptorFactory("component", fooModuleDescriptor);
53 when(tracker.getServices()).thenReturn(new Object[0]);
54 ModuleDescriptorFactory createdFactory = creator.create(resourceLocator, moduleDescriptorFactory);
55 assertNotNull(createdFactory);
56 assertEquals(ComponentModuleDescriptor.class, createdFactory.getModuleDescriptor("component").getClass());
57 }
58
59 private ModuleDescriptorFactory createModuleDescriptorFactory(String prefix, ModuleDescriptor moduleDescriptor)
60 throws IllegalAccessException, InstantiationException, ClassNotFoundException {
61 ModuleDescriptorFactory moduleDescriptorFactory = mock(ModuleDescriptorFactory.class);
62 when(moduleDescriptorFactory.hasModuleDescriptor(prefix)).thenReturn(true);
63 when(moduleDescriptorFactory.getModuleDescriptor(prefix)).thenReturn(moduleDescriptor);
64 return moduleDescriptorFactory;
65 }
66 }