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 }