[WIP] Unit test for core/staking_verifier.go (#2323)
* adding sample tests for staking verifier * Unit test for staking_verifier * add CV6, CV7, CV8 * CV9 --- CV13 * add Unit test: CV14 -- CV22 * add Unit test: CV23 - CV28 * Unit test: CV29 - CV39 Co-authored-by: Ganesha Upadhyaya <ganeshrvce@gmail.com>pull/2380/head
parent
285e142364
commit
a53d8d31d5
@ -0,0 +1,508 @@ |
||||
package core |
||||
|
||||
import ( |
||||
"math/big" |
||||
"strings" |
||||
"testing" |
||||
|
||||
"github.com/ethereum/go-ethereum/common" |
||||
"github.com/ethereum/go-ethereum/ethdb" |
||||
"github.com/harmony-one/bls/ffi/go/bls" |
||||
"github.com/harmony-one/harmony/core/state" |
||||
"github.com/harmony-one/harmony/crypto/hash" |
||||
common2 "github.com/harmony-one/harmony/internal/common" |
||||
"github.com/harmony-one/harmony/internal/ctxerror" |
||||
"github.com/harmony-one/harmony/numeric" |
||||
"github.com/harmony-one/harmony/shard" |
||||
staking "github.com/harmony-one/harmony/staking/types" |
||||
) |
||||
|
||||
var ( |
||||
validatorAddress = common.Address(common2.MustBech32ToAddress("one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy")) |
||||
) |
||||
|
||||
func generateBlsKeySigPair() (shard.BlsPublicKey, shard.BLSSignature) { |
||||
p := &bls.PublicKey{} |
||||
p.DeserializeHexStr(testBLSPubKey) |
||||
pub := shard.BlsPublicKey{} |
||||
pub.FromLibBLSPublicKey(p) |
||||
messageBytes := []byte(staking.BlsVerificationStr) |
||||
privateKey := &bls.SecretKey{} |
||||
privateKey.DeserializeHexStr(testBLSPrvKey) |
||||
msgHash := hash.Keccak256(messageBytes) |
||||
signature := privateKey.SignHash(msgHash[:]) |
||||
var sig shard.BLSSignature |
||||
copy(sig[:], signature.Serialize()) |
||||
return pub, sig |
||||
} |
||||
|
||||
func createValidator() *staking.CreateValidator { |
||||
desc := staking.Description{ |
||||
Name: "SuperHero", |
||||
Identity: "YouWouldNotKnow", |
||||
Website: "Secret Website", |
||||
SecurityContact: "LicenseToKill", |
||||
Details: "blah blah blah", |
||||
} |
||||
rate, _ := numeric.NewDecFromStr("0.1") |
||||
maxRate, _ := numeric.NewDecFromStr("0.5") |
||||
maxChangeRate, _ := numeric.NewDecFromStr("0.05") |
||||
commission := staking.CommissionRates{ |
||||
Rate: rate, |
||||
MaxRate: maxRate, |
||||
MaxChangeRate: maxChangeRate, |
||||
} |
||||
minSelfDel := big.NewInt(1e18) |
||||
maxTotalDel := big.NewInt(9e18) |
||||
pubKey, pubSig := generateBlsKeySigPair() |
||||
slotPubKeys := []shard.BlsPublicKey{pubKey} |
||||
slotKeySigs := []shard.BLSSignature{pubSig} |
||||
amount := big.NewInt(5e18) |
||||
v := staking.CreateValidator{ |
||||
ValidatorAddress: validatorAddress, |
||||
Description: desc, |
||||
CommissionRates: commission, |
||||
MinSelfDelegation: minSelfDel, |
||||
MaxTotalDelegation: maxTotalDel, |
||||
SlotPubKeys: slotPubKeys, |
||||
SlotKeySigs: slotKeySigs, |
||||
Amount: amount, |
||||
} |
||||
return &v |
||||
} |
||||
|
||||
// Test CV1: create validator
|
||||
func TestCV1(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV3: validator already exists
|
||||
func TestCV3(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
statedb.SetValidatorFlag(msg.ValidatorAddress) |
||||
|
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); !strings.Contains(err.Error(), errValidatorExist.Error()) { |
||||
t.Error("expected", errValidatorExist, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV5: identity longer than 140 characters
|
||||
func TestCV5(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// identity length: 200 characters
|
||||
msg.Identity = "adsfwryuiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfhuewhfiuewhfefhshfrhfhifhwbfvberhbvihfwuoefhusioehfeuwiafhaiobcfwfhceirui" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
identitylengthError := ctxerror.New("[EnsureLength] Exceed Maximum Length", "have", len(msg.Identity), "maxIdentityLen", staking.MaxIdentityLength) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err.Error() != identitylengthError.Error() { |
||||
t.Error("expected", identitylengthError, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV6: website longer than 140 characters
|
||||
func TestCV6(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// Website length: 200 characters
|
||||
msg.Website = "https://www.iwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceirui.com" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
websiteLengthError := ctxerror.New("[EnsureLength] Exceed Maximum Length", "have", len(msg.Website), "maxWebsiteLen", staking.MaxWebsiteLength) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err.Error() != websiteLengthError.Error() { |
||||
t.Error("expected", websiteLengthError, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV7: security contact longer than 140 characters
|
||||
func TestCV7(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// Website length: 200 characters
|
||||
msg.SecurityContact = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceiruiHellodfdfdf" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
securityContactLengthError := ctxerror.New("[EnsureLength] Exceed Maximum Length", "have", len(msg.SecurityContact), "maxSecurityContactLen", staking.MaxWebsiteLength) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err.Error() != securityContactLengthError.Error() { |
||||
t.Error("expected", securityContactLengthError, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV8: details longer than 280 characters
|
||||
func TestCV8(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// Website length: 300 characters
|
||||
msg.Details = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwiewwerfhuwefiuewfwwwwwfiuewhfefhshfrheterhbvihfwuoefhusioehfeuwiafhaiobcfwfhceiruiHellodfdfdfjiusngognoherugbounviesrbgufhuoshcofwevusguahferhgvuervurehniwjvseivusehvsghjvorsugjvsiovjpsevsvvvvv" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
detailsLenError := ctxerror.New("[EnsureLength] Exceed Maximum Length", "have", len(msg.Details), "maxDetailsLen", staking.MaxDetailsLength) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err.Error() != detailsLenError.Error() { |
||||
t.Error("expected", detailsLenError, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV9: name == 140 characters
|
||||
func TestCV9(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// name length: 140 characters
|
||||
msg.Name = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV10: identity == 140 characters
|
||||
func TestCV10(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// identity length: 140 characters
|
||||
msg.Identity = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV11: website == 140 characters
|
||||
func TestCV11(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// website length: 140 characters
|
||||
msg.Website = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV12: security == 140 characters
|
||||
func TestCV12(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// security contact length: 140 characters
|
||||
msg.SecurityContact = "Helloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV13: details == 280 characters
|
||||
func TestCV13(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
// details length: 280 characters
|
||||
msg.Details = "HelloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuebfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjoweHlloiwfhwifbwfbcerghveugbviuscbhwiefbcusidbcifwefhgciwefherhbfiwuehfciwiuedbfcuyiewfhwieufwiweifhcwefhwefhwidsffevjnononwondqmeofniowfndjowe" |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV14: commission rate <= max rate & max change rate <= max rate
|
||||
func TestCV14(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// commission rate == max rate && max change rate == max rate
|
||||
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("0.5") |
||||
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("0.5") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV15: commission rate > max rate
|
||||
func TestCV15(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// commission rate: 0.6 > max rate: 0.5
|
||||
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("0.6") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "commission rate and change rate can not be larger than max commission rate", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV16: max change rate > max rate
|
||||
func TestCV16(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max change rate: 0.6 > max rate: 0.5
|
||||
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("0.6") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "commission rate and change rate can not be larger than max commission rate", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV17: max rate == 1
|
||||
func TestCV17(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max rate == 1
|
||||
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("1") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV18: max rate == 1 && max change rate == 1 && commission rate == 0
|
||||
func TestCV18(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max rate == 1 && max change rate == 1 && commission rate == 0
|
||||
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("1") |
||||
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("1") |
||||
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("1") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV19: commission rate == 0
|
||||
func TestCV19(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// commission rate == 0
|
||||
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("0") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV20: max change rate == 0
|
||||
func TestCV20(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// commission rate == 0
|
||||
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("0") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV21: max change rate == 0 & max rate == 0 & commission rate == 0
|
||||
func TestCV21(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max change rate == 0 & max rate == 0 & commission rate == 0
|
||||
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("0") |
||||
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("0") |
||||
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("0") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV22: max change rate == 1 & max rate == 1
|
||||
func TestCV22(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max change rate == 1 & max rate == 1
|
||||
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("1") |
||||
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("1") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV23: commission rate < 0
|
||||
func TestCV23(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// commission rate < 0
|
||||
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("-0.1") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "rate:-0.100000000000000000: commission rate, change rate and max rate should be within 0-100 percent", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV24: max rate < 0
|
||||
func TestCV24(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max rate < 0
|
||||
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("-0.001") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "rate:-0.001000000000000000: commission rate, change rate and max rate should be within 0-100 percent", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV25: max change rate < 0
|
||||
func TestCV25(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max rate < 0
|
||||
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("-0.001") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "rate:-0.001000000000000000: commission rate, change rate and max rate should be within 0-100 percent", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV26: commission rate > 1
|
||||
func TestCV26(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// commission rate > 1
|
||||
msg.CommissionRates.Rate, _ = numeric.NewDecFromStr("1.01") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "rate:1.01000000000000000: commission rate, change rate and max rate should be within 0-100 percent", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV27: max rate > 1
|
||||
func TestCV27(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max rate > 1
|
||||
msg.CommissionRates.MaxRate, _ = numeric.NewDecFromStr("1.01") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "rate:1.01000000000000000: commission rate, change rate and max rate should be within 0-100 percent", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV28: max change rate > 1
|
||||
func TestCV28(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// max change rate > 1
|
||||
msg.CommissionRates.MaxChangeRate, _ = numeric.NewDecFromStr("1.01") |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "rate:1.01000000000000000: commission rate, change rate and max rate should be within 0-100 percent", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV29: amount > MinSelfDelegation
|
||||
func TestCV29(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// amount > MinSelfDelegation
|
||||
msg.Amount = big.NewInt(4e18) |
||||
msg.MinSelfDelegation = big.NewInt(1e18) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV30: amount == MinSelfDelegation
|
||||
func TestCV30(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// amount > MinSelfDelegation
|
||||
msg.Amount = big.NewInt(4e18) |
||||
msg.MinSelfDelegation = big.NewInt(4e18) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err != nil { |
||||
t.Error("expected", nil, "got", err) |
||||
} |
||||
} |
||||
|
||||
// Test CV31: amount < MinSelfDelegation
|
||||
func TestCV31(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// amount > MinSelfDelegation
|
||||
msg.Amount = big.NewInt(4e18) |
||||
msg.MinSelfDelegation = big.NewInt(5e18) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "have 4000000000000000000 want 5000000000000000000: self delegation can not be less than min_self_delegation", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV32: MaxTotalDelegation < MinSelfDelegation
|
||||
func TestCV32(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// MaxTotalDelegation < MinSelfDelegation
|
||||
msg.MaxTotalDelegation = big.NewInt(2e18) |
||||
msg.MinSelfDelegation = big.NewInt(3e18) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "max_total_delegation can not be less than min_self_delegation", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV33: MinSelfDelegation < 1 ONE
|
||||
func TestCV33(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// MinSelfDelegation < 1 ONE
|
||||
msg.MinSelfDelegation = big.NewInt(1e18 - 1) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "delegation-given 999999999999999999: min_self_delegation has to be greater than 1 ONE", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV34: MinSelfDelegation not specified
|
||||
func TestCV34(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// MinSelfDelegation not specified
|
||||
msg.MinSelfDelegation = nil |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "MinSelfDelegation can not be nil", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV35: MinSelfDelegation < 0
|
||||
func TestCV35(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// MinSelfDelegation < 0
|
||||
msg.MinSelfDelegation = big.NewInt(-1) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "delegation-given -1: min_self_delegation has to be greater than 1 ONE", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV36: amount > MaxTotalDelegation
|
||||
func TestCV36(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// amount > MaxTotalDelegation
|
||||
msg.Amount = big.NewInt(4e18) |
||||
msg.MaxTotalDelegation = big.NewInt(3e18) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "total delegation can not be bigger than max_total_delegation", "got", nil) |
||||
} |
||||
} |
||||
|
||||
// Test CV39: MaxTotalDelegation < 0
|
||||
func TestCV39(t *testing.T) { |
||||
statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) |
||||
msg := createValidator() |
||||
statedb.AddBalance(msg.ValidatorAddress, big.NewInt(5e18)) |
||||
// MaxTotalDelegation < 0
|
||||
msg.MaxTotalDelegation = big.NewInt(-1) |
||||
if _, err := VerifyAndCreateValidatorFromMsg(statedb, big.NewInt(0), big.NewInt(0), msg); err == nil { |
||||
t.Error("expected", "max_total_delegation can not be less than min_self_delegation", "got", nil) |
||||
} |
||||
} |
Loading…
Reference in new issue