aboutsummaryrefslogtreecommitdiffstats
path: root/integration_test/with_scheduler_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'integration_test/with_scheduler_test.go')
-rw-r--r--integration_test/with_scheduler_test.go142
1 files changed, 142 insertions, 0 deletions
diff --git a/integration_test/with_scheduler_test.go b/integration_test/with_scheduler_test.go
new file mode 100644
index 0000000..1105805
--- /dev/null
+++ b/integration_test/with_scheduler_test.go
@@ -0,0 +1,142 @@
+// Copyright 2018 The dexon-consensus Authors
+// This file is part of the dexon-consensus library.
+//
+// The dexon-consensus library is free software: you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation, either version 3 of the License,
+// or (at your option) any later version.
+//
+// The dexon-consensus library is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+// General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the dexon-consensus library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+package integration
+
+import (
+ "testing"
+ "time"
+
+ "github.com/dexon-foundation/dexon-consensus/core/test"
+ "github.com/stretchr/testify/suite"
+)
+
+type WithSchedulerTestSuite struct {
+ suite.Suite
+}
+
+func (s *WithSchedulerTestSuite) TestNonByzantine() {
+ var (
+ networkLatency = &test.NormalLatencyModel{
+ Sigma: 20,
+ Mean: 250,
+ }
+ proposingLatency = &test.NormalLatencyModel{
+ Sigma: 30,
+ Mean: 500,
+ }
+ numNodes = 25
+ req = s.Require()
+ )
+ if testing.Short() {
+ numNodes = 7
+ }
+ // Setup key pairs.
+ prvKeys, pubKeys, err := test.NewKeys(numNodes)
+ req.NoError(err)
+ // Setup governance.
+ gov, err := test.NewGovernance(pubKeys, 250*time.Millisecond)
+ req.NoError(err)
+ // Setup nodes.
+ nodes, err := PrepareNodes(
+ gov, prvKeys, 25, networkLatency, proposingLatency)
+ req.NoError(err)
+ // Setup scheduler.
+ apps, dbs := CollectAppAndDBFromNodes(nodes)
+ now := time.Now().UTC()
+ sch := test.NewScheduler(test.NewStopByConfirmedBlocks(50, apps, dbs))
+ for _, n := range nodes {
+ req.NoError(n.Bootstrap(sch, now))
+ }
+ sch.Run(4)
+ // Check results by comparing test.App instances.
+ req.NoError(VerifyApps(apps))
+}
+
+func (s *WithSchedulerTestSuite) TestConfigurationChange() {
+ // This test case verify the correctness of core.Lattice when configuration
+ // changes.
+ // - Configuration changes are registered at 'pickedNode', and would carried
+ // in blocks' payload and broadcast to other nodes.
+ var (
+ networkLatency = &test.NormalLatencyModel{
+ Sigma: 20,
+ Mean: 250,
+ }
+ proposingLatency = &test.NormalLatencyModel{
+ Sigma: 30,
+ Mean: 500,
+ }
+ numNodes = 4
+ req = s.Require()
+ maxNumChains = uint32(9)
+ )
+ // Setup key pairs.
+ prvKeys, pubKeys, err := test.NewKeys(numNodes)
+ req.NoError(err)
+ // Setup governance.
+ gov, err := test.NewGovernance(pubKeys, 250*time.Millisecond)
+ req.NoError(err)
+ // Change default round interval, expect 1 round produce 30 blocks.
+ gov.State().RequestChange(test.StateChangeRoundInterval, 15*time.Second)
+ // Setup nodes.
+ nodes, err := PrepareNodes(
+ gov, prvKeys, maxNumChains, networkLatency, proposingLatency)
+ req.NoError(err)
+ // Set scheduler.
+ apps, dbs := CollectAppAndDBFromNodes(nodes)
+ now := time.Now().UTC()
+ sch := test.NewScheduler(test.NewStopByRound(9, apps, dbs))
+ for _, n := range nodes {
+ req.NoError(n.Bootstrap(sch, now))
+ }
+ // Register some configuration changes at some node.
+ var pickedNode *Node
+ for _, pickedNode = range nodes {
+ break
+ }
+ // Config changes for round 4, numChains from 4 to 7.
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 4, test.StateChangeNumChains, uint32(7)))
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 4, test.StateChangeK, 3))
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 4, test.StateChangePhiRatio, float32(0.5)))
+ // Config changes for round 5, numChains from 7 to 9.
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 5, test.StateChangeNumChains, maxNumChains))
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 5, test.StateChangeK, 0))
+ // Config changes for round 6, numChains from 9 to 7.
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 6, test.StateChangeNumChains, uint32(7)))
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 6, test.StateChangeK, 1))
+ // Config changes for round 6, numChains from 7 to 5.
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 7, test.StateChangeNumChains, uint32(5)))
+ req.NoError(pickedNode.gov().RegisterConfigChange(
+ 7, test.StateChangeK, 1))
+ // Perform test.
+ sch.Run(4)
+ // Check results by comparing test.App instances.
+ req.NoError(VerifyApps(apps))
+}
+
+func TestWithScheduler(t *testing.T) {
+ suite.Run(t, new(WithSchedulerTestSuite))
+}