You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2015/09/17 02:13:10 UTC

trafficserver git commit: TS-3782: Add H2 exceptional test cases

Repository: trafficserver
Updated Branches:
  refs/heads/master ba5c56428 -> 46edbd72c


TS-3782: Add H2 exceptional test cases

This closes #277


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/46edbd72
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/46edbd72
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/46edbd72

Branch: refs/heads/master
Commit: 46edbd72c9b4ec000613e200fcf94ce419b9fb8d
Parents: ba5c564
Author: Bryan Call <bc...@apache.org>
Authored: Wed Sep 16 17:12:37 2015 -0700
Committer: Bryan Call <bc...@apache.org>
Committed: Wed Sep 16 17:12:37 2015 -0700

----------------------------------------------------------------------
 ci/tsqa/tests/test_http2_spec.py | 114 ++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/46edbd72/ci/tsqa/tests/test_http2_spec.py
----------------------------------------------------------------------
diff --git a/ci/tsqa/tests/test_http2_spec.py b/ci/tsqa/tests/test_http2_spec.py
new file mode 100644
index 0000000..40a829e
--- /dev/null
+++ b/ci/tsqa/tests/test_http2_spec.py
@@ -0,0 +1,114 @@
+#  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.
+
+#
+# Note: This test case uses h2spec. Please install it yourself.
+# https://github.com/summerwind/h2spec
+#
+
+import logging
+import os
+import subprocess
+
+import helpers
+
+import tsqa.endpoint
+import tsqa.test_cases
+import tsqa.utils
+
+log = logging.getLogger(__name__)
+
+# helper function to get h2spec path
+def which(program):
+    def is_exe(fpath):
+        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
+    fpath, fname = os.path.split(program)
+    if fpath:
+        if is_exe(program):
+            return program
+    else:
+        for path in os.environ["PATH"].split(os.pathsep):
+            path = path.strip('"')
+            exe_file = os.path.join(path, program)
+            if is_exe(exe_file):
+                return exe_file
+    return None
+
+class TestH2Spec(helpers.EnvironmentCase, tsqa.test_cases.HTTPBinCase):
+    @classmethod
+    def setUpEnv(cls, env):
+        '''
+        Setting up environment for testing of HTTP2
+        '''
+        # get path to h2spec
+        cls.h2spec = which('h2spec')
+        if cls.h2spec is None:
+          raise helpers.unittest.SkipTest('Cannot find h2spec. skipping test.')
+
+        # get HTTP/2 server ports
+        cls.http2_port = tsqa.utils.bind_unused_port()[1]
+
+        # HTTP2 configs
+        cls.configs['records.config']['CONFIG']['proxy.config.http2.enabled'] = 1
+        cls.configs['records.config']['CONFIG']['proxy.config.http.server_ports'] += ' {0}:ssl'.format(cls.http2_port)
+        cls.configs['records.config']['CONFIG']['proxy.config.ssl.server.cert.path'] = helpers.tests_file_path('rsa_keys')
+        cls.configs['records.config']['CONFIG']['proxy.config.diags.debug.enabled'] = 1
+        cls.configs['records.config']['CONFIG']['proxy.config.diags.debug.tags'] = 'http2.*|ssl.*'
+
+        # configure SSL multicert
+        cls.configs['ssl_multicert.config'].add_line(
+            'dest_ip=* ssl_cert_name={0}\n'.format(helpers.tests_file_path('rsa_keys/www.example.com.pem'))
+        )
+
+        # remap configs
+        cls.configs['remap.config'].add_line(
+            'map / http://127.0.0.1:{0}/'.format(cls.http_endpoint.address[1])
+        )
+
+    def __callH2Spec(self, section=None):
+        '''
+        Call h2spec
+        '''
+        args = [self.h2spec, '-h', 'localhost', '-p', str(self.http2_port), '-t', '-k']
+        if section is not None:
+          args.extend(['-s', section])
+
+        log.info('full args = {0}'.format(args))
+        p = subprocess.Popen(
+            args,
+            stdout=subprocess.PIPE,
+            stdin=subprocess.PIPE,
+        )
+        self.stdout, self.stderr = p.communicate()
+        log.info('\n' + self.stdout)
+
+        return p.returncode
+
+    def test_http2_spec_section(self):
+        '''
+        Test HTTP/2 w/ h2spec (Exceptional Scenario)
+        '''
+        sections = ['3.5', '4.2', '5.1', '5.3.1', '5.4.1', '5.5', '6.1', '6.2', '6.3', '6.4', '6.5', '6.5.2', '6.7', '6.8',
+                    '6.9', '6.9.1', '6.10', '8.1', '8.1.2', '8.1.2.2', '8.1.2.3', '8.1.2.6', '8.2']
+        for section in sections:
+            self.__callH2Spec(section)
+            self.assertIn('All tests passed', self.stdout, 'Failed at section %s of RFC7540' % section)
+
+        # TODO these tests cannot pass currently. move to above after ATS can pass them
+        failing_sections = ['4.3']
+        for section in failing_sections:
+            self.__callH2Spec(section)
+            self.assertNotIn('All tests passed', self.stdout, 'Failed at section %s of RFC7540' % section)