From 4121746213075b785adf24eec17eb0bdf49199c3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20B=C3=A9nier?= Date: Thu, 19 Jul 2018 10:57:02 +0200 Subject: [PATCH] functionnal test: initial commit for tests MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Launch xds-server process and run test based on xds REST APIs. list of tests - version - config - folders(in progress) Change-Id: I4312c9ab067b2d6e157f8828c2fbe467ef187733 Signed-off-by: Clément Bénier --- .vscode/launch.json | 12 +++ Makefile | 2 +- glide.yaml | 5 ++ test/_test-config.json | 8 ++ test/test_config.go | 24 ++++++ test/xdsserver_test.go | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 test/_test-config.json create mode 100644 test/test_config.go create mode 100644 test/xdsserver_test.go diff --git a/.vscode/launch.json b/.vscode/launch.json index 7c3d99c..c12c80c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -16,6 +16,18 @@ "args": ["-log", "debug"], "showLog": false }, + { + "name": "XDS-Server-Test", + "type": "go", + "request": "launch", + "mode": "test", + "program": "${workspaceRoot}/test", + "env": { + "GOPATH": "${workspaceRoot}/../../../../../..:${env:GOPATH}", + }, + "args": ["-test.v", "-test.run", ".*"], + "showLog": false + }, { "name": "XDS-Server local dev", "type": "go", diff --git a/Makefile b/Makefile index 705b670..295650b 100644 --- a/Makefile +++ b/Makefile @@ -120,7 +120,7 @@ xds: scripts tools/syncthing/copytobin @cd $(ROOT_SRCDIR); $(BUILD_ENV_FLAGS) go build $(VERBOSE_$(V)) -i -o $(LOCAL_BINDIR)/$(TARGET)$(EXT) -ldflags "$(GO_LDFLAGS) -X main.AppVersion=$(VERSION) -X main.AppSubVersion=$(SUB_VERSION)" -gcflags "$(GO_GCFLAGS)" . test: tools/glide - go test --race $(shell $(LOCAL_TOOLSDIR)/glide novendor) + go test --race ./test -v vet: tools/glide go vet $(shell $(LOCAL_TOOLSDIR)/glide novendor) diff --git a/glide.yaml b/glide.yaml index 6aeee9f..193ad48 100644 --- a/glide.yaml +++ b/glide.yaml @@ -33,3 +33,8 @@ import: version: ^1.0.0 - package: github.com/franciscocpg/reflectme version: ^0.1.9 +- package: "github.com/stretchr/testify" + version: ^1.2.2 + subpackages: + - assert + diff --git a/test/_test-config.json b/test/_test-config.json new file mode 100644 index 0000000..835bc79 --- /dev/null +++ b/test/_test-config.json @@ -0,0 +1,8 @@ +{ + "webAppDir": "${EXEPATH}/../webapp/dist", + "httpPort": "8000", + "sdkScriptsDir": "${EXEPATH}/../sdks", + "shareRootDir": "${XDS_SERVER_ROOT_CFG_DIR}/xds-server/projects", + "logsDir": "${XDS_SERVER_ROOT_CFG_DIR}/xds-server/logs", + "sdkRootDir": "${EXEPATH}/xds-server/sdk" +} diff --git a/test/test_config.go b/test/test_config.go new file mode 100644 index 0000000..a182dd5 --- /dev/null +++ b/test/test_config.go @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Clément Bénier + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package xdsservertest + +var argsProcess = []string{"../bin/xds-server", "-l", "debug", "-c", "_test-config.json"} + +const envRootCfgDir = "XDS_SERVER_ROOT_CFG_DIR" +const prefixURL = "http://localhost:8000" +const logFileXdsServer = "xdsserver-test.log" +const logFileClient = "client-test.log" diff --git a/test/xdsserver_test.go b/test/xdsserver_test.go new file mode 100644 index 0000000..bab7f68 --- /dev/null +++ b/test/xdsserver_test.go @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Clément Bénier + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package xdsservertest + +import ( + "log" + "net" + "os" + "regexp" + "strings" + "testing" + "time" + + common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1" + "github.com/stretchr/testify/assert" +) + +//global client +var HTTPCli *common.HTTPClient +var logDir string + +func initEnv() { + rootTestLog := "/tmp/xds-server-test" + if err := os.Setenv(envRootCfgDir, rootTestLog); err != nil { + log.Fatal(err) + } + os.RemoveAll(rootTestLog) + os.MkdirAll(rootTestLog, 0755) + logDir = rootTestLog + "/logs/" + os.MkdirAll(logDir, 0755) +} + +func launchXdsServer(proc **os.Process) *os.File { + logFile := logDir + logFileXdsServer + file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatal(err) + } + tmpProc, err := os.StartProcess(argsProcess[0], argsProcess, &os.ProcAttr{ + Files: []*os.File{os.Stdin, file, file}, + }) + if err != nil { + log.Fatal(err) + } + *proc = tmpProc + return file +} + +func getHTTPClient(lvl int) (*common.HTTPClient, *os.File) { + logFile := logDir + logFileClient + file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatal(err) + } + conf := common.HTTPClientConfig{ + URLPrefix: "/api/v1", + HeaderClientKeyName: "Xds-Test-Sid", + CsrfDisable: true, + LogOut: file, + LogPrefix: "XDSSERVERTEST: ", + LogLevel: lvl, + } + cli, err := common.HTTPNewClient(prefixURL, conf) + if err != nil { + log.Print(err) + } + return cli, file +} + +func TestMain(m *testing.M) { + initEnv() + + var proc *os.Process + fileXdsServer := launchXdsServer(&proc) + go func(p *os.Process) { + if status, err := p.Wait(); err != nil { + log.Fatalf("status=%v\n err=%v\n", status, err) + } + }(proc) + time.Sleep(1 * time.Second) + + lvl := common.HTTPLogLevelDebug + var fileHTTPClient *os.File + HTTPCli, fileHTTPClient = getHTTPClient(lvl) + + if HTTPCli == nil { + log.Fatal("HTTPCLi is nil") + } + res := m.Run() + proc.Kill() + fileXdsServer.Close() + fileHTTPClient.Close() + os.Exit(res) +} + +func init() { +} + +func CheckIP(ipconfig string) bool { + ifaces, _ := net.Interfaces() + for _, i := range ifaces { + addrs, _ := i.Addrs() + for _, addr := range addrs { + if strings.HasPrefix(addr.String(), ipconfig) { + return true + } + } + } + return false +} + +func TestVersion(t *testing.T) { + var datVersion map[string]interface{} + assert.Nil(t, HTTPCli.Get("/version", &datVersion)) + t.Log(datVersion) + + ver, present := datVersion["version"] + assert.True(t, present) + t.Logf("version is %s", ver.(string)) + re := regexp.MustCompile("^v*[0-9]+.[0-9]+.[0-9]+$") + assert.True(t, re.MatchString(ver.(string))) +} + +func TestConfig(t *testing.T) { + var datConfig map[string]interface{} + assert.Nil(t, HTTPCli.Get("/config", &datConfig)) + + builder, present := datConfig["builder"].(map[string]interface{}) + assert.True(t, present) + ip, present := builder["ip"] + assert.True(t, present) + assert.True(t, CheckIP(ip.(string))) +} +func TestFolders(t *testing.T) { + var datFolder []interface{} + assert.Nil(t, HTTPCli.Get("/folders", &datFolder)) + t.Log(datFolder) + assert.Equal(t, len(datFolder), 0) + + fPrj := xsapiv1.FolderConfig{ + Label: "testproject", + ClientPath: logDir + "testproject", + Type: xsapiv1.TypePathMap, + ClientData: "clientdatatest", + DataPathMap: xsapiv1.PathMapConfig{ + ServerPath: logDir + "testserverpath", + }, + } + var cfg xsapiv1.FolderConfig + assert.Nil(t, HTTPCli.Post("/folders", fPrj, &cfg)) + assert.NotNil(t, cfg) + t.Log(cfg) + + isCfgPrjMatch := func(fPrj xsapiv1.FolderConfig, cfg xsapiv1.FolderConfig) { + re := regexp.MustCompile("^[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+$") + assert.True(t, re.MatchString(cfg.ID)) //ID + assert.Equal(t, cfg.Label, fPrj.Label) //Label + assert.Equal(t, cfg.ClientPath, fPrj.ClientPath) + assert.Equal(t, cfg.Type, fPrj.Type) + assert.Equal(t, cfg.Status, "Enable") + assert.Equal(t, cfg.IsInSync, true) + assert.Equal(t, len(cfg.DefaultSdk), 0) + assert.Equal(t, fPrj.ClientData, cfg.ClientData) + assert.Equal(t, fPrj.DataPathMap.ServerPath, cfg.DataPathMap.ServerPath) + } + isCfgPrjMatch(fPrj, cfg) + var cfg2 xsapiv1.FolderConfig + assert.Nil(t, HTTPCli.Get("/folders/"+cfg.ID, &cfg2)) + t.Log(cfg2) + isCfgPrjMatch(fPrj, cfg2) + + //call with the same uid create error + assert.NotNil(t, HTTPCli.Post("/folders", cfg, &cfg)) + + //assert.Equal(t, cfg.DefaultSdk, "true") + //call with the same uid + //serverpath nil + //serverpath already exists +} + +//func TestRegister(t *testing.T) { +// var client := common.HTTPClient +// client.Get("/folders", folders) +//} -- 2.16.6