server: move TestSingleNodeRecovery under etcd/

This commit is contained in:
Yicheng Qin 2014-07-28 16:03:49 -07:00
parent ffa5eb08c3
commit efaef49734
2 changed files with 63 additions and 74 deletions

View File

@ -311,6 +311,60 @@ func TestVersionCheck(t *testing.T) {
}
}
func TestSingleNodeRecovery(t *testing.T) {
id := genId()
dataDir, err := ioutil.TempDir(os.TempDir(), "etcd")
if err != nil {
panic(err)
}
c := config.New()
c.DataDir = dataDir
e, h, _ := buildServer(t, c, id)
key := "/foo"
ev, err := e.p.Set(key, false, "bar", time.Now().Add(time.Second*100))
if err != nil {
t.Fatal(err)
}
w, err := e.p.Watch(key, false, false, ev.Index())
if err != nil {
t.Fatal(err)
}
select {
case v := <-w.EventChan:
if v.Node.TTL < 95 {
t.Errorf("ttl = %d, want >= 95", v.Node.TTL)
}
case <-time.After(8 * defaultHeartbeat * e.tickDuration):
t.Fatal("watch timeout")
}
e.Stop()
h.Close()
time.Sleep(2 * time.Second)
c = config.New()
c.DataDir = dataDir
e, h, _ = buildServer(t, c, id)
w, err = e.p.Watch(key, false, false, ev.Index())
if err != nil {
t.Fatal(err)
}
select {
case v := <-w.EventChan:
if v.Node.TTL > 99 {
t.Errorf("ttl = %d, want <= 99", v.Node.TTL)
}
case <-time.After(8 * defaultHeartbeat * e.tickDuration):
t.Fatal("2nd watch timeout")
}
destroyServer(t, e, h)
}
func buildCluster(number int, tls bool) ([]*Server, []*httptest.Server) {
bootstrapper := 0
es := make([]*Server, number)
@ -342,23 +396,26 @@ func buildCluster(number int, tls bool) ([]*Server, []*httptest.Server) {
}
func initTestServer(c *config.Config, id int64, tls bool) (e *Server, h *httptest.Server) {
n, err := ioutil.TempDir(os.TempDir(), "etcd")
if err != nil {
panic(err)
if c.DataDir == "" {
n, err := ioutil.TempDir(os.TempDir(), "etcd")
if err != nil {
panic(err)
}
c.DataDir = n
}
c.DataDir = n
e, err = New(c)
srv, err := New(c)
if err != nil {
panic(err)
}
e = srv
e.setId(id)
e.SetTick(time.Millisecond * 5)
m := http.NewServeMux()
m.Handle("/", e)
m.Handle("/raft", e.RaftHandler())
m.Handle("/raft/", e.RaftHandler())
if tls {
h = httptest.NewTLSServer(m)
} else {

View File

@ -1,68 +0,0 @@
package test
import (
"os"
"testing"
"time"
"github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd"
)
// This test creates a single node and then set a value to it.
// Then this test kills the node and restart it and tries to get the value again.
func TestSingleNodeRecovery(t *testing.T) {
procAttr := new(os.ProcAttr)
procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
args := []string{"etcd", "-name=node1", "-data-dir=/tmp/node1"}
process, err := os.StartProcess(EtcdBinPath, append(args, "-f"), procAttr)
if err != nil {
t.Fatal("start process failed:" + err.Error())
return
}
time.Sleep(time.Second)
c := etcd.NewClient(nil)
c.SyncCluster()
// Test Set
result, err := c.Set("foo", "bar", 100)
node := result.Node
if err != nil || node.Key != "/foo" || node.Value != "bar" || node.TTL < 95 {
if err != nil {
t.Fatal(err)
}
t.Fatalf("Set 1 failed with %s %s %v", node.Key, node.Value, node.TTL)
}
time.Sleep(time.Second)
process.Kill()
process, err = os.StartProcess(EtcdBinPath, args, procAttr)
defer process.Kill()
if err != nil {
t.Fatal("start process failed:" + err.Error())
return
}
time.Sleep(time.Second)
result, err = c.Get("foo", false, false)
node = result.Node
if err != nil {
t.Fatal("get fail: " + err.Error())
return
}
if err != nil || node.Key != "/foo" || node.Value != "bar" || node.TTL > 99 {
if err != nil {
t.Fatal(err)
}
t.Fatalf("Recovery Get failed with %s %s %v", node.Key, node.Value, node.TTL)
}
}