From 9a626f262317b90946219d7f85069221cce2c4b6 Mon Sep 17 00:00:00 2001 From: Lior Okman Date: Wed, 1 May 2024 19:40:09 +0300 Subject: [PATCH] e2e: Add an e2e test for useClientProtocol (#3314) * Added an e2e test for useClientProtocol Signed-off-by: Lior Okman * make linter happy Signed-off-by: Lior Okman --------- Signed-off-by: Lior Okman --- test/e2e/base/manifests.yaml | 5 + test/e2e/testdata/use-client-protocol.yaml | 36 ++++++ test/e2e/tests/use_client_protocol.go | 129 +++++++++++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 test/e2e/testdata/use-client-protocol.yaml create mode 100644 test/e2e/tests/use_client_protocol.go diff --git a/test/e2e/base/manifests.yaml b/test/e2e/base/manifests.yaml index 1f456581e47..92a1c6e0a9d 100644 --- a/test/e2e/base/manifests.yaml +++ b/test/e2e/base/manifests.yaml @@ -94,7 +94,12 @@ spec: ports: - protocol: TCP port: 8080 + name: http11 targetPort: 3000 + - protocol: TCP + port: 8081 + name: http2 + targetPort: 3001 --- apiVersion: apps/v1 kind: Deployment diff --git a/test/e2e/testdata/use-client-protocol.yaml b/test/e2e/testdata/use-client-protocol.yaml new file mode 100644 index 00000000000..c624da1bc17 --- /dev/null +++ b/test/e2e/testdata/use-client-protocol.yaml @@ -0,0 +1,36 @@ +apiVersion: gateway.envoyproxy.io/v1alpha1 +kind: BackendTrafficPolicy +metadata: + name: use-client-protocol-btp + namespace: gateway-conformance-infra +spec: + targetRef: + group: gateway.networking.k8s.io + kind: HTTPRoute + name: use-client-protocol + namespace: gateway-conformance-infra + useClientProtocol: true +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: use-client-protocol + namespace: gateway-conformance-infra +spec: + parentRefs: + - name: same-namespace + rules: + - matches: + - path: + type: PathPrefix + value: /http11 + backendRefs: + - name: infra-backend-v1 + port: 8080 + - matches: + - path: + type: PathPrefix + value: /http2 + backendRefs: + - name: infra-backend-v1 + port: 8081 diff --git a/test/e2e/tests/use_client_protocol.go b/test/e2e/tests/use_client_protocol.go new file mode 100644 index 00000000000..1ea6029bf4f --- /dev/null +++ b/test/e2e/tests/use_client_protocol.go @@ -0,0 +1,129 @@ +// Copyright Envoy Gateway Authors +// SPDX-License-Identifier: Apache-2.0 +// The full text of the Apache license is available in the LICENSE file at +// the root of the repo. + +//go:build e2e +// +build e2e + +package tests + +import ( + "testing" + + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/gateway-api/conformance/utils/http" + "sigs.k8s.io/gateway-api/conformance/utils/kubernetes" + "sigs.k8s.io/gateway-api/conformance/utils/roundtripper" + "sigs.k8s.io/gateway-api/conformance/utils/suite" +) + +func init() { + ConformanceTests = append(ConformanceTests, UseClientProtocolTest) +} + +var UseClientProtocolTest = suite.ConformanceTest{ + ShortName: "UseClientProtocol", + Description: "Test that the UseClientProtocol knob does what it's supposed to", + Manifests: []string{"testdata/use-client-protocol.yaml"}, + Test: func(t *testing.T, suite *suite.ConformanceTestSuite) { + t.Run("use client protocol", func(t *testing.T) { + ns := "gateway-conformance-infra" + routeNN := types.NamespacedName{Name: "use-client-protocol", Namespace: ns} + gwNN := types.NamespacedName{Name: "same-namespace", Namespace: ns} + gwAddr := kubernetes.GatewayAndHTTPRoutesMustBeAccepted(t, suite.Client, suite.TimeoutConfig, suite.ControllerName, kubernetes.NewGatewayRef(gwNN), routeNN) + + // Send an http/1.1 request to the /http11 path + expectedResponse := http.ExpectedResponse{ + Request: http.Request{ + Path: "/http11/headers", + }, + Response: http.Response{ + StatusCode: 200, + }, + Namespace: ns, + } + + req := http.MakeRequest(t, &expectedResponse, gwAddr, "HTTP", "http") + cReq, cResp, err := suite.RoundTripper.CaptureRoundTrip(req) + if err != nil { + t.Errorf("failed to get expected response: %v", err) + } + + if err := http.CompareRequest(t, &req, cReq, cResp, expectedResponse); err != nil { + t.Errorf("failed to compare request and response: %v", err) + } + if cReq.Protocol != "HTTP/1.1" { + t.Errorf("expected http/1.1 protocol, got %s", cReq.Protocol) + } + + // Send an http/1.1 request to the http/2 path + expectedResponse = http.ExpectedResponse{ + Request: http.Request{ + Path: "/http2/headers", + }, + Response: http.Response{ + StatusCode: 400, + }, + Namespace: ns, + } + + req = http.MakeRequest(t, &expectedResponse, gwAddr, "HTTP", "http") + cReq, cResp, err = suite.RoundTripper.CaptureRoundTrip(req) + if err != nil { + t.Errorf("failed to get expected response: %v", err) + } + + if err := http.CompareRequest(t, &req, cReq, cResp, expectedResponse); err != nil { + t.Errorf("failed to compare request and response: %v", err) + } + + // Send an http/2 request to the /http2 path + expectedResponse = http.ExpectedResponse{ + Request: http.Request{ + Path: "/http2/headers", + Protocol: roundtripper.H2CPriorKnowledgeProtocol, + }, + Response: http.Response{ + StatusCode: 200, + }, + Namespace: ns, + } + + req = http.MakeRequest(t, &expectedResponse, gwAddr, "HTTP", "http") + cReq, cResp, err = suite.RoundTripper.CaptureRoundTrip(req) + if err != nil { + t.Errorf("failed to get expected response: %v", err) + } + + if err := http.CompareRequest(t, &req, cReq, cResp, expectedResponse); err != nil { + t.Errorf("failed to compare request and response: %v", err) + } + if cReq.Protocol != "HTTP/2.0" { + t.Errorf("expected http/2.0 protocol, got %s", cReq.Protocol) + } + + // Send an http/2 request to the http/1.1 path + expectedResponse = http.ExpectedResponse{ + Request: http.Request{ + Path: "/http11/headers", + Protocol: roundtripper.H2CPriorKnowledgeProtocol, + }, + Response: http.Response{ + StatusCode: 502, + }, + Namespace: ns, + } + + req = http.MakeRequest(t, &expectedResponse, gwAddr, "HTTP", "http") + cReq, cResp, err = suite.RoundTripper.CaptureRoundTrip(req) + if err != nil { + t.Errorf("failed to get expected response: %v", err) + } + + if err := http.CompareRequest(t, &req, cReq, cResp, expectedResponse); err != nil { + t.Errorf("failed to compare request and response: %v", err) + } + }) + }, +}