Skip to content

Commit

Permalink
Integration tests predicate on source version check
Browse files Browse the repository at this point in the history
  • Loading branch information
dichn committed Apr 18, 2022
1 parent 921713e commit 591c365
Show file tree
Hide file tree
Showing 3 changed files with 330 additions and 27 deletions.
45 changes: 45 additions & 0 deletions tests/conftest.py
Expand Up @@ -4,6 +4,7 @@

import boto3
import pytest
import requests


def get_distribution_url(stack_name):
Expand All @@ -30,6 +31,11 @@ def pytest_addoption(parser):
action="store",
help="enable integration tests against this lambda stack",
)
parser.addoption(
"--src-version",
action="store",
help="enable lambda source version validation",
)


@pytest.fixture
Expand All @@ -47,6 +53,17 @@ def cdn_test_url(request):
return url


@pytest.fixture
def src_version(request):
if request.config.getoption("--src-version"):
version = request.config.getoption("--src-version")
elif os.environ.get("CODEBUILD_RESOLVED_SOURCE_VERSION"):
version = os.environ.get("CODEBUILD_RESOLVED_SOURCE_VERSION")
else:
pytest.skip("Test skipped because failed to get lambda version")
return version


def mock_conf_file():
temp_file = tempfile.NamedTemporaryFile(prefix="lambda_unittests_")

