View Javadoc
1   package com.atlassian.plugin.manager;
2   
3   import com.atlassian.plugin.manager.StateTracker.State;
4   import org.junit.After;
5   import org.junit.Before;
6   import org.junit.Test;
7   import org.junit.runner.RunWith;
8   import org.mockito.junit.MockitoJUnitRunner;
9   
10  import static com.atlassian.plugin.manager.StateTracker.State.DELAYED;
11  import static com.atlassian.plugin.manager.StateTracker.State.NOT_STARTED;
12  import static com.atlassian.plugin.manager.StateTracker.State.RESUMING;
13  import static com.atlassian.plugin.manager.StateTracker.State.SHUTDOWN;
14  import static com.atlassian.plugin.manager.StateTracker.State.SHUTTING_DOWN;
15  import static com.atlassian.plugin.manager.StateTracker.State.STARTED;
16  import static com.atlassian.plugin.manager.StateTracker.State.STARTING;
17  import static com.atlassian.plugin.manager.StateTracker.State.WARM_RESTARTING;
18  import static org.hamcrest.MatcherAssert.assertThat;
19  import static org.hamcrest.core.Is.is;
20  import static org.junit.Assert.fail;
21  
22  
23  @RunWith(MockitoJUnitRunner.class)
24  public class TestStateTracker {
25      private StateTracker stateTracker;
26  
27      @Before
28      public void setup() {
29          stateTracker = new StateTracker();
30      }
31  
32      @After
33      public void tearDown() {
34          stateTracker = null;
35      }
36  
37      @Test
38      public void testStandardTransitions() throws Exception {
39          assertThat(stateTracker.get(), is(NOT_STARTED));
40          // The standardTransitions is one loop of the path StateTracker usually runs through.
41          // This is not just State.values() - it omits the start point NOT_STARTED, and also
42          // WARM_RESTARTING which is tested independently later.
43          final State[] standardTransitions = {STARTING, DELAYED, RESUMING, STARTED, SHUTTING_DOWN, SHUTDOWN, STARTING};
44          for (final State state : standardTransitions) {
45              stateTracker.setState(state);
46              assertThat(stateTracker.get(), is(state));
47          }
48      }
49  
50      private void performStateSequence(final State... desiredStates) {
51          for (final State state : desiredStates) {
52              stateTracker.setState(state);
53          }
54      }
55  
56      @Test
57      public void testIllegalNotStartedTransitions() throws Exception {
58          performStateSequence();
59          validateIllegalStates(NOT_STARTED, DELAYED, RESUMING, STARTED, WARM_RESTARTING, SHUTDOWN);
60      }
61  
62      @Test
63      public void testIllegalStartingTransitions() throws Exception {
64          performStateSequence(STARTING);
65          validateIllegalStates(NOT_STARTED, STARTING, RESUMING, STARTED, WARM_RESTARTING, SHUTTING_DOWN, SHUTDOWN);
66      }
67  
68      @Test
69      public void testIllegalDelayedTransitions() throws Exception {
70          performStateSequence(STARTING, DELAYED);
71          validateIllegalStates(NOT_STARTED, STARTING, DELAYED, STARTED, WARM_RESTARTING, SHUTDOWN);
72      }
73  
74      @Test
75      public void testIllegalResumingTransitions() throws Exception {
76          performStateSequence(STARTING, DELAYED, RESUMING);
77          validateIllegalStates(NOT_STARTED, STARTING, DELAYED, RESUMING, WARM_RESTARTING, SHUTTING_DOWN, SHUTDOWN);
78      }
79  
80      @Test
81      public void testIllegalStartedTransitions() throws Exception {
82          performStateSequence(STARTING, DELAYED, RESUMING, STARTED);
83          validateIllegalStates(NOT_STARTED, STARTING, DELAYED, RESUMING, STARTED, SHUTDOWN);
84      }
85  
86      @Test
87      public void testIllegalWarmRestartingTransitions() throws Exception {
88          performStateSequence(STARTING, DELAYED, RESUMING, STARTED, WARM_RESTARTING);
89          validateIllegalStates(NOT_STARTED, STARTING, DELAYED, RESUMING, WARM_RESTARTING, SHUTTING_DOWN, SHUTDOWN);
90      }
91  
92      @Test
93      public void testIllegalWarmRestartTransitions() throws Exception {
94          performStateSequence(STARTING, DELAYED, RESUMING, STARTED, WARM_RESTARTING, STARTED);
95          validateIllegalStates(NOT_STARTED, STARTING, DELAYED, RESUMING, STARTED, SHUTDOWN);
96      }
97  
98      @Test
99      public void testIllegalShuttingDownTransitions() throws Exception {
100         performStateSequence(STARTING, DELAYED, RESUMING, STARTED, SHUTTING_DOWN);
101         validateIllegalStates(NOT_STARTED, STARTING, DELAYED, RESUMING, STARTED, WARM_RESTARTING, SHUTTING_DOWN);
102     }
103 
104     @Test
105     public void testIllegalShutdownTransitions() throws Exception {
106         performStateSequence(STARTING, DELAYED, RESUMING, STARTED, SHUTTING_DOWN, SHUTDOWN);
107         validateIllegalStates(NOT_STARTED, DELAYED, RESUMING, STARTED, WARM_RESTARTING, SHUTTING_DOWN, SHUTDOWN);
108     }
109 
110     @Test
111     public void canShutdownDirectlyFromEarlyStartup() {
112         performStateSequence(STARTING, DELAYED, SHUTTING_DOWN, SHUTDOWN);
113     }
114 
115     private void validateIllegalStates(final State... illegalStates) {
116         final State initialState = stateTracker.get();
117         for (final State illegalState : illegalStates) {
118             try {
119                 stateTracker.setState(illegalState);
120                 fail(initialState + " should not be allowed to transition to: " + illegalState);
121             } catch (final IllegalStateException expected) {
122                 assertThat(stateTracker.get(), is(initialState));
123             }
124         }
125     }
126 }