diff --git a/.github/workflows/regression-DASHIF-db.yml b/.github/workflows/regression-DASHIF-db.yml index 726c827..7dc0977 100644 --- a/.github/workflows/regression-DASHIF-db.yml +++ b/.github/workflows/regression-DASHIF-db.yml @@ -1,24 +1,23 @@ -name: Regression test DASH IF MPDs +name: Regression test DASH IF MPDs on: [workflow_dispatch] jobs: - build: - + test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up Python 3.13 - uses: actions/setup-python@v2 - with: - python-version: 3.13 - - name: Install dependencies - run: | - cd tests/ - python -m pip install --upgrade pip - pip install -r requirements.txt - - name: Run tests - run: | - cd tests/ - python -m unittest -v regression-test-DASHIF-db.py \ No newline at end of file + - uses: actions/checkout@v6 + - name: Set up Python 3.13 + uses: actions/setup-python@v6 + with: + python-version: 3.13 + - name: Install dependencies + run: | + cd tests/ + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Run tests + run: | + cd tests/ + python -m unittest -v regression-test-DASHIF-db.py diff --git a/.github/workflows/regression.yml b/.github/workflows/regression.yml index eec1a80..45a9c08 100644 --- a/.github/workflows/regression.yml +++ b/.github/workflows/regression.yml @@ -1,24 +1,23 @@ -name: Regression test industry MPDs +name: Regression test industry MPDs on: [workflow_dispatch] jobs: test: - runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up Python 3.13 - uses: actions/setup-python@v2 - with: - python-version: 3.13 - - name: Install dependencies - run: | - cd tests/ - python -m pip install --upgrade pip - pip install -r requirements.txt - - name: Run tests - run: | - cd tests/ - python -m unittest -v regression-test.py \ No newline at end of file + - uses: actions/checkout@v6 + - name: Set up Python 3.13 + uses: actions/setup-python@v6 + with: + python-version: 3.13 + - name: Install dependencies + run: | + cd tests/ + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Run tests + run: | + cd tests/ + python -m unittest -v regression-test.py diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml index 83ea672..1ff631f 100644 --- a/.github/workflows/validation.yml +++ b/.github/workflows/validation.yml @@ -4,21 +4,20 @@ on: [push, pull_request, workflow_dispatch] jobs: test: - runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up Python 3.13 - uses: actions/setup-python@v2 - with: - python-version: 3.13 - - name: Install dependencies - run: | - cd tests/ - python -m pip install --upgrade pip - pip install -r requirements.txt - - name: Run tests - run: | - cd tests/ - python -m unittest -v validate.py + - uses: actions/checkout@v6 + - name: Set up Python 3.13 + uses: actions/setup-python@v6 + with: + python-version: 3.13 + - name: Install dependencies + run: | + cd tests/ + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Run tests + run: | + cd tests/ + python -m unittest -v validate.py diff --git a/tests/regression-test-DASHIF-db.py b/tests/regression-test-DASHIF-db.py index 39a5cb6..4c5bcc2 100644 --- a/tests/regression-test-DASHIF-db.py +++ b/tests/regression-test-DASHIF-db.py @@ -18,26 +18,39 @@ DASHIF_dataset_url = "https://raw.githubusercontent.com/Dash-Industry-Forum/Test-Assets-Dataset-Public/master/dataset/data/testvector.json" +class PrefixResolver(etree.Resolver): + # https://lxml.de/resolvers.html + def __init__(self, prefix): + self.prefix = prefix.lower() + + def resolve(self, url, pubid, context): + if url.lower().startswith(self.prefix): + res=requests.get(url, allow_redirects=True) + return self.resolve_string(res.text, context) + class TestManifests(unittest.TestCase): def setUp(self): self.log = logging.getLogger('MDP_tests') logging.basicConfig(stream=sys.stderr, level=logging.INFO) self.log.info('Loading MPEG DASH schema') self.xsdParser=etree.XMLParser(load_dtd=True, no_network=False, huge_tree=True, resolve_entities=True) + self.xsdParser.resolvers.add(PrefixResolver("https")) + self.xsdParser.resolvers.add(PrefixResolver("http")) with open('../DASH-MPD.xsd', 'r') as schema_file: self.mpd_schema = etree.XMLSchema(etree.parse(schema_file, self.xsdParser)) # is_python3 = sys.version_info.major == 3 self.xmlParser=etree.XMLParser(load_dtd=True, no_network=False, huge_tree=True, resolve_entities=True) + self.xmlParser.resolvers.add(PrefixResolver("https")) + self.xmlParser.resolvers.add(PrefixResolver("http")) def check_a_manifest(self, mpdURL, source): with self.subTest(msg=mpdURL): self.log.info('Validating {%s} %s', source, mpdURL) try: - mpdRequest=requests.get(mpdURL, allow_redirects=True) + mpdRequest=requests.get(mpdURL, allow_redirects=True, timeout=2.50) except Exception as err: - self.fail(err) + self.skipTest("failed to retrieve manifest") else: - self.assertEqual(mpdRequest.status_code, 200, "Request error; expected 200, got %d" % mpdRequest.status_code) if mpdRequest.status_code == 200: mpdUrl = mpdRequest.text strt=mpdUrl.find('<') @@ -46,6 +59,8 @@ def check_a_manifest(self, mpdURL, source): mpd=etree.fromstring((mpdUrl).encode('utf8'), self.xmlParser) if not self.mpd_schema.validate(mpd): self.fail(self.mpd_schema.error_log.filter_from_errors()) + else: + self.skipTest("response not 200 OK") def check_manifests(self, mpdList, source): for mpdURL in mpdList: diff --git a/tests/regression-test.py b/tests/regression-test.py index b8368e9..d15e06b 100644 --- a/tests/regression-test.py +++ b/tests/regression-test.py @@ -21,12 +21,24 @@ MPEGCMAFManifestsFile="MPEG-CMAF-manifests.json" DASHIFManifestsFile="DASH-IF-manifests.json" +class PrefixResolver(etree.Resolver): + # https://lxml.de/resolvers.html + def __init__(self, prefix): + self.prefix = prefix.lower() + + def resolve(self, url, pubid, context): + if url.lower().startswith(self.prefix): + res=requests.get(url, allow_redirects=True) + return self.resolve_string(res.text, context) + class TestManifests(unittest.TestCase): def setUp(self): self.log = logging.getLogger('MDP_tests') logging.basicConfig(stream=sys.stderr, level=logging.INFO) self.log.info('Loading MPEG DASH schema') self.xsdParser=etree.XMLParser(load_dtd=True, no_network=False, huge_tree=True, resolve_entities=True) + self.xsdParser.resolvers.add(PrefixResolver("https")) + self.xsdParser.resolvers.add(PrefixResolver("http")) with open('../DASH-MPD.xsd', 'r') as schema_file: self.mpd_schema = etree.XMLSchema(etree.parse(schema_file, self.xsdParser)) # is_python3 = sys.version_info.major == 3 @@ -36,12 +48,11 @@ def check_a_manifest(self, mpdURL, source): with self.subTest(msg=mpdURL): self.log.info('Validating {%s} %s', source, mpdURL) try: - mpdRequest=requests.get(mpdURL, allow_redirects=True) + mpdRequest=requests.get(mpdURL, allow_redirects=True, timeout=2.50) except Exception as err: - self.fail(err) + self.skipTest("failed to retrieve manifest") else: - self.assertEqual(mpdRequest.status_code, 200, "Request error; expected 200, got %d" % mpdRequest.status_code) - if mpdRequest.status_code == 200: + if mpdRequest.status_code == 200: mpdUrl = mpdRequest.text strt=mpdUrl.find('<') if strt > 0: @@ -49,6 +60,8 @@ def check_a_manifest(self, mpdURL, source): mpd=etree.fromstring((mpdUrl).encode('utf8'), self.xmlParser) if not self.mpd_schema.validate(mpd): self.fail(self.mpd_schema.error_log.filter_from_errors()) + else: + self.skipTest("response not 200 OK") def check_manifests(self, mpdList, source): for mpdURL in mpdList: diff --git a/tests/validate.py b/tests/validate.py index cc28942..89f7d80 100644 --- a/tests/validate.py +++ b/tests/validate.py @@ -31,7 +31,7 @@ def setUp(self): self.parser.resolvers.add(PrefixResolver("http")) def test_mpds(self): - """ Test all MPDs found in the repository.""" + self.log.info("Test all MPDs found in the repository.") with open('../DASH-MPD.xsd', 'r') as schema_file: mpd_schema = etree.XMLSchema( etree.parse(schema_file, self.parser) ) for mpd_path in glob.glob('../*.mpd'): @@ -42,7 +42,7 @@ def test_mpds(self): def test_mpps(self): - """ Test all MPPs found in the repository.""" + self.log.info(" Test all MPPs found in the repository.") with open('../DASH-MPD-PATCH.xsd', 'r') as mpp_schema_file: mpp_schema = etree.XMLSchema( etree.parse(mpp_schema_file, self.parser) ) for mpp_path in glob.glob('../*.mpp'):