/* * 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 ( "bytes" "os" "os/exec" "path" "testing" "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1" "github.com/stretchr/testify/require" ) func InitExec(t *testing.T) string { Debugf(t, "Create helloworld directory with app-templates") /*copy helloworld from fixtures to envRootCfgDir*/ helloworldDir := path.Join(os.Getenv(envRootCfgDir), "helloworld") cmd := exec.Command("cp", "-r", helloworldFixturesDir, helloworldDir) var out bytes.Buffer cmd.Stdout = &out require.Nil(t, cmd.Run()) /*clone submodules app templates into helloworld*/ subHelloworldAppTemplateDir := path.Join(helloworldDir, "conf.d", "app-templates") cmd = exec.Command("git", "clone", "-b", "flounder", "https://gerrit.automotivelinux.org/gerrit/p/apps/app-templates.git", subHelloworldAppTemplateDir) require.Nil(t, cmd.Run()) return helloworldDir } func TestExec(t *testing.T) { helloworldDir := InitExec(t) /*channel for SDK events*/ chSdks := make(chan xsapiv1.SDK) defer close(chSdks) sdk := xsapiv1.SDKInstallArgs{ ID: "", Filename: sdkFileName, Force: false, } ConnectSDKStateChange(t, sCli, chSdks) sdkRes := installFakeSdk(t, sdk, chSdks) /*check there is no project*/ var cfgArray []xsapiv1.FolderConfig require.Nil(t, HTTPCli.Get("/folders", &cfgArray)) require.Equal(t, len(cfgArray), 0) fPrj := xsapiv1.FolderConfig{ Label: "testproject", ClientPath: helloworldDir, Type: xsapiv1.TypePathMap, ClientData: "clientdatatest", DataPathMap: xsapiv1.PathMapConfig{ ServerPath: helloworldDir, }, } /*create project*/ var cfg xsapiv1.FolderConfig require.Nil(t, HTTPCli.Post("/folders", fPrj, &cfg)) require.NotNil(t, cfg) /*channel for ExecExitMsg*/ chExec := make(chan xsapiv1.ExecExitMsg) defer close(chExec) sCli.Conn.On(xsapiv1.ExecExitEvent, func(ev xsapiv1.ExecExitMsg) { chExec <- ev }) /*Collect commands output in */ cmdOut := "" sCli.Conn.On(xsapiv1.ExecOutEvent, func(ev xsapiv1.ExecOutMsg) { cmdOut += ev.Stdout + ev.Stderr }) /*error when exec with fakeid*/ var execRes xsapiv1.ExecArgs cmd := "pwd && echo \"SDKTARGETSYSROOT=<$SDKTARGETSYSROOT>\"" exec := xsapiv1.ExecArgs{ ID: cfg.ID, Cmd: cmd, SdkID: "11111-invalid", } Debugf(t, "exec cmake cmd(%v)", cmd) cmdOut = "" require.NotNil(t, HTTPCli.Post("/exec", exec, &execRes)) /*basic check: verify that environment is set correctly (use the right sdk)*/ cmd = "pwd && echo \"SDKTARGETSYSROOT=<$SDKTARGETSYSROOT>\"" exec = xsapiv1.ExecArgs{ ID: cfg.ID, Cmd: cmd, SdkID: sdkRes.ID, } Debugf(t, "exec cmake cmd(%v)", cmd) cmdOut = "" require.Nil(t, HTTPCli.Post("/exec", exec, &execRes)) exitMsg := <-chExec require.Equal(t, exitMsg.Code, 0) /*cmake helloworld project with fake sdk*/ cmd = "cd " + fPrj.ClientPath cmd = cmd + " && " cmd = cmd + "mkdir -p build" cmd = cmd + " && " cmd = cmd + "cd build" cmd = cmd + " && " cmd = cmd + "cmake .." /*post exec cmd cmake*/ exec = xsapiv1.ExecArgs{ ID: cfg.ID, Cmd: cmd, } Debugf(t, "exec cmake cmd(%v)", cmd) require.Nil(t, HTTPCli.Post("/exec", exec, &execRes)) exitMsg = <-chExec require.Equal(t, exitMsg.Code, 0) /*make helloworld project with fake sdk*/ cmd = "cd " + fPrj.ClientPath cmd = cmd + "&&" cmd = cmd + "cd build" cmd = cmd + "&&" cmd = cmd + "make" exec.Cmd = cmd /*post exec cmd make*/ Debugf(t, "exec make cmd(%v)", cmd) require.Nil(t, HTTPCli.Post("/exec", exec, &execRes)) exitMsg = <-chExec require.Equal(t, exitMsg.Code, 0) /*check if helloworld.so exists*/ Debug(t, "check that helloworld.so exists") _, err := os.Stat(path.Join(fPrj.ClientPath, "build/helloworld/helloworld.so")) require.Nil(t, err) /*deinit*/ require.Nil(t, HTTPCli.Delete("/folders/"+cfg.ID, &cfg)) RemoveSdk(t, sdkRes, chSdks) DisconnectSDKStateChange(t, sCli) }