diff --git a/converter/codec.go b/converter/codec.go index 16c6a8a1e..e4f081938 100644 --- a/converter/codec.go +++ b/converter/codec.go @@ -157,7 +157,7 @@ func (e *CodecDataConverter) ToPayload(value interface{}) (*commonpb.Payload, er encodedPayloads, err := e.encode([]*commonpb.Payload{payload}) if err != nil { - return payload, nil + return payload, err } if len(encodedPayloads) != 1 { return payload, fmt.Errorf("received %d payloads from codec, expected 1", len(encodedPayloads)) diff --git a/converter/codec_test.go b/converter/codec_test.go index bfa87d8b8..e4cf20860 100644 --- a/converter/codec_test.go +++ b/converter/codec_test.go @@ -319,3 +319,39 @@ func TestRawValueJsonConverter(t *testing.T) { err = jsonConverter.FromPayload(dataPayload, &rawValue) require.Error(t, err) } + +// errorCodecOnEncode is a codec that always returns an error on encode. +type errorCodecOnEncode struct { + err error +} + +func (c *errorCodecOnEncode) Encode(payloads []*commonpb.Payload) ([]*commonpb.Payload, error) { + return nil, c.err +} + +func (c *errorCodecOnEncode) Decode(payloads []*commonpb.Payload) ([]*commonpb.Payload, error) { + return payloads, nil +} + +func TestCodecDataConverter_ToPayload_EncodeError(t *testing.T) { + require := require.New(t) + + // Codec that always fails encoding + errCodec := &errorCodecOnEncode{err: fmt.Errorf("some encode error")} + + // Converter with the failing codec + conv := NewCodecDataConverter( + GetDefaultDataConverter(), + errCodec, + ) + + // Try to convert, should fail. + originalPayload, err := GetDefaultDataConverter().ToPayload("foo") + require.NoError(err) + + payload, err := conv.ToPayload("foo") + require.Error(err) + require.EqualError(err, "some encode error") + // Also assert that the original payload is returned on error. + require.True(proto.Equal(originalPayload, payload)) +}