Clean up minor checkstyle/sonar issues
[policy/models.git] / models-interactions / model-actors / actor.cds / src / test / java / org / onap / policy / controlloop / actor / cds / CdsActorServiceProviderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * Copyright (C) 2019 Bell Canada. All rights reserved.
4  * Modifications Copyright (C) 2020 Nordix Foundation.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  * ============LICENSE_END=========================================================
18  */
19
20 package org.onap.policy.controlloop.actor.cds;
21
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertFalse;
24 import static org.junit.Assert.assertNotNull;
25 import static org.junit.Assert.assertTrue;
26 import static org.mockito.Matchers.any;
27 import static org.mockito.Matchers.anyLong;
28 import static org.mockito.Mockito.doThrow;
29 import static org.mockito.Mockito.mock;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
32
33 import com.google.common.collect.ImmutableMap;
34 import com.google.protobuf.Struct;
35
36 import java.util.HashMap;
37 import java.util.Map;
38 import java.util.Optional;
39 import java.util.UUID;
40 import java.util.concurrent.CountDownLatch;
41 import java.util.concurrent.TimeUnit;
42
43 import org.junit.Before;
44 import org.junit.Test;
45 import org.junit.runner.RunWith;
46 import org.mockito.Mock;
47 import org.mockito.runners.MockitoJUnitRunner;
48 import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
49 import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
50 import org.onap.ccsdk.cds.controllerblueprints.common.api.EventType;
51 import org.onap.ccsdk.cds.controllerblueprints.common.api.Status;
52 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
53 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
54 import org.onap.policy.cds.CdsResponse;
55 import org.onap.policy.cds.client.CdsProcessorGrpcClient;
56 import org.onap.policy.cds.properties.CdsServerProperties;
57 import org.onap.policy.controlloop.ControlLoopOperation;
58 import org.onap.policy.controlloop.VirtualControlLoopEvent;
59 import org.onap.policy.controlloop.actor.cds.CdsActorServiceProvider.CdsActorServiceManager;
60 import org.onap.policy.controlloop.actor.cds.constants.CdsActorConstants;
61 import org.onap.policy.controlloop.policy.Policy;
62
63 @RunWith(MockitoJUnitRunner.class)
64 public class CdsActorServiceProviderTest {
65
66     private static final String CDS_BLUEPRINT_NAME = "vfw-cds";
67     private static final String CDS_BLUEPRINT_VERSION = "1.0.0";
68     private static final UUID REQUEST_ID = UUID.randomUUID();
69     private static final String SUBREQUEST_ID = "123456";
70     private static final String CDS_RECIPE = "test-cds-recipe";
71
72     @Mock
73     private CdsProcessorGrpcClient cdsClient;
74     private CdsActorServiceProvider cdsActor;
75     private Policy policy;
76     private CdsServerProperties cdsProps;
77     private Map<String, String> aaiParams;
78     private VirtualControlLoopEvent onset;
79     private ControlLoopOperation operation;
80
81     /**
82      * Test setup.
83      */
84     @Before
85     public void setup() {
86         // Setup policy
87         policy = new Policy();
88         Map<String, String> payloadMap = new HashMap<String, String>() {
89             private static final long serialVersionUID = 1L;
90
91             {
92                 put(CdsActorConstants.KEY_CBA_NAME, CDS_BLUEPRINT_NAME);
93                 put(CdsActorConstants.KEY_CBA_VERSION, CDS_BLUEPRINT_VERSION);
94                 put("data", "{\"mapInfo\":{\"key\":\"val\"},\"arrayInfo\":[\"one\",\"two\"],\"paramInfo\":\"val\"}");
95             }
96         };
97         policy.setPayload(payloadMap);
98         policy.setRecipe(CDS_RECIPE);
99
100         // Setup the CDS properties
101         cdsProps = new CdsServerProperties();
102         cdsProps.setHost("10.10.10.10");
103         cdsProps.setPort(2000);
104         cdsProps.setUsername("testUser");
105         cdsProps.setPassword("testPassword");
106         cdsProps.setTimeout(1);
107
108         // Setup aaiParams
109         aaiParams = ImmutableMap.of("service-instance-id", "1234", "generic-vnf-id", "5678");
110
111         // Setup cdsClient
112         when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(mock(CountDownLatch.class));
113
114         // Setup the cdsActor
115         cdsActor = new CdsActorServiceProvider();
116
117         // Setup onset event
118         onset = new VirtualControlLoopEvent();
119         onset.setRequestId(REQUEST_ID);
120
121         // Setup controlloop operation object
122         operation = new ControlLoopOperation();
123         operation.setSubRequestId(SUBREQUEST_ID);
124     }
125
126     @Test
127     public void testActor() {
128         assertEquals(CdsActorConstants.CDS_ACTOR, cdsActor.actor());
129     }
130
131     @Test
132     public void testConstructRequestWhenMissingCdsParamsInPolicyPayload() {
133         policy.setPayload(new HashMap<>());
134         Optional<ExecutionServiceInput> cdsRequestOpt = cdsActor.constructRequest(onset, operation, policy, aaiParams);
135
136         assertFalse(cdsRequestOpt.isPresent());
137     }
138
139     @Test
140     public void testConstructRequest() {
141         Optional<ExecutionServiceInput> cdsRequestOpt = cdsActor.constructRequest(onset, operation, policy, aaiParams);
142
143         assertTrue(cdsRequestOpt.isPresent());
144         final ExecutionServiceInput cdsRequest = cdsRequestOpt.get();
145
146         assertTrue(cdsRequest.hasCommonHeader());
147         CommonHeader commonHeader = cdsRequest.getCommonHeader();
148         assertEquals(commonHeader.getRequestId(), REQUEST_ID.toString());
149         assertEquals(SUBREQUEST_ID, commonHeader.getSubRequestId());
150
151         assertTrue(cdsRequest.hasPayload());
152         Struct cdsPayload = cdsRequest.getPayload();
153         assertTrue(cdsPayload.containsFields(CDS_RECIPE + "-request"));
154
155         assertTrue(cdsRequest.hasActionIdentifiers());
156         ActionIdentifiers actionIdentifiers = cdsRequest.getActionIdentifiers();
157         assertEquals(CDS_RECIPE, actionIdentifiers.getActionName());
158         assertEquals(CDS_BLUEPRINT_NAME, actionIdentifiers.getBlueprintName());
159         assertEquals(CDS_BLUEPRINT_VERSION, actionIdentifiers.getBlueprintVersion());
160     }
161
162     @Test
163     public void testRecipePayloads() {
164         assertEquals(0, cdsActor.recipePayloads("").size());
165     }
166
167     @Test
168     public void testRecipes() {
169         assertEquals(0, cdsActor.recipes().size());
170     }
171
172     @Test
173     public void testRecipeTargets() {
174         assertEquals(0, cdsActor.recipeTargets("").size());
175     }
176
177     @Test
178     public void testSendRequestToCdsSuccess() {
179         sendRequestToCds();
180         verify(cdsClient).sendRequest(any(ExecutionServiceInput.class));
181     }
182
183     @Test
184     public void testSendRequestToCdsLatchInterrupted() throws InterruptedException {
185         // Reset cdsClient
186         CountDownLatch countDownLatch = mock(CountDownLatch.class);
187         doThrow(new InterruptedException("Test latch interrupted failure")).when(countDownLatch).await(anyLong(),
188             any(TimeUnit.class));
189         when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(countDownLatch);
190
191         CdsActorServiceProvider.CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
192         CdsResponse response =
193             cdsActorSvcMgr.sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
194         assertTrue(Thread.interrupted());
195         assertNotNull(response);
196         assertEquals(CdsActorConstants.INTERRUPTED, response.getStatus());
197     }
198
199     @Test
200     public void testSendRequestToCdsLatchTimedOut() {
201         CdsActorServiceProvider.CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
202         CdsResponse response =
203             cdsActorSvcMgr.sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
204         assertNotNull(response);
205         assertEquals(CdsActorConstants.TIMED_OUT, response.getStatus());
206     }
207
208     @Test
209     public void testOnMessage() throws InterruptedException {
210         ExecutionServiceOutput message = ExecutionServiceOutput.newBuilder()
211             .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_FAILURE).build()).build();
212
213         // Test "no timeout" scenarios
214         CountDownLatch latch = mock(CountDownLatch.class);
215         when(latch.await(anyLong(), any(TimeUnit.class))).thenReturn(true);
216         when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(latch);
217
218         CdsActorServiceManager cdsActorSvcMgr = sendRequestToCds();
219
220         // #1: Failure test
221         cdsActorSvcMgr.onMessage(message);
222         assertEquals(CdsActorConstants.FAILED, cdsActorSvcMgr.getCdsStatus());
223
224         // #2: Success test
225         cdsActorSvcMgr = sendRequestToCds();
226         message = ExecutionServiceOutput.newBuilder()
227             .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_EXECUTED).build()).build();
228         cdsActorSvcMgr.onMessage(message);
229         assertEquals(CdsActorConstants.SUCCESS, cdsActorSvcMgr.getCdsStatus());
230
231         // #3: Processing test
232         cdsActorSvcMgr = sendRequestToCds();
233         message = ExecutionServiceOutput.newBuilder()
234             .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_PROCESSING).build()).build();
235         cdsActorSvcMgr.onMessage(message);
236         assertEquals(CdsActorConstants.PROCESSING, cdsActorSvcMgr.getCdsStatus());
237     }
238
239     private CdsActorServiceManager sendRequestToCds() {
240         CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
241         cdsActorSvcMgr.sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
242         return cdsActorSvcMgr;
243     }
244 }