github.com/hamba/avro/v2@v2.22.1-0.20240518180522-aff3955acf7d/codec_marshaler_test.go (about) 1 package avro_test 2 3 import ( 4 "bytes" 5 "errors" 6 "testing" 7 "time" 8 9 "github.com/hamba/avro/v2" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestDecoder_TextUnmarshalerPtr(t *testing.T) { 15 defer ConfigTeardown() 16 17 data := []byte{0x28, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x30, 0x31, 0x2d, 0x30, 0x32, 0x54, 0x30, 0x33, 0x3a, 0x30, 0x34, 0x3a, 0x30, 0x35, 0x5a} 18 schema := "string" 19 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 20 require.NoError(t, err) 21 22 var ts TestTimestampPtr 23 err = dec.Decode(&ts) 24 25 require.NoError(t, err) 26 want := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC)) 27 assert.Equal(t, want, ts) 28 } 29 30 func TestDecoder_TextUnmarshalerPtrPtr(t *testing.T) { 31 defer ConfigTeardown() 32 33 data := []byte{0x28, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x30, 0x31, 0x2d, 0x30, 0x32, 0x54, 0x30, 0x33, 0x3a, 0x30, 0x34, 0x3a, 0x30, 0x35, 0x5a} 34 schema := "string" 35 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 36 require.NoError(t, err) 37 38 var ts *TestTimestampPtr 39 err = dec.Decode(&ts) 40 41 require.NoError(t, err) 42 assert.NotNil(t, ts) 43 want := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC)) 44 assert.Equal(t, want, *ts) 45 } 46 47 func TestDecoder_TextUnmarshalerError(t *testing.T) { 48 defer ConfigTeardown() 49 50 data := []byte{0x28, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x30, 0x31, 0x2d, 0x30, 0x32, 0x54, 0x30, 0x33, 0x3a, 0x30, 0x34, 0x3a, 0x30, 0x35, 0x5a} 51 schema := "string" 52 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 53 require.NoError(t, err) 54 55 var ts *TestTimestampError 56 err = dec.Decode(&ts) 57 58 assert.Error(t, err) 59 } 60 61 func TestEncoder_TextMarshaler(t *testing.T) { 62 defer ConfigTeardown() 63 64 schema := "string" 65 buf := bytes.NewBuffer([]byte{}) 66 enc, err := avro.NewEncoder(schema, buf) 67 require.NoError(t, err) 68 ts := TestTimestamp(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC)) 69 70 err = enc.Encode(ts) 71 72 require.NoError(t, err) 73 assert.Equal(t, []byte{0x28, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x30, 0x31, 0x2d, 0x30, 0x32, 0x54, 0x30, 0x33, 0x3a, 0x30, 0x34, 0x3a, 0x30, 0x35, 0x5a}, buf.Bytes()) 74 } 75 76 func TestEncoder_TextMarshalerPtr(t *testing.T) { 77 defer ConfigTeardown() 78 79 schema := "string" 80 buf := bytes.NewBuffer([]byte{}) 81 enc, err := avro.NewEncoder(schema, buf) 82 require.NoError(t, err) 83 ts := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC)) 84 85 err = enc.Encode(&ts) 86 87 require.NoError(t, err) 88 assert.Equal(t, []byte{0x28, 0x32, 0x30, 0x32, 0x30, 0x2d, 0x30, 0x31, 0x2d, 0x30, 0x32, 0x54, 0x30, 0x33, 0x3a, 0x30, 0x34, 0x3a, 0x30, 0x35, 0x5a}, buf.Bytes()) 89 } 90 91 func TestEncoder_TextMarshalerPtrNil(t *testing.T) { 92 defer ConfigTeardown() 93 94 schema := "string" 95 buf := bytes.NewBuffer([]byte{}) 96 enc, err := avro.NewEncoder(schema, buf) 97 require.NoError(t, err) 98 var ts *TestTimestampPtr 99 100 err = enc.Encode(ts) 101 102 require.NoError(t, err) 103 assert.Equal(t, []byte{0x00}, buf.Bytes()) 104 } 105 106 func TestEncoder_TextMarshalerError(t *testing.T) { 107 defer ConfigTeardown() 108 109 schema := "string" 110 buf := bytes.NewBuffer([]byte{}) 111 enc, err := avro.NewEncoder(schema, buf) 112 require.NoError(t, err) 113 ts := TestTimestampError{} 114 115 err = enc.Encode(&ts) 116 117 assert.Error(t, err) 118 } 119 120 type TestTimestamp time.Time 121 122 func (t TestTimestamp) MarshalText() ([]byte, error) { 123 return (time.Time)(t).MarshalText() 124 } 125 126 type TestTimestampPtr time.Time 127 128 func (t *TestTimestampPtr) UnmarshalText(data []byte) error { 129 return (*time.Time)(t).UnmarshalText(data) 130 } 131 132 func (t *TestTimestampPtr) MarshalText() ([]byte, error) { 133 return (*time.Time)(t).MarshalText() 134 } 135 136 type TestTimestampError time.Time 137 138 func (t *TestTimestampError) UnmarshalText(data []byte) error { 139 return errors.New("test") 140 } 141 142 func (t *TestTimestampError) MarshalText() ([]byte, error) { 143 return nil, errors.New("test") 144 }