github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/contexts/name_context_test.go (about)

     1  package contexts
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/hyperledger/burrow/acm"
     8  	"github.com/hyperledger/burrow/acm/acmstate"
     9  	"github.com/hyperledger/burrow/bcm"
    10  	"github.com/hyperledger/burrow/crypto"
    11  	"github.com/hyperledger/burrow/execution/exec"
    12  	"github.com/hyperledger/burrow/execution/names"
    13  	"github.com/hyperledger/burrow/execution/state"
    14  	"github.com/hyperledger/burrow/genesis"
    15  	"github.com/hyperledger/burrow/logging"
    16  	"github.com/hyperledger/burrow/txs"
    17  	"github.com/hyperledger/burrow/txs/payload"
    18  	"github.com/stretchr/testify/require"
    19  	dbm "github.com/tendermint/tm-db"
    20  )
    21  
    22  func TestNameContext(t *testing.T) {
    23  	accountState := acmstate.NewMemoryState()
    24  
    25  	privKey := newPrivKey(t)
    26  	account := newAccountFromPrivKey(privKey)
    27  
    28  	db := dbm.NewMemDB()
    29  	genesisDoc, _, _ := genesis.NewDeterministicGenesis(3450976).GenesisDoc(23, 10)
    30  	blockchain := bcm.NewBlockchain(db, genesisDoc)
    31  	state := state.NewState(db)
    32  
    33  	ctx := &NameContext{
    34  		State:      accountState,
    35  		Logger:     logging.NewNoopLogger(),
    36  		Blockchain: blockchain,
    37  		NameReg:    names.NewCache(state),
    38  	}
    39  
    40  	callTx := &payload.CallTx{}
    41  	err := ctx.Execute(execFromTx(callTx), callTx)
    42  	require.Error(t, err, "should not continue with incorrect payload")
    43  
    44  	nameTx := &payload.NameTx{
    45  		Input: &payload.TxInput{
    46  			Address: account.Address,
    47  		},
    48  	}
    49  
    50  	err = ctx.Execute(execFromTx(nameTx), nameTx)
    51  	require.Error(t, err, "account should not exist")
    52  
    53  	accountState.Accounts[account.Address] = account
    54  	nameTx.Name = "foobar"
    55  
    56  	err = ctx.Execute(execFromTx(nameTx), nameTx)
    57  	require.Error(t, err, "insufficient amount")
    58  
    59  	costPerBlock := names.NameCostPerBlock(names.NameBaseCost(ctx.tx.Name, ctx.tx.Data))
    60  	nameTx.Input.Amount = names.MinNameRegistrationPeriod * costPerBlock
    61  
    62  	err = ctx.Execute(execFromTx(nameTx), nameTx)
    63  	require.NoError(t, err, "should successfully set namereg")
    64  }
    65  
    66  func TestValidateStrings(t *testing.T) {
    67  	nameTx := &payload.NameTx{}
    68  	err := validateStrings(nameTx)
    69  	require.Error(t, err, "should fail on empty name")
    70  
    71  	nameTx.Name = strings.Repeat("A", names.MaxNameLength+1)
    72  	err = validateStrings(nameTx)
    73  	require.Error(t, err, "should fail because name is too long")
    74  
    75  	nameTx.Name = "foo"
    76  
    77  	nameTx.Data = strings.Repeat("A", names.MaxDataLength+1)
    78  	err = validateStrings(nameTx)
    79  	require.Error(t, err, "should fail because data is too long")
    80  
    81  	nameTx.Data = "bar"
    82  	err = validateStrings(nameTx)
    83  	require.NoError(t, err, "name reg entry should be valid")
    84  }
    85  
    86  func newPrivKey(t *testing.T) crypto.PrivateKey {
    87  	privKey, err := crypto.GeneratePrivateKey(nil, crypto.CurveTypeEd25519)
    88  	require.NoError(t, err)
    89  	return privKey
    90  }
    91  
    92  func newAccountFromPrivKey(privKey crypto.PrivateKey) *acm.Account {
    93  	pubKey := privKey.GetPublicKey()
    94  	address := pubKey.GetAddress()
    95  
    96  	return &acm.Account{
    97  		Address:   address,
    98  		PublicKey: pubKey,
    99  		Balance:   1337,
   100  	}
   101  }
   102  
   103  func execFromTx(payl payload.Payload) *exec.TxExecution {
   104  	return &exec.TxExecution{
   105  		Envelope: &txs.Envelope{
   106  			Tx: &txs.Tx{
   107  				Payload: payl,
   108  			},
   109  		},
   110  	}
   111  }