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

starsz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git


The following commit(s) were added to refs/heads/master by this push:
     new 79ff37b  chore: improve ssl e2e test coverage (#1571)
79ff37b is described below

commit 79ff37bb266f608a04f52905fc8b9c51719bb21a
Author: Peter Zhu <[email protected]>
AuthorDate: Thu Mar 11 16:22:10 2021 +0800

    chore: improve ssl e2e test coverage (#1571)
---
 api/test/e2enew/base/base.go          |  11 +-
 api/test/e2enew/ssl/ssl_suite_test.go |   3 +-
 api/test/e2enew/ssl/ssl_test.go       | 254 +++++++++++++++++++++-------------
 3 files changed, 167 insertions(+), 101 deletions(-)

diff --git a/api/test/e2enew/base/base.go b/api/test/e2enew/base/base.go
index 15fd185..6fa319c 100644
--- a/api/test/e2enew/base/base.go
+++ b/api/test/e2enew/base/base.go
@@ -269,12 +269,11 @@ func CleanResource(resource string) {
        for _, item := range list {
                resourceObj := item.(map[string]interface{})
                tc := HttpTestCase{
-                       Desc:         "delete " + resource + "/" + 
resourceObj["id"].(string),
-                       Object:       ManagerApiExpect(),
-                       Method:       http.MethodDelete,
-                       Path:         "/apisix/admin/" + resource + "/" + 
resourceObj["id"].(string),
-                       Headers:      map[string]string{"Authorization": 
GetToken()},
-                       ExpectStatus: http.StatusOK,
+                       Desc:    "delete " + resource + "/" + 
resourceObj["id"].(string),
+                       Object:  ManagerApiExpect(),
+                       Method:  http.MethodDelete,
+                       Path:    "/apisix/admin/" + resource + "/" + 
resourceObj["id"].(string),
+                       Headers: map[string]string{"Authorization": GetToken()},
                }
                RunTestCase(tc)
        }
diff --git a/api/test/e2enew/ssl/ssl_suite_test.go 
b/api/test/e2enew/ssl/ssl_suite_test.go
index 5969613..a5b7c05 100644
--- a/api/test/e2enew/ssl/ssl_suite_test.go
+++ b/api/test/e2enew/ssl/ssl_suite_test.go
@@ -25,12 +25,11 @@ import (
        "e2enew/base"
 )
 
-func TestRoute(t *testing.T) {
+func TestSSL(t *testing.T) {
        ginkgo.RunSpecs(t, "ssl suite")
 }
 
 var _ = ginkgo.AfterSuite(func() {
        base.CleanResource("ssl")
-       base.CleanResource("routes")
        time.Sleep(base.SleepTime)
 })
diff --git a/api/test/e2enew/ssl/ssl_test.go b/api/test/e2enew/ssl/ssl_test.go
index d93371d..76c3157 100644
--- a/api/test/e2enew/ssl/ssl_test.go
+++ b/api/test/e2enew/ssl/ssl_test.go
@@ -26,38 +26,80 @@ import (
        "time"
 
        "github.com/onsi/ginkgo"
+       "github.com/onsi/ginkgo/extensions/table"
        "github.com/stretchr/testify/assert"
 
        "e2enew/base"
 )
 
 var _ = ginkgo.Describe("SSL Basic", func() {
-       ginkgo.It("test ssl basic", func() {
-               // build test body
-               t := ginkgo.GinkgoT()
-               testCert, err := ioutil.ReadFile("../../certs/test2.crt")
-               assert.Nil(t, err)
-               testKey, err := ioutil.ReadFile("../../certs/test2.key")
-               assert.Nil(t, err)
-               apisixKey, err := ioutil.ReadFile("../../certs/apisix.key")
-               assert.Nil(t, err)
-               body, err := json.Marshal(map[string]interface{}{
-                       "id":   "1",
-                       "cert": string(testCert),
-                       "key":  string(testKey),
-                       "labels": map[string]string{
-                               "build":   "16",
-                               "env":     "production",
-                               "version": "v3",
+       t := ginkgo.GinkgoT()
+       var (
+               testCert        []byte
+               testKey         []byte
+               apisixKey       []byte
+               validBody       []byte
+               validBody2      []byte
+               invalidBody     []byte
+               createRouteBody []byte
+       )
+
+       var err error
+       testCert, err = ioutil.ReadFile("../../certs/test2.crt")
+       assert.Nil(t, err)
+       testKey, err = ioutil.ReadFile("../../certs/test2.key")
+       assert.Nil(t, err)
+       apisixKey, err = ioutil.ReadFile("../../certs/apisix.key")
+       assert.Nil(t, err)
+
+       validBody, err = json.Marshal(map[string]interface{}{
+               "id":   "1",
+               "cert": string(testCert),
+               "key":  string(testKey),
+               "labels": map[string]string{
+                       "build":   "16",
+                       "env":     "production",
+                       "version": "v3",
+               },
+       })
+       assert.Nil(t, err)
+       validBody2, err = json.Marshal(map[string]interface{}{
+               "id":   "1",
+               "cert": string(testCert),
+               "key":  string(testKey),
+               "labels": map[string]string{
+                       "build":   "16",
+                       "env":     "production",
+                       "version": "v2",
+               },
+       })
+       assert.Nil(t, err)
+
+       invalidBody, err = json.Marshal(map[string]string{
+               "id":   "1",
+               "cert": string(testCert),
+               "key":  string(apisixKey),
+       })
+       assert.Nil(t, err)
+
+       tempBody := map[string]interface{}{
+               "uri":   "/hello_",
+               "hosts": []string{"test2.com", "*.test2.com"},
+               "upstream": map[string]interface{}{
+                       "nodes": []map[string]interface{}{
+                               {
+                                       "host":   base.UpstreamIp,
+                                       "port":   1980,
+                                       "weight": 1,
+                               },
                        },
-               })
-               assert.Nil(t, err)
-               invalidBody, err := json.Marshal(map[string]string{
-                       "id":   "1",
-                       "cert": string(testCert),
-                       "key":  string(apisixKey),
-               })
-               assert.Nil(t, err)
+                       "type": "roundrobin",
+               },
+       }
+       createRouteBody, err = json.Marshal(tempBody)
+       assert.Nil(t, err)
+
+       ginkgo.It("without certificate", func() {
                // Before configuring SSL, make a HTTPS request
                http.DefaultTransport.(*http.Transport).TLSClientConfig = 
&tls.Config{InsecureSkipVerify: true}
                http.DefaultTransport.(*http.Transport).DialContext = func(ctx 
context.Context, network, addr string) (net.Conn, error) {
@@ -67,78 +109,112 @@ var _ = ginkgo.Describe("SSL Basic", func() {
                        dialer := &net.Dialer{}
                        return dialer.DialContext(ctx, network, addr)
                }
-               _, err = http.Get("https://www.test2.com:9443";)
+
+               _, err := http.Get("https://www.test2.com:9443";)
                assert.NotNil(t, err)
                assert.EqualError(t, err, "Get https://www.test2.com:9443: 
remote error: tls: internal error")
-               //create ssl fail - key and cert not match
-               base.RunTestCase(base.HttpTestCase{
+       })
+
+       table.DescribeTable("test ssl basic", func(testCase base.HttpTestCase) {
+               base.RunTestCase(testCase)
+       },
+               table.Entry("create ssl failed", base.HttpTestCase{
                        Object:       base.ManagerApiExpect(),
                        Method:       http.MethodPost,
                        Path:         "/apisix/admin/ssl",
                        Body:         string(invalidBody),
                        Headers:      map[string]string{"Authorization": 
base.GetToken()},
                        ExpectStatus: http.StatusBadRequest,
-               })
-               //create ssl successfully
-               base.RunTestCase(base.HttpTestCase{
+                       ExpectBody:   "SSL parse failed: key and cert don't 
match",
+                       Sleep:        base.SleepTime,
+               }),
+               table.Entry("create ssl successfully", base.HttpTestCase{
                        Object:       base.ManagerApiExpect(),
                        Method:       http.MethodPost,
                        Path:         "/apisix/admin/ssl",
-                       Body:         string(body),
+                       Body:         string(validBody),
                        Headers:      map[string]string{"Authorization": 
base.GetToken()},
                        ExpectStatus: http.StatusOK,
                        Sleep:        base.SleepTime,
-               })
-       })
-       ginkgo.It("check ssl labels", func() {
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("validate ssl cert and key (valid)", 
base.HttpTestCase{
+                       Object:       base.ManagerApiExpect(),
+                       Method:       http.MethodPost,
+                       Path:         "/apisix/admin/check_ssl_cert",
+                       Body:         string(validBody),
+                       Headers:      map[string]string{"Authorization": 
base.GetToken()},
+                       ExpectBody:   "\"code\":0,\"message\":\"\"",
+                       ExpectStatus: http.StatusOK,
+               }),
+               table.Entry("validate ssl cert and key (valid)", 
base.HttpTestCase{
+                       Object:       base.ManagerApiExpect(),
+                       Method:       http.MethodPost,
+                       Path:         "/apisix/admin/check_ssl_cert",
+                       Body:         string(invalidBody),
+                       Headers:      map[string]string{"Authorization": 
base.GetToken()},
+                       ExpectBody:   "key and cert don't match",
+                       ExpectStatus: http.StatusOK,
+               }),
+               table.Entry("check ssl labels", base.HttpTestCase{
                        Object:       base.ManagerApiExpect(),
                        Method:       http.MethodGet,
                        Path:         "/apisix/admin/ssl/1",
                        Headers:      map[string]string{"Authorization": 
base.GetToken()},
                        ExpectStatus: http.StatusOK,
                        ExpectBody:   
"\"labels\":{\"build\":\"16\",\"env\":\"production\",\"version\":\"v3\"",
-               })
-       })
-       ginkgo.It("create route", func() {
-               t := ginkgo.GinkgoT()
-               var createRouteBody map[string]interface{} = 
map[string]interface{}{
-                       "uri":   "/hello_",
-                       "hosts": []string{"test2.com", "*.test2.com"},
-                       "upstream": map[string]interface{}{
-                               "nodes": []map[string]interface{}{
-                                       {
-                                               "host":   base.UpstreamIp,
-                                               "port":   1980,
-                                               "weight": 1,
-                                       },
-                               },
-                               "type": "roundrobin",
-                       },
-               }
-               _createRouteBody, err := json.Marshal(createRouteBody)
-               assert.Nil(t, err)
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("update ssl", base.HttpTestCase{
+                       Object:       base.ManagerApiExpect(),
+                       Method:       http.MethodPut,
+                       Path:         "/apisix/admin/ssl/1",
+                       Body:         string(validBody2),
+                       Headers:      map[string]string{"Authorization": 
base.GetToken()},
+                       ExpectStatus: http.StatusOK,
+                       Sleep:        base.SleepTime,
+               }),
+               table.Entry("check ssl labels", base.HttpTestCase{
+                       Object:       base.ManagerApiExpect(),
+                       Method:       http.MethodGet,
+                       Path:         "/apisix/admin/ssl/1",
+                       Headers:      map[string]string{"Authorization": 
base.GetToken()},
+                       ExpectStatus: http.StatusOK,
+                       ExpectBody:   
"\"labels\":{\"build\":\"16\",\"env\":\"production\",\"version\":\"v2\"",
+                       Sleep:        base.SleepTime,
+               }),
+               table.Entry("check host exist", base.HttpTestCase{
+                       Object:       base.ManagerApiExpect(),
+                       Method:       http.MethodPost,
+                       Path:         "/apisix/admin/check_ssl_exists",
+                       Body:         `{"hosts": ["www.test2.com"]}`,
+                       Headers:      map[string]string{"Authorization": 
base.GetToken()},
+                       ExpectStatus: http.StatusOK,
+               }),
+               table.Entry("check host not exist", base.HttpTestCase{
+                       Object:       base.ManagerApiExpect(),
+                       Method:       http.MethodPost,
+                       Path:         "/apisix/admin/check_ssl_exists",
+                       Body:         `{"hosts": ["www.test3.com"]}`,
+                       Headers:      map[string]string{"Authorization": 
base.GetToken()},
+                       ExpectStatus: http.StatusNotFound,
+                       ExpectBody:   "SSL cert not exists for 
sni:www.test3.com",
+               }),
+               table.Entry("create route", base.HttpTestCase{
                        Object:       base.ManagerApiExpect(),
                        Method:       http.MethodPut,
                        Path:         "/apisix/admin/routes/r1",
-                       Body:         string(_createRouteBody),
+                       Body:         string(createRouteBody),
                        Headers:      map[string]string{"Authorization": 
base.GetToken()},
                        ExpectStatus: http.StatusOK,
-               })
-       })
-       ginkgo.It("get the route just created to trigger removing `key`", 
func() {
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("get the route just created to trigger removing 
`key`", base.HttpTestCase{
                        Object:       base.ManagerApiExpect(),
                        Method:       http.MethodGet,
                        Path:         "/apisix/admin/routes/r1",
                        Headers:      map[string]string{"Authorization": 
base.GetToken()},
                        ExpectStatus: http.StatusOK,
                        Sleep:        base.SleepTime,
-               })
-       })
-       ginkgo.It("hit the route just created  using HTTPS", func() {
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("hit the route just created using HTTPS", 
base.HttpTestCase{
                        Object:       base.APISIXHTTPSExpect(),
                        Method:       http.MethodGet,
                        Path:         "/hello_",
@@ -146,10 +222,8 @@ var _ = ginkgo.Describe("SSL Basic", func() {
                        Headers:      map[string]string{"Host": 
"www.test2.com"},
                        ExpectBody:   "hello world\n",
                        Sleep:        base.SleepTime,
-               })
-       })
-       ginkgo.It("disable SSL", func() {
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("disable SSL", base.HttpTestCase{
                        Object: base.ManagerApiExpect(),
                        Method: http.MethodPatch,
                        Path:   "/apisix/admin/ssl/1",
@@ -159,18 +233,21 @@ var _ = ginkgo.Describe("SSL Basic", func() {
                        Headers:      map[string]string{"Authorization": 
base.GetToken()},
                        ExpectStatus: http.StatusOK,
                        ExpectBody:   "\"status\":0",
-               })
-       })
+               }),
+       )
+
        ginkgo.It("test disable SSL HTTPS request", func() {
                // try again after disable SSL, make a HTTPS request
-               t := ginkgo.GinkgoT()
                time.Sleep(time.Duration(500) * time.Millisecond)
                _, err := http.Get("https://www.test2.com:9443";)
                assert.NotNil(t, err)
                assert.EqualError(t, err, "Get https://www.test2.com:9443: 
remote error: tls: internal error")
        })
-       ginkgo.It("enable SSL", func() {
-               base.RunTestCase(base.HttpTestCase{
+
+       table.DescribeTable("test ssl basic", func(testCase base.HttpTestCase) {
+               base.RunTestCase(testCase)
+       },
+               table.Entry("enable SSL", base.HttpTestCase{
                        Object: base.ManagerApiExpect(),
                        Method: http.MethodPatch,
                        Path:   "/apisix/admin/ssl/1/status",
@@ -181,10 +258,8 @@ var _ = ginkgo.Describe("SSL Basic", func() {
                        },
                        ExpectStatus: http.StatusOK,
                        ExpectBody:   "\"status\":1",
-               })
-       })
-       ginkgo.It("hit the route using HTTPS, make sure enable successful", 
func() {
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("hit the route using HTTPS, make sure enable 
successful", base.HttpTestCase{
                        Object:       base.APISIXHTTPSExpect(),
                        Method:       http.MethodGet,
                        Path:         "/hello_",
@@ -192,34 +267,27 @@ var _ = ginkgo.Describe("SSL Basic", func() {
                        ExpectStatus: http.StatusOK,
                        ExpectBody:   "hello world\n",
                        Sleep:        base.SleepTime,
-               })
-       })
-       ginkgo.It("delete SSL", func() {
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("delete SSL", base.HttpTestCase{
                        Object:       base.ManagerApiExpect(),
                        Method:       http.MethodDelete,
                        Path:         "/apisix/admin/ssl/1",
                        Headers:      map[string]string{"Authorization": 
base.GetToken()},
                        ExpectStatus: http.StatusOK,
-               })
-       })
-       ginkgo.It("delete route", func() {
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("delete route", base.HttpTestCase{
                        Object:       base.ManagerApiExpect(),
                        Method:       http.MethodDelete,
                        Path:         "/apisix/admin/routes/r1",
                        Headers:      map[string]string{"Authorization": 
base.GetToken()},
                        ExpectStatus: http.StatusOK,
-               })
-       })
-       ginkgo.It("hit the route just deleted", func() {
-               base.RunTestCase(base.HttpTestCase{
+               }),
+               table.Entry("hit the route just deleted", base.HttpTestCase{
                        Object:       base.APISIXExpect(),
                        Method:       http.MethodGet,
                        Path:         "/hello_",
                        ExpectStatus: http.StatusNotFound,
                        ExpectBody:   "{\"error_msg\":\"404 Route Not 
Found\"}\n",
                        Sleep:        base.SleepTime,
-               })
-       })
+               }))
 })

Reply via email to