154 lines
3.2 KiB
Go
154 lines
3.2 KiB
Go
package opentimestamps
|
|
|
|
import (
|
|
"bytes"
|
|
"math"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func newDeserializationContextFromBytes(in []byte) *deserializationContext {
|
|
return newDeserializationContext(bytes.NewBuffer(in))
|
|
}
|
|
|
|
func TestReadWrite(t *testing.T) {
|
|
magic := []byte("magic")
|
|
buf := &bytes.Buffer{}
|
|
s := newSerializationContext(buf)
|
|
|
|
assert.NoError(t, s.writeBytes([]byte{0x00, 0x01}))
|
|
assert.NoError(t, s.writeByte(0x02))
|
|
assert.NoError(t, s.writeBool(true))
|
|
assert.NoError(t, s.writeBool(false))
|
|
assert.NoError(t, s.writeByte(0x03))
|
|
assert.NoError(t, s.writeVarUint(1))
|
|
assert.NoError(t, s.writeBytes([]byte{0x81, 0x00}))
|
|
assert.NoError(t, s.writeBytes([]byte{0x81, 0x01}))
|
|
assert.NoError(t, s.writeVarUint(0x100))
|
|
assert.NoError(t, s.writeVarUint(uint64(math.MaxUint32)+1))
|
|
assert.NoError(t, s.writeVarUint(math.MaxUint64))
|
|
assert.NoError(t, s.writeBytes([]byte{
|
|
// varunit excess MaxUint64
|
|
0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0x01,
|
|
}))
|
|
assert.NoError(t, s.writeBytes(magic))
|
|
assert.NoError(t, s.writeByte(0))
|
|
assert.NoError(t, s.writeBytes(magic))
|
|
|
|
data := buf.Bytes()
|
|
|
|
expectedData := []byte{
|
|
0x00, 0x01, // bytes [0x00, 0x01]
|
|
0x02, // byte 0x02
|
|
0xff, // bool true
|
|
0x00, // bool false
|
|
0x03, // bool error
|
|
0x01, // varuint 1
|
|
0x81, 0x00, // varuint 1
|
|
0x81, 0x01, // varuint 1 (alternative)
|
|
0x80, 0x02, // varuint 0x100
|
|
|
|
// varunit math.MaxUint32 + 1
|
|
0x80, 0x80, 0x80, 0x80, 0x10,
|
|
|
|
// varunit math.MaxUint64
|
|
0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0x01,
|
|
|
|
// varunit excess math.MaxUint64
|
|
0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0xff, 0xff,
|
|
0xff, 0xff, 0x01,
|
|
|
|
// "magic"
|
|
0x6d, 0x61, 0x67, 0x69, 0x63,
|
|
// zero
|
|
0x00,
|
|
// "magic"
|
|
0x6d, 0x61, 0x67, 0x69, 0x63,
|
|
}
|
|
|
|
assert.Equal(t, expectedData, data)
|
|
|
|
d := newDeserializationContextFromBytes(data)
|
|
|
|
{
|
|
v, err := d.readBytes(2)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, []byte{0x00, 0x01}, v)
|
|
}
|
|
{
|
|
v, err := d.readByte()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, byte(0x02), v)
|
|
}
|
|
{
|
|
v, err := d.readBool()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, true, v)
|
|
}
|
|
{
|
|
v, err := d.readBool()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, false, v)
|
|
}
|
|
{
|
|
_, err := d.readBool()
|
|
assert.Error(t, err)
|
|
}
|
|
{
|
|
v, err := d.readVarUint()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, uint64(1), v)
|
|
}
|
|
{
|
|
v, err := d.readVarUint()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, uint64(1), v)
|
|
}
|
|
{
|
|
v, err := d.readVarUint()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, uint64(0x81), v)
|
|
}
|
|
{
|
|
v, err := d.readVarUint()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, uint64(0x100), v)
|
|
}
|
|
{
|
|
v, err := d.readVarUint()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, uint64(math.MaxUint32)+uint64(1), v)
|
|
}
|
|
{
|
|
v, err := d.readVarUint()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, uint64(math.MaxUint64), uint64(v))
|
|
}
|
|
{
|
|
_, err := d.readVarUint()
|
|
assert.Error(t, err)
|
|
// read leftover 0x02
|
|
b, err := d.readByte()
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, byte(0x01), b)
|
|
|
|
}
|
|
{
|
|
assert.NoError(t, d.assertMagic(magic))
|
|
// fails because of in-between 0x00
|
|
assert.Error(t, d.assertMagic(magic))
|
|
}
|
|
{
|
|
// read leftover byte
|
|
_, err := d.readByte()
|
|
assert.NoError(t, err)
|
|
assert.True(t, d.assertEOF())
|
|
}
|
|
}
|