Skip to content

Commit

Permalink
rewrite integration test with egctl commands (#1063)
Browse files Browse the repository at this point in the history
* rewrite integration test with egctl, test egctl

* add more test
  • Loading branch information
suchen-sci committed Aug 4, 2023
1 parent d871674 commit 2c1b4f0
Show file tree
Hide file tree
Showing 3 changed files with 386 additions and 111 deletions.
127 changes: 69 additions & 58 deletions build/test/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,84 +18,95 @@
package test

import (
"bytes"
"fmt"
"io"
"net/http"
"os"
"os/exec"
"regexp"
"strings"
"testing"

"github.com/stretchr/testify/require"
)

func makeURL(template string, a ...interface{}) string {
return "http:https://127.0.0.1:12381/apis/v2" + fmt.Sprintf(template, a...)
func egctlCmd(args ...string) *exec.Cmd {
egctl := os.Getenv("EGCTL")
if egctl == "" {
egctl = "egctl"
}
cmd := exec.Command(egctl, args...)
cmd.Args = append(cmd.Args, "--server", "http:https://127.0.0.1:12381")
return cmd
}

func successfulStatusCode(code int) bool {
return code >= 200 && code < 300
func runCmd(cmd *exec.Cmd) (string, string, error) {
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
return stdout.String(), stderr.String(), err
}

func intentString(str string) string {
return "\n\t\t" + strings.ReplaceAll(str, "\n", "\n\t\t")
func createResource(yamlFile string) error {
cmd := egctlCmd("create", "-f", "-")
cmd.Stdin = strings.NewReader(yamlFile)
_, stderr, err := runCmd(cmd)
if err != nil {
return fmt.Errorf("create resource failed\nstderr: %v\nerr: %v", stderr, err)
}
return nil
}

func handleRequest(t *testing.T, method string, url string, reader io.Reader) *http.Response {
req, err := http.NewRequest(method, url, reader)
require.Nil(t, err)
resp, err := http.DefaultClient.Do(req)
require.Nil(t, err)
return resp
func applyResource(yamlFile string) error {
cmd := egctlCmd("apply", "-f", "-")
cmd.Stdin = strings.NewReader(yamlFile)
_, stderr, err := runCmd(cmd)
if err != nil {
return fmt.Errorf("apply resource failed\nstderr: %v\nerr: %v", stderr, err)
}
return nil
}

const (
objectsURL = "/objects"
objectURL = "/objects/%s"
)

func createObject(t *testing.T, yamlFile string) (ok bool, msg string) {
resp := handleRequest(t, http.MethodPost, makeURL(objectsURL), strings.NewReader(yamlFile))
defer resp.Body.Close()

ok = successfulStatusCode(resp.StatusCode)
if !ok {
data, err := io.ReadAll(resp.Body)
require.Nil(t, err)
msg = fmt.Sprintf("create object\n %v\nfailed, %v", intentString(yamlFile), intentString(string(data)))
func deleteResource(kind string, args ...string) error {
cmd := egctlCmd("delete", kind)
if len(args) > 0 {
cmd.Args = append(cmd.Args, args...)
}
return
_, stderr, err := runCmd(cmd)
if err != nil {
return fmt.Errorf("delete resource failed\nstderr: %v\nerr: %v", stderr, err)
}
return nil
}

func updateObject(t *testing.T, name string, yamlFile string) (ok bool, msg string) {
resp := handleRequest(t, http.MethodPut, makeURL(objectURL, name), strings.NewReader(yamlFile))
defer resp.Body.Close()

ok = successfulStatusCode(resp.StatusCode)
if !ok {
data, err := io.ReadAll(resp.Body)
require.Nil(t, err)
msg = fmt.Sprintf("update object %v\n %v\nfailed, %v", name, intentString(yamlFile), intentString(string(data)))
func describeResource(kind string, args ...string) (string, error) {
cmd := egctlCmd("describe", kind)
if len(args) > 0 {
cmd.Args = append(cmd.Args, args...)
}
stdout, stderr, err := runCmd(cmd)
if err != nil {
return "", fmt.Errorf("describe resource failed\nstderr: %v\nerr: %v", stderr, err)
}
return
return stdout, nil
}

func deleteObject(t *testing.T, name string) (ok bool, msg string) {
resp := handleRequest(t, http.MethodDelete, makeURL(objectURL, name), nil)
defer resp.Body.Close()

ok = successfulStatusCode(resp.StatusCode)
if !ok {
data, err := io.ReadAll(resp.Body)
require.Nil(t, err)
msg = fmt.Sprintf("delete object %v failed, %v", name, intentString(string(data)))
func getResource(kind string, args ...string) (string, error) {
cmd := egctlCmd("get", kind)
if len(args) > 0 {
cmd.Args = append(cmd.Args, args...)
}
stdout, stderr, err := runCmd(cmd)
if err != nil {
return "", fmt.Errorf("describe resource failed\nstderr: %v\nerr: %v", stderr, err)
}
return ok, msg
return stdout, nil
}

func listObject(t *testing.T) (ok bool, msg string) {
resp := handleRequest(t, http.MethodGet, makeURL(objectsURL), nil)
defer resp.Body.Close()
func matchTable(array []string, output string) bool {
// Join the elements of the array with the regular expression pattern to match one or more tab characters
pattern := strings.Join(array, `\t+`)

// Compile the regular expression pattern
re := regexp.MustCompile(pattern)

data, err := io.ReadAll(resp.Body)
require.Nil(t, err)
return successfulStatusCode(resp.StatusCode), string(data)
// Check if the regular expression matches the output string
return re.MatchString(output)
}
Loading

0 comments on commit 2c1b4f0

Please sign in to comment.