1 package com.atlassian.sal.core.lifecycle;
2
3 import com.atlassian.fugue.Pair;
4 import com.atlassian.plugin.Plugin;
5 import com.atlassian.plugin.event.events.PluginDisablingEvent;
6 import com.atlassian.plugin.event.events.PluginFrameworkShuttingDownEvent;
7 import com.atlassian.sal.api.lifecycle.LifecycleAware;
8 import org.junit.Before;
9 import org.junit.Test;
10 import org.junit.runner.RunWith;
11 import org.mockito.runners.MockitoJUnitRunner;
12 import org.osgi.framework.Bundle;
13 import org.osgi.framework.ServiceReference;
14
15 import static org.mockito.Mockito.mock;
16 import static org.mockito.Mockito.never;
17 import static org.mockito.Mockito.verify;
18 import static org.mockito.Mockito.when;
19
20 @RunWith(MockitoJUnitRunner.class)
21 public class TestDefaultLifecycleManagerOnStopAware extends TestDefaultLifecycleManagerBase {
22 @Before
23 @Override
24 public void setUp() throws Exception {
25 super.setUp();
26 defaultLifecycleManager.afterPropertiesSet();
27 }
28
29 @Test
30 public void onStopNotCalledPrematurely() throws Exception {
31 final LifecycleAware deathAware = getLifecycleAwareStarted();
32
33 verify(deathAware, never()).onStop();
34 }
35
36 @Test
37 public void onStopCalledWhenFrameworkShuttingDown() throws Exception {
38 final LifecycleAware deathAware = getLifecycleAwareStarted();
39
40 defaultLifecycleManager.onPluginFrameworkShuttingDown(new PluginFrameworkShuttingDownEvent(pluginController, pluginAccessor));
41 verify(deathAware).onStop();
42 }
43
44 @Test
45 public void onStopWillNotBreakLegacyPlugins() throws Exception {
46 final LifecycleAware legacyLifecycleAware = LegacyLifecycleAwareGenerator.newInstance();
47
48 registerService(pluginBundle, legacyLifecycleAware);
49 enablePlugin(pluginKey);
50 isApplicationSetup = true;
51 defaultLifecycleManager.start();
52
53 defaultLifecycleManager.onPluginFrameworkShuttingDown(new PluginFrameworkShuttingDownEvent(pluginController, pluginAccessor));
54 }
55
56 @Test
57 public void onStopCalledOnceWhenFrameworkShuttingDownCalledTwice() throws Exception {
58 final LifecycleAware deathAware = getLifecycleAwareStarted();
59
60 defaultLifecycleManager.onPluginFrameworkShuttingDown(new PluginFrameworkShuttingDownEvent(pluginController, pluginAccessor));
61 defaultLifecycleManager.onPluginFrameworkShuttingDown(new PluginFrameworkShuttingDownEvent(pluginController, pluginAccessor));
62 verify(deathAware).onStop();
63 }
64
65 @Test
66 public void onStopCalledWhenPluginDisabling() throws Exception {
67 final LifecycleAware deathAware = getLifecycleAwareStarted();
68 defaultLifecycleManager.onPluginDisabling(new PluginDisablingEvent(getMyPlugin()));
69 verify(deathAware).onStop();
70 }
71
72 @Test
73 public void onStopCalledOnceWhenPluginDisablingCalledTwice() throws Exception {
74 final LifecycleAware deathAware = getLifecycleAwareStarted();
75 defaultLifecycleManager.onPluginDisabling(new PluginDisablingEvent(getMyPlugin()));
76 defaultLifecycleManager.onPluginDisabling(new PluginDisablingEvent(getMyPlugin()));
77 verify(deathAware).onStop();
78 }
79
80 @Test
81 public void onStopNotCalledWhenPluginDisablingIsForAnotherPlugin() throws Exception {
82 final LifecycleAware deathAware = getLifecycleAwareStarted();
83 defaultLifecycleManager.onPluginDisabling(new PluginDisablingEvent(getPlugin(pluginKey + ".not-my-event")));
84 verify(deathAware, never()).onStop();
85 }
86
87 @Test
88 public void onStopCalledWhenServiceUnregistered() throws Exception {
89 Pair<LifecycleAware, ServiceReference<LifecycleAware>> started = getLifecycleAwareStartedWithService();
90 unregisterService(started.right());
91 verify(started.left()).onStop();
92 }
93
94 private Plugin getPlugin(String key) {
95 Plugin plugin = mock(Plugin.class);
96 when(plugin.getKey()).thenReturn(key);
97 return plugin;
98 }
99
100 private Plugin getMyPlugin() {
101 return getPlugin(pluginKey);
102 }
103
104 private Pair<LifecycleAware, ServiceReference<LifecycleAware>> getLifecycleAwareStartedWithService() {
105 final Pair<LifecycleAware, ServiceReference<LifecycleAware>> started = mockLifecycleAwareAndRegisterService(pluginBundle);
106 enablePlugin(pluginKey);
107 isApplicationSetup = true;
108
109 defaultLifecycleManager.start();
110 return started;
111 }
112
113 private LifecycleAware getLifecycleAwareStarted() {
114 return getLifecycleAwareStartedWithService().left();
115 }
116
117 private Pair<LifecycleAware, ServiceReference<LifecycleAware>> mockLifecycleAwareAndRegisterService(final Bundle bundle) {
118 return mockLifecycleAwareAndRegisterService(bundle, LifecycleAware.class);
119 }
120 }