1 package com.atlassian.sal.core.upgrade;
2
3 import com.atlassian.plugin.Plugin;
4 import com.atlassian.plugin.PluginInformation;
5 import com.atlassian.sal.api.pluginsettings.PluginSettings;
6 import com.atlassian.sal.api.upgrade.PluginUpgradeTask;
7 import org.junit.Test;
8 import org.junit.runner.RunWith;
9 import org.mockito.Mock;
10 import org.mockito.junit.MockitoJUnitRunner;
11
12 import java.util.ArrayList;
13 import java.util.Arrays;
14 import java.util.HashMap;
15 import java.util.Map;
16
17 import static org.junit.Assert.assertFalse;
18 import static org.junit.Assert.assertTrue;
19 import static org.mockito.ArgumentMatchers.eq;
20 import static org.mockito.Mockito.atLeastOnce;
21 import static org.mockito.Mockito.verify;
22 import static org.mockito.Mockito.verifyNoMoreInteractions;
23 import static org.mockito.Mockito.when;
24
25 @RunWith(MockitoJUnitRunner.Silent.class)
26 public class TestPluginUpgrader {
27
28 @Mock
29 private Plugin mockPlugin;
30 @Mock
31 private PluginSettings mockPluginSettings;
32
33 @Test
34 public void testUpgradeFromScratch() {
35 final UpgradeTaskStub task = new UpgradeTaskStub(10);
36
37 PluginInformation info = new PluginInformation();
38
39 when(mockPlugin.getKey()).thenReturn("foo.bar");
40 when(mockPlugin.getPluginInformation()).thenReturn(info);
41
42 PluginUpgrader pu = new PluginUpgrader(mockPlugin, mockPluginSettings,
43 new ArrayList<PluginUpgradeTask>() {{
44 add(task);
45 }});
46
47 pu.upgrade();
48
49 assertTrue(task.isUpgraded());
50 verify(mockPluginSettings, atLeastOnce()).get(eq("foo.bar:build"));
51 verify(mockPluginSettings).put(eq("foo.bar:build"), eq("10"));
52 verifyNoMoreInteractions(mockPluginSettings);
53 }
54
55 @Test
56 public void testUpgradeFrom2To5() {
57 final UpgradeTaskStub task1 = new UpgradeTaskStub(1);
58 final UpgradeTaskStub task2 = new UpgradeTaskStub(2);
59 final UpgradeTaskStub task3 = new UpgradeTaskStub(3);
60 final UpgradeTaskStub task4 = new UpgradeTaskStub(4);
61 final UpgradeTaskStub task5 = new UpgradeTaskStub(5);
62
63 PluginSettings pluginSettings = new PluginSettings() {
64 private Map<String, Object> map = new HashMap<>();
65
66 public Object remove(String key) {
67 return map.remove(key);
68 }
69
70 public Object put(String key, Object value) {
71 return map.put(key, value);
72 }
73
74 public Object get(String key) {
75 return map.get(key);
76 }
77 };
78
79 pluginSettings.put("foo.bar:build", "2");
80 PluginUpgrader pu = new PluginUpgrader(mockPlugin, pluginSettings,
81 Arrays.asList(new PluginUpgradeTask[]{task1, task5, task3, task2, task4}));
82
83 PluginInformation info = new PluginInformation();
84 when(mockPlugin.getKey()).thenReturn("foo.bar");
85 when(mockPlugin.getPluginInformation()).thenReturn(info);
86
87 pu.upgrade();
88
89 assertFalse(task1.isUpgraded());
90 assertFalse(task2.isUpgraded());
91 assertTrue(task3.isUpgraded());
92 assertTrue(task4.isUpgraded());
93 assertTrue(task5.isUpgraded());
94
95 verify(mockPlugin, atLeastOnce()).getKey();
96 verifyNoMoreInteractions(mockPluginSettings);
97 }
98
99 @Test
100 public void testUpgradeOldVersion() {
101 final UpgradeTaskStub task = new UpgradeTaskStub(10);
102 PluginInformation info = new PluginInformation();
103
104 when(mockPlugin.getKey()).thenReturn("foo.bar");
105 when(mockPlugin.getPluginInformation()).thenReturn(info);
106 when(mockPluginSettings.get(eq("foo.bar:build"))).thenReturn("5");
107
108 PluginUpgrader pu = new PluginUpgrader(mockPlugin, mockPluginSettings,
109 new ArrayList<PluginUpgradeTask>() {{
110 add(task);
111 }});
112
113 pu.upgrade();
114
115 assertTrue(task.isUpgraded());
116 verify(mockPluginSettings, atLeastOnce()).get(eq("foo.bar:build"));
117 verify(mockPluginSettings).put(eq("foo.bar:build"), eq("10"));
118 verifyNoMoreInteractions(mockPluginSettings);
119 }
120
121 @Test
122 public void testUpgradeNoTasks() {
123 final UpgradeTaskStub task = new UpgradeTaskStub(10);
124
125 PluginInformation info = new PluginInformation();
126 when(mockPlugin.getKey()).thenReturn("foo.bar");
127 when(mockPlugin.getPluginInformation()).thenReturn(info);
128 when(mockPluginSettings.get(eq("foo.bar:build"))).thenReturn("15");
129
130 PluginUpgrader pu = new PluginUpgrader(mockPlugin, mockPluginSettings,
131 new ArrayList<PluginUpgradeTask>() {{
132 add(task);
133 }});
134
135 pu.upgrade();
136
137 assertFalse(task.isUpgraded());
138 verify(mockPluginSettings, atLeastOnce()).get(eq("foo.bar:build"));
139 verifyNoMoreInteractions(mockPluginSettings);
140 }
141 }