2 * Copyright (C) 2017-2018 "IoT.bzh"
3 * Author Clément Bénier <clement.benier@iot.bzh>
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
27 "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1"
28 "github.com/stretchr/testify/assert"
31 /*flush channel with timeout*/
32 func flushChannelTerm(channel chan xsapiv1.TerminalOutMsg, ms time.Duration) {
37 case <-time.After(ms * time.Millisecond):
43 func ConnectTargetEvents(t *testing.T, channel chan xsapiv1.TargetConfig) {
44 sCli.Conn.On(xsapiv1.EVTTargetAdd, func(e xsapiv1.EventMsg) {
45 target, _ := e.DecodeTargetEvent()
49 args := xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTTargetAdd}
50 assert.Nil(t, HTTPCli.Post("/events/register", args, nil))
52 sCli.Conn.On(xsapiv1.EVTTargetRemove, func(e xsapiv1.EventMsg) {
53 target, _ := e.DecodeTargetEvent()
57 args = xsapiv1.EventRegisterArgs{Name: xsapiv1.EVTTargetRemove}
58 assert.Nil(t, HTTPCli.Post("/events/register", args, nil))
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))
68 func TestTarget(t *testing.T) {
69 chTarget := make(chan xsapiv1.TargetConfig)
71 ConnectTargetEvents(t, chTarget)
72 var targetArray []xsapiv1.TargetConfig
73 assert.Nil(t, HTTPCli.Get("/targets", &targetArray))
74 assert.Equal(t, len(targetArray), 0)
76 target := xsapiv1.TargetConfig{
78 Type: xsapiv1.TypeTgtStandard,
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")
92 term := xsapiv1.TerminalConfig{
94 Type: xsapiv1.TypeTermSSH,
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")
103 chTerm := make(chan xsapiv1.TerminalOutMsg)
106 sCli.Conn.On(xsapiv1.TerminalOutEvent, func(ev xsapiv1.TerminalOutMsg) {
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")
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)
123 assert.True(t, strings.Contains(stdoutMsg, "Last login"))
125 rootCfgDir := os.Getenv(envRootCfgDir)
126 totoFile := path.Join(rootCfgDir, "toto")
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")
134 assert.Nil(t, sCli.Conn.Emit(xsapiv1.TerminalInEvent, data))
135 flushChannelTerm(chTerm, 50)
137 /*check that toto file is created*/
138 _, err := os.Stat(totoFileCurrent)
141 data = []byte("cat " + totoFileCurrent + "\n")
142 assert.Nil(t, sCli.Conn.Emit(xsapiv1.TerminalInEvent, data))
145 termOut = <-chTerm //result of cat cmd
146 flushChannelTerm(chTerm, 50)
147 assert.Equal(t, string(termOut.Stdout), "helloWorld"+strconv.Itoa(i)+"\r\n")
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")
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))
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)
170 DisconnectTargetEvents(t)
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))
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))
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))
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))