76c54eacdc2a674bb7e15ad30d89eb394526cfe7
[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         "io"
21         "log"
22         "os"
23         "os/exec"
24         "path"
25         "testing"
26         "time"
27
28         common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib"
29         "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1"
30 )
31
32 //global client
33 var HTTPCli *common.HTTPClient
34 var logDir string
35 var sdkDir string
36
37 func Copy(src, dst string) error {
38         in, err := os.Open(src)
39         if err != nil {
40                 return err
41         }
42         defer in.Close()
43
44         out, err := os.Create(dst)
45         if err != nil {
46                 return err
47         }
48         defer out.Close()
49
50         _, err = io.Copy(out, in)
51         if err != nil {
52                 return err
53         }
54         return out.Close()
55 }
56
57 func initEnv(launchProcess bool) {
58         if launchProcess {
59                 cmd := exec.Command("killall", "-9", "xds-server")
60                 if err := cmd.Start(); err != nil {
61                         log.Fatal(err)
62                 }
63                 cmd.Wait()
64         }
65         rootTestLog := "/tmp/xds-server-test"
66         if err := os.Setenv(envRootCfgDir, rootTestLog); err != nil {
67                 log.Fatal(err)
68         }
69         sdkDir = rootTestLog + "/sdks/"
70         if err := os.Setenv(envXdtSdk, sdkDir); err != nil {
71                 log.Fatal(err)
72         }
73         if err := os.Setenv(envXdsServerWorkspaceDir, rootTestLog); err != nil {
74                 log.Fatal(err)
75         }
76         if err := os.Setenv(envXdsServerRootCfgDir, rootTestLog); err != nil {
77                 log.Fatal(err)
78         }
79         if err := os.Setenv("XDS_LOG_SILLY", "1"); err != nil {
80                 log.Fatal(err)
81         }
82         os.RemoveAll(rootTestLog)
83         os.MkdirAll(rootTestLog, 0755)
84         logDir = rootTestLog + "/logs/"
85         os.MkdirAll(logDir, 0755)
86         os.MkdirAll(sdkDir, 0755)
87         currentDir, err := os.Getwd()
88         if err != nil {
89                 log.Fatal(err)
90         }
91         if err := Copy(path.Join(currentDir, sdkFile), path.Join(sdkDir, sdkFileName)); err != nil {
92                 log.Fatal(err)
93         }
94 }
95
96 func launchXdsServer(proc **os.Process) *os.File {
97         logFile := logDir + logFileXdsServer
98         file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644)
99         if err != nil {
100                 log.Fatal(err)
101         }
102         tmpProc, err := os.StartProcess(argsProcess[0], argsProcess, &os.ProcAttr{
103                 Files: []*os.File{os.Stdin, file, file},
104         })
105         if err != nil {
106                 log.Fatal(err)
107         }
108         *proc = tmpProc
109         return file
110 }
111
112 func getHTTPClient(lvl int) (*common.HTTPClient, *os.File) {
113         logFile := logDir + logFileClient
114         file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644)
115         if err != nil {
116                 log.Fatal(err)
117         }
118         conf := common.HTTPClientConfig{
119                 URLPrefix:           "/api/v1",
120                 HeaderClientKeyName: "Xds-Sid",
121                 CsrfDisable:         true,
122                 LogOut:              file,
123                 LogPrefix:           "XDSSERVERTEST: ",
124                 LogLevel:            lvl,
125         }
126         cli, err := common.HTTPNewClient(prefixURL, conf)
127         if err != nil {
128                 log.Fatal(err)
129         }
130         log.Printf("HTTP session ID : %v", cli.GetClientID())
131         var ver xsapiv1.Version
132         err = cli.Get("/version", &ver)
133         if err != nil {
134                 log.Fatal(err)
135         }
136         return cli, file
137 }
138
139 func TestMain(m *testing.M) {
140         launchProcess := true
141         log.Printf("TestMain: launchProcess is %v", launchProcess)
142         initEnv(launchProcess)
143
144         var proc *os.Process
145         var fileXdsServer *os.File
146         if launchProcess {
147                 fileXdsServer = launchXdsServer(&proc)
148                 go func(p *os.Process) {
149                         if status, err := p.Wait(); err != nil {
150                                 log.Fatalf("status=%v\n err=%v\n", status, err)
151                         }
152                 }(proc)
153                 defer proc.Kill()
154                 defer fileXdsServer.Close()
155         }
156         time.Sleep(1 * time.Second)
157
158         lvl := common.HTTPLogLevelDebug
159         var fileHTTPClient *os.File
160         HTTPCli, fileHTTPClient = getHTTPClient(lvl)
161         defer fileHTTPClient.Close()
162
163         log.Printf("HTTPCli id is %v", HTTPCli.GetClientID())
164
165         if HTTPCli == nil {
166                 log.Fatal("HTTPCLi is nil")
167         }
168         res := m.Run()
169         defer os.Exit(res)
170 }
171
172 func init() {
173 }