[APPC-44] APPC Lifecycle Management refactor
[appc.git] / appc-lifecycle-management / appc-lifecycle-management-core / src / test / java / org / openecomp / appc / LifecycleManagerTest.java
1 /*-\r
2  * ============LICENSE_START=======================================================
3  * ONAP : APPC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Copyright (C) 2017 Amdocs\r
8  * =============================================================================\r
9  * Licensed under the Apache License, Version 2.0 (the "License");\r
10  * you may not use this file except in compliance with the License.\r
11  * You may obtain a copy of the License at\r
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0\r
14  * 
15  * Unless required by applicable law or agreed to in writing, software\r
16  * distributed under the License is distributed on an "AS IS" BASIS,\r
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
18  * See the License for the specific language governing permissions and\r
19  * limitations under the License.\r
20  * 
21  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
22  * ============LICENSE_END=========================================================\r
23  */\r
24 \r
25 package org.openecomp.appc;\r
26 \r
27 import org.junit.Assert;\r
28 import org.junit.Test;\r
29 import org.openecomp.appc.exceptions.InvalidInputException;\r
30 import org.openecomp.appc.lifecyclemanager.LifecycleManager;\r
31 import org.openecomp.appc.statemachine.StateMetaDataReader;\r
32 import org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl;\r
33 import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;\r
34 import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;\r
35 import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader;\r
36 import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader.VNFOperation;\r
37 import org.openecomp.appc.statemachine.objects.Event;\r
38 import org.openecomp.appc.statemachine.objects.State;\r
39 import org.openecomp.appc.statemachine.objects.StateMachineMetadata;\r
40 import org.openecomp.appc.statemachine.objects.Transition;\r
41 \r
42 import java.util.*;\r
43 \r
44 \r
45 public class LifecycleManagerTest {\r
46 \r
47     private static final State[] VALID_LOCK_STATES = new State[] {\r
48             new State("instantiated"),\r
49             new State("configured"),\r
50             new State("tested"),\r
51             new State("running"),\r
52             new State("error"),\r
53             new State("unknown"),\r
54             new State("created"),\r
55             new State("not orchestrated"),\r
56             new State("stopped"),\r
57     };\r
58 \r
59     @Test\r
60     public void handleEvent() throws InvalidInputException, LifecycleException, NoTransitionDefinedException {\r
61 \r
62         StateMachineMetadata metadata = getMetaDataReader().readMetadata();\r
63         LifecycleManagerImpl lifecycleManager = new LifecycleManagerImpl();\r
64 \r
65         /*\r
66          * Testing Positive Scenario passing the valid events and validating the StateMachineResponse\r
67          */\r
68         for(State state:metadata.getStates()){\r
69 \r
70             for(Transition transition:state.getTransitions()){\r
71                 Event event = transition.getEvent();\r
72                 State nextStateFromMetadata = transition.getNextState();\r
73 \r
74                 String expectedNextState = lifecycleManager.getNextState(null,state.toString(),event.toString());\r
75                 Assert.assertEquals(expectedNextState,nextStateFromMetadata.toString());\r
76             }\r
77         }\r
78 \r
79         /*\r
80         Testing Negative Scenarios, 1. Passing the valid Events for which Transition is not defined in\r
81         Metadata and validating the StateMachineResponse 2. Passing the invalid events which are not\r
82         registered as events in the StateMachineMetadata and validating StateMachineResponse\r
83          */\r
84         for(State state:metadata.getStates()){\r
85 \r
86             for(Transition transition:state.getTransitions()){\r
87                 List<Event> negativeEvents = getNegativeEvents(state,metadata.getEvents());\r
88 \r
89                 for(Event negativeEvent:negativeEvents){\r
90                     boolean flag =false;\r
91                     try{\r
92                         lifecycleManager.getNextState(null,state.toString(),negativeEvent.toString());\r
93 \r
94                     }\r
95                     catch (NoTransitionDefinedException e){\r
96                         flag =true;\r
97                     }\r
98                     Assert.assertEquals(flag,true);\r
99 \r
100                     flag = false;\r
101                     try{\r
102                         lifecycleManager.getNextState(null,state.toString(),"PUT");\r
103                     }\r
104                     catch(LifecycleException e){\r
105                         flag = true;\r
106                     }\r
107                     Assert.assertTrue(flag);\r
108 \r
109                 }\r
110             }\r
111         }\r
112     }\r
113 \r
114     @Test\r
115     public void testNotOrchestratedState() throws LifecycleException, NoTransitionDefinedException {\r
116         LifecycleManager lifecycleManager = new LifecycleManagerImpl();\r
117         String nextState = lifecycleManager.getNextState(\r
118                 null,"NOT ORCHESTRATED",VNFOperation.Configure.toString());\r
119         Assert.assertEquals(nextState,"Configuring");\r
120     }\r
121 \r
122     @Test(expected = NoTransitionDefinedException.class)\r
123     public void testBakckingUpState() throws LifecycleException, NoTransitionDefinedException {\r
124         LifecycleManager lifecycleManager = new LifecycleManagerImpl();\r
125         lifecycleManager.getNextState(null,"Software_Uploading",VNFOperation.Configure.toString());\r
126     }\r
127 \r
128     private List<Event> getNegativeEvents(State state,Set<Event> events) {\r
129         List<Event> negativeEventList = new ArrayList<>();\r
130         negativeEventList.addAll(events);\r
131 \r
132         for(Transition transition: state.getTransitions()){\r
133             negativeEventList.remove(transition.getEvent());\r
134         }\r
135         return negativeEventList;\r
136     }\r
137 \r
138     @Test\r
139     public void testLockStates() throws LifecycleException, NoTransitionDefinedException {\r
140         StateMachineMetadata metadata = getMetaDataReader().readMetadata();\r
141         LifecycleManagerImpl lifecycleManager = new LifecycleManagerImpl();\r
142 \r
143         for(State state: metadata.getStates()) {\r
144             if(isValidState(state, VALID_LOCK_STATES)) {\r
145                 assertSameNextState(lifecycleManager, state, VNFOperation.Lock);\r
146                 assertSameNextState(lifecycleManager, state, VnfMetaDataReader.VNFOperation.Unlock);\r
147                 assertSameNextState(lifecycleManager, state, VNFOperation.CheckLock);\r
148             } else {\r
149                 assertNoNextState(lifecycleManager, state, VNFOperation.Lock);\r
150                 assertNoNextState(lifecycleManager, state, VNFOperation.Unlock);\r
151                 assertNoNextState(lifecycleManager, state, VNFOperation.CheckLock);\r
152             }\r
153         }\r
154     }\r
155 \r
156     private boolean isValidState(State state, State[] validStates) {\r
157         for(State validState: validStates) {\r
158             if(validState.equals(state)) {\r
159                 return true;\r
160             }\r
161         }\r
162         return false;\r
163     }\r
164 \r
165     private void assertSameNextState(LifecycleManager lifecycleManager, State state, VNFOperation operation)\r
166             throws LifecycleException, NoTransitionDefinedException {\r
167         Assert.assertEquals(state.getStateName(),\r
168                 lifecycleManager.getNextState("no-matter", state.getStateName(), operation.toString()));\r
169     }\r
170 \r
171     private void assertNoNextState(LifecycleManager lifecycleManager, State state, VNFOperation operation)\r
172             throws LifecycleException {\r
173         try {\r
174             lifecycleManager.getNextState("no-matter", state.getStateName(), operation.toString());\r
175             Assert.fail("lifecycleManager.getNextState() should fail for state [" + state\r
176                     + "], operation [" + operation + "]");\r
177         } catch(NoTransitionDefinedException e) {\r
178             // this exception is excepted\r
179         }\r
180     }\r
181 \r
182     private StateMetaDataReader getMetaDataReader() {\r
183         return new VnfMetaDataReader();\r
184     }\r
185 }\r