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  }