#!/usr/bin/env python3 # Copyright 2021 Oliver Smith # SPDX-License-Identifier: GPL-3.0-or-later import glob import os import pytest import re import sys import add_pmbootstrap_to_import_path import pmb.parse def deviceinfo_obsolete(info): """ Test for obsolete options used in the deviceinfo file. They must still be defined in pmbootstrap's config/__init__.py. """ obsolete_options = [ "usb_rndis_function", "weston_pixman_type", ] for option in obsolete_options: if option in info and info[option]: raise RuntimeError(f"option {option} is obsolete, please rename" " or remove it (see reasons for removal of at" " https://postmarketos.org/deviceinfo)") def test_deviceinfo(args): """ Parse all deviceinfo files successfully and run checks on the parsed data. """ # Iterate over all devices last_exception = None count = 0 pattern = re.compile("^deviceinfo_[a-zA-Z0-9_]*=\".*\"$") for folder in glob.glob(args.aports + "/device/*/device-*"): device = folder[len(args.aports):].split("-", 1)[1] f = open(folder[len(args.aports):][1:] + "/deviceinfo") lines = f.read().split("\n") f.close() try: for line in lines: # Require space after # for comments if line.startswith("#") and not line.startswith("# "): raise RuntimeError("Comment style: please change '#' to" f" '# ': {line}") # Skip empty lines and comments if not line or line.startswith("# "): continue # Variable can not be empty if '=""' in line: raise RuntimeError("Please remove the empty variable: " + line) # Check line against regex (can't use multiple lines etc.) if not pattern.match(line) or line.endswith("\\\""): raise RuntimeError("Line looks invalid, maybe missing" " quotes/multi-line string/comment next" f" to line instead of above? {line}") # Successful deviceinfo parsing / obsolete options info = pmb.parse.deviceinfo(args, device) deviceinfo_obsolete(info) # deviceinfo_name must start with manufacturer name = info["name"] manufacturer = info["manufacturer"] if not name.startswith(manufacturer) and \ not name.startswith("Google"): raise RuntimeError("Please add the manufacturer in front of" " the deviceinfo_name, e.g.: '" + manufacturer + " " + name + "'") # Don't abort on first error except Exception as e: last_exception = e count += 1 print(device + ": " + str(e)) # Raise the last exception if last_exception: print("deviceinfo error count: " + str(count)) raise last_exception