From 59ee051789074e48e0b422516bd76c6983f308d9 Mon Sep 17 00:00:00 2001 From: Valery Piashchynski Date: Mon, 25 May 2026 10:05:02 +0200 Subject: [PATCH 1/3] chore(tests): migrate from goridge rpc to connectrpc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace net/rpc + goridge/v4/pkg/rpc codec with the generated kvV2connect client, matching the memcached/jobs reference. The rpc plugin now serves Connect/HTTP-2 endpoints; clients dial over h2c on the same TCP socket. - bump goridge/v4 beta.1 → beta.2 (transitive only; no direct dep) - bump api-go/v6 beta.4 → beta.12 (introduces kvV2connect) - bump rpc/v6 beta.3 → beta.4 (connectrpc-serving counterpart) - add connectrpc.com/connect v1.20.0 + golang.org/x/net for http2 - modernize 4× WaitGroup spawn to wg.Go (Go 1.25+) --- go.mod | 2 +- go.sum | 2 + tests/go.mod | 14 ++- tests/go.sum | 28 +++-- tests/storage_plugin_test.go | 227 ++++++++++++----------------------- 5 files changed, 110 insertions(+), 163 deletions(-) diff --git a/go.mod b/go.mod index 627c950..9b19505 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/roadrunner-server/endure/v2 v2.6.2 github.com/roadrunner-server/errors v1.5.0 go.opentelemetry.io/otel/sdk v1.43.0 - golang.org/x/sys v0.44.0 + golang.org/x/sys v0.45.0 ) exclude github.com/redis/go-redis/v9 v9.15.0 diff --git a/go.sum b/go.sum index 9284506..58e7f8a 100644 --- a/go.sum +++ b/go.sum @@ -69,6 +69,8 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/tests/go.mod b/tests/go.mod index 5c01b5e..e6c3ee0 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -2,25 +2,27 @@ module tests go 1.26 -toolchain go1.26.0 +toolchain go1.26.3 require ( - github.com/roadrunner-server/api-go/v6 v6.0.0-beta.4 + connectrpc.com/connect v1.20.0 + github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12 github.com/roadrunner-server/config/v6 v6.0.0-beta.3 github.com/roadrunner-server/endure/v2 v2.6.2 - github.com/roadrunner-server/goridge/v4 v4.0.0-beta.1 github.com/roadrunner-server/kv/v6 v6.0.0-beta.4 github.com/roadrunner-server/logger/v6 v6.0.0-beta.3 github.com/roadrunner-server/metrics/v6 v6.0.0-beta.3 github.com/roadrunner-server/redis/v6 v6.0.0 - github.com/roadrunner-server/rpc/v6 v6.0.0-beta.3 + github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4 github.com/stretchr/testify v1.11.1 + golang.org/x/net v0.55.0 google.golang.org/protobuf v1.36.11 ) replace github.com/roadrunner-server/redis/v6 => ../ require ( + connectrpc.com/grpcreflect v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -63,7 +65,9 @@ require ( go.uber.org/zap v1.28.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/sys v0.44.0 // indirect + golang.org/x/sys v0.45.0 // indirect golang.org/x/text v0.37.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 // indirect + google.golang.org/grpc v1.81.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/tests/go.sum b/tests/go.sum index 05f7d28..e05b3c0 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -1,3 +1,7 @@ +connectrpc.com/connect v1.20.0 h1:6TNDAB+WeNd2uolWNlYczB5E0KNNaVMNUEx8JEUsPmQ= +connectrpc.com/connect v1.20.0/go.mod h1:A2ygJrukXwWy32vkCAAHNVguZrqZ+jeZ9rGRnGR4dN4= +connectrpc.com/grpcreflect v1.3.0 h1:Y4V+ACf8/vOb1XOc251Qun7jMB75gCUNw6llvB9csXc= +connectrpc.com/grpcreflect v1.3.0/go.mod h1:nfloOtCS8VUQOQ1+GTdFzVg2CJo4ZGaat8JIovCtDYs= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= @@ -21,6 +25,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -63,8 +69,8 @@ github.com/redis/go-redis/extra/redisprometheus/v9 v9.19.0 h1:UR881cjhqmoYR+W3pH github.com/redis/go-redis/extra/redisprometheus/v9 v9.19.0/go.mod h1:Jy984kW8Yb81ZHHMIhIlg9S6Kl2260vkmWU0IWOzs30= github.com/redis/go-redis/v9 v9.19.0 h1:XPVaaPSnG6RhYf7p+rmSa9zZfeVAnWsH5h3lxthOm/k= github.com/redis/go-redis/v9 v9.19.0/go.mod h1:v/M13XI1PVCDcm01VtPFOADfZtHf8YW3baQf57KlIkA= -github.com/roadrunner-server/api-go/v6 v6.0.0-beta.4 h1:wX8IezPUeeBJzlzaBEFSZBE5Bc/Le1Uf/GdFRdFO3HQ= -github.com/roadrunner-server/api-go/v6 v6.0.0-beta.4/go.mod h1:jI30i64yCAxJh7KHc8e1B8NgDcvcnSTI1OIK8lTE+Y0= +github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12 h1:FcRcCvW9OfQvH45SFsI21VoHpOOov56OvOSnO4UKvXs= +github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12/go.mod h1:prGWJ2GoF5YD5PIG7Tb6VKulU3bWoFwr9DCwgxheb80= github.com/roadrunner-server/api-plugins/v6 v6.0.0-beta.2 h1:GqsZzWQ5jMXRF1O/b8IqFz9PLpS7Ui0K4OyACLql2MI= github.com/roadrunner-server/api-plugins/v6 v6.0.0-beta.2/go.mod h1:2v4yUK5Kvbvq8C3IkDoBkuamq9h+7i/JLjyf7k1j5JM= github.com/roadrunner-server/config/v6 v6.0.0-beta.3 h1:G0EUzJ6Yw4UnleM6BhnOBbYPXKDHRmCJiGhC3nXDBwI= @@ -73,16 +79,14 @@ github.com/roadrunner-server/endure/v2 v2.6.2 h1:sIB4kTyE7gtT3fDhuYWUYn6Vt/dcPti github.com/roadrunner-server/endure/v2 v2.6.2/go.mod h1:t/2+xpNYgGBwhzn83y2MDhvhZ19UVq1REcvqn7j7RB8= github.com/roadrunner-server/errors v1.5.0 h1:unG7LKIZrSzkCCF3YLRLA5VyqE0KKomofXVJUXJe00g= github.com/roadrunner-server/errors v1.5.0/go.mod h1:g9fo/T2C13cWRDR9PW1r0ZAOSQfNhWAZawyfkGiaHuI= -github.com/roadrunner-server/goridge/v4 v4.0.0-beta.1 h1:dO1wKnuMr4xMmH6DY2ZaZ6FWS+Vo50+C7fuAcyO/xBk= -github.com/roadrunner-server/goridge/v4 v4.0.0-beta.1/go.mod h1:+gKla9HAyYlk0TsC9VktwtOL63aimsWT3oPsuCLh4/o= github.com/roadrunner-server/kv/v6 v6.0.0-beta.4 h1:1AfYzkmDgIKNOUKu1D3E0aRSjYblCjXhbG2N4WLge0o= github.com/roadrunner-server/kv/v6 v6.0.0-beta.4/go.mod h1:s8RkJpMWb+e/D/nDY30/Oi5ItEDSi8t9SOeZ6T74fUQ= github.com/roadrunner-server/logger/v6 v6.0.0-beta.3 h1:eoJKXAUSyykDfVX6eTUhmAn6Y8pS/LyI5fDP4H+G5rQ= github.com/roadrunner-server/logger/v6 v6.0.0-beta.3/go.mod h1:MwHb3AbltHYtu7nRpml5NeYu7O+W8rCpDBeNTTEoE1M= github.com/roadrunner-server/metrics/v6 v6.0.0-beta.3 h1:Pp/IrZvdhNrm5oqYn6qS61htc9s9UtVWqGfxSm88XKs= github.com/roadrunner-server/metrics/v6 v6.0.0-beta.3/go.mod h1:2sDziqyl3sW2kioinYl/gk5pMqWL0ozrq7L76wYZtgg= -github.com/roadrunner-server/rpc/v6 v6.0.0-beta.3 h1:hvVEDIMB9MKI8uWX++MrBzHRzq404ygU0fDs6U2V/3Y= -github.com/roadrunner-server/rpc/v6 v6.0.0-beta.3/go.mod h1:BpDpd2/UceDdsDJNP0iMfmegbXthxiZM4MU6GOJoSXo= +github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4 h1:Qj2nrHIWOHE9Tys+FBG2IdoPtzgIUh6juQ5wXLGGDMw= +github.com/roadrunner-server/rpc/v6 v6.0.0-beta.4/go.mod h1:k5KT3fpnJVd27m0HbGGBiTPXlWI6eJdd6C+ohp5IE0U= github.com/roadrunner-server/tcplisten v1.5.2 h1:nn8yXYrhRDkfQ9AAu4V075uT4fZRmOnpxkawgE+bWPA= github.com/roadrunner-server/tcplisten v1.5.2/go.mod h1:DufGBz7Dlx2KrNe/4RukEvGMTqZKB0Uve1GztwcyyR8= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -131,10 +135,18 @@ go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 h1:seT2EwLWM78plQ7wcDfuWBc/4FAEAXDDiaSol4ku4qo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/tests/storage_plugin_test.go b/tests/storage_plugin_test.go index 7222b84..894cdfd 100644 --- a/tests/storage_plugin_test.go +++ b/tests/storage_plugin_test.go @@ -1,11 +1,12 @@ package kv import ( + "context" + "crypto/tls" "io" "log/slog" "net" "net/http" - "net/rpc" "os" "os/signal" "sync" @@ -13,19 +14,33 @@ import ( "testing" "time" + "connectrpc.com/connect" kvProto "github.com/roadrunner-server/api-go/v6/kv/v2" + "github.com/roadrunner-server/api-go/v6/kv/v2/kvV2connect" "github.com/roadrunner-server/config/v6" "github.com/roadrunner-server/endure/v2" - goridgeRpc "github.com/roadrunner-server/goridge/v4/pkg/rpc" "github.com/roadrunner-server/kv/v6" "github.com/roadrunner-server/logger/v6" "github.com/roadrunner-server/metrics/v6" "github.com/roadrunner-server/redis/v6" rpcPlugin "github.com/roadrunner-server/rpc/v6" "github.com/stretchr/testify/assert" + "golang.org/x/net/http2" "google.golang.org/protobuf/types/known/durationpb" ) +func newKVClient(t *testing.T, address string) kvV2connect.KvServiceClient { + t.Helper() + httpc := &http.Client{Transport: &http2.Transport{ + AllowHTTP: true, + DialTLSContext: func(ctx context.Context, network, addr string, _ *tls.Config) (net.Conn, error) { + return new(net.Dialer).DialContext(ctx, network, addr) + }, + }} + t.Cleanup(httpc.CloseIdleConnections) + return kvV2connect.NewKvServiceClient(httpc, "http://"+address) +} + func TestRedis(t *testing.T) { cont := endure.New(slog.LevelDebug) @@ -55,12 +70,10 @@ func TestRedis(t *testing.T) { signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) wg := &sync.WaitGroup{} - wg.Add(1) stopCh := make(chan struct{}, 1) - go func() { - defer wg.Done() + wg.Go(func() { for { select { case e := <-ch: @@ -84,7 +97,7 @@ func TestRedis(t *testing.T) { return } } - }() + }) time.Sleep(time.Second * 1) t.Run("REDIS", testRPCMethodsRedis("127.0.0.1:6001")) @@ -121,12 +134,10 @@ func TestRedisGlobalSection(t *testing.T) { signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) wg := &sync.WaitGroup{} - wg.Add(1) stopCh := make(chan struct{}, 1) - go func() { - defer wg.Done() + wg.Go(func() { for { select { case e := <-ch: @@ -150,7 +161,7 @@ func TestRedisGlobalSection(t *testing.T) { return } } - }() + }) time.Sleep(time.Second * 1) t.Run("REDIS", testRPCMethodsRedis("127.0.0.1:6001")) @@ -214,12 +225,10 @@ func TestRedisTLS(t *testing.T) { signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) wg := &sync.WaitGroup{} - wg.Add(1) stopCh := make(chan struct{}, 1) - go func() { - defer wg.Done() + wg.Go(func() { for { select { case e := <-ch: @@ -243,7 +252,7 @@ func TestRedisTLS(t *testing.T) { return } } - }() + }) time.Sleep(time.Second * 1) t.Run("REDIS-TLS", testRPCMethodsRedis("127.0.0.1:6002")) @@ -281,12 +290,10 @@ func TestRedisMetrics(t *testing.T) { signal.Notify(sig, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) wg := &sync.WaitGroup{} - wg.Add(1) stopCh := make(chan struct{}, 1) - go func() { - defer wg.Done() + wg.Go(func() { for { select { case e := <-ch: @@ -310,7 +317,7 @@ func TestRedisMetrics(t *testing.T) { return } } - }() + }) time.Sleep(time.Second * 1) t.Run("REDIS", testRPCMethodsRedis("127.0.0.1:6001")) @@ -332,201 +339,123 @@ func TestRedisMetrics(t *testing.T) { func testRPCMethodsRedis(addr string) func(t *testing.T) { return func(t *testing.T) { - conn, err := net.Dial("tcp", addr) - assert.NoError(t, err) - client := rpc.NewClientWithCodec(goridgeRpc.NewClientCodec(conn)) + const storage = "redis-rr" + + client := newKVClient(t, addr) + ctx := t.Context() - // add 5 second ttl tt := durationpb.New(time.Second * 5) keys := &kvProto.KvRequest{ - Storage: "redis-rr", + Storage: storage, Items: []*kvProto.KvItem{ - { - Key: "a", - }, - { - Key: "b", - }, - { - Key: "c", - }, + {Key: "a"}, + {Key: "b"}, + {Key: "c"}, }, } data := &kvProto.KvRequest{ - Storage: "redis-rr", + Storage: storage, Items: []*kvProto.KvItem{ - { - Key: "a", - Value: []byte("aa"), - }, - { - Key: "b", - Value: []byte("bb"), - }, - { - Key: "c", - Value: []byte("cc"), - Ttl: tt, - }, - { - Key: "d", - Value: []byte("dd"), - }, - { - Key: "e", - Value: []byte("ee"), - }, + {Key: "a", Value: []byte("aa")}, + {Key: "b", Value: []byte("bb")}, + {Key: "c", Value: []byte("cc"), Ttl: tt}, + {Key: "d", Value: []byte("dd")}, + {Key: "e", Value: []byte("ee")}, }, } - ret := &kvProto.KvResponse{} - // Register 3 keys with values - err = client.Call("kv.Set", data, ret) + _, err := client.Set(ctx, connect.NewRequest(data)) assert.NoError(t, err) - ret = &kvProto.KvResponse{} - err = client.Call("kv.Has", keys, ret) + resp, err := client.Has(ctx, connect.NewRequest(keys)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 3) // should be 3 + assert.Len(t, resp.Msg.GetItems(), 3) // key "c" should be deleted time.Sleep(time.Second * 7) - ret = &kvProto.KvResponse{} - err = client.Call("kv.Has", keys, ret) + resp, err = client.Has(ctx, connect.NewRequest(keys)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 2) // should be 2 + assert.Len(t, resp.Msg.GetItems(), 2) - ret = &kvProto.KvResponse{} - err = client.Call("kv.MGet", keys, ret) + resp, err = client.MGet(ctx, connect.NewRequest(keys)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 2) // c is expired + assert.Len(t, resp.Msg.GetItems(), 2) // c is expired tt2 := durationpb.New(time.Second * 10) data2 := &kvProto.KvRequest{ - Storage: "redis-rr", + Storage: storage, Items: []*kvProto.KvItem{ - { - Key: "a", - Ttl: tt2, - }, - { - Key: "b", - Ttl: tt2, - }, - { - Key: "d", - Ttl: tt2, - }, + {Key: "a", Ttl: tt2}, + {Key: "b", Ttl: tt2}, + {Key: "d", Ttl: tt2}, }, } - // MEXPIRE - ret = &kvProto.KvResponse{} - err = client.Call("kv.MExpire", data2, ret) + _, err = client.MExpire(ctx, connect.NewRequest(data2)) assert.NoError(t, err) - // TTL keys2 := &kvProto.KvRequest{ - Storage: "redis-rr", + Storage: storage, Items: []*kvProto.KvItem{ - { - Key: "a", - }, - { - Key: "b", - }, - { - Key: "d", - }, + {Key: "a"}, + {Key: "b"}, + {Key: "d"}, }, } - ret = &kvProto.KvResponse{} - err = client.Call("kv.TTL", keys2, ret) + resp, err = client.TTL(ctx, connect.NewRequest(keys2)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 3) + assert.Len(t, resp.Msg.GetItems(), 3) // HAS AFTER TTL time.Sleep(time.Second * 15) - ret = &kvProto.KvResponse{} - err = client.Call("kv.Has", keys2, ret) + resp, err = client.Has(ctx, connect.NewRequest(keys2)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 0) + assert.Empty(t, resp.Msg.GetItems()) - ret = &kvProto.KvResponse{} - err = client.Call("kv.TTL", keys2, ret) + resp, err = client.TTL(ctx, connect.NewRequest(keys2)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 0) + assert.Empty(t, resp.Msg.GetItems()) - // DELETE keysDel := &kvProto.KvRequest{ - Storage: "redis-rr", - Items: []*kvProto.KvItem{ - { - Key: "e", - }, - }, + Storage: storage, + Items: []*kvProto.KvItem{{Key: "e"}}, } - ret = &kvProto.KvResponse{} - err = client.Call("kv.Delete", keysDel, ret) + _, err = client.Delete(ctx, connect.NewRequest(keysDel)) assert.NoError(t, err) - // HAS AFTER DELETE - ret = &kvProto.KvResponse{} - err = client.Call("kv.Has", keysDel, ret) + resp, err = client.Has(ctx, connect.NewRequest(keysDel)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 0) + assert.Empty(t, resp.Msg.GetItems()) dataClear := &kvProto.KvRequest{ - Storage: "redis-rr", + Storage: storage, Items: []*kvProto.KvItem{ - { - Key: "a", - Value: []byte("aa"), - }, - { - Key: "b", - Value: []byte("bb"), - }, - { - Key: "c", - Value: []byte("cc"), - }, - { - Key: "d", - Value: []byte("dd"), - }, - { - Key: "e", - Value: []byte("ee"), - }, + {Key: "a", Value: []byte("aa")}, + {Key: "b", Value: []byte("bb")}, + {Key: "c", Value: []byte("cc")}, + {Key: "d", Value: []byte("dd")}, + {Key: "e", Value: []byte("ee")}, }, } - clr := &kvProto.KvRequest{Storage: "redis-rr"} - - ret = &kvProto.KvResponse{} - // Register 3 keys with values - err = client.Call("kv.Set", dataClear, ret) + _, err = client.Set(ctx, connect.NewRequest(dataClear)) assert.NoError(t, err) - ret = &kvProto.KvResponse{} - err = client.Call("kv.Has", dataClear, ret) + resp, err = client.Has(ctx, connect.NewRequest(dataClear)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 5) // should be 5 + assert.Len(t, resp.Msg.GetItems(), 5) - ret = &kvProto.KvResponse{} - err = client.Call("kv.Clear", clr, ret) + _, err = client.Clear(ctx, connect.NewRequest(&kvProto.KvRequest{Storage: storage})) assert.NoError(t, err) - ret = &kvProto.KvResponse{} - err = client.Call("kv.Has", dataClear, ret) + resp, err = client.Has(ctx, connect.NewRequest(dataClear)) assert.NoError(t, err) - assert.Len(t, ret.GetItems(), 0) // should be 5 + assert.Empty(t, resp.Msg.GetItems()) } } From 3ee1c64bf4de3e57c6a683e20228e465a6cf70ca Mon Sep 17 00:00:00 2001 From: Valery Piashchynski Date: Mon, 25 May 2026 10:35:21 +0200 Subject: [PATCH 2/3] fix(tests): replace http.Get with NewRequestWithContext (noctx) --- tests/storage_plugin_test.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/storage_plugin_test.go b/tests/storage_plugin_test.go index 894cdfd..87c70f0 100644 --- a/tests/storage_plugin_test.go +++ b/tests/storage_plugin_test.go @@ -460,20 +460,23 @@ func testRPCMethodsRedis(addr string) func(t *testing.T) { } func get(address string) (string, error) { - r, err := http.Get(address) //nolint:gosec + req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, address, nil) if err != nil { return "", err } - b, err := io.ReadAll(r.Body) + r, err := http.DefaultClient.Do(req) if err != nil { return "", err } - err = r.Body.Close() + b, err := io.ReadAll(r.Body) if err != nil { return "", err } - // unsafe - return string(b), err + + if err := r.Body.Close(); err != nil { + return "", err + } + return string(b), nil } From 2c9724899fcf3176e6865609ae81c9adbe11c54f Mon Sep 17 00:00:00 2001 From: Valery Piashchynski Date: Mon, 25 May 2026 11:02:56 +0200 Subject: [PATCH 3/3] fix(tests): bump kv to beta.5 for Connect-RPC handler + bump toolchain + PHP 8.5 --- .github/workflows/linux.yml | 2 +- go.mod | 2 +- go.sum | 2 -- tests/go.mod | 2 +- tests/go.sum | 4 ++-- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 8df40ba..4cced93 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -17,7 +17,7 @@ jobs: timeout-minutes: 60 strategy: matrix: - php: [ "8.4" ] + php: [ "8.5" ] go: [ stable ] os: [ "ubuntu-latest" ] diff --git a/go.mod b/go.mod index 9b19505..8b12d79 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/roadrunner-server/redis/v6 go 1.26 -toolchain go1.26.0 +toolchain go1.26.3 require ( github.com/prometheus/client_golang v1.23.2 diff --git a/go.sum b/go.sum index 58e7f8a..67e700e 100644 --- a/go.sum +++ b/go.sum @@ -67,8 +67,6 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= -golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= -golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= diff --git a/tests/go.mod b/tests/go.mod index e6c3ee0..0079559 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -9,7 +9,7 @@ require ( github.com/roadrunner-server/api-go/v6 v6.0.0-beta.12 github.com/roadrunner-server/config/v6 v6.0.0-beta.3 github.com/roadrunner-server/endure/v2 v2.6.2 - github.com/roadrunner-server/kv/v6 v6.0.0-beta.4 + github.com/roadrunner-server/kv/v6 v6.0.0-beta.5 github.com/roadrunner-server/logger/v6 v6.0.0-beta.3 github.com/roadrunner-server/metrics/v6 v6.0.0-beta.3 github.com/roadrunner-server/redis/v6 v6.0.0 diff --git a/tests/go.sum b/tests/go.sum index e05b3c0..5411ebe 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -79,8 +79,8 @@ github.com/roadrunner-server/endure/v2 v2.6.2 h1:sIB4kTyE7gtT3fDhuYWUYn6Vt/dcPti github.com/roadrunner-server/endure/v2 v2.6.2/go.mod h1:t/2+xpNYgGBwhzn83y2MDhvhZ19UVq1REcvqn7j7RB8= github.com/roadrunner-server/errors v1.5.0 h1:unG7LKIZrSzkCCF3YLRLA5VyqE0KKomofXVJUXJe00g= github.com/roadrunner-server/errors v1.5.0/go.mod h1:g9fo/T2C13cWRDR9PW1r0ZAOSQfNhWAZawyfkGiaHuI= -github.com/roadrunner-server/kv/v6 v6.0.0-beta.4 h1:1AfYzkmDgIKNOUKu1D3E0aRSjYblCjXhbG2N4WLge0o= -github.com/roadrunner-server/kv/v6 v6.0.0-beta.4/go.mod h1:s8RkJpMWb+e/D/nDY30/Oi5ItEDSi8t9SOeZ6T74fUQ= +github.com/roadrunner-server/kv/v6 v6.0.0-beta.5 h1:/Da5S0H72t1F/pzmgweT1rpZLREXOq8X7coIONEy/qY= +github.com/roadrunner-server/kv/v6 v6.0.0-beta.5/go.mod h1:OnALpec1My3YPZuV6/bawaGp8QdqY0M7M7rmoVeuYu0= github.com/roadrunner-server/logger/v6 v6.0.0-beta.3 h1:eoJKXAUSyykDfVX6eTUhmAn6Y8pS/LyI5fDP4H+G5rQ= github.com/roadrunner-server/logger/v6 v6.0.0-beta.3/go.mod h1:MwHb3AbltHYtu7nRpml5NeYu7O+W8rCpDBeNTTEoE1M= github.com/roadrunner-server/metrics/v6 v6.0.0-beta.3 h1:Pp/IrZvdhNrm5oqYn6qS61htc9s9UtVWqGfxSm88XKs=