blob: 6b453d917dab67347caeebfd5ca90aca0d84bea3 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package vom
import (
"bytes"
"io"
"testing"
"v.io/v23/vom/testdata/data81"
)
func TestRawValueDecodeEncode(t *testing.T) {
for _, test := range data81.Tests {
// Interleaved
rv := RawValue{}
interleavedReader := bytes.NewReader(hex2Bin(t, test.Hex))
if err := NewDecoder(interleavedReader).Decode(&rv); err != nil {
t.Errorf("unexpected error decoding %s: %v", test.Name, err)
continue
}
if _, err := interleavedReader.ReadByte(); err != io.EOF {
t.Errorf("expected EOF, but got %v", err)
continue
}
var out bytes.Buffer
enc := NewVersionedEncoder(Version81, &out)
if err := enc.Encode(&rv); err != nil {
t.Errorf("unexpected error encoding raw value %v in test %s: %v", rv, test.Name, err)
continue
}
if !bytes.Equal(out.Bytes(), hex2Bin(t, test.Hex)) {
t.Errorf("got bytes: %x but expected %s", out.Bytes(), test.Hex)
}
// Split type and value stream.
rv = RawValue{}
typeReader := bytes.NewReader(hex2Bin(t, test.HexVersion+test.HexType))
typeDec := NewTypeDecoder(typeReader)
typeDec.Start()
defer typeDec.Stop()
valueReader := bytes.NewReader(hex2Bin(t, test.HexVersion+test.HexValue))
if err := NewDecoderWithTypeDecoder(valueReader, typeDec).Decode(&rv); err != nil {
t.Errorf("unexpected error decoding %s: %v", test.Name, err)
continue
}
if test.HexType != "" {
// If HexType is empty, then the type stream will just have the version byte that won't be read, so ignore
// that case.
if _, err := typeReader.ReadByte(); err != io.EOF {
t.Errorf("in type reader expected EOF, but got %v", err)
continue
}
}
if _, err := valueReader.ReadByte(); err != io.EOF {
t.Errorf("in value reader expected EOF, but got %v", err)
continue
}
out.Reset()
var typeOut bytes.Buffer
typeEnc := NewVersionedTypeEncoder(Version81, &typeOut)
enc = NewVersionedEncoderWithTypeEncoder(Version81, &out, typeEnc)
if err := enc.Encode(&rv); err != nil {
t.Errorf("unexpected error encoding raw value %v in test %s: %v", rv, test.Name, err)
continue
}
expectedType := test.HexVersion + test.HexType
if expectedType == "81" {
expectedType = ""
}
if !bytes.Equal(typeOut.Bytes(), hex2Bin(t, expectedType)) {
t.Errorf("got type bytes: %x but expected %s", typeOut.Bytes(), expectedType)
}
if !bytes.Equal(out.Bytes(), hex2Bin(t, test.HexVersion+test.HexValue)) {
t.Errorf("got value bytes: %x but expected %s", out.Bytes(), test.HexVersion+test.HexValue)
}
}
}