From: Aleš Date: Mon, 14 Feb 2022 13:16:40 +0000 (+0100) Subject: datamodel: types: several integer custom types X-Git-Tag: v6.0.0a1~42^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=36377133e1ef7c79259455cfaa3b56a2d23d93ab;p=thirdparty%2Fknot-resolver.git datamodel: types: several integer custom types --- diff --git a/manager/knot_resolver_manager/datamodel/types/__init__.py b/manager/knot_resolver_manager/datamodel/types/__init__.py index 011a1703a..ccb0490c9 100644 --- a/manager/knot_resolver_manager/datamodel/types/__init__.py +++ b/manager/knot_resolver_manager/datamodel/types/__init__.py @@ -2,9 +2,13 @@ from .enums import DNSRecordTypeEnum, PolicyActionEnum, PolicyFlagEnum from .types import ( CheckedPath, DomainName, + Int0_512, + Int0_65535, InterfaceName, InterfaceOptionalPort, InterfacePort, + IntNonNegative, + IntPositive, IPAddress, IPAddressOptionalPort, IPAddressPort, @@ -24,9 +28,13 @@ __all__ = [ "DNSRecordTypeEnum", "CheckedPath", "DomainName", + "Int0_512", + "Int0_65535", "InterfaceName", "InterfaceOptionalPort", "InterfacePort", + "IntNonNegative", + "IntPositive", "IPAddress", "IPAddressOptionalPort", "IPAddressPort", diff --git a/manager/knot_resolver_manager/datamodel/types/types.py b/manager/knot_resolver_manager/datamodel/types/types.py index c9581a3d4..ddfe87338 100644 --- a/manager/knot_resolver_manager/datamodel/types/types.py +++ b/manager/knot_resolver_manager/datamodel/types/types.py @@ -8,6 +8,24 @@ from knot_resolver_manager.exceptions import SchemaException from knot_resolver_manager.utils import CustomValueType +class IntNonNegative(IntRangeBase): + _min: int = 0 + + +class IntPositive(IntRangeBase): + _min: int = 1 + + +class Int0_512(IntRangeBase): + _min: int = 0 + _max: int = 512 + + +class Int0_65535(IntRangeBase): + _min: int = 0 + _max: int = 65_535 + + class PortNumber(IntRangeBase): _min: int = 1 _max: int = 65_535 diff --git a/manager/tests/unit/datamodel/types/test_base_types.py b/manager/tests/unit/datamodel/types/test_base_types.py index e7a55179e..acc8baf39 100644 --- a/manager/tests/unit/datamodel/types/test_base_types.py +++ b/manager/tests/unit/datamodel/types/test_base_types.py @@ -1,39 +1,38 @@ -import ipaddress +import random +import sys +from typing import List, Optional +import pytest from pytest import raises from knot_resolver_manager.datamodel.types.base_types import IntRangeBase from knot_resolver_manager.exceptions import KresManagerException -def test_int_range_base(): - class MinTest(IntRangeBase): - _min = 10 +@pytest.mark.parametrize("min,max", [(0, None), (None, 0), (1, 65535), (-65535, -1)]) +def test_int_range_base(min: Optional[int], max: Optional[int]): + class Test(IntRangeBase): + if min: + _min = min + if max: + _max = max - assert int(MinTest(10)) == 10 - assert int(MinTest(20)) == 20 + if min: + assert int(Test(min)) == min + if max: + assert int(Test(max)) == max - with raises(KresManagerException): - MinTest(9) + rmin = min if min else -sys.maxsize - 1 + rmax = max if max else sys.maxsize - class MaxTest(IntRangeBase): - _max = 25 + n = 100 + vals: List[int] = [random.randint(rmin, rmax) for _ in range(n)] + assert [str(Test(val)) == f"{val}" for val in vals] - assert int(MaxTest(20)) == 20 - assert int(MaxTest(25)) == 25 + invals: List[int] = [] + invals.extend([random.randint(rmax + 1, sys.maxsize) for _ in range(n % 2)] if max else []) + invals.extend([random.randint(-sys.maxsize - 1, rmin - 1) for _ in range(n % 2)] if max else []) - with raises(KresManagerException): - MaxTest(26) - - class MinMaxTest(IntRangeBase): - _min = 10 - _max = 25 - - assert int(MinMaxTest(10)) == 10 - assert int(MinMaxTest(20)) == 20 - assert int(MinMaxTest(25)) == 25 - - with raises(KresManagerException): - MinMaxTest(9) - with raises(KresManagerException): - MinMaxTest(26) + for inval in invals: + with raises(KresManagerException): + Test(inval)