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 }}