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