From 0b0a5a922ec196c1c7715792f9c7e38059d3710b Mon Sep 17 00:00:00 2001 From: Julien Ponge Date: Tue, 4 Dec 2018 22:00:09 +0100 Subject: [PATCH 1/2] Switch http-vertx tests to JUnit 5 Signed-off-by: Julien Ponge --- http/vertx/pom.xml | 30 ++- .../http/vertx/VertxCloudEvents.java | 2 +- .../http/vertx/impl/VertxCloudEventsImpl.java | 2 +- .../cloudevents/http/vertx/package-info.java | 2 +- .../http/vertx/VertxCloudEventsTests.java | 247 +++++++----------- 5 files changed, 122 insertions(+), 161 deletions(-) diff --git a/http/vertx/pom.xml b/http/vertx/pom.xml index 37e797a0..f5e1f8ad 100644 --- a/http/vertx/pom.xml +++ b/http/vertx/pom.xml @@ -56,25 +56,30 @@ - junit - junit - 4.12 - test + io.vertx + vertx-junit5 + ${vertx.version} - org.assertj assertj-core - 3.10.0 + ${assertj-core.version} test - io.vertx - vertx-unit - ${vertx.version} + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} test + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + @@ -96,6 +101,10 @@ + + maven-surefire-plugin + ${maven-surefire-plugin.version} + @@ -103,9 +112,12 @@ 3.6.0 2.9.6 + 2.22.0 1.8 1.8 UTF-8 + 3.11.0 + 5.3.2 diff --git a/http/vertx/src/main/java/io/cloudevents/http/vertx/VertxCloudEvents.java b/http/vertx/src/main/java/io/cloudevents/http/vertx/VertxCloudEvents.java index 510f52bd..bd5d4338 100644 --- a/http/vertx/src/main/java/io/cloudevents/http/vertx/VertxCloudEvents.java +++ b/http/vertx/src/main/java/io/cloudevents/http/vertx/VertxCloudEvents.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 The CloudEvents Authors * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/http/vertx/src/main/java/io/cloudevents/http/vertx/impl/VertxCloudEventsImpl.java b/http/vertx/src/main/java/io/cloudevents/http/vertx/impl/VertxCloudEventsImpl.java index 2518ebd8..0eca4752 100644 --- a/http/vertx/src/main/java/io/cloudevents/http/vertx/impl/VertxCloudEventsImpl.java +++ b/http/vertx/src/main/java/io/cloudevents/http/vertx/impl/VertxCloudEventsImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 The CloudEvents Authors * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/http/vertx/src/main/java/io/cloudevents/http/vertx/package-info.java b/http/vertx/src/main/java/io/cloudevents/http/vertx/package-info.java index 61025c9a..1532e4c7 100644 --- a/http/vertx/src/main/java/io/cloudevents/http/vertx/package-info.java +++ b/http/vertx/src/main/java/io/cloudevents/http/vertx/package-info.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 The CloudEvents Authors * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/http/vertx/src/test/java/io/cloudevents/http/vertx/VertxCloudEventsTests.java b/http/vertx/src/test/java/io/cloudevents/http/vertx/VertxCloudEventsTests.java index 8a7a8763..188f70c0 100644 --- a/http/vertx/src/test/java/io/cloudevents/http/vertx/VertxCloudEventsTests.java +++ b/http/vertx/src/test/java/io/cloudevents/http/vertx/VertxCloudEventsTests.java @@ -1,4 +1,4 @@ -/** +/* * Copyright 2018 The CloudEvents Authors * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,188 +17,137 @@ package io.cloudevents.http.vertx; import io.cloudevents.CloudEvent; import io.cloudevents.CloudEventBuilder; -import io.vertx.core.Vertx; -import io.vertx.core.http.HttpClientRequest; +import io.cloudevents.http.reactivex.vertx.VertxCloudEvents; import io.vertx.core.http.HttpHeaders; -import io.vertx.core.http.HttpServer; -import io.vertx.ext.unit.Async; -import io.vertx.ext.unit.TestContext; -import io.vertx.ext.unit.junit.VertxUnitRunner; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import io.vertx.junit5.Checkpoint; +import io.vertx.junit5.VertxExtension; +import io.vertx.junit5.VertxTestContext; +import io.vertx.reactivex.core.Vertx; +import io.vertx.reactivex.core.http.HttpClientRequest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; -import java.io.IOException; -import java.net.ServerSocket; import java.net.URI; import java.util.logging.Logger; import static io.cloudevents.CloudEvent.CLOUD_EVENTS_VERSION_KEY; import static io.cloudevents.CloudEvent.EVENT_TYPE_KEY; +import static org.assertj.core.api.Assertions.assertThat; -@RunWith(VertxUnitRunner.class) -public class VertxCloudEventsTests { +@ExtendWith(VertxExtension.class) +class VertxCloudEventsTests { private final static Logger logger = Logger.getLogger(VertxCloudEventsTests.class.getName()); - private HttpServer server; - private Vertx vertx; - private int port; - - @Before - public void setUp(TestContext context) throws IOException { - vertx = Vertx.vertx(); - ServerSocket socket = new ServerSocket(0); - port = socket.getLocalPort(); - socket.close(); - server = vertx.createHttpServer(); - } - - @After - public void tearDown(TestContext context) { - vertx.close(context.asyncAssertSuccess()); - } - @Test - public void cloudEventWithPayload(TestContext context) { - final Async async = context.async(); + @DisplayName("Post a cloud event with a payload") + void cloudEventWithPayload(Vertx vertx, VertxTestContext testContext) { + Checkpoint serverCheckpoint = testContext.checkpoint(); + Checkpoint clientCheckpoint = testContext.checkpoint(); - // Create the actuak CloudEvents object; - final CloudEvent cloudEvent = new CloudEventBuilder() + CloudEvent cloudEvent = new CloudEventBuilder() .source(URI.create("http://knative-eventing.com")) .eventID("foo-bar") .eventType("pushevent") .data("{\"foo\":\"bar\"}}") .build(); - // set up the server and add a handler to check the values - server.requestHandler(req -> { - - VertxCloudEvents.create().readFromRequest(req, reply -> { - - if (reply.succeeded()) { - - final CloudEvent receivedEvent = reply.result(); - context.assertEquals(receivedEvent.getEventID(), cloudEvent.getEventID()); - context.assertEquals(receivedEvent.getSource().toString(), cloudEvent.getSource().toString()); - context.assertEquals(receivedEvent.getEventType(), cloudEvent.getEventType()); - context.assertEquals(receivedEvent.getData().isPresent(), Boolean.TRUE); - } - }); - - req.response().end(); - }).listen(port, ar -> { - if (ar.failed()) { - context.fail("could not start server"); - } else { - // sending it to the test-server - final HttpClientRequest request = vertx.createHttpClient().post(port, "localhost", "/"); - - VertxCloudEvents.create().writeToHttpClientRequest(cloudEvent, request); - request.handler(response -> { - context.assertEquals(response.statusCode(), 200); - - async.complete(); + vertx.createHttpServer() + .requestHandler(req -> VertxCloudEvents + .create() + .rxReadFromRequest(req) + .doOnError(testContext::failNow) + .subscribe(event -> testContext.verify(() -> { + assertThat(event.getEventID()).isEqualTo(cloudEvent.getEventID()); + assertThat(event.getSource().toString()).isEqualTo(cloudEvent.getSource().toString()); + assertThat(event.getEventType()).isEqualTo(cloudEvent.getEventType()); + assertThat(event.getData()).isPresent(); + req.response().end(); + serverCheckpoint.flag(); + }))) + .rxListen() + .doOnError(testContext::failNow) + .subscribe(server -> { + HttpClientRequest req = vertx.createHttpClient().post(server.actualPort(), "localhost", "/"); + req.handler(resp -> testContext.verify(() -> { + assertThat(resp.statusCode()).isEqualTo(200); + clientCheckpoint.flag(); + })); + VertxCloudEvents.create().writeToHttpClientRequest(cloudEvent, req); + req.end(); }); - request.end(); - } - }); - logger.info("running on port: " + port); - - async.awaitSuccess(1000); } @Test - public void cloudEventWithoutPayload(TestContext context) { - final Async async = context.async(); + @DisplayName("Post a cloud event without a payload") + void cloudEventWithoutPayload(Vertx vertx, VertxTestContext testContext) { + Checkpoint serverCheckpoint = testContext.checkpoint(); + Checkpoint clientCheckpoint = testContext.checkpoint(); - // Create the actuak CloudEvents object; - final CloudEvent cloudEvent = new CloudEventBuilder() + CloudEvent cloudEvent = new CloudEventBuilder() .source(URI.create("http://knative-eventing.com")) .eventID("foo-bar") .eventType("pushevent") .build(); - // set up the server and add a handler to check the values - server.requestHandler(req -> { - - VertxCloudEvents.create().readFromRequest(req, reply -> { - - if (reply.succeeded()) { - - final CloudEvent receivedEvent = reply.result(); - context.assertEquals(receivedEvent.getEventID(), cloudEvent.getEventID()); - context.assertEquals(receivedEvent.getSource().toString(), cloudEvent.getSource().toString()); - context.assertEquals(receivedEvent.getEventType(), cloudEvent.getEventType()); - context.assertEquals(receivedEvent.getData().isPresent(), Boolean.FALSE); - } - }); - - req.response().end(); - }).listen(port, ar -> { - if (ar.failed()) { - context.fail("could not start server"); - } else { - // sending it to the test-server - final HttpClientRequest request = vertx.createHttpClient().post(port, "localhost", "/"); - - VertxCloudEvents.create().writeToHttpClientRequest(cloudEvent, request); - request.handler(resp -> { - context.assertEquals(resp.statusCode(), 200); - async.complete(); - + vertx.createHttpServer() + .requestHandler(req -> VertxCloudEvents + .create() + .rxReadFromRequest(req) + .doOnError(testContext::failNow) + .subscribe(event -> testContext.verify(() -> { + assertThat(event.getEventID()).isEqualTo(cloudEvent.getEventID()); + assertThat(event.getSource().toString()).isEqualTo(cloudEvent.getSource().toString()); + assertThat(event.getEventType()).isEqualTo(cloudEvent.getEventType()); + assertThat(event.getData()).isNotPresent(); + req.response().end(); + serverCheckpoint.flag(); + }))) + .rxListen() + .doOnError(testContext::failNow) + .subscribe(server -> { + HttpClientRequest req = vertx.createHttpClient().post(server.actualPort(), "localhost", "/"); + req.handler(resp -> testContext.verify(() -> { + assertThat(resp.statusCode()).isEqualTo(200); + clientCheckpoint.flag(); + })); + VertxCloudEvents.create().writeToHttpClientRequest(cloudEvent, req); + req.end(); }); - request.end(); - - } - }); - logger.info("running on port: " + port); - - async.awaitSuccess(1000); } @Test - public void incompleteCloudEvent(TestContext context) { - final Async async = context.async(); + @DisplayName("Post an incomplete cloud event") + void incompleteCloudEvent(Vertx vertx, VertxTestContext testContext) { + Checkpoint serverCheckpoint = testContext.checkpoint(); + Checkpoint clientCheckpoint = testContext.checkpoint(); - // set up the server and add a handler to check the values - server.requestHandler(req -> { - - VertxCloudEvents.create().readFromRequest(req, reply -> { - - if (reply.succeeded()) { - - context.fail("request was not complete"); - } else { - context.assertEquals(reply.failed(), Boolean.TRUE); - } - }); - - req.response().end(); - }).listen(port, ar -> { - - if (ar.failed()) { - context.fail("could not start server"); - } else { - // fire the request - // sending it to the test-server - final HttpClientRequest request = vertx.createHttpClient().post(port, "localhost", "/"); - // create incomplete CloudEvent request - request.putHeader(HttpHeaders.createOptimized(CLOUD_EVENTS_VERSION_KEY), HttpHeaders.createOptimized("0.1")); - request.putHeader(HttpHeaders.createOptimized(EVENT_TYPE_KEY), HttpHeaders.createOptimized("pushevent")); - request.putHeader(HttpHeaders.CONTENT_LENGTH, HttpHeaders.createOptimized("0")); - - request.handler(resp -> { - context.assertEquals(resp.statusCode(), 200); - - async.complete(); + vertx.createHttpServer() + .requestHandler(req -> VertxCloudEvents + .create() + .rxReadFromRequest(req) + .subscribe((e, t) -> { + if (e != null) { + testContext.failNow(new AssertionError("request was not complete, but got: " + e)); + } else { + req.response().end(); + serverCheckpoint.flag(); + } + })) + .rxListen() + .doOnError(testContext::failNow) + .subscribe(server -> { + HttpClientRequest req = vertx.createHttpClient().post(server.actualPort(), "localhost", "/"); + // create incomplete CloudEvent request + req.putHeader(HttpHeaders.createOptimized(CLOUD_EVENTS_VERSION_KEY), HttpHeaders.createOptimized("0.1")); + req.putHeader(HttpHeaders.createOptimized(EVENT_TYPE_KEY), HttpHeaders.createOptimized("pushevent")); + req.putHeader(HttpHeaders.CONTENT_LENGTH, HttpHeaders.createOptimized("0")); + req.handler(resp -> testContext.verify(() -> { + assertThat(resp.statusCode()).isEqualTo(200); + clientCheckpoint.flag(); + })); + req.end(); }); - request.end(); - } - }); - logger.info("running on port: " + port); - - async.awaitSuccess(1000); } } From fff4b89d44bb3a9226e76ab852c9b550bca6aa1f Mon Sep 17 00:00:00 2001 From: Julien Ponge Date: Tue, 4 Dec 2018 22:11:03 +0100 Subject: [PATCH 2/2] Force 8080 port It seems like not every port can be used when running in Travis-CI. Signed-off-by: Julien Ponge --- .../io/cloudevents/http/vertx/VertxCloudEventsTests.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/http/vertx/src/test/java/io/cloudevents/http/vertx/VertxCloudEventsTests.java b/http/vertx/src/test/java/io/cloudevents/http/vertx/VertxCloudEventsTests.java index 188f70c0..cdd19f24 100644 --- a/http/vertx/src/test/java/io/cloudevents/http/vertx/VertxCloudEventsTests.java +++ b/http/vertx/src/test/java/io/cloudevents/http/vertx/VertxCloudEventsTests.java @@ -66,7 +66,7 @@ class VertxCloudEventsTests { req.response().end(); serverCheckpoint.flag(); }))) - .rxListen() + .rxListen(8080) .doOnError(testContext::failNow) .subscribe(server -> { HttpClientRequest req = vertx.createHttpClient().post(server.actualPort(), "localhost", "/"); @@ -104,7 +104,7 @@ class VertxCloudEventsTests { req.response().end(); serverCheckpoint.flag(); }))) - .rxListen() + .rxListen(8080) .doOnError(testContext::failNow) .subscribe(server -> { HttpClientRequest req = vertx.createHttpClient().post(server.actualPort(), "localhost", "/"); @@ -135,7 +135,7 @@ class VertxCloudEventsTests { serverCheckpoint.flag(); } })) - .rxListen() + .rxListen(8080) .doOnError(testContext::failNow) .subscribe(server -> { HttpClientRequest req = vertx.createHttpClient().post(server.actualPort(), "localhost", "/");