github.com/MetalBlockchain/subnet-evm@v0.4.9/warp/backend_test.go (about)

     1  // (c) 2023, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package warp
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/MetalBlockchain/metalgo/database/memdb"
    11  	"github.com/MetalBlockchain/metalgo/ids"
    12  	"github.com/MetalBlockchain/metalgo/snow"
    13  	"github.com/MetalBlockchain/metalgo/utils/crypto/bls"
    14  	"github.com/MetalBlockchain/metalgo/utils/hashing"
    15  	"github.com/MetalBlockchain/metalgo/vms/platformvm/teleporter"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  var (
    20  	sourceChainID      = ids.GenerateTestID()
    21  	destinationChainID = ids.GenerateTestID()
    22  	payload            = []byte("test")
    23  )
    24  
    25  func TestAddAndGetValidMessage(t *testing.T) {
    26  	db := memdb.New()
    27  
    28  	snowCtx := snow.DefaultContextTest()
    29  	sk, err := bls.NewSecretKey()
    30  	require.NoError(t, err)
    31  	snowCtx.TeleporterSigner = teleporter.NewSigner(sk, sourceChainID)
    32  	backend := NewWarpBackend(snowCtx, db, 500)
    33  
    34  	// Create a new unsigned message and add it to the warp backend.
    35  	unsignedMsg, err := teleporter.NewUnsignedMessage(sourceChainID, destinationChainID, payload)
    36  	require.NoError(t, err)
    37  	err = backend.AddMessage(context.Background(), unsignedMsg)
    38  	require.NoError(t, err)
    39  
    40  	// Verify that a signature is returned successfully, and compare to expected signature.
    41  	messageID := hashing.ComputeHash256Array(unsignedMsg.Bytes())
    42  	signature, err := backend.GetSignature(context.Background(), messageID)
    43  	require.NoError(t, err)
    44  
    45  	expectedSig, err := snowCtx.TeleporterSigner.Sign(unsignedMsg)
    46  	require.NoError(t, err)
    47  	require.Equal(t, expectedSig, signature[:])
    48  }
    49  
    50  func TestAddAndGetUnknownMessage(t *testing.T) {
    51  	db := memdb.New()
    52  
    53  	backend := NewWarpBackend(snow.DefaultContextTest(), db, 500)
    54  	unsignedMsg, err := teleporter.NewUnsignedMessage(sourceChainID, destinationChainID, payload)
    55  	require.NoError(t, err)
    56  
    57  	// Try getting a signature for a message that was not added.
    58  	messageID := hashing.ComputeHash256Array(unsignedMsg.Bytes())
    59  	_, err = backend.GetSignature(context.Background(), messageID)
    60  	require.Error(t, err)
    61  }
    62  
    63  func TestZeroSizedCache(t *testing.T) {
    64  	db := memdb.New()
    65  
    66  	snowCtx := snow.DefaultContextTest()
    67  	sk, err := bls.NewSecretKey()
    68  	require.NoError(t, err)
    69  	snowCtx.TeleporterSigner = teleporter.NewSigner(sk, sourceChainID)
    70  
    71  	// Verify zero sized cache works normally, because the lru cache will be initialized to size 1 for any size parameter <= 0.
    72  	backend := NewWarpBackend(snowCtx, db, 0)
    73  
    74  	// Create a new unsigned message and add it to the warp backend.
    75  	unsignedMsg, err := teleporter.NewUnsignedMessage(sourceChainID, destinationChainID, payload)
    76  	require.NoError(t, err)
    77  	err = backend.AddMessage(context.Background(), unsignedMsg)
    78  	require.NoError(t, err)
    79  
    80  	// Verify that a signature is returned successfully, and compare to expected signature.
    81  	messageID := hashing.ComputeHash256Array(unsignedMsg.Bytes())
    82  	signature, err := backend.GetSignature(context.Background(), messageID)
    83  	require.NoError(t, err)
    84  
    85  	expectedSig, err := snowCtx.TeleporterSigner.Sign(unsignedMsg)
    86  	require.NoError(t, err)
    87  	require.Equal(t, expectedSig, signature[:])
    88  }