github.com/Finschia/finschia-sdk@v0.48.1/codec/any_test.go (about) 1 package codec_test 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 8 "github.com/Finschia/finschia-sdk/codec" 9 "github.com/Finschia/finschia-sdk/codec/types" 10 codectypes "github.com/Finschia/finschia-sdk/codec/types" 11 "github.com/Finschia/finschia-sdk/crypto/keys/ed25519" 12 cryptotypes "github.com/Finschia/finschia-sdk/crypto/types" 13 "github.com/Finschia/finschia-sdk/simapp" 14 "github.com/Finschia/finschia-sdk/testutil/testdata" 15 ) 16 17 func NewTestInterfaceRegistry() types.InterfaceRegistry { 18 registry := types.NewInterfaceRegistry() 19 registry.RegisterInterface("Animal", (*testdata.Animal)(nil)) 20 registry.RegisterImplementations( 21 (*testdata.Animal)(nil), 22 &testdata.Dog{}, 23 &testdata.Cat{}, 24 ) 25 return registry 26 } 27 28 func TestMarshalAny(t *testing.T) { 29 registry := types.NewInterfaceRegistry() 30 31 cdc := codec.NewProtoCodec(registry) 32 33 kitty := &testdata.Cat{Moniker: "Kitty"} 34 bz, err := cdc.MarshalInterface(kitty) 35 require.NoError(t, err) 36 37 var animal testdata.Animal 38 39 // empty registry should fail 40 err = cdc.UnmarshalInterface(bz, &animal) 41 require.Error(t, err) 42 43 // wrong type registration should fail 44 registry.RegisterImplementations((*testdata.Animal)(nil), &testdata.Dog{}) 45 err = cdc.UnmarshalInterface(bz, &animal) 46 require.Error(t, err) 47 48 // should pass 49 registry = NewTestInterfaceRegistry() 50 cdc = codec.NewProtoCodec(registry) 51 err = cdc.UnmarshalInterface(bz, &animal) 52 require.NoError(t, err) 53 require.Equal(t, kitty, animal) 54 55 // nil should fail 56 registry = NewTestInterfaceRegistry() 57 err = cdc.UnmarshalInterface(bz, nil) 58 require.Error(t, err) 59 } 60 61 func TestMarshalProtoPubKey(t *testing.T) { 62 require := require.New(t) 63 ccfg := simapp.MakeTestEncodingConfig() 64 privKey := ed25519.GenPrivKey() 65 pk := privKey.PubKey() 66 67 // **** test JSON serialization **** 68 69 pkAny, err := codectypes.NewAnyWithValue(pk) 70 require.NoError(err) 71 bz, err := ccfg.Marshaler.MarshalJSON(pkAny) 72 require.NoError(err) 73 74 var pkAny2 codectypes.Any 75 err = ccfg.Marshaler.UnmarshalJSON(bz, &pkAny2) 76 require.NoError(err) 77 // Before getting a cached value we need to unpack it. 78 // Normally this happens in types which implement UnpackInterfaces 79 var pkI cryptotypes.PubKey 80 err = ccfg.InterfaceRegistry.UnpackAny(&pkAny2, &pkI) 81 require.NoError(err) 82 pk2 := pkAny2.GetCachedValue().(cryptotypes.PubKey) 83 require.True(pk2.Equals(pk)) 84 85 // **** test binary serialization **** 86 87 bz, err = ccfg.Marshaler.Marshal(pkAny) 88 require.NoError(err) 89 90 var pkAny3 codectypes.Any 91 err = ccfg.Marshaler.Unmarshal(bz, &pkAny3) 92 require.NoError(err) 93 err = ccfg.InterfaceRegistry.UnpackAny(&pkAny3, &pkI) 94 require.NoError(err) 95 pk3 := pkAny3.GetCachedValue().(cryptotypes.PubKey) 96 require.True(pk3.Equals(pk)) 97 } 98 99 // TestMarshalProtoInterfacePubKey tests PubKey marshaling using (Un)marshalInterface 100 // helper functions 101 func TestMarshalProtoInterfacePubKey(t *testing.T) { 102 require := require.New(t) 103 ccfg := simapp.MakeTestEncodingConfig() 104 privKey := ed25519.GenPrivKey() 105 pk := privKey.PubKey() 106 107 // **** test JSON serialization **** 108 109 bz, err := ccfg.Marshaler.MarshalInterfaceJSON(pk) 110 require.NoError(err) 111 112 var pk3 cryptotypes.PubKey 113 err = ccfg.Marshaler.UnmarshalInterfaceJSON(bz, &pk3) 114 require.NoError(err) 115 require.True(pk3.Equals(pk)) 116 117 // ** Check unmarshal using JSONCodec ** 118 // Unpacking won't work straightforward s Any type 119 // Any can't implement UnpackInterfacesMessage interface. So Any is not 120 // automatically unpacked and we won't get a value. 121 var pkAny codectypes.Any 122 err = ccfg.Marshaler.UnmarshalJSON(bz, &pkAny) 123 require.NoError(err) 124 ifc := pkAny.GetCachedValue() 125 require.Nil(ifc) 126 127 // **** test binary serialization **** 128 129 bz, err = ccfg.Marshaler.MarshalInterface(pk) 130 require.NoError(err) 131 132 var pk2 cryptotypes.PubKey 133 err = ccfg.Marshaler.UnmarshalInterface(bz, &pk2) 134 require.NoError(err) 135 require.True(pk2.Equals(pk)) 136 }