github.com/sym3tri/etcd@v0.2.1-0.20140422215517-a563d82f95d6/tests/functional/internal_version_test.go (about)

     1  package test
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"net/url"
     8  	"os"
     9  	"sync"
    10  	"testing"
    11  	"time"
    12  )
    13  
    14  // Ensure that etcd does not come up if the internal raft versions do not match.
    15  func TestInternalVersion(t *testing.T) {
    16  	var mu sync.Mutex
    17  
    18  	checkedVersion := false
    19  	testMux := http.NewServeMux()
    20  
    21  	testMux.HandleFunc("/version", func(w http.ResponseWriter, r *http.Request) {
    22  		fmt.Fprintln(w, "This is not a version number")
    23  		mu.Lock()
    24  		defer mu.Unlock()
    25  
    26  		checkedVersion = true
    27  	})
    28  
    29  	testMux.HandleFunc("/join", func(w http.ResponseWriter, r *http.Request) {
    30  		t.Fatal("should not attempt to join!")
    31  	})
    32  
    33  	ts := httptest.NewServer(testMux)
    34  	defer ts.Close()
    35  
    36  	fakeURL, _ := url.Parse(ts.URL)
    37  
    38  	procAttr := new(os.ProcAttr)
    39  	procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
    40  	args := []string{"etcd", "-name=node1", "-f", "-data-dir=/tmp/node1", "-peers=" + fakeURL.Host}
    41  
    42  	process, err := os.StartProcess(EtcdBinPath, args, procAttr)
    43  	if err != nil {
    44  		t.Fatal("start process failed:" + err.Error())
    45  		return
    46  	}
    47  
    48  	time.Sleep(time.Second)
    49  	process.Kill()
    50  
    51  	_, err = http.Get("http://127.0.0.1:4001")
    52  	if err == nil {
    53  		t.Fatal("etcd node should not be up")
    54  		return
    55  	}
    56  
    57  	mu.Lock()
    58  	defer mu.Unlock()
    59  	if checkedVersion == false {
    60  		t.Fatal("etcd did not check the version")
    61  		return
    62  	}
    63  }