From f22c1ba7d6b6741a48b62596b8d5a68e23ea367b Mon Sep 17 00:00:00 2001 From: Scott Frederick Date: Fri, 20 Oct 2023 16:04:08 -0500 Subject: [PATCH] Add smoke test for Kafka with SSL Closes gh-38260 --- .../spring-boot-smoke-test-kafka/build.gradle | 1 + .../main/java/smoketest/kafka/Consumer.java | 4 +- .../kafka/ssl/SampleKafkaSslApplication.java | 29 +++++++ .../ssl/SampleKafkaSslApplicationTests.java | 73 ++++++++++++++++++ .../src/test/resources/docker-compose.yml | 30 +++++++ .../src/test/resources/ssl/credentials | 1 + .../src/test/resources/ssl/test-ca.p12 | Bin 0 -> 4173 bytes .../src/test/resources/ssl/test-client.p12 | Bin 0 -> 2653 bytes .../src/test/resources/ssl/test-server.p12 | Bin 0 -> 2653 bytes 9 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/main/java/smoketest/kafka/ssl/SampleKafkaSslApplication.java create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/java/smoketest/kafka/ssl/SampleKafkaSslApplicationTests.java create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/docker-compose.yml create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/credentials create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-ca.p12 create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-client.p12 create mode 100644 spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-server.p12 diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/build.gradle b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/build.gradle index abe8f0e0f35c..426a515062e1 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/build.gradle +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/build.gradle @@ -14,4 +14,5 @@ dependencies { testImplementation("org.springframework.kafka:spring-kafka-test") { exclude group: "commons-logging", module: "commons-logging" } + testImplementation("org.testcontainers:junit-jupiter") } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/main/java/smoketest/kafka/Consumer.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/main/java/smoketest/kafka/Consumer.java index 4beb1a980ff1..3daf110da707 100644 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/main/java/smoketest/kafka/Consumer.java +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/main/java/smoketest/kafka/Consumer.java @@ -23,7 +23,7 @@ import org.springframework.stereotype.Component; @Component -class Consumer { +public class Consumer { private final List messages = new CopyOnWriteArrayList<>(); @@ -33,7 +33,7 @@ void processMessage(SampleMessage message) { System.out.println("Received sample message [" + message + "]"); } - List getMessages() { + public List getMessages() { return this.messages; } diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/main/java/smoketest/kafka/ssl/SampleKafkaSslApplication.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/main/java/smoketest/kafka/ssl/SampleKafkaSslApplication.java new file mode 100644 index 000000000000..30b8c8ad2e30 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/main/java/smoketest/kafka/ssl/SampleKafkaSslApplication.java @@ -0,0 +1,29 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * 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 + * + * https://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 smoketest.kafka.ssl; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SampleKafkaSslApplication { + + public static void main(String[] args) { + SpringApplication.run(SampleKafkaSslApplication.class, args); + } + +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/java/smoketest/kafka/ssl/SampleKafkaSslApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/java/smoketest/kafka/ssl/SampleKafkaSslApplicationTests.java new file mode 100644 index 000000000000..2d239233f4f6 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/java/smoketest/kafka/ssl/SampleKafkaSslApplicationTests.java @@ -0,0 +1,73 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * 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 + * + * https://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 smoketest.kafka.ssl; + +import java.io.File; +import java.time.Duration; + +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import smoketest.kafka.Consumer; +import smoketest.kafka.Producer; +import smoketest.kafka.SampleMessage; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.not; + +@Testcontainers +@SpringBootTest(classes = { SampleKafkaSslApplication.class, Producer.class, Consumer.class }, + properties = { "spring.kafka.security.protocol=SSL", "spring.kafka.bootstrap-servers=localhost:9093", + "spring.kafka.ssl.bundle=client", + "spring.ssl.bundle.jks.client.keystore.location=classpath:ssl/test-client.p12", + "spring.ssl.bundle.jks.client.keystore.password=password", + "spring.ssl.bundle.jks.client.truststore.location=classpath:ssl/test-ca.p12", + "spring.ssl.bundle.jks.client.truststore.password=password" }) +class SampleKafkaSslApplicationTests { + + private static final File KAFKA_COMPOSE_FILE = new File("src/test/resources/docker-compose.yml"); + + private static final String KAFKA_COMPOSE_SERVICE = "kafka"; + + private static final int KAFKA_SSL_PORT = 9093; + + @Container + public DockerComposeContainer container = new DockerComposeContainer<>(KAFKA_COMPOSE_FILE) + .withExposedService(KAFKA_COMPOSE_SERVICE, KAFKA_SSL_PORT, Wait.forListeningPorts(KAFKA_SSL_PORT)); + + @Autowired + private Producer producer; + + @Autowired + private Consumer consumer; + + @Test + void testVanillaExchange() { + this.producer.send(new SampleMessage(1, "A simple test message")); + + Awaitility.waitAtMost(Duration.ofSeconds(30)).until(this.consumer::getMessages, not(empty())); + assertThat(this.consumer.getMessages()).extracting("message").containsOnly("A simple test message"); + } + +} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/docker-compose.yml b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/docker-compose.yml new file mode 100644 index 000000000000..326e5a30c030 --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/docker-compose.yml @@ -0,0 +1,30 @@ +--- +version: '2' +services: + zookeeper: + image: confluentinc/cp-zookeeper:7.4.0 + environment: + ZOOKEEPER_CLIENT_PORT: 2181 + ZOOKEEPER_TICK_TIME: 2000 + + kafka: + image: confluentinc/cp-kafka:7.4.0 + depends_on: + - zookeeper + ports: + - "9092:9092" + - "9093:9093" + environment: + KAFKA_BROKER_ID: 1 + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,SSL://localhost:9093 + KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true' + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_SSL_CLIENT_AUTH: "required" + KAFKA_SSL_KEYSTORE_FILENAME: '/certs/test-server.p12' + KAFKA_SSL_KEYSTORE_CREDENTIALS: '/certs/credentials' + KAFKA_SSL_KEY_CREDENTIALS: '/certs/credentials' + KAFKA_SSL_TRUSTSTORE_FILENAME: '/certs/test-ca.p12' + KAFKA_SSL_TRUSTSTORE_CREDENTIALS: '/certs/credentials' + volumes: + - ./ssl/:/etc/kafka/secrets/certs diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/credentials b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/credentials new file mode 100644 index 000000000000..7aa311adf93f --- /dev/null +++ b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/credentials @@ -0,0 +1 @@ +password \ No newline at end of file diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-ca.p12 b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-ca.p12 new file mode 100644 index 0000000000000000000000000000000000000000..fd0a5d99b0c0d0bccaafb69c0e7d179a2fe8c5d5 GIT binary patch literal 4173 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 VSiLX9CssRFv)7Vih5p;p{tLI(450u3 literal 0 HcmV?d00001 diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-client.p12 b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-client.p12 new file mode 100644 index 0000000000000000000000000000000000000000..d2fd1d0f3228b3634eee258a820bec23114652cc GIT binary patch literal 2653 zcmY+^c{me}9|v%o*+y989AZK&G=vnl0qg>D(oBTiT9io#Vc{@7;m?-4Ht%OMXu53#G2>(ZWdwa)u zh01Fc_=(RYUle1OEp_alB~v59BOl9(J2~6s6TH%J5X0XsRqb-YX`_}VKrfG|s2ro- zDSIK*q@t7gs4d^m&lkbuRF@HXUfF2Zik6GuQF|<#qyJ4aVpg&w8=mUI?k>O&IyoB zG;r=OELLm6aGj5Mb_+bLg6k-xH>!HdjnqtW9E9s*P59wA{fggxHEY|Zx;@pM@)+`3 ziFqq|;=}OZfCeqxSA*W$!2umZcTg+BB^lXm1f(>lX}Wj zcesk)b?x6(ksMIy)cSq*)Y36p{0WR*VHBb1;zsm4lgde>o*lm99~Rw1hbHI5-)a)2 zu|_I!%gpv@o`67jlVJ@F3UYYGkn7pJDLsS^&G<^NdCpS-8f-y_3a;j_U6Z>~Fqun< zcg@iLsV-r!wJ0)5H>qnjPCSXVR+*y$Ob*GqTG5-E`*d)f5_%j=*9Viu;a@P|4fK)f zc84C_KP`9O3uGOdr}eoj@U=M9yGx8&z-wJ^jb98q?g^Nm^;4zHg_LppxKl1`w}L~~ z+QXUy4izmw^(up1e`pA&pH|*aPrk3JErv@Ta#(Lkb0_IkrS#DwPR*KBdab!d3MhA+ z#j-AZ@_j@{N92(zBUB`1`>@0N0uDB6>-{U*lMfGMY;j?5aZRR2RK2d#oTn76ZT$OSLBVted_*p=LW^PPUyG~m-hhvF zk$%+Mz6^SmvgcwQwBu3yn#`b4=H9~n&y5~8oPS^$)SMqJ^ZGqv(t4S|RGM-M- zpPePoLRK`=V`<(mW{>I_mQ}@FsmsFT39WH7A%eAb1+ocvP7Z+!Eo!L0+W^ju6~5DY z;oLCRZ|&2?2O7!iL~FA%Gdh~dJ}*@NT4|Hc%L?BHQIAgau~{25M}=0aCww{=l*^s! zU^fj+>^FTdIv9yLrlip;kitE! ziJ3kd)w-%?-fFI*;$qn8ig-d`fW~jnYAajK4?lPmcWi_bFTF#;6#i6lIQ6w?&lRQ8 zAVIw^@RoPbeFON1X$i~{U^1xkROQHMh8#xPPE1Ooqnq8R@5uE3Rkt8Du=Gk?e4hgM zGNSZWh;VSogbonjGNJu8XK#;3sZ4T`-6FO|!H90ez(v zXUM$*pOFhH`bN~SnkmGpvy#>GUwe4|rXD@sBt;3!%g{(xBv%>0hx`caIF*~divccboCpYuNcH* z5LQdC$)T)s15b{;I_qwklUNN8WW~y_AA_}#km>UaFF64&B4FajmZTqU`=^F-4^kAW zc-+wO_SeF1Qde?G&yqBx)guIH2YnWN%IjS*firJ2iyhkdG241PNk&t5 z;)COMx_r08A1%k~zUNo9f(XIn3x@Q56v1mVH0?5!yc`EDH?rdCKN2Y1ysoXp4tnRO z51HSJH!kG%T9YhTjZ9SUSMQR!edQ2YFU|fD+EJ7Q{i<5v$J^(E#)C-XwzqDVr6Bh9 zW~QmNFD}gcicliDco3=ICIq%cn0I;2mU|<;DP-{$ySE@>N8(UBPCovz%Gq9HqfvEE zrRa3zWYH!^FTuU&`>K{W%OIR@^Q*g_qiB^ySebe^kKH;cd2cQu#1F6ow{xix;-QqlYPT)%_Em%~KEhRNiuobz|?+MQwG+%VlQ^PTo(oML(#{i>75AFBYsbp9pXP_nklPr}6K+nOii-Y!0Gi^G`u!F;s0 z?$e%OeW2us#62|%FPvmIp&4S_CftwjC;N3&Q3w93qoAaY6iA{ZX}|EA2+17!u8T4d z_tkY(b~Xd0gF>JL!2*Xw`GIf&K9Iy(*;@iu>yyIjI2f||oba`7vwRQ)J;l0uFMB8E I=-*2I3xO8h1poj5 literal 0 HcmV?d00001 diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-server.p12 b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-kafka/src/test/resources/ssl/test-server.p12 new file mode 100644 index 0000000000000000000000000000000000000000..5f1bd89eccfcc136a696775401e5bb754ba015e7 GIT binary patch literal 2653 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