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  }