diff --git a/.gitattributes b/.gitattributes index 0f292c3..c6d9be7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,3 +10,6 @@ server/versionsMavenPluginRules.xml linguist-gene dependencies.md linguist-generated=true doc/changes/changelog.md linguist-generated=true go-client/go.sum linguist-generated=true + +server/.settings/org.eclipse.jdt.core.prefs linguist-generated=true +server/.settings/org.eclipse.jdt.ui.prefs linguist-generated=true diff --git a/.github/workflows/broken_links_checker.yml b/.github/workflows/broken_links_checker.yml index c4ff3be..82ec1cd 100644 --- a/.github/workflows/broken_links_checker.yml +++ b/.github/workflows/broken_links_checker.yml @@ -15,16 +15,18 @@ jobs: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Configure broken links checker run: | mkdir -p ./target echo '{"aliveStatusCodes": [429, 200], "ignorePatterns": [' \ '{"pattern": "^https?://(www|dev).mysql.com/"},' \ '{"pattern": "^https?://(www.)?opensource.org"}' \ + '{"pattern": "^https?://(www.)?eclipse.org"}' \ + '{"pattern": "^https?://projects.eclipse.org"}' \ ']}' > ./target/broken_links_checker.json - uses: gaurav-nelson/github-action-markdown-link-check@v1 with: - use-quiet-mode: 'yes' - use-verbose-mode: 'yes' + use-quiet-mode: "yes" + use-verbose-mode: "yes" config-file: ./target/broken_links_checker.json diff --git a/.github/workflows/ci-build-next-java.yml b/.github/workflows/ci-build-next-java.yml index e267b27..3ef61de 100644 --- a/.github/workflows/ci-build-next-java.yml +++ b/.github/workflows/ci-build-next-java.yml @@ -14,15 +14,15 @@ jobs: cancel-in-progress: true steps: - name: Checkout the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 17 uses: actions/setup-java@v3 with: - distribution: 'temurin' + distribution: "temurin" java-version: 17 - cache: 'maven' + cache: "maven" - name: Run tests and build with Maven run: | mvn --file server/ --batch-mode --update-snapshots clean package -DtrimStackTrace=false \ diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index c0129ce..c116424 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -13,20 +13,23 @@ jobs: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true steps: + - name: Free Disk Space + run: | + sudo rm -rf /usr/local/lib/android + sudo rm -rf /usr/share/dotnet - name: Checkout the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: 'temurin' + distribution: "temurin" java-version: 11 - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19 - id: go + go-version: "1.20" - name: Cache local Maven repository uses: actions/cache@v3 with: diff --git a/.github/workflows/dependencies_check.yml b/.github/workflows/dependencies_check.yml index b091a55..368541b 100644 --- a/.github/workflows/dependencies_check.yml +++ b/.github/workflows/dependencies_check.yml @@ -9,12 +9,12 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: 'temurin' + distribution: "temurin" java-version: 11 - cache: 'maven' + cache: "maven" - name: Checking dependencies for vulnerabilities - run: mvn --batch-mode org.sonatype.ossindex.maven:ossindex-maven-plugin:audit --file server/pom.xml \ No newline at end of file + run: mvn --batch-mode org.sonatype.ossindex.maven:ossindex-maven-plugin:audit --file server/pom.xml diff --git a/.github/workflows/project-keeper-verify.yml b/.github/workflows/project-keeper-verify.yml index 5c20418..5744029 100644 --- a/.github/workflows/project-keeper-verify.yml +++ b/.github/workflows/project-keeper-verify.yml @@ -14,7 +14,7 @@ jobs: cancel-in-progress: true steps: - name: Checkout the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -25,9 +25,9 @@ jobs: java-version: 11 - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: "1.20" diff --git a/.github/workflows/project-keeper.sh b/.github/workflows/project-keeper.sh index 4911800..e75b381 100755 --- a/.github/workflows/project-keeper.sh +++ b/.github/workflows/project-keeper.sh @@ -5,7 +5,7 @@ set -o nounset set -o pipefail readonly pk_mode="${1-verify}"; -readonly version="2.9.7" +readonly version="2.9.12" readonly pk_jar="$HOME/.m2/repository/com/exasol/project-keeper-cli/$version/project-keeper-cli-$version.jar" diff --git a/.github/workflows/release_droid_prepare_original_checksum.yml b/.github/workflows/release_droid_prepare_original_checksum.yml index 50dabcc..ceba664 100644 --- a/.github/workflows/release_droid_prepare_original_checksum.yml +++ b/.github/workflows/release_droid_prepare_original_checksum.yml @@ -8,15 +8,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: 'temurin' + distribution: "temurin" java-version: 11 - cache: 'maven' + cache: "maven" - name: Enable testcontainer reuse run: echo 'testcontainers.reuse.enable=true' > "$HOME/.testcontainers.properties" - name: Run tests and build with Maven @@ -28,4 +28,4 @@ jobs: with: name: original_checksum retention-days: 5 - path: original_checksum \ No newline at end of file + path: original_checksum diff --git a/.github/workflows/release_droid_print_quick_checksum.yml b/.github/workflows/release_droid_print_quick_checksum.yml index 7c018f1..a74ce0e 100644 --- a/.github/workflows/release_droid_print_quick_checksum.yml +++ b/.github/workflows/release_droid_print_quick_checksum.yml @@ -8,17 +8,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: 'temurin' + distribution: "temurin" java-version: 11 - cache: 'maven' + cache: "maven" - name: Build with Maven skipping tests run: mvn --file server/pom.xml --batch-mode clean verify -DskipTests - name: Print checksum run: echo 'checksum_start==';find server/target -maxdepth 1 -name *.jar -exec sha256sum "{}" + | xargs;echo '==checksum_end' - diff --git a/.github/workflows/release_droid_upload_github_release_assets.yml b/.github/workflows/release_droid_upload_github_release_assets.yml index 4bf7f4e..057f3e4 100644 --- a/.github/workflows/release_droid_upload_github_release_assets.yml +++ b/.github/workflows/release_droid_upload_github_release_assets.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: inputs: upload_url: - description: 'Assets upload URL' + description: "Assets upload URL" required: true jobs: @@ -12,15 +12,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up JDK 11 uses: actions/setup-java@v3 with: - distribution: 'temurin' + distribution: "temurin" java-version: 11 - cache: 'maven' + cache: "maven" - name: Build with Maven skipping tests run: mvn --file server/pom.xml --batch-mode clean verify -DskipTests - name: Generate sha256sum files @@ -41,4 +41,4 @@ jobs: uses: shogo82148/actions-upload-release-asset@v1 with: upload_url: ${{ github.event.inputs.upload_url }} - asset_path: target/error_code_report.json \ No newline at end of file + asset_path: target/error_code_report.json diff --git a/.golangci.yaml b/.golangci.yaml index aa826b8..e3ed06c 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,3 +1,30 @@ # https://golangci-lint.run/usage/configuration/ linters: - enable-all: false \ No newline at end of file + enable-all: false + presets: + - bugs + - comment + - complexity + - error + - format + - import + - metalinter + - module + - performance + - sql + #- style + - test + - unused + disable: + - gofumpt # "gofmt" is OK for us, no need for stricter rules (https://github.com/mvdan/gofumpt) + - gci # No need to explicitly format imports using GCI (https://github.com/daixiang0/gci) + - depguard # No need to restrict imported packages (https://github.com/OpenPeeDeeP/depguard) + - goerr113 # Using static errors is not necessary (https://github.com/Djarvur/go-err113) + - wrapcheck # Wrapping errors is not necessary (https://github.com/tomarrell/wrapcheck#tldr) + - paralleltest # Running tests in parallel is not possible + + # Fix later + - revive # Many naming issues, may cause breaking changes + - testpackage # Naming of test package causes compile errors in test +run: + tests: true diff --git a/.project-keeper.yml b/.project-keeper.yml index 52c72fc..2b1e321 100644 --- a/.project-keeper.yml +++ b/.project-keeper.yml @@ -8,4 +8,4 @@ sources: path: go-client/go.mod linkReplacements: - https://javalin.io/javalin|https://javalin.io/ -version: 0.3.3 +version: 0.3.4 diff --git a/README.md b/README.md index 7db09e9..9b209ca 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,11 @@ package test import testSetupAbstraction "github.com/exasol/exasol-test-setup-abstraction-server/go-client" func myTest() { - exasol, err := testSetupAbstraction.New().CloudSetupConfigFilePath("myConfig.json").DockerDbVersion("7.1.21").Start() + exasol, err := testSetupAbstraction.New(). + CloudSetupConfigFilePath("myConfig.json"). + DockerDbVersion("7.1.23"). + StartupTimeout(time.Minute * 10). + Start() if err != nil { panic("failed to start test setup") } diff --git a/dependencies.md b/dependencies.md index cc76c71..938aaef 100644 --- a/dependencies.md +++ b/dependencies.md @@ -17,15 +17,15 @@ | [JUnit Jupiter Engine][4] | [Eclipse Public License v2.0][5] | | [JUnit Jupiter Params][4] | [Eclipse Public License v2.0][5] | | [Hamcrest][6] | [BSD License 3][7] | -| [mockito-junit-jupiter][8] | [The MIT License][9] | +| [mockito-junit-jupiter][8] | [MIT][9] | | [REST Assured][10] | [Apache 2.0][11] | | [JUnit5 System Extensions][12] | [Eclipse Public License v2.0][13] | ### Runtime Dependencies -| Dependency | License | -| ------------------------- | ----------------- | -| [SLF4J JDK14 Binding][14] | [MIT License][15] | +| Dependency | License | +| -------------------------- | ----------------- | +| [SLF4J JDK14 Provider][14] | [MIT License][15] | ### Plugin Dependencies @@ -40,7 +40,7 @@ | [Maven Surefire Plugin][24] | [Apache-2.0][19] | | [Versions Maven Plugin][25] | [Apache License, Version 2.0][19] | | [duplicate-finder-maven-plugin Maven Mojo][26] | [Apache License 2.0][11] | -| [Apache Maven Assembly Plugin][27] | [Apache License, Version 2.0][19] | +| [Apache Maven Assembly Plugin][27] | [Apache-2.0][19] | | [Apache Maven JAR Plugin][28] | [Apache License, Version 2.0][19] | | [Artifact reference checker and unifier][29] | [MIT License][30] | | [Maven Failsafe Plugin][31] | [Apache-2.0][19] | @@ -60,14 +60,14 @@ | Dependency | License | | ---------------------------------- | --------- | | github.com/exasol/exasol-driver-go | [MIT][42] | +| github.com/stretchr/testify | [MIT][43] | +| gopkg.in/yaml.v3 | [MIT][44] | ### Test Dependencies | Dependency | License | | --------------------------- | --------- | -| github.com/antchfx/xmlquery | [MIT][43] | -| github.com/stretchr/testify | [MIT][44] | -| gopkg.in/yaml.v3 | [MIT][45] | +| github.com/antchfx/xmlquery | [MIT][45] | [0]: https://github.com/exasol/exasol-test-setup-abstraction-java/ [1]: https://github.com/exasol/exasol-test-setup-abstraction-java/blob/main/LICENSE @@ -95,7 +95,7 @@ [23]: https://sonatype.github.io/ossindex-maven/maven-plugin/ [24]: https://maven.apache.org/surefire/maven-surefire-plugin/ [25]: https://www.mojohaus.org/versions/versions-maven-plugin/ -[26]: https://github.com/basepom/duplicate-finder-maven-plugin +[26]: https://basepom.github.io/duplicate-finder-maven-plugin [27]: https://maven.apache.org/plugins/maven-assembly-plugin/ [28]: https://maven.apache.org/plugins/maven-jar-plugin/ [29]: https://github.com/exasol/artifact-reference-checker-maven-plugin/ @@ -111,7 +111,7 @@ [39]: http://maven.apache.org/plugins/maven-install-plugin/ [40]: http://maven.apache.org/plugins/maven-deploy-plugin/ [41]: http://maven.apache.org/plugins/maven-site-plugin/ -[42]: https://github.com/exasol/exasol-driver-go/blob/v1.0.0/LICENSE -[43]: https://github.com/antchfx/xmlquery/blob/HEAD/LICENSE -[44]: https://github.com/stretchr/testify/blob/HEAD/LICENSE -[45]: https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE +[42]: https://github.com/exasol/exasol-driver-go/blob/v1.0.3/LICENSE +[43]: https://github.com/stretchr/testify/blob/v1.8.4/LICENSE +[44]: https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE +[45]: https://github.com/antchfx/xmlquery/blob/HEAD/LICENSE diff --git a/doc/changes/changelog.md b/doc/changes/changelog.md index 0bb81fe..16bdf90 100644 --- a/doc/changes/changelog.md +++ b/doc/changes/changelog.md @@ -1,5 +1,6 @@ # Changes +* [0.3.4](changes_0.3.4.md) * [0.3.3](changes_0.3.3.md) * [0.3.2](changes_0.3.2.md) * [0.3.1](changes_0.3.1.md) diff --git a/doc/changes/changes_0.3.4.md b/doc/changes/changes_0.3.4.md new file mode 100644 index 0000000..e385f8e --- /dev/null +++ b/doc/changes/changes_0.3.4.md @@ -0,0 +1,62 @@ +# Exasol Test Setup Abstraction Server 0.3.4, released 2023-10-19 + +Code name: Configure startup timeout + +## Summary + +This release increases the timeout for starting the server using the Go client from 500s to 10 minutes. This might be necessary in case of a slow machine. The release also allows configuring the timeout. + +The release also upgrades the default Exasol version to 7.1.23. + +**Note**: This release contains the following third party libraries with vulnerabilities: +* `io.netty:netty-handler`: CVE-2023-4586 CWE-300: Channel Accessible by Non-Endpoint ('Man-in-the-Middle') (6.5); +* `fr.turri:aXMLRPC`: CVE-2020-36641 CWE-611: Improper Restriction of XML External Entity Reference ('XXE') (9.8); + +We assume that these vulnerabilities are not exploitable. + +## Features + +* #41: Added configuration for server startup timeout + +## Dependency Updates + +### Server for the Exasol Test-Setup Abstraction + +#### Compile Dependency Updates + +* Updated `com.exasol:exasol-test-setup-abstraction-java:2.0.2` to `2.0.4` +* Updated `io.javalin:javalin:5.6.1` to `5.6.3` + +#### Runtime Dependency Updates + +* Updated `org.slf4j:slf4j-jdk14:2.0.7` to `2.0.9` + +#### Test Dependency Updates + +* Updated `io.rest-assured:rest-assured:5.3.1` to `5.3.2` +* Updated `org.junit.jupiter:junit-jupiter-engine:5.9.3` to `5.10.0` +* Updated `org.junit.jupiter:junit-jupiter-params:5.9.3` to `5.10.0` +* Updated `org.mockito:mockito-junit-jupiter:5.4.0` to `5.6.0` + +#### Plugin Dependency Updates + +* Updated `com.exasol:error-code-crawler-maven-plugin:1.2.3` to `1.3.0` +* Updated `org.apache.maven.plugins:maven-assembly-plugin:3.5.0` to `3.6.0` +* Updated `org.apache.maven.plugins:maven-enforcer-plugin:3.3.0` to `3.4.0` +* Updated `org.apache.maven.plugins:maven-failsafe-plugin:3.0.0` to `3.1.2` +* Updated `org.apache.maven.plugins:maven-surefire-plugin:3.0.0` to `3.1.2` +* Updated `org.basepom.maven:duplicate-finder-maven-plugin:1.5.1` to `2.0.1` +* Updated `org.codehaus.mojo:flatten-maven-plugin:1.4.1` to `1.5.0` +* Updated `org.codehaus.mojo:versions-maven-plugin:2.15.0` to `2.16.0` +* Updated `org.jacoco:jacoco-maven-plugin:0.8.9` to `0.8.10` + +### Go-client + +#### Compile Dependency Updates + +* Updated `golang:1.19` to `1.20` +* Updated `github.com/exasol/exasol-driver-go:v1.0.0` to `v1.0.3` + +#### Test Dependency Updates + +* Updated `github.com/antchfx/xmlquery:v1.3.17` to `v1.3.18` diff --git a/go-client/Builder.go b/go-client/Builder.go index 25da01b..ac44782 100644 --- a/go-client/Builder.go +++ b/go-client/Builder.go @@ -1,13 +1,20 @@ package exasol_test_setup_abstraction_go +import "time" + type Builder struct { configFilePath string dockerDbVersion string + startupTimeout time.Duration } // New creates a new builder that allows creating a new TestSetupAbstraction. func New() Builder { - return Builder{} + return Builder{ + configFilePath: "", + dockerDbVersion: "", + startupTimeout: time.Minute * 10, + } } // CloudSetupConfigFilePath sets the path to the cloud setup config file. @@ -25,6 +32,13 @@ func (c Builder) DockerDbVersion(dockerDbVersion string) Builder { return c } +// StartupTimeout sets the timeout for starting the Exasol test setup. +// This defaults to 10 minutes. +func (c Builder) StartupTimeout(timeout time.Duration) Builder { + c.startupTimeout = timeout + return c +} + // Start launches the test setup using the given configuration. // Don't forget to stop the setup after usage by calling TestSetupAbstraction.Stop(). func (c Builder) Start() (*TestSetupAbstraction, error) { diff --git a/go-client/Builder_test.go b/go-client/Builder_test.go index 976c553..890c968 100644 --- a/go-client/Builder_test.go +++ b/go-client/Builder_test.go @@ -4,13 +4,14 @@ import ( "os" "path" "testing" + "time" "github.com/stretchr/testify/suite" ) -// Default version specified in exasol-test-setup-abstraction-java -const DEFAULT_EXASOL_VERSION = "7.1.19" -const NON_DEFAULT_EXASOL_VERSION = "7.1.21" +// Default version specified in exasol-test-setup-abstraction-java. +const DEFAULT_EXASOL_VERSION = "7.1.23" +const NON_DEFAULT_EXASOL_VERSION = "8.23.0" type BuilderSuite struct { suite.Suite @@ -48,11 +49,18 @@ func (suite *BuilderSuite) TestCustomMissingConfigFile() { func (suite *BuilderSuite) TestConfigFileWithInvalidContent() { var err error suite.setup, err = New().CloudSetupConfigFilePath(suite.writeTempFile("invalid json content")).Start() - suite.ErrorContains(err, "failed to start server. The server did not print a port number") + suite.ErrorContains(err, "server stopped after") suite.ErrorContains(err, "E-ETSAS-7: Failed to start server: 'Unexpected char 105 at") suite.Nil(suite.setup) } +func (suite *BuilderSuite) TestTimeoutTooShort() { + var err error + suite.setup, err = New().StartupTimeout(time.Second * 1).Start() + suite.ErrorContains(err, "failed to start server. Server did not print a port number after") + suite.Nil(suite.setup) +} + func (suite *BuilderSuite) TestCustomExasolVersion() { var err error suite.setup, err = New().DockerDbVersion(NON_DEFAULT_EXASOL_VERSION).Start() diff --git a/go-client/TestSetupAbstraction.go b/go-client/TestSetupAbstraction.go index 80bfc27..3758993 100644 --- a/go-client/TestSetupAbstraction.go +++ b/go-client/TestSetupAbstraction.go @@ -1,6 +1,7 @@ package exasol_test_setup_abstraction_go import ( + "context" "database/sql" _ "embed" "encoding/json" @@ -18,7 +19,7 @@ type TestSetupAbstraction struct { server *serverProcess } -const serverVersion = "0.3.3" +const serverVersion = "0.3.4" // Create creates a new Exasol test setup with the given path to the config file // and starts a local server. @@ -47,33 +48,35 @@ func (testSetup *TestSetupAbstraction) GetConnectionInfo() (*ConnectionInfo, err } func (testSetup *TestSetupAbstraction) makeApiRequest(method string, path string, jsonResult interface{}, payload url.Values) error { + //nolint:exhaustruct // default values are OK client := http.Client{} - req, err := http.NewRequest(method, testSetup.server.serverEndpoint+path, strings.NewReader(payload.Encode())) + req, err := http.NewRequestWithContext(context.Background(), method, testSetup.server.serverEndpoint+path, strings.NewReader(payload.Encode())) if err != nil { - return fmt.Errorf("failed to create http request for the server. Cause: %v", err.Error()) + return fmt.Errorf("failed to create http request for the server. Cause: %w", err) } if payload != nil { req.Header.Set("Content-Type", "application/x-www-form-urlencoded") } response, err := client.Do(req) if err != nil { - return fmt.Errorf("failed to execute %v %v from test-setup-abstraction server. Cause %v", method, path, err.Error()) + return fmt.Errorf("failed to execute %v %v from test-setup-abstraction server. Cause %w", method, path, err) } + defer response.Body.Close() body, err := io.ReadAll(response.Body) if err != nil { - return fmt.Errorf("failed to read response body. Cause %v", err.Error()) + return fmt.Errorf("failed to read response body. Cause %w", err) } if response.StatusCode != 200 { return fmt.Errorf("request failed with status %d (%v). Response: %q", response.StatusCode, response.Status, body) } err = json.Unmarshal(body, &jsonResult) if err != nil { - return fmt.Errorf("invalid JSON response:\n%v\nCause: %v", string(body), err.Error()) + return fmt.Errorf("invalid JSON response:\n%v\nCause: %w", string(body), err) } return nil } -// Contains information required for connecting to an exasol database +// Contains information required for connecting to an exasol database. type ConnectionInfo struct { Host string `json:"host"` // Host name Port int `json:"port"` // Port number @@ -99,7 +102,7 @@ func (testSetup *TestSetupAbstraction) CreateConnectionWithConfig(autocommit boo Autocommit(autocommit). String()) if err != nil { - return nil, fmt.Errorf("failed to connect to the database. Cause %v", err.Error()) + return nil, fmt.Errorf("failed to connect to the database. Cause %w", err) } return connection, nil } @@ -121,7 +124,7 @@ func (testSetup *TestSetupAbstraction) MakeDatabaseTcpServiceAccessibleFromLocal // MakeLocalTcpServiceAccessibleFromDatabase makes a local TCP service available from within the Exasol database. // You can use this method for example for accessing a local s3 bucket implementation from inside the Exasol database. // Another example is to connect from UDFs to a debugger running on the test PC. -// Returns the address under which the service is available from within the exasol database (same port) +// Returns the address under which the service is available from within the exasol database (same port). func (testSetup *TestSetupAbstraction) MakeLocalTcpServiceAccessibleFromDatabase(localPort int) (*ServiceAddress, error) { var serviceAddress ServiceAddress err := testSetup.makeApiRequest("POST", "makeLocalTcpServiceAccessibleFromDatabase", &serviceAddress, url.Values{ @@ -148,7 +151,7 @@ func (testSetup *TestSetupAbstraction) MakeTcpServiceAccessibleFromDatabase(serv // UploadFile uploads a local file to the default BucketFS bucket. func (testSetup TestSetupAbstraction) UploadFile(localPath string, remoteName string) error { - return testSetup.makeApiRequest("POST", "bfs/uploadFile", &successResult{}, url.Values{ + return testSetup.makeApiRequest("POST", "bfs/uploadFile", &successResult{Success: true}, url.Values{ "localPath": {localPath}, "remoteName": {remoteName}, }) @@ -156,7 +159,7 @@ func (testSetup TestSetupAbstraction) UploadFile(localPath string, remoteName st // UploadStringContent uploads the given string content to a file in the default BucketFS bucket. func (testSetup TestSetupAbstraction) UploadStringContent(stringContent string, remoteName string) error { - return testSetup.makeApiRequest("POST", "bfs/uploadStringContent", &successResult{}, url.Values{ + return testSetup.makeApiRequest("POST", "bfs/uploadStringContent", &successResult{Success: true}, url.Values{ "stringContent": {stringContent}, "remoteName": {remoteName}, }) @@ -168,6 +171,7 @@ type downloadFileAsStringResult struct { // DownloadFileAsString downloads a file from the default BucketFS bucket. func (testSetup TestSetupAbstraction) DownloadFileAsString(path string) (string, error) { + //nolint:exhaustruct // struct will be filled during unmarshal result := downloadFileAsStringResult{} err := testSetup.makeApiRequest("GET", "bfs/downloadFileAsString?path="+url.QueryEscape(path), &result, url.Values{}) if err != nil { @@ -178,18 +182,19 @@ func (testSetup TestSetupAbstraction) DownloadFileAsString(path string) (string, // DownloadFile downloads a file from the default BucketFS bucket to a local file. func (testSetup TestSetupAbstraction) DownloadFile(remotePath string, localPath string) error { - return testSetup.makeApiRequest("GET", "bfs/downloadFile?remotePath="+url.QueryEscape(remotePath)+"&localPath="+url.QueryEscape(localPath), &successResult{}, url.Values{}) + return testSetup.makeApiRequest("GET", "bfs/downloadFile?remotePath="+url.QueryEscape(remotePath)+"&localPath="+url.QueryEscape(localPath), &successResult{Success: true}, url.Values{}) } // DeleteFile deletes a file from the default BucketFS bucket. func (testSetup TestSetupAbstraction) DeleteFile(path string) error { - return testSetup.makeApiRequest("DELETE", "bfs/deleteFile", &successResult{}, url.Values{ + return testSetup.makeApiRequest("DELETE", "bfs/deleteFile", &successResult{Success: true}, url.Values{ "path": {path}, }) } // ListFiles lists files in the default BucketFS bucket. func (testSetup TestSetupAbstraction) ListFiles(path string) ([]string, error) { + //nolint:exhaustruct // struct will be filled during unmarshal result := &listResult{} err := testSetup.makeApiRequest("GET", "bfs/listFiles?path="+url.QueryEscape(path), result, url.Values{ "path": {path}, diff --git a/go-client/download.go b/go-client/download.go index 36268ad..f392729 100644 --- a/go-client/download.go +++ b/go-client/download.go @@ -10,9 +10,10 @@ import ( func downloadFile(url, localPath string) error { log.Printf("Downloading %q to local path %q...", url, localPath) + //nolint:gosec,noctx // HTTP request with variable URL is wanted here, omitting context is ok here resp, err := http.Get(url) if err != nil { - return fmt.Errorf("download failed: %v", err.Error()) + return fmt.Errorf("download failed: %w", err) } if resp.StatusCode != 200 { return fmt.Errorf("download of %q failed with status %d: %q", url, resp.StatusCode, resp.Status) @@ -22,15 +23,16 @@ func downloadFile(url, localPath string) error { defer func() { err = out.Close() if err != nil { - panic(fmt.Sprintf("failed to close server file. Cause: %v", err.Error())) + panic(fmt.Sprintf("failed to close server file. Cause: %v", err)) } }() if err != nil { - return fmt.Errorf("failed to create file for: %v", err.Error()) + return fmt.Errorf("failed to create file for: %w", err) } - _, err = io.Copy(out, resp.Body) + fileSize, err := io.Copy(out, resp.Body) if err != nil { - return fmt.Errorf("failed to download from %q to %q: %v", url, localPath, err.Error()) + return fmt.Errorf("failed to download from %q to %q: %w", url, localPath, err) } + log.Printf("File downloaded with size %d bytes", fileSize) return nil } diff --git a/go-client/go.mod b/go-client/go.mod index 7fc4a5a..3e61405 100644 --- a/go-client/go.mod +++ b/go-client/go.mod @@ -1,13 +1,13 @@ module github.com/exasol/exasol-test-setup-abstraction-server/go-client -go 1.19 +go 1.20 -require github.com/exasol/exasol-driver-go v1.0.0 +require github.com/exasol/exasol-driver-go v1.0.3 require github.com/stretchr/testify v1.8.4 require ( - github.com/antchfx/xmlquery v1.3.17 + github.com/antchfx/xmlquery v1.3.18 gopkg.in/yaml.v3 v3.0.1 ) @@ -19,8 +19,9 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/net v0.11.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/text v0.10.0 // indirect + github.com/stretchr/objx v0.5.1 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/sync v0.4.0 // indirect + golang.org/x/text v0.13.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go-client/go.sum b/go-client/go.sum index c6b8fd4..5e05d50 100644 --- a/go-client/go.sum +++ b/go-client/go.sum @@ -1,5 +1,5 @@ -github.com/antchfx/xmlquery v1.3.17 h1:d0qWjPp/D+vtRw7ivCwT5ApH/3CkQU8JOeo3245PpTk= -github.com/antchfx/xmlquery v1.3.17/go.mod h1:Afkq4JIeXut75taLSuI31ISJ/zeq+3jG7TunF7noreA= +github.com/antchfx/xmlquery v1.3.18 h1:FSQ3wMuphnPPGJOFhvc+cRQ2CT/rUj4cyQXkJcjOwz0= +github.com/antchfx/xmlquery v1.3.18/go.mod h1:Afkq4JIeXut75taLSuI31ISJ/zeq+3jG7TunF7noreA= github.com/antchfx/xpath v1.2.4 h1:dW1HB/JxKvGtJ9WyVGJ0sIoEcqftV3SqIstujI+B9XY= github.com/antchfx/xpath v1.2.4/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -8,8 +8,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/exasol/error-reporting-go v0.2.0 h1:nKIe4zYiTHbYrKJRlSNJcmGjTJCZredDh5akVHfIbRs= github.com/exasol/error-reporting-go v0.2.0/go.mod h1:lUzRJqKLiSuYpqRUN2LVyj08WeHzhMEC/8Gmgtuqh1Y= -github.com/exasol/exasol-driver-go v1.0.0 h1:+CbB2noe8QDKnzdd4NM2tKAIczyw9prU0Gf5o9+gPqk= -github.com/exasol/exasol-driver-go v1.0.0/go.mod h1:p/saPOXAA5ZX5AtBJ6LuRycJzzGl1XtO7WpgjXjLX8U= +github.com/exasol/exasol-driver-go v1.0.3 h1:Q2rnp8Zlh2Ef8fqjskRNH/3cq/alIsGdSwS7orKF2Nc= +github.com/exasol/exasol-driver-go v1.0.3/go.mod h1:5lkVe9phxZ6u/IYginlXwHXfHxQyHhd2Msa4rMA3Hno= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= @@ -25,10 +25,16 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= +github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -39,12 +45,12 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -58,8 +64,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/go-client/project_version_test.go b/go-client/project_version_test.go index 9f7c022..6164d8d 100644 --- a/go-client/project_version_test.go +++ b/go-client/project_version_test.go @@ -37,6 +37,7 @@ func readProjectKeeperConf(t *testing.T) *projectKeeperConfig { if err != nil { t.Fatalf("failed to read project keeper file: %v", err) } + //nolint:exhaustruct // struct will be filled during unmarshal config := &projectKeeperConfig{} err = yaml.Unmarshal(yamlFile, config) if err != nil { diff --git a/go-client/server.go b/go-client/server.go index 718ee52..0539d2d 100644 --- a/go-client/server.go +++ b/go-client/server.go @@ -21,22 +21,22 @@ type serverProcess struct { errorStream *bytes.Buffer } -// startServer starts the server in the given version and with the given config file +// startServer starts the server in the given version and with the given config file. func startServer(serverVersion string, config Builder) (*serverProcess, error) { serverPath, err := downloadServerIfNotPresent() if err != nil { return nil, err } args := getServerProcessArguments(serverPath, config) - log.Printf("Starting server with arguments %v", args) + log.Printf("Starting server version %s with arguments %v", serverVersion, args) process := exec.Command("java", args...) - var output, errorStream bytes.Buffer - process.Stdout = &output + var outputStream, errorStream bytes.Buffer + process.Stdout = &outputStream process.Stderr = &errorStream stoppedMutex := &sync.Mutex{} stopped := false - go waitForServer(process, &errorStream, &stopped, stoppedMutex) - port, err := getServerPort(&stopped, &output, &errorStream) + go waitForServer(process, &errorStream, &outputStream, &stopped, stoppedMutex) + port, err := getServerPort(config.startupTimeout, &stopped, &outputStream, &errorStream) if err != nil { return nil, err } @@ -59,13 +59,13 @@ func getServerProcessArguments(serverPath string, config Builder) []string { func downloadServerIfNotPresent() (string, error) { homeDir, err := os.UserHomeDir() if err != nil { - return "", fmt.Errorf("failed to get home dir. Cause: %v", err.Error()) + return "", fmt.Errorf("failed to get home dir. Cause: %w", err) } serverDir := path.Join(homeDir, ".test-setup-abstraction-server") if _, err := os.Stat(serverDir); os.IsNotExist(err) { err := os.Mkdir(serverDir, 0700) if err != nil { - return "", fmt.Errorf("failed to create directory %q: %v", serverDir, err.Error()) + return "", fmt.Errorf("failed to create directory %q: %w", serverDir, err) } } const serverJar = "exasol-test-setup-abstraction-server-" + serverVersion + ".jar" @@ -80,9 +80,10 @@ func downloadServerIfNotPresent() (string, error) { return localPath, nil } -func getServerPort(stopped *bool, output *bytes.Buffer, errorStream *bytes.Buffer) (int, error) { - for counter := 0; counter < 500; counter++ { // we need to wait quite long here if the server can't reuse a testcontainer - pattern := regexp.MustCompile("Server running on port: (\\d+)\n") +func getServerPort(timeout time.Duration, stopped *bool, output *bytes.Buffer, errorStream *bytes.Buffer) (int, error) { + startTime := time.Now() + pattern := regexp.MustCompile("Server running on port: (\\d+)\n") + for { result := pattern.FindSubmatch(output.Bytes()) if len(result) != 0 { portString := string(result[1]) @@ -92,17 +93,22 @@ func getServerPort(stopped *bool, output *bytes.Buffer, errorStream *bytes.Buffe } return int(port), nil } + duration := time.Since(startTime) + if duration >= timeout { + return -1, fmt.Errorf("failed to start server. Server did not print a port number after %v seconds. Output: '%s', Error: '%s'", duration, output, errorStream) + } if !*stopped { time.Sleep(1 * time.Second) + } else { + return -1, fmt.Errorf("server stopped after %v seconds. Output: '%s', Error: '%s'", duration, output, errorStream) } } - return -1, fmt.Errorf("failed to start server. The server did not print a port number. Output: %q, error stream: %q", output, errorStream) } -func waitForServer(serverProcess *exec.Cmd, errorStream *bytes.Buffer, stopped *bool, stoppedMutex *sync.Mutex) { +func waitForServer(serverProcess *exec.Cmd, errorStream *bytes.Buffer, outputStream *bytes.Buffer, stopped *bool, stoppedMutex *sync.Mutex) { err := serverProcess.Run() if err != nil && !isStopped(stopped, stoppedMutex) { // after we killed the thread we expect an error - fmt.Println(errorStream.String()) + fmt.Printf("failed to start server: %v. Error output: '%s', output stream: '%s'\n", err, errorStream.String(), outputStream.String()) } stoppedMutex.Lock() *stopped = true @@ -121,7 +127,7 @@ func (testSetup *serverProcess) stop() error { testSetup.stoppedMutex.Unlock() err := testSetup.process.Process.Signal(os.Kill) if err != nil { - return fmt.Errorf("failed to stop test-setup-abstraction server. Cause: %v", err.Error()) + return fmt.Errorf("failed to stop test-setup-abstraction server. Cause: %w", err) } return nil } diff --git a/server/.settings/org.eclipse.jdt.core.prefs b/server/.settings/org.eclipse.jdt.core.prefs index 8b5a9aa..bb40c3f 100644 --- a/server/.settings/org.eclipse.jdt.core.prefs +++ b/server/.settings/org.eclipse.jdt.core.prefs @@ -111,7 +111,7 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.processAnnotations=enabled +org.eclipse.jdt.core.compiler.processAnnotations=disabled org.eclipse.jdt.core.compiler.release=disabled org.eclipse.jdt.core.compiler.source=11 org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false diff --git a/server/pk_generated_parent.pom b/server/pk_generated_parent.pom index 8b613b9..2003d8b 100644 --- a/server/pk_generated_parent.pom +++ b/server/pk_generated_parent.pom @@ -3,7 +3,7 @@ 4.0.0 com.exasol exasol-test-setup-abstraction-server-generated-parent - 0.3.3 + 0.3.4 pom UTF-8 @@ -51,7 +51,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.3.0 + 3.4.0 enforce-maven @@ -71,7 +71,7 @@ org.codehaus.mojo flatten-maven-plugin - 1.4.1 + 1.5.0 true oss @@ -110,7 +110,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0 + 3.1.2 @@ -121,7 +121,7 @@ org.codehaus.mojo versions-maven-plugin - 2.15.0 + 2.16.0 display-updates @@ -139,7 +139,7 @@ org.basepom.maven duplicate-finder-maven-plugin - 1.5.1 + 2.0.1 default @@ -157,7 +157,6 @@ true true false - true true false @@ -165,7 +164,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.5.0 + 3.6.0 src/assembly/all-dependencies.xml @@ -215,7 +214,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.0.0 + 3.1.2 @@ -236,7 +235,7 @@ org.jacoco jacoco-maven-plugin - 0.8.9 + 0.8.10 prepare-agent @@ -277,7 +276,7 @@ com.exasol error-code-crawler-maven-plugin - 1.2.3 + 1.3.0 verify diff --git a/server/pom.xml b/server/pom.xml index c081366..9bc3a29 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -1,33 +1,30 @@ - + 4.0.0 com.exasol exasol-test-setup-abstraction-server - 0.3.3 + 0.3.4 Server for the Exasol Test-Setup Abstraction Test setup abstraction backend for Go and other languages. https://github.com/exasol/exasol-test-setup-abstraction-server/ - 5.9.3 + 5.10.0 com.exasol exasol-test-setup-abstraction-java - 2.0.2 + 2.0.4 io.javalin javalin - 5.6.1 + 5.6.3 - org.slf4j slf4j-jdk14 - 2.0.7 + 2.0.9 runtime @@ -52,13 +49,13 @@ org.mockito mockito-junit-jupiter - 5.4.0 + 5.6.0 test io.rest-assured rest-assured - 5.3.1 + 5.3.2 test @@ -123,6 +120,9 @@ CVE-2020-36641 is reported to be fixed in aXMLRPC 1.12.1. We use version 1.13.0, so this is a false positive. --> CVE-2020-36641 + + CVE-2023-4586 @@ -141,7 +141,7 @@ exasol-test-setup-abstraction-server-generated-parent com.exasol - 0.3.3 + 0.3.4 pk_generated_parent.pom