X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=models-interactions%2Fmodel-actors%2FactorServiceProvider%2Fsrc%2Ftest%2Fjava%2Forg%2Fonap%2Fpolicy%2Fcontrolloop%2Factorserviceprovider%2Fimpl%2FHttpOperationTest.java;h=82aa091c14f60bd52e94ec68ab12a8b81bf591ce;hb=7eeb2e07be6b2d0c47d415c4a1398a2c4e699156;hp=19f781d6166c0f40f808dfe3fa4ec05e0f0f0215;hpb=35867f2e63c26d47417bfefc9a0912f17c4a873a;p=policy%2Fmodels.git diff --git a/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/HttpOperationTest.java b/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/HttpOperationTest.java index 19f781d61..82aa091c1 100644 --- a/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/HttpOperationTest.java +++ b/models-interactions/model-actors/actorServiceProvider/src/test/java/org/onap/policy/controlloop/actorserviceprovider/impl/HttpOperationTest.java @@ -22,24 +22,24 @@ package org.onap.policy.controlloop.actorserviceprovider.impl; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.spy; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -import ch.qos.logback.classic.Logger; import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.Properties; import java.util.UUID; import java.util.concurrent.CancellationException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executor; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -64,28 +64,24 @@ import org.junit.BeforeClass; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure; import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams; import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams.TopicParamsBuilder; import org.onap.policy.common.endpoints.http.client.HttpClient; +import org.onap.policy.common.endpoints.http.client.HttpClientFactory; import org.onap.policy.common.endpoints.http.client.HttpClientFactoryInstance; import org.onap.policy.common.endpoints.http.server.HttpServletServer; import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance; import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties; +import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType; import org.onap.policy.common.gson.GsonMessageBodyHandler; -import org.onap.policy.common.utils.coder.Coder; import org.onap.policy.common.utils.coder.CoderException; -import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.network.NetworkUtil; -import org.onap.policy.common.utils.test.log.logback.ExtractAppender; -import org.onap.policy.controlloop.VirtualControlLoopEvent; -import org.onap.policy.controlloop.actorserviceprovider.Operation; import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome; -import org.onap.policy.controlloop.actorserviceprovider.Util; -import org.onap.policy.controlloop.actorserviceprovider.controlloop.ControlLoopEventContext; +import org.onap.policy.controlloop.actorserviceprovider.OperationResult; import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams; +import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig; import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpParams; -import org.onap.policy.controlloop.policy.PolicyResult; -import org.slf4j.LoggerFactory; public class HttpOperationTest { @@ -95,18 +91,11 @@ public class HttpOperationTest { private static final String HTTP_CLIENT = "my-client"; private static final String HTTP_NO_SERVER = "my-http-no-server-client"; private static final String MEDIA_TYPE_APPLICATION_JSON = "application/json"; - private static final String MY_REQUEST = "my-request"; private static final String BASE_URI = "oper"; private static final String PATH = "/my-path"; private static final String TEXT = "my-text"; private static final UUID REQ_ID = UUID.randomUUID(); - /** - * Used to attach an appender to the class' logger. - */ - private static final Logger logger = (Logger) LoggerFactory.getLogger(HttpOperation.class); - private static final ExtractAppender appender = new ExtractAppender(); - /** * {@code True} if the server should reject the request, {@code false} otherwise. */ @@ -120,17 +109,18 @@ public class HttpOperationTest { @Mock private HttpClient client; - + @Mock + private HttpClientFactory clientFactory; @Mock private Response response; + @Mock + private Executor executor; - private VirtualControlLoopEvent event; - private ControlLoopEventContext context; private ControlLoopOperationParams params; private OperationOutcome outcome; private AtomicReference> callback; private Future future; - private HttpOperator operator; + private HttpConfig config; private MyGetOperation oper; /** @@ -156,21 +146,12 @@ public class HttpOperationTest { /* * Start the clients, one to the server, and one to a non-existent server. */ - TopicParamsBuilder builder = BusTopicParams.builder().managed(true).hostname("localhost").basePath(BASE_URI) - .serializationProvider(GsonMessageBodyHandler.class.getName()); + TopicParamsBuilder builder = BusTopicParams.builder().managed(true).hostname("localhost").basePath(BASE_URI); HttpClientFactoryInstance.getClientFactory().build(builder.clientName(HTTP_CLIENT).port(port).build()); HttpClientFactoryInstance.getClientFactory() .build(builder.clientName(HTTP_NO_SERVER).port(NetworkUtil.allocPort()).build()); - - /** - * Attach appender to the logger. - */ - appender.setContext(logger.getLoggerContext()); - appender.start(); - - logger.addAppender(appender); } /** @@ -178,8 +159,6 @@ public class HttpOperationTest { */ @AfterClass public static void tearDownAfterClass() { - appender.stop(); - HttpClientFactoryInstance.getClientFactory().destroy(); HttpServletServerFactoryInstance.getServerFactory().destroy(); } @@ -192,8 +171,6 @@ public class HttpOperationTest { public void setUp() { MockitoAnnotations.initMocks(this); - appender.clearExtractions(); - rejectRequest = false; nget = 0; npost = 0; @@ -203,30 +180,16 @@ public class HttpOperationTest { when(response.readEntity(String.class)).thenReturn(TEXT); when(response.getStatus()).thenReturn(200); - event = new VirtualControlLoopEvent(); - event.setRequestId(REQ_ID); - - context = new ControlLoopEventContext(event); - params = ControlLoopOperationParams.builder().actor(ACTOR).operation(OPERATION).context(context).build(); + params = ControlLoopOperationParams.builder().actor(ACTOR).operation(OPERATION).requestId(REQ_ID).build(); outcome = params.makeOutcome(); callback = new AtomicReference<>(); future = new CompletableFuture<>(); - operator = new HttpOperator(ACTOR, OPERATION) { - @Override - public Operation buildOperation(ControlLoopOperationParams params) { - return null; - } - - @Override - public HttpClient getClient() { - return client; - } - }; + when(clientFactory.get(any())).thenReturn(client); - initOper(operator, HTTP_CLIENT); + initConfig(HTTP_CLIENT); oper = new MyGetOperation<>(String.class); } @@ -244,40 +207,29 @@ public class HttpOperationTest { } @Test - public void testMakePath() { - assertEquals(PATH, oper.makePath()); + public void testGetPath() { + assertEquals(PATH, oper.getPath()); } @Test public void testMakeUrl() { // use a real client - client = HttpClientFactoryInstance.getClientFactory().get(HTTP_CLIENT); + initRealConfig(HTTP_CLIENT); - assertThat(oper.makeUrl()).endsWith("/" + BASE_URI + PATH); + oper = new MyGetOperation<>(String.class); + + assertThat(oper.getUrl()).endsWith("/" + BASE_URI + PATH); } @Test public void testDoConfigureMapOfStringObject_testGetClient_testGetPath_testGetTimeoutMs() { - // no default yet - assertEquals(0L, oper.getTimeoutMs(null)); - assertEquals(0L, oper.getTimeoutMs(0)); + // use value from operator + assertEquals(1000L, oper.getTimeoutMs(null)); + assertEquals(1000L, oper.getTimeoutMs(0)); // should use given value assertEquals(20 * 1000L, oper.getTimeoutMs(20)); - - // indicate we have a timeout value - operator = spy(operator); - when(operator.getTimeoutMs()).thenReturn(30L); - - oper = new MyGetOperation(String.class); - - // should use default - assertEquals(30L, oper.getTimeoutMs(null)); - assertEquals(30L, oper.getTimeoutMs(0)); - - // should use given value - assertEquals(40 * 1000L, oper.getTimeoutMs(40)); } /** @@ -295,8 +247,9 @@ public class HttpOperationTest { callback.get().completed(response); assertSame(outcome, future2.get(5, TimeUnit.SECONDS)); + assertSame(TEXT, outcome.getResponse()); - assertEquals(PolicyResult.SUCCESS, outcome.getResult()); + assertEquals(OperationResult.SUCCESS, outcome.getResult()); } /** @@ -324,32 +277,41 @@ public class HttpOperationTest { * Tests processResponse() when it's a success and the response type is a String. */ @Test - public void testProcessResponseSuccessString() { - assertSame(outcome, oper.processResponse(outcome, PATH, response)); - assertEquals(PolicyResult.SUCCESS, outcome.getResult()); + public void testProcessResponseSuccessString() throws Exception { + CompletableFuture result = oper.processResponse(outcome, PATH, response); + assertTrue(result.isDone()); + assertSame(outcome, result.get()); + assertEquals(OperationResult.SUCCESS, outcome.getResult()); + assertSame(TEXT, outcome.getResponse()); } /** * Tests processResponse() when it's a failure. */ @Test - public void testProcessResponseFailure() { + public void testProcessResponseFailure() throws Exception { when(response.getStatus()).thenReturn(555); - assertSame(outcome, oper.processResponse(outcome, PATH, response)); - assertEquals(PolicyResult.FAILURE, outcome.getResult()); + CompletableFuture result = oper.processResponse(outcome, PATH, response); + assertTrue(result.isDone()); + assertSame(outcome, result.get()); + assertEquals(OperationResult.FAILURE, outcome.getResult()); + assertSame(TEXT, outcome.getResponse()); } /** * Tests processResponse() when the decoder succeeds. */ @Test - public void testProcessResponseDecodeOk() throws CoderException { + public void testProcessResponseDecodeOk() throws Exception { when(response.readEntity(String.class)).thenReturn("10"); MyGetOperation oper2 = new MyGetOperation<>(Integer.class); - assertSame(outcome, oper2.processResponse(outcome, PATH, response)); - assertEquals(PolicyResult.SUCCESS, outcome.getResult()); + CompletableFuture result = oper2.processResponse(outcome, PATH, response); + assertTrue(result.isDone()); + assertSame(outcome, result.get()); + assertEquals(OperationResult.SUCCESS, outcome.getResult()); + assertEquals(Integer.valueOf(10), outcome.getResponse()); } /** @@ -359,8 +321,7 @@ public class HttpOperationTest { public void testProcessResponseDecodeExcept() throws CoderException { MyGetOperation oper2 = new MyGetOperation<>(Integer.class); - assertSame(outcome, oper2.processResponse(outcome, PATH, response)); - assertEquals(PolicyResult.FAILURE_EXCEPTION, outcome.getResult()); + assertThatIllegalArgumentException().isThrownBy(() -> oper2.processResponse(outcome, PATH, response)); } @Test @@ -383,14 +344,15 @@ public class HttpOperationTest { @Test public void testGet() throws Exception { // use a real client - client = HttpClientFactoryInstance.getClientFactory().get(HTTP_CLIENT); + initRealConfig(HTTP_CLIENT); MyGetOperation oper2 = new MyGetOperation<>(MyResponse.class); OperationOutcome outcome = runOperation(oper2); assertNotNull(outcome); assertEquals(1, nget); - assertEquals(PolicyResult.SUCCESS, outcome.getResult()); + assertEquals(OperationResult.SUCCESS, outcome.getResult()); + assertTrue(outcome.getResponse() instanceof MyResponse); } /** @@ -399,14 +361,15 @@ public class HttpOperationTest { @Test public void testDelete() throws Exception { // use a real client - client = HttpClientFactoryInstance.getClientFactory().get(HTTP_CLIENT); + initRealConfig(HTTP_CLIENT); MyDeleteOperation oper2 = new MyDeleteOperation(); OperationOutcome outcome = runOperation(oper2); assertNotNull(outcome); assertEquals(1, ndelete); - assertEquals(PolicyResult.SUCCESS, outcome.getResult()); + assertEquals(OperationResult.SUCCESS, outcome.getResult()); + assertTrue(outcome.getResponse() instanceof String); } /** @@ -415,14 +378,14 @@ public class HttpOperationTest { @Test public void testPost() throws Exception { // use a real client - client = HttpClientFactoryInstance.getClientFactory().get(HTTP_CLIENT); - + initRealConfig(HTTP_CLIENT); MyPostOperation oper2 = new MyPostOperation(); OperationOutcome outcome = runOperation(oper2); assertNotNull(outcome); assertEquals(1, npost); - assertEquals(PolicyResult.SUCCESS, outcome.getResult()); + assertEquals(OperationResult.SUCCESS, outcome.getResult()); + assertTrue(outcome.getResponse() instanceof MyResponse); } /** @@ -431,109 +394,20 @@ public class HttpOperationTest { @Test public void testPut() throws Exception { // use a real client - client = HttpClientFactoryInstance.getClientFactory().get(HTTP_CLIENT); + initRealConfig(HTTP_CLIENT); MyPutOperation oper2 = new MyPutOperation(); OperationOutcome outcome = runOperation(oper2); assertNotNull(outcome); assertEquals(1, nput); - assertEquals(PolicyResult.SUCCESS, outcome.getResult()); - } - - @Test - public void testLogRestRequest() throws CoderException { - // log structured data - appender.clearExtractions(); - oper.logRestRequest(PATH, new MyRequest()); - List output = appender.getExtracted(); - assertEquals(1, output.size()); - - assertThat(output.get(0)).contains(PATH).contains("{\n \"input\": \"some input\"\n}"); - - // log a plain string - appender.clearExtractions(); - oper.logRestRequest(PATH, MY_REQUEST); - output = appender.getExtracted(); - assertEquals(1, output.size()); - - assertThat(output.get(0)).contains(PATH).contains(MY_REQUEST); - - // log a null request - appender.clearExtractions(); - oper.logRestRequest(PATH, null); - output = appender.getExtracted(); - assertEquals(1, output.size()); - - // exception from coder - oper = new MyGetOperation<>(String.class) { - @Override - protected Coder makeCoder() { - return new StandardCoder() { - @Override - public String encode(Object object, boolean pretty) throws CoderException { - throw new CoderException(EXPECTED_EXCEPTION); - } - }; - } - }; - - appender.clearExtractions(); - oper.logRestRequest(PATH, new MyRequest()); - output = appender.getExtracted(); - assertEquals(2, output.size()); - assertThat(output.get(0)).contains("cannot pretty-print request"); - assertThat(output.get(1)).contains(PATH); - } - - @Test - public void testLogRestResponse() throws CoderException { - // log structured data - appender.clearExtractions(); - oper.logRestResponse(PATH, new MyResponse()); - List output = appender.getExtracted(); - assertEquals(1, output.size()); - - assertThat(output.get(0)).contains(PATH).contains("{\n \"output\": \"some output\"\n}"); - - // log a plain string - appender.clearExtractions(); - oper.logRestResponse(PATH, MY_REQUEST); - output = appender.getExtracted(); - assertEquals(1, output.size()); - - // log a null response - appender.clearExtractions(); - oper.logRestResponse(PATH, null); - output = appender.getExtracted(); - assertEquals(1, output.size()); - - assertThat(output.get(0)).contains(PATH).contains("null"); - - // exception from coder - oper = new MyGetOperation<>(String.class) { - @Override - protected Coder makeCoder() { - return new StandardCoder() { - @Override - public String encode(Object object, boolean pretty) throws CoderException { - throw new CoderException(EXPECTED_EXCEPTION); - } - }; - } - }; - - appender.clearExtractions(); - oper.logRestResponse(PATH, new MyResponse()); - output = appender.getExtracted(); - assertEquals(2, output.size()); - assertThat(output.get(0)).contains("cannot pretty-print response"); - assertThat(output.get(1)).contains(PATH); + assertEquals(OperationResult.SUCCESS, outcome.getResult()); + assertTrue(outcome.getResponse() instanceof MyResponse); } @Test public void testMakeDecoder() { - assertNotNull(oper.makeCoder()); + assertNotNull(oper.getCoder()); } /** @@ -561,18 +435,34 @@ public class HttpOperationTest { } /** - * Initializes the given operator. + * Initializes the configuration. * * @param operator operator to be initialized * @param clientName name of the client which it should use */ - private void initOper(HttpOperator operator, String clientName) { - operator.stop(); + private void initConfig(String clientName) { + initConfig(clientName, clientFactory); + } - HttpParams params = HttpParams.builder().clientName(clientName).path(PATH).build(); - Map mapParams = Util.translateToMap(OPERATION, params); - operator.configure(mapParams); - operator.start(); + /** + * Initializes the configuration with a real client. + * + * @param operator operator to be initialized + * @param clientName name of the client which it should use + */ + private void initConfig(String clientName, HttpClientFactory factory) { + HttpParams params = HttpParams.builder().clientName(clientName).path(PATH).timeoutSec(1).build(); + config = new HttpConfig(executor, params, factory); + } + + /** + * Initializes the configuration with a real client. + * + * @param operator operator to be initialized + * @param clientName name of the client which it should use + */ + private void initRealConfig(String clientName) { + initConfig(clientName, HttpClientFactoryInstance.getClientFactory()); } /** @@ -604,7 +494,7 @@ public class HttpOperationTest { private class MyGetOperation extends HttpOperation { public MyGetOperation(Class responseClass) { - super(HttpOperationTest.this.params, HttpOperationTest.this.operator, responseClass); + super(HttpOperationTest.this.params, HttpOperationTest.this.config, responseClass, Collections.emptyList()); } @Override @@ -612,20 +502,21 @@ public class HttpOperationTest { Map headers = makeHeaders(); headers.put("Accept", MediaType.APPLICATION_JSON); - String url = makeUrl(); + String url = getUrl(); - logRestRequest(url, null); + logMessage(EventType.OUT, CommInfrastructure.REST, url, null); // @formatter:off return handleResponse(outcome, url, - callback -> operator.getClient().get(callback, makePath(), headers)); + callback -> getClient().get(callback, getPath(), headers)); // @formatter:on } } private class MyPostOperation extends HttpOperation { public MyPostOperation() { - super(HttpOperationTest.this.params, HttpOperationTest.this.operator, MyResponse.class); + super(HttpOperationTest.this.params, HttpOperationTest.this.config, MyResponse.class, + Collections.emptyList()); } @Override @@ -633,25 +524,27 @@ public class HttpOperationTest { MyRequest request = new MyRequest(); - Entity entity = Entity.entity(request, MediaType.APPLICATION_JSON); - Map headers = makeHeaders(); headers.put("Accept", MediaType.APPLICATION_JSON); - String url = makeUrl(); + String url = getUrl(); - logRestRequest(url, request); + String strRequest = prettyPrint(request); + logMessage(EventType.OUT, CommInfrastructure.REST, url, strRequest); + + Entity entity = Entity.entity(strRequest, MediaType.APPLICATION_JSON); // @formatter:off return handleResponse(outcome, url, - callback -> operator.getClient().post(callback, makePath(), entity, headers)); + callback -> getClient().post(callback, getPath(), entity, headers)); // @formatter:on } } private class MyPutOperation extends HttpOperation { public MyPutOperation() { - super(HttpOperationTest.this.params, HttpOperationTest.this.operator, MyResponse.class); + super(HttpOperationTest.this.params, HttpOperationTest.this.config, MyResponse.class, + Collections.emptyList()); } @Override @@ -659,25 +552,26 @@ public class HttpOperationTest { MyRequest request = new MyRequest(); - Entity entity = Entity.entity(request, MediaType.APPLICATION_JSON); - Map headers = makeHeaders(); headers.put("Accept", MediaType.APPLICATION_JSON); - String url = makeUrl(); + String url = getUrl(); + + String strRequest = prettyPrint(request); + logMessage(EventType.OUT, CommInfrastructure.REST, url, strRequest); - logRestRequest(url, request); + Entity entity = Entity.entity(strRequest, MediaType.APPLICATION_JSON); // @formatter:off return handleResponse(outcome, url, - callback -> operator.getClient().put(callback, makePath(), entity, headers)); + callback -> getClient().put(callback, getPath(), entity, headers)); // @formatter:on } } private class MyDeleteOperation extends HttpOperation { public MyDeleteOperation() { - super(HttpOperationTest.this.params, HttpOperationTest.this.operator, String.class); + super(HttpOperationTest.this.params, HttpOperationTest.this.config, String.class, Collections.emptyList()); } @Override @@ -685,13 +579,13 @@ public class HttpOperationTest { Map headers = makeHeaders(); headers.put("Accept", MediaType.APPLICATION_JSON); - String url = makeUrl(); + String url = getUrl(); - logRestRequest(url, null); + logMessage(EventType.OUT, CommInfrastructure.REST, url, null); // @formatter:off return handleResponse(outcome, url, - callback -> operator.getClient().delete(callback, makePath(), headers)); + callback -> getClient().delete(callback, getPath(), headers)); // @formatter:on } }