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 }