diff --git a/.dockerignore b/.dockerignore index 0922a42..6b91788 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,6 @@ * !build/*-runner +!build/**/*-runner !build/*-runner.jar !build/lib/* !build/quarkus-app/* diff --git a/.editorconfig b/.editorconfig index eff1274..f458c8c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,7 @@ root = true insert_final_newline = true [{*.kt,*.kts}] -ident_size = 4 +indent_size = 4 max_line_length = 80 ktlint_code_style = ktlint_official ktlint_experimental = enabled diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d5ecc42..568767c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,45 +2,133 @@ name: CI Build on: push: - branches: [ main ] + branches: + - main + - alpha + - beta jobs: - build: - name: Build + prepare: + timeout-minutes: 5 runs-on: ubuntu-latest - timeout-minutes: 15 - permissions: - contents: write + outputs: + VERSION: ${{ steps.version.outputs.VERSION }} + DOCKER_TAG: ${{ steps.version.outputs.DOCKER_TAG }} steps: - name: Code Checkout - uses: actions/checkout@v4 - - - name: Setup Java - uses: actions/setup-java@v4 - with: - distribution: 'adopt' - java-version: '21' + uses: actions/checkout@v6 - - name: Get Gradle Version + - name: Get release attributes + id: version run: | - echo "TAGS=latest" >> $GITHUB_ENV SUFFIX="" - VERSION=$(grep 'version =' build.gradle.kts | cut -f 2 -d '"')$SUFFIX - echo "VERSION=$VERSION" >> $GITHUB_ENV - REPO=$(echo $GITHUB_REPOSITORY | cut -f 2 -d "/") - echo "REPO=$REPO" >> $GITHUB_ENV - echo "OWNER=$GITHUB_REPOSITORY_OWNER" >> $GITHUB_ENV + DOCKER_TAG=$GITHUB_REF_NAME + case $GITHUB_REF_NAME in + main) DOCKER_TAG="latest";; + alpha) SUFFIX="A";; + beta) SUFFIX="B";; + esac + echo "DOCKER_TAG=$DOCKER_TAG" >> $GITHUB_OUTPUT + VERSION=$(grep 'version = ' build.gradle.kts | cut -f 2 -d "\"")$SUFFIX + echo "VERSION=$VERSION" >> $GITHUB_OUTPUT - name: Check if version is used run: | - URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/${{ env.VERSION }} - echo "$URL" - CODE=$(curl -s -o /dev/null -w "%{http_code}" "$URL") + URL=$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/${{ steps.version.outputs.VERSION }} + CODE=$(curl -s -H "Authorization: Bearer ${{ github.token }}" -o /dev/null -w "%{http_code}" "$URL") if [ "$CODE" != 404 ]; then - echo "Release '$VERSION' already exists. ($CODE)" + echo "Release '${{ steps.version.outputs.VERSION }}' already exists. ($CODE)" exit 1 fi + - name: Setup ktlint + run: | + curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.8.0/ktlint + chmod a+x ktlint + sudo mv ktlint /usr/local/bin/ + + - name: Run linter + run: ktlint + + - name: Setup Java + uses: actions/setup-java@v5 + with: + distribution: 'adopt' + java-version: '21' + + - name: Generating self-signed certificate + run: | + openssl req \ + -newkey rsa:2048 \ + -new \ + -nodes \ + -x509 \ + -days 2 \ + -keyout key.pem \ + -out cert.pem \ + -subj "/CN=localhost" + + - name: Tests + run: ./gradlew test + + - name: Upload Jacoco Report + uses: actions/upload-artifact@v7 + with: + name: jacoco-report + path: build/jacoco-report + if-no-files-found: error + retention-days: 1 + + build-native: + needs: prepare + timeout-minutes: 10 + strategy: + matrix: + include: + - os: ubuntu-latest + arch: amd64 + - os: ubuntu-24.04-arm + arch: arm64 + runs-on: ${{ matrix.os }} + steps: + - name: Code Checkout + uses: actions/checkout@v6 + + - name: Setup GraalVM + uses: graalvm/setup-graalvm@v1 + with: + java-version: '21' + distribution: 'graalvm-community' + github-token: ${{ secrets.GITHUB_TOKEN }} + cache: 'gradle' + + - name: Build Native Executable + run: | + ./gradlew build -Dquarkus.package.jar.enabled=false \ + -Dquarkus.native.enabled=true \ + -Dquarkus.native.compression.level=5 \ + -x test + + - name: Upload Native Binary + uses: actions/upload-artifact@v7 + with: + name: native-executable-${{ matrix.arch }} + path: build/*-runner + if-no-files-found: error + retention-days: 1 + + publish: + needs: + - prepare + - build-native + timeout-minutes: 5 + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Code checkout + uses: actions/checkout@v6 + - name: Generating self-signed certificate run: | openssl req \ @@ -53,31 +141,58 @@ jobs: -out cert.pem \ -subj "/C=US/ST=SC/L=Hometown/O=IT/emailAddress=root@localhost/CN=localhost" - - name: Test & Build - run: | - ./gradlew build --no-daemon \ - -Dquarkus.package.type=native \ - -Dquarkus.native.container-build=true \ - -Dquarkus.container-image.build=true \ - -Dquarkus.container-image.push=true \ - -Dquarkus.container-image.username=${{ env.OWNER }} \ - -Dquarkus.container-image.password=${{ secrets.DOCKER_TOKEN }} \ - -Dquarkus.container-image.group=${{ env.OWNER }} \ - -Dquarkus.container-image.name=${{ env.REPO }} \ - -Dquarkus.container-image.tag=${{ env.VERSION }} \ - -Dquarkus.container-image.additional-tags=${{ env.TAGS }} + - name: Download Jacoco Report + uses: actions/download-artifact@v8 + with: + name: jacoco-report + path: build/jacoco-report + + - name: Download AMD64 Binary + uses: actions/download-artifact@v8 + with: + name: native-executable-amd64 + path: build/amd64 + + - name: Download ARM64 Binary + uses: actions/download-artifact@v8 + with: + name: native-executable-arm64 + path: build/arm64 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Registry + uses: docker/login-action@v3 + with: + username: ${{ github.repository_owner }} + password: ${{ secrets.DOCKER_TOKEN }} + + - name: Docker Build & Push + uses: docker/build-push-action@v6 + with: + push: true + context: . + file: src/main/docker/Dockerfile.native-multi-arch + platforms: linux/amd64,linux/arm64 + tags: | + ${{ github.repository }}:${{ needs.prepare.outputs.VERSION }} + ${{ github.repository }}:${{ needs.prepare.outputs.DOCKER_TAG }} - name: Creating GitHub Tag uses: mathieudutour/github-tag-action@v6.2 with: - custom_tag: ${{ env.VERSION }} + custom_tag: ${{ needs.prepare.outputs.VERSION }} tag_prefix: '' github_token: ${{ secrets.GITHUB_TOKEN }} - name: Create GitHub Release uses: ncipollo/release-action@v1 with: - tag: ${{ env.VERSION }} + tag: ${{ needs.prepare.outputs.VERSION }} token: ${{ secrets.GITHUB_TOKEN }} - name: Overwrite Coverage Theme diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2be47e1..63b2e20 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,14 +9,19 @@ jobs: timeout-minutes: 20 steps: - name: Code Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'adopt' java-version: '21' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 + with: + cache-read-only: false + - name: Generating self-signed certificate run: | openssl req \ @@ -30,4 +35,4 @@ jobs: -subj "/CN=localhost" - name: Tests - run: ./gradlew test --no-daemon + run: ./gradlew test diff --git a/.gitignore b/.gitignore index d276e03..7cc3ff1 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ nb-configuration.xml # Certificates *.pem + +ktlint diff --git a/build-image.sh b/build-image.sh index f37a236..a856599 100755 --- a/build-image.sh +++ b/build-image.sh @@ -8,10 +8,15 @@ if [ ! -f "build/httpbucket-$VERSION-runner" ] then ./gradlew clean - ./gradlew build -Dquarkus.package.type=native \ - -Dquarkus.native.container-build=true + ./gradlew build -Dquarkus.package.jar.enabled=false \ + -Dquarkus.native.enabled=true \ + -Dquarkus.native.compression.level=5 fi docker build . -f src/main/docker/Dockerfile.native-micro \ -t "httpbucket-local:$VERSION" \ -t "httpbucket-local:latest" + +docker run --rm --name httpbucket \ + -p 8080:8080 -p 8443:8443 \ + "httpbucket-local:$VERSION" diff --git a/build.gradle.kts b/build.gradle.kts index 25c42ab..eeedf26 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - kotlin("jvm") version "2.1.21" - kotlin("plugin.allopen") version "2.1.21" + kotlin("jvm") version "2.3.10" + kotlin("plugin.allopen") version "2.3.10" id("io.quarkus") } @@ -25,7 +25,6 @@ dependencies { implementation("io.quarkus:quarkus-smallrye-health") implementation("io.quarkus:quarkus-rest") implementation("io.quarkus:quarkus-rest-jackson") - implementation("io.quarkus:quarkus-container-image-docker") implementation("io.quarkus:quarkus-info") implementation("io.quarkus:quarkus-kotlin") implementation("io.quarkus:quarkus-arc") @@ -37,7 +36,7 @@ dependencies { } group = "com.testainers" -version = "0.2.0" +version = "0.3.5" java { sourceCompatibility = JavaVersion.VERSION_21 @@ -45,11 +44,6 @@ java { } tasks.withType { - systemProperty( - "java.util.logging.manager", - "org.jboss.logmanager.LogManager", - ) - testLogging { events( "PASSED", diff --git a/coverage.sh b/coverage.sh index 9540964..8136b01 100755 --- a/coverage.sh +++ b/coverage.sh @@ -6,4 +6,4 @@ set -e /bin/cp -rf helpers/jacoco-report/* build/jacoco-report/. -# /opt/google/chrome/google-chrome build/coverage/index.html +# /opt/google/chrome/google-chrome "file://$(pwd)/build/jacoco-report/index.html" diff --git a/gradle.properties b/gradle.properties index 4509cfa..3a2f18c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,11 @@ -#Gradle properties +# Gradle properties + quarkusPluginId=io.quarkus -quarkusPluginVersion=3.23.4 +quarkusPluginVersion=3.32.1 quarkusPlatformGroupId=io.quarkus.platform quarkusPlatformArtifactId=quarkus-bom -quarkusPlatformVersion=3.23.4 +quarkusPlatformVersion=3.32.1 + +org.gradle.jvmargs=-Xmx3g -XX:+UseParallelGC +org.gradle.configuration-cache=true +org.gradle.configuration-cache.parallel=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c05..c1962a7 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19cfad9..17c9e60 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,8 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionSha256Sum=17f277867f6914d61b1aa02efab1ba7bb439ad652ca485cd8ca6842fccec6e43 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-all.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm index 14fed84..7d6f1de 100644 --- a/src/main/docker/Dockerfile.jvm +++ b/src/main/docker/Dockerfile.jvm @@ -77,7 +77,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi8/openjdk-21:1.21 +FROM registry.access.redhat.com/ubi9/openjdk-21:1.24 ENV LANGUAGE='en_US:en' @@ -88,9 +88,7 @@ COPY --chown=185 build/quarkus-app/app/ /deployments/app/ COPY --chown=185 build/quarkus-app/quarkus/ /deployments/quarkus/ EXPOSE 8080 - USER 185 - ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" diff --git a/src/main/docker/Dockerfile.legacy-jar b/src/main/docker/Dockerfile.legacy-jar index 4a2fd38..546b3e8 100644 --- a/src/main/docker/Dockerfile.legacy-jar +++ b/src/main/docker/Dockerfile.legacy-jar @@ -77,7 +77,7 @@ # accessed directly. (example: "foo.example.com,bar.example.com") # ### -FROM registry.access.redhat.com/ubi8/openjdk-21:1.21 +FROM registry.access.redhat.com/ubi9/openjdk-21:1.24 ENV LANGUAGE='en_US:en' @@ -85,9 +85,7 @@ COPY build/lib/* /deployments/lib/ COPY build/*-runner.jar /deployments/quarkus-run.jar EXPOSE 8080 - USER 185 - ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" diff --git a/src/main/docker/Dockerfile.native b/src/main/docker/Dockerfile.native index 0454814..ff85878 100644 --- a/src/main/docker/Dockerfile.native +++ b/src/main/docker/Dockerfile.native @@ -13,19 +13,17 @@ # # docker run -i --rm -p 8080:8080 quarkus/httpbucket # +# The ` registry.access.redhat.com/ubi9/ubi-minimal:9.7` base image is based on UBI 9. +# To use UBI 8, switch to `quay.io/ubi8/ubi-minimal:8.10`. ### -FROM registry.access.redhat.com/ubi9/ubi-minimal:9.5 - +FROM registry.access.redhat.com/ubi9/ubi-minimal:9.7 WORKDIR /work/ - RUN chown 1001 /work \ && chmod "g+rwX" /work \ && chown 1001:root /work - -COPY --chown=1001:root --chmod=0755 build/*-runner /work/application +COPY --chown=1001:root --chmod=0755 build/*-runner /work/httpbucket EXPOSE 8080 - USER 1001 -ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] +ENTRYPOINT ["./httpbucket", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/docker/Dockerfile.native-micro b/src/main/docker/Dockerfile.native-micro index dbec105..c2618f1 100644 --- a/src/main/docker/Dockerfile.native-micro +++ b/src/main/docker/Dockerfile.native-micro @@ -16,11 +16,11 @@ # # docker run -i --rm -p 8080:8080 quarkus/httpbucket # +# The `quay.io/quarkus/ubi9-quarkus-micro-image:2.0` base image is based on UBI 9. +# To use UBI 8, switch to `quay.io/quarkus/quarkus-micro-image:2.0`. ### -FROM quay.io/quarkus/quarkus-micro-image:2.0 - +FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0 WORKDIR /work/ - RUN chown 1001 /work \ && chmod "g+rwX" /work \ && chown 1001:root /work @@ -31,13 +31,12 @@ ADD --chown=1001:root \ RUN chmod +x /usr/bin/check -COPY --chown=1001:root --chmod=0755 build/*-runner /work/application +COPY --chown=1001:root --chmod=0755 build/*-runner /work/httpbucket COPY --chown=1001:root cert.pem /work/cert.pem COPY --chown=1001:root key.pem /work/key.pem EXPOSE 8080 EXPOSE 8443 - USER 1001 -ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"] +ENTRYPOINT ["./httpbucket", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/docker/Dockerfile.native-multi-arch b/src/main/docker/Dockerfile.native-multi-arch new file mode 100644 index 0000000..8173d50 --- /dev/null +++ b/src/main/docker/Dockerfile.native-multi-arch @@ -0,0 +1,19 @@ +FROM quay.io/quarkus/ubi9-quarkus-micro-image:2.0 + +ARG TARGETARCH + +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work + +COPY --chown=1001:root build/${TARGETARCH}/*-runner /work/httpbucket +RUN chmod +x /work/httpbucket +COPY --chown=1001:root cert.pem /work/cert.pem +COPY --chown=1001:root key.pem /work/key.pem + +EXPOSE 8080 +EXPOSE 8443 +USER 1001 + +ENTRYPOINT ["./httpbucket", "-Dquarkus.http.host=0.0.0.0"] diff --git a/src/main/kotlin/com/testainers/BasicAuthResource.kt b/src/main/kotlin/com/testainers/BasicAuthResource.kt index dcf06f2..adc7851 100644 --- a/src/main/kotlin/com/testainers/BasicAuthResource.kt +++ b/src/main/kotlin/com/testainers/BasicAuthResource.kt @@ -3,7 +3,10 @@ package com.testainers import io.quarkus.security.Authenticated import io.vertx.core.http.HttpServerRequest import jakarta.ws.rs.* -import jakarta.ws.rs.core.* +import jakarta.ws.rs.core.HttpHeaders +import jakarta.ws.rs.core.MediaType +import jakarta.ws.rs.core.Response +import jakarta.ws.rs.core.UriInfo import org.eclipse.microprofile.openapi.annotations.responses.APIResponse import org.eclipse.microprofile.openapi.annotations.responses.APIResponses import org.jboss.resteasy.reactive.RestHeader @@ -87,7 +90,7 @@ class BasicAuthResource( bodyMap["message"] = "Forbidden." bodyMap["body"] = body - if (auth.isNullOrBlank()) { + if (auth == null) { code = 401 bodyMap["message"] = "Authorization header not present." } else { diff --git a/src/main/kotlin/com/testainers/LengthResource.kt b/src/main/kotlin/com/testainers/LengthResource.kt index 5387506..f914860 100644 --- a/src/main/kotlin/com/testainers/LengthResource.kt +++ b/src/main/kotlin/com/testainers/LengthResource.kt @@ -1,7 +1,10 @@ package com.testainers +import io.quarkus.vertx.http.Uncompressed import jakarta.ws.rs.* -import jakarta.ws.rs.core.* +import jakarta.ws.rs.core.HttpHeaders +import jakarta.ws.rs.core.MediaType +import jakarta.ws.rs.core.Response import org.eclipse.microprofile.openapi.annotations.media.Content import org.eclipse.microprofile.openapi.annotations.media.Schema import org.eclipse.microprofile.openapi.annotations.parameters.Parameter @@ -26,6 +29,7 @@ import org.jboss.resteasy.reactive.RestHeader APIResponse(responseCode = "500", description = "Invalid size: X."), ) class LengthResource { + @Uncompressed @GET fun get( @RestHeader(HttpHeaders.ACCEPT) accept: String, @@ -40,6 +44,7 @@ class LengthResource { ) size: Int, ): Response = internal(accept, size) + @Uncompressed @POST fun post( @RestHeader(HttpHeaders.ACCEPT) accept: String, @@ -54,6 +59,7 @@ class LengthResource { ) size: Int, ): Response = internal(accept, size) + @Uncompressed @PUT fun put( @RestHeader(HttpHeaders.ACCEPT) accept: String, @@ -68,6 +74,7 @@ class LengthResource { ) size: Int, ): Response = internal(accept, size) + @Uncompressed @PATCH fun patch( @RestHeader(HttpHeaders.ACCEPT) accept: String, @@ -82,6 +89,7 @@ class LengthResource { ) size: Int, ): Response = internal(accept, size) + @Uncompressed @DELETE fun delete( @RestHeader(HttpHeaders.ACCEPT) accept: String, @@ -100,7 +108,7 @@ class LengthResource { accept: String, size: Int, ): Response = - if (size < 1 || size > 2048) { + if (size !in 1..2048) { Response .status(500) .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN) diff --git a/src/main/kotlin/com/testainers/RedirectResource.kt b/src/main/kotlin/com/testainers/RedirectResource.kt index 125b1ef..87e3a6c 100644 --- a/src/main/kotlin/com/testainers/RedirectResource.kt +++ b/src/main/kotlin/com/testainers/RedirectResource.kt @@ -1,7 +1,9 @@ package com.testainers import jakarta.ws.rs.* -import jakarta.ws.rs.core.* +import jakarta.ws.rs.core.HttpHeaders +import jakarta.ws.rs.core.MediaType +import jakarta.ws.rs.core.Response import org.eclipse.microprofile.openapi.annotations.media.Schema import org.eclipse.microprofile.openapi.annotations.parameters.Parameter import org.eclipse.microprofile.openapi.annotations.responses.APIResponse @@ -126,7 +128,7 @@ class RedirectResource { .build() } - if (code < 300 || code > 399) { + if (code !in 300..399) { return Response .status(500) .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN) diff --git a/src/main/kotlin/com/testainers/StatusResource.kt b/src/main/kotlin/com/testainers/StatusResource.kt index 1986429..7369461 100644 --- a/src/main/kotlin/com/testainers/StatusResource.kt +++ b/src/main/kotlin/com/testainers/StatusResource.kt @@ -2,7 +2,9 @@ package com.testainers import io.vertx.core.http.HttpServerRequest import jakarta.ws.rs.* -import jakarta.ws.rs.core.* +import jakarta.ws.rs.core.MediaType +import jakarta.ws.rs.core.Response +import jakarta.ws.rs.core.UriInfo import org.eclipse.microprofile.openapi.annotations.media.Schema import org.eclipse.microprofile.openapi.annotations.parameters.Parameter @@ -86,7 +88,7 @@ class StatusResource( var status = code val responseBody = ResponseBody(request, uriInfo, body) - if (status < 200 || status > 599) { + if (status !in 200..599) { val message = if (status in 100..199) { "Informational responses are not supported: %d" diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a84bb57..393338d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,21 +1,18 @@ # suppress inspection "UnusedProperty" for whole file # +%prod.smallrye.config.source.file.locations=/run/secrets +# +quarkus.default-locale=en-US +quarkus.locales=en-US quarkus.analytics.disabled=true quarkus.banner.enabled=false quarkus.application.name=httpbucket quarkus.ssl.native=true -# -quarkus.docker.dockerfile-native-path=src/main/docker/Dockerfile.native-micro -# -%prod.smallrye.config.source.file.locations=/run/secrets +%dev.quarkus.http.host=0.0.0.0 # quarkus.http.ssl.certificate.files=${httpbucket.ssl.cert:cert.pem} quarkus.http.ssl.certificate.key-files=${httpbucket.ssl.key:key.pem} # -quarkus.http.cors=true -quarkus.http.cors.origins=* -quarkus.http.cors.access-control-max-age=24H -# quarkus.info.path=/info # quarkus.smallrye-health.root-path=/health @@ -30,8 +27,15 @@ quarkus.swagger-ui.always-include=true quarkus.swagger-ui.path=/swagger-ui quarkus.swagger-ui.theme=flattop quarkus.swagger-ui.title=httpbucket -quarkus.swagger-ui.footer=© 2025 - Testainers +quarkus.swagger-ui.footer=© 2026 - Testainers # %test.quarkus.jacoco.footer=httpbucket %test.quarkus.jacoco.title=httpbucket %test.quarkus.jacoco.excludes=**/SimpleHealthCheck.class +# +quarkus.http.cors.enabled=true +quarkus.http.cors.origins=* +quarkus.http.cors.access-control-max-age=24H +# +quarkus.http.enable-compression=true +quarkus.http.enable-decompression=true diff --git a/src/test/kotlin/com/testainers/BaseResourceTest.kt b/src/test/kotlin/com/testainers/BaseResourceTest.kt index 637a019..e6f16f2 100644 --- a/src/test/kotlin/com/testainers/BaseResourceTest.kt +++ b/src/test/kotlin/com/testainers/BaseResourceTest.kt @@ -1,7 +1,9 @@ package com.testainers import io.restassured.RestAssured -import io.restassured.config.* +import io.restassured.config.LogConfig +import io.restassured.config.RedirectConfig +import io.restassured.config.RestAssuredConfig import io.restassured.http.ContentType import io.restassured.http.Method import io.restassured.specification.RequestSpecification @@ -40,7 +42,7 @@ abstract class BaseResourceTest { val result = mutableListOf() methods.forEach { method -> - if(method !in remove) { + if (method !in remove) { list.forEach { status -> result.add(Arguments.of(method, status)) } diff --git a/src/test/kotlin/com/testainers/BasicAuthResourceTest.kt b/src/test/kotlin/com/testainers/BasicAuthResourceTest.kt index c7fe1d4..2beaf8a 100644 --- a/src/test/kotlin/com/testainers/BasicAuthResourceTest.kt +++ b/src/test/kotlin/com/testainers/BasicAuthResourceTest.kt @@ -2,8 +2,8 @@ package com.testainers import io.quarkus.test.junit.QuarkusTest import io.restassured.http.Method -import jakarta.ws.rs.core.HttpHeaders -import org.hamcrest.Matchers.* +import org.hamcrest.Matchers.equalTo +import org.hamcrest.Matchers.nullValue import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.MethodSource @@ -48,40 +48,6 @@ class BasicAuthResourceTest : BaseResourceTest() { } } - @ParameterizedTest - @MethodSource("onlyMethods") - fun emptyHeader(method: Method) { - json(method) - .header(HttpHeaders.AUTHORIZATION, "") - .request(method, "/basic-auth/$user/$pass") - .then() - .statusCode(401) - .apply { - if (method != Method.HEAD) { - body( - "body.body", - if (method == Method.GET) { - nullValue() - } else { - equalTo(body) - }, - *bodyMatchers( - method, - mapOf( - "body.auth" to equalTo(false), - "body.user" to equalTo(user), - "body.pass" to equalTo(pass), - "body.message" to - equalTo( - "Authorization header not present.", - ), - ), - ), - ) - } - } - } - @ParameterizedTest @MethodSource("onlyMethods") fun success(method: Method) {