2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * 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
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  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=========================================================
 
  21 package org.onap.policy.controlloop.actor.sdnr;
 
  23 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 
  24 import static org.junit.Assert.assertEquals;
 
  25 import static org.junit.Assert.assertFalse;
 
  26 import static org.junit.Assert.assertTrue;
 
  27 import static org.mockito.ArgumentMatchers.any;
 
  28 import static org.mockito.Mockito.verify;
 
  30 import java.util.concurrent.CompletableFuture;
 
  31 import java.util.concurrent.ExecutionException;
 
  32 import java.util.concurrent.TimeoutException;
 
  33 import java.util.function.BiConsumer;
 
  34 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 
  35 import org.onap.policy.common.endpoints.event.comm.TopicSource;
 
  36 import org.onap.policy.common.utils.coder.StandardCoderObject;
 
  37 import org.onap.policy.controlloop.actor.test.BasicBidirectionalTopicOperation;
 
  38 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
 
  39 import org.onap.policy.controlloop.actorserviceprovider.Util;
 
  40 import org.onap.policy.controlloop.actorserviceprovider.impl.OperationMaker;
 
  41 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
 
  42 import org.onap.policy.controlloop.policy.PolicyResult;
 
  43 import org.onap.policy.sdnr.PciBody;
 
  44 import org.onap.policy.sdnr.PciMessage;
 
  45 import org.onap.policy.sdnr.PciResponse;
 
  46 import org.onap.policy.sdnr.Status;
 
  47 import org.onap.policy.sdnr.util.StatusCodeEnum;
 
  48 import org.onap.policy.simulators.SdnrTopicServer;
 
  49 import org.onap.policy.simulators.TopicServer;
 
  50 import org.powermock.reflect.Whitebox;
 
  52 public abstract class BasicSdnrOperation extends BasicBidirectionalTopicOperation<PciMessage> {
 
  54     protected PciMessage response;
 
  57      * Constructs the object using a default actor and operation name.
 
  59     public BasicSdnrOperation() {
 
  64      * Constructs the object.
 
  66      * @param actor actor name
 
  67      * @param operation operation name
 
  69     public BasicSdnrOperation(String actor, String operation) {
 
  70         super(actor, operation);
 
  74      * Initializes mocks and sets up.
 
  76     public void setUp() throws Exception {
 
  79         response = new PciMessage();
 
  81         PciBody body = new PciBody();
 
  82         response.setBody(body);
 
  84         PciResponse output = new PciResponse();
 
  85         body.setOutput(output);
 
  87         Status status = new Status();
 
  88         output.setStatus(status);
 
  90         status.setValue(StatusCodeEnum.SUCCESS.toString());
 
  93     public void tearDown() {
 
  94         super.tearDownBasic();
 
  97     protected TopicServer<PciMessage> makeServer(TopicSink sink, TopicSource source) {
 
  98         return new SdnrTopicServer(sink, source);
 
 102      * Runs the operation and verifies that the response is successful.
 
 104      * @param operation operation to run
 
 106     protected void verifyOperation(SdnrOperation operation)
 
 107                     throws InterruptedException, ExecutionException, TimeoutException {
 
 109         CompletableFuture<OperationOutcome> future2 = operation.start();
 
 110         executor.runAll(100);
 
 111         assertFalse(future2.isDone());
 
 113         verify(forwarder).register(any(), listenerCaptor.capture());
 
 114         provideResponse(listenerCaptor.getValue(), StatusCodeEnum.SUCCESS.toString());
 
 116         executor.runAll(100);
 
 117         assertTrue(future2.isDone());
 
 119         outcome = future2.get();
 
 120         assertEquals(PolicyResult.SUCCESS, outcome.getResult());
 
 124      * Verifies that an exception is thrown if a field is missing from the enrichment
 
 127      * @param fieldName name of the field to be removed from the enrichment data
 
 128      * @param expectedText text expected in the exception message
 
 130     protected void verifyMissing(String fieldName, String expectedText,
 
 131                     OperationMaker<BidirectionalTopicConfig, SdnrOperation> maker) {
 
 134         enrichment.remove(fieldName);
 
 136         SdnrOperation oper = maker.apply(params, config);
 
 138         assertThatIllegalArgumentException().isThrownBy(() -> Whitebox.invokeMethod(oper, "makeRequest", 1))
 
 139                         .withMessageContaining("missing").withMessageContaining(expectedText);
 
 143      * Provides a response to the listener.
 
 145      * @param listener listener to which to provide the response
 
 146      * @param code response code
 
 147      * @param description response description
 
 149     protected void provideResponse(BiConsumer<String, StandardCoderObject> listener, int code, String description) {
 
 150         PciResponse response = new PciResponse();
 
 152         Status status = new Status();
 
 153         response.setStatus(status);
 
 154         status.setCode(code);
 
 156         provideResponse(listener, Util.translate("", response, String.class));