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