MIT65840/src/kvraft1/test.go
2025-02-09 17:16:54 -05:00

93 lines
2.1 KiB
Go

package kvraft
import (
"testing"
"6.5840/kvtest1"
"6.5840/labrpc"
"6.5840/tester1"
)
type Test struct {
t *testing.T
*kvtest.Test
part string
nclients int
nservers int
crash bool
partitions bool
maxraftstate int
randomkeys bool
}
const Gid = tester.GRP0
func MakeTest(t *testing.T, part string, nclients, nservers int, reliable bool, crash bool, partitions bool, maxraftstate int, randomkeys bool) *Test {
ts := &Test{
t: t,
part: part,
nclients: nclients,
nservers: nservers,
crash: crash,
partitions: partitions,
maxraftstate: maxraftstate,
randomkeys: randomkeys,
}
cfg := tester.MakeConfig(t, nservers, reliable, ts.StartKVServer)
ts.Test = kvtest.MakeTest(t, cfg, randomkeys, ts)
ts.Begin(ts.makeTitle())
return ts
}
func (ts *Test) StartKVServer(servers []*labrpc.ClientEnd, gid tester.Tgid, me int, persister *tester.Persister) []tester.IService {
return StartKVServer(servers, gid, me, persister, ts.maxraftstate)
}
func (ts *Test) MakeClerk() kvtest.IKVClerk {
clnt := ts.Config.MakeClient()
ck := MakeClerk(clnt, ts.Group(Gid).SrvNames())
return &kvtest.TestClerk{ck, clnt}
}
func (ts *Test) DeleteClerk(ck kvtest.IKVClerk) {
tck := ck.(*kvtest.TestClerk)
ts.DeleteClient(tck.Clnt)
}
func (ts *Test) MakeClerkTo(to []int) kvtest.IKVClerk {
ns := ts.Config.Group(Gid).SrvNamesTo(to)
clnt := ts.Config.MakeClientTo(ns)
ck := MakeClerk(clnt, ts.Group(Gid).SrvNames())
return &kvtest.TestClerk{ck, clnt}
}
func (ts *Test) cleanup() {
ts.Test.Cleanup()
}
func (ts *Test) makeTitle() string {
title := "Test: "
if ts.crash {
// peers re-start, and thus persistence must work.
title = title + "restarts, "
}
if ts.partitions {
// the network may partition
title = title + "partitions, "
}
if ts.maxraftstate != -1 {
title = title + "snapshots, "
}
if ts.randomkeys {
title = title + "random keys, "
}
if ts.nclients > 1 {
title = title + "many clients"
} else {
title = title + "one client"
}
title = title + " (" + ts.part + ")" // 4A or 4B
return title
}