package xdsservertest
import (
- "fmt"
"log"
"os"
"path"
"regexp"
- "sync"
+ "strings"
"testing"
"time"
- "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent/lib/xaapiv1"
- "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1"
- socketio_client "github.com/sebd71/go-socket.io-client"
- "github.com/stretchr/testify/assert"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1"
+ "github.com/stretchr/testify/require"
)
-var ch chan xsapiv1.SDK
-
-// Disconnection Channel used to notify XDS Server disconnection
-//type Disconnection struct {
-// error string
-// code int
-// svrConf ServerCfg
-//}
-
-// IOSockClient .
-type IOSockClient struct {
- URL string
- Conn *socketio_client.Client
- Options *socketio_client.Options
- EmitMutex *sync.Mutex
- Connected bool
- //ServerDiscoChan chan Disconnection
- EscapeKeys []byte
-}
-
-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),
+var cpt int
+
+/*flush channel with timeout*/
+func flushChannelSdk(channel chan xsapiv1.SDK, ms time.Duration) {
+ timeoutB := false
+ for !timeoutB {
+ select {
+ case <-channel:
+ case <-time.After(ms * time.Millisecond):
+ timeoutB = true
+ }
}
- 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
- })
+func ConnectSDKStateChange(t *testing.T, sCli *IOSockClient, channel chan xsapiv1.SDK) {
sCli.Conn.On(xsapiv1.EVTSDKStateChange, func(e xsapiv1.EventMsg) {
sdk, _ := e.DecodeSDKEvent()
- ch <- sdk
+ channel <- sdk
})
args := xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTSDKStateChange}
- if err := HTTPCli.Post("/events/register", args, nil); err != nil {
- return sCli, err
+ require.Nil(t, HTTPCli.Post("/events/register", args, nil))
+}
+
+func DisconnectSDKStateChange(t *testing.T, sCli *IOSockClient) {
+ args := xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTSDKStateChange}
+ require.Nil(t, HTTPCli.Post("/events/unregister", args, nil))
+}
+
+func InitSdkDir() {
+ /*create sdk dir*/
+ sdkDir := os.Getenv(envXdtSdk)
+ 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)
+ }
+}
- return sCli, nil
+func RemoveSdk(t *testing.T, sdk xsapiv1.SDK, chSdks chan xsapiv1.SDK) {
+ Debugf(t, "remove sdk %v", sdk.ID)
+ require.Nil(t, HTTPCli.Delete("/sdks/"+sdk.ID, &sdk))
+ sdkFromEvt := <-chSdks //waiting for event Uninstalling
+ require.Equal(t, sdk.ID, sdkFromEvt.ID)
+ require.Equal(t, sdkFromEvt.Status, "Un-installing")
+ sdkFromEvt = <-chSdks //waiting for event not installed
+ require.Equal(t, sdkFromEvt.Status, "Not Installed")
+ os.RemoveAll(path.Join(os.Getenv(envXdtSdk), sdk.Profile))
+ os.Remove(strings.Replace(sdk.URL, "file://", "", 1))
}
func TestSdks(t *testing.T) {
+ InitSdkDir()
+ /*get sdk list from sdk_latest.json*/
var sdkArray []xsapiv1.SDK
- assert.Nil(t, HTTPCli.Get("/sdks", &sdkArray))
- _, err := os.Stat(path.Join(sdkDir, "sdks_latest.json"))
- assert.Nil(t, err)
- t.Logf("Connect websocket with url=%v clientId=%v\n", prefixURL, HTTPCli.GetClientID())
- _, err = NewIoSocketClient(prefixURL, HTTPCli.GetClientID())
- if err != nil {
- t.Fatal(err)
- }
+ require.Nil(t, HTTPCli.Get("/sdks", &sdkArray))
+ _, err := os.Stat(path.Join(os.Getenv(envXdtSdk), "sdks_latest.json"))
+ require.Nil(t, err)
- ch = make(chan xsapiv1.SDK)
+ /*create channel fro SDK event*/
+ chSdks := make(chan xsapiv1.SDK)
+ defer close(chSdks)
+ ConnectSDKStateChange(t, sCli, chSdks)
+ /*checking startup installing of SDKs*/
for i := 0; i < len(sdkArray); i++ {
re := regexp.MustCompile("^[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+$")
- assert.True(t, re.MatchString(sdkArray[i].ID))
- assert.Equal(t, sdkArray[0].Status, "Not Installed")
+ require.True(t, re.MatchString(sdkArray[i].ID))
+ require.Equal(t, sdkArray[0].Status, "Not Installed")
var sdk xsapiv1.SDK
- assert.Nil(t, HTTPCli.Get("/sdks/"+sdkArray[i].ID, &sdk))
- assert.Equal(t, sdkArray[i], sdk)
+ require.Nil(t, HTTPCli.Get("/sdks/"+sdkArray[i].ID, &sdk))
+ require.Equal(t, sdkArray[i], sdk)
var sdkRes xsapiv1.SDK
- assert.Nil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
- assert.Equal(t, sdkRes.Status, "Installing")
- time.Sleep(1 * time.Millisecond)
- assert.Nil(t, HTTPCli.Post("/sdks/abortinstall", sdk, &sdkRes))
- assert.Equal(t, sdkRes.Status, "Not Installed")
- time.Sleep(1 * time.Millisecond)
- sdkFromEvent := <-ch
- assert.Equal(t, sdkRes.ID, sdkFromEvent.ID)
- assert.Equal(t, sdkRes.Status, sdkFromEvent.Status)
+ /*install sdk*/
+ Debugf(t, "install sdk %v", sdk.Name)
+ require.Nil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
+ require.Equal(t, sdkRes.Status, "Installing")
+ sdkFromEvent := <-chSdks //waiting for installing event
+ require.Equal(t, sdkRes.ID, sdkFromEvent.ID)
+ require.Equal(t, sdkFromEvent.Status, "Installing")
+
+ /*abort sdk install*/
+ Debugf(t, "abort install sdk %v", sdk.Name)
+ require.Nil(t, HTTPCli.Post("/sdks/abortinstall", sdk, &sdkRes))
+ require.Equal(t, sdkRes.Status, "Not Installed")
+ sdkFromEvent = <-chSdks //waiting for not installed status*/
+ require.Equal(t, sdkRes.ID, sdkFromEvent.ID)
+ require.Equal(t, sdkRes.Status, sdkFromEvent.Status)
}
}
+func installFakeSdk(t *testing.T, sdkInstall xsapiv1.SDKInstallArgs, chSdks chan xsapiv1.SDK) xsapiv1.SDK {
+ InitSdkDir()
+ var sdkRes xsapiv1.SDK
+ require.Nil(t, HTTPCli.Post("/sdks", sdkInstall, &sdkRes))
+ Debugf(t, "Install fake sdk %v (force=%v)", sdkRes.Name, sdkInstall.Force)
+ require.Equal(t, sdkRes.Status, "Installing")
+ sdkFromEvent := <-chSdks
+ require.Equal(t, sdkRes.ID, sdkFromEvent.ID)
+ require.Equal(t, sdkFromEvent.Status, "Installing")
+ /*waiting for SDKStateChange event from channel*/
+ sdkFromEvent = <-chSdks
+ require.Equal(t, sdkRes.ID, sdkFromEvent.ID)
+ require.Equal(t, "Installed", sdkFromEvent.Status)
+ require.Equal(t, sdkFromEvent.LastError, "")
+ Debugf(t, "Fake sdk %v installed", sdkFromEvent.Name)
+ return sdkFromEvent
+}
+
func TestInstallFakeSdk(t *testing.T) {
- sdk := xaapiv1.SDKInstallArgs{
+ sdk := xsapiv1.SDKInstallArgs{
ID: "",
Filename: sdkFileName,
Force: false,
}
- var sdkRes xsapiv1.SDK
- assert.Nil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
- assert.Equal(t, sdkRes.Status, "Installing")
- /*waiting for SDKStateChange event from channel*/
- sdkFromEvent := <-ch
- t.Log(sdkFromEvent)
- assert.Equal(t, sdkRes.ID, sdkFromEvent.ID)
- assert.Equal(t, "Installed", sdkFromEvent.Status)
+
+ chSdks := make(chan xsapiv1.SDK)
+ defer close(chSdks)
+ ConnectSDKStateChange(t, sCli, chSdks)
+ installFakeSdk(t, sdk, chSdks)
+
+ /*test force install*/
+ sdk.Force = true
+ sdkRes := installFakeSdk(t, sdk, chSdks)
+ RemoveSdk(t, sdkRes, chSdks)
+ DisconnectSDKStateChange(t, sCli)
}
func TestSdksError(t *testing.T) {
- sdk := xaapiv1.SDKInstallArgs{
+ sdk := xsapiv1.SDKInstallArgs{
ID: "",
Filename: "",
Force: false,
}
+ Debugf(t, "error while installing sdk with no ID and no Filename")
var sdkRes xsapiv1.SDK
- assert.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
- sdk.ID = "42885c24-374e-3ef0-9723-0ce8a05191aa"
- assert.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
+ /*error with no ID no filename*/
+ require.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
+ sdk.ID = "42885c24-374e-3ef0-9723-0c8a05191aa"
+ Debugf(t, "error while installing sdk with a fake id=%v", sdk.ID)
+ /*error with fake ID*/
+ require.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
+ sdk.ID = ""
sdk.Filename = "fake"
- assert.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
+ Debugf(t, "error while installing sdk with a fake filename=%v", sdk.Filename)
+ /*error with fake filename*/
+ require.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
}