The core protocol of WoopChain
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
woop/consensus/consensus_test.go

97 lines
3.3 KiB

package consensus
import (
"testing"
"time"
"github.com/harmony-one/abool"
"github.com/harmony-one/harmony/consensus/quorum"
"github.com/harmony-one/harmony/crypto/bls"
"github.com/harmony-one/harmony/internal/registry"
"github.com/harmony-one/harmony/internal/utils"
"github.com/harmony-one/harmony/multibls"
"github.com/harmony-one/harmony/p2p"
"github.com/harmony-one/harmony/shard"
"github.com/harmony-one/harmony/staking/slash"
"github.com/harmony-one/harmony/test/helpers"
"github.com/stretchr/testify/assert"
)
// SetCurBlockViewID set the current view ID
func (consensus *Consensus) SetCurBlockViewID(viewID uint64) uint64 {
consensus.mutex.Lock()
defer consensus.mutex.Unlock()
return consensus.current.setCurBlockViewID(viewID)
}
func TestConsensusInitialization(t *testing.T) {
host, multiBLSPrivateKey, consensus, _, err := GenerateConsensusForTesting()
assert.NoError(t, err)
messageSender := &MessageSender{host: host, retryTimes: int(phaseDuration.Seconds()) / RetryIntervalInSec}
state := State{mode: Normal}
timeouts := createTimeout()
expectedTimeouts := make(map[TimeoutType]time.Duration)
expectedTimeouts[timeoutConsensus] = phaseDuration
expectedTimeouts[timeoutViewChange] = viewChangeDuration
expectedTimeouts[timeoutBootstrap] = bootstrapDuration
assert.Equal(t, host, consensus.host)
assert.Equal(t, messageSender, consensus.msgSender)
// FBFTLog
assert.NotNil(t, consensus.FBFTLog())
assert.Equal(t, FBFTAnnounce, consensus.phase)
// State / consensus.current
assert.Equal(t, state.mode, consensus.current.mode)
assert.Equal(t, state.GetViewChangingID(), consensus.current.GetViewChangingID())
// FBFT timeout
assert.IsType(t, make(map[TimeoutType]*utils.Timeout), consensus.consensusTimeout)
for timeoutType, timeout := range expectedTimeouts {
duration := consensus.consensusTimeout[timeoutType].Duration()
assert.Equal(t, timeouts[timeoutType].Duration().Nanoseconds(), duration.Nanoseconds())
assert.Equal(t, timeout.Nanoseconds(), duration.Nanoseconds())
}
// MultiBLS
assert.Equal(t, multiBLSPrivateKey, consensus.priKey)
assert.Equal(t, multiBLSPrivateKey.GetPublicKeys(), consensus.GetPublicKeys())
// Misc
assert.Equal(t, uint64(0), consensus.GetViewChangingID())
assert.Equal(t, uint32(shard.BeaconChainShardID), consensus.ShardID)
assert.Equal(t, false, consensus.start)
assert.IsType(t, make(chan slash.Record), consensus.SlashChan)
assert.NotNil(t, consensus.SlashChan)
assert.IsType(t, make(chan [vdfAndSeedSize]byte), consensus.RndChannel)
assert.NotNil(t, consensus.RndChannel)
assert.IsType(t, abool.NewBool(false), consensus.IgnoreViewIDCheck)
assert.NotNil(t, consensus.IgnoreViewIDCheck)
}
// GenerateConsensusForTesting - helper method to generate a basic consensus
func GenerateConsensusForTesting() (p2p.Host, multibls.PrivateKeys, *Consensus, quorum.Decider, error) {
hostData := helpers.Hosts[0]
host, _, err := helpers.GenerateHost(hostData.IP, hostData.Port)
if err != nil {
return nil, nil, nil, nil, err
}
decider := quorum.NewDecider(quorum.SuperMajorityVote, shard.BeaconChainShardID)
multiBLSPrivateKey := multibls.GetPrivateKeys(bls.RandPrivateKey())
consensus, err := New(host, shard.BeaconChainShardID, multiBLSPrivateKey, registry.New(), decider, 3, false)
if err != nil {
return nil, nil, nil, nil, err
}
return host, multiBLSPrivateKey, consensus, decider, nil
}