View Javadoc
1   package com.atlassian.plugin.osgi.util;
2   
3   import com.atlassian.plugin.PluginDependencies;
4   import com.google.common.collect.ImmutableMap;
5   import io.atlassian.fugue.Pair;
6   import org.junit.Test;
7   import org.mockito.Mockito;
8   import org.osgi.framework.Bundle;
9   import org.osgi.framework.wiring.BundleRequirement;
10  import org.osgi.framework.wiring.BundleRevision;
11  import org.osgi.framework.wiring.BundleRevisions;
12  import org.osgi.framework.wiring.BundleWire;
13  import org.osgi.framework.wiring.BundleWiring;
14  
15  import java.util.ArrayList;
16  import java.util.Hashtable;
17  import java.util.List;
18  import java.util.Map;
19  import java.util.Set;
20  
21  import static org.hamcrest.MatcherAssert.assertThat;
22  import static org.hamcrest.Matchers.contains;
23  import static org.hamcrest.Matchers.containsInAnyOrder;
24  import static org.mockito.Mockito.mock;
25  
26  public class TestOsgiPluginUtil {
27      private BundleImpl bundle;
28  
29      @Test
30      public void getRequiredPluginKeysUsesBundleWiring() {
31          bundle = createBundleWithWiring(new Pair<>("1", "mandatory"), new Pair<>("2", "optional"), new Pair<>("3", "dynamic"));
32  
33          Set<String> keys = OsgiPluginUtil.getDependencies(bundle).getAll();
34  
35          assertThat(keys, containsInAnyOrder("1-null", "2-null", "3-null"));
36      }
37  
38      @Test
39      public void getDependentPluginKeysByResolution() {
40          bundle = createBundleWithWiring(new Pair<>("1", "mandatory"), new Pair<>("2", "optional"), new Pair<>("3", "dynamic"));
41  
42          final PluginDependencies pluginDependencies = OsgiPluginUtil.getDependencies(bundle);
43  
44          assertThat(pluginDependencies.getMandatory(), contains("1-null"));
45          assertThat(pluginDependencies.getOptional(), contains("2-null"));
46          assertThat(pluginDependencies.getDynamic(), contains("3-null"));
47      }
48  
49      @Test
50      public void getDependentPluginKeysByResolutionWithMultipleWires() {
51          bundle = createBundleWithWiring(
52                  new Pair<>("1mod", "mandatory"),
53                  new Pair<>("1mod", "optional"),
54                  new Pair<>("1mod", "dynamic"),
55                  new Pair<>("2mo", "optional"),
56                  new Pair<>("2mo", "mandatory"),
57                  new Pair<>("3do", "dynamic"),
58                  new Pair<>("3do", "optional"));
59  
60          final PluginDependencies pluginDependencies = OsgiPluginUtil.getDependencies(bundle);
61  
62          assertThat(pluginDependencies.getMandatory(), contains("1mod-null", "2mo-null"));
63          assertThat(pluginDependencies.getOptional(), contains("1mod-null", "2mo-null", "3do-null"));
64          assertThat(pluginDependencies.getDynamic(), contains("1mod-null", "3do-null"));
65      }
66  
67      private interface BundleImpl extends Bundle, BundleRevisions {
68      }
69  
70      private BundleImpl createBundleWithWiring(final Pair<String, String>... wires) {
71          List<BundleWire> requiredWires = new ArrayList<>();
72  
73          for (Pair<String, String> wire : wires) {
74              Bundle requiredBundle = mock(Bundle.class);
75              Mockito.when(requiredBundle.getSymbolicName()).thenReturn(wire.left());
76              Mockito.when(requiredBundle.getHeaders()).thenReturn(new Hashtable<String, String>());
77  
78              BundleWiring provider = mock(BundleWiring.class);
79              Mockito.when(provider.getBundle()).thenReturn(requiredBundle);
80  
81              BundleRequirement requirement = mock(BundleRequirement.class);
82              Map<String, String> directives;
83              if ("mandatory".equals(wire.right())) {
84                  directives = ImmutableMap.of();
85              } else {
86                  directives = ImmutableMap.of("resolution", wire.right());
87              }
88              Mockito.when(requirement.getDirectives()).thenReturn(directives);
89  
90              BundleWire requiredWire = mock(BundleWire.class);
91              Mockito.when(requiredWire.getProviderWiring()).thenReturn(provider);
92              Mockito.when(requiredWire.getRequirement()).thenReturn(requirement);
93  
94              requiredWires.add(requiredWire);
95          }
96  
97          BundleWiring wiring = mock(BundleWiring.class);
98          Mockito.when(wiring.getRequiredWires(null)).thenReturn(requiredWires);
99  
100         BundleRevision bundleRevision = mock(BundleRevision.class);
101         List<BundleRevision> bundleRevisions = new ArrayList<>();
102         bundleRevisions.add(bundleRevision);
103         Mockito.when(bundleRevision.getWiring()).thenReturn(wiring);
104 
105         BundleImpl bundle = mock(BundleImpl.class);
106         Mockito.when(bundle.getRevisions()).thenReturn(bundleRevisions);
107 
108         return bundle;
109     }
110 }