1package git2go 2 3import ( 4 "bytes" 5 "encoding/gob" 6 "errors" 7 "fmt" 8 "testing" 9 10 "github.com/stretchr/testify/require" 11) 12 13func TestSerializableError(t *testing.T) { 14 for _, tc := range []struct { 15 desc string 16 input error 17 output error 18 containsTyped bool 19 }{ 20 { 21 desc: "plain error", 22 input: errors.New("plain error"), 23 output: wrapError{Message: "plain error"}, 24 }, 25 { 26 desc: "wrapped plain error", 27 input: fmt.Errorf("error wrapper: %w", errors.New("plain error")), 28 output: wrapError{Message: "error wrapper: plain error", Err: wrapError{Message: "plain error"}}, 29 }, 30 { 31 desc: "wrapped typed error", 32 containsTyped: true, 33 input: fmt.Errorf("error wrapper: %w", InvalidArgumentError("typed error")), 34 output: wrapError{Message: "error wrapper: typed error", Err: InvalidArgumentError("typed error")}, 35 }, 36 { 37 desc: "typed wrapper", 38 containsTyped: true, 39 input: wrapError{ 40 Message: "error wrapper: typed error 1: typed error 2", 41 Err: wrapError{ 42 Message: "typed error 1: typed error 2", 43 Err: InvalidArgumentError("typed error 2"), 44 }, 45 }, 46 output: wrapError{ 47 Message: "error wrapper: typed error 1: typed error 2", 48 Err: wrapError{ 49 Message: "typed error 1: typed error 2", 50 Err: InvalidArgumentError("typed error 2"), 51 }, 52 }, 53 }, 54 } { 55 t.Run(tc.desc, func(t *testing.T) { 56 encoded := &bytes.Buffer{} 57 require.NoError(t, gob.NewEncoder(encoded).Encode(SerializableError(tc.input))) 58 var err wrapError 59 require.NoError(t, gob.NewDecoder(encoded).Decode(&err)) 60 require.Equal(t, tc.output, err) 61 62 var typedErr InvalidArgumentError 63 require.Equal(t, tc.containsTyped, errors.As(err, &typedErr)) 64 }) 65 } 66} 67 68func TestSerialization_SerializeTo(t *testing.T) { 69 type testStruct struct { 70 Contents string `json:"contents"` 71 } 72 73 var buf bytes.Buffer 74 75 input := testStruct{ 76 Contents: "foobar", 77 } 78 err := serializeTo(&buf, &input) 79 require.NoError(t, err) 80 require.NotZero(t, buf.Len()) 81 82 var output testStruct 83 err = deserialize(buf.String(), &output) 84 require.NoError(t, err) 85 require.Equal(t, input, output) 86} 87