You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2022/08/17 17:19:28 UTC

[cxf] branch 3.5.x-fixes updated: Attempt to fix flaky JaxRsServiceTest tests (CXF-8750 post merge): split into separate test cases (#986)

This is an automated email from the ASF dual-hosted git repository.

reta pushed a commit to branch 3.5.x-fixes
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/3.5.x-fixes by this push:
     new adf31081a8 Attempt to fix flaky JaxRsServiceTest tests (CXF-8750 post merge): split into separate test cases (#986)
adf31081a8 is described below

commit adf31081a8ecc3b4750dad0480b5cf41f2df3596
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Wed Aug 17 13:19:22 2022 -0400

    Attempt to fix flaky JaxRsServiceTest tests (CXF-8750 post merge): split into separate test cases (#986)
---
 .../apache/cxf/osgi/itests/jaxrs/BookStore.java    |  49 ----------
 .../cxf/osgi/itests/jaxrs/JaxRsServiceTest.java    |  46 +---------
 .../cxf/osgi/itests/jaxrs/JaxRsTestActivator.java  |  10 --
 .../cxf/osgi/itests/jaxrs/OpenApiBookStore.java    | 101 +++++++++++++++++++++
 ...xRsServiceTest.java => OpenApiServiceTest.java} |  81 ++---------------
 ...estActivator.java => OpenApiTestActivator.java} |   6 +-
 6 files changed, 114 insertions(+), 179 deletions(-)

diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java
index 6b15968659..09d60d9f5b 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/BookStore.java
@@ -50,14 +50,7 @@ import org.apache.cxf.validation.BeanValidationProvider;
 import org.hibernate.validator.HibernateValidator;
 import org.hibernate.validator.HibernateValidatorConfiguration;
 
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.tags.Tag;
-
 @Path("/bookstore")
-@Tag(name = "BookStore")
 @Produces("application/xml")
 public class BookStore {
     private Map<Long, Book> books = new HashMap<>();
@@ -80,15 +73,6 @@ public class BookStore {
 
     @GET
     @Path("/books/{id}")
-    @Operation(
-            summary = "Get book by ID",
-            description = "Get operation with path parameter",
-            responses = {
-                @ApiResponse(content = @Content(schema = @Schema(implementation = Book.class)),
-                    description = "Book found", responseCode = "200"),
-                @ApiResponse(description = "Book not found", responseCode = "404")
-            }
-    )
     public Response getBookRoot(@PathParam("id") Long id) {
         assertInjections();
         Book b = books.get(id);
@@ -98,14 +82,6 @@ public class BookStore {
         return Response.ok(b).build();
     }
 
-    @Operation(
-            summary = "Update book by ID",
-            description = "Put operation with path parameter",
-            responses = {
-                @ApiResponse(description = "Book found and updated", responseCode = "200"),
-                @ApiResponse(description = "Book not found", responseCode = "404")
-            }
-    )
     @PUT
     @Path("/books/{id}")
     public Response updateBook(@PathParam("id") Long id, Book book) {
@@ -118,14 +94,6 @@ public class BookStore {
         return Response.ok().build();
     }
 
-    @Operation(
-            summary = "Create a book with validation",
-            description = "Post operation with entity in body and validation",
-            responses = {
-                @ApiResponse(description = "Book created", responseCode = "201"),
-                @ApiResponse(description = "Validation failed", responseCode = "400")
-            }
-    )
     @POST
     @Path("/books-validate")
     public Response createBookValidate(Book book) {
@@ -155,15 +123,6 @@ public class BookStore {
         return createBook(book);
     }
 
-
-    @Operation(
-            summary = "Create new book",
-            description = "Post operation with entity in body",
-            responses = {
-                @ApiResponse(description = "Book created", responseCode = "201"),
-                @ApiResponse(description = "Book with given ID already exists", responseCode = "409")
-            }
-    )
     @POST
     @Path("/books")
     public Response createBook(Book book) {
@@ -178,14 +137,6 @@ public class BookStore {
         return Response.created(createdURI).build();
     }
 
-    @Operation(
-            summary = "Delete a book",
-            description = "Delete operation with path param",
-            responses = {
-                @ApiResponse(description = "Book deleted", responseCode = "200"),
-                @ApiResponse(description = "Book not found", responseCode = "404")
-            }
-    )
     @DELETE
     @Path("/books/{id}")
     public Response removeBook(@PathParam("id") Long id) {
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
index d0cf69b34a..8c48a2e08d 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
@@ -26,10 +26,6 @@ import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
-
 import org.apache.cxf.helpers.JavaUtils;
 import org.apache.cxf.osgi.itests.AbstractServerActivator;
 import org.apache.cxf.osgi.itests.CXFOSGiTestSupport;
@@ -48,9 +44,6 @@ import org.ops4j.pax.tinybundles.core.TinyBundles;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features;
 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel;
@@ -62,13 +55,8 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
 
     private static final String BASE_URL = "http://localhost:" + PORT + "/cxf/jaxrs/";
     private static final String BOOKSTORE_PATH = "bookstore";
-    private static final String SWAGGER_PATH = "api-docs";
-    private static final String OPEN_API_FILE_PATH = "openapi.json";
 
-    private final WebTarget wt = ClientBuilder
-        .newClient()
-        .register(JacksonJsonProvider.class)
-        .target(BASE_URL);
+    private final WebTarget wt = ClientBuilder.newClient().target(BASE_URL);
 
     @Test
     public void testJaxRsGet() throws Exception {
@@ -130,34 +118,6 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
         assertStatus(Status.OK, response);
     }
 
-    @Test
-    public void testGetSwaggerUi() {
-        WebTarget swaggerWt = wt.path(SWAGGER_PATH).queryParam("url", "/cxf/jaxrs/openapi.json");
-        Response response = swaggerWt.request().get();
-        String swaggerFileHtml = response.readEntity(String.class);
-
-        assertStatus(Status.OK, response);
-        assertTrue(swaggerFileHtml.contains("<html"));
-        assertTrue(swaggerFileHtml.contains("<head>"));
-        assertTrue(swaggerFileHtml.contains("<title>Swagger UI</title>"));
-        assertTrue(swaggerFileHtml.contains("</html>"));
-    }
-
-    @Test
-    public void testGetOpenApiJsonFile() {
-        WebTarget openApiWt = wt.path(OPEN_API_FILE_PATH);
-        Response response = openApiWt.request().get();
-        String openApiJson = response.readEntity(String.class);
-
-        assertStatus(Status.OK, response);
-        try {
-            new ObjectMapper().readValue(openApiJson, Object.class);
-            assertTrue(openApiJson.contains("/bookstore/"));
-        } catch (JsonProcessingException e) {
-            fail();
-        }
-    }
-
     private static void assertStatus(Status expectedStatus, Response response) {
         assertEquals(expectedStatus.getStatusCode(), response.getStatus());
     }
@@ -166,9 +126,7 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
     public Option[] config() {
         return OptionUtils.combine(
             cxfBaseConfig(),
-            features(cxfUrl, "cxf-core", "cxf-wsdl", "cxf-jaxrs", "cxf-bean-validation-core", "cxf-bean-validation",
-                    "cxf-rs-description-openapi-v3"),
-            mavenBundle("org.webjars", "swagger-ui").versionAsInProject(),
+            features(cxfUrl, "cxf-core", "cxf-wsdl", "cxf-jaxrs", "cxf-bean-validation-core", "cxf-bean-validation"),
             logLevel(LogLevel.INFO),
             testUtils(),
             provision(serviceBundle())
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java
index b7176ba039..42eec4eada 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java
@@ -22,8 +22,6 @@ import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
-import org.apache.cxf.jaxrs.openapi.OpenApiFeature;
-import org.apache.cxf.jaxrs.swagger.ui.SwaggerUiConfig;
 import org.apache.cxf.osgi.itests.AbstractServerActivator;
 
 public class JaxRsTestActivator extends AbstractServerActivator {
@@ -35,14 +33,6 @@ public class JaxRsTestActivator extends AbstractServerActivator {
         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
         sf.setBus(bus);
         sf.setResourceClasses(BookStore.class);
-
-        OpenApiFeature openApiFeature = new OpenApiFeature();
-        openApiFeature.setScan(false);
-        SwaggerUiConfig swaggerUiConfig = new SwaggerUiConfig();
-        swaggerUiConfig.setUrl("/cxf/jaxrs/openapi.json");
-        openApiFeature.setSwaggerUiConfig(swaggerUiConfig);
-
-        sf.getFeatures().add(openApiFeature);
         sf.setAddress("/jaxrs");
         return sf.create();
     }
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiBookStore.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiBookStore.java
new file mode 100644
index 0000000000..8567dd373a
--- /dev/null
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiBookStore.java
@@ -0,0 +1,101 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.cxf.osgi.itests.jaxrs;
+
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+@Tag(name = "BookStore")
+public class OpenApiBookStore extends BookStore {
+    @Operation(
+            summary = "Get book by ID",
+            description = "Get operation with path parameter",
+            responses = {
+                @ApiResponse(content = @Content(schema = @Schema(implementation = Book.class)),
+                    description = "Book found", responseCode = "200"),
+                @ApiResponse(description = "Book not found", responseCode = "404")
+            }
+    )
+    public Response getBookRoot(@PathParam("id") Long id) {
+        return super.getBookRoot(id);
+    }
+
+    @Operation(
+            summary = "Update book by ID",
+            description = "Put operation with path parameter",
+            responses = {
+                @ApiResponse(description = "Book found and updated", responseCode = "200"),
+                @ApiResponse(description = "Book not found", responseCode = "404")
+            }
+    )
+    public Response updateBook(@PathParam("id") Long id, Book book) {
+        return super.updateBook(id, book);
+    }
+
+    @Operation(
+            summary = "Create a book with validation",
+            description = "Post operation with entity in body and validation",
+            responses = {
+                @ApiResponse(description = "Book created", responseCode = "201"),
+                @ApiResponse(description = "Validation failed", responseCode = "400")
+            }
+    )
+    public Response createBookValidate(Book book) {
+        return super.createBookValidate(book);
+    }
+
+
+    @Operation(
+            summary = "Create new book",
+            description = "Post operation with entity in body",
+            responses = {
+                @ApiResponse(description = "Book created", responseCode = "201"),
+                @ApiResponse(description = "Book with given ID already exists", responseCode = "409")
+            }
+    )
+    public Response createBook(Book book) {
+        return super.createBook(book);
+    }
+
+    @Operation(
+            summary = "Delete a book",
+            description = "Delete operation with path param",
+            responses = {
+                @ApiResponse(description = "Book deleted", responseCode = "200"),
+                @ApiResponse(description = "Book not found", responseCode = "404")
+            }
+    )
+    @DELETE
+    @Path("/books/{id}")
+    public Response removeBook(@PathParam("id") Long id) {
+        return super.removeBook(id);
+    }
+}
+
+
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiServiceTest.java
similarity index 65%
copy from osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
copy to osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiServiceTest.java
index d0cf69b34a..91b5a4fb7d 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiServiceTest.java
@@ -21,14 +21,12 @@ package org.apache.cxf.osgi.itests.jaxrs;
 import java.io.InputStream;
 
 import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
 
 import org.apache.cxf.helpers.JavaUtils;
 import org.apache.cxf.osgi.itests.AbstractServerActivator;
@@ -47,7 +45,6 @@ import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.tinybundles.core.TinyBundles;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
@@ -58,77 +55,13 @@ import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel;
 
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerClass.class)
-public class JaxRsServiceTest extends CXFOSGiTestSupport {
+public class OpenApiServiceTest extends CXFOSGiTestSupport {
 
     private static final String BASE_URL = "http://localhost:" + PORT + "/cxf/jaxrs/";
-    private static final String BOOKSTORE_PATH = "bookstore";
     private static final String SWAGGER_PATH = "api-docs";
     private static final String OPEN_API_FILE_PATH = "openapi.json";
 
-    private final WebTarget wt = ClientBuilder
-        .newClient()
-        .register(JacksonJsonProvider.class)
-        .target(BASE_URL);
-
-    @Test
-    public void testJaxRsGet() throws Exception {
-        Book book = wt.path(BOOKSTORE_PATH)
-            .path("/books/123")
-            .request("application/xml")
-            .get(Book.class);
-        assertNotNull(book);
-    }
-
-    @Test
-    public void testJaxRsPost() throws Exception {
-        Book book = new Book("New Book", 321);
-        Response response = wt.path(BOOKSTORE_PATH)
-            .path("/books/")
-            .request("application/xml")
-            .post(Entity.xml(book));
-        assertStatus(Status.CREATED, response);
-        assertNotNull(response.getLocation());
-    }
-    
-    @Test
-    public void postWithValidationError() throws Exception {
-        Book book = new Book(null, -1);
-        final Response response = wt.path(BOOKSTORE_PATH)
-            .path("/books-validate/")
-            .request("application/xml")
-            .post(Entity.xml(book));
-        assertStatus(Status.BAD_REQUEST, response);
-    }
-
-    @Test
-    public void postWithValidation() throws Exception {
-        Book book = new Book("A Book", 3212);
-        Response response = wt.path(BOOKSTORE_PATH)
-            .path("/books-validate/")
-            .request("application/xml")
-            .post(Entity.xml(book));
-        assertStatus(Status.CREATED, response);
-        assertNotNull(response.getLocation());
-    }
-
-    @Test
-    public void testJaxRsDelete() throws Exception {
-        Response response = wt.path(BOOKSTORE_PATH)
-            .path("/books/123")
-            .request("application/xml")
-            .delete();
-        assertStatus(Status.OK, response);
-    }
-
-    @Test
-    public void testJaxRsPut() throws Exception {
-        Book book = new Book("Updated Book", 123);
-        Response response = wt.path(BOOKSTORE_PATH)
-            .path("/books/123")
-            .request("application/xml")
-            .put(Entity.xml(book));
-        assertStatus(Status.OK, response);
-    }
+    private final WebTarget wt = ClientBuilder.newClient().target(BASE_URL);
 
     @Test
     public void testGetSwaggerUi() {
@@ -179,19 +112,21 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
         if (JavaUtils.isJava11Compatible()) {
             return TinyBundles.bundle()
                   .add(AbstractServerActivator.class)
-                  .add(JaxRsTestActivator.class)
+                  .add(OpenApiTestActivator.class)
                   .add(Book.class)
                   .add(BookStore.class)
-                  .set(Constants.BUNDLE_ACTIVATOR, JaxRsTestActivator.class.getName())
+                  .add(OpenApiBookStore.class)
+                  .set(Constants.BUNDLE_ACTIVATOR, OpenApiTestActivator.class.getName())
                   .set("Require-Capability", "osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=11))\"")
                   .build(TinyBundles.withBnd());
         } else {
             return TinyBundles.bundle()
-                .add(AbstractServerActivator.class)
+                .add(OpenApiTestActivator.class)
                 .add(JaxRsTestActivator.class)
                 .add(Book.class)
                 .add(BookStore.class)
-                .set(Constants.BUNDLE_ACTIVATOR, JaxRsTestActivator.class.getName())
+                .add(OpenApiBookStore.class)
+                .set(Constants.BUNDLE_ACTIVATOR, OpenApiTestActivator.class.getName())
                 .build(TinyBundles.withBnd());
         }
     }
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiTestActivator.java
similarity index 89%
copy from osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java
copy to osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiTestActivator.java
index b7176ba039..aafc17fe39 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/OpenApiTestActivator.java
@@ -26,15 +26,15 @@ import org.apache.cxf.jaxrs.openapi.OpenApiFeature;
 import org.apache.cxf.jaxrs.swagger.ui.SwaggerUiConfig;
 import org.apache.cxf.osgi.itests.AbstractServerActivator;
 
-public class JaxRsTestActivator extends AbstractServerActivator {
+public class OpenApiTestActivator extends AbstractServerActivator {
 
     @Override
     protected Server createServer() {
         Bus bus = BusFactory.newInstance().createBus();
-        bus.setExtension(JaxRsTestActivator.class.getClassLoader(), ClassLoader.class);
+        bus.setExtension(OpenApiTestActivator.class.getClassLoader(), ClassLoader.class);
         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
         sf.setBus(bus);
-        sf.setResourceClasses(BookStore.class);
+        sf.setResourceClasses(OpenApiBookStore.class);
 
         OpenApiFeature openApiFeature = new OpenApiFeature();
         openApiFeature.setScan(false);