chore: migrate core to gogoproto.Message (#20781)

This commit is contained in:
Marko
2024-06-28 09:34:23 +00:00
committed by GitHub
parent 5d54274775
commit c7375f7cd3
27 changed files with 183 additions and 153 deletions
-3
View File
@@ -2,15 +2,12 @@ package appmodule
import (
gogoproto "github.com/cosmos/gogoproto/proto"
protov2 "google.golang.org/protobuf/proto"
)
type Message = gogoproto.Message
func messageName[M Message]() string {
switch m := any(*new(M)).(type) {
case protov2.Message:
return string(m.ProtoReflect().Descriptor().FullName())
case gogoproto.Message:
return gogoproto.MessageName(m)
default:
+2 -2
View File
@@ -4,7 +4,7 @@ package event
import (
"context"
"google.golang.org/protobuf/runtime/protoiface"
gogoproto "github.com/cosmos/gogoproto/proto"
)
// Service represents an event service which can retrieve and set an event manager in a context.
@@ -19,7 +19,7 @@ type Manager interface {
// Emit emits events represented as a protobuf message (as described in ADR 032).
//
// Callers SHOULD assume that these events will not be included in consensus.
Emit(event protoiface.MessageV1) error
Emit(event gogoproto.Message) error
// EmitKV emits an event based on an event and kv-pair attributes.
//
+1 -1
View File
@@ -6,7 +6,6 @@ require (
github.com/cosmos/gogoproto v1.5.0
github.com/stretchr/testify v1.9.0
google.golang.org/grpc v1.64.0
google.golang.org/protobuf v1.34.2
)
require (
@@ -20,6 +19,7 @@ require (
golang.org/x/sys v0.20.0 // indirect
golang.org/x/text v0.15.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
+3 -3
View File
@@ -1,7 +1,7 @@
package registry
import (
"google.golang.org/protobuf/runtime/protoiface"
gogoproto "github.com/cosmos/gogoproto/proto"
)
type InterfaceRegistrar interface {
@@ -14,12 +14,12 @@ type InterfaceRegistrar interface {
//
// Ex:
// registry.RegisterInterface("cosmos.base.v1beta1.Msg", (*sdk.Msg)(nil))
RegisterInterface(protoName string, iface interface{}, impls ...protoiface.MessageV1)
RegisterInterface(protoName string, iface interface{}, impls ...gogoproto.Message)
// RegisterImplementations registers impls as concrete implementations of
// the interface iface.
//
// Ex:
// registry.RegisterImplementations((*sdk.Msg)(nil), &MsgSend{}, &MsgMultiSend{})
RegisterImplementations(iface interface{}, impls ...protoiface.MessageV1)
RegisterImplementations(iface interface{}, impls ...gogoproto.Message)
}
+3 -3
View File
@@ -3,7 +3,7 @@ package router
import (
"context"
"google.golang.org/protobuf/runtime/protoiface"
gogoproto "github.com/cosmos/gogoproto/proto"
)
// Service is the interface that wraps the basic methods for a router.
@@ -12,7 +12,7 @@ type Service interface {
// CanInvoke returns an error if the given request cannot be invoked.
CanInvoke(ctx context.Context, typeURL string) error
// InvokeTyped execute a message or query. It should be used when the called knows the type of the response.
InvokeTyped(ctx context.Context, req, res protoiface.MessageV1) error
InvokeTyped(ctx context.Context, req, res gogoproto.Message) error
// InvokeUntyped execute a message or query. It should be used when the called doesn't know the type of the response.
InvokeUntyped(ctx context.Context, req protoiface.MessageV1) (res protoiface.MessageV1, err error)
InvokeUntyped(ctx context.Context, req gogoproto.Message) (res gogoproto.Message, err error)
}
+3 -3
View File
@@ -3,7 +3,7 @@ package coretesting
import (
"context"
"google.golang.org/protobuf/runtime/protoiface"
gogoproto "github.com/cosmos/gogoproto/proto"
"cosmossdk.io/core/event"
"cosmossdk.io/core/store"
@@ -15,7 +15,7 @@ func Context() context.Context {
dummy := &dummyCtx{
stores: map[string]store.KVStore{},
events: map[string][]event.Event{},
protoEvents: map[string][]protoiface.MessageV1{},
protoEvents: map[string][]gogoproto.Message{},
}
ctx := context.WithValue(context.Background(), dummyKey{}, dummy)
@@ -28,7 +28,7 @@ type dummyCtx struct {
// maps event emitted by the actor.
events map[string][]event.Event
// maps proto events emitted by the actor.
protoEvents map[string][]protoiface.MessageV1
protoEvents map[string][]gogoproto.Message
}
func unwrap(ctx context.Context) *dummyCtx {
+3 -3
View File
@@ -3,7 +3,7 @@ package coretesting
import (
"context"
"google.golang.org/protobuf/runtime/protoiface"
gogoproto "github.com/cosmos/gogoproto/proto"
"cosmossdk.io/core/event"
)
@@ -30,7 +30,7 @@ func (e MemEventsService) GetEvents(ctx context.Context) []event.Event {
return unwrap(ctx).events[e.moduleName]
}
func (e MemEventsService) GetProtoEvents(ctx context.Context) []protoiface.MessageV1 {
func (e MemEventsService) GetProtoEvents(ctx context.Context) []gogoproto.Message {
return unwrap(ctx).protoEvents[e.moduleName]
}
@@ -39,7 +39,7 @@ type eventManager struct {
ctx *dummyCtx
}
func (e eventManager) Emit(event protoiface.MessageV1) error {
func (e eventManager) Emit(event gogoproto.Message) error {
e.ctx.protoEvents[e.moduleName] = append(e.ctx.protoEvents[e.moduleName], event)
return nil
}
+21 -10
View File
@@ -1,11 +1,10 @@
package coretesting
import (
"reflect"
"testing"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/runtime/protoiface"
"google.golang.org/protobuf/types/known/wrapperspb"
gogotypes "github.com/cosmos/gogoproto/types"
"cosmossdk.io/core/event"
)
@@ -14,25 +13,37 @@ func TestEventsService(t *testing.T) {
ctx := Context()
es := EventsService(ctx, "auth")
wantProtoEvent := &wrapperspb.BoolValue{Value: true}
wantProtoEvent := &gogotypes.BoolValue{Value: true}
err := es.EventManager(ctx).Emit(wantProtoEvent)
require.NoError(t, err)
if err != nil {
t.Errorf("failed to emit proto event: %s", err)
}
wantEvent := event.NewEvent("new-account", event.Attribute{
Key: "number",
Value: "1",
})
err = es.EventManager(ctx).EmitKV(wantEvent.Type, wantEvent.Attributes...)
require.NoError(t, err)
if err != nil {
t.Errorf("failed to emit event: %s", err)
}
gotProtoEvents := es.GetProtoEvents(ctx)
require.Equal(t, []protoiface.MessageV1{wantProtoEvent}, gotProtoEvents)
if len(gotProtoEvents) != 1 || gotProtoEvents[0] != wantProtoEvent {
t.Errorf("unexpected proto events: got %v, want %v", gotProtoEvents, wantProtoEvent)
}
gotEvents := es.GetEvents(ctx)
require.Equal(t, []event.Event{wantEvent}, gotEvents)
if len(gotEvents) != 1 || !reflect.DeepEqual(gotEvents[0], wantEvent) {
t.Errorf("unexpected events: got %v, want %v", gotEvents, wantEvent)
}
// test reset
es = EventsService(ctx, "auth")
require.Nil(t, es.GetEvents(ctx))
require.Nil(t, es.GetProtoEvents(ctx))
if es.GetEvents(ctx) != nil {
t.Errorf("expected nil events after reset, got %v", es.GetEvents(ctx))
}
if es.GetProtoEvents(ctx) != nil {
t.Errorf("expected nil proto events after reset, got %v", es.GetProtoEvents(ctx))
}
}
+4 -6
View File
@@ -6,14 +6,12 @@ replace cosmossdk.io/core => ../
require (
cosmossdk.io/core v0.12.0
github.com/stretchr/testify v1.9.0
github.com/cosmos/gogoproto v1.5.0
github.com/tidwall/btree v1.7.0
google.golang.org/protobuf v1.34.2
)
require (
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/kr/text v0.2.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
github.com/google/go-cmp v0.6.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
google.golang.org/protobuf v1.34.2 // indirect
)
+6 -15
View File
@@ -1,20 +1,11 @@
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/cosmos/gogoproto v1.5.0 h1:SDVwzEqZDDBoslaeZg+dGE55hdzHfgUA40pEanMh52o=
github.com/cosmos/gogoproto v1.5.0/go.mod h1:iUM31aofn3ymidYG6bUR5ZFrk+Om8p5s754eMUcyp8I=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
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.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=
github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+64 -23
View File
@@ -1,11 +1,10 @@
package coretesting
import (
"bytes"
"fmt"
"testing"
"github.com/stretchr/testify/require"
"cosmossdk.io/core/store"
)
@@ -13,47 +12,89 @@ func TestMemDB(t *testing.T) {
var db store.KVStore = NewMemKV()
key, value := []byte("key"), []byte("value")
require.NoError(t, db.Set(key, value))
if err := db.Set(key, value); err != nil {
t.Errorf("Error setting value: %s", err)
}
val, err := db.Get(key)
require.NoError(t, err)
require.Equal(t, value, val)
require.NoError(t, db.Delete(key))
if err != nil {
t.Errorf("Error getting value: %s", err)
}
if !bytes.Equal(value, val) {
t.Errorf("Expected value %s, got %s", value, val)
}
if err := db.Delete(key); err != nil {
t.Errorf("Error deleting value: %s", err)
}
has, err := db.Has(key)
require.NoError(t, err)
require.False(t, has)
if err != nil {
t.Errorf("Error checking if key exists: %s", err)
}
if has {
t.Errorf("Expected key to be deleted, but it still exists")
}
// test iter
makeKey := func(i int) []byte {
return []byte(fmt.Sprintf("key_%d", i))
}
for i := 0; i < 10; i++ {
require.NoError(t, db.Set(makeKey(i), makeKey(i)))
if err := db.Set(makeKey(i), makeKey(i)); err != nil {
t.Errorf("Error setting value: %s", err)
}
}
iter, err := db.Iterator(nil, nil)
require.NoError(t, err)
if err != nil {
t.Errorf("Error creating iterator: %s", err)
}
key = iter.Key()
value = iter.Value()
require.Equal(t, makeKey(0), key)
require.Equal(t, makeKey(0), value)
require.NoError(t, iter.Error())
if !bytes.Equal(makeKey(0), key) {
t.Errorf("Expected key %s, got %s", makeKey(0), key)
}
if !bytes.Equal(makeKey(0), value) {
t.Errorf("Expected value %s, got %s", makeKey(0), value)
}
if err := iter.Error(); err != nil {
t.Errorf("Iterator error: %s", err)
}
iter.Next()
key, value = iter.Key(), iter.Value()
require.Equal(t, makeKey(1), key)
require.Equal(t, makeKey(1), value)
require.NoError(t, iter.Close())
if !bytes.Equal(makeKey(1), key) {
t.Errorf("Expected key %s, got %s", makeKey(1), key)
}
if !bytes.Equal(makeKey(1), value) {
t.Errorf("Expected value %s, got %s", makeKey(1), value)
}
if err := iter.Close(); err != nil {
t.Errorf("Error closing iterator: %s", err)
}
// test reverse iter
iter, err = db.ReverseIterator(nil, nil)
require.NoError(t, err)
if err != nil {
t.Errorf("Error creating reverse iterator: %s", err)
}
key = iter.Key()
value = iter.Value()
require.Equal(t, makeKey(9), key)
require.Equal(t, makeKey(9), value)
require.NoError(t, iter.Error())
if !bytes.Equal(makeKey(9), key) {
t.Errorf("Expected key %s, got %s", makeKey(9), key)
}
if !bytes.Equal(makeKey(9), value) {
t.Errorf("Expected value %s, got %s", makeKey(9), value)
}
if err := iter.Error(); err != nil {
t.Errorf("Iterator error: %s", err)
}
iter.Next()
key, value = iter.Key(), iter.Value()
require.Equal(t, makeKey(8), key)
require.Equal(t, makeKey(8), value)
require.NoError(t, iter.Close())
if !bytes.Equal(makeKey(8), key) {
t.Errorf("Expected key %s, got %s", makeKey(8), key)
}
if !bytes.Equal(makeKey(8), value) {
t.Errorf("Expected value %s, got %s", makeKey(8), value)
}
if err := iter.Close(); err != nil {
t.Errorf("Error closing iterator: %s", err)
}
}
+21 -9
View File
@@ -3,8 +3,6 @@ package coretesting
import (
"context"
"testing"
"github.com/stretchr/testify/require"
)
func TestKVStoreService(t *testing.T) {
@@ -13,23 +11,37 @@ func TestKVStoreService(t *testing.T) {
// must panic
t.Run("must panic on invalid ctx", func(t *testing.T) {
require.Panics(t, func() {
svc1.OpenKVStore(context.Background())
})
defer func() {
if r := recover(); r == nil {
t.Errorf("expected panic, but got none")
}
}()
svc1.OpenKVStore(context.Background())
})
t.Run("success", func(t *testing.T) {
kv := svc1.OpenKVStore(ctx)
require.NoError(t, kv.Set([]byte("key"), []byte("value")))
err := kv.Set([]byte("key"), []byte("value"))
if err != nil {
t.Errorf("failed to set value: %v", err)
}
value, err := kv.Get([]byte("key"))
require.NoError(t, err)
require.Equal(t, []byte("value"), value)
if err != nil {
t.Errorf("failed to get value: %v", err)
}
if string(value) != "value" {
t.Errorf("expected value 'value', but got '%s'", string(value))
}
})
t.Run("contains module name", func(t *testing.T) {
KVStoreService(ctx, "auth")
_, ok := unwrap(ctx).stores["auth"]
require.True(t, ok)
if !ok {
t.Errorf("expected store 'auth' to exist, but it doesn't")
}
})
}