From 44e9a8480ae4877a330b6e06e1f7de2816ecaadb Mon Sep 17 00:00:00 2001 From: Aleksei Chetaev Date: Fri, 17 Feb 2023 14:00:16 +0100 Subject: [PATCH] Move errors patterns and check functions to testlib Signed-off-by: Aleksei Chetaev --- src/frostfs_testlib/resources/__init__.py | 0 src/frostfs_testlib/resources/common.py | 36 +++++++++++++++++++++++ src/frostfs_testlib/utils/errors.py | 11 +++++++ 3 files changed, 47 insertions(+) create mode 100644 src/frostfs_testlib/resources/__init__.py create mode 100644 src/frostfs_testlib/resources/common.py create mode 100644 src/frostfs_testlib/utils/errors.py diff --git a/src/frostfs_testlib/resources/__init__.py b/src/frostfs_testlib/resources/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/frostfs_testlib/resources/common.py b/src/frostfs_testlib/resources/common.py new file mode 100644 index 0000000..44f8c77 --- /dev/null +++ b/src/frostfs_testlib/resources/common.py @@ -0,0 +1,36 @@ +# ACLs with final flag +PUBLIC_ACL_F = "1FBFBFFF" +PRIVATE_ACL_F = "1C8C8CCC" +READONLY_ACL_F = "1FBF8CFF" + +# ACLs without final flag set +PUBLIC_ACL = "0FBFBFFF" +INACCESSIBLE_ACL = "40000000" +STICKY_BIT_PUB_ACL = "3FFFFFFF" + +EACL_PUBLIC_READ_WRITE = "eacl-public-read-write" + +# Regex patterns of status codes of Container service +CONTAINER_NOT_FOUND = "code = 3072.*message = container not found" + + +# Regex patterns of status codes of Object service +MALFORMED_REQUEST = "code = 1024.*message = malformed request" +OBJECT_ACCESS_DENIED = "code = 2048.*message = access to object operation denied" +OBJECT_NOT_FOUND = "code = 2049.*message = object not found" +OBJECT_ALREADY_REMOVED = "code = 2052.*message = object already removed" +SESSION_NOT_FOUND = "code = 4096.*message = session token not found" +OUT_OF_RANGE = "code = 2053.*message = out of range" +# TODO: Due to https://github.com/nspcc-dev/neofs-node/issues/2092 we have to check only codes until fixed +# OBJECT_IS_LOCKED = "code = 2050.*message = object is locked" +# LOCK_NON_REGULAR_OBJECT = "code = 2051.*message = ..." will be available once 2092 is fixed +OBJECT_IS_LOCKED = "code = 2050" +LOCK_NON_REGULAR_OBJECT = "code = 2051" + +LIFETIME_REQUIRED = "either expiration epoch of a lifetime is required" +LOCK_OBJECT_REMOVAL = "lock object removal" +LOCK_OBJECT_EXPIRATION = "lock object expiration: {expiration_epoch}; current: {current_epoch}" +INVALID_RANGE_ZERO_LENGTH = "invalid '{range}' range: zero length" +INVALID_RANGE_OVERFLOW = "invalid '{range}' range: uint64 overflow" +INVALID_OFFSET_SPECIFIER = "invalid '{range}' range offset specifier" +INVALID_LENGTH_SPECIFIER = "invalid '{range}' range length specifier" diff --git a/src/frostfs_testlib/utils/errors.py b/src/frostfs_testlib/utils/errors.py new file mode 100644 index 0000000..5a7bee8 --- /dev/null +++ b/src/frostfs_testlib/utils/errors.py @@ -0,0 +1,11 @@ +import re + + +def error_matches_status(error: Exception, status_pattern: str) -> bool: + """ + Determines whether exception matches specified status pattern. + + We use re.search() to be consistent with pytest.raises. + """ + match = re.search(status_pattern, str(error)) + return match is not None