package threadTest import ( "simple-kv-store/internal/client" "simple-kv-store/internal/nodes" "strconv" "testing" "time" ) func TestNodeRestart(t *testing.T) { // 登记结点信息 n := 5 var peerIds []string for i := 0; i < n; i++ { peerIds = append(peerIds, strconv.Itoa(i + 1)) } // 结点启动 var quitCollections []chan struct{} threadTransport := nodes.NewThreadTransport(nodes.NewCtx()) for i := 0; i < n; i++ { _, quitChan := ExecuteNodeI(strconv.Itoa(i + 1), false, peerIds, threadTransport) quitCollections = append(quitCollections, quitChan) } // 通知所有node结束 defer func(){ for _, quitChan := range quitCollections { close(quitChan) } }() time.Sleep(time.Second) // 等待启动完毕 // client启动, 连接任意节点 cWrite := clientPkg.NewClient("0", peerIds, threadTransport) // 写入 ClientWriteLog(t, 0, 5, cWrite) time.Sleep(time.Second) // 等待写入完毕 // 模拟结点轮流崩溃 for i := 0; i < n; i++ { close(quitCollections[i]) time.Sleep(time.Second) _, quitChan := ExecuteNodeI(strconv.Itoa(i + 1), true, peerIds, threadTransport) quitCollections[i] = quitChan time.Sleep(time.Second) // 等待启动完毕 } // client启动 cRead := clientPkg.NewClient("0", peerIds, threadTransport) // 读写入数据 for i := 0; i < 5; i++ { key := strconv.Itoa(i) var value string s := cRead.Read(key, &value) if s != clientPkg.Ok { t.Errorf("Read test1 fail") } } // 读未写入数据 for i := 5; i < 15; i++ { key := strconv.Itoa(i) var value string s := cRead.Read(key, &value) if s != clientPkg.NotFound { t.Errorf("Read test2 fail") } } } func TestRestartWhileWriting(t *testing.T) { // 登记结点信息 n := 5 var peerIds []string for i := 0; i < n; i++ { peerIds = append(peerIds, strconv.Itoa(i + 1)) } // 结点启动 var quitCollections []chan struct{} var nodeCollections []*nodes.Node threadTransport := nodes.NewThreadTransport(nodes.NewCtx()) for i := 0; i < n; i++ { n, quitChan := ExecuteNodeI(strconv.Itoa(i + 1), false, peerIds, threadTransport) quitCollections = append(quitCollections, quitChan) nodeCollections = append(nodeCollections, n) } // 通知所有node结束 defer func(){ for _, quitChan := range quitCollections { close(quitChan) } }() time.Sleep(time.Second) // 等待启动完毕 leaderIdx := FindLeader(t, nodeCollections) // client启动, 连接任意节点 cWrite := clientPkg.NewClient("0", peerIds, threadTransport) // 写入 go ClientWriteLog(t, 0, 5, cWrite) go func() { close(quitCollections[leaderIdx]) n, quitChan := ExecuteNodeI(strconv.Itoa(leaderIdx + 1), true, peerIds, threadTransport) quitCollections[leaderIdx] = quitChan nodeCollections[leaderIdx] = n }() time.Sleep(time.Second) // 等待启动完毕 // client启动 cRead := clientPkg.NewClient("0", peerIds, threadTransport) // 读写入数据 for i := 0; i < 5; i++ { key := strconv.Itoa(i) var value string s := cRead.Read(key, &value) if s != clientPkg.Ok { t.Errorf("Read test1 fail") } } CheckLogNum(t, nodeCollections[leaderIdx], 5) }