X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=test%2Fxdsserver_test.go;h=b8e98b5fe5920e1de5b35baeb9a4c8dab7b132d9;hb=72bb1c521aff5bb166db287ef426b243166d8927;hp=75f4f92ad44912e085a2ed8ac6af81a03cc2fee3;hpb=59ecda69d26eeb6461a6b2f9e2e5ec13a1cec311;p=src%2Fxds%2Fxds-server.git diff --git a/test/xdsserver_test.go b/test/xdsserver_test.go index 75f4f92..b8e98b5 100644 --- a/test/xdsserver_test.go +++ b/test/xdsserver_test.go @@ -17,41 +17,91 @@ package xdsservertest import ( - "io/ioutil" + "fmt" + "io" "log" - "net" "os" "os/exec" - "regexp" - "strings" + "sync" "testing" "time" common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib" "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1" - "github.com/stretchr/testify/assert" + socketio_client "github.com/sebd71/go-socket.io-client" ) +// IOSockClient +type IOSockClient struct { + URL string + Conn *socketio_client.Client + Options *socketio_client.Options + EmitMutex *sync.Mutex + Connected bool + //ServerDiscoChan chan Disconnection + EscapeKeys []byte +} + //global client var HTTPCli *common.HTTPClient var logDir string +var sCli *IOSockClient -func initEnv() { - cmd := exec.Command("killall", "-9", "xds-server") - if err := cmd.Start(); err != nil { - log.Fatal(err) +func Copy(src, dst string) error { + in, err := os.Open(src) + if err != nil { + return err } - cmd.Wait() + defer in.Close() + + out, err := os.Create(dst) + if err != nil { + return err + } + defer out.Close() + + _, err = io.Copy(out, in) + if err != nil { + return err + } + return out.Close() +} + +func initEnv(launchProcess bool) { + if launchProcess { + /*kill xds-server if needed*/ + cmd := exec.Command("killall", "-9", "xds-server") + if err := cmd.Start(); err != nil { + log.Fatal(err) + } + cmd.Wait() + } + /*set environment variable*/ rootTestLog := "/tmp/xds-server-test" if err := os.Setenv(envRootCfgDir, rootTestLog); err != nil { log.Fatal(err) } + sdkDir := rootTestLog + "/sdks/" + if err := os.Setenv(envXdtSdk, sdkDir); err != nil { + log.Fatal(err) + } + if err := os.Setenv(envXdsServerWorkspaceDir, rootTestLog); err != nil { + log.Fatal(err) + } + if err := os.Setenv(envXdsServerRootCfgDir, rootTestLog); err != nil { + log.Fatal(err) + } + if err := os.Setenv("XDS_LOG_SILLY", "1"); err != nil { + log.Fatal(err) + } + /*remove and recreate working directories*/ os.RemoveAll(rootTestLog) os.MkdirAll(rootTestLog, 0755) logDir = rootTestLog + "/logs/" os.MkdirAll(logDir, 0755) } +/*prepare xds-server process*/ func launchXdsServer(proc **os.Process) *os.File { logFile := logDir + logFileXdsServer file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644) @@ -76,7 +126,7 @@ func getHTTPClient(lvl int) (*common.HTTPClient, *os.File) { } conf := common.HTTPClientConfig{ URLPrefix: "/api/v1", - HeaderClientKeyName: "Xds-Test-Sid", + HeaderClientKeyName: "Xds-Sid", CsrfDisable: true, LogOut: file, LogPrefix: "XDSSERVERTEST: ", @@ -84,216 +134,82 @@ func getHTTPClient(lvl int) (*common.HTTPClient, *os.File) { } cli, err := common.HTTPNewClient(prefixURL, conf) if err != nil { - log.Print(err) - } - return cli, file -} - -func TestMain(m *testing.M) { - initEnv() - - var proc *os.Process - fileXdsServer := launchXdsServer(&proc) - go func(p *os.Process) { - if status, err := p.Wait(); err != nil { - log.Fatalf("status=%v\n err=%v\n", status, err) - } - }(proc) - time.Sleep(1 * time.Second) - - lvl := common.HTTPLogLevelDebug - var fileHTTPClient *os.File - HTTPCli, fileHTTPClient = getHTTPClient(lvl) - - if HTTPCli == nil { - log.Fatal("HTTPCLi is nil") + log.Fatal(err) } - res := m.Run() - proc.Kill() - fileXdsServer.Close() - fileHTTPClient.Close() - os.Exit(res) -} - -func init() { -} - -func CheckIP(ipconfig string) bool { - ifaces, _ := net.Interfaces() - for _, i := range ifaces { - addrs, _ := i.Addrs() - for _, addr := range addrs { - if strings.HasPrefix(addr.String(), ipconfig) { - return true - } - } + log.Printf("HTTP session ID : %v", cli.GetClientID()) + var ver xsapiv1.Version + err = cli.Get("/version", &ver) + if err != nil { + log.Fatal(err) } - return false -} - -func TestVersion(t *testing.T) { - var datVersion map[string]interface{} - assert.Nil(t, HTTPCli.Get("/version", &datVersion)) - t.Log(datVersion) - - ver, present := datVersion["version"] - assert.True(t, present) - t.Logf("version is %s", ver.(string)) - re := regexp.MustCompile("^v*[0-9]+.[0-9]+.[0-9]+$") - assert.True(t, re.MatchString(ver.(string))) + return cli, file } -func TestConfig(t *testing.T) { - var cfg xsapiv1.APIConfig - assert.Nil(t, HTTPCli.Get("/config", &cfg)) +func NewIoSocketClient(url, clientID string) (*IOSockClient, error) { + var err error - re := regexp.MustCompile("^[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+$") - assert.True(t, re.MatchString(cfg.ServerUID)) //ID - pathMap, present := cfg.SupportedSharing["PathMap"] - assert.True(t, present) - assert.True(t, pathMap) - assert.True(t, CheckIP(cfg.Builder.IP)) -} -func TestFolders(t *testing.T) { - var cfgArray []xsapiv1.FolderConfig - assert.Nil(t, HTTPCli.Get("/folders", &cfgArray)) - assert.Equal(t, len(cfgArray), 0) - - fPrj := xsapiv1.FolderConfig{ - Label: "testproject", - ClientPath: logDir + "testproject", - Type: xsapiv1.TypePathMap, - ClientData: "clientdatatest", - DataPathMap: xsapiv1.PathMapConfig{ - ServerPath: logDir + "testserverpath", + sCli := &IOSockClient{ + URL: url, + EmitMutex: &sync.Mutex{}, + Options: &socketio_client.Options{ + Transport: "websocket", + Header: make(map[string][]string), }, } - var cfg xsapiv1.FolderConfig - assert.Nil(t, HTTPCli.Post("/folders", fPrj, &cfg)) - assert.NotNil(t, cfg) - - isCfgPrjMatch := func(fPrj xsapiv1.FolderConfig, cfg xsapiv1.FolderConfig) { - re := regexp.MustCompile("^[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+$") - assert.True(t, re.MatchString(cfg.ID)) //ID - assert.Equal(t, cfg.Label, fPrj.Label) //Label - assert.Equal(t, cfg.ClientPath, fPrj.ClientPath) - assert.Equal(t, cfg.Type, fPrj.Type) - assert.Equal(t, cfg.Status, "Enable") - assert.Equal(t, cfg.IsInSync, true) - assert.Equal(t, len(cfg.DefaultSdk), 0) - assert.Equal(t, fPrj.ClientData, cfg.ClientData) - assert.Equal(t, fPrj.DataPathMap.ServerPath, cfg.DataPathMap.ServerPath) - } - isCfgPrjMatch(fPrj, cfg) - var cfg2 xsapiv1.FolderConfig - assert.Nil(t, HTTPCli.Get("/folders/"+cfg.ID, &cfg2)) - isCfgPrjMatch(fPrj, cfg2) - - assert.Nil(t, HTTPCli.Get("/folders", &cfgArray)) - assert.Equal(t, len(cfgArray), 1) + sCli.Options.Header["XDS-SID"] = []string{clientID} - //call with the same uid create error - assert.NotNil(t, HTTPCli.Post("/folders", cfg, &cfg)) - - /*create/delete folders*/ - var cfgArrayBis []xsapiv1.FolderConfig - assert.Nil(t, HTTPCli.Post("/folders", fPrj, &cfg)) - assert.Nil(t, HTTPCli.Post("/folders", fPrj, &cfg)) - assert.Nil(t, HTTPCli.Get("/folders", &cfgArray)) - assert.Equal(t, len(cfgArray), 3) - assert.Nil(t, HTTPCli.Delete("/folders/"+cfgArray[1].ID, &cfg)) - assert.Equal(t, cfg, cfgArray[1]) - assert.Nil(t, HTTPCli.Get("/folders", &cfgArrayBis)) - assert.Equal(t, len(cfgArrayBis), 2) - assert.Nil(t, HTTPCli.Delete("/folders/"+cfgArray[0].ID, &cfg)) - assert.Equal(t, cfg, cfgArray[0]) - assert.Nil(t, HTTPCli.Get("/folders", &cfgArrayBis)) - assert.Equal(t, len(cfgArrayBis), 1) - assert.Nil(t, HTTPCli.Delete("/folders/"+cfgArray[2].ID, &cfg)) - assert.Equal(t, cfg, cfgArray[2]) - assert.Nil(t, HTTPCli.Get("/folders", &cfgArrayBis)) - assert.Equal(t, len(cfgArrayBis), 0) -} - -func TestFoldersEmptyValues(t *testing.T) { - fPrj := xsapiv1.FolderConfig{ - Label: "testproject", - ClientPath: logDir + "testproject", - Type: xsapiv1.TypePathMap, - ClientData: "clientdatatest", - DataPathMap: xsapiv1.PathMapConfig{ - ServerPath: "", - }, + sCli.Conn, err = socketio_client.NewClient(url, sCli.Options) + if err != nil { + return nil, fmt.Errorf("IO.socket connection error: " + err.Error()) } - var cfg xsapiv1.FolderConfig - /*ServerPath is empty*/ - assert.NotNil(t, HTTPCli.Post("/folders", fPrj, &cfg)) - fPrj.DataPathMap.ServerPath = logDir + "sameserverpath" - fPrj.ClientPath = "" - /*ClientPath is Empty*/ - assert.NotNil(t, HTTPCli.Post("/folders", fPrj, &cfg)) + sCli.Conn.On("connection", func() { + sCli.Connected = true + }) - fPrj.ClientPath = "logDir" - fPrj.Type = "" - /*Type is empty*/ - assert.NotNil(t, HTTPCli.Post("/folders", fPrj, &cfg)) + sCli.Conn.On("disconnection", func(err error) { + log.Printf("WS disconnection event with err: %v\n", err) + sCli.Connected = false + }) - var cfgArray []xsapiv1.FolderConfig - assert.Nil(t, HTTPCli.Get("/folders", &cfgArray)) - assert.Equal(t, len(cfgArray), 0) + log.Printf("Connect websocket with url=%v clientId=%v\n", prefixURL, HTTPCli.GetClientID()) + return sCli, nil } +func TestMain(m *testing.M) { + /* useful for debugging, preventing from launching xds-server + * it can be launch separetly */ + launchProcess := true + log.Printf("TestMain: launchProcess is %v, so launching xds-server", launchProcess) + initEnv(launchProcess) -func TestFoldersPathMapConfig(t *testing.T) { - fPrj := xsapiv1.FolderConfig{ - Label: "testproject", - ClientPath: logDir + "clientpathtest", - Type: xsapiv1.TypePathMap, - ClientData: "clientdatatest", - DataPathMap: xsapiv1.PathMapConfig{ - ServerPath: logDir + "serverpath", - CheckFile: "checkfile", - }, + var proc *os.Process + var fileXdsServer *os.File + if launchProcess { + fileXdsServer = launchXdsServer(&proc) + go func(p *os.Process) { + log.Print("xds-server is launching") + if status, err := p.Wait(); err != nil { + log.Fatalf("status=%v\n err=%v\n", status, err) + } + }(proc) + defer proc.Kill() + defer fileXdsServer.Close() } - var cfg xsapiv1.FolderConfig - /*file not present*/ - assert.NotNil(t, HTTPCli.Post("/folders", fPrj, &cfg)) - - var checkFileClient = fPrj.ClientPath + "/checkfile" - var checkFileServer = fPrj.DataPathMap.ServerPath + "/checkfile" + time.Sleep(1 * time.Second) - /*create file*/ - os.MkdirAll(fPrj.ClientPath, 0755) - fPrj.DataPathMap.CheckFile = checkFileClient - fPrj.DataPathMap.CheckContent = "CheckContent From Client\n" - file, err := os.OpenFile(checkFileClient, os.O_CREATE|os.O_RDWR, 0644) + lvl := common.HTTPLogLevelDebug + var fileHTTPClient *os.File + HTTPCli, fileHTTPClient = getHTTPClient(lvl) + defer fileHTTPClient.Close() + var err error + sCli, err = NewIoSocketClient(prefixURL, HTTPCli.GetClientID()) if err != nil { - t.Log(err) - } - if err := os.Symlink(checkFileClient, checkFileServer); err != nil { - t.Log(err) - } - /*file content differ*/ - assert.NotNil(t, HTTPCli.Post("/folders", fPrj, &cfg)) - - /*write same message*/ - if _, err := file.WriteString(fPrj.DataPathMap.CheckContent); err != nil { - t.Log(err) + log.Fatal(err) } - assert.Nil(t, HTTPCli.Post("/folders", fPrj, &cfg)) - /*check server msg: ServerUID needed*/ - var APIcfg xsapiv1.APIConfig - assert.Nil(t, HTTPCli.Get("/config", &APIcfg)) - msg := "Pathmap checked message written by xds-server ID: " + APIcfg.ServerUID + "\n" - data, err := ioutil.ReadAll(file) - if err != nil { - t.Log(err) + if HTTPCli == nil { + log.Fatal("HTTPCLi is nil") } - assert.Equal(t, msg, string(data)) - - assert.Nil(t, HTTPCli.Delete("/folders/"+cfg.ID, &cfg)) - var cfgArray []xsapiv1.FolderConfig - assert.Nil(t, HTTPCli.Get("/folders", &cfgArray)) - assert.Equal(t, len(cfgArray), 0) + res := m.Run() + defer os.Exit(res) }