diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..3e3760376b450b5a9b9e6c9c8ff79d2305903cc0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,125 @@ +# Editors +.vscode/ +.idea/ + +# Vagrant +.vagrant/ + +# Mac/OSX +.DS_Store + +# Windows +Thumbs.db + +# Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..1b43a20857c5fd19de5421b592931db7a423b45b --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,13 @@ +image: "python:3.7" + +before_script: + - python3 --version + - pip3 install -q asn1tools lxml xmlschema + +stages: + - Check Schemas + +checkASN1: + stage: Check Schemas + script: + - python3 testing/check_asn1.py \ No newline at end of file diff --git a/testing/check_asn1.py b/testing/check_asn1.py new file mode 100644 index 0000000000000000000000000000000000000000..494737cbab6f5acf2b1296aa9f163be451f7f8af --- /dev/null +++ b/testing/check_asn1.py @@ -0,0 +1,96 @@ +import logging + +from asn1tools import parse_files, compile_dict, ParseError, CompileError +from glob import glob +from pathlib import Path + +from pprint import pprint + + +def parseASN1File (asnFile): + try: + parse_files(asnFile) + except ParseError as ex: + return [ex] + return [] + + +def parseASN1Files (fileList): + if len(fileList) == 0: + logging.warning ("No files specified") + return {} + errors = {} + logging.info("Parsing files...") + for f in fileList: + ex = parseASN1File(f) + if ex: + logging.info (f" {f}: Failed - {ex!r}") + else: + logging.info (f" {f}: OK") + errors[f] = ex + return errors + + +def compileASN1Files (fileList): + logging.info("Compiling files...") + errors = [] + try: + d = parse_files(fileList) + for modulename, module in d.items(): + # Weird fix because the compiler doesn't like RELATIVE-OID as a type + # Not sure if the on-the-wire encoding would be affected or not + # but for most checking purposes this doesn't matter + module['types']["RELATIVE-OID"] = {'type' : 'OBJECT IDENTIFIER'} + c = compile_dict(d) + except CompileError as ex: + logging.info (f"Compiler error: {ex}") + errors.append(ex) + except ParseError as ex: + logging.info (f"Parse error: {ex}") + errors.append(ex) + logging.info ("Compiled OK") + return errors + + +def validateASN1Files (fileList): + parseErrors = parseASN1Files(fileList) +# if len(parseErrors > 0): +# logging.info ("Abandonding compile due to parse errors") +# compileErrors = compileASN1Files(fileList) +# leave this for now - TBD + compileErrors = [] + return parseErrors, compileErrors + + +def validateAllASN1FilesInPath (path): + p = Path(path) + fileGlob = [str(f) for f in p.rglob('*.asn')] + fileGlob += [str(f) for f in p.rglob('*.asn1')] + return validateASN1Files(fileGlob) + + +if __name__ == '__main__': + parseErrors, compileErrors = validateAllASN1FilesInPath("./") + parseErrorCount = 0 + print ("ASN.1 Parser checks:") + print ("-----------------------------") + for filename, errors in parseErrors.items(): + if len(errors) > 0: + parseErrorCount += len(errors) + print (f"{filename}: {len(errors)} errors") + for error in errors: + print (" " + str(error)) + else: + print (f"{filename}: OK") + print ("-----------------------------") + print ("ASN.1 Compilation:") + print ("-----------------------------") + if len(compileErrors) > 0: + for error in compileErrors: + print (" " + str(error)) + else: + print ("Compilation OK") + print ("-----------------------------") + print (f"{parseErrorCount} parse errors, {len(compileErrors)} compile errors") + exit (parseErrorCount + len(compileErrors)) +