696c8fcf8ad9adbb6b33086b3bc6f2ced876c9a1
[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 TestTarget(t *testing.T) {
44         var targetArray []xsapiv1.TargetConfig
45         assert.Nil(t, HTTPCli.Get("/targets", &targetArray))
46         assert.Equal(t, len(targetArray), 0)
47
48         target := xsapiv1.TargetConfig{
49                 Name: "fakeTarget",
50                 Type: xsapiv1.TypeTgtStandard,
51                 IP:   "127.0.0.1",
52         }
53         var targetRes, targetResBis xsapiv1.TargetConfig
54         assert.Nil(t, HTTPCli.Post("/targets", target, &targetRes))
55         target.Name = "fakeTargetBis"
56         assert.Nil(t, HTTPCli.Post("/targets", target, &targetResBis))
57         assert.Equal(t, targetRes.Status, "Enable")
58         assert.Equal(t, targetResBis.Status, "Enable")
59
60         term := xsapiv1.TerminalConfig{
61                 Name: "terminal",
62                 Type: xsapiv1.TypeTermSSH,
63         }
64         var termRes, termResBis xsapiv1.TerminalConfig
65         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
66         term.Name = "terminalBis"
67         assert.Nil(t, HTTPCli.Post("/targets/"+targetResBis.ID+"/terminals", term, &termResBis))
68         assert.Equal(t, termRes.Status, "Enable")
69         assert.Equal(t, termResBis.Status, "Enable")
70
71         chTerm := make(chan xsapiv1.TerminalOutMsg)
72         defer close(chTerm)
73         sCli, err := NewIoSocketClient(prefixURL, HTTPCli.GetClientID())
74         if err != nil {
75                 t.Fatal(err)
76         }
77         sCli.Conn.On(xsapiv1.TerminalOutEvent, func(ev xsapiv1.TerminalOutMsg) {
78                 chTerm <- ev
79         })
80
81         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals/"+termRes.ID+"/open", termRes, &termRes))
82         assert.Nil(t, HTTPCli.Post("/targets/"+targetResBis.ID+"/terminals/"+termResBis.ID+"/open", termResBis, &termResBis))
83         assert.Equal(t, termRes.Status, "Open")
84         assert.Equal(t, termResBis.Status, "Open")
85
86         termOut := <-chTerm
87         flushChannelTerm(chTerm, 50)
88         stdoutMsg := string(termOut.Stdout)
89         if strings.Contains(stdoutMsg, "Connection refused") {
90                 t.Fatalf("%vYou may have to launch ssh server", stdoutMsg)
91         } else if strings.Contains(stdoutMsg, "password") {
92                 t.Fatalf("%vcopy your pub key in authorized_keys\ncat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys", stdoutMsg)
93         }
94         assert.True(t, strings.Contains(stdoutMsg, "Last login"))
95
96         rootCfgDir := os.Getenv(envRootCfgDir)
97         totoFile := path.Join(rootCfgDir, "toto")
98
99         /*test with 2 terminals*/
100         for i := 0; i < 2; i++ {
101                 totoFileCurrent := totoFile + strconv.Itoa(i)
102                 /*send cmd though term*/
103                 data := []byte("echo helloWorld" + strconv.Itoa(i) + " >> " + totoFileCurrent + "\n")
104
105                 assert.Nil(t, sCli.Conn.Emit(xsapiv1.TerminalInEvent, data))
106                 flushChannelTerm(chTerm, 50)
107
108                 /*check that toto file is created*/
109                 _, err = os.Stat(totoFileCurrent)
110                 assert.Nil(t, err)
111
112                 data = []byte("cat " + totoFileCurrent + "\n")
113                 assert.Nil(t, sCli.Conn.Emit(xsapiv1.TerminalInEvent, data))
114
115                 <-chTerm           //cmd sent
116                 termOut = <-chTerm //result of cat cmd
117                 flushChannelTerm(chTerm, 50)
118                 assert.Equal(t, string(termOut.Stdout), "helloWorld"+strconv.Itoa(i)+"\r\n")
119         }
120
121         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals/"+termRes.ID+"/close", termRes, &termRes))
122         assert.Nil(t, HTTPCli.Post("/targets/"+targetResBis.ID+"/terminals/"+termResBis.ID+"/close", termResBis, &termResBis))
123         assert.Equal(t, termRes.Status, "Close")
124         assert.Equal(t, termResBis.Status, "Close")
125
126         /*remove targets and terms*/
127         assert.Nil(t, HTTPCli.Get("/targets", &targetArray))
128         for i := 0; i < len(targetArray); i++ {
129                 var termArray []xsapiv1.TerminalConfig
130                 assert.Nil(t, HTTPCli.Get("/targets/"+targetArray[i].ID+"/terminals", &termArray))
131                 for j := 0; j < len(termArray); j++ {
132                         assert.Nil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID+"/terminals/"+termArray[j].ID, &termRes))
133                         assert.NotNil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID+"/terminals/"+termArray[j].ID, &termRes))
134                 }
135                 var tgtRes xsapiv1.TargetConfig
136                 assert.Nil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID, &tgtRes))
137                 assert.Equal(t, targetArray[i].ID, tgtRes.ID)
138         }
139 }
140
141 func TestTargetErrors(t *testing.T) {
142         target := xsapiv1.TargetConfig{}
143         var targetRes xsapiv1.TargetConfig
144         assert.NotNil(t, HTTPCli.Post("/targets", target, &targetRes))
145         target.Type = xsapiv1.TypeTgtStandard
146         assert.NotNil(t, HTTPCli.Post("/targets", target, &targetRes))
147         target.IP = "127.0.0.1"
148         assert.Nil(t, HTTPCli.Post("/targets", target, &targetRes))
149
150         term := xsapiv1.TerminalConfig{}
151         var termRes xsapiv1.TerminalConfig
152         assert.NotNil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
153         term.Type = xsapiv1.TypeTermSSH
154         assert.NotNil(t, HTTPCli.Post("/targets/"+"1010"+"/terminals", term, &termRes))
155         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
156         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
157         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
158         assert.Nil(t, HTTPCli.Post("/targets/"+targetRes.ID+"/terminals", term, &termRes))
159
160         /*remove targets and terms*/
161         var targetArray []xsapiv1.TargetConfig
162         assert.Nil(t, HTTPCli.Get("/targets", &targetArray))
163         for i := 0; i < len(targetArray); i++ {
164                 var termArray []xsapiv1.TerminalConfig
165                 assert.Nil(t, HTTPCli.Get("/targets/"+targetArray[i].ID+"/terminals", &termArray))
166                 for j := 0; j < len(termArray); j++ {
167                         assert.Nil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID+"/terminals/"+termArray[j].ID, &termRes))
168                         assert.NotNil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID+"/terminals/"+termArray[j].ID, &termRes))
169                 }
170                 var tgtRes xsapiv1.TargetConfig
171                 assert.Nil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID, &tgtRes))
172                 assert.Equal(t, targetArray[i].ID, tgtRes.ID)
173                 assert.NotNil(t, HTTPCli.Delete("/targets/"+targetArray[i].ID, &tgtRes))
174         }
175 }