package threadTest
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"simple-kv-store/internal/nodes"
|
|
"testing"
|
|
|
|
"github.com/syndtr/goleveldb/leveldb"
|
|
)
|
|
|
|
func ExecuteNodeI(id string, isRestart bool, peerIds []string, threadTransport *nodes.ThreadTransport) (*nodes.Node, chan struct{}) {
|
|
if !isRestart {
|
|
os.RemoveAll("storage/node" + id)
|
|
}
|
|
|
|
os.RemoveAll("leveldb/simple-kv-store" + id)
|
|
|
|
db, err := leveldb.OpenFile("leveldb/simple-kv-store" + id, nil)
|
|
if err != nil {
|
|
fmt.Println("Failed to open database: ", err)
|
|
}
|
|
|
|
// 打开或创建节点数据持久化文件
|
|
storage := nodes.NewRaftStorage("storage/node" + id)
|
|
|
|
var otherIds []string
|
|
for _, ids := range peerIds {
|
|
if ids != id {
|
|
otherIds = append(otherIds, ids) // 删除目标元素
|
|
}
|
|
}
|
|
// 初始化
|
|
node, quitChan := nodes.InitThreadNode(id, otherIds, db, storage, isRestart, threadTransport)
|
|
|
|
// 开启 raft
|
|
go nodes.Start(node, quitChan)
|
|
return node, quitChan
|
|
}
|
|
|
|
func CheckOneLeader(t *testing.T, nodeCollections []* nodes.Node) {
|
|
cnt := 0
|
|
for _, node := range nodeCollections {
|
|
if node.State == nodes.Leader {
|
|
cnt++
|
|
}
|
|
}
|
|
if cnt != 1 {
|
|
t.Errorf("实际有%d个leader(!=1)", cnt)
|
|
}
|
|
}
|
|
|
|
func CheckZeroOrOneLeader(t *testing.T, nodeCollections []* nodes.Node) {
|
|
cnt := 0
|
|
for _, node := range nodeCollections {
|
|
if node.State == nodes.Leader {
|
|
cnt++
|
|
}
|
|
}
|
|
if cnt > 1 {
|
|
t.Errorf("实际有%d个leader(>1)", cnt)
|
|
}
|
|
}
|
|
|
|
func CheckIsLeader(t *testing.T, node *nodes.Node) {
|
|
if node.State != nodes.Leader {
|
|
t.Errorf("[%s]不是leader", node.SelfId)
|
|
}
|
|
}
|
|
|
|
func CheckTerm(t *testing.T, node *nodes.Node, targetTerm int) {
|
|
if node.CurrTerm != targetTerm {
|
|
t.Errorf("[%s]实际term=%d (!=%d)", node.SelfId, node.CurrTerm, targetTerm)
|
|
}
|
|
}
|