github.com/hamba/avro/v2@v2.22.1-0.20240518180522-aff3955acf7d/codec_convertible_test.go (about) 1 package avro_test 2 3 import ( 4 "bytes" 5 "testing" 6 "time" 7 8 "github.com/hamba/avro/v2" 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestDecoder_ConvertiblePtr(t *testing.T) { 14 defer ConfigTeardown() 15 16 data := []byte{0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b} 17 schema := `{"type": "long", "logicalType": "timestamp-millis"}` 18 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 19 require.NoError(t, err) 20 21 var ts TestTimestampPtr 22 err = dec.Decode(&ts) 23 24 require.NoError(t, err) 25 want := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC)) 26 assert.Equal(t, want, ts) 27 } 28 29 func TestDecoder_ConvertiblePtrPtr(t *testing.T) { 30 defer ConfigTeardown() 31 32 data := []byte{0x2, 0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b} 33 schema := `{"type" : ["null", {"type": "long", "logicalType": "timestamp-millis"}]}` 34 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 35 require.NoError(t, err) 36 37 var ts *TestTimestampPtr 38 err = dec.Decode(&ts) 39 40 require.NoError(t, err) 41 assert.NotNil(t, ts) 42 want := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC)) 43 assert.Equal(t, want, *ts) 44 } 45 46 func TestDecoder_ConvertibleError(t *testing.T) { 47 defer ConfigTeardown() 48 49 data := []byte{0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b} 50 schema := `{"type": "long", "logicalType": "timestamp-millis"}` 51 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 52 require.NoError(t, err) 53 54 var ts *TestTimestampError 55 err = dec.Decode(&ts) 56 57 assert.Error(t, err) 58 } 59 60 func TestEncoder_Convertible(t *testing.T) { 61 defer ConfigTeardown() 62 63 schema := `{"type": "long", "logicalType": "timestamp-millis"}` 64 buf := bytes.NewBuffer([]byte{}) 65 enc, err := avro.NewEncoder(schema, buf) 66 require.NoError(t, err) 67 ts := TestTimestamp(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC)) 68 69 err = enc.Encode(ts) 70 71 require.NoError(t, err) 72 assert.Equal(t, []byte{0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b}, buf.Bytes()) 73 } 74 75 func TestEncoder_ConvertiblePtr(t *testing.T) { 76 defer ConfigTeardown() 77 78 schema := `{"type" : ["null", {"type": "long", "logicalType": "timestamp-millis"}]}` 79 buf := bytes.NewBuffer([]byte{}) 80 enc, err := avro.NewEncoder(schema, buf) 81 require.NoError(t, err) 82 ts := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC)) 83 84 err = enc.Encode(&ts) 85 86 require.NoError(t, err) 87 assert.Equal(t, []byte{0x2, 0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b}, buf.Bytes()) 88 } 89 90 func TestEncoder_ConvertiblePtrNil(t *testing.T) { 91 defer ConfigTeardown() 92 93 schema := `{"type" : ["null", {"type": "long", "logicalType": "timestamp-millis"}]}` 94 buf := bytes.NewBuffer([]byte{}) 95 enc, err := avro.NewEncoder(schema, buf) 96 require.NoError(t, err) 97 var ts *TestTimestampPtr 98 99 err = enc.Encode(ts) 100 101 require.NoError(t, err) 102 assert.Equal(t, []byte{0x00}, buf.Bytes()) 103 } 104 105 func TestEncoder_ConvertibleError(t *testing.T) { 106 defer ConfigTeardown() 107 108 schema := `{"type": "long", "logicalType": "timestamp-millis"}` 109 buf := bytes.NewBuffer([]byte{}) 110 enc, err := avro.NewEncoder(schema, buf) 111 require.NoError(t, err) 112 ts := TestTimestampError{} 113 114 err = enc.Encode(&ts) 115 116 assert.Error(t, err) 117 }