Browse Source

server: move TestSingleNodeRecovery under etcd/

Yicheng Qin 11 years ago
parent
commit
efaef49734
2 changed files with 63 additions and 74 deletions
  1. 63 6
      etcd/etcd_test.go
  2. 0 68
      tests/functional/single_node_recovery_test.go

+ 63 - 6
etcd/etcd_test.go

@@ -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 {

+ 0 - 68
tests/functional/single_node_recovery_test.go

@@ -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)
-	}
-}