From 2bcda3c357b6108c84bb2c0224f7469cfec4ae43 Mon Sep 17 00:00:00 2001 From: Martin Gencur Date: Mon, 22 Jul 2019 15:49:19 +0200 Subject: [PATCH 1/2] Add E2E tests for Service, revision, route * service, revision, route describe and describe with print flags * route list with print flags * service create for a duplicate service --- test/e2e/basic_workflow_test.go | 59 +++++++++++++++++++++++++++++- test/e2e/revision_workflow_test.go | 48 ++++++++++++++++++++---- 2 files changed, 97 insertions(+), 10 deletions(-) diff --git a/test/e2e/basic_workflow_test.go b/test/e2e/basic_workflow_test.go index 609b709ee6..2967cb7e20 100644 --- a/test/e2e/basic_workflow_test.go +++ b/test/e2e/basic_workflow_test.go @@ -38,9 +38,14 @@ func TestBasicWorkflow(t *testing.T) { test.serviceCreate(t, "hello") }) + t.Run("create hello service again and get service already exists error", func(t *testing.T) { + test.serviceCreateDuplicate(t, "hello") + }) + t.Run("returns valid info about hello service", func(t *testing.T) { test.serviceList(t, "hello") test.serviceDescribe(t, "hello") + test.serviceDescribeWithPrintFlags(t, "hello") }) t.Run("update hello service's configuration and returns no error", func(t *testing.T) { @@ -59,6 +64,12 @@ func TestBasicWorkflow(t *testing.T) { t.Run("returns a list of routes associated with hello and svc2 services", func(t *testing.T) { test.routeList(t) test.routeListWithArgument(t, "hello") + test.routeListWithPrintFlags(t, "hello", "svc2") + }) + + t.Run("describe route from hello service", func(t *testing.T) { + test.routeDescribe(t, "hello") + test.routeDescribeWithPrintFlags(t, "hello") }) t.Run("delete hello and svc2 services and returns no error", func(t *testing.T) { @@ -93,8 +104,18 @@ func (test *e2eTest) serviceList(t *testing.T, serviceName string) { out, err := test.kn.RunWithOpts([]string{"service", "list", serviceName}, runOpts{NoNamespace: false}) assert.NilError(t, err) - expectedOutput := fmt.Sprintf("%s", serviceName) - assert.Check(t, util.ContainsAll(out, expectedOutput)) + assert.Check(t, util.ContainsAll(out, serviceName)) +} + +func (test *e2eTest) serviceCreateDuplicate(t *testing.T, serviceName string) { + out, err := test.kn.RunWithOpts([]string{"service", "list", serviceName}, runOpts{NoNamespace: false}) + assert.Check(t, strings.Contains(out, serviceName), "The service does not exist yet") + + _, err = test.kn.RunWithOpts([]string{"service", "create", + fmt.Sprintf("%s", serviceName), + "--image", KnDefaultTestImage}, runOpts{NoNamespace: false, AllowError: true}) + + assert.ErrorContains(t, err, "the service already exists") } func (test *e2eTest) revisionListForService(t *testing.T, serviceName string) { @@ -132,6 +153,14 @@ func (test *e2eTest) serviceUpdate(t *testing.T, serviceName string, args []stri assert.Check(t, util.ContainsAll(out, expectedOutput)) } +func (test *e2eTest) serviceDescribeWithPrintFlags(t *testing.T, serviceName string) { + out, err := test.kn.RunWithOpts([]string{"service", "describe", serviceName, "-o=name"}, runOpts{}) + assert.NilError(t, err) + + expectedName := fmt.Sprintf("service.serving.knative.dev/%s", serviceName) + assert.Check(t, strings.Contains(out, expectedName)) +} + func (test *e2eTest) routeList(t *testing.T) { out, err := test.kn.RunWithOpts([]string{"route", "list"}, runOpts{}) assert.NilError(t, err) @@ -154,3 +183,29 @@ func (test *e2eTest) serviceDelete(t *testing.T, serviceName string) { assert.Check(t, util.ContainsAll(out, "Service", serviceName, "successfully deleted in namespace", test.kn.namespace)) } + +func (test *e2eTest) routeDescribe(t *testing.T, routeName string) { + out, err := test.kn.RunWithOpts([]string{"route", "describe", routeName}, runOpts{}) + assert.NilError(t, err) + + expectedGVK := `apiVersion: serving.knative.dev/v1alpha1 +kind: Route` + expectedNamespace := fmt.Sprintf("namespace: %s", test.kn.namespace) + expectedServiceLabel := fmt.Sprintf("serving.knative.dev/service: %s", routeName) + assert.Check(t, util.ContainsAll(out, expectedGVK, expectedNamespace, expectedServiceLabel)) +} + +func (test *e2eTest) routeDescribeWithPrintFlags(t *testing.T, routeName string) { + out, err := test.kn.RunWithOpts([]string{"route", "describe", routeName, "-o=name"}, runOpts{}) + assert.NilError(t, err) + + expectedName := fmt.Sprintf("route.serving.knative.dev/%s", routeName) + assert.Check(t, strings.Contains(out, expectedName)) +} + +func (test *e2eTest) routeListWithPrintFlags(t *testing.T, names ...string) { + out, err := test.kn.RunWithOpts([]string{"route", "list", "-o=jsonpath={.items[*].metadata.name}"}, runOpts{}) + assert.NilError(t, err) + + assert.Check(t, util.ContainsAll(out, names...)) +} diff --git a/test/e2e/revision_workflow_test.go b/test/e2e/revision_workflow_test.go index f07ad2838a..641cb83a2b 100644 --- a/test/e2e/revision_workflow_test.go +++ b/test/e2e/revision_workflow_test.go @@ -17,6 +17,7 @@ package e2e import ( + "fmt" "strings" "testing" @@ -33,8 +34,13 @@ func TestRevisionWorkflow(t *testing.T) { test.serviceCreate(t, "hello") }) + t.Run("describe revision from hello service", func(t *testing.T) { + test.revisionDescribe(t, "hello") + test.revisionDescribeWithPrintFlags(t, "hello") + }) + t.Run("delete latest revision from hello service and returns no error", func(t *testing.T) { - test.deleteRevision(t, "hello") + test.revisionDelete(t, "hello") }) t.Run("delete hello service and returns no error", func(t *testing.T) { @@ -42,17 +48,43 @@ func TestRevisionWorkflow(t *testing.T) { }) } -// Private +func (test *e2eTest) revisionDelete(t *testing.T, serviceName string) { + revName := test.findRevision(t, serviceName) + + out, err := test.kn.RunWithOpts([]string{"revision", "delete", revName}, runOpts{}) + assert.NilError(t, err) + + assert.Check(t, util.ContainsAll(out, "Revision", revName, "deleted", "namespace", test.kn.namespace)) +} + +func (test *e2eTest) revisionDescribe(t *testing.T, serviceName string) { + revName := test.findRevision(t, serviceName) -func (test *e2eTest) deleteRevision(t *testing.T, serviceName string) { + out, err := test.kn.RunWithOpts([]string{"revision", "describe", revName}, runOpts{}) + assert.NilError(t, err) + + expectedGVK := `apiVersion: serving.knative.dev/v1alpha1 +kind: Revision` + expectedNamespace := fmt.Sprintf("namespace: %s", test.kn.namespace) + expectedServiceLabel := fmt.Sprintf("serving.knative.dev/service: %s", serviceName) + assert.Check(t, util.ContainsAll(out, expectedGVK, expectedNamespace, expectedServiceLabel)) +} + +func (test *e2eTest) revisionDescribeWithPrintFlags(t *testing.T, serviceName string) { + revName := test.findRevision(t, serviceName) + + out, err := test.kn.RunWithOpts([]string{"revision", "describe", revName, "-o=name"}, runOpts{}) + assert.NilError(t, err) + + expectedName := fmt.Sprintf("revision.serving.knative.dev/%s", revName) + assert.Check(t, strings.Contains(out, expectedName)) +} + +func (test *e2eTest) findRevision(t *testing.T, serviceName string) string { revName, err := test.kn.RunWithOpts([]string{"revision", "list", "-o=jsonpath={.items[0].metadata.name}"}, runOpts{}) assert.NilError(t, err) if strings.Contains(revName, "No resources found.") { t.Errorf("Could not find revision name.") } - - out, err := test.kn.RunWithOpts([]string{"revision", "delete", revName}, runOpts{}) - assert.NilError(t, err) - - assert.Check(t, util.ContainsAll(out, "Revision", revName, "deleted", "namespace", test.kn.namespace)) + return revName } From ed8fd40022bec2dcd07dab954f6dceebe57dea79 Mon Sep 17 00:00:00 2001 From: Martin Gencur Date: Thu, 25 Jul 2019 10:03:35 +0200 Subject: [PATCH 2/2] Test serviceDeleteNonexistent and fixes --- test/e2e/basic_workflow_test.go | 24 ++++++++++++++++++------ test/e2e/revision_workflow_test.go | 2 +- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/test/e2e/basic_workflow_test.go b/test/e2e/basic_workflow_test.go index 2967cb7e20..446217179d 100644 --- a/test/e2e/basic_workflow_test.go +++ b/test/e2e/basic_workflow_test.go @@ -77,6 +77,10 @@ func TestBasicWorkflow(t *testing.T) { test.serviceDelete(t, "svc2") }) + t.Run("delete hello service again and get an error", func(t *testing.T) { + test.serviceDeleteNonexistent(t, "hello") + }) + t.Run("returns no service after completing tests", func(t *testing.T) { test.serviceListEmpty(t) }) @@ -92,8 +96,7 @@ func (test *e2eTest) serviceListEmpty(t *testing.T) { } func (test *e2eTest) serviceCreate(t *testing.T, serviceName string) { - out, err := test.kn.RunWithOpts([]string{"service", "create", - fmt.Sprintf("%s", serviceName), + out, err := test.kn.RunWithOpts([]string{"service", "create", serviceName, "--image", KnDefaultTestImage}, runOpts{NoNamespace: false}) assert.NilError(t, err) @@ -111,8 +114,7 @@ func (test *e2eTest) serviceCreateDuplicate(t *testing.T, serviceName string) { out, err := test.kn.RunWithOpts([]string{"service", "list", serviceName}, runOpts{NoNamespace: false}) assert.Check(t, strings.Contains(out, serviceName), "The service does not exist yet") - _, err = test.kn.RunWithOpts([]string{"service", "create", - fmt.Sprintf("%s", serviceName), + _, err = test.kn.RunWithOpts([]string{"service", "create", serviceName, "--image", KnDefaultTestImage}, runOpts{NoNamespace: false, AllowError: true}) assert.ErrorContains(t, err, "the service already exists") @@ -158,7 +160,7 @@ func (test *e2eTest) serviceDescribeWithPrintFlags(t *testing.T, serviceName str assert.NilError(t, err) expectedName := fmt.Sprintf("service.serving.knative.dev/%s", serviceName) - assert.Check(t, strings.Contains(out, expectedName)) + assert.Equal(t, strings.TrimSpace(out), expectedName) } func (test *e2eTest) routeList(t *testing.T) { @@ -184,6 +186,16 @@ func (test *e2eTest) serviceDelete(t *testing.T, serviceName string) { assert.Check(t, util.ContainsAll(out, "Service", serviceName, "successfully deleted in namespace", test.kn.namespace)) } +func (test *e2eTest) serviceDeleteNonexistent(t *testing.T, serviceName string) { + out, err := test.kn.RunWithOpts([]string{"service", "list", serviceName}, runOpts{NoNamespace: false}) + assert.Check(t, !strings.Contains(out, serviceName), "The service exists") + + _, err = test.kn.RunWithOpts([]string{"service", "delete", serviceName}, runOpts{NoNamespace: false, AllowError: true}) + + expectedErr := fmt.Sprintf(`services.serving.knative.dev "%s" not found`, serviceName) + assert.ErrorContains(t, err, expectedErr) +} + func (test *e2eTest) routeDescribe(t *testing.T, routeName string) { out, err := test.kn.RunWithOpts([]string{"route", "describe", routeName}, runOpts{}) assert.NilError(t, err) @@ -200,7 +212,7 @@ func (test *e2eTest) routeDescribeWithPrintFlags(t *testing.T, routeName string) assert.NilError(t, err) expectedName := fmt.Sprintf("route.serving.knative.dev/%s", routeName) - assert.Check(t, strings.Contains(out, expectedName)) + assert.Equal(t, strings.TrimSpace(out), expectedName) } func (test *e2eTest) routeListWithPrintFlags(t *testing.T, names ...string) { diff --git a/test/e2e/revision_workflow_test.go b/test/e2e/revision_workflow_test.go index 641cb83a2b..add5c5f319 100644 --- a/test/e2e/revision_workflow_test.go +++ b/test/e2e/revision_workflow_test.go @@ -77,7 +77,7 @@ func (test *e2eTest) revisionDescribeWithPrintFlags(t *testing.T, serviceName st assert.NilError(t, err) expectedName := fmt.Sprintf("revision.serving.knative.dev/%s", revName) - assert.Check(t, strings.Contains(out, expectedName)) + assert.Equal(t, strings.TrimSpace(out), expectedName) } func (test *e2eTest) findRevision(t *testing.T, serviceName string) string {