diff --git a/.drone.yml b/.drone.yml index 4fbaecfe..59337faa 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,271 +3,16 @@ name: default type: docker - -services: - - name: valkey7 - image: valkey/valkey:7.2 - pull: if-not-exists - commands: - - "valkey-server --port 6384 --protected-mode no --dbfilename dump7.rdb" - ports: - - 6384 - - - name: redis5 - image: redis:5 - pull: if-not-exists - commands: - - "redis-server --port 6383 --dbfilename dump5.rdb" - ports: - - 6383 - - - name: redis6 - image: redis:6.2 - pull: if-not-exists - commands: - - "redis-server --protected-mode no --dbfilename dump6.rdb" - ports: - - 6379 - - - name: pwd-redis5 - image: redis:5 - pull: if-not-exists - commands: - - "redis-server --port 6380 --requirepass redis-password --dbfilename dump5-pwd.rdb" - ports: - - 6380 - - - name: pwd-redis6 - image: redis:6 - pull: if-not-exists - commands: - - "redis-server --port 6390 --requirepass dummy --user exporter on +INFO +CLIENT +SELECT +SLOWLOG +LATENCY '>exporter-password' --dbfilename dump6-pwd.rdb" - ports: - - 6390 - - - name: redis-2-8 - image: redis:2.8.23 - pull: if-not-exists - commands: - - "redis-server --port 6381 --dbfilename dump2-8.rdb" - ports: - - 6381 - - - name: keydb-01 - image: "eqalpha/keydb:x86_64_v6.3.4" - pull: if-not-exists - commands: - - "keydb-server --protected-mode no --port 6401 --dbfilename dump-keydb-01.rdb" - ports: - - 6401 - - - name: keydb-02 - image: "eqalpha/keydb:x86_64_v6.3.4" - pull: if-not-exists - commands: - - "keydb-server --protected-mode no --port 6402 --active-replica yes --replicaof keydb-01 6401 --dbfilename dump-keydb-02.rdb" - ports: - - 6402 - - - name: redis-cluster - image: grokzen/redis-cluster:6.2.11 - pull: if-not-exists - ports: [ 7000, 7001, 7002, 7003, 7004, 7005 ] - - - name: redis-cluster-password - image: bitnami/redis-cluster:latest - environment: - REDIS_PORT_NUMBER: 7006 - REDIS_PASSWORD: redis-password - REDIS_CLUSTER_CREATOR: yes - REDIS_NODES: redis-cluster-password:7006 - ports: - - 7006 - - - name: tile38 - image: tile38/tile38:latest - pull: if-not-exists - ports: - - 9851 - - steps: - name: start - image: golang:1.22 + image: golang:1.23 pull: if-not-exists commands: - sleep 10 - 'echo "start"' when: event: - - pull_request - - push - - tag - - # - # starting this service down here using "detached: true" because it depends on - # the "redis6" service and it intermittently fails if that service is not available yet - # making it start after the "start" step which waits 10 seconds hopefully fixes that issue - # - - name: redis-sentinel - image: "docker.io/bitnami/redis-sentinel:6.2-debian-10" - pull: if-not-exists - environment: - REDIS_MASTER_HOST: redis6 - ports: - - 26379 - detach: true - when: - event: - - pull_request - - push - - tag - depends_on: - - start - - - - name: test-docker-build - image: plugins/docker - pull: if-not-exists - settings: - mtu: 1200 - tags: "test" - dockerfile: ./docker/Dockerfile - repo: oliver006/redis_exporter - target: scratch - dry_run: true - build_args: - - 'TAG=test' - - 'SHA1=${DRONE_COMMIT_SHA}' - - 'GOARCH=amd64' - username: - from_secret: docker_test_user - password: - from_secret: docker_test_pass - when: - event: - - pull_request - - push - - tag - depends_on: - - start - - - name: lint - image: golangci/golangci-lint:v1.56.2-alpine - pull: if-not-exists - commands: - - golangci-lint run --tests=false --exclude-use-default --timeout=5m - - golangci-lint run -D=errcheck --exclude-use-default --timeout=5m - when: - event: - - pull_request - - push - - tag - depends_on: - - start - - - name: tests - image: golang:1.22 - pull: if-not-exists - environment: - GO111MODULE: on - LOG_LEVEL: "info" - commands: - - sleep 15 - - make checks - - make test - when: - event: - - pull_request - - push - - tag - depends_on: - - start - - - - name: mixins - image: golang:1.22 - pull: if-not-exists - commands: - - make mixin - when: - event: - - pull_request - - push - - tag - depends_on: - - start - - - - name: coverage-codecov - image: golang:1.22 - pull: if-not-exists - environment: - CODECOV_TOKEN: - from_secret: codecov-token - commands: - - curl -Os https://uploader.codecov.io/latest/linux/codecov - - chmod +x codecov - - ./codecov -t ${CODECOV_TOKEN} -f coverage.txt - when: - event: - - pull_request - - push - tag - depends_on: - - tests - - - - name: coverage-coveralls - image: golang:1.22 - pull: if-not-exists - environment: - GO111MODULE: on - LOG_LEVEL: "info" - COVERALLS_TOKEN: - from_secret: coveralls-token - commands: - - make upload-coverage - when: - event: - - pull_request - - push - - tag - depends_on: - - tests - - # this is just a smoke test if building a few different arch/OS combinations succeeds - - name: build-some-amd64-binaries - image: golang:1.22 - pull: if-not-exists - environment: - GO111MODULE: on - LOG_LEVEL: "info" - commands: - - make build-some-amd64-binaries - when: - event: - - pull_request - - push - depends_on: - - start - - # this builds the binaries that get uploaded to GH for a release - # docker binaries are build in docker itself via multi-stage Docker files - - name: build-all-binaries - image: golang:1.22 - pull: if-not-exists - environment: - GO111MODULE: on - LOG_LEVEL: "info" - commands: - - make build-all-binaries - when: - event: - - tag - depends_on: - - tests - - name: release-docker-image-scratch image: plugins/docker @@ -291,7 +36,7 @@ steps: event: - tag depends_on: - - tests + - start - name: release-docker-image-alpine-arm64 @@ -316,7 +61,7 @@ steps: event: - tag depends_on: - - tests + - start - name: release-docker-image-alpine-arm @@ -341,7 +86,7 @@ steps: event: - tag depends_on: - - tests + - start - name: release-docker-image-alpine-amd64 @@ -366,7 +111,7 @@ steps: event: - tag depends_on: - - tests + - start - name: manifest-docker-latest @@ -462,7 +207,7 @@ steps: event: - tag depends_on: - - tests + - start - name: release-quay-alpine-arm64 @@ -488,7 +233,7 @@ steps: event: - tag depends_on: - - tests + - start - name: release-quay-alpine-arm @@ -514,7 +259,7 @@ steps: event: - tag depends_on: - - tests + - start - name: release-quay-alpine-amd64 @@ -540,7 +285,7 @@ steps: event: - tag depends_on: - - tests + - start - name: manifest-quay-latest @@ -608,8 +353,24 @@ steps: - manifest-quay-tag + # this builds the binaries that get uploaded to GH for a release + # docker binaries are build in docker itself via multi-stage Docker files + - name: build-all-binaries + image: golang:1.23 + pull: if-not-exists + environment: + GO111MODULE: on + LOG_LEVEL: "info" + commands: + - make build-all-binaries + when: + event: + - tag + depends_on: + - start + - name: release-github-binaries - image: golang:1.22 + image: golang:1.23 pull: if-not-exists environment: GITHUB_TOKEN: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..03d0ee48 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,103 @@ +name: Tests + +on: + push: + branches: + - '*' + tags: + - '*' + +jobs: + tests: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker + uses: docker/setup-buildx-action@v2 + + - name: Set up Docker Compose + run: sudo apt-get install docker-compose + + - name: Start services + run: docker-compose up -d + working-directory: ./ + + - name: Setup Go + uses: actions/setup-go@v3 + with: + go-version: '1.23' + + - name: Install Dependencies + run: go mod tidy + + - name: Run tests + env: + LOG_LEVEL: "info" + run: | + sleep 15 + make checks + make test + + - name: Upload coverage to Codecov + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + run: | + curl -Os https://uploader.codecov.io/latest/linux/codecov + chmod +x codecov + ./codecov -t $CODECOV_TOKEN -f coverage.txt + + + - name: Upload coverage to Coveralls + uses: coverallsapp/github-action@v2 + with: + file: coverage.txt + + - name: Stop services + run: docker-compose down + working-directory: ./ + + + golangci: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Go + uses: actions/setup-go@v3 + with: + go-version: '1.23' + + - name: Install Dependencies + run: go mod tidy + + - name: golangci-lint + uses: golangci/golangci-lint-action@v6 + with: + version: v1.60 + args: "--tests=false" + + + build-stuff: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Go + uses: actions/setup-go@v3 + with: + go-version: '1.23' + + - name: Install Dependencies + run: go mod tidy + + - name: Build some binaries + run: make build-some-amd64-binaries + + - name: Generate mixin + run: make mixin diff --git a/Makefile b/Makefile index 585fcee6..d80143e1 100644 --- a/Makefile +++ b/Makefile @@ -31,20 +31,20 @@ docker-test: .PHONY: test test: contrib/tls/gen-test-certs.sh - TEST_REDIS_URI="redis://redis6:6379" \ - TEST_REDIS5_URI="redis://redis5:6383" \ - TEST_REDIS6_URI="redis://redis6:6379" \ - TEST_VALKEY7_URI="redis://valkey7:6384" \ - TEST_REDIS_2_8_URI="redis://redis-2-8:6381" \ - TEST_KEYDB01_URI="redis://keydb-01:6401" \ - TEST_KEYDB02_URI="redis://keydb-02:6402" \ - TEST_PWD_REDIS_URI="redis://:redis-password@pwd-redis5:6380" \ - TEST_USER_PWD_REDIS_URI="redis://exporter:exporter-password@pwd-redis6:6390" \ - TEST_REDIS_CLUSTER_MASTER_URI="redis://redis-cluster:7000" \ - TEST_REDIS_CLUSTER_SLAVE_URI="redis://redis-cluster:7005" \ - TEST_REDIS_CLUSTER_PASSWORD_URI="redis://redis-cluster-password:7006" \ - TEST_TILE38_URI="redis://tile38:9851" \ - TEST_REDIS_SENTINEL_URI="redis://redis-sentinel:26379" \ + TEST_REDIS_URI="redis://localhost:16384" \ + TEST_REDIS5_URI="redis://localhost:16383" \ + TEST_REDIS6_URI="redis://localhost:16379" \ + TEST_VALKEY7_URI="redis://localhost:16384" \ + TEST_REDIS_2_8_URI="redis://localhost:16381" \ + TEST_KEYDB01_URI="redis://localhost:16401" \ + TEST_KEYDB02_URI="redis://localhost:16402" \ + TEST_PWD_REDIS_URI="redis://:redis-password@localhost:16380" \ + TEST_USER_PWD_REDIS_URI="redis://exporter:exporter-password@localhost:16390" \ + TEST_REDIS_CLUSTER_MASTER_URI="redis://localhost:17000" \ + TEST_REDIS_CLUSTER_SLAVE_URI="redis://localhost:17005" \ + TEST_REDIS_CLUSTER_PASSWORD_URI="redis://localhost:17006" \ + TEST_TILE38_URI="redis://localhost:19851" \ + TEST_REDIS_SENTINEL_URI="redis://localhost:26379" \ go test -v -covermode=atomic -cover -race -coverprofile=coverage.txt -p 1 ./... .PHONY: lint @@ -71,7 +71,9 @@ mixin: .PHONY: upload-coverage upload-coverage: go install github.com/mattn/goveralls@v0.0.11 - /go/bin/goveralls -coverprofile=coverage.txt -service=drone.io + which goveralls + echo $PATH + /home/runner/go/bin/goveralls -coverprofile=coverage.txt -service=drone.io diff --git a/contrib/docker-compose-for-tests.yml b/contrib/docker-compose-for-tests.yml deleted file mode 100644 index ceea4440..00000000 --- a/contrib/docker-compose-for-tests.yml +++ /dev/null @@ -1,83 +0,0 @@ -version: '3' -services: - - redis5: - image: redis:5 - command: "redis-server --port 6383 --dbfilename dump5.rdb" - ports: - - "16383:6383" - - redis6: - image: redis:6.2 - command: "redis-server --protected-mode no --dbfilename dump6.rdb" - ports: - - "16379:6379" - - valkey7: - image: valkey/valkey:7.2 - command: "redis-server --port 6384 --protected-mode no --dbfilename dump7.rdb" - ports: - - "16384:6384" - - pwd-redis5: - image: redis:5 - command: "redis-server --port 6380 --requirepass redis-password --dbfilename dump5-pwd.rdb" - ports: - - "16380:6380" - - pwd-redis6: - image: redis:6 - command: "redis-server --port 6390 --requirepass dummy --user exporter on +CLIENT +INFO +SELECT +SLOWLOG +LATENCY '>exporter-password' --dbfilename dump6-pwd.rdb" - ports: - - "16390:6390" - - redis-2-8: - image: redis:2.8 - command: "redis-server --port 6381 --dbfilename dump2-8.rdb" - ports: - - "16381:6381" - - keydb-01: - image: "eqalpha/keydb:x86_64_v6.3.1" - command: "keydb-server --protected-mode no --port 6401 --dbfilename dump-keydb-01.rdb" - ports: - - "16401:6401" - - keydb-02: - image: "eqalpha/keydb:x86_64_v6.3.1" - command: "keydb-server --protected-mode no --port 6402 --active-replica yes --replicaof keydb-01 6401 --dbfilename dump-keydb-02.rdb" - ports: - - "16402:6402" - - redis-cluster: - image: grokzen/redis-cluster - ports: [ "7000", "7001", "7002", "7003", "7004", "7005" ] - - redis-cluster-password: - image: bitnami/redis-cluster - environment: - - REDIS_PORT_NUMBER=7006 - - REDIS_PASSWORD=redis-password - - REDIS_CLUSTER_CREATOR=yes - - REDIS_NODES=redis-cluster-password:7006 - ports: - - "7006" - - redis-sentinel: - image: docker.io/bitnami/redis-sentinel:6.2-debian-10 - environment: - - REDIS_MASTER_HOST=redis6 - ports: - - "26379" - - tile38: - image: tile38/tile38:latest - ports: - - "19851:9851" - - - tests: - image: golang:1.22 - working_dir: /go/src/github.com/oliver006/redis_exporter - volumes: - - ..:/go/src/github.com/oliver006/redis_exporter diff --git a/contrib/sample-pwd-file.json b/contrib/sample-pwd-file.json index 2cdf5edd..78b23f31 100644 --- a/contrib/sample-pwd-file.json +++ b/contrib/sample-pwd-file.json @@ -1,4 +1,4 @@ { - "redis://redis6:6379": "", - "redis://pwd-redis5:6380": "redis-password" + "redis://localhost:16379": "", + "redis://localhost:16380": "redis-password" } diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..9e4202c9 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,85 @@ +version: '3' +services: + + valkey7: + image: valkey/valkey:7.2 + command: "redis-server --enable-debug-command yes --protected-mode no --dbfilename dump7.rdb" + ports: + - "16384:6379" + - "6379:6379" + + redis5: + image: redis:5 + command: "redis-server --dbfilename dump5.rdb" + ports: + - "16383:6379" + + redis6: + image: redis:6.2 + command: "redis-server --protected-mode no --dbfilename dump6.rdb" + ports: + - "16379:6379" + + pwd-redis5: + image: redis:5 + command: "redis-server --requirepass redis-password --dbfilename dump5-pwd.rdb" + ports: + - "16380:6379" + + pwd-redis6: + image: redis:6 + command: "redis-server --requirepass dummy --user exporter on +CLIENT +INFO +SELECT +SLOWLOG +LATENCY '>exporter-password' --dbfilename dump6-pwd.rdb" + ports: + - "16390:6379" + + redis-2-8: + image: redis:2.8 + command: "redis-server --dbfilename dump2-8.rdb" + ports: + - "16381:6379" + + keydb-01: + image: "eqalpha/keydb:x86_64_v6.3.1" + command: "keydb-server --protected-mode no --dbfilename dump-keydb-01.rdb" + ports: + - "16401:6379" + + keydb-02: + image: "eqalpha/keydb:x86_64_v6.3.1" + command: "keydb-server --protected-mode no --active-replica yes --replicaof keydb-01 6379 --dbfilename dump-keydb-02.rdb" + ports: + - "16402:6379" + + redis-cluster: + image: grokzen/redis-cluster:6.2.14 + ports: + - "7000" + - "7001" + - "7002" + - "7003" + - "7004" + - "7005" + - "17000:7000" + - "17005:7005" + + redis-cluster-password: + image: bitnami/redis-cluster + environment: + - REDIS_PORT_NUMBER=7006 + - REDIS_PASSWORD=redis-password + - REDIS_CLUSTER_CREATOR=yes + - REDIS_NODES=redis-cluster-password:7006 + ports: + - "17006:7006" + + redis-sentinel: + image: docker.io/bitnami/redis-sentinel:6.2-debian-10 + environment: + - REDIS_MASTER_HOST=redis6 + ports: + - "26379:26379" + + tile38: + image: tile38/tile38:latest + ports: + - "19851:9851" diff --git a/docker/Dockerfile b/docker/Dockerfile index 6fda93e4..cbcdc8f7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,7 +2,7 @@ ARG GOARCH # # build container # -FROM --platform=linux/amd64 golang:1.22-alpine as builder +FROM --platform=linux/amd64 golang:1.23-alpine as builder WORKDIR /go/src/github.com/oliver006/redis_exporter/ ADD . /go/src/github.com/oliver006/redis_exporter/ diff --git a/exporter/http_test.go b/exporter/http_test.go index 4ed87d89..db672a93 100644 --- a/exporter/http_test.go +++ b/exporter/http_test.go @@ -31,14 +31,18 @@ func TestHTTPScrapeMetricsEndpoints(t *testing.T) { testRedisHostname := "" if u, err := url.Parse(os.Getenv("TEST_REDIS_URI")); err == nil { testRedisHostname = u.Hostname() - ips, err := net.LookupIP(testRedisHostname) - if err != nil { - t.Fatalf("Could not get IP address: %s", err) - } - if len(ips) == 0 { - t.Fatal("No IP addresses found") + if testRedisHostname == "localhost" { + testRedisIPAddress = "127.0.0.1" + } else { + ips, err := net.LookupIP(testRedisHostname) + if err != nil { + t.Fatalf("Could not get IP address: %s", err) + } + if len(ips) == 0 { + t.Fatal("No IP addresses found") + } + testRedisIPAddress = ips[0].String() } - testRedisIPAddress = ips[0].String() t.Logf("testRedisIPAddress: %s", testRedisIPAddress) t.Logf("testRedisHostname: %s", testRedisHostname) } diff --git a/exporter/pwd_file_test.go b/exporter/pwd_file_test.go index c7dc37b7..df883444 100644 --- a/exporter/pwd_file_test.go +++ b/exporter/pwd_file_test.go @@ -4,6 +4,7 @@ import ( "net/http" "net/http/httptest" "net/url" + "os" "strings" "testing" @@ -52,7 +53,7 @@ func TestPasswordMap(t *testing.T) { } if len(passwordMap) == 0 { - t.Fatalf("Password map is empty -skipping") + t.Fatalf("Password map is empty - failing") } for _, tst := range []struct { @@ -60,7 +61,7 @@ func TestPasswordMap(t *testing.T) { addr string want string }{ - {name: "password-hit", addr: "redis://pwd-redis5:6380", want: "redis-password"}, + {name: "password-hit", addr: "redis://localhost:16380", want: "redis-password"}, {name: "password-missed", addr: "Non-existent-redis-host", want: ""}, } { t.Run(tst.name, func(t *testing.T) { @@ -89,11 +90,11 @@ func TestHTTPScrapeWithPasswordFile(t *testing.T) { useWrongPassword bool wantStatusCode int }{ - {name: "scrape-pwd-file", addr: "redis://pwd-redis5:6380", wants: []string{ + {name: "scrape-pwd-file", addr: os.Getenv("TEST_PWD_REDIS_URI"), wants: []string{ "uptime_in_seconds", "test_up 1", }}, - {name: "scrape-pwd-file-wrong-password", addr: "redis://pwd-redis5:6380", useWrongPassword: true, wants: []string{ + {name: "scrape-pwd-file-wrong-password", addr: "redis://localhost:16380", useWrongPassword: true, wants: []string{ "test_up 0", }}, } { diff --git a/exporter/redis_test.go b/exporter/redis_test.go index 44b8ebd7..331c71c8 100644 --- a/exporter/redis_test.go +++ b/exporter/redis_test.go @@ -114,12 +114,12 @@ func TestPasswordInvalid(t *testing.T) { } } -func TestConnectToClusterUingPasswordFile(t *testing.T) { +func TestConnectToClusterUsingPasswordFile(t *testing.T) { cluster_host := os.Getenv("TEST_REDIS_CLUSTER_PASSWORD_URI") if cluster_host == "" { t.Skipf("TEST_REDIS_CLUSTER_PASSWORD_URI is not set") } - passMap := map[string]string{"redis://redis-cluster-password:7006": "redis-password"} + passMap := map[string]string{cluster_host: "redis-password"} wrongPassMap := map[string]string{"redis://redis-cluster-password-wrong:7006": "redis-password"} tsts := []struct { @@ -145,6 +145,7 @@ func TestConnectToClusterUingPasswordFile(t *testing.T) { log.SetOutput(os.Stderr) }() _, err := e.connectToRedisCluster() + t.Logf("connectToRedisCluster() err: %s", err) if strings.Contains(buf.String(), "Cluster refresh failed:") && !tst.refreshError { t.Errorf("Test Cluster connection Failed error") } diff --git a/exporter/streams_test.go b/exporter/streams_test.go index 8fca1f28..6659fbbb 100644 --- a/exporter/streams_test.go +++ b/exporter/streams_test.go @@ -39,7 +39,7 @@ func TestStreamsGetStreamInfo(t *testing.T) { t.Skipf("TEST_REDIS_URI not set - skipping") } - addr := os.Getenv("TEST_REDIS_URI") + addr := os.Getenv("TEST_REDIS6_URI") c, err := redis.DialURL(addr) if err != nil { t.Fatalf("Couldn't connect to %#v: %#v", addr, err) @@ -74,28 +74,28 @@ func TestStreamsGetStreamInfo(t *testing.T) { } if info.Length != tst.streamInfo.Length { - t.Errorf("Stream length mismatch.\nActual: %#v;\nExpected: %#v", info.Length, tst.streamInfo.Length) + t.Errorf("Stream length mismatch.\nActual: %#v \nExpected: %#v", info.Length, tst.streamInfo.Length) } if info.RadixTreeKeys != tst.streamInfo.RadixTreeKeys { - t.Errorf("Stream RadixTreeKeys mismatch.\nActual: %#v;\nExpected: %#v", info.RadixTreeKeys, tst.streamInfo.RadixTreeKeys) + t.Errorf("Stream RadixTreeKeys mismatch.\nActual: %#v \nExpected: %#v", info.RadixTreeKeys, tst.streamInfo.RadixTreeKeys) } if info.RadixTreeNodes != tst.streamInfo.RadixTreeNodes { - t.Errorf("Stream RadixTreeNodes mismatch.\nActual: %#v;\nExpected: %#v", info.RadixTreeNodes, tst.streamInfo.RadixTreeNodes) + t.Errorf("Stream RadixTreeNodes mismatch.\nActual: %#v \nExpected: %#v", info.RadixTreeNodes, tst.streamInfo.RadixTreeNodes) } if info.Groups != tst.streamInfo.Groups { - t.Errorf("Stream Groups mismatch.\nActual: %#v;\nExpected: %#v", info.Groups, tst.streamInfo.Groups) + t.Errorf("Stream Groups mismatch.\nActual: %#v \nExpected: %#v", info.Groups, tst.streamInfo.Groups) } if isNotTestTimestamp(info.LastGeneratedId) { - t.Errorf("Stream LastGeneratedId mismatch.\nActual: %#v;\nExpected any of: %#v", info.LastGeneratedId, TestStreamTimestamps) + t.Errorf("Stream LastGeneratedId mismatch.\nActual: %#v \nExpected any of: %#v", info.LastGeneratedId, TestStreamTimestamps) } if info.FirstEntryId != TestStreamTimestamps[0] { - t.Errorf("Stream FirstEntryId mismatch.\nActual: %#v;\nExpected any of: %#v", info.FirstEntryId, TestStreamTimestamps) + t.Errorf("Stream FirstEntryId mismatch.\nActual: %#v \nExpected any of: %#v", info.FirstEntryId, TestStreamTimestamps) } if info.LastEntryId != TestStreamTimestamps[len(TestStreamTimestamps)-1] { - t.Errorf("Stream LastEntryId mismatch.\nActual: %#v;\nExpected any of: %#v", info.LastEntryId, TestStreamTimestamps) + t.Errorf("Stream LastEntryId mismatch.\nActual: %#v \nExpected any of: %#v", info.LastEntryId, TestStreamTimestamps) } if info.MaxDeletedEntryId != "" { - t.Errorf("Stream MaxDeletedEntryId mismatch.\nActual: %#v;\nExpected: %#v", info.MaxDeletedEntryId, "0-0") + t.Errorf("Stream MaxDeletedEntryId mismatch.\nActual: %#v \nExpected: %#v", info.MaxDeletedEntryId, "0-0") } }) } @@ -141,38 +141,38 @@ func TestStreamsGetStreamInfoUsingValKey7(t *testing.T) { } if info.Length != tst.streamInfo.Length { - t.Errorf("Stream length mismatch.\nActual: %#v;\nExpected: %#v", info.Length, tst.streamInfo.Length) + t.Errorf("Stream length mismatch.\nActual: %#v \nExpected: %#v", info.Length, tst.streamInfo.Length) } if info.RadixTreeKeys != tst.streamInfo.RadixTreeKeys { - t.Errorf("Stream RadixTreeKeys mismatch.\nActual: %#v;\nExpected: %#v", info.RadixTreeKeys, tst.streamInfo.RadixTreeKeys) + t.Errorf("Stream RadixTreeKeys mismatch.\nActual: %#v \nExpected: %#v", info.RadixTreeKeys, tst.streamInfo.RadixTreeKeys) } if info.RadixTreeNodes != tst.streamInfo.RadixTreeNodes { - t.Errorf("Stream RadixTreeNodes mismatch.\nActual: %#v;\nExpected: %#v", info.RadixTreeNodes, tst.streamInfo.RadixTreeNodes) + t.Errorf("Stream RadixTreeNodes mismatch.\nActual: %#v \nExpected: %#v", info.RadixTreeNodes, tst.streamInfo.RadixTreeNodes) } if info.Groups != tst.streamInfo.Groups { - t.Errorf("Stream Groups mismatch.\nActual: %#v;\nExpected: %#v", info.Groups, tst.streamInfo.Groups) + t.Errorf("Stream Groups mismatch.\nActual: %#v \nExpected: %#v", info.Groups, tst.streamInfo.Groups) } if isNotTestTimestamp(info.LastGeneratedId) { - t.Errorf("Stream LastGeneratedId mismatch.\nActual: %#v;\nExpected any of: %#v", info.LastGeneratedId, TestStreamTimestamps) + t.Errorf("Stream LastGeneratedId mismatch.\nActual: %#v \nExpected any of: %#v", info.LastGeneratedId, TestStreamTimestamps) } if info.FirstEntryId != TestStreamTimestamps[0] { - t.Errorf("Stream FirstEntryId mismatch.\nActual: %#v;\nExpected any of: %#v", info.FirstEntryId, TestStreamTimestamps) + t.Errorf("Stream FirstEntryId mismatch.\nActual: %#v \nExpected any of: %#v", info.FirstEntryId, TestStreamTimestamps) } if info.LastEntryId != TestStreamTimestamps[len(TestStreamTimestamps)-1] { - t.Errorf("Stream LastEntryId mismatch.\nActual: %#v;\nExpected any of: %#v", info.LastEntryId, TestStreamTimestamps) + t.Errorf("Stream LastEntryId mismatch.\nActual: %#v \nExpected any of: %#v", info.LastEntryId, TestStreamTimestamps) } if info.MaxDeletedEntryId != "0-0" { - t.Errorf("Stream MaxDeletedEntryId mismatch.\nActual: %#v;\nExpected: %#v", info.MaxDeletedEntryId, "0-0") + t.Errorf("Stream MaxDeletedEntryId mismatch.\nActual: %#v \nExpected: %#v", info.MaxDeletedEntryId, "0-0") } }) } } func TestStreamsScanStreamGroups123(t *testing.T) { - if os.Getenv("TEST_REDIS_URI") == "" { - t.Skipf("TEST_REDIS_URI not set - skipping") + if os.Getenv("TEST_REDIS6_URI") == "" { + t.Skipf("TEST_REDIS6_URI not set - skipping") } - addr := os.Getenv("TEST_REDIS_URI") + addr := os.Getenv("TEST_REDIS6_URI") c, err := redis.DialURL(addr) if err != nil { @@ -246,7 +246,8 @@ func TestStreamsScanStreamGroups123(t *testing.T) { } for _, tst := range tsts { t.Run(tst.name, func(t *testing.T) { - scannedGroup, _ := scanStreamGroups(c, tst.stream) + scannedGroup, err := scanStreamGroups(c, tst.stream) + t.Logf("scanStreamGroups() err: %s", err) if err != nil { t.Fatalf("Err: %s", err) return @@ -255,26 +256,26 @@ func TestStreamsScanStreamGroups123(t *testing.T) { if len(scannedGroup) == len(tst.groups) { for i := range scannedGroup { if scannedGroup[i].Name != tst.groups[i].Name { - t.Errorf("%d) Group name mismatch.\nExpected: %#v;\nActual: %#v", i, tst.groups[i].Name, scannedGroup[i].Name) + t.Errorf("%d) Group name mismatch.\nExpected: %#v \nActual: %#v", i, tst.groups[i].Name, scannedGroup[i].Name) } if scannedGroup[i].Consumers != tst.groups[i].Consumers { - t.Errorf("%d) Consumers count mismatch.\nExpected: %#v;\nActual: %#v", i, tst.groups[i].Consumers, scannedGroup[i].Consumers) + t.Errorf("%d) Consumers count mismatch.\nExpected: %#v \nActual: %#v", i, tst.groups[i].Consumers, scannedGroup[i].Consumers) } if scannedGroup[i].Pending != tst.groups[i].Pending { - t.Errorf("%d) Pending items mismatch.\nExpected: %#v;\nActual: %#v", i, tst.groups[i].Pending, scannedGroup[i].Pending) + t.Errorf("%d) Pending items mismatch.\nExpected: %#v \nActual: %#v", i, tst.groups[i].Pending, scannedGroup[i].Pending) } if parseStreamItemId(scannedGroup[i].LastDeliveredId) != parseStreamItemId(tst.groups[i].LastDeliveredId) { - t.Errorf("%d) LastDeliveredId items mismatch.\nExpected: %#v;\nActual: %#v", i, tst.groups[i].LastDeliveredId, scannedGroup[i].LastDeliveredId) + t.Errorf("%d) LastDeliveredId items mismatch.\nExpected: %#v \nActual: %#v", i, tst.groups[i].LastDeliveredId, scannedGroup[i].LastDeliveredId) } if scannedGroup[i].Lag != tst.groups[i].Lag { - t.Errorf("%d) Lag mismatch.\nExpected: %#v;\nActual: %#v", i, tst.groups[i].Lag, scannedGroup[i].Lag) + t.Errorf("%d) Lag mismatch.\nExpected: %#v \nActual: %#v", i, tst.groups[i].Lag, scannedGroup[i].Lag) } if scannedGroup[i].EntriesRead != tst.groups[i].EntriesRead { - t.Errorf("%d) EntriesRead mismatch.\nExpected: %#v;\nActual: %#v", i, tst.groups[i].EntriesRead, scannedGroup[i].EntriesRead) + t.Errorf("%d) EntriesRead mismatch.\nExpected: %#v \nActual: %#v", i, tst.groups[i].EntriesRead, scannedGroup[i].EntriesRead) } } } else { - t.Errorf("Consumers entries mismatch.\nExpected: %d;\nActual: %d", len(tst.consumers), len(scannedGroup)) + t.Errorf("Consumers entries mismatch.\nExpected: %d\nActual: %d", len(tst.consumers), len(scannedGroup)) } }) } @@ -360,7 +361,8 @@ func TestStreamsScanStreamGroupsUsingValKey7(t *testing.T) { } for _, tst := range tsts { t.Run(tst.name, func(t *testing.T) { - scannedGroup, _ := scanStreamGroups(c, tst.stream) + scannedGroup, err := scanStreamGroups(c, tst.stream) + t.Logf("scanStreamGroups() err: %s", err) if err != nil { t.Errorf("Err: %s", err) } @@ -368,26 +370,26 @@ func TestStreamsScanStreamGroupsUsingValKey7(t *testing.T) { if len(scannedGroup) == len(tst.groups) { for i := range scannedGroup { if scannedGroup[i].Name != tst.groups[i].Name { - t.Errorf("Group name mismatch.\nExpected: %#v;\nActual: %#v", tst.groups[i].Name, scannedGroup[i].Name) + t.Errorf("Group name mismatch.\nExpected: %#v \nActual: %#v", tst.groups[i].Name, scannedGroup[i].Name) } if scannedGroup[i].Consumers != tst.groups[i].Consumers { - t.Errorf("Consumers count mismatch.\nExpected: %#v;\nActual: %#v", tst.groups[i].Consumers, scannedGroup[i].Consumers) + t.Errorf("Consumers count mismatch.\nExpected: %#v \nActual: %#v", tst.groups[i].Consumers, scannedGroup[i].Consumers) } if scannedGroup[i].Pending != tst.groups[i].Pending { - t.Errorf("Pending items mismatch.\nExpected: %#v;\nActual: %#v", tst.groups[i].Pending, scannedGroup[i].Pending) + t.Errorf("Pending items mismatch.\nExpected: %#v \nActual: %#v", tst.groups[i].Pending, scannedGroup[i].Pending) } if parseStreamItemId(scannedGroup[i].LastDeliveredId) != parseStreamItemId(tst.groups[i].LastDeliveredId) { - t.Errorf("LastDeliveredId items mismatch.\nExpected: %#v;\nActual: %#v", tst.groups[i].LastDeliveredId, scannedGroup[i].LastDeliveredId) + t.Errorf("LastDeliveredId items mismatch.\nExpected: %#v \nActual: %#v", tst.groups[i].LastDeliveredId, scannedGroup[i].LastDeliveredId) } if scannedGroup[i].Lag != tst.groups[i].Lag { - t.Errorf("Lag mismatch.\nExpected: %#v;\nActual: %#v", tst.groups[i].Lag, scannedGroup[i].Lag) + t.Errorf("Lag mismatch.\nExpected: %#v \nActual: %#v", tst.groups[i].Lag, scannedGroup[i].Lag) } if scannedGroup[i].EntriesRead != tst.groups[i].EntriesRead { - t.Errorf("EntriesRead mismatch.\nExpected: %#v;\nActual: %#v", tst.groups[i].EntriesRead, scannedGroup[i].EntriesRead) + t.Errorf("EntriesRead mismatch.\nExpected: %#v \nActual: %#v", tst.groups[i].EntriesRead, scannedGroup[i].EntriesRead) } } } else { - t.Errorf("Consumers entries mismatch.\nExpected: %d;\nActual: %d", len(tst.consumers), len(scannedGroup)) + t.Errorf("Consumers entries mismatch.\nExpected: %d\nActual: %d", len(tst.consumers), len(scannedGroup)) } }) } @@ -471,15 +473,15 @@ func TestStreamsScanStreamGroupsConsumers(t *testing.T) { if len(g.StreamGroupConsumersInfo) == len(tst.consumers) { for i := range g.StreamGroupConsumersInfo { if g.StreamGroupConsumersInfo[i].Name != tst.consumers[i].Name { - t.Errorf("Consumer name mismatch.\nExpected: %#v;\nActual: %#v", tst.consumers[i].Name, g.StreamGroupConsumersInfo[i].Name) + t.Errorf("Consumer name mismatch.\nExpected: %#v \nActual: %#v", tst.consumers[i].Name, g.StreamGroupConsumersInfo[i].Name) } if g.StreamGroupConsumersInfo[i].Pending != tst.consumers[i].Pending { - t.Errorf("Pending items mismatch for %s.\nExpected: %#v;\nActual: %#v", g.StreamGroupConsumersInfo[i].Name, tst.consumers[i].Pending, g.StreamGroupConsumersInfo[i].Pending) + t.Errorf("Pending items mismatch for %s.\nExpected: %#v \nActual: %#v", g.StreamGroupConsumersInfo[i].Name, tst.consumers[i].Pending, g.StreamGroupConsumersInfo[i].Pending) } } } else { - t.Errorf("Consumers entries mismatch.\nExpected: %d;\nActual: %d", len(tst.consumers), len(g.StreamGroupConsumersInfo)) + t.Errorf("Consumers entries mismatch.\nExpected: %d\nActual: %d", len(tst.consumers), len(g.StreamGroupConsumersInfo)) } }