/* * Copyright (C) 2017-2018 "IoT.bzh" * Author Clément Bénier <clement.benier@iot.bzh> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package xdsservertest import ( "fmt" "log" "os" "path" "regexp" "sync" "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" ) 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), } 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 }) sCli.Conn.On(xsapiv1.EVTSDKStateChange, func(e xsapiv1.EventMsg) { sdk, _ := e.DecodeSDKEvent() ch <- sdk }) args := xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTSDKStateChange} if err := HTTPCli.Post("/events/register", args, nil); err != nil { return sCli, err } return sCli, nil } func TestSdks(t *testing.T) { 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) } ch = make(chan xsapiv1.SDK) 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") var sdk xsapiv1.SDK assert.Nil(t, HTTPCli.Get("/sdks/"+sdkArray[i].ID, &sdk)) assert.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) } } func TestInstallFakeSdk(t *testing.T) { sdk := xaapiv1.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) } func TestSdksError(t *testing.T) { sdk := xaapiv1.SDKInstallArgs{ ID: "", Filename: "", Force: false, } 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)) sdk.Filename = "fake" assert.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes)) }