Fix utxoindex deserialization (#1566)

* Fix broken deserialization in utxoindex

* Add Tests for hashes serialization in utxo index
This commit is contained in:
Elichai Turkel 2021-03-01 19:06:19 +02:00 committed by GitHub
parent c1ef5f0c56
commit 79be1edaa5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 47 additions and 5 deletions

View File

@ -45,8 +45,7 @@ func serializeHashes(hashes []*externalapi.DomainHash) []byte {
for i, hash := range hashes {
start := hashesLengthSize + externalapi.DomainHashSize*i
end := start + externalapi.DomainHashSize
copy(serializedHashes[start:end],
hash.ByteSlice())
copy(serializedHashes[start:end], hash.ByteSlice())
}
return serializedHashes
}
@ -63,12 +62,11 @@ func deserializeHashes(serializedHashes []byte) ([]*externalapi.DomainHash, erro
}
var err error
hashes[i], err = externalapi.
NewDomainHashFromByteSlice(serializedHashes[start:end])
hashes[i], err = externalapi.NewDomainHashFromByteSlice(serializedHashes[start:end])
if err != nil {
return nil, err
}
}
return nil, nil
return hashes, nil
}

View File

@ -0,0 +1,44 @@
package utxoindex
import (
"encoding/binary"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/pkg/errors"
"io"
"math/rand"
"testing"
)
func Test_serializeHashes(t *testing.T) {
r := rand.New(rand.NewSource(0))
for length := 0; length < 32; length++ {
hashes := make([]*externalapi.DomainHash, length)
for i := range hashes {
var hashBytes [32]byte
r.Read(hashBytes[:])
hashes[i] = externalapi.NewDomainHashFromByteArray(&hashBytes)
}
result, err := deserializeHashes(serializeHashes(hashes))
if err != nil {
t.Fatalf("Failed deserializing hashes: %v", err)
}
if !externalapi.HashesEqual(hashes, result) {
t.Fatalf("Expected \n %s \n==\n %s\n", hashes, result)
}
}
}
func Test_deserializeHashesFailure(t *testing.T) {
hashes := []*externalapi.DomainHash{
externalapi.NewDomainHashFromByteArray(&[externalapi.DomainHashSize]byte{1}),
externalapi.NewDomainHashFromByteArray(&[externalapi.DomainHashSize]byte{2}),
externalapi.NewDomainHashFromByteArray(&[externalapi.DomainHashSize]byte{3}),
}
serialized := serializeHashes(hashes)
binary.LittleEndian.PutUint64(serialized[:8], uint64(len(hashes)+1))
_, err := deserializeHashes(serialized)
if !errors.Is(err, io.ErrUnexpectedEOF) {
t.Fatalf("Expected error to be EOF, instead got: %v", err)
}
}