[Libosinfo] [osinfo-db PATCH 2/4] tests: Add media tests
Fabiano Fidêncio
fidencio at redhat.com
Wed Mar 13 20:44:28 UTC 2019
Media tests, at least for now, consist only in the equivalent of
test-mediauris.c from libosinfo and behaves in the same way, being
executed only if OSINFO_DB_NETWORK_TESTS is set.
Signed-off-by: Fabiano Fidêncio <fidencio at redhat.com>
---
.gitignore | 5 ++++-
Makefile | 17 ++++++++++++++-
tests/unit/__init__.py | 0
tests/unit/osinfo.py | 45 ++++++++++++++++++++++++++++++++++++++++
tests/unit/test_media.py | 20 ++++++++++++++++++
tests/unit/util.py | 37 +++++++++++++++++++++++++++++++++
6 files changed, 122 insertions(+), 2 deletions(-)
create mode 100644 tests/unit/__init__.py
create mode 100644 tests/unit/osinfo.py
create mode 100644 tests/unit/test_media.py
create mode 100644 tests/unit/util.py
diff --git a/.gitignore b/.gitignore
index 27200ed..0f17e4a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,8 +6,11 @@ po/osinfo-db.pot
data/*/*/*.xml
data/*/*/*/*.xml
data/schema/osinfo.rng
+tests/*/__pycache__
+tests/*/*.log
+.pytest_cache
*~
#*
osinfo-db-*.tar.xz
osinfo-db.spec
-mingw-osinfo-db.spec
\ No newline at end of file
+mingw-osinfo-db.spec
diff --git a/Makefile b/Makefile
index 1367de3..d8e0f87 100644
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,8 @@ GETTEXT_PACKAGE = osinfo-db
SED = sed
+TEE = tee
+
DATA_FILES_IN = $(wildcard $(VPATH)/data/*/*/*.xml.in) $(wildcard $(VPATH)/data/*/*/*/*.xml.in)
DATA_FILES = $(DATA_FILES_IN:$(VPATH)/%.in=%)
@@ -32,6 +34,8 @@ ZANATA = zanata
XMLLINT = xmllint
+PYTHON = python3
+
V = 0
V_I18N = $(V_I18N_$(V))
@@ -125,4 +129,15 @@ lint: $(DATA_FILES) $(SCHEMA_FILES)
fi; \
done
-check: lint
+unit-tests: $(DATA_FILES)
+ @command -v $(PYTHON) > /dev/null; \
+ if [ $$? -eq 0 ] ; then \
+ for file in tests/unit/test_*.py; do \
+ log_file=`echo $$file | $(SED) -e 's/\.py/.log/'`; \
+ INTERNAL_OSINFO_DB_DATA_DIR=data $(PYTHON) -m pytest -s $$file --log-level=info | $(TEE) $$log_file; \
+ done; \
+ else \
+ echo "unit-tests are not going to be executed as no $(PYTHON) has been found"; \
+ fi
+
+check: lint unit-tests
diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/unit/osinfo.py b/tests/unit/osinfo.py
new file mode 100644
index 0000000..e54dc3c
--- /dev/null
+++ b/tests/unit/osinfo.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+
+import logging
+import requests
+from http.client import responses
+
+
+class Os():
+ def __init__(self, root):
+ self._root = root
+
+ def _get_medias(self):
+ medias = []
+ for media in self._root.findall('media'):
+ medias.append(Media(media))
+ return medias
+ medias = property(_get_medias)
+
+ def _get_shortid(self):
+ shortid = self._root.find('short-id')
+ return shortid.text
+ shortid = property(_get_shortid)
+
+
+class Media():
+ def __init__(self, root):
+ self._root = root
+
+ def _get_url(self):
+ url = self._root.find('url')
+ if url is not None:
+ return URL(url.text)
+ url = property(_get_url)
+
+
+class URL():
+ def __init__(self, url):
+ self._url = url
+
+ def check(self):
+ logging.info("url: %s" % self._url)
+ response = requests.head(self._url, allow_redirects=True)
+ logging.info("response: %s; code: %d" %
+ (responses[response.status_code], response.status_code))
+ return response.ok
diff --git a/tests/unit/test_media.py b/tests/unit/test_media.py
new file mode 100644
index 0000000..f779aaa
--- /dev/null
+++ b/tests/unit/test_media.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+
+import os
+import pytest
+from . import util
+
+
+class TestMedia():
+ oses = util.oses()
+
+ def os_id(os):
+ return os.shortid
+
+ @pytest.mark.parametrize('os', [*oses], ids=os_id)
+ @pytest.mark.skipif(os.environ.get('OSINFO_DB_NETWORK_TESTS') is None,
+ reason='Network related tests are not enabled')
+ def test_media_url(self, os):
+ for media in os.medias:
+ if media.url:
+ assert(media.url.check())
diff --git a/tests/unit/util.py b/tests/unit/util.py
new file mode 100644
index 0000000..cdb657e
--- /dev/null
+++ b/tests/unit/util.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python3
+
+import logging
+import os
+import sys
+import xml.etree.ElementTree as ET
+
+from . import osinfo
+
+def _get_files(directory):
+ files = []
+ datadir = os.environ.get('INTERNAL_OSINFO_DB_DATA_DIR')
+ if datadir is not None:
+ root = os.path.join(datadir, directory)
+ for (dirpath, _, filenames) in os.walk(root):
+ for filename in filenames:
+ if not filename.endswith('.xml'):
+ continue
+ files.append(os.path.join(dirpath, filename))
+ else:
+ logging.error('INTERNAL_OSINFO_DB_DATA_DIR is not set')
+ return files
+
+def _get_os(path):
+ tree = ET.parse(path)
+ root = tree.getroot()
+
+ os = root.find('os')
+ return os
+
+def oses():
+ oses = []
+ files = _get_files('os')
+ if files:
+ for f in files:
+ oses.append(osinfo.Os(_get_os(f)))
+ return oses
--
2.20.1
More information about the Libosinfo
mailing list