Browse Source

add node create and recovery test

Xiang Li 12 years ago
parent
commit
e8b636b646
1 changed files with 74 additions and 10 deletions
  1. 74 10
      etcd_test.go

+ 74 - 10
etcd_test.go

@@ -14,7 +14,7 @@ import (
 func TestSingleNode(t *testing.T) {
 	procAttr := new(os.ProcAttr)
 	procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
-	args := []string{"etcd", "-i", "-v", "-d=/tmp/node1"}
+	args := []string{"etcd", "-i", "-d=/tmp/node1"}
 
 	process, err := os.StartProcess("etcd", args, procAttr)
 	if err != nil {
@@ -49,6 +49,62 @@ func TestSingleNode(t *testing.T) {
 	}
 }
 
+// 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", "-d=/tmp/node1"}
+
+	process, err := os.StartProcess("etcd", append(args, "-i"), procAttr)
+	if err != nil {
+		t.Fatal("start process failed:" + err.Error())
+		return
+	}
+
+	time.Sleep(time.Second)
+
+	etcd.SyncCluster()
+	// Test Set
+	result, err := etcd.Set("foo", "bar", 100)
+
+	if err != nil || result.Key != "/foo" || result.Value != "bar" || result.TTL != 99 {
+		if err != nil {
+			t.Fatal(err)
+		}
+
+		t.Fatalf("Set 1 failed with %s %s %v", result.Key, result.Value, result.TTL)
+	}
+
+	time.Sleep(time.Second)
+
+	process.Kill()
+
+	process, err = os.StartProcess("etcd", args, procAttr)
+	defer process.Kill()
+	if err != nil {
+		t.Fatal("start process failed:" + err.Error())
+		return
+	}
+
+	time.Sleep(time.Second)
+
+	results, err := etcd.Get("foo")
+	if err != nil {
+		t.Fatal("get fail: " + err.Error())
+		return
+	}
+
+	result = results[0]
+
+	if err != nil || result.Key != "/foo" || result.Value != "bar" || result.TTL > 99 {
+		if err != nil {
+			t.Fatal(err)
+		}
+		t.Fatalf("Recovery Get failed with %s %s %v", result.Key, result.Value, result.TTL)
+	}
+}
+
 // Create a three nodes and try to set value
 func TestSimpleMultiNode(t *testing.T) {
 	procAttr := new(os.ProcAttr)
@@ -113,7 +169,7 @@ func TestMultiNodeRecovery(t *testing.T) {
 
 	stop := make(chan bool)
 	// Test Set
-	go set(t, stop)
+	go set(stop)
 
 	for i := 0; i < 10; i++ {
 		num := rand.Int() % clusterSize
@@ -131,13 +187,13 @@ func TestMultiNodeRecovery(t *testing.T) {
 		}
 		time.Sleep(time.Second)
 	}
-
+	fmt.Println("stop")
 	stop <- true
 	<-stop
 }
 
 // Sending set commands
-func set(t *testing.T, stop chan bool) {
+func set(stop chan bool) {
 
 	stopSet := false
 	i := 0
@@ -148,10 +204,14 @@ func set(t *testing.T, stop chan bool) {
 		result, err := etcd.Set(key, "bar", 0)
 
 		if err != nil || result.Key != "/"+key || result.Value != "bar" {
-			if err != nil {
-				t.Fatal(err)
+			select {
+			case <-stop:
+				stopSet = true
+
+			default:
+				fmt.Println("Set failed!")
+				return
 			}
-			t.Fatalf("Set failed with %s %s %v", result.Key, result.Value)
 		}
 
 		select {
@@ -167,7 +227,7 @@ func set(t *testing.T, stop chan bool) {
 
 		i++
 	}
-
+	fmt.Println("set stop")
 	stop <- true
 }
 
@@ -198,8 +258,12 @@ func createCluster(size int, procAttr *os.ProcAttr) ([][]string, []*os.Process,
 
 // Destroy all the nodes in the cluster
 func destroyCluster(etcds []*os.Process) error {
-	for _, etcd := range etcds {
-		etcd.Kill()
+	for i, etcd := range etcds {
+		err := etcd.Kill()
+		fmt.Println("kill ", i)
+		if err != nil {
+			panic(err.Error())
+		}
 		etcd.Release()
 	}
 	return nil