diff options
Diffstat (limited to 'openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services')
5 files changed, 609 insertions, 0 deletions
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/pom.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/pom.xml new file mode 100644 index 0000000000..9b9dfd0e21 --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/pom.xml @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright © 2019 iconectiv + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <artifactId>externaltesting-rest-services</artifactId> + <parent> + <groupId>org.openecomp.sdc.onboarding</groupId> + <artifactId>externaltesting-rest</artifactId> + <version>1.4.0-SNAPSHOT</version> + </parent> + + <dependencies> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-core</artifactId> + <version>${spring.framework.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>${spring.framework.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context-support</artifactId> + <version>${spring.framework.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-web</artifactId> + <version>${spring.framework.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-beans</artifactId> + <version>${spring.framework.version}</version> + </dependency> + + <!-- CXF --> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-rt-frontend-jaxrs</artifactId> + <version>${cxf.version}</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>${http.client.version}</version> + </dependency> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>${javax.inject.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>javax.ws.rs</groupId> + <artifactId>javax.ws.rs-api</artifactId> + <version>${ws.rs.version}</version> + </dependency> + <dependency> + <groupId>com.sun.jersey</groupId> + <artifactId>jersey-core</artifactId> + <version>${jersey.core.version}</version> + <exclusions> + <exclusion> + <groupId>javax.ws.rs</groupId> + <artifactId>jsr311-api</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>io.swagger</groupId> + <artifactId>swagger-annotations</artifactId> + <version>${swagger.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + <version>${jackson.annotations.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.dataformat</groupId> + <artifactId>jackson-dataformat-xml</artifactId> + <version>${jackson.dataformat.version}</version> + </dependency> + <dependency> + <groupId>org.codehaus.woodstox</groupId> + <artifactId>woodstox-core-asl</artifactId> + <version>${woodstox.version}</version> + </dependency> + <dependency> + <groupId>org.openecomp.sdc</groupId> + <artifactId>openecomp-sdc-vendor-software-product-manager</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.sun.jersey.contribs</groupId> + <artifactId>jersey-multipart</artifactId> + <version>${jersey.multipart.version}</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.openecomp.sdc</groupId> + <artifactId>openecomp-sdc-externaltesting-impl</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + +</project> diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/ExternalTesting.java b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/ExternalTesting.java new file mode 100644 index 0000000000..14c45fbdbe --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/ExternalTesting.java @@ -0,0 +1,80 @@ +/* + * Copyright © 2019 iconectiv + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openecomp.sdcrests.externaltesting.rest; + +import io.swagger.annotations.Api; +import org.openecomp.core.externaltesting.api.VtpTestExecutionRequest; +import org.springframework.validation.annotation.Validated; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.List; + + +@Path("/v1.0/externaltesting") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +@Api(value = "External-Testing") +@Validated + +public interface ExternalTesting { + + @GET + @Path("/config") + Response getConfig(); + + @GET + @Path("/testcasetree") + Response getTestCasesAsTree(); + + @GET + @Path("/endpoints") + Response getEndpoints(); + + @GET + @Path("/endpoints/{endpointId}/scenarios") + Response getScenarios(@PathParam("endpointId") String endpointId); + + @GET + @Path("/endpoints/{endpointId}/scenarios/{scenario}/testsuites") + Response getTestsuites(@PathParam("endpointId") String endpointId, @PathParam("scenario") String scenario); + + @GET + @Path("/endpoints/{endpointId}/scenarios/{scenario}/testcases") + Response getTestcases(@PathParam("endpointId") String endpointId, + @PathParam("scenario") String scenario); + + @GET + @Path("/endpoints/{endpointId}/scenarios/{scenario}/testsuites/{testsuite}/testcases/{testcase}") + Response getTestcase(@PathParam("endpointId") String endpointId, + @PathParam("scenario") String scenario, + @PathParam("testsuite") String testsuite, + @PathParam("testcase") String testcase); + + @POST + @Path("/endpoints/{endpointId}/executions/{executionId}") + Response getExecution(@PathParam("endpointId") String endpointId, + @PathParam("executionId") String executionId); + + + @POST + @Path("/executions") + Response execute(List<VtpTestExecutionRequest> req, + @QueryParam("requestId") String requestId); + +} diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/services/ExternalTestingImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/services/ExternalTestingImpl.java new file mode 100644 index 0000000000..206eb4986b --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/main/java/org/openecomp/sdcrests/externaltesting/rest/services/ExternalTestingImpl.java @@ -0,0 +1,164 @@ +/* + * Copyright © 2019 iconectiv + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openecomp.sdcrests.externaltesting.rest.services; + + +import org.openecomp.core.externaltesting.api.*; +import org.openecomp.core.externaltesting.errors.ExternalTestingException; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdcrests.externaltesting.rest.ExternalTesting; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; + +import javax.inject.Named; +import javax.ws.rs.core.Response; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@SuppressWarnings("unused") +@Named +@Service("externaltesting") +@Scope(value = "prototype") +public class ExternalTestingImpl implements ExternalTesting { + + private ExternalTestingManager testingManager; + + private static final Logger logger = + LoggerFactory.getLogger(ExternalTestingImpl.class); + + public ExternalTestingImpl(@Autowired ExternalTestingManager testingManager) { + this.testingManager = testingManager; + } + + /** + * Return the configuration of the feature to the client. + * @return JSON response content. + */ + @Override + public Response getConfig() { + try { + return Response.ok(testingManager.getConfig()).build(); + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + } + + /** + * Return the test tree structure created by the testing manager. + * @return JSON response content. + */ + @Override + public Response getTestCasesAsTree() { + try { + return Response.ok(testingManager.getTestCasesAsTree()).build(); + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + } + + @Override + public Response getEndpoints() { + try { + return Response.ok(testingManager.getEndpoints()).build(); + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + + } + @Override + public Response getScenarios(String endpoint) { + try { + return Response.ok(testingManager.getScenarios(endpoint)).build(); + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + + } + + @Override + public Response getTestsuites(String endpoint, String scenario) { + try { + return Response.ok(testingManager.getTestSuites(endpoint, scenario)).build(); + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + } + + @Override + public Response getTestcases(String endpoint, String scenario) { + try { + return Response.ok(testingManager.getTestCases(endpoint, scenario)).build(); + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + } + + @Override + public Response getTestcase(String endpoint, String scenario, String testsuite, String testcase) { + try { + return Response.ok(testingManager.getTestCase(endpoint, scenario, testsuite, testcase)).build(); + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + } + + @Override + public Response execute(List<VtpTestExecutionRequest> req, String requestId) { + try { + List<VtpTestExecutionResponse> responses = testingManager.execute(req, requestId); + List<Integer> statuses = responses.stream().map(r-> Optional.ofNullable(r.getHttpStatus()).orElse(200)).distinct().collect(Collectors.toList()); + if (statuses.size() == 1) { + // 1 status so use it... + return Response.status(statuses.get(0)).entity(responses).build(); + } + else { + return Response.status(207).entity(responses).build(); + } + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + } + + @Override + public Response getExecution(String endpoint, String executionId) { + try { + return Response.ok(testingManager.getExecution(endpoint, executionId)).build(); + } + catch (ExternalTestingException e) { + return convertTestingException(e); + } + } + + private Response convertTestingException(ExternalTestingException e) { + if (logger.isErrorEnabled()) { + logger.error("testing exception {} {} {}", e.getTitle(), e.getCode(), e.getDetail(), e); + } + TestErrorBody body = new TestErrorBody(e.getTitle(), e.getCode(), e.getDetail()); + return Response.status(e.getCode()).entity(body).build(); + } +} diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/java/org/openecomp/sdcrests/externaltesting/rest/services/ApiTests.java b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/java/org/openecomp/sdcrests/externaltesting/rest/services/ApiTests.java new file mode 100644 index 0000000000..d9da7e9006 --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/java/org/openecomp/sdcrests/externaltesting/rest/services/ApiTests.java @@ -0,0 +1,197 @@ +/* + * Copyright © 2019 iconectiv + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openecomp.sdcrests.externaltesting.rest.services; + +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.openecomp.core.externaltesting.api.*; +import org.openecomp.core.externaltesting.errors.ExternalTestingException; + +import java.util.Arrays; +import java.util.List; + +public class ApiTests { + + private static final String EP = "ep"; + private static final String EXEC = "exec"; + private static final String SC = "sc"; + private static final String TS = "ts"; + private static final String TC = "tc"; + private static final String EXPECTED = "Expected"; + + + @Mock + private ExternalTestingManager testingManager; + + /** + * At the API level, test that the code does not throw + * exceptions but there's not much to test. + */ + @Test + public void testApi() { + MockitoAnnotations.initMocks(this); + + ExternalTestingImpl testing = new ExternalTestingImpl(testingManager); + Assert.assertNotNull(testing.getConfig()); + Assert.assertNotNull(testing.getEndpoints()); + Assert.assertNotNull(testing.getExecution(EP, EXEC)); + Assert.assertNotNull(testing.getScenarios(EP)); + Assert.assertNotNull(testing.getTestcase(EP, SC, TS, TC)); + Assert.assertNotNull(testing.getTestcases(EP, SC)); + Assert.assertNotNull(testing.getTestsuites(EP, SC)); + Assert.assertNotNull(testing.getTestCasesAsTree()); + + List<VtpTestExecutionRequest> requests = + Arrays.asList(new VtpTestExecutionRequest(), new VtpTestExecutionRequest()); + Assert.assertNotNull(testing.execute(requests, "requestId")); + } + + class ApiTestExternalTestingManager implements ExternalTestingManager { + @Override + public String getConfig() { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + + @Override + public TestTreeNode getTestCasesAsTree() { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + + @Override + public List<VtpNameDescriptionPair> getEndpoints() { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + + @Override + public List<VtpNameDescriptionPair> getScenarios(String endpoint) { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + + @Override + public List<VtpNameDescriptionPair> getTestSuites(String endpoint, String scenario) { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + + @Override + public List<VtpTestCase> getTestCases(String endpoint, String scenario) { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + + @Override + public VtpTestCase getTestCase(String endpoint, String scenario, String testSuite, String testCaseName) { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + + @Override + public List<VtpTestExecutionResponse> execute(List<VtpTestExecutionRequest> requests, String requestId) { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + + @Override + public VtpTestExecutionResponse getExecution(String endpoint, String executionId) { + throw new ExternalTestingException(EXPECTED, 500, EXPECTED); + } + } + + /** + * Test the exception handler logic for the cases when the + * testing manager throws an exception. + */ + @Test + public void testExceptions() { + MockitoAnnotations.initMocks(this); + + ExternalTestingManager m = new ApiTestExternalTestingManager(); + ExternalTestingImpl testingF = new ExternalTestingImpl(m); + + try { + testingF.getConfig(); + } + catch (Exception ex) { + // expected. + } + + + try { + testingF.getEndpoints(); + } + catch (ExternalTestingException e) { + // expected. + } + + try { + testingF.getExecution(EP, EXEC); + } + catch (ExternalTestingException e) { + // expected. + } + try { + testingF.getScenarios(EP); + } + catch (ExternalTestingException e) { + // expected. + } + + try { + testingF.getTestcase(EP, SC, TS, TC); + } + catch (ExternalTestingException e) { + // expected. + } + + try { + testingF.getTestcases(EP, SC); + } + catch (ExternalTestingException e) { + // expected. + } + + try { + testingF.getTestsuites(EP, SC); + } + catch (ExternalTestingException e) { + // expected. + } + + try { + testingF.getTestCasesAsTree(); + } + catch (ExternalTestingException e) { + // expected. + } + + List<VtpTestExecutionRequest> requestsF = + Arrays.asList(new VtpTestExecutionRequest(), new VtpTestExecutionRequest()); + + try { + testingF.execute(requestsF, null); + } + catch (ExternalTestingException e) { + // expected. + } + + + try { + testingF.execute(requestsF, null); + } + catch (ExternalTestingException e) { + // expected. + } + } +} diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/resources/logback-test.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..e0498971dc --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/externaltesting-rest/externaltesting-rest-services/src/test/resources/logback-test.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright © 2019 iconectiv + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<configuration> + + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <Pattern>%d{dd-MMM-yyyy HH:mm:ss:SSS} %-5level %logger{36}.%M\(%line\) - %msg%n</Pattern> + </encoder> + </appender> + + <root level="DEBUG"> + <appender-ref ref="STDOUT" /> + </root> + +</configuration> |