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
41
42
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 }