github.com/hamba/avro/v2@v2.22.1-0.20240518180522-aff3955acf7d/decoder_array_test.go (about) 1 package avro_test 2 3 import ( 4 "bytes" 5 "testing" 6 7 "github.com/hamba/avro/v2" 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestDecoder_ArrayInvalidType(t *testing.T) { 13 defer ConfigTeardown() 14 15 data := []byte{0x04, 0x36, 0x38, 0x0} 16 schema := `{"type":"array", "items": "int"}` 17 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 18 require.NoError(t, err) 19 20 var str string 21 err = dec.Decode(&str) 22 23 assert.Error(t, err) 24 } 25 26 func TestDecoder_ArraySlice(t *testing.T) { 27 defer ConfigTeardown() 28 29 data := []byte{0x04, 0x36, 0x38, 0x0} 30 schema := `{"type":"array", "items": "int"}` 31 dec, _ := avro.NewDecoder(schema, bytes.NewReader(data)) 32 33 var got []int 34 err := dec.Decode(&got) 35 36 require.NoError(t, err) 37 assert.Equal(t, []int{27, 28}, got) 38 } 39 40 func TestDecoder_ArraySliceShortRead(t *testing.T) { 41 defer ConfigTeardown() 42 43 data := []byte{0x04} 44 schema := `{"type":"array", "items": "int"}` 45 dec, _ := avro.NewDecoder(schema, bytes.NewReader(data)) 46 47 var got []int 48 err := dec.Decode(&got) 49 50 assert.Error(t, err) 51 } 52 53 func TestDecoder_ArraySliceOfStruct(t *testing.T) { 54 defer ConfigTeardown() 55 56 data := []byte{0x04, 0x36, 0x06, 0x66, 0x6f, 0x6f, 0x36, 0x06, 0x66, 0x6f, 0x6f, 0x0} 57 schema := `{"type":"array", "items": {"type": "record", "name": "test", "fields" : [{"name": "a", "type": "long"}, {"name": "b", "type": "string"}]}}` 58 dec, _ := avro.NewDecoder(schema, bytes.NewReader(data)) 59 60 var got []TestRecord 61 err := dec.Decode(&got) 62 63 require.NoError(t, err) 64 assert.Equal(t, []TestRecord{{A: 27, B: "foo"}, {A: 27, B: "foo"}}, got) 65 } 66 67 func TestDecoder_ArraySliceError(t *testing.T) { 68 defer ConfigTeardown() 69 70 data := []byte{0xE2, 0xA2, 0xF3, 0xAD, 0xAD, 0xAD, 0xE2, 0xA2, 0xF3, 0xAD, 0xAD} 71 schema := `{"type":"array", "items": "int"}` 72 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 73 require.NoError(t, err) 74 75 var got []int 76 err = dec.Decode(&got) 77 78 assert.Error(t, err) 79 } 80 81 func TestDecoder_ArraySliceItemError(t *testing.T) { 82 defer ConfigTeardown() 83 84 data := []byte{0x04, 0xE2, 0xA2, 0xF3, 0xAD, 0xAD, 0xAD, 0xE2, 0xA2, 0xF3, 0xAD, 0xAD} 85 schema := `{"type":"array", "items": "int"}` 86 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 87 require.NoError(t, err) 88 89 var got []int 90 err = dec.Decode(&got) 91 92 assert.Error(t, err) 93 } 94 95 func TestDecoder_ArrayMaxAllocationError(t *testing.T) { 96 defer ConfigTeardown() 97 data := []byte{0x2, 0x0, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0xe9, 0x0} 98 schema := `{"type":"array", "items": { "type": "boolean" }}` 99 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 100 require.NoError(t, err) 101 102 var got []bool 103 err = dec.Decode(&got) 104 105 assert.Error(t, err) 106 } 107 108 func TestDecoder_ArrayExceedMaxSliceAllocationConfig(t *testing.T) { 109 avro.DefaultConfig = avro.Config{MaxSliceAllocSize: 5}.Freeze() 110 111 // 10 (long) gets encoded to 0x14 112 data := []byte{0x14} 113 schema := `{"type":"array", "items": { "type": "boolean" }}` 114 dec, err := avro.NewDecoder(schema, bytes.NewReader(data)) 115 require.NoError(t, err) 116 117 var got []bool 118 err = dec.Decode(&got) 119 120 assert.Error(t, err) 121 }