|
|
@@ -1,9 +1,12 @@
|
|
|
package common
|
|
|
|
|
|
import (
|
|
|
+ "bytes"
|
|
|
"encoding/binary"
|
|
|
+ "io"
|
|
|
"math"
|
|
|
"math/big"
|
|
|
+ "os"
|
|
|
"testing"
|
|
|
"time"
|
|
|
|
|
|
@@ -32,20 +35,20 @@ const (
|
|
|
)
|
|
|
|
|
|
func encodePayloadBytes(payload *vaa.TransferPayloadHdr) []byte {
|
|
|
- bytes := make([]byte, 101)
|
|
|
- bytes[0] = payload.Type
|
|
|
+ bz := make([]byte, 101)
|
|
|
+ bz[0] = payload.Type
|
|
|
|
|
|
amtBytes := payload.Amount.Bytes()
|
|
|
if len(amtBytes) > 32 {
|
|
|
panic("amount will not fit in 32 bytes!")
|
|
|
}
|
|
|
- copy(bytes[33-len(amtBytes):33], amtBytes)
|
|
|
+ copy(bz[33-len(amtBytes):33], amtBytes)
|
|
|
|
|
|
- copy(bytes[33:65], payload.OriginAddress.Bytes())
|
|
|
- binary.BigEndian.PutUint16(bytes[65:67], uint16(payload.OriginChain))
|
|
|
- copy(bytes[67:99], payload.TargetAddress.Bytes())
|
|
|
- binary.BigEndian.PutUint16(bytes[99:101], uint16(payload.TargetChain))
|
|
|
- return bytes
|
|
|
+ copy(bz[33:65], payload.OriginAddress.Bytes())
|
|
|
+ binary.BigEndian.PutUint16(bz[65:67], uint16(payload.OriginChain))
|
|
|
+ copy(bz[67:99], payload.TargetAddress.Bytes())
|
|
|
+ binary.BigEndian.PutUint16(bz[99:101], uint16(payload.TargetChain))
|
|
|
+ return bz
|
|
|
}
|
|
|
|
|
|
// makeTestMsgPub is a helper function that generates a Message Publication.
|
|
|
@@ -91,11 +94,11 @@ func TestRoundTripMarshal(t *testing.T) {
|
|
|
orig := makeTestMsgPub(t)
|
|
|
var loaded MessagePublication
|
|
|
|
|
|
- bytes, writeErr := orig.MarshalBinary()
|
|
|
+ bz, writeErr := orig.MarshalBinary()
|
|
|
require.NoError(t, writeErr)
|
|
|
- t.Logf("marshaled bytes: %x", bytes)
|
|
|
+ t.Logf("marshaled bytes: %x", bz)
|
|
|
|
|
|
- readErr := loaded.UnmarshalBinary(bytes)
|
|
|
+ readErr := loaded.UnmarshalBinary(bz)
|
|
|
require.NoError(t, readErr)
|
|
|
|
|
|
require.Equal(t, *orig, loaded)
|
|
|
@@ -402,10 +405,10 @@ func TestDeprecatedSerializeAndDeserializeOfMessagePublication(t *testing.T) {
|
|
|
verificationState: Anomalous,
|
|
|
}
|
|
|
|
|
|
- bytes, err := msg1.Marshal()
|
|
|
+ bz, err := msg1.Marshal()
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
- msg2, err := UnmarshalMessagePublication(bytes)
|
|
|
+ msg2, err := UnmarshalMessagePublication(bz)
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
require.Equal(t, msg1.TxID, msg2.TxID)
|
|
|
@@ -460,10 +463,10 @@ func TestSerializeAndDeserializeOfMessagePublicationWithEmptyTxID(t *testing.T)
|
|
|
ConsistencyLevel: 32,
|
|
|
}
|
|
|
|
|
|
- bytes, err := msg1.Marshal()
|
|
|
+ bz, err := msg1.Marshal()
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
- msg2, err := UnmarshalMessagePublication(bytes)
|
|
|
+ msg2, err := UnmarshalMessagePublication(bz)
|
|
|
require.NoError(t, err)
|
|
|
assert.Equal(t, msg1, msg2)
|
|
|
|
|
|
@@ -507,10 +510,10 @@ func TestSerializeAndDeserializeOfMessagePublicationWithArbitraryTxID(t *testing
|
|
|
ConsistencyLevel: 32,
|
|
|
}
|
|
|
|
|
|
- bytes, err := msg1.Marshal()
|
|
|
+ bz, err := msg1.Marshal()
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
- msg2, err := UnmarshalMessagePublication(bytes)
|
|
|
+ msg2, err := UnmarshalMessagePublication(bz)
|
|
|
require.NoError(t, err)
|
|
|
assert.Equal(t, msg1, msg2)
|
|
|
|
|
|
@@ -568,10 +571,10 @@ func TestSerializeAndDeserializeOfMessagePublicationWithBigPayload(t *testing.T)
|
|
|
ConsistencyLevel: 32,
|
|
|
}
|
|
|
|
|
|
- bytes, err := msg1.Marshal()
|
|
|
+ bz, err := msg1.Marshal()
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
- msg2, err := UnmarshalMessagePublication(bytes)
|
|
|
+ msg2, err := UnmarshalMessagePublication(bz)
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
assert.Equal(t, msg1, msg2)
|
|
|
@@ -609,11 +612,11 @@ func TestMarshalUnmarshalJSONOfMessagePublication(t *testing.T) {
|
|
|
ConsistencyLevel: 32,
|
|
|
}
|
|
|
|
|
|
- bytes, err := msg1.MarshalJSON()
|
|
|
+ bz, err := msg1.MarshalJSON()
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
var msg2 MessagePublication
|
|
|
- err = msg2.UnmarshalJSON(bytes)
|
|
|
+ err = msg2.UnmarshalJSON(bz)
|
|
|
require.NoError(t, err)
|
|
|
assert.Equal(t, *msg1, msg2)
|
|
|
|
|
|
@@ -655,11 +658,11 @@ func TestMarshalUnmarshalJSONOfMessagePublicationWithArbitraryTxID(t *testing.T)
|
|
|
ConsistencyLevel: 32,
|
|
|
}
|
|
|
|
|
|
- bytes, err := msg1.MarshalJSON()
|
|
|
+ bz, err := msg1.MarshalJSON()
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
var msg2 MessagePublication
|
|
|
- err = msg2.UnmarshalJSON(bytes)
|
|
|
+ err = msg2.UnmarshalJSON(bz)
|
|
|
require.NoError(t, err)
|
|
|
assert.Equal(t, *msg1, msg2)
|
|
|
|
|
|
@@ -802,3 +805,54 @@ func TestMessagePublication_SetVerificationState(t *testing.T) {
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestSafeRead(t *testing.T) {
|
|
|
+ tests := []struct {
|
|
|
+ name string
|
|
|
+ size int
|
|
|
+ wantErr bool
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ "happy path",
|
|
|
+ MaxSafeInputSize,
|
|
|
+ false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "error: too big",
|
|
|
+ MaxSafeInputSize + 1,
|
|
|
+ true,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ for _, tt := range tests {
|
|
|
+ t.Run(tt.name, func(t *testing.T) {
|
|
|
+ // Create temporary file and write bytes to it
|
|
|
+ tmp := os.TempDir()
|
|
|
+
|
|
|
+ f, err := os.CreateTemp(tmp, "tmpfile-")
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ defer f.Close()
|
|
|
+ defer os.Remove(f.Name())
|
|
|
+
|
|
|
+ // Fill slice with zeroes.
|
|
|
+ data := make([]byte, tt.size)
|
|
|
+ if _, err := f.Write(data); err != nil {
|
|
|
+ require.NoError(t, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // File pointer is at EOF at this point. Reset to the start.
|
|
|
+ _, err = f.Seek(0, io.SeekStart)
|
|
|
+ require.NoError(t, err)
|
|
|
+
|
|
|
+ got, err := SafeRead(f)
|
|
|
+ if tt.wantErr {
|
|
|
+ require.Error(t, err, "SafeRead() should have returned an error")
|
|
|
+ require.Nil(t, got, "got should be nil when error occurs")
|
|
|
+ } else {
|
|
|
+ require.NoError(t, err, "SafeRead() should not have returned an error")
|
|
|
+ require.NotNil(t, got, "got should not be nil when no error occurs")
|
|
|
+ require.True(t, bytes.Equal(got, data), "bytes read are not equal to bytes written")
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|