xref: /freebsd-src/tests/atf_python/sys/netpfil/ipfw/utils.py (revision 9f44a47fd07924afc035991af15d84e6585dea4f)
1*9f44a47fSAlexander V. Chernikov#!/usr/bin/env python3
2*9f44a47fSAlexander V. Chernikov
3*9f44a47fSAlexander V. Chernikovimport os
4*9f44a47fSAlexander V. Chernikovimport socket
5*9f44a47fSAlexander V. Chernikovimport struct
6*9f44a47fSAlexander V. Chernikovimport subprocess
7*9f44a47fSAlexander V. Chernikovimport sys
8*9f44a47fSAlexander V. Chernikovfrom enum import Enum
9*9f44a47fSAlexander V. Chernikovfrom typing import Dict
10*9f44a47fSAlexander V. Chernikovfrom typing import List
11*9f44a47fSAlexander V. Chernikovfrom typing import Optional
12*9f44a47fSAlexander V. Chernikovfrom typing import Union
13*9f44a47fSAlexander V. Chernikovfrom typing import Any
14*9f44a47fSAlexander V. Chernikovfrom typing import NamedTuple
15*9f44a47fSAlexander V. Chernikovimport pytest
16*9f44a47fSAlexander V. Chernikov
17*9f44a47fSAlexander V. Chernikov
18*9f44a47fSAlexander V. Chernikovdef roundup2(val: int, num: int) -> int:
19*9f44a47fSAlexander V. Chernikov    if val % num:
20*9f44a47fSAlexander V. Chernikov        return (val | (num - 1)) + 1
21*9f44a47fSAlexander V. Chernikov    else:
22*9f44a47fSAlexander V. Chernikov        return val
23*9f44a47fSAlexander V. Chernikov
24*9f44a47fSAlexander V. Chernikov
25*9f44a47fSAlexander V. Chernikovdef align8(val: int) -> int:
26*9f44a47fSAlexander V. Chernikov    return roundup2(val, 8)
27*9f44a47fSAlexander V. Chernikov
28*9f44a47fSAlexander V. Chernikov
29*9f44a47fSAlexander V. Chernikovdef enum_or_int(val) -> int:
30*9f44a47fSAlexander V. Chernikov    if isinstance(val, Enum):
31*9f44a47fSAlexander V. Chernikov        return val.value
32*9f44a47fSAlexander V. Chernikov    return val
33*9f44a47fSAlexander V. Chernikov
34*9f44a47fSAlexander V. Chernikov
35*9f44a47fSAlexander V. Chernikovdef enum_from_int(enum_class: Enum, val) -> Enum:
36*9f44a47fSAlexander V. Chernikov    if isinstance(val, Enum):
37*9f44a47fSAlexander V. Chernikov        return val
38*9f44a47fSAlexander V. Chernikov    for item in enum_class:
39*9f44a47fSAlexander V. Chernikov        if val == item.value:
40*9f44a47fSAlexander V. Chernikov            return item
41*9f44a47fSAlexander V. Chernikov    return None
42*9f44a47fSAlexander V. Chernikov
43*9f44a47fSAlexander V. Chernikov
44*9f44a47fSAlexander V. Chernikovclass AttrDescr(NamedTuple):
45*9f44a47fSAlexander V. Chernikov    val: Enum
46*9f44a47fSAlexander V. Chernikov    cls: Any
47*9f44a47fSAlexander V. Chernikov    child_map: Any = None
48*9f44a47fSAlexander V. Chernikov    is_array: bool = False
49*9f44a47fSAlexander V. Chernikov
50*9f44a47fSAlexander V. Chernikov
51*9f44a47fSAlexander V. Chernikovdef prepare_attrs_map(attrs: List[AttrDescr]) -> Dict[str, Dict]:
52*9f44a47fSAlexander V. Chernikov    ret = {}
53*9f44a47fSAlexander V. Chernikov    for ad in attrs:
54*9f44a47fSAlexander V. Chernikov        ret[ad.val.value] = {"ad": ad}
55*9f44a47fSAlexander V. Chernikov        if ad.child_map:
56*9f44a47fSAlexander V. Chernikov            ret[ad.val.value]["child"] = prepare_attrs_map(ad.child_map)
57*9f44a47fSAlexander V. Chernikov            ret[ad.val.value]["is_array"] = ad.is_array
58*9f44a47fSAlexander V. Chernikov    return ret
59*9f44a47fSAlexander V. Chernikov
60*9f44a47fSAlexander V. Chernikov
61*9f44a47fSAlexander V. Chernikov
62