From 3e35ec362cf408ee254002bfb2c785cccb50e4ca Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Wed, 4 Nov 2020 13:15:51 -0600 Subject: [PATCH 1/8] Correcting compact3 jar contents to only include org.eclipse.jetty Signed-off-by: Joakim Erdfelt --- aggregates/jetty-all-compact3/pom.xml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/aggregates/jetty-all-compact3/pom.xml b/aggregates/jetty-all-compact3/pom.xml index 8f7a3e9d725a..17db7391cf2f 100644 --- a/aggregates/jetty-all-compact3/pom.xml +++ b/aggregates/jetty-all-compact3/pom.xml @@ -37,7 +37,7 @@ **/MANIFEST.MF,javax/** javax,jetty-test-helper - javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm,org.junit + javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm,org.junit,org.apiguardian,org.opentest4j,org.hamcrest ${project.build.directory}/classes false true @@ -51,13 +51,23 @@ sources - **/* + org/eclipse/jetty/** - META-INF/**, **/Servlet3Continuation*, **/Jetty6Continuation*, **/AppContextLeakPreventer*.java, **/AWTLeakPreventer*.java, **/IntrospectorCleaner*.java, **/PostConstructAnnotationHandler*.java, **/PreDestroyAnnotationHandler*.java, **/ResourceAnnotationHandler*.java, **/ResourcesAnnotationHandler*.java + META-INF/**, + **/module-info.class, + **/Servlet3Continuation*, + **/Jetty6Continuation*, + **/AppContextLeakPreventer*.java, + **/AWTLeakPreventer*.java, + **/IntrospectorCleaner*.java, + **/PostConstructAnnotationHandler*.java, + **/PreDestroyAnnotationHandler*.java, + **/ResourceAnnotationHandler*.java, + **/ResourcesAnnotationHandler*.java org.eclipse.jetty,org.eclipse.jetty.websocket javax,jetty-test-helper - javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm,org.junit + javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm,org.junit,org.apiguardian,org.opentest4j,org.hamcrest ${project.build.directory}/sources true true From a308881fab6cfad4263f7d71508a7147ebefe72f Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Wed, 11 Nov 2020 17:13:00 +0100 Subject: [PATCH 2/8] Fixes #5633 - Allow to configure HttpClient request authority. Introduced HttpDestination.send(Request, Response.CompleteListener) to send a request using the given destination. Signed-off-by: Simone Bordet --- .../org/eclipse/jetty/client/HttpClient.java | 8 +++- .../eclipse/jetty/client/HttpConnection.java | 8 +++- .../eclipse/jetty/client/HttpDestination.java | 12 +++-- .../org/eclipse/jetty/client/HttpRequest.java | 14 ++++-- .../jetty/http/client/HttpClientTest.java | 44 +++++++++++++++++++ 5 files changed, 73 insertions(+), 13 deletions(-) diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java index c9ce6f258ed1..e6e71096bd69 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java @@ -562,7 +562,13 @@ protected Origin createOrigin(String scheme, String host, int port, Object tag) return new Origin(scheme, host, port, tag); } - protected HttpDestination resolveDestination(Origin origin) + /** + *

Returns, creating it if absent, the destination with the given origin.

