You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ho...@apache.org on 2021/03/03 12:42:00 UTC

[skywalking-infra-e2e] 01/02: Polish code and add tests

This is an automated email from the ASF dual-hosted git repository.

hoshea pushed a commit to branch verifier/query
in repository https://gitbox.apache.org/repos/asf/skywalking-infra-e2e.git

commit 61fd0727f8d8ff8a8b4e0a493f983aae93eaee4c
Author: Hoshea <fg...@gmail.com>
AuthorDate: Wed Mar 3 20:38:42 2021 +0800

    Polish code and add tests
---
 commands/verify/verify.go                     | 35 ++++++++++++++++++---------
 e2e.yaml                                      |  6 ++---
 internal/components/verifier/verifier.go      | 29 +++-------------------
 internal/components/verifier/verifier_test.go |  4 +--
 internal/util/utils.go                        |  3 +--
 internal/util/utils_test.go                   | 31 ++++++++++++++++++++++++
 e2e.yaml => test/verify/3.expected.yaml       | 16 ++++--------
 7 files changed, 69 insertions(+), 55 deletions(-)

diff --git a/commands/verify/verify.go b/commands/verify/verify.go
index 3f53183..1cfc8be 100644
--- a/commands/verify/verify.go
+++ b/commands/verify/verify.go
@@ -18,6 +18,7 @@
 package verify
 
 import (
+	"fmt"
 	"github.com/apache/skywalking-infra-e2e/internal/components/verifier"
 	"github.com/apache/skywalking-infra-e2e/internal/config"
 	"github.com/apache/skywalking-infra-e2e/internal/logger"
@@ -53,26 +54,36 @@ var Verify = &cobra.Command{
 func verifySingleCase(expectedFile, actualFile, query string) error {
 	expectedData, err := util.ReadFileContent(expectedFile)
 	if err != nil {
-		logger.Log.Error("failed to read the expected data file")
-		return err
+		return fmt.Errorf("failed to read the expected data file: %v", err)
 	}
 
+	var actualData, sourceName string
 	if actualFile != "" {
-		if err = verifier.VerifyDataFile(actualFile, expectedData); err != nil {
-			logger.Log.Warnf("failed to verify the output: %s\n", actualFile)
-		} else {
-			logger.Log.Infof("verified the output: %s\n", actualFile)
+		sourceName = actualFile
+		actualData, err = util.ReadFileContent(actualFile)
+		if err != nil {
+			return fmt.Errorf("failed to read the actual data file: %v", err)
 		}
 	} else if query != "" {
-		if err = verifier.VerifyQuery(query, expectedData); err != nil {
-			logger.Log.Warnf("failed to verify the output: %s\n", query)
-		} else {
-			logger.Log.Infof("verified the output: %s\n", query)
+		sourceName = query
+		actualData, err = util.ExecuteCommand(query)
+		if err != nil {
+			return fmt.Errorf("failed to execute the query: %v", err)
+		}
+	}
+
+	if err = verifier.Verify(actualData, expectedData); err != nil {
+		logger.Log.Warnf("failed to verify the output: %s\n", sourceName)
+		if me, ok := err.(*verifier.MismatchError); ok {
+			fmt.Println(me.Error())
 		}
+	} else {
+		logger.Log.Infof("verified the output: %s\n", sourceName)
 	}
 	return nil
 }
 
+// verifyAccordingConfig reads cases from the config file and verifies them.
 func verifyAccordingConfig() error {
 	if config.GlobalConfig.Error != nil {
 		return config.GlobalConfig.Error
@@ -82,7 +93,9 @@ func verifyAccordingConfig() error {
 
 	for _, v := range e2eConfig.Verify {
 		if v.Expected != "" {
-			verifySingleCase(v.Expected, v.Actual, v.Query)
+			if err := verifySingleCase(v.Expected, v.Actual, v.Query); err != nil {
+				logger.Log.Errorf("%v", err)
+			}
 		} else {
 			logger.Log.Error("the expected data file is not specified")
 		}
diff --git a/e2e.yaml b/e2e.yaml
index 37281fa..66e865b 100644
--- a/e2e.yaml
+++ b/e2e.yaml
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# This config file can be used to test.
+# This file is used to show how to write configuration files and can be used to test.
 
 verify:
   - actual: test/verify/1.actual.yaml
@@ -24,5 +24,5 @@ verify:
     expected: test/verify/2.expected.yaml
   - actual: test/verify/1.actual.yaml
     expected: test/verify/2.expected.yaml
-  - actual: test/verify/2.actual.yaml
-    expected: test/verify/1.expected.yaml
\ No newline at end of file
+  - query: swctl --display yaml service ls
+    expected: test/verify/3.expected.yaml
\ No newline at end of file
diff --git a/internal/components/verifier/verifier.go b/internal/components/verifier/verifier.go
index ed15361..866b063 100644
--- a/internal/components/verifier/verifier.go
+++ b/internal/components/verifier/verifier.go
@@ -21,14 +21,13 @@ import (
 	"bytes"
 	"fmt"
 
-	"github.com/apache/skywalking-infra-e2e/internal/util"
 	"github.com/apache/skywalking-infra-e2e/third-party/go/template"
 
 	"github.com/google/go-cmp/cmp"
 	"gopkg.in/yaml.v2"
 )
 
-// MismatchError is the error type returned by the verify functions.
+// MismatchError is the error type returned by the Verify functions.
 // It contains the diff content.
 type MismatchError struct {
 	Err  error
@@ -44,30 +43,8 @@ func (e *MismatchError) Error() string {
 	return e.diff
 }
 
-// VerifyDataFile reads the actual data from the file and verifies.
-func VerifyDataFile(actualFile, expectedData string) error {
-	actualData, err := util.ReadFileContent(actualFile)
-	if err != nil {
-		return fmt.Errorf("failed to read the actual data file: %v", err)
-	}
-
-	return verify(actualData, expectedData)
-}
-
-// VerifyQuery gets the actual data from the query and then verifies.
-func VerifyQuery(query, expectedData string) error {
-	queryResult, err := util.ExecuteCommand(query)
-	if err != nil {
-		return fmt.Errorf("failed to execute the query: %v", err)
-	}
-
-	// TODO: ensure that the query result has the same format as expected data
-
-	return verify(queryResult, expectedData)
-}
-
-// verify checks if the actual data match the expected template.
-func verify(actualData, expectedTemplate string) error {
+// Verify checks if the actual data match the expected template.
+func Verify(actualData, expectedTemplate string) error {
 	var actual interface{}
 	if err := yaml.Unmarshal([]byte(actualData), &actual); err != nil {
 		return fmt.Errorf("failed to unmarshal actual data: %v", err)
diff --git a/internal/components/verifier/verifier_test.go b/internal/components/verifier/verifier_test.go
index f7d073a..0d6b7e7 100644
--- a/internal/components/verifier/verifier_test.go
+++ b/internal/components/verifier/verifier_test.go
@@ -142,8 +142,8 @@ metrics:
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if err := verify(tt.args.actualData, tt.args.expectedTemplate); (err != nil) != tt.wantErr {
-				t.Errorf("verify() error = %v, wantErr %v", err, tt.wantErr)
+			if err := Verify(tt.args.actualData, tt.args.expectedTemplate); (err != nil) != tt.wantErr {
+				t.Errorf("Verify() error = %v, wantErr %v", err, tt.wantErr)
 			}
 		})
 	}
diff --git a/internal/util/utils.go b/internal/util/utils.go
index ab97c3c..5559e11 100644
--- a/internal/util/utils.go
+++ b/internal/util/utils.go
@@ -55,9 +55,8 @@ func ReadFileContent(filename string) (string, error) {
 }
 
 // ExecuteCommand executes the given command and returns the result.
-// TODO: consider security issues.
 func ExecuteCommand(cmd string) (string, error) {
-	command := exec.Command(cmd)
+	command := exec.Command("bash", "-c", cmd)
 	outinfo := bytes.Buffer{}
 	command.Stdout = &outinfo
 
diff --git a/internal/util/utils_test.go b/internal/util/utils_test.go
new file mode 100644
index 0000000..b098b15
--- /dev/null
+++ b/internal/util/utils_test.go
@@ -0,0 +1,31 @@
+package util
+
+import "testing"
+
+func TestExecuteCommand(t *testing.T) {
+	tests := []struct {
+		name    string
+		cmd     string
+		wantErr bool
+	}{
+		{
+			name:    "without args",
+			cmd:     "swctl",
+			wantErr: false,
+		},
+		{
+			name:    "with args",
+			cmd:     "swctl service ls",
+			wantErr: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			_, err := ExecuteCommand(tt.cmd)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("ExecuteCommand() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+		})
+	}
+}
diff --git a/e2e.yaml b/test/verify/3.expected.yaml
similarity index 68%
copy from e2e.yaml
copy to test/verify/3.expected.yaml
index 37281fa..40f5133 100644
--- a/e2e.yaml
+++ b/test/verify/3.expected.yaml
@@ -15,14 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# This config file can be used to test.
-
-verify:
-  - actual: test/verify/1.actual.yaml
-    expected: test/verify/1.expected.yaml
-  - actual: test/verify/2.actual.yaml
-    expected: test/verify/2.expected.yaml
-  - actual: test/verify/1.actual.yaml
-    expected: test/verify/2.expected.yaml
-  - actual: test/verify/2.actual.yaml
-    expected: test/verify/1.expected.yaml
\ No newline at end of file
+{{- contains . }}
+- id: {{ notEmpty .id }}
+  name: {{ notEmpty .name }}
+  group: ""
+{{- end }}