From 50260e1f57b59dbdf29cf731b25f04350ee05316 Mon Sep 17 00:00:00 2001 From: SHASHIKANTH THAMBRAHALLI Date: Tue, 1 Nov 2022 05:52:25 +0530 Subject: [PATCH] Fix JMS test build issue (#340) * Fix JMS test build issue * Remove ciphername where not required --- Makefile | 2 +- test/docker/devconfig_test.go | 14 +++-- test/docker/devconfig_test_util.go | 59 +++++++++++++++++-- test/messaging/Dockerfile | 8 +-- .../com/ibm/mqcontainer/test/JMSTests.java | 5 +- 5 files changed, 72 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 96211dd..c8bd0a2 100644 --- a/Makefile +++ b/Makefile @@ -304,7 +304,7 @@ build-devjmstest: test-devserver: test/docker/vendor $(info $(SPACER)$(shell printf $(TITLE)"Test $(MQ_IMAGE_DEVSERVER):$(MQ_TAG) on $(shell $(COMMAND) --version)"$(END))) $(COMMAND) inspect $(MQ_IMAGE_DEVSERVER):$(MQ_TAG) - cd test/docker && TEST_IMAGE=$(MQ_IMAGE_DEVSERVER):$(MQ_TAG) EXPECTED_LICENSE=Developer DEV_JMS_IMAGE=$(DEV_JMS_IMAGE) IBMJRE=true DOCKER_API_VERSION=$(DOCKER_API_VERSION) go test -parallel $(NUM_CPU) -timeout $(TEST_TIMEOUT_DOCKER) -tags mqdev $(TEST_OPTS_DOCKER) + cd test/docker && TEST_IMAGE=$(MQ_IMAGE_DEVSERVER):$(MQ_TAG) EXPECTED_LICENSE=Developer DEV_JMS_IMAGE=$(DEV_JMS_IMAGE) IBMJRE=false DOCKER_API_VERSION=$(DOCKER_API_VERSION) go test -parallel $(NUM_CPU) -timeout $(TEST_TIMEOUT_DOCKER) -tags mqdev $(TEST_OPTS_DOCKER) .PHONY: coverage coverage: diff --git a/test/docker/devconfig_test.go b/test/docker/devconfig_test.go index 4cf827c..aeb30ad 100644 --- a/test/docker/devconfig_test.go +++ b/test/docker/devconfig_test.go @@ -52,8 +52,10 @@ func TestDevGoldenPath(t *testing.T) { waitForReady(t, cli, id) waitForWebReady(t, cli, id, insecureTLSConfig) t.Run("JMS", func(t *testing.T) { - // Run the JMS tests, with no password specified - runJMSTests(t, cli, id, false, "app", defaultAppPasswordOS) + // Run the JMS tests, with no password specified. + // Use OpenJDK JRE for running testing, pass false for 7th parameter. + // Last parameter is blank as the test doesn't use TLS. + runJMSTests(t, cli, id, false, "app", defaultAppPasswordOS, "false", "") }) t.Run("REST admin", func(t *testing.T) { testRESTAdmin(t, cli, id, insecureTLSConfig) @@ -116,7 +118,9 @@ func TestDevSecure(t *testing.T) { waitForWebReady(t, cli, ctr.ID, createTLSConfig(t, cert, tlsPassPhrase)) t.Run("JMS", func(t *testing.T) { - runJMSTests(t, cli, ctr.ID, true, "app", appPassword) + // OpenJDK is used for running tests, hence pass "false" for 7th parameter. + // Cipher name specified is compliant with non-IBM JRE naming. + runJMSTests(t, cli, ctr.ID, true, "app", appPassword, "false", "TLS_RSA_WITH_AES_256_CBC_SHA256") }) t.Run("REST admin", func(t *testing.T) { testRESTAdmin(t, cli, ctr.ID, insecureTLSConfig) @@ -154,7 +158,9 @@ func TestDevWebDisabled(t *testing.T) { }) t.Run("JMS", func(t *testing.T) { // Run the JMS tests, with no password specified - runJMSTests(t, cli, id, false, "app", defaultAppPasswordOS) + // OpenJDK is used for running tests, hence pass "false" for 7th parameter. + // Last parameter is blank as the test doesn't use TLS. + runJMSTests(t, cli, id, false, "app", defaultAppPasswordOS, "false", "") }) // Stop the container cleanly stopContainer(t, cli, id) diff --git a/test/docker/devconfig_test_util.go b/test/docker/devconfig_test_util.go index 45d5a61..ccb8720 100644 --- a/test/docker/devconfig_test_util.go +++ b/test/docker/devconfig_test_util.go @@ -1,7 +1,8 @@ +//go:build mqdev // +build mqdev /* -© Copyright IBM Corporation 2018, 2021 +© Copyright IBM Corporation 2018, 2022 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,6 +19,7 @@ limitations under the License. package main import ( + "bufio" "bytes" "context" "crypto/tls" @@ -26,8 +28,8 @@ import ( "io/ioutil" "net/http" "net/http/httputil" - "os" "path/filepath" + "strconv" "strings" "testing" "time" @@ -81,14 +83,14 @@ func tlsDir(t *testing.T, unixPath bool) string { } // runJMSTests runs a container with a JMS client, which connects to the queue manager container with the specified ID -func runJMSTests(t *testing.T, cli *client.Client, ID string, tls bool, user, password string) { +func runJMSTests(t *testing.T, cli *client.Client, ID string, tls bool, user, password string, ibmjre string, cipherName string) { containerConfig := container.Config{ // -e MQ_PORT_1414_TCP_ADDR=9.145.14.173 -e MQ_USERNAME=app -e MQ_PASSWORD=passw0rd -e MQ_CHANNEL=DEV.APP.SVRCONN -e MQ_TLS_TRUSTSTORE=/tls/test.p12 -e MQ_TLS_PASSPHRASE=passw0rd -v /Users/arthurbarr/go/src/github.com/ibm-messaging/mq-container/test/tls:/tls msgtest Env: []string{ "MQ_PORT_1414_TCP_ADDR=" + getIPAddress(t, cli, ID), "MQ_USERNAME=" + user, "MQ_CHANNEL=DEV.APP.SVRCONN", - "IBMJRE=" + os.Getenv("IBMJRE"), + "IBMJRE=" + ibmjre, }, Image: imageNameDevJMS(), } @@ -101,6 +103,7 @@ func runJMSTests(t *testing.T, cli *client.Client, ID string, tls bool, user, pa containerConfig.Env = append(containerConfig.Env, []string{ "MQ_TLS_TRUSTSTORE=/var/tls/client-trust.jks", "MQ_TLS_PASSPHRASE=passw0rd", + "MQ_TLS_CIPHER=" + cipherName, }...) } hostConfig := container.HostConfig{ @@ -119,9 +122,57 @@ func runJMSTests(t *testing.T, cli *client.Client, ID string, tls bool, user, pa if rc != 0 { t.Errorf("JUnit container failed with rc=%v", rc) } + + // Get console output of the container and process the lines + // to see if we have any failures + scanner := bufio.NewScanner(strings.NewReader(inspectLogs(t, cli, ctr.ID))) + for scanner.Scan() { + s := scanner.Text() + if processJunitLogLine(s) { + t.Errorf("JUnit container tests failed. Reason: %s", s) + } + } + defer cleanContainer(t, cli, ctr.ID) } +// Parse JUnit log line and return true if line contains failed or aborted tests +func processJunitLogLine(outputLine string) bool { + var failedLine bool + // Sample JUnit test run output + //[ 2 containers found ] + //[ 0 containers skipped ] + //[ 2 containers started ] + //[ 0 containers aborted ] + //[ 2 containers successful ] + //[ 0 containers failed ] + //[ 0 tests found ] + //[ 0 tests skipped ] + //[ 0 tests started ] + //[ 0 tests aborted ] + //[ 0 tests successful ] + //[ 0 tests failed ] + + // Consider only those lines that begin with '[' and with ']' + if strings.HasPrefix(outputLine, "[") && strings.HasSuffix(outputLine, "]") { + // Strip off [] and whitespaces + trimmed := strings.Trim(outputLine, "[] ") + if strings.Contains(trimmed, "aborted") || strings.Contains(trimmed, "failed") { + // Tokenize on whitespace + tokens := strings.Split(trimmed, " ") + // Determine the count of aborted or failed tests + count, err := strconv.Atoi(tokens[0]) + if err == nil { + if count > 0 { + failedLine = true + } + } + } + } + + return failedLine +} + // createTLSConfig creates a tls.Config which trusts the specified certificate func createTLSConfig(t *testing.T, certFile, password string) *tls.Config { // Get the SystemCertPool, continue with an empty pool on error diff --git a/test/messaging/Dockerfile b/test/messaging/Dockerfile index 21bb612..c03da28 100644 --- a/test/messaging/Dockerfile +++ b/test/messaging/Dockerfile @@ -16,16 +16,16 @@ # Application build environment (Maven) ############################################################################### FROM registry.access.redhat.com/ubi8/openjdk-8 as builder -COPY pom.xml . +COPY pom.xml ./ #WORKDIR /usr/src/mymaven # Download dependencies separately, so Docker caches them RUN mvn dependency:go-offline install # Copy source -COPY src . +COPY src ./src # Run the main build RUN mvn --offline install # Print a list of all the files (useful for debugging) -RUN find . +RUN find ./ ############################################################################### # Application runtime (JRE only, no build environment) @@ -35,4 +35,4 @@ FROM registry.access.redhat.com/ubi8/openjdk-8-runtime COPY --from=builder /home/jboss/target/*.jar /opt/app/ COPY --from=builder /home/jboss/target/lib/*.jar /opt/app/ USER 1001 -ENTRYPOINT ["java", "-classpath", "/opt/app/*", "org.junit.platform.console.ConsoleLauncher", "-p", "com.ibm.mqcontainer.test", "--details", "verbose"] +ENTRYPOINT ["java", "-classpath", "/opt/app/*", "org.junit.platform.console.ConsoleLauncher", "--fail-if-no-tests", "-p", "com.ibm.mqcontainer.test", "--details", "verbose"] diff --git a/test/messaging/src/main/java/com/ibm/mqcontainer/test/JMSTests.java b/test/messaging/src/main/java/com/ibm/mqcontainer/test/JMSTests.java index 903ff39..24a2001 100644 --- a/test/messaging/src/main/java/com/ibm/mqcontainer/test/JMSTests.java +++ b/test/messaging/src/main/java/com/ibm/mqcontainer/test/JMSTests.java @@ -1,5 +1,5 @@ /* -© Copyright IBM Corporation 2018, 2021 +© Copyright IBM Corporation 2018, 2022 Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -82,11 +82,10 @@ class JMSTests { boolean ibmjre = System.getenv("IBMJRE").equals("true"); if (ibmjre){ System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "true"); - factory.setSSLCipherSuite("SSL_RSA_WITH_AES_128_CBC_SHA256"); } else { System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false"); - factory.setSSLCipherSuite("TLS_RSA_WITH_AES_128_CBC_SHA256"); } + factory.setSSLCipherSuite(System.getenv("MQ_TLS_CIPHER")); } return factory; }