Commit 2d6af377 authored by Carmine Rizzo's avatar Carmine Rizzo
Browse files

Merge branch 'testing_fixes' into 'main'

ASN.1 Compilation and updated linting

See merge request !48
parents b2aeb934 5d14853b
Loading
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -4,29 +4,34 @@ before_script:
  - python3 --version

stages:
  - Merge
  - Syntax
  - Lint
  - Compile
  - CompileAndLint

parseASN1:
  stage: Syntax
MergeTest:
  stage: Merge
  script:
  - python3 testing/parse_asn1.py
  - python3 testing/merge_test.py

checkXSD:
  stage: Syntax
  script:
  - python3 testing/check_xsd.py

lintASN1:
  stage: Lint
parseASN1:
  stage: Syntax
  script:
  - python3 testing/lint_asn1.py
  allow_failure: true
  - python3 testing/parse_asn1.py

compileASN1:
  stage: Compile
  stage: CompileAndLint
  script:
  - python3 testing/compile_asn1.py

lintASN1:
  stage: CompileAndLint
  script:
  - python3 testing/lint_asn1.py
  allow_failure: true

testing/check_asn1.py

deleted100644 → 0
+0 −94
Original line number Diff line number Diff line
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)
    return parseErrors, compileErrors


def validateAllASN1FilesInPath (path):
    globPattern = str(Path(path)) + '/*.asn1'
    logging.info("Searching: " + globPattern)
    schemaGlob = glob(globPattern, recursive=True)
    return validateASN1Files(schemaGlob)    


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))
+47 −1
Original line number Diff line number Diff line
print ("Not implemented yet")
 No newline at end of file
import logging

import asn1tools
from pathlib import Path

from pprint import pprint

ignoreReleases = {'33108' : [f'r{i}' for i in range(5, 17)],
                  '33128' : [] }

def prepareFile(f):
    with open(f) as fh:
        s = fh.read()
    s = s.replace("RELATIVE-OID", "OBJECT IDENTIFIER") # sigh
    return s

if __name__ == '__main__':
    fileList = list(Path(".").rglob("*.asn1")) + list(Path(".").rglob("*.asn"))

    ignoredFiles = [file for file in fileList if file.parts[1] in ignoreReleases[file.parts[0]]]
    logging.info(f"Ignoring {len(ignoredFiles)} files")
    logging.debug(ignoredFiles)
    
    fileList = [file for file in fileList if file not in ignoredFiles]

    if len(fileList) == 0:
        logging.warning ("No files specified")
        exit(0)

    print ("ASN.1 Compilation checks:")
    print ("-----------------------------")    
    logging.info("Parsing files...")
    errorCount = 0
    for f in fileList:
        try:
            s = prepareFile(str(f))
            asn1tools.compile_string(s) # this won't work for modules with IMPORTs
        except asn1tools.ParseError as ex:
            logging.info (f"  {f}: Failed - {ex!r}")
            print (f"  {f}: Failed - {ex!r}")
            errorCount += 1
            continue
        print (f"  {f}: OK")
    print ("-----------------------------")    
    print (f"Compile errors: {errorCount}")
    print ("-----------------------------")    
    exit(errorCount)
+7 −2
Original line number Diff line number Diff line
FROM python:3.7
RUN pip3 install -q asn1tools lxml xmlschema
 No newline at end of file
# docker build -t mcanterb/forge-cicd
# docker push mcanterb/forge-cicd

FROM python:3.8
RUN apt update && apt-get install -y git
RUN git config --global user.name "forgeRobot" && git config --global user.email "forgeRobot@example.com"
RUN pip3 install -q asn1tools lxml xmlschema requests gitpython
 No newline at end of file
+7 −2
Original line number Diff line number Diff line
exceptedStrings = ["D.4.4: Enumerations for UDMServingSystemMethod start at 0, not 1", 
"D.4.5: Field 'aNNodeID' in GlobalRANNodeID is an anonymous CHOICE"]
 No newline at end of file
"D.4.5: Field 'aNNodeID' in GlobalRANNodeID is an anonymous CHOICE", 
"D.4.4: Enumerations for EstablishmentStatus start at 0, not 1", 
"D.4.4: Enumerations for MMSDirection start at 0, not 1", 
"D.4.4: Enumerations for MMSReplyCharging start at 0, not 1", 
"D.4.4: Enumerations for MMStatusExtension start at 0, not 1"]
Loading