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
9 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
19 package org.onap.policy.controlloop.actor.cds;
21 import static org.junit.Assert.assertEquals;
22 import static org.junit.Assert.assertFalse;
23 import static org.junit.Assert.assertTrue;
24 import static org.mockito.Matchers.any;
25 import static org.mockito.Matchers.anyLong;
26 import static org.mockito.Mockito.doThrow;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
31 import com.google.common.collect.ImmutableMap;
32 import java.util.HashMap;
34 import java.util.Optional;
35 import java.util.UUID;
36 import java.util.concurrent.CountDownLatch;
37 import java.util.concurrent.TimeUnit;
38 import org.junit.Before;
39 import org.junit.Rule;
40 import org.junit.Test;
41 import org.junit.rules.ExpectedException;
42 import org.junit.runner.RunWith;
43 import org.mockito.Mock;
44 import org.mockito.runners.MockitoJUnitRunner;
45 import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
46 import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
47 import org.onap.ccsdk.cds.controllerblueprints.common.api.EventType;
48 import org.onap.ccsdk.cds.controllerblueprints.common.api.Status;
49 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
50 import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceOutput;
51 import org.onap.policy.cds.client.CdsProcessorGrpcClient;
52 import org.onap.policy.cds.properties.CdsServerProperties;
53 import org.onap.policy.controlloop.ControlLoopOperation;
54 import org.onap.policy.controlloop.VirtualControlLoopEvent;
55 import org.onap.policy.controlloop.actor.cds.CdsActorServiceProvider.CdsActorServiceManager;
56 import org.onap.policy.controlloop.actor.cds.constants.CdsActorConstants;
57 import org.onap.policy.controlloop.policy.Policy;
59 @RunWith(MockitoJUnitRunner.class)
60 public class CdsActorServiceProviderTest {
62 private static final String CDS_BLUEPRINT_NAME = "vfw-cds";
63 private static final String CDS_BLUEPRINT_VERSION = "1.0.0";
64 private static final UUID REQUEST_ID = UUID.randomUUID();
65 private static final String SUBREQUEST_ID = "123456";
68 public ExpectedException exceptionRule = ExpectedException.none();
70 private CdsProcessorGrpcClient cdsClient;
71 private CdsActorServiceProvider cdsActor;
72 private Policy policy;
73 private CdsServerProperties cdsProps;
74 private Map<String, String> aaiParams;
75 private VirtualControlLoopEvent onset;
76 private ControlLoopOperation operation;
84 policy = new Policy();
85 Map<String, String> payloadMap = new HashMap<String, String>() {
87 put(CdsActorConstants.KEY_CBA_NAME, CDS_BLUEPRINT_NAME);
88 put(CdsActorConstants.KEY_CBA_VERSION, CDS_BLUEPRINT_VERSION);
89 put("data", "{\"mapInfo\":{\"key\":\"val\"},\"arrayInfo\":[\"one\",\"two\"],\"paramInfo\":\"val\"}");
92 policy.setPayload(payloadMap);
93 policy.setRecipe("CDS");
95 // Setup the CDS properties
96 cdsProps = new CdsServerProperties();
97 cdsProps.setHost("10.10.10.10");
98 cdsProps.setPort(2000);
99 cdsProps.setUsername("testUser");
100 cdsProps.setPassword("testPassword");
101 cdsProps.setTimeout(1);
104 aaiParams = ImmutableMap.of("service-instance-id", "1234", "generic-vnf-id", "5678");
107 when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(mock(CountDownLatch.class));
109 // Setup the cdsActor
110 cdsActor = new CdsActorServiceProvider();
113 onset = new VirtualControlLoopEvent();
114 onset.setRequestId(REQUEST_ID);
116 // Setup controlloop operation object
117 operation = new ControlLoopOperation();
118 operation.setSubRequestId(SUBREQUEST_ID);
122 public void testActor() {
123 assertEquals(cdsActor.actor(), CdsActorConstants.CDS_ACTOR);
127 public void testConstructRequest() {
128 policy.setPayload(new HashMap<>());
129 Optional<ExecutionServiceInput> cdsRequestOpt = cdsActor
130 .constructRequest(onset, operation, policy, aaiParams);
132 assertFalse(cdsRequestOpt.isPresent());
136 public void testConstructRequestWhenMissingCdsParamsInPolicyPayload() {
137 Optional<ExecutionServiceInput> cdsRequestOpt = cdsActor
138 .constructRequest(onset, operation, policy, aaiParams);
140 assertTrue(cdsRequestOpt.isPresent());
141 final ExecutionServiceInput cdsRequest = cdsRequestOpt.get();
143 assertTrue(cdsRequest.hasCommonHeader());
144 CommonHeader commonHeader = cdsRequest.getCommonHeader();
145 assertEquals(commonHeader.getRequestId(), REQUEST_ID.toString());
146 assertEquals(commonHeader.getSubRequestId(), SUBREQUEST_ID);
148 assertTrue(cdsRequest.hasPayload());
150 assertTrue(cdsRequest.hasActionIdentifiers());
151 ActionIdentifiers actionIdentifiers = cdsRequest.getActionIdentifiers();
152 assertEquals(actionIdentifiers.getActionName(), CdsActorConstants.CDS_ACTOR);
153 assertEquals(actionIdentifiers.getBlueprintName(), CDS_BLUEPRINT_NAME);
154 assertEquals(actionIdentifiers.getBlueprintVersion(), CDS_BLUEPRINT_VERSION);
158 public void testRecipePayloads() {
159 assertEquals(cdsActor.recipePayloads("").size(), 0);
163 public void testRecipes() {
164 assertEquals(cdsActor.recipes().size(), 0);
168 public void testRecipeTargets() {
169 assertEquals(cdsActor.recipeTargets("").size(), 0);
173 public void testSendRequestToCdsSuccess() {
175 verify(cdsClient).sendRequest(any(ExecutionServiceInput.class));
179 public void testSendRequestToCdsLatchInterrupted() throws InterruptedException {
181 CountDownLatch countDownLatch = mock(CountDownLatch.class);
182 doThrow(new InterruptedException("Test latch interrupted failure")).when(countDownLatch)
183 .await(anyLong(), any(TimeUnit.class));
184 when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(countDownLatch);
186 CdsActorServiceProvider.CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
187 String response = cdsActorSvcMgr
188 .sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
189 assertTrue(Thread.interrupted());
190 assertEquals(response, CdsActorConstants.INTERRUPTED);
194 public void testSendRequestToCdsLatchTimedOut() {
195 CdsActorServiceProvider.CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
196 String response = cdsActorSvcMgr
197 .sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
198 assertEquals(response, CdsActorConstants.TIMED_OUT);
202 public void testOnMessage() throws InterruptedException {
203 ExecutionServiceOutput message = ExecutionServiceOutput.newBuilder()
204 .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_FAILURE).build()).build();
206 // Test "no timeout" scenarios
207 CountDownLatch latch = mock(CountDownLatch.class);
208 when(latch.await(anyLong(), any(TimeUnit.class))).thenReturn(true);
209 when(cdsClient.sendRequest(any(ExecutionServiceInput.class))).thenReturn(latch);
211 CdsActorServiceManager cdsActorSvcMgr = sendRequestToCds();
214 cdsActorSvcMgr.onMessage(message);
215 assertEquals(cdsActorSvcMgr.getCdsResponse(), CdsActorConstants.FAILED);
218 cdsActorSvcMgr = sendRequestToCds();
219 message = ExecutionServiceOutput.newBuilder()
220 .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_EXECUTED).build()).build();
221 cdsActorSvcMgr.onMessage(message);
222 assertEquals(cdsActorSvcMgr.getCdsResponse(), CdsActorConstants.SUCCESS);
224 // #3: Processing test
225 cdsActorSvcMgr = sendRequestToCds();
226 message = ExecutionServiceOutput.newBuilder()
227 .setStatus(Status.newBuilder().setEventType(EventType.EVENT_COMPONENT_PROCESSING).build()).build();
228 cdsActorSvcMgr.onMessage(message);
229 assertEquals(cdsActorSvcMgr.getCdsResponse(), CdsActorConstants.PROCESSING);
232 private CdsActorServiceManager sendRequestToCds() {
233 CdsActorServiceManager cdsActorSvcMgr = cdsActor.new CdsActorServiceManager();
234 cdsActorSvcMgr.sendRequestToCds(cdsClient, cdsProps, ExecutionServiceInput.newBuilder().build());
235 return cdsActorSvcMgr;