Expand Down Expand Up @@ -105,3 +122,31 @@ def dummy_private_key():
K8PZxUBy9cZ0KOEpAkA1b7cZpW40ZowMvAH6sF+7Ok1NFd+08AMXLiSJ6z7Sk29s
UrfAc2T6ZnfNC4qLIaDyo87CzVG/wk1Upr21z0YD
-----END RSA PRIVATE KEY-----"""


class VersionCheckingAdapter(requests.adapters.HTTPAdapter):
def __init__(self, expected_version):
self.expected_version = expected_version
super().__init__()

def send(self, request, *args, **kwargs):
request.headers["X-Exodus-Query"] = "1"
response = super().send(request, *args, **kwargs)

version = response.headers["X-Exodus-Version"]
if self.expected_version not in version:
raise AssertionError(
"Expected to run against version %s but server sent X-Exodus-Version: %s"
% (self.expected_version, version)
)
return response


@pytest.fixture
def requests_session(src_version):
session = requests.Session()
if src_version:
# we have an expected version, mount an adapter which
# will check for that version
session.mount("https://", VersionCheckingAdapter(src_version))
return session
255 changes: 255 additions & 0 deletions tests/integration/test_exodus.backup
@@ -0,0 +1,255 @@
import json
import re

import pytest
import requests

from ..test_utils.utils import generate_test_cookies

TEST_COOKIES = generate_test_cookies()


def test_exodus_basic(cdn_test_url, src_version):
url = (
cdn_test_url
+ "/content/aus/rhel/server/6/6.5/x86_64/os/Packages/c/cpio-2.10-12.el6_5.x86_64.rpm"
)
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
r = ses.get(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert src_version in r.headers["x-exodus-version"]
assert r.status_code == 200
assert "cache-control" not in r.headers


def test_header_not_exist_file(cdn_test_url):
url = (
cdn_test_url
+ "/content/aus/rhel/server/6/6.5/x86_64/os/Packages/c/cpio-2.10-12.el6_5.x86_64.rpm_not_exist" # noqa: E501
)
r = requests.get(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 404
assert "cache-control" not in r.headers


# Test data for exodus-lambda
# serving repo entry points with appropriate cache headers
testdata_cache_control_path = [
"/content/dist/rhel/server/5/5.7/listing",
"/content/dist/rhel/server/7/7.2/x86_64/rhev-mgmt-agent/3/os/repodata/repomd.xml",
"/content/dist/rhel/atomic/7/7Server/x86_64/ostree/repo/refs/heads/rhel-atomic-host/7/x86_64/standard", # noqa: E501
]


# Skip the version check
# because listing request does not support "x-exodus-query" header
@pytest.mark.parametrize("testdata_path", testdata_cache_control_path)
def test_header_cache_control(cdn_test_url, testdata_path):
url = cdn_test_url + testdata_path
r = requests.get(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert re.match("^max-age=[0-9]+$", r.headers["cache-control"])


def test_header_want_digest_GET(cdn_test_url, src_version):
url = (
cdn_test_url
+ "/content/dist/rhel/server/7/7.2/x86_64/rhev-mgmt-agent/3/os/repodata/repomd.xml"
)
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
ses.headers["want-digest"] = "id-sha-256"
r = ses.get(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert (
r.headers["digest"]
== "id-sha-256=hYGantfjJjDl4O5HesjPpwtIG2V5vWIuIOfuki9ThDk="
)


def test_header_want_digest_HEAD(cdn_test_url, src_version):
url = (
cdn_test_url
+ "/content/dist/rhel/server/7/7.2/x86_64/rhev-mgmt-agent/3/os/repodata/repomd.xml"
)
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
ses.headers["want-digest"] = "id-sha-256"
r = ses.head(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert (
r.headers["digest"]
== "id-sha-256=hYGantfjJjDl4O5HesjPpwtIG2V5vWIuIOfuki9ThDk="
)


# Test data for exodus-lambda
# serving yum repodata with correct Content-Type
testdata_content_type_path = [
"/content/dist/rhel/server/7/7.4/x86_64/os/repodata/fd23895d43f54a50bbd0509809dd5f45298bfd6b-other.sqlite.bz2", # noqa: E501
"/content/dist/rhel/server/7/7.4/x86_64/os/repodata/cb753af26534673064bd593500d747d7288d75b2-filelists.xml.gz", # noqa: E501
"/content/dist/rhel/server/7/7.2/x86_64/rhev-mgmt-agent/3/os/repodata/repomd.xml",
]


def assert_content_type(url, content_type):
if url.endswith("repomd.xml"):
assert content_type == "application/xml"
elif url.endswith(".gz"):
assert content_type == "application/x-gzip"
elif url.endswith(".bz2"):
assert content_type == "application/x-bzip"
else:
raise ValueError("invalid test data format")


@pytest.mark.parametrize("testdata_path", testdata_content_type_path)
def test_content_type_header_GET(cdn_test_url, testdata_path, src_version):
url = cdn_test_url + testdata_path
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
r = ses.get(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert_content_type(url, r.headers["Content-Type"])


@pytest.mark.parametrize("testdata_path", testdata_content_type_path)
def test_content_type_header_HEAD(cdn_test_url, testdata_path, src_version):
url = cdn_test_url + testdata_path
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
r = ses.head(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert_content_type(url, r.headers["Content-Type"])


testdata_origin_alias_path = [
"/origin/rpms/bash/4.4.19/8.el8_0/fd431d51/bash-4.4.19-8.el8_0.x86_64.rpm",
"/origin/rpm/bash/4.4.19/8.el8_0/fd431d51/bash-4.4.19-8.el8_0.x86_64.rpm",
"/content/origin/rpms/bash/4.4.19/8.el8_0/fd431d51/bash-4.4.19-8.el8_0.x86_64.rpm",
"/content/origin/rpm/bash/4.4.19/8.el8_0/fd431d51/bash-4.4.19-8.el8_0.x86_64.rpm",
]


# use Want-Digest/Digest to check if alias take effect
@pytest.mark.parametrize("testdata_path", testdata_origin_alias_path)
def test_origin_path_alias(cdn_test_url, testdata_path, src_version):
url = cdn_test_url + testdata_path
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
ses.headers["want-digest"] = "id-sha-256"
r = ses.head(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert (
r.headers["digest"]
== "id-sha-256=QWT/LAEW1mZXi6XkVqsDuIeI37QvuT/JGywdpwnYZoY="
)


testdata_rhui_alias_path_aus = [
"/content/aus/rhel/server/6/6.5/x86_64/os/Packages/c/cpio-2.10-12.el6_5.x86_64.rpm",
"/content/aus/rhel/rhui/server/6/6.5/x86_64/os/Packages/c/cpio-2.10-12.el6_5.x86_64.rpm",
]


@pytest.mark.parametrize("testdata_path", testdata_rhui_alias_path_aus)
def test_rhui_path_alias_aus(cdn_test_url, testdata_path, src_version):
url = cdn_test_url + testdata_path
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
ses.headers["want-digest"] = "id-sha-256"
r = ses.head(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert (
r.headers["digest"]
== "id-sha-256=BjFlOLkNOqsg9HhxMjB/bTMNqaSLqxGhPgphb89iLOU="
)


testdata_rhui_alias_path_rhel8 = [
"/content/dist/rhel8/8.1/x86_64/baseos/os/Packages/i/iptables-1.8.2-16.el8.x86_64.rpm",
"/content/dist/rhel8/rhui/8.1/x86_64/baseos/os/Packages/i/iptables-1.8.2-16.el8.x86_64.rpm",
]


@pytest.mark.parametrize("testdata_path", testdata_rhui_alias_path_rhel8)
def test_rhui_path_alias_rhel8(cdn_test_url, testdata_path, src_version):
url = cdn_test_url + testdata_path
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
ses.headers["want-digest"] = "id-sha-256"
r = ses.head(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert (
r.headers["digest"]
== "id-sha-256=WA2MMEwPzpikfPAoOEnl6ffo9ce9p2aSEkl2UEaUfkA="
)


testdata_releasever_alias_rhel6 = [
"/content/dist/rhel/server/6/6.10/x86_64/os/Packages/c/cpio-2.10-12.el6_5.x86_64.rpm",
"/content/dist/rhel/server/6/6Server/x86_64/os/Packages/c/cpio-2.10-12.el6_5.x86_64.rpm",
]


@pytest.mark.parametrize("testdata_path", testdata_releasever_alias_rhel6)
def test_releasever_alias_rhel6(cdn_test_url, testdata_path, src_version):
url = cdn_test_url + testdata_path
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
ses.headers["want-digest"] = "id-sha-256"
r = ses.head(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert (
r.headers["digest"]
== "id-sha-256=BjFlOLkNOqsg9HhxMjB/bTMNqaSLqxGhPgphb89iLOU="
)


testdata_no_content_type = [
"/content/dist/rhel8/8.2/x86_64/baseos/iso/rhel-8.2-x86_64-boot.iso"
]


@pytest.mark.parametrize("testdata_path", testdata_no_content_type)
def test_no_content_type(cdn_test_url, testdata_path, src_version):
url = cdn_test_url + testdata_path
ses = requests.session()
ses.headers["x-exodus-query"] = "true"
r = ses.get(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 200
assert src_version in r.headers["x-exodus-version"]
assert r.headers["Content-Type"] == "application/octet-stream"


testdata_absent_item = [
"/content/dist/rhel8/8.2/x86_64/baseos/iso/does-not-exist.iso"
]


@pytest.mark.parametrize("testdata_path", testdata_absent_item)
def test_absent_item(cdn_test_url, testdata_path):
url = cdn_test_url + testdata_path
r = requests.get(url, cookies=TEST_COOKIES)
print(json.dumps(dict(r.headers), indent=2))
assert r.status_code == 404

0 comments on commit 591c365

Please sign in to comment.