tests: better handle websocket client
[src/xds/xds-server.git] / test / xdsserver_test.go
index bab7f68..585ad50 100644 (file)
 package xdsservertest
 
 import (
+       "fmt"
+       "io"
        "log"
-       "net"
        "os"
-       "regexp"
-       "strings"
+       "os/exec"
+       "path"
+       "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 sdkDir string
+var sCli *IOSockClient
+
+func Copy(src, dst string) error {
+       in, err := os.Open(src)
+       if err != nil {
+               return err
+       }
+       defer in.Close()
 
-func initEnv() {
+       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 {
+               cmd := exec.Command("killall", "-9", "xds-server")
+               if err := cmd.Start(); err != nil {
+                       log.Fatal(err)
+               }
+               cmd.Wait()
+       }
        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)
+       }
        os.RemoveAll(rootTestLog)
        os.MkdirAll(rootTestLog, 0755)
        logDir = rootTestLog + "/logs/"
        os.MkdirAll(logDir, 0755)
+       os.MkdirAll(sdkDir, 0755)
+       currentDir, err := os.Getwd()
+       if err != nil {
+               log.Fatal(err)
+       }
+       if err := Copy(path.Join(currentDir, sdkFile), path.Join(sdkDir, sdkFileName)); err != nil {
+               log.Fatal(err)
+       }
 }
 
 func launchXdsServer(proc **os.Process) *os.File {
@@ -69,7 +132,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: ",
@@ -77,123 +140,85 @@ func getHTTPClient(lvl int) (*common.HTTPClient, *os.File) {
        }
        cli, err := common.HTTPNewClient(prefixURL, conf)
        if err != nil {
-               log.Print(err)
+               log.Fatal(err)
+       }
+       log.Printf("HTTP session ID : %v", cli.GetClientID())
+       var ver xsapiv1.Version
+       err = cli.Get("/version", &ver)
+       if err != nil {
+               log.Fatal(err)
        }
        return cli, file
 }
 
+func NewIoSocketClient(url, clientID string) (*IOSockClient, error) {
+
+       var err error
+
+       sCli := &IOSockClient{
+               URL:       url,
+               EmitMutex: &sync.Mutex{},
+               Options: &socketio_client.Options{
+                       Transport: "websocket",
+                       Header:    make(map[string][]string),
+               },
+               //ServerDiscoChan: make(chan Disconnection, 1),
+       }
+       sCli.Options.Header["XDS-SID"] = []string{clientID}
+
+       sCli.Conn, err = socketio_client.NewClient(url, sCli.Options)
+       if err != nil {
+               return nil, fmt.Errorf("IO.socket connection error: " + err.Error())
+       }
+
+       sCli.Conn.On("connection", func() {
+               sCli.Connected = true
+       })
+
+       sCli.Conn.On("disconnection", func(err error) {
+               log.Printf("WS disconnection event with err: %v\n", err)
+               sCli.Connected = false
+       })
+
+       return sCli, nil
+}
 func TestMain(m *testing.M) {
-       initEnv()
+       launchProcess := true
+       log.Printf("TestMain: launchProcess is %v", launchProcess)
+       initEnv(launchProcess)
 
        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)
+       var fileXdsServer *os.File
+       if launchProcess {
+               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)
+               defer proc.Kill()
+               defer fileXdsServer.Close()
+       }
        time.Sleep(1 * time.Second)
 
        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 {
+               log.Fatal(err)
+       }
+
+       log.Printf("HTTPCli id is %v", HTTPCli.GetClientID())
 
        if HTTPCli == nil {
                log.Fatal("HTTPCLi is nil")
        }
        res := m.Run()
-       proc.Kill()
-       fileXdsServer.Close()
-       fileHTTPClient.Close()
-       os.Exit(res)
+       defer 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
-                       }
-               }
-       }
-       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)))
-}
-
-func TestConfig(t *testing.T) {
-       var datConfig map[string]interface{}
-       assert.Nil(t, HTTPCli.Get("/config", &datConfig))
-
-       builder, present := datConfig["builder"].(map[string]interface{})
-       assert.True(t, present)
-       ip, present := builder["ip"]
-       assert.True(t, present)
-       assert.True(t, CheckIP(ip.(string)))
-}
-func TestFolders(t *testing.T) {
-       var datFolder []interface{}
-       assert.Nil(t, HTTPCli.Get("/folders", &datFolder))
-       t.Log(datFolder)
-       assert.Equal(t, len(datFolder), 0)
-
-       fPrj := xsapiv1.FolderConfig{
-               Label:      "testproject",
-               ClientPath: logDir + "testproject",
-               Type:       xsapiv1.TypePathMap,
-               ClientData: "clientdatatest",
-               DataPathMap: xsapiv1.PathMapConfig{
-                       ServerPath: logDir + "testserverpath",
-               },
-       }
-       var cfg xsapiv1.FolderConfig
-       assert.Nil(t, HTTPCli.Post("/folders", fPrj, &cfg))
-       assert.NotNil(t, cfg)
-       t.Log(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))
-       t.Log(cfg2)
-       isCfgPrjMatch(fPrj, cfg2)
-
-       //call with the same uid create error
-       assert.NotNil(t, HTTPCli.Post("/folders", cfg, &cfg))
-
-       //assert.Equal(t, cfg.DefaultSdk, "true")
-       //call with the same uid
-       //serverpath nil
-       //serverpath already exists
-}
-
-//func TestRegister(t *testing.T) {
-//     var client := common.HTTPClient
-//     client.Get("/folders", folders)
-//}