diff options
author | Mission Liao <mission.liao@dexon.org> | 2018-11-11 13:13:40 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-11 13:13:40 +0800 |
commit | 795b8b5309ed94858f3bd56e42093d65dcdd0870 (patch) | |
tree | 3618a5afe6fb3b486614bd164071b2c02eed18c8 /core | |
parent | 81372e5746fedf0ad691ab628096b7caefbe3008 (diff) | |
download | dexon-consensus-795b8b5309ed94858f3bd56e42093d65dcdd0870.tar dexon-consensus-795b8b5309ed94858f3bd56e42093d65dcdd0870.tar.gz dexon-consensus-795b8b5309ed94858f3bd56e42093d65dcdd0870.tar.bz2 dexon-consensus-795b8b5309ed94858f3bd56e42093d65dcdd0870.tar.lz dexon-consensus-795b8b5309ed94858f3bd56e42093d65dcdd0870.tar.xz dexon-consensus-795b8b5309ed94858f3bd56e42093d65dcdd0870.tar.zst dexon-consensus-795b8b5309ed94858f3bd56e42093d65dcdd0870.zip |
test: add integration test (#315)
* Rename NonByzantineTestSuite to WithSchedulerTestsuite
* Add a method to query the latest position delivered
* Add integration test for core.Consensus
* Show detailed list for test cases in CI
Diffstat (limited to 'core')
-rw-r--r-- | core/consensus.go | 4 | ||||
-rw-r--r-- | core/test/app.go | 20 | ||||
-rw-r--r-- | core/test/network.go | 27 | ||||
-rw-r--r-- | core/test/utils.go | 13 |
4 files changed, 51 insertions, 13 deletions
diff --git a/core/consensus.go b/core/consensus.go index a449701..89f2242 100644 --- a/core/consensus.go +++ b/core/consensus.go @@ -719,7 +719,6 @@ func (con *Consensus) initialRound( } con.initialRound( startTime.Add(config.RoundInterval), nextRound, nextConfig) - con.round = nextRound }) } @@ -909,9 +908,6 @@ func (con *Consensus) ProcessAgreementResult( if !con.ccModule.blockRegistered(rand.BlockHash) { return nil } - if DiffUint64(con.round, rand.Position.Round) > 1 { - return nil - } // Sanity check done. if !con.cfgModule.touchTSigHash(rand.BlockHash) { return nil diff --git a/core/test/app.go b/core/test/app.go index 7477329..a5d0270 100644 --- a/core/test/app.go +++ b/core/test/app.go @@ -76,6 +76,7 @@ type AppDeliveredRecord struct { ConsensusTime time.Time ConsensusHeight uint64 When time.Time + Pos types.Position } // App implements Application interface for testing purpose. @@ -89,7 +90,7 @@ type App struct { DeliverSequence common.Hashes deliveredLock sync.RWMutex blocks map[common.Hash]*types.Block - blocksLock sync.Mutex + blocksLock sync.RWMutex state *State } @@ -162,7 +163,7 @@ func (app *App) TotalOrderingDelivered(blockHashes common.Hashes, mode uint32) { // BlockDelivered implements Application interface. func (app *App) BlockDelivered( - blockHash common.Hash, _ types.Position, result types.FinalizationResult) { + blockHash common.Hash, pos types.Position, result types.FinalizationResult) { func() { app.deliveredLock.Lock() defer app.deliveredLock.Unlock() @@ -170,6 +171,7 @@ func (app *App) BlockDelivered( ConsensusTime: result.Timestamp, ConsensusHeight: result.Height, When: time.Now().UTC(), + Pos: pos, } app.DeliverSequence = append(app.DeliverSequence, blockHash) }() @@ -178,8 +180,8 @@ func (app *App) BlockDelivered( if app.state == nil { return } - app.blocksLock.Lock() - defer app.blocksLock.Unlock() + app.blocksLock.RLock() + defer app.blocksLock.RUnlock() b := app.blocks[blockHash] if err := app.state.Apply(b.Payload); err != nil { if err != ErrDuplicatedChange { @@ -189,6 +191,16 @@ func (app *App) BlockDelivered( }() } +// GetLatestDeliveredPosition would return the latest position of delivered +// block seen by this application instance. +func (app *App) GetLatestDeliveredPosition() types.Position { + app.deliveredLock.RLock() + defer app.deliveredLock.RUnlock() + app.blocksLock.RLock() + defer app.blocksLock.RUnlock() + return app.blocks[app.DeliverSequence[len(app.DeliverSequence)-1]].Position +} + // Compare performs these checks against another App instance // and return erros if not passed: // - deliver sequence by comparing block hashes. diff --git a/core/test/network.go b/core/test/network.go index 949b158..6aff3d6 100644 --- a/core/test/network.go +++ b/core/test/network.go @@ -207,6 +207,8 @@ func (n *Network) BroadcastVote(vote *types.Vote) { // BroadcastBlock implements core.Network interface. func (n *Network) BroadcastBlock(block *types.Block) { + // Avoid data race in fake transport. + block = n.cloneForFake(block).(*types.Block) if err := n.trans.Broadcast(block); err != nil { panic(err) } @@ -316,7 +318,8 @@ func (n *Network) Setup(serverEndpoint interface{}) (err error) { } func (n *Network) dispatchMsg(e *TransportEnvelope) { - switch v := e.Msg.(type) { + msg := n.cloneForFake(e.Msg) + switch v := msg.(type) { case *types.Block: n.addBlockToCache(v) // Notify pulling routine about the newly arrived block. @@ -327,14 +330,14 @@ func (n *Network) dispatchMsg(e *TransportEnvelope) { ch <- v.Hash } }() - n.toConsensus <- e.Msg + n.toConsensus <- v case *types.Vote: // Add this vote to cache. n.addVoteToCache(v) - n.toConsensus <- e.Msg + n.toConsensus <- v case *types.AgreementResult, *types.BlockRandomnessResult, *typesDKG.PrivateShare, *typesDKG.PartialSignature: - n.toConsensus <- e.Msg + n.toConsensus <- v case packedStateChanges: if n.stateModule == nil { panic(errors.New( @@ -346,7 +349,7 @@ func (n *Network) dispatchMsg(e *TransportEnvelope) { case *PullRequest: go n.handlePullRequest(v) default: - n.toNode <- e.Msg + n.toNode <- v } } @@ -596,3 +599,17 @@ func (n *Network) addVoteToCache(v *types.Vote) { n.voteCache[v.Position][v.VoteHeader] = v n.voteCacheSize++ } + +func (n *Network) cloneForFake(v interface{}) interface{} { + if n.config.Type != NetworkTypeFake { + return v + } + switch val := v.(type) { + case *types.Block: + return val.Clone() + case *types.BlockRandomnessResult: + // Perform deep copy for randomness result. + return cloneBlockRandomnessResult(val) + } + return v +} diff --git a/core/test/utils.go b/core/test/utils.go index f5f4c36..56c5eac 100644 --- a/core/test/utils.go +++ b/core/test/utils.go @@ -157,3 +157,16 @@ func cloneDKGFinalize(final *typesDKG.Finalize) ( } return } + +func cloneBlockRandomnessResult(rand *types.BlockRandomnessResult) ( + copied *types.BlockRandomnessResult) { + b, err := rlp.EncodeToBytes(rand) + if err != nil { + panic(err) + } + copied = &types.BlockRandomnessResult{} + if err = rlp.DecodeBytes(b, copied); err != nil { + panic(err) + } + return +} |