test exec/sdk: use sdk for building exec project
[src/xds/xds-server.git] / test / xdsserver_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         "io"
22         "log"
23         "os"
24         "os/exec"
25         "sync"
26         "testing"
27         "time"
28
29         common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib"
30         "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1"
31         socketio_client "github.com/sebd71/go-socket.io-client"
32 )
33
34 // IOSockClient
35 type IOSockClient struct {
36         URL       string
37         Conn      *socketio_client.Client
38         Options   *socketio_client.Options
39         EmitMutex *sync.Mutex
40         Connected bool
41         //ServerDiscoChan chan Disconnection
42         EscapeKeys []byte
43 }
44
45 //global client
46 var HTTPCli *common.HTTPClient
47 var logDir string
48 var sCli *IOSockClient
49
50 func Copy(src, dst string) error {
51         in, err := os.Open(src)
52         if err != nil {
53                 return err
54         }
55         defer in.Close()
56
57         out, err := os.Create(dst)
58         if err != nil {
59                 return err
60         }
61         defer out.Close()
62
63         _, err = io.Copy(out, in)
64         if err != nil {
65                 return err
66         }
67         return out.Close()
68 }
69
70 func initEnv(launchProcess bool) {
71         if launchProcess {
72                 cmd := exec.Command("killall", "-9", "xds-server")
73                 if err := cmd.Start(); err != nil {
74                         log.Fatal(err)
75                 }
76                 cmd.Wait()
77         }
78         rootTestLog := "/tmp/xds-server-test"
79         if err := os.Setenv(envRootCfgDir, rootTestLog); err != nil {
80                 log.Fatal(err)
81         }
82         sdkDir := rootTestLog + "/sdks/"
83         if err := os.Setenv(envXdtSdk, sdkDir); err != nil {
84                 log.Fatal(err)
85         }
86         if err := os.Setenv(envXdsServerWorkspaceDir, rootTestLog); err != nil {
87                 log.Fatal(err)
88         }
89         if err := os.Setenv(envXdsServerRootCfgDir, rootTestLog); err != nil {
90                 log.Fatal(err)
91         }
92         if err := os.Setenv("XDS_LOG_SILLY", "1"); err != nil {
93                 log.Fatal(err)
94         }
95         os.RemoveAll(rootTestLog)
96         os.MkdirAll(rootTestLog, 0755)
97         logDir = rootTestLog + "/logs/"
98         os.MkdirAll(logDir, 0755)
99 }
100
101 func launchXdsServer(proc **os.Process) *os.File {
102         logFile := logDir + logFileXdsServer
103         file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644)
104         if err != nil {
105                 log.Fatal(err)
106         }
107         tmpProc, err := os.StartProcess(argsProcess[0], argsProcess, &os.ProcAttr{
108                 Files: []*os.File{os.Stdin, file, file},
109         })
110         if err != nil {
111                 log.Fatal(err)
112         }
113         *proc = tmpProc
114         return file
115 }
116
117 func getHTTPClient(lvl int) (*common.HTTPClient, *os.File) {
118         logFile := logDir + logFileClient
119         file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644)
120         if err != nil {
121                 log.Fatal(err)
122         }
123         conf := common.HTTPClientConfig{
124                 URLPrefix:           "/api/v1",
125                 HeaderClientKeyName: "Xds-Sid",
126                 CsrfDisable:         true,
127                 LogOut:              file,
128                 LogPrefix:           "XDSSERVERTEST: ",
129                 LogLevel:            lvl,
130         }
131         cli, err := common.HTTPNewClient(prefixURL, conf)
132         if err != nil {
133                 log.Fatal(err)
134         }
135         log.Printf("HTTP session ID : %v", cli.GetClientID())
136         var ver xsapiv1.Version
137         err = cli.Get("/version", &ver)
138         if err != nil {
139                 log.Fatal(err)
140         }
141         return cli, file
142 }
143
144 func NewIoSocketClient(url, clientID string) (*IOSockClient, error) {
145
146         var err error
147
148         sCli := &IOSockClient{
149                 URL:       url,
150                 EmitMutex: &sync.Mutex{},
151                 Options: &socketio_client.Options{
152                         Transport: "websocket",
153                         Header:    make(map[string][]string),
154                 },
155                 //ServerDiscoChan: make(chan Disconnection, 1),
156         }
157         sCli.Options.Header["XDS-SID"] = []string{clientID}
158
159         sCli.Conn, err = socketio_client.NewClient(url, sCli.Options)
160         if err != nil {
161                 return nil, fmt.Errorf("IO.socket connection error: " + err.Error())
162         }
163
164         sCli.Conn.On("connection", func() {
165                 sCli.Connected = true
166         })
167
168         sCli.Conn.On("disconnection", func(err error) {
169                 log.Printf("WS disconnection event with err: %v\n", err)
170                 sCli.Connected = false
171         })
172
173         log.Printf("Connect websocket with url=%v clientId=%v\n", prefixURL, HTTPCli.GetClientID())
174         return sCli, nil
175 }
176 func TestMain(m *testing.M) {
177         launchProcess := true
178         log.Printf("TestMain: launchProcess is %v, so launching xds-server", launchProcess)
179         initEnv(launchProcess)
180
181         var proc *os.Process
182         var fileXdsServer *os.File
183         if launchProcess {
184                 fileXdsServer = launchXdsServer(&proc)
185                 go func(p *os.Process) {
186                         if status, err := p.Wait(); err != nil {
187                                 log.Fatalf("status=%v\n err=%v\n", status, err)
188                         }
189                 }(proc)
190                 defer proc.Kill()
191                 defer fileXdsServer.Close()
192         }
193         time.Sleep(1 * time.Second)
194
195         lvl := common.HTTPLogLevelDebug
196         var fileHTTPClient *os.File
197         HTTPCli, fileHTTPClient = getHTTPClient(lvl)
198         defer fileHTTPClient.Close()
199         var err error
200         sCli, err = NewIoSocketClient(prefixURL, HTTPCli.GetClientID())
201         if err != nil {
202                 log.Fatal(err)
203         }
204
205         if HTTPCli == nil {
206                 log.Fatal("HTTPCLi is nil")
207         }
208         res := m.Run()
209         defer os.Exit(res)
210 }
211
212 func init() {
213 }