summaryrefslogtreecommitdiffstats
path: root/roles/openshift_certificate_expiry/test
diff options
context:
space:
mode:
Diffstat (limited to 'roles/openshift_certificate_expiry/test')
-rw-r--r--roles/openshift_certificate_expiry/test/conftest.py119
-rw-r--r--roles/openshift_certificate_expiry/test/test_fakeopensslclasses.py90
-rw-r--r--roles/openshift_certificate_expiry/test/test_load_and_handle_cert.py67
3 files changed, 0 insertions, 276 deletions
diff --git a/roles/openshift_certificate_expiry/test/conftest.py b/roles/openshift_certificate_expiry/test/conftest.py
deleted file mode 100644
index df948fff0..000000000
--- a/roles/openshift_certificate_expiry/test/conftest.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# pylint: disable=missing-docstring,invalid-name,redefined-outer-name
-import pytest
-from OpenSSL import crypto
-
-# Parameter list for valid_cert fixture
-VALID_CERTIFICATE_PARAMS = [
- {
- 'short_name': 'client',
- 'cn': 'client.example.com',
- 'serial': 4,
- 'uses': b'clientAuth',
- 'dns': [],
- 'ip': [],
- },
- {
- 'short_name': 'server',
- 'cn': 'server.example.com',
- 'serial': 5,
- 'uses': b'serverAuth',
- 'dns': ['kubernetes', 'openshift'],
- 'ip': ['10.0.0.1', '192.168.0.1']
- },
- {
- 'short_name': 'combined',
- 'cn': 'combined.example.com',
- # Verify that HUGE serials parse correctly.
- # Frobs PARSING_HEX_SERIAL in _parse_cert
- # See https://bugzilla.redhat.com/show_bug.cgi?id=1464240
- 'serial': 14449739080294792594019643629255165375,
- 'uses': b'clientAuth, serverAuth',
- 'dns': ['etcd'],
- 'ip': ['10.0.0.2', '192.168.0.2']
- }
-]
-
-# Extract the short_name from VALID_CERTIFICATE_PARAMS to provide
-# friendly naming for the valid_cert fixture
-VALID_CERTIFICATE_IDS = [param['short_name'] for param in VALID_CERTIFICATE_PARAMS]
-
-
-@pytest.fixture(scope='session')
-def ca(tmpdir_factory):
- ca_dir = tmpdir_factory.mktemp('ca')
-
- key = crypto.PKey()
- key.generate_key(crypto.TYPE_RSA, 2048)
-
- cert = crypto.X509()
- cert.set_version(3)
- cert.set_serial_number(1)
- cert.get_subject().commonName = 'test-signer'
- cert.gmtime_adj_notBefore(0)
- cert.gmtime_adj_notAfter(24 * 60 * 60)
- cert.set_issuer(cert.get_subject())
- cert.set_pubkey(key)
- cert.add_extensions([
- crypto.X509Extension(b'basicConstraints', True, b'CA:TRUE, pathlen:0'),
- crypto.X509Extension(b'keyUsage', True,
- b'digitalSignature, keyEncipherment, keyCertSign, cRLSign'),
- crypto.X509Extension(b'subjectKeyIdentifier', False, b'hash', subject=cert)
- ])
- cert.add_extensions([
- crypto.X509Extension(b'authorityKeyIdentifier', False, b'keyid:always', issuer=cert)
- ])
- cert.sign(key, 'sha256')
-
- return {
- 'dir': ca_dir,
- 'key': key,
- 'cert': cert,
- }
-
-
-@pytest.fixture(scope='session',
- ids=VALID_CERTIFICATE_IDS,
- params=VALID_CERTIFICATE_PARAMS)
-def valid_cert(request, ca):
- common_name = request.param['cn']
-
- key = crypto.PKey()
- key.generate_key(crypto.TYPE_RSA, 2048)
-
- cert = crypto.X509()
- cert.set_serial_number(request.param['serial'])
- cert.gmtime_adj_notBefore(0)
- cert.gmtime_adj_notAfter(24 * 60 * 60)
- cert.set_issuer(ca['cert'].get_subject())
- cert.set_pubkey(key)
- cert.set_version(3)
- cert.get_subject().commonName = common_name
- cert.add_extensions([
- crypto.X509Extension(b'basicConstraints', True, b'CA:FALSE'),
- crypto.X509Extension(b'keyUsage', True, b'digitalSignature, keyEncipherment'),
- crypto.X509Extension(b'extendedKeyUsage', False, request.param['uses']),
- ])
-
- if request.param['dns'] or request.param['ip']:
- san_list = ['DNS:{}'.format(common_name)]
- san_list.extend(['DNS:{}'.format(x) for x in request.param['dns']])
- san_list.extend(['IP:{}'.format(x) for x in request.param['ip']])
-
- cert.add_extensions([
- crypto.X509Extension(b'subjectAltName', False, ', '.join(san_list).encode('utf8'))
- ])
- cert.sign(ca['key'], 'sha256')
-
- cert_contents = crypto.dump_certificate(crypto.FILETYPE_PEM, cert)
- cert_file = ca['dir'].join('{}.crt'.format(common_name))
- cert_file.write_binary(cert_contents)
-
- return {
- 'common_name': common_name,
- 'serial': request.param['serial'],
- 'dns': request.param['dns'],
- 'ip': request.param['ip'],
- 'uses': request.param['uses'],
- 'cert_file': cert_file,
- 'cert': cert
- }
diff --git a/roles/openshift_certificate_expiry/test/test_fakeopensslclasses.py b/roles/openshift_certificate_expiry/test/test_fakeopensslclasses.py
deleted file mode 100644
index 8a521a765..000000000
--- a/roles/openshift_certificate_expiry/test/test_fakeopensslclasses.py
+++ /dev/null
@@ -1,90 +0,0 @@
-'''
- Unit tests for the FakeOpenSSL classes
-'''
-import os
-import subprocess
-import sys
-
-import pytest
-
-MODULE_PATH = os.path.realpath(os.path.join(__file__, os.pardir, os.pardir, 'library'))
-sys.path.insert(1, MODULE_PATH)
-
-# pylint: disable=import-error,wrong-import-position,missing-docstring
-# pylint: disable=invalid-name,redefined-outer-name
-from openshift_cert_expiry import FakeOpenSSLCertificate # noqa: E402
-
-
-@pytest.fixture(scope='module')
-def fake_valid_cert(valid_cert):
- cmd = ['openssl', 'x509', '-in', str(valid_cert['cert_file']), '-text',
- '-nameopt', 'oneline']
- cert = subprocess.check_output(cmd)
- return FakeOpenSSLCertificate(cert.decode('utf8'))
-
-
-def test_not_after(valid_cert, fake_valid_cert):
- ''' Validate value returned back from get_notAfter() '''
- real_cert = valid_cert['cert']
-
- # Internal representation of pyOpenSSL is bytes, while FakeOpenSSLCertificate
- # is text, so decode the result from pyOpenSSL prior to comparing
- assert real_cert.get_notAfter().decode('utf8') == fake_valid_cert.get_notAfter()
-
-
-def test_serial(valid_cert, fake_valid_cert):
- ''' Validate value returned back form get_serialnumber() '''
- real_cert = valid_cert['cert']
- assert real_cert.get_serial_number() == fake_valid_cert.get_serial_number()
-
-
-def test_get_subject(valid_cert, fake_valid_cert):
- ''' Validate the certificate subject '''
-
- # Gather the subject components and create a list of colon separated strings.
- # Since the internal representation of pyOpenSSL uses bytes, we need to decode
- # the results before comparing.
- c_subjects = valid_cert['cert'].get_subject().get_components()
- c_subj = ', '.join(['{}:{}'.format(x.decode('utf8'), y.decode('utf8')) for x, y in c_subjects])
- f_subjects = fake_valid_cert.get_subject().get_components()
- f_subj = ', '.join(['{}:{}'.format(x, y) for x, y in f_subjects])
- assert c_subj == f_subj
-
-
-def get_san_extension(cert):
- # Internal representation of pyOpenSSL is bytes, while FakeOpenSSLCertificate
- # is text, so we need to set the value to search for accordingly.
- if isinstance(cert, FakeOpenSSLCertificate):
- san_short_name = 'subjectAltName'
- else:
- san_short_name = b'subjectAltName'
-
- for i in range(cert.get_extension_count()):
- ext = cert.get_extension(i)
- if ext.get_short_name() == san_short_name:
- # return the string representation to compare the actual SAN
- # values instead of the data types
- return str(ext)
-
- return None
-
-
-def test_subject_alt_names(valid_cert, fake_valid_cert):
- real_cert = valid_cert['cert']
-
- san = get_san_extension(real_cert)
- f_san = get_san_extension(fake_valid_cert)
-
- assert san == f_san
-
- # If there are either dns or ip sans defined, verify common_name present
- if valid_cert['ip'] or valid_cert['dns']:
- assert 'DNS:' + valid_cert['common_name'] in f_san
-
- # Verify all ip sans are present
- for ip in valid_cert['ip']:
- assert 'IP Address:' + ip in f_san
-
- # Verify all dns sans are present
- for name in valid_cert['dns']:
- assert 'DNS:' + name in f_san
diff --git a/roles/openshift_certificate_expiry/test/test_load_and_handle_cert.py b/roles/openshift_certificate_expiry/test/test_load_and_handle_cert.py
deleted file mode 100644
index 98792e2ee..000000000
--- a/roles/openshift_certificate_expiry/test/test_load_and_handle_cert.py
+++ /dev/null
@@ -1,67 +0,0 @@
-'''
- Unit tests for the load_and_handle_cert method
-'''
-import datetime
-import os
-import sys
-
-import pytest
-
-MODULE_PATH = os.path.realpath(os.path.join(__file__, os.pardir, os.pardir, 'library'))
-sys.path.insert(1, MODULE_PATH)
-
-# pylint: disable=import-error,wrong-import-position,missing-docstring
-# pylint: disable=invalid-name,redefined-outer-name
-import openshift_cert_expiry # noqa: E402
-
-# TODO: More testing on the results of the load_and_handle_cert function
-# could be implemented here as well, such as verifying subjects
-# match up.
-
-
-@pytest.fixture(params=['OpenSSLCertificate', 'FakeOpenSSLCertificate'])
-def loaded_cert(request, valid_cert):
- """ parameterized fixture to provide load_and_handle_cert results
- for both OpenSSL and FakeOpenSSL parsed certificates
- """
- now = datetime.datetime.now()
-
- openshift_cert_expiry.HAS_OPENSSL = request.param == 'OpenSSLCertificate'
-
- # valid_cert['cert_file'] is a `py.path.LocalPath` object and
- # provides a read_text() method for reading the file contents.
- cert_string = valid_cert['cert_file'].read_text('utf8')
-
- (subject,
- expiry_date,
- time_remaining,
- serial) = openshift_cert_expiry.load_and_handle_cert(cert_string, now)
-
- return {
- 'now': now,
- 'subject': subject,
- 'expiry_date': expiry_date,
- 'time_remaining': time_remaining,
- 'serial': serial,
- }
-
-
-def test_serial(loaded_cert, valid_cert):
- """Params:
-
- * `loaded_cert` comes from the `loaded_cert` fixture in this file
- * `valid_cert` comes from the 'valid_cert' fixture in conftest.py
- """
- valid_cert_serial = valid_cert['cert'].get_serial_number()
- assert loaded_cert['serial'] == valid_cert_serial
-
-
-def test_expiry(loaded_cert):
- """Params:
-
- * `loaded_cert` comes from the `loaded_cert` fixture in this file
- """
- expiry_date = loaded_cert['expiry_date']
- time_remaining = loaded_cert['time_remaining']
- now = loaded_cert['now']
- assert expiry_date == now + time_remaining