test target: update -> listen to events
[src/xds/xds-server.git] / test / target_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         "os"
21         "path"
22         "strconv"
23         "strings"
24         "testing"
25         "time"
26
27         "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1"
28         "github.com/stretchr/testify/assert"
29 )
30
31 /*flush channel with timeout*/
32 func flushChannelTerm(channel chan xsapiv1.TerminalOutMsg, ms time.Duration) {
33         timeoutB := false
34         for !timeoutB {
35                 select {
36                 case <-channel:
37                 case <-time.After(ms * time.Millisecond):
38                         timeoutB = true
39                 }
40         }
41 }
42
43 func ConnectTargetEvents(t *testing.T, channel chan xsapiv1.TargetConfig) {
44         sCli.Conn.On(xsapiv1.EVTTargetAdd, func(e xsapiv1.EventMsg) {
45                 target, _ := e.DecodeTargetEvent()
46                 channel <- target
47         })
48
49         args := xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTTargetAdd}
50         assert.Nil(t, HTTPCli.Post("/events/register", args, nil))
51
52         sCli.Conn.On(xsapiv1.EVTTargetRemove, func(e xsapiv1.EventMsg) {
53                 target, _ := e.DecodeTargetEvent()
54                 channel <- target
55         })
56
57         args = xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTTargetRemove}
58         assert.Nil(t, HTTPCli.Post("/events/register", args, nil))
59 }
60
61 func DisconnectTargetEvents(t *testing.T) {
62         args := xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTTargetAdd}
63         assert.Nil(t, HTTPCli.Post("/events/unregister", args, nil))
64         args = xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTTargetRemove}
65         assert.Nil(t, HTTPCli.Post("/events/unregister", args, nil))
66 }
67
68 func TestTarget(t *testing.T) {
69         chTarget := make(chan xsapiv1.TargetConfig)
70         defer close(chTarget)
71         ConnectTargetEvents(t, chTarget)
72         var targetArray []xsapiv1.TargetConfig
73         assert.Nil(t, HTTPCli.Get("/targets", &targetArray))
74         assert.Equal(t, len(targetArray), 0)
75
76         target := xsapiv1.TargetConfig{
77                 Name: "fakeTarget",
78                 Type: xsapiv1.TypeTgtStandard,
79                 IP:   "127.0.0.1",
80         }
81         var targetRes, targetResBis xsapiv1.TargetConfig
82         assert.Nil(t, HTTPCli.Post("/targets", target, &targetRes))
83         target.Name = "fakeTargetBis"
84         targetEvt := <-chTarget
85         assert.Equal(t, targetRes.ID, targetEvt.ID)
86         assert.Nil(t, HTTPCli.Post("/targets", target, &targetResBis))
87         targetEvt = <-chTarget
88         assert.Equal(t, targetResBis.ID, targetEvt.ID)
89         assert.Equal(t, targetRes.Status, "Enable")
90         assert.Equal(t, targetResBis.Status, "Enable")
91
92         term := xsapiv1.TerminalConfig{
93                 Name: "terminal",
94                 Type: xsapiv1.TypeTermSSH,
95         }
96         var termRes, termResBis xsapiv1.TerminalConfig
97         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
98         term.Name = "terminalBis"
99         assert.Nil(t, HTTPCli.Post("/targets/"+targetResBis.ID+"/terminals", term, &termResBis))
100         assert.Equal(t, termRes.Status, "Enable")
101         assert.Equal(t, termResBis.Status, "Enable")
102
103         chTerm := make(chan xsapiv1.TerminalOutMsg)
104         defer close(chTerm)
105
106         sCli.Conn.On(xsapiv1.TerminalOutEvent, func(ev xsapiv1.TerminalOutMsg) {
107                 chTerm <- ev
108         })
109
110         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals/"+termRes.ID+"/open", termRes, &termRes))
111         assert.Nil(t, HTTPCli.Post("/targets/"+targetResBis.ID+"/terminals/"+termResBis.ID+"/open", termResBis, &termResBis))
112         assert.Equal(t, termRes.Status, "Open")
113         assert.Equal(t, termResBis.Status, "Open")
114
115         termOut := <-chTerm
116         flushChannelTerm(chTerm, 50)
117         stdoutMsg := string(termOut.Stdout)
118         if strings.Contains(stdoutMsg, "Connection refused") {
119                 t.Fatalf("%vYou may have to launch ssh server", stdoutMsg)
120         } else if strings.Contains(stdoutMsg, "password") {
121                 t.Fatalf("%vcopy your pub key in authorized_keys\ncat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys", stdoutMsg)
122         }
123         assert.True(t, strings.Contains(stdoutMsg, "Last login"))
124
125         rootCfgDir := os.Getenv(envRootCfgDir)
126         totoFile := path.Join(rootCfgDir, "toto")
127
128         /*test with 2 terminals*/
129         for i := 0; i < 2; i++ {
130                 totoFileCurrent := totoFile + strconv.Itoa(i)
131                 /*send cmd though term*/
132                 data := []byte("echo helloWorld" + strconv.Itoa(i) + " >> " + totoFileCurrent + "\n")
133
134                 assert.Nil(t, sCli.Conn.Emit(xsapiv1.TerminalInEvent, data))
135                 flushChannelTerm(chTerm, 50)
136
137                 /*check that toto file is created*/
138                 _, err := os.Stat(totoFileCurrent)
139                 assert.Nil(t, err)
140
141                 data = []byte("cat " + totoFileCurrent + "\n")
142                 assert.Nil(t, sCli.Conn.Emit(xsapiv1.TerminalInEvent, data))
143
144                 <-chTerm           //cmd sent
145                 termOut = <-chTerm //result of cat cmd
146                 flushChannelTerm(chTerm, 50)
147                 assert.Equal(t, string(termOut.Stdout), "helloWorld"+strconv.Itoa(i)+"\r\n")
148         }
149
150         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals/"+termRes.ID+"/close", termRes, &termRes))
151         assert.Nil(t, HTTPCli.Post("/targets/"+targetResBis.ID+"/terminals/"+termResBis.ID+"/close", termResBis, &termResBis))
152         assert.Equal(t, termRes.Status, "Close")
153         assert.Equal(t, termResBis.Status, "Close")
154
155         /*remove targets and terms*/
156         assert.Nil(t, HTTPCli.Get("/targets", &targetArray))
157         for i := 0; i < len(targetArray); i++ {
158                 var termArray []xsapiv1.TerminalConfig
159                 assert.Nil(t, HTTPCli.Get("/targets/"+targetArray[i].ID+"/terminals", &termArray))
160                 for j := 0; j < len(termArray); j++ {
161                         assert.Nil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID+"/terminals/"+termArray[j].ID, &termRes))
162                         assert.NotNil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID+"/terminals/"+termArray[j].ID, &termRes))
163                 }
164                 var tgtRes xsapiv1.TargetConfig
165                 assert.Nil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID, &tgtRes))
166                 targetEvt = <-chTarget
167                 assert.Equal(t, tgtRes.ID, targetEvt.ID)
168                 assert.Equal(t, targetArray[i].ID, tgtRes.ID)
169         }
170         DisconnectTargetEvents(t)
171 }
172
173 func TestTargetErrors(t *testing.T) {
174         target := xsapiv1.TargetConfig{}
175         var targetRes xsapiv1.TargetConfig
176         assert.NotNil(t, HTTPCli.Post("/targets", target, &targetRes))
177         target.Type = xsapiv1.TypeTgtStandard
178         assert.NotNil(t, HTTPCli.Post("/targets", target, &targetRes))
179         target.IP = "127.0.0.1"
180         assert.Nil(t, HTTPCli.Post("/targets", target, &targetRes))
181
182         term := xsapiv1.TerminalConfig{}
183         var termRes xsapiv1.TerminalConfig
184         assert.NotNil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
185         term.Type = xsapiv1.TypeTermSSH
186         assert.NotNil(t, HTTPCli.Post("/targets/"+"1010"+"/terminals", term, &termRes))
187         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
188         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
189         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
190         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
191
192         /*remove targets and terms*/
193         var targetArray []xsapiv1.TargetConfig
194         assert.Nil(t, HTTPCli.Get("/targets", &targetArray))
195         for i := 0; i < len(targetArray); i++ {
196                 var termArray []xsapiv1.TerminalConfig
197                 assert.Nil(t, HTTPCli.Get("/targets/"+targetArray[i].ID+"/terminals", &termArray))
198                 for j := 0; j < len(termArray); j++ {
199                         assert.Nil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID+"/terminals/"+termArray[j].ID, &termRes))
200                         assert.NotNil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID+"/terminals/"+termArray[j].ID, &termRes))
201                 }
202                 var tgtRes xsapiv1.TargetConfig
203                 assert.Nil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID, &tgtRes))
204                 assert.Equal(t, targetArray[i].ID, tgtRes.ID)
205                 assert.NotNil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID, &tgtRes))
206         }
207 }