You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by kv...@apache.org on 2021/04/03 00:12:56 UTC
[apisix-ingress-controller] branch master updated: test: add e2e
test cases for cors plugin (#334)
This is an automated email from the ASF dual-hosted git repository.
kvn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git
The following commit(s) were added to refs/heads/master by this push:
new 456efa6 test: add e2e test cases for cors plugin (#334)
456efa6 is described below
commit 456efa6836e3195cc0fcb6603fb9243c1033860a
Author: Alex Zhang <to...@apache.org>
AuthorDate: Sat Apr 3 08:12:47 2021 +0800
test: add e2e test cases for cors plugin (#334)
---
test/e2e/plugins/cors.go | 254 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 254 insertions(+)
diff --git a/test/e2e/plugins/cors.go b/test/e2e/plugins/cors.go
new file mode 100644
index 0000000..aa5ada8
--- /dev/null
+++ b/test/e2e/plugins/cors.go
@@ -0,0 +1,254 @@
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package plugins
+
+import (
+ "fmt"
+ "net/http"
+
+ "github.com/apache/apisix-ingress-controller/test/e2e/scaffold"
+ "github.com/onsi/ginkgo"
+ "github.com/stretchr/testify/assert"
+)
+
+var _ = ginkgo.Describe("fault-injection plugin", func() {
+ opts := &scaffold.Options{
+ Name: "default",
+ Kubeconfig: scaffold.GetKubeconfig(),
+ APISIXConfigPath: "testdata/apisix-gw-config.yaml",
+ APISIXDefaultConfigPath: "testdata/apisix-gw-config-default.yaml",
+ IngressAPISIXReplicas: 1,
+ HTTPBinServicePort: 80,
+ APISIXRouteVersion: "apisix.apache.org/v2alpha1",
+ }
+ s := scaffold.NewScaffold(opts)
+ ginkgo.It("empty config", func() {
+ backendSvc, backendPorts := s.DefaultHTTPBackend()
+ ar := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v2alpha1
+kind: ApisixRoute
+metadata:
+ name: httpbin-route
+spec:
+ http:
+ - name: rule1
+ match:
+ hosts:
+ - httpbin.org
+ paths:
+ - /ip
+ backends:
+ - serviceName: %s
+ servicePort: %d
+ weight: 10
+ plugins:
+ - name: cors
+ enable: true
+`, backendSvc, backendPorts[0])
+
+ assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(ar))
+ err := s.EnsureNumApisixUpstreamsCreated(1)
+ assert.Nil(ginkgo.GinkgoT(), err, "Checking number of upstreams")
+ err = s.EnsureNumApisixRoutesCreated(1)
+ assert.Nil(ginkgo.GinkgoT(), err, "Checking number of routes")
+
+ resp := s.NewAPISIXClient().GET("/ip").WithHeader("Host", "httpbin.org").Expect()
+ resp.Status(http.StatusOK)
+ resp.Header("Access-Control-Allow-Origin").Equal("*")
+ resp.Header("Access-Control-Allow-Methods").Equal("*")
+ resp.Header("Access-Control-Allow-Headers").Equal("*")
+ resp.Header("Access-Control-Expose-Headers").Equal("*")
+ resp.Header("Access-Control-Max-Age").Equal("5")
+ resp.Body().Contains("origin")
+ })
+ ginkgo.It("finer granularity config", func() {
+ backendSvc, backendPorts := s.DefaultHTTPBackend()
+ ar := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v2alpha1
+kind: ApisixRoute
+metadata:
+ name: httpbin-route
+spec:
+ http:
+ - name: rule1
+ match:
+ hosts:
+ - httpbin.org
+ paths:
+ - /ip
+ backends:
+ - serviceName: %s
+ servicePort: %d
+ weight: 10
+ plugins:
+ - name: cors
+ enable: true
+ config:
+ allow_origins: http://foo.bar.org
+ allow_methods: "GET,POST"
+ max_age: 3600
+ expose_headers: x-foo,x-baz
+ allow_headers: x-from-ingress
+ allow_credential: true
+`, backendSvc, backendPorts[0])
+
+ assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(ar))
+ err := s.EnsureNumApisixUpstreamsCreated(1)
+ assert.Nil(ginkgo.GinkgoT(), err, "Checking number of upstreams")
+ err = s.EnsureNumApisixRoutesCreated(1)
+ assert.Nil(ginkgo.GinkgoT(), err, "Checking number of routes")
+
+ resp := s.NewAPISIXClient().GET("/ip").
+ WithHeader("Host", "httpbin.org").
+ WithHeader("Origin", "http://foo.bar.org").
+ Expect()
+ resp.Status(http.StatusOK)
+ resp.Header("Access-Control-Allow-Origin").Equal("http://foo.bar.org")
+ resp.Header("Access-Control-Allow-Methods").Equal("GET,POST")
+ resp.Header("Access-Control-Allow-Headers").Equal("x-from-ingress")
+ resp.Header("Access-Control-Expose-Headers").Equal("x-foo,x-baz")
+ resp.Header("Access-Control-Max-Age").Equal("3600")
+ resp.Header("Access-Control-Allow-Credentials").Equal("true")
+ resp.Body().Contains("origin")
+
+ resp = s.NewAPISIXClient().GET("/ip").
+ WithHeader("Host", "httpbin.org").
+ WithHeader("Origin", "http://foo.bar2.org").
+ Expect()
+ resp.Header("Access-Control-Allow-Methods").Empty()
+ resp.Header("Access-Control-Allow-Headers").Empty()
+ resp.Header("Access-Control-Expose-Headers").Empty()
+ resp.Header("Access-Control-Max-Age").Empty()
+ // httpbin set it by itself.
+ //resp.Header("Access-Control-Allow-Credentials").Empty()
+ resp.Body().Contains("origin")
+ })
+ ginkgo.It("allow_origins_by_regex", func() {
+ ginkgo.Skip("APISIX version priors to 2.5 doesn't contain allow_origins_by_regex in cors plugin")
+ backendSvc, backendPorts := s.DefaultHTTPBackend()
+ ar := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v2alpha1
+kind: ApisixRoute
+metadata:
+ name: httpbin-route
+spec:
+ http:
+ - name: rule1
+ match:
+ hosts:
+ - httpbin.org
+ paths:
+ - /ip
+ backends:
+ - serviceName: %s
+ servicePort: %d
+ weight: 10
+ plugins:
+ - name: cors
+ enable: true
+ config:
+ allow_origins_by_regex:
+ - foo\\.(bar|baz)\\.org
+ allow_methods: "GET,POST"
+ max_age: 3600
+ expose_headers: x-foo,x-baz
+ allow_headers: x-from-ingress
+`, backendSvc, backendPorts[0])
+
+ assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(ar))
+ err := s.EnsureNumApisixUpstreamsCreated(1)
+ assert.Nil(ginkgo.GinkgoT(), err, "Checking number of upstreams")
+ err = s.EnsureNumApisixRoutesCreated(1)
+ assert.Nil(ginkgo.GinkgoT(), err, "Checking number of routes")
+
+ resp := s.NewAPISIXClient().GET("/ip").
+ WithHeader("Host", "httpbin.org").
+ WithHeader("Origin", "http://foo.bar.org").
+ Expect()
+ resp.Status(http.StatusOK)
+ resp.Header("Access-Control-Allow-Origin").Equal("http://foo.bar.org")
+ resp.Header("Access-Control-Allow-Methods").Equal("GET,POST")
+ resp.Header("Access-Control-Allow-Headers").Equal("x-from-ingress")
+ resp.Header("Access-Control-Expose-Headers").Equal("x-foo,x-baz")
+ resp.Header("Access-Control-Max-Age").Equal("3600")
+ resp.Header("Access-Control-Allow-Credentials").Equal("true")
+ resp.Body().Contains("origin")
+
+ resp = s.NewAPISIXClient().GET("/ip").
+ WithHeader("Host", "httpbin.org").
+ WithHeader("Origin", "http://foo.baz.org").
+ Expect()
+ resp.Status(http.StatusOK)
+ resp.Header("Access-Control-Allow-Origin").Equal("http://foo.baz.org")
+ resp.Header("Access-Control-Allow-Methods").Equal("GET,POST")
+ resp.Header("Access-Control-Allow-Headers").Equal("x-from-ingress")
+ resp.Header("Access-Control-Expose-Headers").Equal("x-foo,x-baz")
+ resp.Header("Access-Control-Max-Age").Equal("3600")
+ resp.Header("Access-Control-Allow-Credentials").Equal("true")
+ resp.Body().Contains("origin")
+
+ resp = s.NewAPISIXClient().GET("/ip").
+ WithHeader("Host", "httpbin.org").
+ WithHeader("Origin", "http://foo.bar2.org").
+ Expect()
+ resp.Header("Access-Control-Allow-Methods").Empty()
+ resp.Header("Access-Control-Allow-Headers").Empty()
+ resp.Header("Access-Control-Expose-Headers").Empty()
+ resp.Header("Access-Control-Max-Age").Empty()
+ // httpbin set it by itself.
+ //resp.Header("Access-Control-Allow-Credentials").Empty()
+ resp.Body().Contains("origin")
+ })
+ ginkgo.It("disable plugin", func() {
+ backendSvc, backendPorts := s.DefaultHTTPBackend()
+ ar := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v2alpha1
+kind: ApisixRoute
+metadata:
+ name: httpbin-route
+spec:
+ http:
+ - name: rule1
+ match:
+ hosts:
+ - httpbin.org
+ paths:
+ - /ip
+ backends:
+ - serviceName: %s
+ servicePort: %d
+ weight: 10
+ plugins:
+ - name: cors
+ enable: false
+`, backendSvc, backendPorts[0])
+
+ assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(ar))
+ err := s.EnsureNumApisixUpstreamsCreated(1)
+ assert.Nil(ginkgo.GinkgoT(), err, "Checking number of upstreams")
+ err = s.EnsureNumApisixRoutesCreated(1)
+ assert.Nil(ginkgo.GinkgoT(), err, "Checking number of routes")
+
+ resp := s.NewAPISIXClient().GET("/ip").WithHeader("Host", "httpbin.org").Expect()
+ resp.Status(http.StatusOK)
+ // httpbin sets this header by itself.
+ //resp.Header("Access-Control-Allow-Origin").Empty()
+ resp.Header("Access-Control-Allow-Methods").Empty()
+ resp.Header("Access-Control-Allow-Headers").Empty()
+ resp.Header("Access-Control-Expose-Headers").Empty()
+ resp.Header("Access-Control-Max-Age").Empty()
+ resp.Body().Contains("origin")
+ })
+})