package db import ( "testing" "time" "github.com/certusone/wormhole/node/pkg/common" "github.com/certusone/wormhole/node/pkg/vaa" eth_common "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" ) func TestSerializeAndDeserializeOfTransfer(t *testing.T) { tokenAddr, err := vaa.StringToAddress("0x707f9118e33a9b8998bea41dd0d46f38bb963fc8") require.NoError(t, err) tokenBridgeAddr, _ := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16") require.NoError(t, err) xfer1 := &Transfer{ Timestamp: time.Unix(int64(1654516425), 0), Value: 125000, OriginChain: vaa.ChainIDEthereum, OriginAddress: tokenAddr, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: tokenBridgeAddr, MsgID: "2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415", } bytes, err := xfer1.Marshal() require.NoError(t, err) xfer2, err := UnmarshalTransfer(bytes) require.NoError(t, err) assert.Equal(t, xfer1, xfer2) expectedTransferKey := "GOV:XFER:2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415" assert.Equal(t, expectedTransferKey, string(TransferMsgID(xfer2))) } func TestPendingMsgID(t *testing.T) { tokenBridgeAddr, err := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16") require.NoError(t, err) msg1 := &common.MessagePublication{ TxHash: eth_common.HexToHash("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"), Timestamp: time.Unix(int64(1654516425), 0), Nonce: 123456, Sequence: 789101112131415, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: tokenBridgeAddr, Payload: []byte{}, ConsistencyLevel: 16, } assert.Equal(t, []byte("GOV:PENDING:"+"2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415"), PendingMsgID(msg1)) } func TestTransferMsgID(t *testing.T) { tokenAddr, err := vaa.StringToAddress("0x707f9118e33a9b8998bea41dd0d46f38bb963fc8") require.NoError(t, err) tokenBridgeAddr, _ := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16") require.NoError(t, err) xfer := &Transfer{ Timestamp: time.Unix(int64(1654516425), 0), Value: 125000, OriginChain: vaa.ChainIDEthereum, OriginAddress: tokenAddr, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: tokenBridgeAddr, MsgID: "2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415", } assert.Equal(t, []byte("GOV:XFER:"+"2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415"), TransferMsgID(xfer)) } func TestIsTransfer(t *testing.T) { assert.Equal(t, true, IsTransfer([]byte("GOV:XFER:"+"2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415"))) assert.Equal(t, false, IsTransfer([]byte("GOV:XFER:"))) assert.Equal(t, false, IsTransfer([]byte("GOV:XFER:1"))) assert.Equal(t, false, IsTransfer([]byte("GOV:XFER:1/1/1"))) assert.Equal(t, false, IsTransfer([]byte("GOV:XFER:"+"1/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/"))) assert.Equal(t, true, IsTransfer([]byte("GOV:XFER:"+"1/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/0"))) assert.Equal(t, false, IsTransfer([]byte("GOV:PENDING:"+"2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415"))) assert.Equal(t, false, IsTransfer([]byte{0x01, 0x02, 0x03, 0x04})) assert.Equal(t, false, IsTransfer([]byte{})) } func TestIsPendingMsg(t *testing.T) { assert.Equal(t, true, IsPendingMsg([]byte("GOV:PENDING:"+"2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415"))) assert.Equal(t, false, IsPendingMsg([]byte("GOV:XFER:"+"2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415"))) assert.Equal(t, false, IsPendingMsg([]byte("GOV:PENDING:"))) assert.Equal(t, false, IsPendingMsg([]byte("GOV:PENDING:"+"1"))) assert.Equal(t, false, IsPendingMsg([]byte("GOV:PENDING:"+"1/1/1"))) assert.Equal(t, false, IsPendingMsg([]byte("GOV:PENDING:"+"1/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/"))) assert.Equal(t, true, IsPendingMsg([]byte("GOV:PENDING:"+"1/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/0"))) assert.Equal(t, false, IsPendingMsg([]byte{0x01, 0x02, 0x03, 0x04})) assert.Equal(t, false, IsPendingMsg([]byte{})) } func TestGetChainGovernorData(t *testing.T) { dbPath := t.TempDir() db, err := Open(dbPath) if err != nil { t.Error("failed to open database") } defer db.Close() logger, _ := zap.NewDevelopment() transfers, pending, err2 := db.GetChainGovernorData(logger) assert.Equal(t, []*Transfer(nil), transfers) assert.Equal(t, []*common.MessagePublication(nil), pending) require.NoError(t, err2) } func TestStoreTransfer(t *testing.T) { dbPath := t.TempDir() db, err := Open(dbPath) if err != nil { t.Error("failed to open database") } defer db.Close() tokenAddr, err := vaa.StringToAddress("0x707f9118e33a9b8998bea41dd0d46f38bb963fc8") require.NoError(t, err) tokenBridgeAddr, _ := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16") require.NoError(t, err) xfer1 := &Transfer{ Timestamp: time.Unix(int64(1654516425), 0), Value: 125000, OriginChain: vaa.ChainIDEthereum, OriginAddress: tokenAddr, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: tokenBridgeAddr, MsgID: "2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415", } err2 := db.StoreTransfer(xfer1) require.NoError(t, err2) } func TestDeleteTransfer(t *testing.T) { dbPath := t.TempDir() db, err := Open(dbPath) if err != nil { t.Error("failed to open database") } defer db.Close() tokenAddr, err := vaa.StringToAddress("0x707f9118e33a9b8998bea41dd0d46f38bb963fc8") require.NoError(t, err) tokenBridgeAddr, _ := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16") require.NoError(t, err) xfer1 := &Transfer{ Timestamp: time.Unix(int64(1654516425), 0), Value: 125000, OriginChain: vaa.ChainIDEthereum, OriginAddress: tokenAddr, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: tokenBridgeAddr, MsgID: "2/0000000000000000000000000290fb167208af455bb137780163b7b7a9a10c16/789101112131415", } err2 := db.StoreTransfer(xfer1) require.NoError(t, err2) err3 := db.DeleteTransfer(xfer1) require.NoError(t, err3) } func TestStorePendingMsg(t *testing.T) { dbPath := t.TempDir() db, err := Open(dbPath) if err != nil { t.Error("failed to open database") } defer db.Close() tokenBridgeAddr, err2 := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16") assert.NoError(t, err2) msg := &common.MessagePublication{ TxHash: eth_common.HexToHash("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"), Timestamp: time.Unix(int64(1654516425), 0), Nonce: 123456, Sequence: 789101112131415, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: tokenBridgeAddr, Payload: []byte{}, ConsistencyLevel: 16, } err3 := db.StorePendingMsg(msg) require.NoError(t, err3) } func TestDeletePendingMsg(t *testing.T) { dbPath := t.TempDir() db, err := Open(dbPath) if err != nil { t.Error("failed to open database") } defer db.Close() tokenBridgeAddr, err2 := vaa.StringToAddress("0x0290fb167208af455bb137780163b7b7a9a10c16") assert.NoError(t, err2) msg := &common.MessagePublication{ TxHash: eth_common.HexToHash("0x06f541f5ecfc43407c31587aa6ac3a689e8960f36dc23c332db5510dfc6a4063"), Timestamp: time.Unix(int64(1654516425), 0), Nonce: 123456, Sequence: 789101112131415, EmitterChain: vaa.ChainIDEthereum, EmitterAddress: tokenBridgeAddr, Payload: []byte{}, ConsistencyLevel: 16, } err3 := db.StorePendingMsg(msg) require.NoError(t, err3) err4 := db.DeletePendingMsg(msg) assert.Nil(t, err4) }