aboutsummaryrefslogtreecommitdiffstats
path: root/core/test
diff options
context:
space:
mode:
authorMission Liao <mission.liao@dexon.org>2018-12-06 14:30:05 +0800
committerGitHub <noreply@github.com>2018-12-06 14:30:05 +0800
commit41753e517c68575589c485b3f9570db94e59bcd0 (patch)
tree88ca8e57415164bce765658f3f55d51e85646eb3 /core/test
parent4eb02f1dd96e136b0f7cf7eff792da1e44176713 (diff)
downloaddexon-consensus-41753e517c68575589c485b3f9570db94e59bcd0.tar
dexon-consensus-41753e517c68575589c485b3f9570db94e59bcd0.tar.gz
dexon-consensus-41753e517c68575589c485b3f9570db94e59bcd0.tar.bz2
dexon-consensus-41753e517c68575589c485b3f9570db94e59bcd0.tar.lz
dexon-consensus-41753e517c68575589c485b3f9570db94e59bcd0.tar.xz
dexon-consensus-41753e517c68575589c485b3f9570db94e59bcd0.tar.zst
dexon-consensus-41753e517c68575589c485b3f9570db94e59bcd0.zip
test: allow to log in test.State (#359)
Diffstat (limited to 'core/test')
-rw-r--r--core/test/governance.go9
-rw-r--r--core/test/governance_test.go10
-rw-r--r--core/test/network_test.go3
-rw-r--r--core/test/state-change-request.go58
-rw-r--r--core/test/state.go25
-rw-r--r--core/test/state_test.go15
6 files changed, 86 insertions, 34 deletions
diff --git a/core/test/governance.go b/core/test/governance.go
index 14c8177..9bb042e 100644
--- a/core/test/governance.go
+++ b/core/test/governance.go
@@ -24,7 +24,6 @@ import (
"reflect"
"sort"
"sync"
- "time"
"github.com/dexon-foundation/dexon-consensus/common"
"github.com/dexon-foundation/dexon-consensus/core/crypto"
@@ -48,16 +47,12 @@ type Governance struct {
}
// NewGovernance constructs a Governance instance.
-func NewGovernance(genesisNodes []crypto.PublicKey, lambda time.Duration,
- roundShift uint64) (g *Governance, err error) {
+func NewGovernance(state *State, roundShift uint64) (g *Governance, err error) {
// Setup a State instance.
- // TODO(mission): it's not a good idea to embed initialization of one
- // public class in another, I did this to make the range of
- // modification smaller.
g = &Governance{
roundShift: roundShift,
pendingConfigChanges: make(map[uint64]map[StateChangeType]interface{}),
- stateModule: NewState(genesisNodes, lambda, true),
+ stateModule: state,
}
return
}
diff --git a/core/test/governance_test.go b/core/test/governance_test.go
index 01993f9..30f1469 100644
--- a/core/test/governance_test.go
+++ b/core/test/governance_test.go
@@ -21,6 +21,7 @@ import (
"testing"
"time"
+ "github.com/dexon-foundation/dexon-consensus/common"
"github.com/stretchr/testify/suite"
)
@@ -33,10 +34,12 @@ func (s *GovernanceTestSuite) TestEqual() {
// Setup a base governance.
_, genesisNodes, err := NewKeys(20)
req.NoError(err)
- g1, err := NewGovernance(genesisNodes, 100*time.Millisecond, 2)
+ g1, err := NewGovernance(NewState(
+ genesisNodes, 100*time.Millisecond, &common.NullLogger{}, true), 2)
req.NoError(err)
// Create a governance with different lambda.
- g2, err := NewGovernance(genesisNodes, 50*time.Millisecond, 2)
+ g2, err := NewGovernance(NewState(
+ genesisNodes, 50*time.Millisecond, &common.NullLogger{}, true), 2)
req.NoError(err)
req.False(g1.Equal(g2, true))
// Create configs for 3 rounds for g1.
@@ -68,7 +71,8 @@ func (s *GovernanceTestSuite) TestRegisterChange() {
req := s.Require()
_, genesisNodes, err := NewKeys(20)
req.NoError(err)
- g, err := NewGovernance(genesisNodes, 100*time.Millisecond, 2)
+ g, err := NewGovernance(NewState(
+ genesisNodes, 100*time.Millisecond, &common.NullLogger{}, true), 2)
req.NoError(err)
// Unable to register change for genesis round.
req.Error(g.RegisterConfigChange(0, StateChangeNumChains, uint32(32)))
diff --git a/core/test/network_test.go b/core/test/network_test.go
index 1f9ec6f..e05dec5 100644
--- a/core/test/network_test.go
+++ b/core/test/network_test.go
@@ -253,7 +253,8 @@ func (s *NetworkTestSuite) TestBroadcastToSet() {
)
_, pubKeys, err := NewKeys(peerCount)
req.NoError(err)
- gov, err := NewGovernance(pubKeys, time.Second, 2)
+ gov, err := NewGovernance(NewState(
+ pubKeys, time.Second, &common.NullLogger{}, true), 2)
req.NoError(err)
req.NoError(gov.State().RequestChange(StateChangeDKGSetSize, uint32(1)))
req.NoError(gov.State().RequestChange(StateChangeNotarySetSize, uint32(1)))
diff --git a/core/test/state-change-request.go b/core/test/state-change-request.go
index 0f49db0..84d4d3f 100644
--- a/core/test/state-change-request.go
+++ b/core/test/state-change-request.go
@@ -18,10 +18,13 @@
package test
import (
+ "fmt"
+ "math"
"time"
"github.com/dexon-foundation/dexon-consensus/common"
"github.com/dexon-foundation/dexon-consensus/core/crypto"
+ "github.com/dexon-foundation/dexon-consensus/core/types"
typesDKG "github.com/dexon-foundation/dexon-consensus/core/types/dkg"
"github.com/dexon-foundation/dexon/rlp"
)
@@ -43,7 +46,6 @@ const (
StateChangeLambdaDKG
StateChangeRoundInterval
StateChangeMinBlockInterval
- StateChangeMaxBlockInterval
StateChangeK
StateChangePhiRatio
StateChangeNotarySetSize
@@ -133,3 +135,57 @@ func (req *StateChangeRequest) Equal(other *StateChangeRequest) error {
}
return ErrStatePendingChangesNotEqual
}
+
+// String dump the state change request into string form.
+func (req *StateChangeRequest) String() (ret string) {
+ ret = "stateChangeRequest"
+ switch req.Type {
+ case StateChangeNothing:
+ ret += "{Type:Nothing}"
+ case StateAddCRS:
+ crsReq := req.Payload.(*crsAdditionRequest)
+ ret += fmt.Sprintf("{Type:AddCRS Round:%v CRS:%s",
+ crsReq.Round,
+ crsReq.CRS.String()[:6])
+ case StateAddDKGComplaint:
+ ret += fmt.Sprintf(
+ "{Type:AddDKGComplaint %s", req.Payload.(*typesDKG.Complaint))
+ case StateAddDKGMasterPublicKey:
+ ret += fmt.Sprintf(
+ "{Type:AddDKGMasterPublicKey %s",
+ req.Payload.(*typesDKG.MasterPublicKey))
+ case StateAddDKGFinal:
+ ret += fmt.Sprintf(
+ "{Type:AddDKGFinal %s", req.Payload.(*typesDKG.Finalize))
+ case StateChangeNumChains:
+ ret += fmt.Sprintf("{Type:ChangeNumChains %v", req.Payload.(uint32))
+ case StateChangeLambdaBA:
+ ret += fmt.Sprintf(
+ "{Type:ChangeLambdaBA %v", time.Duration(req.Payload.(uint64)))
+ case StateChangeLambdaDKG:
+ ret += fmt.Sprintf(
+ "{Type:ChangeLambdaDKG %v", time.Duration(req.Payload.(uint64)))
+ case StateChangeRoundInterval:
+ ret += fmt.Sprintf(
+ "{Type:ChangeRoundInterval %v", time.Duration(req.Payload.(uint64)))
+ case StateChangeMinBlockInterval:
+ ret += fmt.Sprintf(
+ "{Type:ChangeMinBlockInterval %v",
+ time.Duration(req.Payload.(uint64)))
+ case StateChangeK:
+ ret += fmt.Sprintf("Type:ChangeK %v", req.Payload.(uint64))
+ case StateChangePhiRatio:
+ ret += fmt.Sprintf(
+ "{Type:ChangePhiRatio %v", math.Float32frombits(req.Payload.(uint32)))
+ case StateChangeNotarySetSize:
+ ret += fmt.Sprintf("{Type:ChangeNotarySetSize %v", req.Payload.(uint32))
+ case StateChangeDKGSetSize:
+ ret += fmt.Sprintf("{Type:ChangeDKGSetSize %v", req.Payload.(uint32))
+ case StateAddNode:
+ ret += fmt.Sprintf(
+ "{Type:AddNode %s",
+ types.NewNodeID(req.Payload.(crypto.PublicKey)).String()[:6])
+ }
+ panic(fmt.Errorf(
+ "attempting to dump unknown type of state change request: %v", req.Type))
+}
diff --git a/core/test/state.go b/core/test/state.go
index b39bafe..b360fa2 100644
--- a/core/test/state.go
+++ b/core/test/state.go
@@ -90,7 +90,6 @@ type State struct {
dkgSetSize uint32
roundInterval time.Duration
minBlockInterval time.Duration
- maxBlockInterval time.Duration
// Nodes
nodes map[types.NodeID]crypto.PublicKey
// DKG & CRS
@@ -100,6 +99,7 @@ type State struct {
crs []common.Hash
// Other stuffs
local bool
+ logger common.Logger
lock sync.RWMutex
appliedRequests map[common.Hash]struct{}
// Pending change requests.
@@ -111,7 +111,10 @@ type State struct {
// - node set
// - crs
func NewState(
- nodePubKeys []crypto.PublicKey, lambda time.Duration, local bool) *State {
+ nodePubKeys []crypto.PublicKey,
+ lambda time.Duration,
+ logger common.Logger,
+ local bool) *State {
nodes := make(map[types.NodeID]crypto.PublicKey)
for _, key := range nodePubKeys {
nodes[types.NewNodeID(key)] = key
@@ -119,12 +122,12 @@ func NewState(
genesisCRS := crypto.Keccak256Hash([]byte("__ DEXON"))
return &State{
local: local,
+ logger: logger,
numChains: uint32(len(nodes)),
lambdaBA: lambda,
lambdaDKG: lambda * 10,
roundInterval: lambda * 10000,
minBlockInterval: time.Millisecond * 1,
- maxBlockInterval: lambda * 8,
crs: []common.Hash{genesisCRS},
nodes: nodes,
phiRatio: 0.667,
@@ -209,10 +212,6 @@ func (s *State) unpackPayload(
var tmp uint64
err = rlp.DecodeBytes(raw.Payload, &tmp)
v = tmp
- case StateChangeMaxBlockInterval:
- var tmp uint64
- err = rlp.DecodeBytes(raw.Payload, &tmp)
- v = tmp
case StateChangeK:
var tmp uint64
err = rlp.DecodeBytes(raw.Payload, &tmp)
@@ -275,8 +274,7 @@ func (s *State) Equal(other *State) error {
s.notarySetSize == other.notarySetSize &&
s.dkgSetSize == other.dkgSetSize &&
s.roundInterval == other.roundInterval &&
- s.minBlockInterval == other.minBlockInterval &&
- s.maxBlockInterval == other.maxBlockInterval
+ s.minBlockInterval == other.minBlockInterval
if !configEqual {
return ErrStateConfigNotEqual
}
@@ -418,8 +416,8 @@ func (s *State) Clone() (copied *State) {
dkgSetSize: s.dkgSetSize,
roundInterval: s.roundInterval,
minBlockInterval: s.minBlockInterval,
- maxBlockInterval: s.maxBlockInterval,
local: s.local,
+ logger: s.logger,
nodes: make(map[types.NodeID]crypto.PublicKey),
dkgComplaints: make(
map[uint64]map[types.NodeID][]*typesDKG.Complaint),
@@ -496,6 +494,7 @@ func (s *State) Apply(reqsAsBytes []byte) (err error) {
s.lock.Lock()
defer s.lock.Unlock()
for _, req := range reqs {
+ s.logger.Debug("Apply Request", "req", req)
// Remove this request from pending set once it's about to apply.
delete(s.globalRequests, req.Hash)
delete(s.ownRequests, req.Hash)
@@ -549,6 +548,7 @@ func (s *State) PackRequests() (b []byte, err error) {
s.lock.Lock()
defer s.lock.Unlock()
for _, v := range s.globalRequests {
+ s.logger.Debug("Pack Request", "req", v)
packed = append(packed, v)
}
return rlp.EncodeToBytes(packed)
@@ -667,8 +667,6 @@ func (s *State) applyRequest(req *StateChangeRequest) error {
s.roundInterval = time.Duration(req.Payload.(uint64))
case StateChangeMinBlockInterval:
s.minBlockInterval = time.Duration(req.Payload.(uint64))
- case StateChangeMaxBlockInterval:
- s.maxBlockInterval = time.Duration(req.Payload.(uint64))
case StateChangeK:
s.k = int(req.Payload.(uint64))
case StateChangePhiRatio:
@@ -702,8 +700,7 @@ func (s *State) RequestChange(
case StateChangeLambdaBA,
StateChangeLambdaDKG,
StateChangeRoundInterval,
- StateChangeMinBlockInterval,
- StateChangeMaxBlockInterval:
+ StateChangeMinBlockInterval:
payload = uint64(payload.(time.Duration))
case StateChangeK:
payload = uint64(payload.(int))
diff --git a/core/test/state_test.go b/core/test/state_test.go
index 864b5be..9daee3a 100644
--- a/core/test/state_test.go
+++ b/core/test/state_test.go
@@ -132,7 +132,6 @@ func (s *StateTestSuite) makeConfigChanges(st *State) {
st.RequestChange(StateChangeLambdaDKG, time.Millisecond)
st.RequestChange(StateChangeRoundInterval, time.Hour)
st.RequestChange(StateChangeMinBlockInterval, time.Second)
- st.RequestChange(StateChangeMaxBlockInterval, time.Minute)
st.RequestChange(StateChangeK, 1)
st.RequestChange(StateChangePhiRatio, float32(0.5))
st.RequestChange(StateChangeNotarySetSize, uint32(5))
@@ -159,10 +158,10 @@ func (s *StateTestSuite) TestEqual() {
)
_, genesisNodes, err := NewKeys(20)
req.NoError(err)
- st := NewState(genesisNodes, lambda, true)
+ st := NewState(genesisNodes, lambda, &common.NullLogger{}, true)
req.NoError(st.Equal(st))
// One node is missing.
- st1 := NewState(genesisNodes, lambda, true)
+ st1 := NewState(genesisNodes, lambda, &common.NullLogger{}, true)
for nID := range st1.nodes {
delete(st1.nodes, nID)
break
@@ -216,7 +215,7 @@ func (s *StateTestSuite) TestPendingChangesEqual() {
// Setup a non-local mode State instance.
_, genesisNodes, err := NewKeys(20)
req.NoError(err)
- st := NewState(genesisNodes, lambda, false)
+ st := NewState(genesisNodes, lambda, &common.NullLogger{}, false)
req.NoError(st.Equal(st))
// Apply some changes.
s.makeConfigChanges(st)
@@ -236,7 +235,7 @@ func (s *StateTestSuite) TestLocalMode() {
)
_, genesisNodes, err := NewKeys(20)
req.NoError(err)
- st := NewState(genesisNodes, lambda, true)
+ st := NewState(genesisNodes, lambda, &common.NullLogger{}, true)
config1, nodes1 := st.Snapshot()
req.True(s.compareNodes(genesisNodes, nodes1))
// Check settings of config1 affected by genesisNodes and lambda.
@@ -296,7 +295,7 @@ func (s *StateTestSuite) TestPacking() {
// Make config changes.
_, genesisNodes, err := NewKeys(20)
req.NoError(err)
- st := NewState(genesisNodes, lambda, false)
+ st := NewState(genesisNodes, lambda, &common.NullLogger{}, false)
s.makeConfigChanges(st)
// Add new CRS.
crs := common.NewRandomHash()
@@ -357,8 +356,8 @@ func (s *StateTestSuite) TestRequestBroadcastAndPack() {
)
_, genesisNodes, err := NewKeys(20)
req.NoError(err)
- st := NewState(genesisNodes, lambda, false)
- st1 := NewState(genesisNodes, lambda, false)
+ st := NewState(genesisNodes, lambda, &common.NullLogger{}, false)
+ st1 := NewState(genesisNodes, lambda, &common.NullLogger{}, false)
req.NoError(st.Equal(st1))
// Make configuration changes.
s.makeConfigChanges(st)