+ * + * @param origin the origin that identifies the destination + * @return the destination for the given origin + */ + public HttpDestination resolveDestination(Origin origin) { return destinations.computeIfAbsent(origin, o -> { diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpConnection.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpConnection.java index 6930ca19b6b7..8ab4f21e1f79 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpConnection.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpConnection.java @@ -120,7 +120,13 @@ protected void normalizeRequest(Request request) if (version.getVersion() <= 11) { if (!headers.containsKey(HttpHeader.HOST.asString())) - headers.put(getHttpDestination().getHostField()); + { + URI uri = request.getURI(); + if (uri != null) + headers.put(HttpHeader.HOST, uri.getAuthority()); + else + headers.put(getHttpDestination().getHostField()); + } } // Add content headers diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java index fd8ae0bb52b5..c8866e6dc00e 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpDestination.java @@ -253,15 +253,13 @@ public void failed(Throwable x) abort(x); } + public void send(Request request, Response.CompleteListener listener) + { + ((HttpRequest)request).sendAsync(this, listener); + } + protected void send(HttpRequest request, List listeners) { - if (!getScheme().equalsIgnoreCase(request.getScheme())) - throw new IllegalArgumentException("Invalid request scheme " + request.getScheme() + " for destination " + this); - if (!getHost().equalsIgnoreCase(request.getHost())) - throw new IllegalArgumentException("Invalid request host " + request.getHost() + " for destination " + this); - int port = request.getPort(); - if (port >= 0 && getPort() != port) - throw new IllegalArgumentException("Invalid request port " + port + " for destination " + this); send(new HttpExchange(this, request, listeners)); } diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequest.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequest.java index 53750ad0f2a6..2a373e288b02 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequest.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpRequest.java @@ -40,6 +40,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.LongConsumer; import java.util.function.Supplier; @@ -722,7 +723,7 @@ public Request timeout(long timeout, TimeUnit unit) public ContentResponse send() throws InterruptedException, TimeoutException, ExecutionException { FutureResponseListener listener = new FutureResponseListener(this); - send(this, listener); + send(listener); try { @@ -761,15 +762,20 @@ public ContentResponse send() throws InterruptedException, TimeoutException, Exe @Override public void send(Response.CompleteListener listener) { - send(this, listener); + sendAsync(client::send, listener); } - private void send(HttpRequest request, Response.CompleteListener listener) + void sendAsync(HttpDestination destination, Response.CompleteListener listener) + { + sendAsync(destination::send, listener); + } + + private void sendAsync(BiConsumer> sender, Response.CompleteListener listener) { if (listener != null) responseListeners.add(listener); sent(); - client.send(request, responseListeners); + sender.accept(this, responseListeners); } void sent() diff --git a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java index ccc977159cc9..7e58db34ce7e 100644 --- a/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java +++ b/tests/test-http-client-transport/src/test/java/org/eclipse/jetty/http/client/HttpClientTest.java @@ -36,6 +36,8 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.client.HttpDestination; +import org.eclipse.jetty.client.Origin; import org.eclipse.jetty.client.api.ContentResponse; import org.eclipse.jetty.client.api.Destination; import org.eclipse.jetty.client.api.Response; @@ -44,7 +46,9 @@ import org.eclipse.jetty.client.util.InputStreamResponseListener; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpMethod; +import org.eclipse.jetty.http.HttpScheme; import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.http.HttpURI; import org.eclipse.jetty.http2.FlowControlStrategy; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; @@ -733,6 +737,46 @@ protected void service(String target, Request jettyRequest, HttpServletRequest r assertEquals(1, scenario.client.getDestinations().size()); } + @ParameterizedTest + @ArgumentsSource(TransportProvider.class) + public void testRequestWithDifferentDestination(Transport transport) throws Exception + { + init(transport); + + String requestScheme = HttpScheme.HTTPS.is(scenario.getScheme()) ? "http" : "https"; + String requestHost = "otherHost.com"; + int requestPort = 8888; + scenario.start(new EmptyServerHandler() + { + @Override + protected void service(String target, Request jettyRequest, HttpServletRequest request, HttpServletResponse response) + { + HttpURI uri = jettyRequest.getHttpURI(); + assertEquals(requestHost, uri.getHost()); + assertEquals(requestPort, uri.getPort()); + if (scenario.transport == Transport.H2C || scenario.transport == Transport.H2) + assertEquals(requestScheme, request.getScheme()); + } + }); + + Origin origin = new Origin(scenario.getScheme(), "localhost", scenario.getNetworkConnectorLocalPortInt().get()); + HttpDestination destination = scenario.client.resolveDestination(origin); + + org.eclipse.jetty.client.api.Request request = scenario.client.newRequest(requestHost, requestPort) + .scheme(requestScheme) + .path("/path"); + + CountDownLatch resultLatch = new CountDownLatch(1); + destination.send(request, result -> + { + assertTrue(result.isSucceeded()); + assertEquals(HttpStatus.OK_200, result.getResponse().getStatus()); + resultLatch.countDown(); + }); + + assertTrue(resultLatch.await(5, TimeUnit.SECONDS)); + } + private void sleep(long time) throws IOException { try From 991e23d80ba93dc81f8a31f0e8da14db9150f816 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Nov 2020 14:05:10 +0000 Subject: [PATCH 3/8] Bump openwebbeans.version from 2.0.19 to 2.0.20 Bumps `openwebbeans.version` from 2.0.19 to 2.0.20. Updates `openwebbeans-web` from 2.0.19 to 2.0.20 - [Release notes](https://github.com/apache/openwebbeans/releases) - [Commits](https://github.com/apache/openwebbeans/commits/openwebbeans-2.0.20) Updates `openwebbeans-jetty9` from 2.0.19 to 2.0.20 - [Release notes](https://github.com/apache/openwebbeans/releases) - [Commits](https://github.com/apache/openwebbeans/commits/openwebbeans-2.0.20) Signed-off-by: dependabot[bot] --- tests/test-webapps/test-owb-cdi-webapp/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-webapps/test-owb-cdi-webapp/pom.xml b/tests/test-webapps/test-owb-cdi-webapp/pom.xml index 0372524fd692..8730eecf2140 100644 --- a/tests/test-webapps/test-owb-cdi-webapp/pom.xml +++ b/tests/test-webapps/test-owb-cdi-webapp/pom.xml @@ -13,7 +13,7 @@ ${project.groupId}.cdi.owb - 2.0.19 + 2.0.20 From 213ac63d2c434283d56e31b7bc058912a82fb596 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Tue, 17 Nov 2020 11:13:22 +1000 Subject: [PATCH 4/8] Enable gcloud testing in docker (#5651) * Enable "gcloud" profile for gcloud session testing. Signed-off-by: Joakim Erdfelt * use docker image as google datastore Signed-off-by: olivier lamy * fix project id Signed-off-by: olivier lamy * all tests pass here Signed-off-by: olivier lamy * do not trim stack trace Signed-off-by: olivier lamy * Try distinguishing between localhost and non-localhost Signed-off-by: Jan Bartel * add some debug Signed-off-by: olivier lamy * remove non needed pom content Signed-off-by: olivier lamy Co-authored-by: Jan Bartel --- Jenkinsfile | 6 +- .../test-gcloud-sessions/pom.xml | 21 +++-- .../session/GCloudSessionTestSupport.java | 86 ++++++++++++++++--- .../test/resources/simplelogger.properties | 3 + .../server/session/InfinispanTestSupport.java | 3 - .../remote/RemoteInfinispanTestSupport.java | 1 - 6 files changed, 95 insertions(+), 25 deletions(-) create mode 100644 tests/test-sessions/test-gcloud-sessions/src/test/resources/simplelogger.properties diff --git a/Jenkinsfile b/Jenkinsfile index 02a0c484a5d6..2aceff0e0630 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,7 +12,7 @@ pipeline { steps { container('jetty-build') { timeout( time: 120, unit: 'MINUTES' ) { - mavenBuild( "jdk8", "clean install -T3 -Premote-session-tests", "maven3", + mavenBuild( "jdk8", "clean install -T3 -Premote-session-tests -Pgcloud", "maven3", [[parserName: 'Maven'], [parserName: 'Java']]) // Collect up the jacoco execution results (only on main build) jacoco inclusionPattern: '**/org/eclipse/jetty/**/*.class', @@ -42,7 +42,7 @@ pipeline { steps { container( 'jetty-build' ) { timeout( time: 120, unit: 'MINUTES' ) { - mavenBuild( "jdk11", "clean install -T3 -Djacoco.skip=true -Premote-session-tests", "maven3", + mavenBuild( "jdk11", "clean install -T3 -Djacoco.skip=true -Premote-session-tests -Pgcloud", "maven3", [[parserName: 'Maven'], [parserName: 'Java']]) } } @@ -54,7 +54,7 @@ pipeline { steps { container( 'jetty-build' ) { timeout( time: 120, unit: 'MINUTES' ) { - mavenBuild( "jdk15", "clean install -T3 -Djacoco.skip=true -Premote-session-tests", "maven3", + mavenBuild( "jdk15", "clean install -T3 -Djacoco.skip=true -Premote-session-tests -Pgcloud", "maven3", [[parserName: 'Maven'], [parserName: 'Java']]) } } diff --git a/tests/test-sessions/test-gcloud-sessions/pom.xml b/tests/test-sessions/test-gcloud-sessions/pom.xml index 606509801db4..82bb0ed67eaf 100644 --- a/tests/test-sessions/test-gcloud-sessions/pom.xml +++ b/tests/test-sessions/test-gcloud-sessions/pom.xml @@ -61,6 +61,22 @@ jetty-test-helper test + + org.testcontainers + testcontainers + test + + + org.testcontainers + gcloud + ${testcontainers.version} + test + + + org.slf4j + slf4j-simple + test + @@ -78,15 +94,10 @@ maven-surefire-plugin false - - jetty9-work - http://localhost:8088 - - diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTestSupport.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTestSupport.java index 129445074df8..d6046483f277 100644 --- a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTestSupport.java +++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionTestSupport.java @@ -20,12 +20,17 @@ import java.io.ByteArrayOutputStream; import java.io.ObjectOutputStream; +import java.net.InetAddress; +import java.net.URL; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import com.google.cloud.NoCredentials; +import com.google.cloud.ServiceOptions; +import com.google.cloud.datastore.Batch; import com.google.cloud.datastore.Blob; import com.google.cloud.datastore.BlobValue; import com.google.cloud.datastore.Datastore; @@ -38,13 +43,17 @@ import com.google.cloud.datastore.Query.ResultType; import com.google.cloud.datastore.QueryResults; import com.google.cloud.datastore.StructuredQuery.PropertyFilter; -import com.google.cloud.datastore.testing.LocalDatastoreHelper; import org.eclipse.jetty.gcloud.session.GCloudSessionDataStore.EntityDataModel; import org.eclipse.jetty.server.session.SessionData; import org.eclipse.jetty.server.session.SessionDataStore; import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.util.ClassLoadingObjectInputStream; -import org.threeten.bp.Duration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.DatastoreEmulatorContainer; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -55,10 +64,35 @@ */ public class GCloudSessionTestSupport { - LocalDatastoreHelper _helper = LocalDatastoreHelper.create(1.0); Datastore _ds; KeyFactory _keyFactory; + private static final Logger LOGGER = LoggerFactory.getLogger(GCloudSessionTestSupport.class); + private static final Logger GCLOUD_LOG = LoggerFactory.getLogger("org.eclipse.jetty.gcloud.session.gcloudLogs"); + + public DatastoreEmulatorContainer emulator = new CustomDatastoreEmulatorContainer( + DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:316.0.0-emulators") + ).withLogConsumer(new Slf4jLogConsumer(GCLOUD_LOG)); + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk"); + + private static final String CMD = "gcloud beta emulators datastore start --project test-project --host-port 0.0.0.0:8081 --consistency=1.0"; + private static final int HTTP_PORT = 8081; + + public static class CustomDatastoreEmulatorContainer extends DatastoreEmulatorContainer + { + public CustomDatastoreEmulatorContainer(DockerImageName dockerImageName) + { + super(dockerImageName); + + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + withExposedPorts(HTTP_PORT); + setWaitStrategy(Wait.forHttp("/").forStatusCode(200)); + withCommand("/bin/sh", "-c", CMD); + } + } + public static class TestGCloudSessionDataStoreFactory extends GCloudSessionDataStoreFactory { Datastore _d; @@ -88,15 +122,35 @@ public static GCloudSessionDataStoreFactory newSessionDataStoreFactory(Datastore public GCloudSessionTestSupport() { - DatastoreOptions options = _helper.getOptions(); - _ds = options.getService(); - _keyFactory = _ds.newKeyFactory().setKind(EntityDataModel.KIND); + // no op } public void setUp() throws Exception { - _helper.start(); + emulator.start(); + String host; + //work out if we're running locally or not: if not local, then the host passed to + //DatastoreOptions must be prefixed with a scheme + String endPoint = emulator.getEmulatorEndpoint(); + InetAddress hostAddr = InetAddress.getByName(new URL("http://" + endPoint).getHost()); + LOGGER.info("endPoint: {} ,hostAddr.isAnyLocalAddress(): {},hostAddr.isLoopbackAddress(): {}", + endPoint, + hostAddr.isAnyLocalAddress(), + hostAddr.isLoopbackAddress()); + if (hostAddr.isAnyLocalAddress() || hostAddr.isLoopbackAddress()) + host = endPoint; + else + host = "http://" + endPoint; + + DatastoreOptions options = DatastoreOptions.newBuilder() + .setHost(host) + .setCredentials(NoCredentials.getInstance()) + .setRetrySettings(ServiceOptions.getNoRetrySettings()) + .setProjectId("test-project") + .build(); + _ds = options.getService(); + _keyFactory = _ds.newKeyFactory().setKind(EntityDataModel.KIND); } public Datastore getDatastore() @@ -107,12 +161,13 @@ public Datastore getDatastore() public void tearDown() throws Exception { - _helper.stop(Duration.ofMinutes(1)); //wait up to 1min for shutdown + emulator.stop(); } public void reset() throws Exception { - _helper.reset(); + emulator.stop(); + this.setUp(); } public void createSession(String id, String contextPath, String vhost, @@ -260,12 +315,14 @@ public void assertSessions(int count) throws Exception QueryResults results = _ds.run(query); assertNotNull(results); int actual = 0; + List keys = new ArrayList<>(); while (results.hasNext()) { - results.next(); + Key key = results.next(); + keys.add(key); ++actual; } - assertEquals(count, actual); + assertEquals(count, actual, "keys found: " + keys); } public void deleteSessions() throws Exception @@ -273,18 +330,21 @@ public void deleteSessions() throws Exception Query query = Query.newKeyQueryBuilder().setKind(GCloudSessionDataStore.EntityDataModel.KIND).build(); QueryResults results = _ds.run(query); + Batch batch = _ds.newBatch(); + if (results != null) { - List keys = new ArrayList(); + List keys = new ArrayList<>(); while (results.hasNext()) { keys.add(results.next()); } - _ds.delete(keys.toArray(new Key[keys.size()])); + batch.delete(keys.toArray(new Key[keys.size()])); } + batch.submit(); assertSessions(0); } } diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/resources/simplelogger.properties b/tests/test-sessions/test-gcloud-sessions/src/test/resources/simplelogger.properties new file mode 100644 index 000000000000..632027c8806d --- /dev/null +++ b/tests/test-sessions/test-gcloud-sessions/src/test/resources/simplelogger.properties @@ -0,0 +1,3 @@ +org.slf4j.simpleLogger.defaultLogLevel=info +org.slf4j.simpleLogger.log.org.eclipse.jetty.gcloud.session=info +org.slf4j.simpleLogger.log.org.eclipse.jetty.gcloud.session.gcloudLogs=info diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java index a7ee8b42cd10..e8ac7ac413ec 100644 --- a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java +++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/InfinispanTestSupport.java @@ -25,8 +25,6 @@ import java.util.Properties; import org.eclipse.jetty.toolchain.test.FS; -import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; -import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.IO; import org.hibernate.search.cfg.Environment; import org.hibernate.search.cfg.SearchMapping; @@ -37,7 +35,6 @@ import org.infinispan.configuration.global.GlobalConfigurationBuilder; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; -import org.junit.jupiter.api.extension.ExtendWith; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanTestSupport.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanTestSupport.java index 3955fe518fe4..8f7da81fb4f8 100644 --- a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanTestSupport.java +++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanTestSupport.java @@ -42,7 +42,6 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; -import org.testcontainers.utility.MountableFile; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; From 48b89f939410ed0287da6807158cd79abf51eaff Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Tue, 17 Nov 2020 16:20:16 +1000 Subject: [PATCH 5/8] use @Testcontainers to disable test if docker not available (#5678) Signed-off-by: olivier lamy --- tests/test-sessions/test-gcloud-sessions/pom.xml | 5 +++++ .../jetty/gcloud/session/ClusteredOrphanedSessionTest.java | 2 ++ .../jetty/gcloud/session/ClusteredSessionScavengingTest.java | 2 ++ .../jetty/gcloud/session/GCloudSessionDataStoreTest.java | 2 ++ .../jetty/gcloud/session/InvalidationSessionTest.java | 2 ++ tests/test-sessions/test-infinispan-sessions/pom.xml | 5 +++++ .../remote/RemoteClusteredInvalidationSessionTest.java | 2 ++ .../session/remote/RemoteClusteredSessionScavengingTest.java | 2 ++ .../session/remote/RemoteInfinispanSessionDataStoreTest.java | 2 ++ .../memcached/sessions/CachingSessionDataStoreTest.java | 2 ++ .../org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java | 2 ++ .../jetty/nosql/mongodb/ClusteredInvalidateSessionTest.java | 2 ++ .../jetty/nosql/mongodb/ClusteredOrphanedSessionTest.java | 2 ++ .../jetty/nosql/mongodb/ClusteredSessionScavengingTest.java | 2 ++ .../jetty/nosql/mongodb/MongoSessionDataStoreTest.java | 2 ++ 15 files changed, 36 insertions(+) diff --git a/tests/test-sessions/test-gcloud-sessions/pom.xml b/tests/test-sessions/test-gcloud-sessions/pom.xml index 82bb0ed67eaf..1cd62d863690 100644 --- a/tests/test-sessions/test-gcloud-sessions/pom.xml +++ b/tests/test-sessions/test-gcloud-sessions/pom.xml @@ -66,6 +66,11 @@ testcontainers test + + org.testcontainers + junit-jupiter + test + org.testcontainers gcloud diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClusteredOrphanedSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClusteredOrphanedSessionTest.java index 1aa4c414ebcd..bc68d5f2e327 100644 --- a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClusteredOrphanedSessionTest.java +++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClusteredOrphanedSessionTest.java @@ -23,10 +23,12 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Testcontainers; /** * ClusteredOrphanedSessionTest */ +@Testcontainers(disabledWithoutDocker = true) public class ClusteredOrphanedSessionTest extends AbstractClusteredOrphanedSessionTest { diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClusteredSessionScavengingTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClusteredSessionScavengingTest.java index b248fa40684f..a2da77faa2a4 100644 --- a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClusteredSessionScavengingTest.java +++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/ClusteredSessionScavengingTest.java @@ -22,10 +22,12 @@ import org.eclipse.jetty.server.session.SessionDataStoreFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.junit.jupiter.Testcontainers; /** * ClusteredSessionScavengingTest */ +@Testcontainers(disabledWithoutDocker = true) public class ClusteredSessionScavengingTest extends AbstractClusteredSessionScavengingTest { diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionDataStoreTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionDataStoreTest.java index 52f8750567a4..189a19d801b1 100644 --- a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionDataStoreTest.java +++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/GCloudSessionDataStoreTest.java @@ -24,10 +24,12 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.junit.jupiter.Testcontainers; /** * GCloudSessionDataStoreTest */ +@Testcontainers(disabledWithoutDocker = true) public class GCloudSessionDataStoreTest extends AbstractSessionDataStoreTest { diff --git a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/InvalidationSessionTest.java b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/InvalidationSessionTest.java index 03b0cdf266cd..4a7c0f0e2026 100644 --- a/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/InvalidationSessionTest.java +++ b/tests/test-sessions/test-gcloud-sessions/src/test/java/org/eclipse/jetty/gcloud/session/InvalidationSessionTest.java @@ -22,10 +22,12 @@ import org.eclipse.jetty.server.session.SessionDataStoreFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.junit.jupiter.Testcontainers; /** * InvalidationSessionTest */ +@Testcontainers(disabledWithoutDocker = true) public class InvalidationSessionTest extends AbstractClusteredInvalidationSessionTest { diff --git a/tests/test-sessions/test-infinispan-sessions/pom.xml b/tests/test-sessions/test-infinispan-sessions/pom.xml index 1faf12950d4f..7f2c0d976192 100644 --- a/tests/test-sessions/test-infinispan-sessions/pom.xml +++ b/tests/test-sessions/test-infinispan-sessions/pom.xml @@ -145,6 +145,11 @@ testcontainers test + + org.testcontainers + junit-jupiter + test + diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClusteredInvalidationSessionTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClusteredInvalidationSessionTest.java index 0b86b4422f93..439991c7f67c 100644 --- a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClusteredInvalidationSessionTest.java +++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClusteredInvalidationSessionTest.java @@ -23,10 +23,12 @@ import org.eclipse.jetty.session.infinispan.InfinispanSessionDataStoreFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.junit.jupiter.Testcontainers; /** * InvalidationSessionTest */ +@Testcontainers(disabledWithoutDocker = true) public class RemoteClusteredInvalidationSessionTest extends AbstractClusteredInvalidationSessionTest { diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClusteredSessionScavengingTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClusteredSessionScavengingTest.java index 312129de966c..f68237da62e1 100644 --- a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClusteredSessionScavengingTest.java +++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteClusteredSessionScavengingTest.java @@ -23,10 +23,12 @@ import org.eclipse.jetty.session.infinispan.InfinispanSessionDataStoreFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.junit.jupiter.Testcontainers; /** * ClusteredSessionScavengingTest */ +@Testcontainers(disabledWithoutDocker = true) public class RemoteClusteredSessionScavengingTest extends AbstractClusteredSessionScavengingTest { diff --git a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanSessionDataStoreTest.java b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanSessionDataStoreTest.java index 718a38e06e39..de227bd11912 100644 --- a/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanSessionDataStoreTest.java +++ b/tests/test-sessions/test-infinispan-sessions/src/test/java/org/eclipse/jetty/server/session/remote/RemoteInfinispanSessionDataStoreTest.java @@ -36,6 +36,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Testcontainers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -43,6 +44,7 @@ /** * RemoteInfinispanSessionDataStoreTest */ +@Testcontainers(disabledWithoutDocker = true) public class RemoteInfinispanSessionDataStoreTest extends AbstractSessionDataStoreTest { diff --git a/tests/test-sessions/test-memcached-sessions/src/test/java/org/eclipse/jetty/memcached/sessions/CachingSessionDataStoreTest.java b/tests/test-sessions/test-memcached-sessions/src/test/java/org/eclipse/jetty/memcached/sessions/CachingSessionDataStoreTest.java index 30a652609b51..8124a05c48f8 100644 --- a/tests/test-sessions/test-memcached-sessions/src/test/java/org/eclipse/jetty/memcached/sessions/CachingSessionDataStoreTest.java +++ b/tests/test-sessions/test-memcached-sessions/src/test/java/org/eclipse/jetty/memcached/sessions/CachingSessionDataStoreTest.java @@ -38,6 +38,7 @@ import org.eclipse.jetty.server.session.TestServer; import org.eclipse.jetty.servlet.ServletContextHandler; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Testcontainers; import static org.junit.Assert.assertNull; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -47,6 +48,7 @@ /** * CachingSessionDataStoreTest */ +@Testcontainers(disabledWithoutDocker = true) public class CachingSessionDataStoreTest { diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java index e448857fe65f..372f642382ac 100644 --- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java +++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/AttributeNameTest.java @@ -37,6 +37,7 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Testcontainers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -49,6 +50,7 @@ * properly escaped and not accidentally removed. * See bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=444595 */ +@Testcontainers(disabledWithoutDocker = true) public class AttributeNameTest { diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredInvalidateSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredInvalidateSessionTest.java index ddfb13e20b47..738db6509ccc 100644 --- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredInvalidateSessionTest.java +++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredInvalidateSessionTest.java @@ -22,7 +22,9 @@ import org.eclipse.jetty.server.session.SessionDataStoreFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.junit.jupiter.Testcontainers; +@Testcontainers(disabledWithoutDocker = true) public class ClusteredInvalidateSessionTest extends AbstractClusteredInvalidationSessionTest { diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredOrphanedSessionTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredOrphanedSessionTest.java index 3b35422e39be..455d506bac11 100644 --- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredOrphanedSessionTest.java +++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredOrphanedSessionTest.java @@ -23,10 +23,12 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Testcontainers; /** * ClusteredOrphanedSessionTest */ +@Testcontainers(disabledWithoutDocker = true) public class ClusteredOrphanedSessionTest extends AbstractClusteredOrphanedSessionTest { diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredSessionScavengingTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredSessionScavengingTest.java index d7e83d5c5c9c..37b5c341e06b 100644 --- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredSessionScavengingTest.java +++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/ClusteredSessionScavengingTest.java @@ -22,7 +22,9 @@ import org.eclipse.jetty.server.session.SessionDataStoreFactory; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.testcontainers.junit.jupiter.Testcontainers; +@Testcontainers(disabledWithoutDocker = true) public class ClusteredSessionScavengingTest extends AbstractClusteredSessionScavengingTest { diff --git a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/MongoSessionDataStoreTest.java b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/MongoSessionDataStoreTest.java index db2366b2f6a0..65e5583aabc8 100644 --- a/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/MongoSessionDataStoreTest.java +++ b/tests/test-sessions/test-mongodb-sessions/src/test/java/org/eclipse/jetty/nosql/mongodb/MongoSessionDataStoreTest.java @@ -33,6 +33,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Testcontainers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -40,6 +41,7 @@ /** * MongoSessionDataStoreTest */ +@Testcontainers(disabledWithoutDocker = true) public class MongoSessionDataStoreTest extends AbstractSessionDataStoreTest { From 3c4e259dc2bbea29144682ae2a5396d98a75433d Mon Sep 17 00:00:00 2001 From: olivier lamy Date: Tue, 17 Nov 2020 16:33:39 +1000 Subject: [PATCH 6/8] fail quickly Signed-off-by: olivier lamy --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2aceff0e0630..08c3104036ca 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -138,7 +138,7 @@ def mavenBuild(jdk, cmdline, mvnName, consoleParsers) { "MAVEN_OPTS=-Xms2g -Xmx4g -Djava.awt.headless=true"]) { configFileProvider( [configFile(fileId: 'oss-settings.xml', variable: 'GLOBAL_MVN_SETTINGS')]) { - sh "mvn -s $GLOBAL_MVN_SETTINGS -Dmaven.repo.local=.repository -Pci -fae -V -B -e -Djetty.testtracker.log=true $cmdline -Dunix.socket.tmp=" + + sh "mvn -s $GLOBAL_MVN_SETTINGS -Dmaven.repo.local=.repository -Pci -V -B -e -Djetty.testtracker.log=true $cmdline -Dunix.socket.tmp=" + env.JENKINS_HOME } } From 71087e53a630481f7276a15a82bb48280e8a4727 Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Tue, 17 Nov 2020 13:21:03 +0100 Subject: [PATCH 7/8] Minor cleanup SecureRequestCustomizer (#5660) * For #5650 protect from bad SslSession Better protection from a bad SslSession like seen in #5650 * review indicated that there is too much depth to defend. So just a little cleanup in this PR. --- .../org/eclipse/jetty/server/SecureRequestCustomizer.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java index bbe3e94fc977..9dd9ed3a3df1 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SecureRequestCustomizer.java @@ -333,10 +333,11 @@ public SslAttributes(Request request, SSLSession sslSession, Attributes attribut try { - _certs = getSslSessionData().getCerts(); + SslSessionData sslSessionData = getSslSessionData(); + _certs = sslSessionData.getCerts(); _cipherSuite = _session.getCipherSuite(); - _keySize = getSslSessionData().getKeySize(); - _sessionId = getSslSessionData().getIdStr(); + _keySize = sslSessionData.getKeySize(); + _sessionId = sslSessionData.getIdStr(); _sessionAttribute = getSslSessionAttribute(); } catch (Exception e) From 1d71cabef4dc8b80a3b4376375f402ddc991545b Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Tue, 17 Nov 2020 13:39:28 +0100 Subject: [PATCH 8/8] Fixed test that was failing due to TLS 1.3 backport to Java 8. Signed-off-by: Simone Bordet --- .../jetty/http2/alpn/tests/ALPNNegotiationTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/ALPNNegotiationTest.java b/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/ALPNNegotiationTest.java index 3409db04cdad..835e89c179da 100644 --- a/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/ALPNNegotiationTest.java +++ b/jetty-http2/http2-alpn-tests/src/test/java/org/eclipse/jetty/http2/alpn/tests/ALPNNegotiationTest.java @@ -164,8 +164,15 @@ public void selected(String s) encrypted.flip(); } assertEquals(21, encrypted.get()); + // TLS 1.3 may send 2 alerts: "user_canceled" followed by "close_notify". encrypted.clear(); - assertEquals(-1, channel.read(encrypted)); + read = channel.read(encrypted); + if (read > 0) + { + encrypted.clear(); + read = channel.read(encrypted); + } + assertEquals(-1, read); } }