6319542d4642fd8f76ee9fb91bb940110fbcac81
[src/xds/xds-server.git] / test / sdks_test.go
1 /*
2  * Copyright (C) 2017-2018 "IoT.bzh"
3  * Author Clément Bénier <clement.benier@iot.bzh>
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *   http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package xdsservertest
18
19 import (
20         "fmt"
21         "log"
22         "os"
23         "path"
24         "regexp"
25         "sync"
26         "testing"
27         "time"
28
29         "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent/lib/xaapiv1"
30         "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1"
31         socketio_client "github.com/sebd71/go-socket.io-client"
32         "github.com/stretchr/testify/assert"
33 )
34
35 var ch chan xsapiv1.SDK
36
37 // Disconnection Channel used to notify XDS Server disconnection
38 //type Disconnection struct {
39 //      error   string
40 //      code    int
41 //      svrConf ServerCfg
42 //}
43
44 // IOSockClient .
45 type IOSockClient struct {
46         URL       string
47         Conn      *socketio_client.Client
48         Options   *socketio_client.Options
49         EmitMutex *sync.Mutex
50         Connected bool
51         //ServerDiscoChan chan Disconnection
52         EscapeKeys []byte
53 }
54
55 func NewIoSocketClient(url, clientID string) (*IOSockClient, error) {
56
57         var err error
58
59         sCli := &IOSockClient{
60                 URL:       url,
61                 EmitMutex: &sync.Mutex{},
62                 Options: &socketio_client.Options{
63                         Transport: "websocket",
64                         Header:    make(map[string][]string),
65                 },
66                 //ServerDiscoChan: make(chan Disconnection, 1),
67         }
68         sCli.Options.Header["XDS-SID"] = []string{clientID}
69
70         sCli.Conn, err = socketio_client.NewClient(url, sCli.Options)
71         if err != nil {
72                 return nil, fmt.Errorf("IO.socket connection error: " + err.Error())
73         }
74
75         sCli.Conn.On("connection", func() {
76                 sCli.Connected = true
77         })
78
79         sCli.Conn.On("disconnection", func(err error) {
80                 log.Printf("WS disconnection event with err: %v\n", err)
81                 sCli.Connected = false
82         })
83
84         sCli.Conn.On(xsapiv1.EVTSDKStateChange, func(e xsapiv1.EventMsg) {
85                 sdk, _ := e.DecodeSDKEvent()
86                 ch <- sdk
87         })
88
89         args := xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTSDKStateChange}
90         if err := HTTPCli.Post("/events/register", args, nil); err != nil {
91                 return sCli, err
92         }
93
94         return sCli, nil
95 }
96
97 func TestSdks(t *testing.T) {
98         var sdkArray []xsapiv1.SDK
99         assert.Nil(t, HTTPCli.Get("/sdks", &sdkArray))
100         _, err := os.Stat(path.Join(sdkDir, "sdks_latest.json"))
101         assert.Nil(t, err)
102         t.Logf("Connect websocket with url=%v clientId=%v\n", prefixURL, HTTPCli.GetClientID())
103         _, err = NewIoSocketClient(prefixURL, HTTPCli.GetClientID())
104         if err != nil {
105                 t.Fatal(err)
106         }
107
108         ch = make(chan xsapiv1.SDK)
109
110         for i := 0; i < len(sdkArray); i++ {
111                 re := regexp.MustCompile("^[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+$")
112                 assert.True(t, re.MatchString(sdkArray[i].ID))
113                 assert.Equal(t, sdkArray[0].Status, "Not Installed")
114
115                 var sdk xsapiv1.SDK
116                 assert.Nil(t, HTTPCli.Get("/sdks/"+sdkArray[i].ID, &sdk))
117                 assert.Equal(t, sdkArray[i], sdk)
118
119                 var sdkRes xsapiv1.SDK
120                 assert.Nil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
121                 assert.Equal(t, sdkRes.Status, "Installing")
122                 time.Sleep(1 * time.Millisecond)
123                 assert.Nil(t, HTTPCli.Post("/sdks/abortinstall", sdk, &sdkRes))
124                 assert.Equal(t, sdkRes.Status, "Not Installed")
125                 time.Sleep(1 * time.Millisecond)
126                 sdkFromEvent := <-ch
127                 assert.Equal(t, sdkRes.ID, sdkFromEvent.ID)
128                 assert.Equal(t, sdkRes.Status, sdkFromEvent.Status)
129         }
130 }
131
132 func TestInstallFakeSdk(t *testing.T) {
133         sdk := xaapiv1.SDKInstallArgs{
134                 ID:       "",
135                 Filename: sdkFileName,
136                 Force:    false,
137         }
138         var sdkRes xsapiv1.SDK
139         assert.Nil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
140         assert.Equal(t, sdkRes.Status, "Installing")
141         /*waiting for SDKStateChange event from channel*/
142         sdkFromEvent := <-ch
143         t.Log(sdkFromEvent)
144         assert.Equal(t, sdkRes.ID, sdkFromEvent.ID)
145         assert.Equal(t, "Installed", sdkFromEvent.Status)
146 }
147
148 func TestSdksError(t *testing.T) {
149         sdk := xaapiv1.SDKInstallArgs{
150                 ID:       "",
151                 Filename: "",
152                 Force:    false,
153         }
154         var sdkRes xsapiv1.SDK
155         assert.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
156         sdk.ID = "42885c24-374e-3ef0-9723-0ce8a05191aa"
157         assert.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
158         sdk.Filename = "fake"
159         assert.NotNil(t, HTTPCli.Post("/sdks", sdk, &sdkRes))
160 }