View Javadoc
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"); // current data version is 2
80          PluginUpgrader pu = new PluginUpgrader(mockPlugin, pluginSettings,
81                  Arrays.asList(new PluginUpgradeTask[]{task1, task5, task3, task2, task4})); // intentionally not in right order
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());        // not upgraded because data version was already 2
90          assertFalse(task2.isUpgraded());        // not upgraded because data version was already 2
91          assertTrue(task3.isUpgraded());         // should upgrade
92          assertTrue(task4.isUpgraded());         // should upgrade
93          assertTrue(task5.isUpgraded());         // should upgrade
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 }