tests: add comments and logs
[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                 /*kill xds-server if needed*/
73                 cmd := exec.Command("killall", "-9", "xds-server")
74                 if err := cmd.Start(); err != nil {
75                         log.Fatal(err)
76                 }
77                 cmd.Wait()
78         }
79         /*set environment variable*/
80         rootTestLog := "/tmp/xds-server-test"
81         if err := os.Setenv(envRootCfgDir, rootTestLog); err != nil {
82                 log.Fatal(err)
83         }
84         sdkDir := rootTestLog + "/sdks/"
85         if err := os.Setenv(envXdtSdk, sdkDir); err != nil {
86                 log.Fatal(err)
87         }
88         if err := os.Setenv(envXdsServerWorkspaceDir, rootTestLog); err != nil {
89                 log.Fatal(err)
90         }
91         if err := os.Setenv(envXdsServerRootCfgDir, rootTestLog); err != nil {
92                 log.Fatal(err)
93         }
94         if err := os.Setenv("XDS_LOG_SILLY", "1"); err != nil {
95                 log.Fatal(err)
96         }
97         /*remove and recreate working directories*/
98         os.RemoveAll(rootTestLog)
99         os.MkdirAll(rootTestLog, 0755)
100         logDir = rootTestLog + "/logs/"
101         os.MkdirAll(logDir, 0755)
102 }
103
104 /*prepare xds-server process*/
105 func launchXdsServer(proc **os.Process) *os.File {
106         logFile := logDir + logFileXdsServer
107         file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644)
108         if err != nil {
109                 log.Fatal(err)
110         }
111         tmpProc, err := os.StartProcess(argsProcess[0], argsProcess, &os.ProcAttr{
112                 Files: []*os.File{os.Stdin, file, file},
113         })
114         if err != nil {
115                 log.Fatal(err)
116         }
117         *proc = tmpProc
118         return file
119 }
120
121 func getHTTPClient(lvl int) (*common.HTTPClient, *os.File) {
122         logFile := logDir + logFileClient
123         file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644)
124         if err != nil {
125                 log.Fatal(err)
126         }
127         conf := common.HTTPClientConfig{
128                 URLPrefix:           "/api/v1",
129                 HeaderClientKeyName: "Xds-Sid",
130                 CsrfDisable:         true,
131                 LogOut:              file,
132                 LogPrefix:           "XDSSERVERTEST: ",
133                 LogLevel:            lvl,
134         }
135         cli, err := common.HTTPNewClient(prefixURL, conf)
136         if err != nil {
137                 log.Fatal(err)
138         }
139         log.Printf("HTTP session ID : %v", cli.GetClientID())
140         var ver xsapiv1.Version
141         err = cli.Get("/version", &ver)
142         if err != nil {
143                 log.Fatal(err)
144         }
145         return cli, file
146 }
147
148 func NewIoSocketClient(url, clientID string) (*IOSockClient, error) {
149         var err error
150
151         sCli := &IOSockClient{
152                 URL:       url,
153                 EmitMutex: &sync.Mutex{},
154                 Options: &socketio_client.Options{
155                         Transport: "websocket",
156                         Header:    make(map[string][]string),
157                 },
158         }
159         sCli.Options.Header["XDS-SID"] = []string{clientID}
160
161         sCli.Conn, err = socketio_client.NewClient(url, sCli.Options)
162         if err != nil {
163                 return nil, fmt.Errorf("IO.socket connection error: " + err.Error())
164         }
165
166         sCli.Conn.On("connection", func() {
167                 sCli.Connected = true
168         })
169
170         sCli.Conn.On("disconnection", func(err error) {
171                 log.Printf("WS disconnection event with err: %v\n", err)
172                 sCli.Connected = false
173         })
174
175         log.Printf("Connect websocket with url=%v clientId=%v\n", prefixURL, HTTPCli.GetClientID())
176         return sCli, nil
177 }
178 func TestMain(m *testing.M) {
179         /* useful for debugging, preventing from launching xds-server
180          * it can be launch separetly */
181         launchProcess := true
182         log.Printf("TestMain: launchProcess is %v, so launching xds-server", launchProcess)
183         initEnv(launchProcess)
184
185         var proc *os.Process
186         var fileXdsServer *os.File
187         if launchProcess {
188                 fileXdsServer = launchXdsServer(&proc)
189                 go func(p *os.Process) {
190                         log.Print("xds-server is launching")
191                         if status, err := p.Wait(); err != nil {
192                                 log.Fatalf("status=%v\n err=%v\n", status, err)
193                         }
194                 }(proc)
195                 defer proc.Kill()
196                 defer fileXdsServer.Close()
197         }
198         time.Sleep(1 * time.Second)
199
200         lvl := common.HTTPLogLevelDebug
201         var fileHTTPClient *os.File
202         HTTPCli, fileHTTPClient = getHTTPClient(lvl)
203         defer fileHTTPClient.Close()
204         var err error
205         sCli, err = NewIoSocketClient(prefixURL, HTTPCli.GetClientID())
206         if err != nil {
207                 log.Fatal(err)
208         }
209
210         if HTTPCli == nil {
211                 log.Fatal("HTTPCLi is nil")
212         }
213         res := m.Run()
214         defer os.Exit(res)
215 }