aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorMission Liao <mission.liao@dexon.org>2018-11-11 13:13:40 +0800
committerGitHub <noreply@github.com>2018-11-11 13:13:40 +0800
commit795b8b5309ed94858f3bd56e42093d65dcdd0870 (patch)
tree3618a5afe6fb3b486614bd164071b2c02eed18c8 /core
parent81372e5746fedf0ad691ab628096b7caefbe3008 (diff)
downloaddexon-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.go4
-rw-r--r--core/test/app.go20
-rw-r--r--core/test/network.go27
-rw-r--r--core/test/utils.go13
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
+}