You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ja...@apache.org on 2015/04/30 22:39:50 UTC
[3/4] trafficserver git commit: Remove old tsqa,
and replace it with the new python based one.
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/new_tsqa/tests/test_https.py
----------------------------------------------------------------------
diff --git a/ci/new_tsqa/tests/test_https.py b/ci/new_tsqa/tests/test_https.py
deleted file mode 100644
index a8914e6..0000000
--- a/ci/new_tsqa/tests/test_https.py
+++ /dev/null
@@ -1,273 +0,0 @@
-# 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.
-
-import logging
-from OpenSSL import SSL
-import socket
-
-import helpers
-import tsqa.utils
-
-# some ciphers to test with
-CIPHER_MAP = {
- 'rsa': 'ECDHE-RSA-AES256-GCM-SHA384',
- 'ecdsa': 'ECDHE-ECDSA-AES256-GCM-SHA384',
-}
-
-
-class CertSelectionMixin(object):
- def _get_cert(self, addr, sni_name=None, ciphers=None):
- '''
- Return the certificate for addr. Optionally sending sni_name
- '''
- ctx = SSL.Context(SSL.TLSv1_2_METHOD)
- # Set up client
- sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
- sock.connect(addr)
- if sni_name is not None:
- sock.set_tlsext_host_name(sni_name)
- if ciphers is not None:
- ctx.set_cipher_list(ciphers)
- sock.do_handshake()
- return sock.get_peer_certificate()
-
- def _get_cert_chain(self, addr, sni_name=None, ciphers=None):
- '''
- Return the certificate chain for addr. Optionally sending sni_name
- '''
- ctx = SSL.Context(SSL.TLSv1_2_METHOD)
- # Set up client
- sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
- sock.connect(addr)
- if sni_name is not None:
- sock.set_tlsext_host_name(sni_name)
- if ciphers is not None:
- ctx.set_cipher_list(ciphers)
- sock.do_handshake()
- return sock.get_peer_cert_chain()
-
- def test_star_ordering(self):
- '''
- We should be served the first match, since we aren't sending SNI headers
- '''
- addr = ('127.0.0.1', self.ssl_port)
- cert = self._get_cert(addr)
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_star_sni(self):
- '''
- Make sure we get the certificate we asked for if we pass in SNI headers
- '''
- addr = ('127.0.0.1', self.ssl_port)
- cert = self._get_cert(addr, sni_name='www.test.com')
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.test.com')
-
- cert = self._get_cert(addr, sni_name='www.example.com')
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_ip_ordering(self):
- '''
- We should be served the first match, since we aren't sending SNI headers
- '''
- addr = ('127.0.0.2', self.ssl_port)
- cert = self._get_cert(addr)
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_ip_sni(self):
- '''
- Make sure we get the certificate we asked for if we pass in SNI headers
- '''
- addr = ('127.0.0.2', self.ssl_port)
- cert = self._get_cert(addr, sni_name='www.test.com')
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.test.com')
-
- cert = self._get_cert(addr, sni_name='www.example.com')
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def _intermediate_ca_t(self, cipher):
- '''
- Method for testing intermediate CAs. We assume that www.example.com should
- return a certificate chaing of len 2 which includes intermediate.
- We also assume that www.test.com returns a single cert in the chain which
- is *not* intermediate
- '''
- # send a request that *should* get an intermediate CA
- addr = ('127.0.0.1', self.ssl_port)
- cert_chain = self._get_cert_chain(addr, ciphers=CIPHER_MAP[cipher])
- self.assertEqual(len(cert_chain), 2)
- self.assertEqual(cert_chain[0].get_subject().commonName.decode(), 'www.example.com')
- self.assertEqual(cert_chain[1].get_subject().commonName.decode(), 'intermediate')
-
- # send a request that shouldn't get an intermediate CA
- addr = ('127.0.0.1', self.ssl_port)
- cert_chain = self._get_cert_chain(addr, ciphers=CIPHER_MAP[cipher], sni_name='www.test.com')
- self.assertEqual(len(cert_chain), 1)
- self.assertEqual(cert_chain[0].get_subject().commonName.decode(), 'www.test.com')
-
-
-class TestRSA(helpers.EnvironmentCase, CertSelectionMixin):
- '''
- Tests for https for ATS configured with RSA certificates
- '''
- @classmethod
- def setUpEnv(cls, env):
- # add an SSL port to ATS
- cls.ssl_port = tsqa.utils.bind_unused_port()[1]
- cls.configs['records.config']['CONFIG']['proxy.config.http.server_ports'] += ' {0}:ssl'.format(cls.ssl_port)
- cls.configs['records.config']['CONFIG'].update({
- 'proxy.config.diags.debug.enabled': 1,
- 'proxy.config.diags.debug.tags': 'ssl',
- 'proxy.config.ssl.server.cipher_suite': CIPHER_MAP['rsa'],
- })
-
- # configure SSL multicert
- cls.configs['ssl_multicert.config'].add_line('dest_ip=127.0.0.2 ssl_cert_name={0} ssl_ca_name={1}'.format(
- helpers.tests_file_path('rsa_keys/www.example.com.pem'),
- helpers.tests_file_path('rsa_keys/intermediate.crt'),
- ))
- cls.configs['ssl_multicert.config'].add_line('dest_ip=127.0.0.2 ssl_cert_name={0}'.format(
- helpers.tests_file_path('rsa_keys/www.test.com.pem'),
- ))
-
- cls.configs['ssl_multicert.config'].add_line('dest_ip=* ssl_cert_name={0} ssl_ca_name={1}'.format(
- helpers.tests_file_path('rsa_keys/www.example.com.pem'),
- helpers.tests_file_path('rsa_keys/intermediate.crt'),
- ))
- cls.configs['ssl_multicert.config'].add_line('dest_ip=* ssl_cert_name={0}'.format(
- helpers.tests_file_path('rsa_keys/www.test.com.pem'),
- ))
-
- def test_rsa(self):
- addr = ('127.0.0.1', self.ssl_port)
- cert = self._get_cert(addr, ciphers=CIPHER_MAP['rsa'])
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_ecdsa(self):
- addr = ('127.0.0.1', self.ssl_port)
- with self.assertRaises(Exception):
- cert = self._get_cert(addr, ciphers=CIPHER_MAP['ecdsa'])
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_intermediate_ca_rsa(self):
- self._intermediate_ca_t('rsa')
-
- def test_intermediate_ca_ecdsa(self):
- with self.assertRaises(Exception):
- self._intermediate_ca_t('ecdsa')
-
-class TestECDSA(helpers.EnvironmentCase, CertSelectionMixin):
- '''
- Tests for https for ATS configured with ECDSA certificates
- '''
- @classmethod
- def setUpEnv(cls, env):
- # add an SSL port to ATS
- cls.ssl_port = tsqa.utils.bind_unused_port()[1]
- cls.configs['records.config']['CONFIG']['proxy.config.http.server_ports'] += ' {0}:ssl'.format(cls.ssl_port)
- cls.configs['records.config']['CONFIG'].update({
- 'proxy.config.diags.debug.enabled': 1,
- 'proxy.config.diags.debug.tags': 'ssl',
- 'proxy.config.ssl.server.cipher_suite': CIPHER_MAP['ecdsa'],
- })
-
- # configure SSL multicert
- cls.configs['ssl_multicert.config'].add_line('dest_ip=127.0.0.2 ssl_cert_name={0} ssl_ca_name={1}'.format(
- helpers.tests_file_path('ec_keys/www.example.com.pem'),
- helpers.tests_file_path('ec_keys/intermediate.crt'),
- ))
- cls.configs['ssl_multicert.config'].add_line('dest_ip=127.0.0.2 ssl_cert_name={0}'.format(
- helpers.tests_file_path('ec_keys/www.test.com.pem'),
- ))
-
- cls.configs['ssl_multicert.config'].add_line('dest_ip=* ssl_cert_name={0} ssl_ca_name={1}'.format(
- helpers.tests_file_path('ec_keys/www.example.com.pem'),
- helpers.tests_file_path('ec_keys/intermediate.crt'),
- ))
- cls.configs['ssl_multicert.config'].add_line('dest_ip=* ssl_cert_name={0}'.format(
- helpers.tests_file_path('ec_keys/www.test.com.pem'),
- ))
-
- def test_rsa(self):
- addr = ('127.0.0.1', self.ssl_port)
- with self.assertRaises(Exception):
- cert = self._get_cert(addr, ciphers=CIPHER_MAP['rsa'])
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_ecdsa(self):
- addr = ('127.0.0.1', self.ssl_port)
- cert = self._get_cert(addr, ciphers=CIPHER_MAP['ecdsa'])
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_intermediate_ca_rsa(self):
- with self.assertRaises(Exception):
- self._intermediate_ca_t('rsa')
-
- def test_intermediate_ca_ecdsa(self):
- self._intermediate_ca_t('ecdsa')
-
-class TestMix(helpers.EnvironmentCase, CertSelectionMixin):
- '''
- Tests for https for ATS configured with both ECDSA and RSA certificates
- '''
- @classmethod
- def setUpEnv(cls, env):
- # add an SSL port to ATS
- cls.ssl_port = tsqa.utils.bind_unused_port()[1]
- cls.configs['records.config']['CONFIG']['proxy.config.http.server_ports'] += ' {0}:ssl'.format(cls.ssl_port)
- cls.configs['records.config']['CONFIG'].update({
- 'proxy.config.diags.debug.enabled': 1,
- 'proxy.config.diags.debug.tags': 'ssl',
- 'proxy.config.ssl.server.cipher_suite': '{0}:{1}'.format(CIPHER_MAP['ecdsa'], CIPHER_MAP['rsa']),
- })
-
- # configure SSL multicert
- cls.configs['ssl_multicert.config'].add_line('dest_ip=127.0.0.2 ssl_cert_name={0},{1} ssl_ca_name={2},{3}'.format(
- helpers.tests_file_path('rsa_keys/www.example.com.pem'),
- helpers.tests_file_path('ec_keys/www.example.com.pem'),
- helpers.tests_file_path('rsa_keys/intermediate.crt'),
- helpers.tests_file_path('ec_keys/intermediate.crt'),
- ))
- cls.configs['ssl_multicert.config'].add_line('dest_ip=127.0.0.2 ssl_cert_name={0},{1}'.format(
- helpers.tests_file_path('rsa_keys/www.test.com.pem'),
- helpers.tests_file_path('ec_keys/www.test.com.pem'),
- ))
-
- cls.configs['ssl_multicert.config'].add_line('dest_ip=* ssl_cert_name={0},{1} ssl_ca_name={2},{3}'.format(
- helpers.tests_file_path('rsa_keys/www.example.com.pem'),
- helpers.tests_file_path('ec_keys/www.example.com.pem'),
- helpers.tests_file_path('rsa_keys/intermediate.crt'),
- helpers.tests_file_path('ec_keys/intermediate.crt'),
- ))
- cls.configs['ssl_multicert.config'].add_line('dest_ip=* ssl_cert_name={0},{1}'.format(
- helpers.tests_file_path('rsa_keys/www.test.com.pem'),
- helpers.tests_file_path('ec_keys/www.test.com.pem'),
- ))
-
- def test_rsa(self):
- addr = ('127.0.0.1', self.ssl_port)
- cert = self._get_cert(addr, ciphers=CIPHER_MAP['rsa'])
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_ecdsa(self):
- addr = ('127.0.0.1', self.ssl_port)
- cert = self._get_cert(addr, ciphers=CIPHER_MAP['ecdsa'])
- self.assertEqual(cert.get_subject().commonName.decode(), 'www.example.com')
-
- def test_intermediate_ca_rsa(self):
- self._intermediate_ca_t('rsa')
-
- def test_intermediate_ca_ecdsa(self):
- self._intermediate_ca_t('ecdsa')
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/new_tsqa/tests/test_keepalive.py
----------------------------------------------------------------------
diff --git a/ci/new_tsqa/tests/test_keepalive.py b/ci/new_tsqa/tests/test_keepalive.py
deleted file mode 100644
index 0e501ce..0000000
--- a/ci/new_tsqa/tests/test_keepalive.py
+++ /dev/null
@@ -1,476 +0,0 @@
-# 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.
-
-import uuid
-import requests
-import time
-import logging
-import socket
-
-import helpers
-
-import tsqa.test_cases
-import tsqa.utils
-import tsqa.endpoint
-
-log = logging.getLogger(__name__)
-
-import SocketServer
-
-
-class KeepaliveTCPHandler(SocketServer.BaseRequestHandler):
- """
- A subclass of RequestHandler which will return a connection uuid
- """
-
- def handle(self):
- # Receive the data in small chunks and retransmit it
- start = time.time()
- conn_id = uuid.uuid4().hex
- while True:
- now = time.time() - start
- data = self.request.recv(4096).strip()
- if data:
- log.debug('Sending data back to the client: {uid}'.format(uid=conn_id))
- else:
- log.debug('Client disconnected: {timeout}seconds'.format(timeout=now))
- break
- body = conn_id
- resp = ('HTTP/1.1 200 OK\r\n'
- 'Content-Length: {content_length}\r\n'
- 'Content-Type: text/html; charset=UTF-8\r\n'
- 'Connection: keep-alive\r\n'
- '\r\n'
- '{body}'.format(content_length=len(body), body=body))
- self.request.sendall(resp)
-
-
-class KeepAliveInMixin(object):
- """Mixin for keep alive in.
-
- TODO: Allow protocol to be specified for ssl traffic
- """
- def _get_socket(self):
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect(('127.0.0.1', int(self.configs['records.config']['CONFIG']['proxy.config.http.server_ports'])))
- return s
-
- def _headers_to_str(self, headers):
- if headers is None:
- headers = {}
- request = ''
- for k, v in headers.iteritems():
- request += '{0}: {1}\r\n'.format(k, v)
- return request
-
- def _aux_KA_working_path_connid(self, protocol, headers=None):
- # connect tcp
- s = self._get_socket()
-
- request = ('GET / HTTP/1.1\r\n'
- 'Host: foobar.com\r\n')
- request += self._headers_to_str(headers)
- request += '\r\n'
-
- for x in xrange(1, 10):
- s.send(request)
- response = s.recv(4096)
- # cheat, since we know what the body should have
- if '\r\n\r\n' not in response:
- response += s.recv(4096)
- self.assertIn('HTTP/1.1 200 OK', response)
- self.assertIn('hello', response)
-
- def _aux_working_path(self, protocol, headers=None):
- # connect tcp
- s = self._get_socket()
-
- request = ('GET /exists/ HTTP/1.1\r\n'
- 'Host: foobar.com\r\n')
- request += self._headers_to_str(headers)
- request += '\r\n'
-
- for x in xrange(1, 10):
- s.send(request)
- response = s.recv(4096)
- # cheat, since we know what the body should have
- if not response.endswith('hello'):
- response += s.recv(4096)
- self.assertIn('HTTP/1.1 200 OK', response)
- self.assertIn('hello', response)
-
- def _aux_error_path(self, protocol, headers=None):
- # connect tcp
- s = self._get_socket()
-
- request = ('GET / HTTP/1.1\r\n'
- 'Host: foobar.com\r\n')
- request += self._headers_to_str(headers)
- request += '\r\n'
- for x in xrange(1, 10):
- s.send(request)
- response = s.recv(4096)
- self.assertIn('HTTP/1.1 404 Not Found on Accelerator', response)
-
- def _aux_error_path_post(self, protocol, headers=None):
- '''
- Ensure that sending a request with a body doesn't break the keepalive session
- '''
- # connect tcp
- s = self._get_socket()
-
- request = ('POST / HTTP/1.1\r\n'
- 'Host: foobar.com\r\n'
- 'Content-Length: 10\r\n')
- request += self._headers_to_str(headers)
- request += '\r\n'
- request += '1234567890'
-
- for x in xrange(1, 10):
- try:
- s.send(request)
- except IOError:
- s = self._get_socket()
- s.send(request)
-
- response = s.recv(4096)
- # Check if client disconnected
- if response:
- self.assertIn('HTTP/1.1 404 Not Found on Accelerator', response)
-
-
-class BasicTestsOutMixin(object):
-
- def _aux_KA_origin(self, protocol, headers=None):
- '''
- Test that the origin does in fact support keepalive
- '''
- conn_id = None
- with requests.Session() as s:
- url = '{0}://127.0.0.1:{1}/'.format(protocol, self.socket_server.port)
- for x in xrange(1, 10):
- ret = s.get(url, verify=False, headers=headers)
- if not conn_id:
- conn_id = ret.text.strip()
- self.assertEqual(ret.status_code, 200)
- self.assertEqual(ret.text.strip(), conn_id, "Client reports server closed connection")
-
- def _aux_KA_proxy(self, protocol, headers=None):
- '''
- Test that keepalive works through ATS to that origin
- '''
- url = '{0}://127.0.0.1:{1}'.format(protocol,
- self.configs['records.config']['CONFIG']['proxy.config.http.server_ports'])
- conn_id = None
- for x in xrange(1, 10):
- ret = requests.get(url, verify=False, headers=headers)
- if not conn_id:
- conn_id = ret.text.strip()
- self.assertEqual(ret.status_code, 200)
- self.assertEqual(ret.text.strip(), conn_id, "Client reports server closed connection")
-
-class TimeoutOutMixin(object):
-
- def _aux_KA_timeout_direct(self, protocol):
- '''Tests that origin does not timeout using keepalive.'''
- with requests.Session() as s:
- url = '{0}://127.0.0.1:{1}/'.format(protocol, self.socket_server.port)
- conn_id = None
- for x in xrange(0, 3):
- ret = s.get(url, verify=False)
- if not conn_id:
- conn_id = ret.text.strip()
- self.assertEqual(ret.text.strip(), conn_id, "Client reports server closed connection")
- time.sleep(3)
-
- def _aux_KA_timeout_proxy(self, protocol):
- '''Tests that keepalive timeout is honored through ATS to origin.'''
- url = '{0}://127.0.0.1:{1}'.format(protocol,
- self.configs['records.config']['CONFIG']['proxy.config.http.server_ports'])
- conn_id = None
- for x in xrange(0, 3):
- ret = requests.get(url, verify=False)
- if not conn_id:
- conn_id = ret.text.strip()
- self.assertEqual(ret.text.strip(), conn_id, "Client reports server closed connection")
- time.sleep(3)
-
-
-class OriginMinMaxMixin(object):
-
- def _aux_KA_min_origin(self, protocol):
- '''Tests that origin_min_keep_alive_connections is honored.'''
- url = '{0}://127.0.0.1:{1}'.format(protocol,
- self.configs['records.config']['CONFIG']['proxy.config.http.server_ports'])
- ret = requests.get(url, verify=False)
- conn_id = ret.text.strip()
- time.sleep(3)
- ret = requests.get(url, verify=False)
- self.assertEqual(ret.text.strip(), conn_id, "Client reports server closed connection")
-
-
-class TestKeepAliveInHTTP(tsqa.test_cases.DynamicHTTPEndpointCase, helpers.EnvironmentCase, KeepAliveInMixin):
- @classmethod
- def setUpEnv(cls, env):
-
- def hello(request):
- return 'hello'
- cls.http_endpoint.add_handler('/exists/', hello)
-
- cls.configs['remap.config'].add_line('map /exists/ http://127.0.0.1:{0}/exists/'.format(cls.http_endpoint.address[1]))
-
- # only add server headers when there weren't any
- cls.configs['records.config']['CONFIG']['proxy.config.http.response_server_enabled'] = 2
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_enabled_in'] = 1
- cls.configs['records.config']['CONFIG']['share_server_session'] = 2
-
- # set only one ET_NET thread (so we don't have to worry about the per-thread pools causing issues)
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.limit'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.autoconfig'] = 0
-
- def test_working_path(self):
- self._aux_working_path("http")
-
- def test_error_path(self):
- self._aux_error_path("http")
-
- def test_error_path_post(self):
- '''
- Ensure that sending a request with a body doesn't break the keepalive session
- '''
- self._aux_error_path_post("http")
-
-class TestKeepAliveOriginConnOutHTTP(helpers.EnvironmentCase, OriginMinMaxMixin):
- @classmethod
- def setUpEnv(cls, env):
- '''
- This function is responsible for setting up the environment for this fixture
- This includes everything pre-daemon start
- '''
- # create a socket server
- cls.socket_server = tsqa.endpoint.SocketServerDaemon(KeepaliveTCPHandler)
- cls.socket_server.start()
- cls.socket_server.ready.wait()
- cls.configs['remap.config'].add_line('map / http://127.0.0.1:{0}/'.format(cls.socket_server.port))
-
- # only add server headers when there weren't any
- cls.configs['records.config']['CONFIG']['proxy.config.http.response_server_enabled'] = 2
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_enabled_out'] = 1
- cls.configs['records.config']['CONFIG']['share_server_session'] = 2
-
- # set only one ET_NET thread (so we don't have to worry about the per-thread pools causing issues)
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.limit'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.autoconfig'] = 0
-
- # Timeouts
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_no_activity_timeout_out'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.http.transaction_no_activity_timeout_out'] = 1
-
- cls.configs['records.config']['CONFIG']['proxy.config.http.origin_min_keep_alive_connections'] = 1
-
- def test_KA_min_origin(self):
- '''Tests that origin_min_keep_alive_connections is honored via http.'''
- self._aux_KA_min_origin("http")
-
-
-class TestKeepAliveOriginConnOutHTTPS(helpers.EnvironmentCase, OriginMinMaxMixin):
- @classmethod
- def setUpEnv(cls, env):
- '''
- This function is responsible for setting up the environment for this fixture
- This includes everything pre-daemon start
- '''
- # create a socket server
- cls.socket_server = tsqa.endpoint.SSLSocketServerDaemon(KeepaliveTCPHandler,
- helpers.tests_file_path('cert.pem'),
- helpers.tests_file_path('key.pem'))
- cls.socket_server.start()
- cls.socket_server.ready.wait()
- cls.configs['remap.config'].add_line('map / https://127.0.0.1:{0}/\n'.format(cls.socket_server.port))
-
- # only add server headers when there weren't any
- cls.configs['records.config']['CONFIG']['proxy.config.http.response_server_enabled'] = 2
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_enabled_out'] = 1
- cls.configs['records.config']['CONFIG']['share_server_session'] = 2
-
- # set only one ET_NET thread (so we don't have to worry about the per-thread pools causing issues)
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.limit'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.autoconfig'] = 0
- cls.configs['records.config']['CONFIG']['proxy.config.ssl.number.threads'] = -1
-
- # Timeouts
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_no_activity_timeout_out'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.http.transaction_no_activity_timeout_out'] = 1
-
- cls.configs['records.config']['CONFIG']['proxy.config.http.origin_min_keep_alive_connections'] = 1
-
- def test_KA_min_origin(self):
- '''Tests that origin_min_keep_alive_connections is honored via https.'''
- self._aux_KA_min_origin("http")
-
-
-class TestKeepAliveOutHTTP(helpers.EnvironmentCase, BasicTestsOutMixin, TimeoutOutMixin):
- @classmethod
- def setUpEnv(cls, env):
- '''
- This function is responsible for setting up the environment for this fixture
- This includes everything pre-daemon start
- '''
- # create a socket server
- cls.socket_server = tsqa.endpoint.SocketServerDaemon(KeepaliveTCPHandler)
- cls.socket_server.start()
- cls.socket_server.ready.wait()
- cls.configs['remap.config'].add_line('map / http://127.0.0.1:{0}/'.format(cls.socket_server.port))
-
- # only add server headers when there weren't any
- cls.configs['records.config']['CONFIG']['proxy.config.http.response_server_enabled'] = 2
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_enabled_out'] = 1
- cls.configs['records.config']['CONFIG']['share_server_session'] = 2
-
- # set only one ET_NET thread (so we don't have to worry about the per-thread pools causing issues)
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.limit'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.autoconfig'] = 0
-
- # Timeouts
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_no_activity_timeout_out'] = 10
- cls.configs['records.config']['CONFIG']['proxy.config.http.transaction_no_activity_timeout_out'] = 2
-
- def test_KA_origin(self):
- '''Test that the origin does in fact support keepalive via http.'''
- self._aux_KA_origin("http")
-
- def test_KA_proxy(self):
- '''Tests that keepalive works through ATS to origin via http.'''
- self._aux_KA_proxy("http")
-
- def test_KA_timeout_direct(self):
- '''Tests that origin does not timeout using keepalive via http.'''
- self._aux_KA_timeout_direct("http")
-
- def test_KA_timeout_proxy(self):
- '''Tests that keepalive timeout is honored through ATS to origin via http.'''
- self._aux_KA_timeout_proxy("http")
-
-
-class TestKeepAliveOutHTTPS(helpers.EnvironmentCase, BasicTestsOutMixin, TimeoutOutMixin):
- @classmethod
- def setUpEnv(cls, env):
- '''
- This function is responsible for setting up the environment for this fixture
- This includes everything pre-daemon start
- '''
- # create a socket server
- cls.socket_server = tsqa.endpoint.SSLSocketServerDaemon(KeepaliveTCPHandler,
- helpers.tests_file_path('cert.pem'),
- helpers.tests_file_path('key.pem'))
- cls.socket_server.start()
- cls.socket_server.ready.wait()
- cls.configs['remap.config'].add_line('map / https://127.0.0.1:{0}/\n'.format(cls.socket_server.port))
-
- # only add server headers when there weren't any
- cls.configs['records.config']['CONFIG']['proxy.config.http.response_server_enabled'] = 2
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_enabled_out'] = 1
- cls.configs['records.config']['CONFIG']['share_server_session'] = 2
-
- # set only one ET_NET thread (so we don't have to worry about the per-thread pools causing issues)
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.limit'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.autoconfig'] = 0
- cls.configs['records.config']['CONFIG']['proxy.config.ssl.number.threads'] = -1
-
- # Timeouts
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_no_activity_timeout_out'] = 10
- cls.configs['records.config']['CONFIG']['proxy.config.http.transaction_no_activity_timeout_out'] = 2
-
- def test_KA_origin(self):
- '''Test that the origin does in fact support keepalive via https.'''
- self._aux_KA_origin("https")
-
- def test_KA_proxy(self):
- '''Tests that keepalive works through ATS to origin via https.'''
- self._aux_KA_proxy("http")
-
- def test_KA_timeout_direct(self):
- '''Tests that origin does not timeout using keepalive via https.'''
- self._aux_KA_timeout_direct("https")
-
- def test_KA_timeout_proxy(self):
- '''Tests that keepalive timeout is honored through ATS to origin via https.'''
- self._aux_KA_timeout_proxy("http")
-
-
-
-# TODO: refactor these tests, these are *very* similar, we should paramatarize them
-## Some basic tests for auth_sever_session_private
-class TestKeepAlive_Authorization_private(helpers.EnvironmentCase, BasicTestsOutMixin, KeepAliveInMixin):
- @classmethod
- def setUpEnv(cls, env):
-
- cls.socket_server = tsqa.endpoint.SocketServerDaemon(KeepaliveTCPHandler)
- cls.socket_server.start()
- cls.socket_server.ready.wait()
- cls.configs['remap.config'].add_line('map / http://127.0.0.1:{0}/exists/'.format(cls.socket_server.port))
-
- # only add server headers when there weren't any
- cls.configs['records.config']['CONFIG']['proxy.config.http.response_server_enabled'] = 2
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_enabled_in'] = 1
- cls.configs['records.config']['CONFIG']['share_server_session'] = 2
-
- # set only one ET_NET thread (so we don't have to worry about the per-thread pools causing issues)
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.limit'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.autoconfig'] = 0
-
- # make auth sessions private
- cls.configs['records.config']['CONFIG']['proxy.config.auth_server_session_private'] = 1
-
- def test_KA_server(self):
- '''Tests that keepalive works through ATS to origin via https.'''
- with self.assertRaises(AssertionError):
- self._aux_KA_proxy("http", headers={'Authorization': 'Foo'})
-
- def test_KA_client(self):
- '''Tests that keepalive works through ATS to origin via https.'''
- with self.assertRaises(AssertionError):
- self._aux_KA_working_path_connid("http", headers={'Authorization': 'Foo'})
-
-
-class TestKeepAlive_Authorization_no_private(helpers.EnvironmentCase, BasicTestsOutMixin, KeepAliveInMixin):
- @classmethod
- def setUpEnv(cls, env):
-
- cls.socket_server = tsqa.endpoint.SocketServerDaemon(KeepaliveTCPHandler)
- cls.socket_server.start()
- cls.socket_server.ready.wait()
- cls.configs['remap.config'].add_line('map / http://127.0.0.1:{0}/exists/'.format(cls.socket_server.port))
-
- # only add server headers when there weren't any
- cls.configs['records.config']['CONFIG']['proxy.config.http.response_server_enabled'] = 2
- cls.configs['records.config']['CONFIG']['proxy.config.http.keep_alive_enabled_in'] = 1
- cls.configs['records.config']['CONFIG']['share_server_session'] = 2
-
- # set only one ET_NET thread (so we don't have to worry about the per-thread pools causing issues)
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.limit'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.autoconfig'] = 0
-
- # make auth sessions private
- cls.configs['records.config']['CONFIG']['proxy.config.http.auth_server_session_private'] = 0
-
- def test_KA_server(self):
- '''Tests that keepalive works through ATS to origin via https.'''
- self._aux_KA_proxy("http", headers={'Authorization': 'Foo'})
-
- def test_KA_client(self):
- '''Tests that keepalive works through ATS to origin via https.'''
- self._aux_KA_working_path_connid("http", headers={'Authorization': 'Foo'})
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/new_tsqa/tests/test_redirection.py
----------------------------------------------------------------------
diff --git a/ci/new_tsqa/tests/test_redirection.py b/ci/new_tsqa/tests/test_redirection.py
deleted file mode 100644
index 1100dc1..0000000
--- a/ci/new_tsqa/tests/test_redirection.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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.
-
-import requests
-import helpers
-import tsqa.test_cases
-import tsqa.utils
-import tsqa.endpoint
-
-class TestRedirection(helpers.EnvironmentCase, tsqa.test_cases.HTTPBinCase):
- @classmethod
- def setUpEnv(cls, env):
- cls.configs['records.config']['CONFIG'].update({
- 'proxy.config.http.redirection_enabled': 1,
- 'proxy.config.http.number_of_redirections': 10
- })
- cls.configs['remap.config'].add_line('map / http://127.0.0.1:{0}'.format(cls.http_endpoint.address[1]))
-
- def test_redirection(self):
- server_ports = self.configs['records.config']['CONFIG']['proxy.config.http.server_ports']
-
- # By default Requests will perform location redirection
- # Disable redirection handling with the allow_redirects parameter
- r = requests.get('http://127.0.0.1:{0}/redirect/9'.format(server_ports), allow_redirects=False)
- self.assertEqual(r.status_code, 200)
-
- r = requests.get('http://127.0.0.1:{0}/redirect/10'.format(server_ports), allow_redirects=False)
- self.assertEqual(r.status_code, 302)
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/new_tsqa/tests/test_regressions.py
----------------------------------------------------------------------
diff --git a/ci/new_tsqa/tests/test_regressions.py b/ci/new_tsqa/tests/test_regressions.py
deleted file mode 100644
index 8fec2eb..0000000
--- a/ci/new_tsqa/tests/test_regressions.py
+++ /dev/null
@@ -1,82 +0,0 @@
-'''
-Run the built-in regression tests with experimental build configurations.
-'''
-
-# 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.
-
-import os
-import sys
-import requests
-import time
-import subprocess
-import logging
-
-import helpers
-import tsqa.test_cases
-import tsqa.utils
-
-log = logging.getLogger(__name__)
-
-class TestRegressions(helpers.EnvironmentCase):
- '''
- Run the built-in traffic_server regression test suite.
- '''
-
- # NOTE: we need to stop the running Traffic Server in the environment so
- # that we can start up our own. Make sure to restart it when we are done so
- # that the EnvironmentCase doesn't get upset.
-
- @classmethod
- def setUpClass(cls):
- super(TestRegressions, cls).setUpClass()
- cls.environment.stop()
-
- @classmethod
- def tearDownClass(cls):
- cls.environment.start()
- super(TestRegressions, cls).tearDownClass()
-
- def test_regressions(self):
- cmd = [os.path.join(self.environment.layout.bindir, 'traffic_server'), '-R', '1']
- tsqa.utils.run_sync_command(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-
-class TestRegressionsReclaimableFreelist(TestRegressions):
- '''
- Run the built-in traffic_server regression test suite with
- --enable-reclaimable-freelist.
- '''
- environment_factory = {
- 'configure': { 'enable-reclaimable-freelist': None },
- }
-
-class TestRegressionsInterimCache(TestRegressions):
- '''
- Run the built-in traffic_server regression test suite with
- --enable-interim-cache.
- '''
- environment_factory = {
- 'configure': { 'enable-interim-cache': None },
- }
-
-class TestRegressionsLinuxNativeAIO(TestRegressions):
- '''
- Run the built-in traffic_server regression test suite with
- --enable-linux-native-aio.
- '''
- environment_factory = {
- 'configure': { 'enable-linux-native-aio': None },
- }
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/new_tsqa/tests/test_remap.py
----------------------------------------------------------------------
diff --git a/ci/new_tsqa/tests/test_remap.py b/ci/new_tsqa/tests/test_remap.py
deleted file mode 100644
index aac6e8e..0000000
--- a/ci/new_tsqa/tests/test_remap.py
+++ /dev/null
@@ -1,125 +0,0 @@
-# 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.
-
-import os
-import requests
-import time
-import logging
-
-import helpers
-
-import tsqa.test_cases
-import tsqa.utils
-import tsqa.endpoint
-
-log = logging.getLogger(__name__)
-
-class TestRemapHTTP(tsqa.test_cases.DynamicHTTPEndpointCase, helpers.EnvironmentCase):
- @classmethod
- def setUpEnv(cls, env):
- cls.configs['records.config']['CONFIG'].update({
- 'proxy.config.diags.debug.enabled': 1,
- 'proxy.config.diags.debug.tags': 'url.*',
- })
-
- cls.configs['remap.config'].add_line(
- 'map http://www.example.com http://127.0.0.1:{0}'.format(cls.http_endpoint.address[1]));
- cls.configs['remap.config'].add_line(
- 'map http://www.example.com:8080 http://127.0.0.1:{0}'.format(cls.http_endpoint.address[1]));
-
- def hello(request):
- return 'hello'
- cls.http_endpoint.add_handler('/', hello)
-
- def test_remap_http(self):
- s = requests.Session()
- http_port = self.configs['records.config']['CONFIG']['proxy.config.http.server_ports']
- url = 'http://127.0.0.1:{0}/'.format(http_port)
-
- ret = s.get(url)
- self.assertEqual(ret.status_code, 404)
-
- s.headers.update({'Host': 'www.example.com'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 200)
-
- s.headers.update({'Host': 'www.example.com:80'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 200)
-
- s.headers.update({'Host': 'www.example.com:8080'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 200)
-
- s.headers.update({'Host': 'www.test.com'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 404)
-
- s.headers.update({'Host': 'www.example.com:1234'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 404)
-
-class TestRemapHTTPS(tsqa.test_cases.DynamicHTTPEndpointCase, helpers.EnvironmentCase):
- @classmethod
- def setUpEnv(cls, env):
- # set an SSL port to ATS
- cls.ssl_port = tsqa.utils.bind_unused_port()[1]
- cls.configs['records.config']['CONFIG']['proxy.config.http.server_ports'] += ' {0}:ssl'.format(cls.ssl_port)
- cls.configs['records.config']['CONFIG'].update({
- 'proxy.config.diags.debug.enabled': 1,
- 'proxy.config.diags.debug.tags': 'url.*'
- })
-
- cls.configs['remap.config'].add_line(
- 'map https://www.example.com http://127.0.0.1:{0}'.format(cls.http_endpoint.address[1]));
- cls.configs['remap.config'].add_line(
- 'map https://www.example.com:4443 http://127.0.0.1:{0}'.format(cls.http_endpoint.address[1]));
- # configure SSL multicert
- cls.configs['ssl_multicert.config'].add_line(
- 'dest_ip=* ssl_cert_name={0}'.format(helpers.tests_file_path('rsa_keys/www.example.com.pem')))
-
- def hello(request):
- return 'hello'
- cls.http_endpoint.add_handler('/', hello)
-
- def test_remap_https(self):
- s = requests.Session()
- url = 'https://127.0.0.1:{0}/'.format(self.ssl_port)
-
- # We lack of SNI support in requests module, so we do not verify SSL certificate here.
- # ret = s.get(url, verify=(helpers.tests_file_path('certs/ca.crt')))
- ret = s.get(url, verify=False)
- self.assertEqual(ret.status_code, 404)
-
- s.headers.update({'Host': 'www.example.com'})
- ret = s.get(url, verify=False)
- self.assertEqual(ret.status_code, 200)
-
- s.headers.update({'Host': 'www.example.com:443'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 200)
-
- s.headers.update({'Host': 'www.example.com:4443'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 200)
-
- s.headers.update({'Host': 'www.test.com'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 404)
-
- s.headers.update({'Host': 'www.example.com:1234'})
- ret = s.get(url)
- self.assertEqual(ret.status_code, 404)
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/new_tsqa/tests/test_spdy_protocol_select.py
----------------------------------------------------------------------
diff --git a/ci/new_tsqa/tests/test_spdy_protocol_select.py b/ci/new_tsqa/tests/test_spdy_protocol_select.py
deleted file mode 100644
index 50fabce..0000000
--- a/ci/new_tsqa/tests/test_spdy_protocol_select.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# 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.
-
-import os
-import requests
-import time
-import logging
-import subprocess
-
-import helpers
-
-import tsqa.test_cases
-import tsqa.utils
-import tsqa.endpoint
-
-log = logging.getLogger(__name__)
-
-#helper function to get spdycat 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 TestSPDY(helpers.EnvironmentCase):
- environment_factory = {
- 'configure': {'enable-spdy': None},
- 'env': {'PKG_CONFIG_PATH': os.getenv("SPDY_PKG_CONFIG_PATH", "/opt/spdylay/lib/pkgconfig/")},
- }
-
- @classmethod
- def setUpEnv(cls, env):
- '''
- This function is responsible for setting up the environment for this fixture
- This includes everything pre-daemon start
- '''
- # set up spdycat
- cls.client = which('spdycat')
- if cls.client is None:
- build_dir = os.environ.get('top_builddir', '../..')
- log.info('top build_dir = {0}'.format(build_dir))
- cls.client = '%s/spdylay/src/spdycat' % build_dir
- if os.path.isfile(cls.client) is False:
- raise helpers.unittest.SkipTest('Cannot find spdycat. skipping test.')
-
- log.info('spdycat path = {0}'.format(cls.client))
-
- # get spdy server ports
- cls.spdy_port = tsqa.utils.bind_unused_port()[1]
- log.info('spdy server port = {0}'.format(cls.spdy_port))
- cls.http_port = tsqa.utils.bind_unused_port()[1]
- log.info('http server port = {0}'.format(cls.http_port))
-
- cls.configs['remap.config'].add_line('map / https://docs.trafficserver.apache.org/\n')
-
- # set only one ET_NET thread (so we don't have to worry about the per-thread pools causing issues)
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.limit'] = 1
- cls.configs['records.config']['CONFIG']['proxy.config.exec_thread.autoconfig'] = 0
-
- # SPDY configs
- cls.configs['records.config']['CONFIG']['proxy.config.http.server_ports'] += ' {0}:ssl {1}:proto=http:ssl'.format(cls.spdy_port, cls.http_port)
- cls.configs['records.config']['CONFIG']['proxy.config.ssl.server.cert.path'] = helpers.tests_file_path('rsa_keys')
-
- # 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')))
-
- @classmethod
- def callSpdycat(self, port, path, args):
- full_args = [self.client,'https://localhost:%d%s' % (port, path)] + args
- self.log.info('full args = {0}'.format(full_args))
- p = subprocess.Popen(full_args, stdout=subprocess.PIPE,
- stdin=subprocess.PIPE)
- self.stdout, self.stderr = p.communicate()
- return p.returncode
-
-"""
-TODO: re-add spdy2 tests. looks like support here might be lacking some way. was not able to get ATS to advertise spdy/2
-even when it was explicitly set with proto=spdy/2
-"""
-class TestSPDYv2(TestSPDY):
- @classmethod
- def setUpClass(cls):
- '''
- Skip spdy2 tests for now
- '''
- raise helpers.unittest.SkipTest('Skipping spdy/2 tests')
-
- @classmethod
- def setUpEnv(cls, env):
- '''
- This function is responsible for setting up the environment for this fixture
- This includes everything pre-daemon start
- '''
- super(TestSPDYv2, cls).setUpEnv(env)
-
- cls.spdy2_port = tsqa.utils.bind_unused_port()[1]
- log.info('spdy2 server port = {0}'.format(cls.spdy2_port))
- # make sure we add port supports spdy2
- cls.configs['records.config']['CONFIG']['proxy.config.http.server_ports'] += ' {0}:proto=spdy/2:ssl'.format(cls.spdy2_port)
-
- def test_SPDY_v2(self):
- '''
- Test that the origin does in fact support spdy 2
- '''
- self.assertEquals(0, self.callSpdycat(self.spdy2_port, '/', ['-nv', '--spdy2'])) #this isn't passing
- self.assertIn('version=2', self.stdout)
-
-class TestSPDYv3(TestSPDY):
- def test_SPDY_v3(self):
- '''
- Test that the origin does in fact support spdy 3
- '''
- self.assertEquals(0, self.callSpdycat(self.spdy_port, '/', ['-nv', '--spdy3']))
- self.assertIn('NPN selected the protocol: spdy/3', self.stdout)
-
- def test_SPDY_v3_failed_request(self):
- '''
- Test that non spdy port won't advertise spdy
- '''
- self.assertEquals(1, self.callSpdycat(self.http_port, '/', ['-nv', '--spdy3']))
-
-class TestSPDYv3_1(TestSPDY):
- def test_SPDY_v3_1(self):
- '''
- Test that the origin does in fact support spdy 3.1
- '''
- self.assertEquals(0, self.callSpdycat(self.spdy_port, '/', ['-nv', '--spdy3-1']))
- self.assertIn('NPN selected the protocol: spdy/3.1', self.stdout)
-
- def test_SPDY_v3_1_failed_request(self):
- '''
- Test that non spdy port won't advertise spdy
- '''
- self.assertEquals(1, self.callSpdycat(self.http_port, '/', ['-nv', '--spdy3-1']))
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/Makefile
----------------------------------------------------------------------
diff --git a/ci/tsqa/Makefile b/ci/tsqa/Makefile
new file mode 100644
index 0000000..a46a684
--- /dev/null
+++ b/ci/tsqa/Makefile
@@ -0,0 +1,43 @@
+# 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.
+
+.PHONY: test clean update
+
+VIRTUALENV_DIR = virtualenv
+
+# Run all tests.
+test: $(VIRTUALENV_DIR)
+ @source $(VIRTUALENV_DIR)/bin/activate && $(VIRTUALENV_DIR)/bin/nosetests -sv --logging-level=INFO
+
+# Scan and list the tests.
+list: $(VIRTUALENV_DIR)
+ @source $(VIRTUALENV_DIR)/bin/activate && $(VIRTUALENV_DIR)/bin/nosetests -v --collect-only
+
+# Construct the virtualenv.
+$(VIRTUALENV_DIR):
+ @if [ ! -d $(VIRTUALENV_DIR) ]; then\
+ virtualenv $(VIRTUALENV_DIR);\
+ fi
+ @# Update the virtualenv with your dep libraries
+ source $(VIRTUALENV_DIR)/bin/activate && $(VIRTUALENV_DIR)/bin/pip install -r requirements.txt
+ @echo "Virtualenv ready!"
+
+# Update the virtualenv with the latest TSQA package and dependencies.
+update: $(VIRTUALENV_DIR)
+ source $(VIRTUALENV_DIR)/bin/activate && $(VIRTUALENV_DIR)/bin/pip install --upgrade -r requirements.txt
+
+clean:
+ rm -rf virtualenv
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/TODO
----------------------------------------------------------------------
diff --git a/ci/tsqa/TODO b/ci/tsqa/TODO
new file mode 100644
index 0000000..c01205b
--- /dev/null
+++ b/ci/tsqa/TODO
@@ -0,0 +1,7 @@
+# TODO list for tsqa
+
+- runtests script
+ - run specific things within the virtualenv
+ - package up output from specific tests in a relocateable way
+- Documentation/Examples of TSQA framework
+- pylint for test cases
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/cert.pem
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/cert.pem b/ci/tsqa/files/cert.pem
new file mode 100644
index 0000000..fcac091
--- /dev/null
+++ b/ci/tsqa/files/cert.pem
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDVzCCAj+gAwIBAgIJAOY9Arrh4/IgMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNV
+BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
+Q29tcGFueSBMdGQwHhcNMTUwMTIyMDE1MjU3WhcNMTUwMjIxMDE1MjU3WjBCMQsw
+CQYDVQQGEwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh
+dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+08GU61mR18JO9X20utgemoeeYyKx+LXZYQBc0cKwHzZIiYfokwCkCNekMjZ87DT2
++++8lBf3PatSgtA8/xanr8+TTDbKPehqdItDAy9e/xYgPBz9RXHuBUeOw+CPxt2e
+aGrGwy6ybW3jne/+vm73wn+ZzldpwGGXwIQAS9lFqtmisx/DftL8fhzpfp/uIU/K
+Y33iMiPpEHi8CHrOsaREl787ipKoqfxs+d1JNTHu1I+wJKgppOrtyjF1AjYDmrRg
+RO8rJqIaUKS+8teV2KazwfdPkgNyaoZO7NCPPEjWkbp2c+2AJQqCSyZmJ63idgkR
+msaSjRx45vJPOU/KFVHLuQIDAQABo1AwTjAdBgNVHQ4EFgQUtL1CTVRABxDQVbZy
+WwOZWMCs08QwHwYDVR0jBBgwFoAUtL1CTVRABxDQVbZyWwOZWMCs08QwDAYDVR0T
+BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAComsgXv9V7utk6yY1XV+rtjZmyRV
+758Jjzb2sqqVtw8jtEvdiO6rK+Chb49cAcBGJFHZL2/CJ6BWSOf79fLj/IGKC/nX
+UBz0dxrlg9x/KR/Jtp0qqQXIw/HT/NvaytYxMIBKqkmjG+kWiPn61dvwFjIERPOb
+xM4lHhaO/PKWDDVx6Sf7UzMalmwFjaGQFXCNM5dfqvdqDYYrbZwEWuqmxNy1sZBY
+SfY7Tyz6OP9NnlgtWRAITPqBS2kx/MVCGd2TtzJcJDxKK67tr0QFenGtXSZy555Q
+bNKjXKVWiHrVCEgttPri22o7Ax1Q6FpLHMXDIiveUl6aXq4ulNzRqXpmaw==
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/ec_keys/README.rst
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/ec_keys/README.rst b/ci/tsqa/files/ec_keys/README.rst
new file mode 100644
index 0000000..c3dd1e1
--- /dev/null
+++ b/ci/tsqa/files/ec_keys/README.rst
@@ -0,0 +1,29 @@
+All of these certificates are self-signed and are *not* secure. They are intended
+only for use in testing.
+
+Try to use existing certs if possible rather than generating your own.
+
+# generated using (make sure to set "hostname"):
+openssl ecparam -name prime256v1 -genkey -out key.pem
+openssl req -new -x509 -key key.pem -out cert.pem
+
+
+## Since we want to verify all of the certificate verification, we need to generate
+## our own CA and intermediate CA
+# Create CA
+openssl ecparam -name prime256v1 -genkey -out ca.key
+openssl req -new -x509 -nodes -sha1 -days 1825 -key ca.key -out ca.crt
+
+# Create Intermediate
+openssl ecparam -name prime256v1 -genkey -out intermediate.key
+openssl req -new -sha1 -key intermediate.key -out intermediate.csr
+
+# CA signs Intermediate
+openssl x509 -req -days 1825 -in intermediate.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out intermediate.crt
+
+# Create Server
+openssl ecparam -name prime256v1 -genkey -out www.example.com.key
+openssl req -new -key test.example.com.key -out test.example.com.csr
+
+# Intermediate signs Server
+openssl x509 -req -days 1825 -in test.example.com.csr -CA intermediate.crt -CAkey intermediate.key -set_serial 01 -out test.example.com.crt
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/ec_keys/ca.crt
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/ec_keys/ca.crt b/ci/tsqa/files/ec_keys/ca.crt
new file mode 100644
index 0000000..a70f990
--- /dev/null
+++ b/ci/tsqa/files/ec_keys/ca.crt
@@ -0,0 +1,12 @@
+-----BEGIN CERTIFICATE-----
+MIIByDCCAW6gAwIBAgIJAP0vC/lirtMJMAkGByqGSM49BAEwQTELMAkGA1UEBhMC
+WFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEMMAoGA1UECgwDQVRTMQ0wCwYDVQQD
+DARyb290MB4XDTE1MDQxMzIwMTEwMloXDTIwMDQxMTIwMTEwMlowQTELMAkGA1UE
+BhMCWFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEMMAoGA1UECgwDQVRTMQ0wCwYD
+VQQDDARyb290MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVRCzxLeGp2zzqqz6
+YTHRJ+sTuEzrFNUUQX/sEb4s1uceiqtTgFJ8kglWGMk/3WIC09PF4aRvkXM+xVvx
+U9EcaKNQME4wHQYDVR0OBBYEFF9E7e3RCj6b4rQeNVTnNHGgRhzvMB8GA1UdIwQY
+MBaAFF9E7e3RCj6b4rQeNVTnNHGgRhzvMAwGA1UdEwQFMAMBAf8wCQYHKoZIzj0E
+AQNJADBGAiEAtKiG3JParqhQz1N+QOGKJtbgFS/qwNpK9FanbC6MOLQCIQD+heQN
+eow8AF4hAUZNYvxyhZDd5FKzF2kRdxJUGkZK8w==
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/ec_keys/ca.key
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/ec_keys/ca.key b/ci/tsqa/files/ec_keys/ca.key
new file mode 100644
index 0000000..275e3e9
--- /dev/null
+++ b/ci/tsqa/files/ec_keys/ca.key
@@ -0,0 +1,8 @@
+-----BEGIN EC PARAMETERS-----
+BggqhkjOPQMBBw==
+-----END EC PARAMETERS-----
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEIKR1N01PYCnkwa07tTnZ3Ri6dsGxu/OlTmExDWS1JIt6oAoGCCqGSM49
+AwEHoUQDQgAEVRCzxLeGp2zzqqz6YTHRJ+sTuEzrFNUUQX/sEb4s1uceiqtTgFJ8
+kglWGMk/3WIC09PF4aRvkXM+xVvxU9EcaA==
+-----END EC PRIVATE KEY-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/ec_keys/intermediate.crt
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/ec_keys/intermediate.crt b/ci/tsqa/files/ec_keys/intermediate.crt
new file mode 100644
index 0000000..2a2fc1d
--- /dev/null
+++ b/ci/tsqa/files/ec_keys/intermediate.crt
@@ -0,0 +1,10 @@
+-----BEGIN CERTIFICATE-----
+MIIBcTCCARcCAQEwCQYHKoZIzj0EATBBMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwM
+RGVmYXVsdCBDaXR5MQwwCgYDVQQKDANBVFMxDTALBgNVBAMMBHJvb3QwHhcNMTUw
+NDEzMjAxMTQ4WhcNMjAwNDExMjAxMTQ4WjBJMQswCQYDVQQGEwJYWDEVMBMGA1UE
+BwwMRGVmYXVsdCBDaXR5MQwwCgYDVQQKDANBVFMxFTATBgNVBAMMDGludGVybWVk
+aWF0ZTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCLloHhXc49EwEI94gb6186J
+zp5mHmEBD49I3pFuQwkVLu249uCsyEnjhoAlMohC/Oc/ROtvZTnujcdBZ2OBh4cw
+CQYHKoZIzj0EAQNJADBGAiEAzevMu2yohbN5dzRp5/TTxKSOrenLh56jtSJrtFai
+/wUCIQDV40abfGSiioLyb5PoyJRPa6M+AhWbK9caa2SQei+KnQ==
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/ec_keys/intermediate.key
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/ec_keys/intermediate.key b/ci/tsqa/files/ec_keys/intermediate.key
new file mode 100644
index 0000000..bb1cdc5
--- /dev/null
+++ b/ci/tsqa/files/ec_keys/intermediate.key
@@ -0,0 +1,8 @@
+-----BEGIN EC PARAMETERS-----
+BggqhkjOPQMBBw==
+-----END EC PARAMETERS-----
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEIMtffsDv9JDl4AFznb1ftzA8IqIVxA344PSpyZU6PfA/oAoGCCqGSM49
+AwEHoUQDQgAEIuWgeFdzj0TAQj3iBvrXzonOnmYeYQEPj0jekW5DCRUu7bj24KzI
+SeOGgCUyiEL85z9E629lOe6Nx0FnY4GHhw==
+-----END EC PRIVATE KEY-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/ec_keys/www.example.com.pem
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/ec_keys/www.example.com.pem b/ci/tsqa/files/ec_keys/www.example.com.pem
new file mode 100644
index 0000000..ee31b56
--- /dev/null
+++ b/ci/tsqa/files/ec_keys/www.example.com.pem
@@ -0,0 +1,15 @@
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEIGCAR+s6Sno+AteQgnMBOsS7sD4EbSxGN7anPQaossvkoAoGCCqGSM49
+AwEHoUQDQgAEwNOf/ym+XidKYjQg2WDM3GPK2eMbRz2VmvdB4dbzBxQ4gMYCIl2l
+2L7lLqGtmUcuUhDaOxf91hhXAfprU+qRvA==
+-----END EC PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIBfDCCASICAQEwCQYHKoZIzj0EATBJMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwM
+RGVmYXVsdCBDaXR5MQwwCgYDVQQKDANBVFMxFTATBgNVBAMMDGludGVybWVkaWF0
+ZTAeFw0xNTA0MTMyMDEzMjlaFw0yMDA0MTEyMDEzMjlaMEwxCzAJBgNVBAYTAlhY
+MRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxDDAKBgNVBAoMA0FUUzEYMBYGA1UEAwwP
+d3d3LmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwNOf/ym+
+XidKYjQg2WDM3GPK2eMbRz2VmvdB4dbzBxQ4gMYCIl2l2L7lLqGtmUcuUhDaOxf9
+1hhXAfprU+qRvDAJBgcqhkjOPQQBA0kAMEYCIQCU7CxO/zdFc4BDUCHO07wVuFe7
+RyiVVJs4llEZTXoBiAIhAIwrXtE2psZBRx/TE7miPunqa+1E4IxrtWn2fkzJyJ57
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/ec_keys/www.test.com.pem
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/ec_keys/www.test.com.pem b/ci/tsqa/files/ec_keys/www.test.com.pem
new file mode 100644
index 0000000..e519276
--- /dev/null
+++ b/ci/tsqa/files/ec_keys/www.test.com.pem
@@ -0,0 +1,15 @@
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEILVRI/Y9isXZJKXwb4srPN4hjx+ZUWGmSL3cn8AEhTVQoAoGCCqGSM49
+AwEHoUQDQgAEh4NjyzcxA2B/b281cUsRHaF+yAUV4CnIhUkPQigXw10GO9lQx69w
+of7PjZkJRdeBlEMBVUcwTKEuENMZ7a3+Tw==
+-----END EC PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIBdzCCAR8CAQEwCQYHKoZIzj0EATBJMQswCQYDVQQGEwJYWDEVMBMGA1UEBwwM
+RGVmYXVsdCBDaXR5MQwwCgYDVQQKDANBVFMxFTATBgNVBAMMDGludGVybWVkaWF0
+ZTAeFw0xNTA0MTMyMDEzMzZaFw0yMDA0MTEyMDEzMzZaMEkxCzAJBgNVBAYTAlhY
+MRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxDDAKBgNVBAoMA0FUUzEVMBMGA1UEAwwM
+d3d3LnRlc3QuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEh4NjyzcxA2B/
+b281cUsRHaF+yAUV4CnIhUkPQigXw10GO9lQx69wof7PjZkJRdeBlEMBVUcwTKEu
+ENMZ7a3+TzAJBgcqhkjOPQQBA0cAMEQCIH083uGRd7b1crw6TH8paBZNeliJTiFU
+eg6lrnGEVIKpAiBtCERpWAlJhYBrR5ApPp6jSoM+Zk6YfswUSg2YR7c4Sg==
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/key.pem
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/key.pem b/ci/tsqa/files/key.pem
new file mode 100644
index 0000000..fddcacb
--- /dev/null
+++ b/ci/tsqa/files/key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDTwZTrWZHXwk71
+fbS62B6ah55jIrH4tdlhAFzRwrAfNkiJh+iTAKQI16QyNnzsNPb777yUF/c9q1KC
+0Dz/Fqevz5NMNso96Gp0i0MDL17/FiA8HP1Fce4FR47D4I/G3Z5oasbDLrJtbeOd
+7/6+bvfCf5nOV2nAYZfAhABL2UWq2aKzH8N+0vx+HOl+n+4hT8pjfeIyI+kQeLwI
+es6xpESXvzuKkqip/Gz53Uk1Me7Uj7AkqCmk6u3KMXUCNgOatGBE7ysmohpQpL7y
+15XYprPB90+SA3Jqhk7s0I88SNaRunZz7YAlCoJLJmYnreJ2CRGaxpKNHHjm8k85
+T8oVUcu5AgMBAAECggEBANFqt8kNGtPDIW1c9Vh3FcUDbFtkW5e42BM7VZBItv8X
+IyOIWjTPRGpOQN87zc2YD85WaCwZi3TcsswV/szTbeDMK0MLSHVzHZzGgO5scclZ
+62Un0j5Uju1/uCv1MJueXuOq/YjX7LOWIq32Q/u3KKWcpdJP1pDgs0A8C0L3zBNK
+PjxnCO0FvJdcpqajEhtepYyTQAtWm/igWbuFgUcfZ55HTOBfBiLdACh6anbCdDJ8
+f2COFRrKu9Gn9mVyRirbyCa4B3VSj4R+WlKsc3erR2vNiEdJLd9x5OK7ZvMFHTvG
+V4BhWt3ffSBRIaVi0pIpYekWbnXjbqY6zjchiy3ruOUCgYEA6W4yBrbExJmelXCj
+dPOp5Ds/uAYaq9TkRLWzX837swPNh1+XJ9xGNgn4d5DbikN1xSdsJO/1dpwk3Uxg
+qE/tEvA2gip/DaxIcj3PfoPtFyebgZItvs5k97zGw9n0bgqoRAezzUl4Guz4AQVV
+Xz+3gICN1lFhRqxKm7Pt8Kc3D5cCgYEA6DrpLJCzOEd8qlhm6w7UGruBRA+QLACu
+zlqzkf4rw1vaXx4cP8ctoCiVWUIsPI0mD2sQvtXAPT8KzZqh3UCu1zyyochyCuVg
+C3fBQiSDtUb2Uk6u7fNFrn36oN7W/Q+sarJvIIECR1PjEGuT3eJppQgJB/VGUZqa
+OQJyTJPXaS8CgYEAskz8o0o51F3u1wEZqbxw+acUDbGD79qGncEYiUZiSqPN+uhW
+IhlL+/zzsAiS2PKcY4KwRSqRGQ89zVeIwSeD06JuUFC7iaseDz0NX/rPP49+ZaNN
+k+A9GUo1nOW/oco8KvKjMVw8BH0bFlSHmGCn/tyy+pBguEXkGzh9uANRuHMCgYAM
+TZKs2b2k7aSdIbHSIib6g5SFlo18x0x7gjKhOWX4I5WeFGpKtrKkGYJQCEFvs8qg
+ZnusoIZeuEhKPDb3EcYxgPW1vHjOOvirotyKNIUFxYynL6P01z6J0ALHIwcgwQPR
+Y0Kf5jXIsZkF9a0PxD70j0hrM4NWL2qcOpTzmaF/4QKBgFYQVrrI6YBxexKQ4J/m
+tG/OKlxef6mzrctu7RJGxzt9ag1IgOi10BMCIKCW7tfvhzzLuBiJ0imEGe+MYrau
+yIWCOVpmwcSnww8bV/25oqRxduVwZzmtZdUJbNSdiZ7jq4tsV9a8TZXts45veSFQ
+X+HWsoFkRoYLOx96mqN94/ZS
+-----END PRIVATE KEY-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/rsa_keys/README.rst
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/rsa_keys/README.rst b/ci/tsqa/files/rsa_keys/README.rst
new file mode 100644
index 0000000..9fb6a8d
--- /dev/null
+++ b/ci/tsqa/files/rsa_keys/README.rst
@@ -0,0 +1,28 @@
+All of these certificates are self-signed and are *not* secure. They are intended
+only for use in testing.
+
+Try to use existing certs if possible rather than generating your own.
+
+# generated using (make sure to set "hostname"):
+openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -nodes && cat key.pem cert.pem > keypair.pem && rm key.pem cert.pem
+
+
+## Since we want to verify all of the certificate verification, we need to generate
+## our own CA and intermediate CA
+# Create CA
+openssl genrsa -out ca.key 4096
+openssl req -new -x509 -nodes -sha1 -days 1825 -key ca.key -out ca.crt
+
+# Create Intermediate
+openssl genrsa -out intermediate.key 4096
+openssl req -new -sha1 -key intermediate.key -out intermediate.csr
+
+# CA signs Intermediate
+openssl x509 -req -days 1825 -in intermediate.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out intermediate.crt
+
+# Create Server
+openssl genrsa -out test.example.com.key 4096
+openssl req -new -key test.example.com.key -out test.example.com.csr
+
+# Intermediate signs Server
+openssl x509 -req -days 1825 -in test.example.com.csr -CA intermediate.crt -CAkey intermediate.key -set_serial 01 -out test.example.com.crt
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/rsa_keys/ca.crt
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/rsa_keys/ca.crt b/ci/tsqa/files/rsa_keys/ca.crt
new file mode 100644
index 0000000..b0ce838
--- /dev/null
+++ b/ci/tsqa/files/rsa_keys/ca.crt
@@ -0,0 +1,30 @@
+-----BEGIN CERTIFICATE-----
+MIIFNzCCAx+gAwIBAgIJAL8yIx0Q66ZXMA0GCSqGSIb3DQEBBQUAMDIxCzAJBgNV
+BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxDDAKBgNVBAoMA0FUUzAeFw0x
+NTA0MTMxODQ5NTNaFw0yMDA0MTExODQ5NTNaMDIxCzAJBgNVBAYTAlhYMRUwEwYD
+VQQHDAxEZWZhdWx0IENpdHkxDDAKBgNVBAoMA0FUUzCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBANYzN4s+B8KAbPxdpMzoVh+xsgPeauothjQq8tQmViT5
+3bnEf7zb+4Wy/7Y9CLj2CSnf6tv271OVwVQZWlDrmqr6greUePz28j3/sJ/lQ9bR
+aZOWQI3d4rgCy6UdJ6rhD2BYrZVFnIZQ5zVZu3rbUBuPwBuRQdTLOWjzcSguyg2R
+jiJ/W2/IToRjgX27cPPArhJQ2ibwsbtvqecj1lQfT5yg8WEDeeOyYwzfT4VEGm7f
+8Q4qrBKxhdRTF6LhNkVKkOM6Jvvq7ULNpSAh1+zFAfzMpPUt1T+sjObQ0HHMeh0J
+ghwOh8OAqFyMAsNdzFwjz4lSrliTMYoq6JdK0In5FUqlCt5RsKrfxsykhvUb66/R
++a9uGboEMlce/sZcxSpnDJYOmxrecQYmEaoKhbIcJBrRqYMgyQL9X+JJfsdyKR2V
+CbSV0FjHeybpOwl76QGoZPhRy2e551uqKN0qdQMmfI3ZjZqmN1EuuOcRNKU8r0He
+AOTRZ2BssDfvs/YWgZsKoHqoLIQCGgWw1ZhsK8bhFKKBtBqbyAu995XxhJezbSAg
+57+1Icp8qmCWvCO0zxm5ckCRNICxGolT/0Mi5Cl8hmfbx9Gv4Na/KEcxpKLPy43t
+UUqfCtvGOUE/S6TWleL5YII4mI86fIOHFkAozdeokcF54lhENpcLL3R5ggRiBJ83
+AgMBAAGjUDBOMB0GA1UdDgQWBBTMx2X9hPjXNTOKTSQELEBv4pEHADAfBgNVHSME
+GDAWgBTMx2X9hPjXNTOKTSQELEBv4pEHADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3
+DQEBBQUAA4ICAQCZ+B8wevb1DsA0XsGkBIHrAK2zc4u54nIhVEw/6PnJBBpV5Eha
+rKtamhyeBjKt1267SaoQIWy/os9QlEYmn2AKn7J0rxqokowr0r8jdh4nDDeCGGkb
+g7ieinIpuUr5Unpp+J+9/FXtrX1m5sXuHlMao9eTK86NoXPJgt4z4HQd1ZaEJp5s
+H60PVd93TwcIDQjbsGdpFS7LhtYSx5Np/LmrQj0tnt18AUh1SgVwvtAqiSsyhxFa
+yPBZKIsdbNQkPoaIKQovCg0cRjlRr1XAk+cfRbf8OUmS1JMs1+/b0zX0kk9xynhj
+4CUPxsVy4SnOeg95yPB8BEyvU1uxnflq3QTJsSxcePYte5ni1wx8Vbn7cJusJRYK
+LNaEFq/nkFxAlP4PTkv9mGq7ZYLqwpE9s6rPmJZc37ti0OUmLiVpqk6DtN5x/TD2
+vKeZMupGCWF71kueR4QAClEnDHe6/lKqe7CH3OuY8bA+7N0RNrEqUBJ7qnD6Frcu
+UfmrkZcIj6DWSnpfwL884WoSCkYuyYP/v+PhR5fSao3l7ZB9UQXdXYhx/Kyd3lPZ
+DKSZjOthCm1dblzKLK4VHy0dmAQdIczIXY6ztIKUY8z0poMNiyJEGeYYPf5jjxU4
+Q2u9W/ReEaza6HshFnoka4IZqlfLinWRoAt92rA+nFIShaBBimvc32kHrQ==
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/rsa_keys/ca.key
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/rsa_keys/ca.key b/ci/tsqa/files/rsa_keys/ca.key
new file mode 100644
index 0000000..d892296
--- /dev/null
+++ b/ci/tsqa/files/rsa_keys/ca.key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/rsa_keys/intermediate.crt
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/rsa_keys/intermediate.crt b/ci/tsqa/files/rsa_keys/intermediate.crt
new file mode 100644
index 0000000..eacc2b9
--- /dev/null
+++ b/ci/tsqa/files/rsa_keys/intermediate.crt
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE7zCCAtcCAQEwDQYJKoZIhvcNAQEFBQAwMjELMAkGA1UEBhMCWFgxFTATBgNV
+BAcMDERlZmF1bHQgQ2l0eTEMMAoGA1UECgwDQVRTMB4XDTE1MDQxMzIwMDI0M1oX
+DTIwMDQxMTIwMDI0M1owSTELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1bHQg
+Q2l0eTEMMAoGA1UECgwDQVRTMRUwEwYDVQQDDAxpbnRlcm1lZGlhdGUwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDe2tfo88v44Tl9TATixb5qmBobnAy/
+oYpaX2St28qNuAC47ftkFaE+4zZIN8IeOAKkMC29ZVxOhXoNWovu4aa9PXdnmatQ
+M/vezta451JE7lVQK0q6dViGyeevBkumgQ2TD+Kj6R2uH5zHDSSVEWEJIb8rTb5i
+1pA4pF4ZLMBLAoZwrQfH9xjNZWSi7UJ0g1eYwRh5ahjl2SBRxSrH6GEUBCuI7S1o
+AvUvj0aDVXmPJEuyrkvw1u566g7DyQ242SnqdZnHVP17g1YmqCbq6qxipb6YKOke
+LBOL1zMKjdVQ3QAbw7Y7RBFcVUdUvoh4uL+IoWr+A8s99OxUhz2kEXU+gjwJtOOR
+keZGzMo9rA9cProwHC414Q++Ct0YhUAO2vTjEhnEvlJFv8cGRYT/Oifwrxny6KTA
+kC+4gwgrJgWR9DHeL814aTnotRUGLLsZAeo+O0al3/0QlN09XDFstkmn/mgaCmbF
+LN9dqwvg1gwS5Hbd+vdlguhcx5mlaI+jZp29CBwBdkkKVAns/3Tne+KpwJIsdRMp
+es+ajkFEZoOc6GVBrW/BjxQ6JBgQA6R4//eWunbMYfhkNY5l9SS1qZak1j9+qWAX
+JcSQVbUxgRSe01MzIqScc2btB8WJbi/IJp+hcdFLDzKYIolT7mRm8Xu6j3M6YF7E
+UaOuyRqoRiIr/wIDAQABMA0GCSqGSIb3DQEBBQUAA4ICAQCk4HQOq4A9cwmrPVk6
+vqR8CmRYiStM76RmLqX3XeVx1GybfvZzK/WYLcwInmXD4iitQflB9S0Ut0ChuLKo
+klj10wdAv6iNrRMUtmY9w8zV8GSLRHZrOo6Rd0affUNjBy79FaNypmdrydc8+M7L
+pGWKVN4qN5cOs/XLFT2TFk8davnyFOucP7kxWeNiZ38Kh8cAYYkovMpfcEJSrMGS
+musUqvAlPVZXDgBjblVHjZ2dvgRCdYFwrMxo14SALOmM1Hi7oWbX5A8uNdeoq8lB
+mwdUBpdWDm6IgJ2aiufOqBV3Mv6AUysLE+qHdP/lTHIHNc0LinuJK10F/jqbf9uY
+gzETU6HT1gQ3X3noDRB2vMMPJQOx8uQX04dfUx8WOmgwCx1X5Vc8gLhH+JbZz1PZ
+GlWgX5VGiGgLkq+rgQBLOLIe/NAnUCXPG78DttQpWMs8JjxEcgnVjLNZNAaWymAl
+U3JzmbX5UZePwEMjKSjKNDraU3Tuq+QTdPr+W2ilJEsLLPbsenc1QTNsPUv5aI8h
+LaayTP7aWMVg0QFfV1O7+vVz5ej7CO7Be7w57VWGDwBBVm81vDbeFna4RJPk2qAw
+K5wOYak0Z27v+0wBXHaceH0j45fn/lixt7FANv9NhB3krcjrUwUsooMAIsnCKAlK
+nQD8ySYdm+OGchPeRVW+MH8FPw==
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/rsa_keys/intermediate.key
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/rsa_keys/intermediate.key b/ci/tsqa/files/rsa_keys/intermediate.key
new file mode 100644
index 0000000..561765f
--- /dev/null
+++ b/ci/tsqa/files/rsa_keys/intermediate.key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/rsa_keys/www.example.com.pem
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/rsa_keys/www.example.com.pem b/ci/tsqa/files/rsa_keys/www.example.com.pem
new file mode 100644
index 0000000..4bc273d
--- /dev/null
+++ b/ci/tsqa/files/rsa_keys/www.example.com.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCrS3J3uL2MNr1Q
+9zL7ODukw8UOHN4AwuWsNSDJzaswrgxtFO3VfJbCfo7CUtojoJY39783m3HnLhPA
+cFxfsSgQ0Z8TdUZYtq2I1p/eEp/A6kdQffHS4To0ueYQ8r1I6pMJTniaDi8ICD0d
+837WwbUUaxx8IhzaFNPrvSdhJb1LGPxj8YvfKvHF9rkwqpJSEAXFCKTa/H0i8wb8
+h3u4cXZmYN6aooai3SY1KGlWZtAfbgTlMMtvB3ZE3JsNNwbL4gfzxYsfXTW9QUZ2
+kT3irmB80koQjzDiW6MpxmLpvDD/NpQWSiR9TDZYCJtACwWyoxqo8gHZVqsF/rkK
+yqkg2cbJAgMBAAECggEAf/ZGtsUdZGdoGdnxDda+R6GvzZEnDy6JYJH3womP/zem
+NL7TxQ3jmbvtbaFzL/ZBAeJjyGipOGglfTby6tFu+tF9oo2TVaZyEK00lDMZgIYD
+bFAJnN2AG+9bvQF5AcWqveMPGRbLb5aoAX3rHQdr/KrfhqP9JbU1cv/FMT9+H2B7
+Spty/WJYOL6AhzN4H4YHJzfhn2e0iMfA3usu1hha84FWWAR3+Z4sphSCtY+edumT
+ygES/j5TAX7nu5Eyqe2L4natuDLXiLEbKEpqyfAg1SmTDqAiHrMtWkWv/e+tdTs8
++DE+wPVhRCjVyjejjvsgDV/d9B805bbpq7M4eyIh+QKBgQDhHPcd+b5KZdXU/PiC
+GQ/5C9elW35t7D8gaCzLAzoxW7B/PnTmVyK+QPBsxaUNg87BxB0TTssNUulSY2nk
+TVemOe57xdJKiX7nOG+9vIZFGxlzqywMz0o6kZe3No8PAcp91K7Xr3RkXdHHwyZY
++NDiUIeMptEnoeEbFZcv+YQ+8wKBgQDCzB/5tD6D8uGKfsiakMs5HGEsYyJNP2b5
+UQ6e1spFg1noMfc5Vj+Av5lF0AE6tELEvJe0J8z2rA9zfHC6JkY/zOGMXrILF0S7
+KSTcxfBUqeE0OUJMkDNy61lRGs5ISul0qcGU473EsBEaxi999GcqzLrB5V4CHZlJ
+EUam9SSqUwKBgQCVkcE/UWh11iO1WD9lcXGDb7LgU2I1dvqadZ0NZh+MG/exE7Zo
+NQ0Ii+0y2D9KM4F0jPEkmv2e5K/R5eu9nQXXlDY4Vr/adnCzAHR+BHzR/adziw/B
+kxkmwQWk3cM/nVkFMgLZm+IhrZRsveUEyI1BUXA+q7fcNVpzvGyvm4GasQKBgEW9
+XMlCLYuB3ht+ToV/xzIYJfYFO9eaFly2F1zomxwN7ZdCpDcD2NJYRiCHWplQxgK3
+Xjyiby/048c9ywHqCAZ5bFqb4HQ2DWZQUaE0wFkfRMA0q7bLfY/sEFsIFMgvAavB
+xstuSZdsTYNfZstaP8FD8KzQWDq7rBBLvhax90F/AoGBANNhkbNxWiUJX/+6VtRj
+u7msBgrUpYQtLkyY+13Ry8cdf+8w1die0LZ4unYjIcAS1ro+XGOc0GASc6pb5dYG
+X+RxTyZzoNazbC6JEsFx9IJLn/L0/8jsg368m1f0Dkptd2LzrLsw2zuY6wm8DrLH
+Re4GALck6zlT+rZNLuN13p5Z
+-----END PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIECTCCAfECAQEwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCWFgxFTATBgNV
+BAcMDERlZmF1bHQgQ2l0eTEMMAoGA1UECgwDQVRTMRUwEwYDVQQDDAxpbnRlcm1l
+ZGlhdGUwHhcNMTUwNDEzMjAwNDA3WhcNMjAwNDExMjAwNDA3WjBMMQswCQYDVQQG
+EwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MQwwCgYDVQQKDANBVFMxGDAWBgNV
+BAMMD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAKtLcne4vYw2vVD3Mvs4O6TDxQ4c3gDC5aw1IMnNqzCuDG0U7dV8lsJ+jsJS
+2iOgljf3vzebcecuE8BwXF+xKBDRnxN1Rli2rYjWn94Sn8DqR1B98dLhOjS55hDy
+vUjqkwlOeJoOLwgIPR3zftbBtRRrHHwiHNoU0+u9J2ElvUsY/GPxi98q8cX2uTCq
+klIQBcUIpNr8fSLzBvyHe7hxdmZg3pqihqLdJjUoaVZm0B9uBOUwy28HdkTcmw03
+BsviB/PFix9dNb1BRnaRPeKuYHzSShCPMOJboynGYum8MP82lBZKJH1MNlgIm0AL
+BbKjGqjyAdlWqwX+uQrKqSDZxskCAwEAATANBgkqhkiG9w0BAQUFAAOCAgEAGrOo
+IRDUjxt65cBR9OZSXRdnL6szAMuNHWlK0MfVtTATWXDKU9S3KjK6seo+ebyaqt1J
+nlyUZ79n6+vU5uSIDANpYQ5Z1DuV5NM2V9o2QiRqExwfgpGUcAXAi0lQ79eA2kzi
+cDgDIpbEAJTFP5/uinaRA9H4KqqfMg5m34tu44A01brb2h/czPOWxD89mKKbtS9H
+ODPkDkq3wTUG/F0RQvfFC6Na8IWkW0jijDBxuFeSbRV00GH3/wpMBcxDuIcKBJcy
+tFrXjCFKzop7djU7OuxEnqQdlgiHgQsszjnLP0k5Lz9CrNG7W+zqmYsvO6s6a94Z
+8lHuwl9GAS/IFQS+c+PsPT7uxgSfbdFHWlmOv1+p/PsPaAQ4Hu/ugga8AjMYoyHg
+V6LBCTbUK7aA3lnu6+EW3qpGve6Z2H1D+B5V8ZXLuA6ooIS80CN9xw6jFcAXcUv8
+pNw/sJDnErzRbxsOPKeLl2EjJ/1/MsQf5DNp3xPFyhv5l3oOxodICEr4eeudGmAW
+OGp21xqo7i3K8YQ6GDMPF6RVX4mOCxY5L9qf+VDLYx8AV9gFZ+VWG8we7jyruqxE
+DwetsfCtwXo5gho9p+K8VHA7nWukydBNiekPFD6S6gBu0vMZxIfW/AKolWgxmyPz
+zZhR8034yoSR6qxuh+as+JpXmw+3MypZ5G/1S54=
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/51ea4aa9/ci/tsqa/files/rsa_keys/www.test.com.pem
----------------------------------------------------------------------
diff --git a/ci/tsqa/files/rsa_keys/www.test.com.pem b/ci/tsqa/files/rsa_keys/www.test.com.pem
new file mode 100644
index 0000000..5a0cfa7
--- /dev/null
+++ b/ci/tsqa/files/rsa_keys/www.test.com.pem
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDUiFw0p0JOfm/G
+0YHivkd5v5Xu5tkBWETu9NgKLr7MkEBeqb1fjkm8Gd1IsndoYh0R/tkRzdE6O+lN
+WjMgEuCtz+5zblBQ9xDMwAKI+1YhudqrwIxqXBzpyvAAZwU5EHftog/WiEDvJPM0
+XEQsx6142kgVR5NfNX6HWHOL8H86j7Yfbdd0Knu0Qv9tulC8aeBbZ+pKU0/cBCVi
+ljr8OFdrCZu1EkKIat3oBjdbEF4boh4gNSsxbX+89uW4SZYR/G4xEX4VZJLMsloG
+YOkcOLTV90+VDbbdrZsnmgQgpKBlp2NBdSx7MZQRU5De3PMBzo2uoIvmwXS9ZxtT
+Lr+/dpxZAgMBAAECggEANh1uVN3NrUzWSypnRwOqEV7t30GaOZRvIOTo6VbTsCR+
+r1vK4zzIm4N+a5c9fi+VNVLNlJHyV0CP++keoWkNGlSaY3vQKX1vIqM1Qgm0+atn
++Vlyp1ZC6miIyaFxnAEMeE5OeBKDbiDbaBaiKUDCc8Yomnp6FMD7MZ0c9qHK027z
+DL0kYjxjVgYiDnE1fJ1ZV466IcyDnGDky2ebjjvvTI7c55tbrEc+VRZdC5Cn5Yb/
+desjXGAb5snEbdAiNqCgIG9bLw3hHWsn0wCkUPRcEMoSZ73taak54vC7cPda7/D5
+aetzsNQWCMZC5NZ74JD5kyC3xBr7TAarQ5OXsJ0DMQKBgQD8GTQdc2MHvA+4nCpp
+0Xy3J7gOCI63FWETZgw22sboqk1toF/LFQHYY40EdvEkFsqc6zTm09QK8y8G48sC
+j8pvskhO2M9EgLegzPQv6NY0pTqltI0Ye7w9I3FTKNZIJW+XokDEFFqu+lXqf80i
+BRmoUrltoS8L5XB/z5GoNMdk7QKBgQDX0mZSYdjPgTDWDSTCdEOcGB4bjAZzXDTu
+ukYhri0vuStZ51giAWUlbBnN/hlvln5bULqZFnB5svFRujTIwwevxzhSl45aiNl1
+vE8zsRS0bNeNyjjF6HX0HOEuAQtre/k+WHvEH3mnFR1Zngwbrt4CJyuadlCmj7yw
+jv/DVIyznQKBgAbmobiUqgdSLJP/ImIXK/TPj4hCz7VPToL7biYqQvunfcsccsLa
+ZlyIDRosL1mvjghRn/cZoVpTYdwsbCg7y2zXUodmA/Z6F4y9T4noM8TpKPvUP3CG
+IpcB215NZeA/thhOhrtXW0wi6isrKHBf913WNeE8Yk9PDo9RHUmfeD3ZAoGBAJGn
+t9LFopN4t0LfH/30hWSlijxBJmFYy4iKQqacbHaW28ETNxHMKz00Vb4GTZhX0vNB
+6o1C7anUsLTdnJ4ZsehZ5ZMoIbTMQycIbdOPIVAbXOaeoe4/UsvrabWoktJ5mt8O
+zIiyTWIMCADhf353Z/HACdd3HjsrKsdl2wsy1rqpAoGBAOaNsxoyw/BIn/wvkQRs
+YyYXLb8zECO17ad4M+aFsnf7yLY8i3k80JRfjqxis/yrePNuVKHiZYgEvLNBMdJi
+j3YSMgXHYSgYti73+zBcy1uVVlUR5Q2HnihFX5Ho1IAQbC+TXzUCnLOEoR/IIHIz
++qWsoHgJD98ie3cjys0WujpH
+-----END PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIEBjCCAe4CAQEwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCWFgxFTATBgNV
+BAcMDERlZmF1bHQgQ2l0eTEMMAoGA1UECgwDQVRTMRUwEwYDVQQDDAxpbnRlcm1l
+ZGlhdGUwHhcNMTUwNDEzMjAwNDE0WhcNMjAwNDExMjAwNDE0WjBJMQswCQYDVQQG
+EwJYWDEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MQwwCgYDVQQKDANBVFMxFTATBgNV
+BAMMDHd3dy50ZXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANSIXDSnQk5+b8bRgeK+R3m/le7m2QFYRO702AouvsyQQF6pvV+OSbwZ3Uiyd2hi
+HRH+2RHN0To76U1aMyAS4K3P7nNuUFD3EMzAAoj7ViG52qvAjGpcHOnK8ABnBTkQ
+d+2iD9aIQO8k8zRcRCzHrXjaSBVHk181fodYc4vwfzqPth9t13Qqe7RC/226ULxp
+4Ftn6kpTT9wEJWKWOvw4V2sJm7USQohq3egGN1sQXhuiHiA1KzFtf7z25bhJlhH8
+bjERfhVkksyyWgZg6Rw4tNX3T5UNtt2tmyeaBCCkoGWnY0F1LHsxlBFTkN7c8wHO
+ja6gi+bBdL1nG1Muv792nFkCAwEAATANBgkqhkiG9w0BAQUFAAOCAgEARQSyOqxM
+ecr1SvIu65yZbOPq29343KewRs39ZbjsEbmm5SMdFs7asWHtbD6iiU3mPzqAG0Y3
+i+S98J7xwSvAnWERVNzWhymCu7MQ/mKM9WZWDRGUshFgaYpWDqjw2a/qVC54f/Ye
+OaeDqzWc96Ib0khZdE+IyqpLdclxagVHv0cJOQwqhKOkIDQGEeBTc8AA/luOnC8d
+tE9s8IwTmGpZPYY+kwGVbaLKPanONGDiZM5IyZbBgb9Dq3wL/5DXvQApid37BzHJ
+ceT/gKDQljXOSWacxCPUSNb6aut5ivfbd9w7kXdTZL9UcS+FGPNXQ2z1yu3VaqJV
+MTSfSW5KUHKVLwDsp9hvBpid8S3TpQLeGt68wXoHxvh5PMnsgdA4JxsOTTwKP/gE
+rYhockBGuftKOaRqlRn4+n/nSfLogYoD+32S6ZMBJpPuMBXODiezsP+eAb+wqrV7
+4tiKJC70YNVL7XMdmsDtxj8lcY+aouREnd2+Iutr+YrCM5ZIOKAq57Ib4qTNV3Is
+F0KDEHRBpiS9hcGYzhg39Dovc6RHc6QRqKVrfZfE3jKXfCtefcqceIsh3jH51ONI
+sudX6SOv76PMjnAj0uqF8Kw6YVzLO/MGbAyGilIXYc18GdRWL4gqj9Z9BiLuNcZU
+8AhkHaBWKOHEtVZ8ueEkRBS3I0JZZ8ZKlTM=
+-----END CERTIFICATE-----