9c59e56480836df3c580ec2b1744d51f9d883d1a
[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  * Modifications Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.controlloop.actor.cds;
22
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertFalse;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertTrue;
27 import static org.mockito.ArgumentMatchers.any;
28 import static org.mockito.ArgumentMatchers.anyLong;
29 import static org.mockito.Mockito.doThrow;
30 import static org.mockito.Mockito.mock;
31 import static org.mockito.Mockito.verify;
32 import static org.mockito.Mockito.when;
33
34 import com.google.common.collect.ImmutableMap;
35 import com.google.protobuf.Struct;
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 import org.junit.Before;
43 import org.junit.Test;
44 import org.mockito.Mock;
45 import org.mockito.MockitoAnnotations;
46 import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
47 import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
48 import org.onap.ccsdk.cds.controllerblueprints.common.api.EventType;
49 import org.onap.ccsdk.cds.controllerblueprints.common.api.Status;
50 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
51 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
52 import org.onap.policy.cds.CdsResponse;
53 import org.onap.policy.cds.client.CdsProcessorGrpcClient;
54 import org.onap.policy.cds.properties.CdsServerProperties;
55 import org.onap.policy.controlloop.ControlLoopOperation;
56 import org.onap.policy.controlloop.VirtualControlLoopEvent;
57 import org.onap.policy.controlloop.actor.cds.CdsActorServiceProvider.CdsActorServiceManager;
58 import org.onap.policy.controlloop.actor.cds.constants.CdsActorConstants;
59 import org.onap.policy.controlloop.actor.test.BasicActor;
60 import org.onap.policy.controlloop.policy.Policy;
61
62 public class CdsActorServiceProviderTest extends BasicActor {
63
64     private static final String CDS_BLUEPRINT_NAME = "vfw-cds";
65     private static final String CDS_BLUEPRINT_VERSION = "1.0.0";
66     private static final UUID REQUEST_ID = UUID.randomUUID();
67     private static final String SUBREQUEST_ID = "123456";
68     private static final String CDS_RECIPE = "test-cds-recipe";
69
70     @Mock
71     private CdsProcessorGrpcClient cdsClient;
72     private CdsActorServiceProvider cdsActor;
73     private Policy policy;
74     private CdsServerProperties cdsProps;
75     private Map<String, String> aaiParams;
76     private VirtualControlLoopEvent onset;
77     private ControlLoopOperation operation;
78
79     /**
80      * Test setup.
81      */
82     @Before
83     public void setup() {
84         MockitoAnnotations.initMocks(this);
85
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 testActorService() {
133         // verify that it all plugs into the ActorService
134         verifyActorService(CdsActorConstants.CDS_ACTOR, "service.yaml");
135     }
136
137     @Test
138     public void testConstructRequestWhenMissingCdsParamsInPolicyPayload() {
139         policy.setPayload(new HashMap<>());
140         Optional<ExecutionServiceInput> cdsRequestOpt = cdsActor.constructRequest(onset, operation, policy, aaiParams);
141
142         assertFalse(cdsRequestOpt.isPresent());
143     }
144
145     @Test
146     public void testConstructRequest() {
147         Optional<ExecutionServiceInput> cdsRequestOpt = cdsActor.constructRequest(onset, operation, policy, aaiParams);
148
149         assertTrue(cdsRequestOpt.isPresent());
150         final ExecutionServiceInput cdsRequest = cdsRequestOpt.get();
151
152         assertTrue(cdsRequest.hasCommonHeader());
153         CommonHeader commonHeader = cdsRequest.getCommonHeader();
154         assertEquals(commonHeader.getRequestId(), REQUEST_ID.toString());
155         assertEquals(SUBREQUEST_ID, commonHeader.getSubRequestId());
156
157         assertTrue(cdsRequest.hasPayload());
158         Struct cdsPayload = cdsRequest.getPayload();
159         assertTrue(cdsPayload.containsFields(CDS_RECIPE + "-request"));
160
161         assertTrue(cdsRequest.hasActionIdentifiers());
162         ActionIdentifiers actionIdentifiers = cdsRequest.getActionIdentifiers();
163         assertEquals(CDS_RECIPE, actionIdentifiers.getActionName());
164         assertEquals(CDS_BLUEPRINT_NAME, actionIdentifiers.getBlueprintName());
165         assertEquals(CDS_BLUEPRINT_VERSION, actionIdentifiers.getBlueprintVersion());
166     }
167
168     @Test
169     public void testRecipePayloads() {
170         assertEquals(0, cdsActor.recipePayloads("").size());
171     }
172
173     @Test
174     public void testRecipes() {
175         assertEquals(0, cdsActor.recipes().size());
176     }
177
178     @Test
179     public void testRecipeTargets() {
180         assertEquals(0, cdsActor.recipeTargets("").size());
181     }
182
183     @Test
184     public void testSendRequestToCdsSuccess() {
185         sendRequestToCds();
186         verify(cdsClient).sendRequest(any(ExecutionServiceInput.class));
187     }
188
189     @Test
190     public void testSendRequestToCdsLatchInterrupted() throws InterruptedException {
191         // Reset cdsClient
192         CountDownLatch countDownLatch = mock(CountDownLatch.class);
193         doThrow(new InterruptedException("Test latch interrupted failure")).when(countDownLatch).await(anyLong(),
194             any(TimeUnit.class));
195         when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(countDownLatch);
196
197         CdsActorServiceProvider.CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
198         CdsResponse response =
199             cdsActorSvcMgr.sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
200         assertTrue(Thread.interrupted());
201         assertNotNull(response);
202         assertEquals(CdsActorConstants.INTERRUPTED, response.getStatus());
203     }
204
205     @Test
206     public void testSendRequestToCdsLatchTimedOut() {
207         CdsActorServiceProvider.CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
208         CdsResponse response =
209             cdsActorSvcMgr.sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
210         assertNotNull(response);
211         assertEquals(CdsActorConstants.TIMED_OUT, response.getStatus());
212     }
213
214     @Test
215     public void testOnMessage() throws InterruptedException {
216         ExecutionServiceOutput message = ExecutionServiceOutput.newBuilder()
217             .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_FAILURE).build()).build();
218
219         // Test "no timeout" scenarios
220         CountDownLatch latch = mock(CountDownLatch.class);
221         when(latch.await(anyLong(), any(TimeUnit.class))).thenReturn(true);
222         when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(latch);
223
224         CdsActorServiceManager cdsActorSvcMgr = sendRequestToCds();
225
226         // #1: Failure test
227         cdsActorSvcMgr.onMessage(message);
228         assertEquals(CdsActorConstants.FAILED, cdsActorSvcMgr.getCdsStatus());
229
230         // #2: Success test
231         cdsActorSvcMgr = sendRequestToCds();
232         message = ExecutionServiceOutput.newBuilder()
233             .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_EXECUTED).build()).build();
234         cdsActorSvcMgr.onMessage(message);
235         assertEquals(CdsActorConstants.SUCCESS, cdsActorSvcMgr.getCdsStatus());
236
237         // #3: Processing test
238         cdsActorSvcMgr = sendRequestToCds();
239         message = ExecutionServiceOutput.newBuilder()
240             .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_PROCESSING).build()).build();
241         cdsActorSvcMgr.onMessage(message);
242         assertEquals(CdsActorConstants.PROCESSING, cdsActorSvcMgr.getCdsStatus());
243     }
244
245     private CdsActorServiceManager sendRequestToCds() {
246         CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
247         cdsActorSvcMgr.sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
248         return cdsActorSvcMgr;
249     }
250 }