Merge "Add HTTP/2 tempest scenario tests for listeners"
diff --git a/octavia_tempest_plugin/tests/barbican_scenario/v2/test_tls_barbican.py b/octavia_tempest_plugin/tests/barbican_scenario/v2/test_tls_barbican.py
index 9e32b80..10c264b 100644
--- a/octavia_tempest_plugin/tests/barbican_scenario/v2/test_tls_barbican.py
+++ b/octavia_tempest_plugin/tests/barbican_scenario/v2/test_tls_barbican.py
@@ -19,6 +19,7 @@
 import tempfile
 
 from cryptography.hazmat.primitives import serialization
+import httpx
 from OpenSSL.crypto import X509
 from OpenSSL import SSL
 
@@ -1164,3 +1165,49 @@
         selected_proto = ssl_sock.selected_alpn_protocol()
 
         self.assertEqual(expected_proto, selected_proto)
+
+    def _test_http_versions_tls_traffic(self, http_version, alpn_protos):
+        if not self.mem_listener_client.is_version_supported(
+                self.api_version, '2.20'):
+            raise self.skipException('ALPN protocols are only available on '
+                                     'Octavia API version 2.20 or newer.')
+        listener_name = data_utils.rand_name("lb_member_listener1-tls-alpn")
+        listener_kwargs = {
+            const.NAME: listener_name,
+            const.PROTOCOL: const.TERMINATED_HTTPS,
+            const.PROTOCOL_PORT: '443',
+            const.LOADBALANCER_ID: self.lb_id,
+            const.DEFAULT_POOL_ID: self.pool_id,
+            const.DEFAULT_TLS_CONTAINER_REF: self.server_secret_ref,
+            const.ALPN_PROTOCOLS: alpn_protos,
+        }
+        listener = self.mem_listener_client.create_listener(**listener_kwargs)
+        self.listener_id = listener[const.ID]
+        self.addCleanup(
+            self.mem_listener_client.cleanup_listener,
+            self.listener_id,
+            lb_client=self.mem_lb_client, lb_id=self.lb_id)
+
+        waiters.wait_for_status(self.mem_lb_client.show_loadbalancer,
+                                self.lb_id, const.PROVISIONING_STATUS,
+                                const.ACTIVE,
+                                CONF.load_balancer.build_interval,
+                                CONF.load_balancer.build_timeout)
+
+        context = ssl.create_default_context(cadata=self.ca_cert.public_bytes(
+            serialization.Encoding.PEM).decode('utf-8'))
+        context.check_hostname = False
+
+        url = 'https://%s:%s' % (self.lb_vip_address, 443)
+        client = httpx.Client(http2=(http_version == 'HTTP/2'), verify=context)
+        r = client.get(url)
+        self.assertEqual(http_version, r.http_version)
+
+    @decorators.idempotent_id('9965828d-24af-4fa0-91ae-21c6bc47ab4c')
+    def test_http_2_tls_traffic(self):
+        self._test_http_versions_tls_traffic('HTTP/2', ['h2', 'http/1.1'])
+
+    @decorators.idempotent_id('a0dff0f2-d53e-497c-9ded-dca64e82991f')
+    def test_http_1_1_tls_traffic(self):
+        self._test_http_versions_tls_traffic(
+            'HTTP/1.1', ['http/1.1', 'http/1.0'])
diff --git a/requirements.txt b/requirements.txt
index 8376df6..7b2f0a2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -17,3 +17,4 @@
 tenacity>=4.4.0 # Apache-2.0
 testtools>=2.2.0 # MIT
 keystoneauth1>=3.3.0 # Apache-2.0
+httpx[http2]>=0.14.2 # BSD