Add unit tests for db (#1062)

* Add unit tests for db

* Fix error checks and clean up tempdirs

* Add string explainer in the absence of a panic

* Remove unnecessary comment

* Fix NoError suggestion

* Add linter exception for panic test
This commit is contained in:
Jonathan Claudius 2022-07-11 11:36:32 -04:00 committed by GitHub
parent 9e52ce4c0d
commit 38a2aba318
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 162 additions and 1 deletions

View File

@ -27,7 +27,7 @@ func VaaIDFromString(s string) (*VAAID, error) {
return nil, errors.New("invalid message id")
}
emitterChain, err := strconv.Atoi(parts[0])
emitterChain, err := strconv.ParseUint(parts[0], 10, 16)
if err != nil {
return nil, fmt.Errorf("invalid emitter chain: %s", err)
}

161
node/pkg/db/db_test.go Normal file
View File

@ -0,0 +1,161 @@
package db
import (
"crypto/ecdsa"
"crypto/rand"
"os"
"github.com/certusone/wormhole/node/pkg/vaa"
"github.com/ethereum/go-ethereum/crypto"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func getVAA() vaa.VAA {
var payload = []byte{97, 97, 97, 97, 97, 97}
var governanceEmitter = vaa.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}
return vaa.VAA{
Version: uint8(1),
GuardianSetIndex: uint32(1),
Signatures: nil,
Timestamp: time.Unix(0, 0),
Nonce: uint32(1),
Sequence: uint64(1),
ConsistencyLevel: uint8(32),
EmitterChain: vaa.ChainIDSolana,
EmitterAddress: governanceEmitter,
Payload: payload,
}
}
// Testing the expected default behavior of a CreateGovernanceVAA
func TestVaaIDFromString(t *testing.T) {
vaaIdString := "1/0000000000000000000000000000000000000000000000000000000000000004/1"
vaaID, _ := VaaIDFromString(vaaIdString)
expectAddr := vaa.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}
assert.Equal(t, vaa.ChainIDSolana, vaaID.EmitterChain)
assert.Equal(t, expectAddr, vaaID.EmitterAddress)
assert.Equal(t, uint64(1), vaaID.Sequence)
}
func TestVaaIDFromVAA(t *testing.T) {
testVaa := getVAA()
vaaID := VaaIDFromVAA(&testVaa)
expectAddr := vaa.Address{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}
assert.Equal(t, vaa.ChainIDSolana, vaaID.EmitterChain)
assert.Equal(t, expectAddr, vaaID.EmitterAddress)
assert.Equal(t, uint64(1), vaaID.Sequence)
}
func TestBytes(t *testing.T) {
vaaIdString := "1/0000000000000000000000000000000000000000000000000000000000000004/1"
vaaID, _ := VaaIDFromString(vaaIdString)
expected := []byte{0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2f, 0x31, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34, 0x2f, 0x31}
assert.Equal(t, expected, vaaID.Bytes())
}
func TestEmitterPrefixBytes(t *testing.T) {
vaaIdString := "1/0000000000000000000000000000000000000000000000000000000000000004/1"
vaaID, _ := VaaIDFromString(vaaIdString)
expected := []byte{0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2f, 0x31, 0x2f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x34}
assert.Equal(t, expected, vaaID.EmitterPrefixBytes())
}
func TestStoreSignedVAAUnsigned(t *testing.T) {
dbPath := t.TempDir()
db, err := Open(dbPath)
if err != nil {
t.Error("failed to open database")
}
defer db.Close()
defer os.Remove(dbPath)
testVaa := getVAA()
// Should panic because the VAA is not signed
assert.Panics(t, func() { db.StoreSignedVAA(&testVaa) }, "The code did not panic") //nolint:errcheck
}
func TestStoreSignedVAASigned(t *testing.T) {
dbPath := t.TempDir()
db, err := Open(dbPath)
if err != nil {
t.Error("failed to open database")
}
defer db.Close()
defer os.Remove(dbPath)
testVaa := getVAA()
privKey, _ := ecdsa.GenerateKey(crypto.S256(), rand.Reader)
testVaa.AddSignature(privKey, 0)
err2 := db.StoreSignedVAA(&testVaa)
assert.NoError(t, err2)
}
func TestGetSignedVAABytes(t *testing.T) {
dbPath := t.TempDir()
db, err := Open(dbPath)
if err != nil {
t.Error("failed to open database")
}
defer db.Close()
defer os.Remove(dbPath)
testVaa := getVAA()
vaaID := VaaIDFromVAA(&testVaa)
privKey, _ := ecdsa.GenerateKey(crypto.S256(), rand.Reader)
testVaa.AddSignature(privKey, 0)
// Store full VAA
err2 := db.StoreSignedVAA(&testVaa)
assert.NoError(t, err2)
// Retrieve it using vaaID
vaaBytes, err2 := db.GetSignedVAABytes(*vaaID)
assert.NoError(t, err2)
testVaaBytes, err3 := testVaa.Marshal()
assert.NoError(t, err3)
assert.Equal(t, testVaaBytes, vaaBytes)
}
func TestFindEmitterSequenceGap(t *testing.T) {
dbPath := t.TempDir()
db, err := Open(dbPath)
if err != nil {
t.Error("failed to open database")
}
defer db.Close()
defer os.Remove(dbPath)
testVaa := getVAA()
vaaID := VaaIDFromVAA(&testVaa)
privKey, _ := ecdsa.GenerateKey(crypto.S256(), rand.Reader)
testVaa.AddSignature(privKey, 0)
// Store full VAA
err2 := db.StoreSignedVAA(&testVaa)
assert.NoError(t, err2)
resp, firstSeq, lastSeq, err := db.FindEmitterSequenceGap(*vaaID)
assert.Equal(t, []uint64{0x0}, resp)
assert.Equal(t, uint64(0x0), firstSeq)
assert.Equal(t, uint64(0x1), lastSeq)
assert.NoError(t, err)
}