diff --git a/tests/functional/pyocf/types/cache.py b/tests/functional/pyocf/types/cache.py index a4d3aff..c4510c5 100644 --- a/tests/functional/pyocf/types/cache.py +++ b/tests/functional/pyocf/types/cache.py @@ -17,6 +17,7 @@ from ctypes import ( byref, cast, create_string_buffer, + POINTER, ) from enum import IntEnum, auto from datetime import timedelta @@ -346,6 +347,22 @@ class Cache: if c.results["error"]: raise OcfError("Error changing cleaning policy", c.results["error"]) + def get_cleaning_policy(self): + cleaning_policy = c_int() + + self.read_lock() + + status = self.owner.lib.ocf_mngt_cache_cleaning_get_policy( + self.cache_handle, byref(cleaning_policy) + ) + + self.read_unlock() + + if status != OcfErrorCode.OCF_OK: + raise OcfError("Failed to get cleaning policy", ret) + + return CleaningPolicy(cleaning_policy.value) + def set_cleaning_policy_param(self, cleaning_policy: CleaningPolicy, param_id, param_value): self.write_lock() @@ -998,6 +1015,8 @@ lib.ocf_cache_get_front_volume.argtypes = [c_void_p] lib.ocf_cache_get_front_volume.restype = c_void_p lib.ocf_cache_get_volume.argtypes = [c_void_p] lib.ocf_cache_get_volume.restype = c_void_p +lib.ocf_mngt_cache_cleaning_get_policy.argypes = [c_void_p, POINTER(c_int)] +lib.ocf_mngt_cache_cleaning_get_policy.restype = OcfErrorCode lib.ocf_mngt_cache_cleaning_set_policy.argtypes = [ c_void_p, c_uint32, diff --git a/tests/functional/pyocf/types/shared.py b/tests/functional/pyocf/types/shared.py index a401793..4499eb0 100644 --- a/tests/functional/pyocf/types/shared.py +++ b/tests/functional/pyocf/types/shared.py @@ -1,5 +1,5 @@ # -# Copyright(c) 2019-2021 Intel Corporation +# Copyright(c) 2019-2022 Intel Corporation # SPDX-License-Identifier: BSD-3-Clause # @@ -59,6 +59,7 @@ class OcfErrorCode(IntEnum): OCF_ERR_STANDBY_ATTACHED = auto() OCF_ERR_CORE_NOT_REMOVED = auto() OCF_ERR_CACHE_NOT_STANDBY = auto() + OCF_ERR_CLEANER_DISABLED = auto() class OcfCompletion: diff --git a/tests/functional/tests/management/test_disable_cleaner.py b/tests/functional/tests/management/test_disable_cleaner.py index 98f4aad..5077397 100644 --- a/tests/functional/tests/management/test_disable_cleaner.py +++ b/tests/functional/tests/management/test_disable_cleaner.py @@ -5,7 +5,7 @@ import pytest from pyocf.types.volume import RamVolume -from pyocf.types.cache import Cache, CacheMetadataSegment +from pyocf.types.cache import Cache, CacheMetadataSegment, CleaningPolicy from pyocf.types.core import Core from pyocf.types.shared import OcfError, OcfCompletion from pyocf.utils import Size as S @@ -103,7 +103,6 @@ def test_load_cleaner_disabled(pyocf_ctx): -@pytest.mark.skip(reason="not implemented") def test_cleaner_disabled_nop(pyocf_ctx): """ title: NOP enfocement in cleaner_disabled mode.. @@ -126,10 +125,31 @@ def test_cleaner_disabled_nop(pyocf_ctx): - disable_cleaner::starting_with_nop_policy - disable_cleaner::nop_enforcement """ - pass + cache_device = RamVolume(S.from_MiB(50)) + + cache = Cache.start_on_device(cache_device, disable_cleaner=True) + + assert cache.get_cleaning_policy() == CleaningPolicy.NOP, ( + "Cleaning policy should be NOP after starting cache with disabled cleaner" + ) + + with pytest.raises(OcfError): + cache.set_cleaning_policy(CleaningPolicy.ALRU) + + assert cache.get_cleaning_policy() == CleaningPolicy.NOP, ( + "It shouldn't be possible to switch cleaning policy to ALRU when cleaner is disabled" + ) + + with pytest.raises(OcfError): + cache.set_cleaning_policy(CleaningPolicy.ACP) + + assert cache.get_cleaning_policy() == CleaningPolicy.NOP, ( + "It shouldn't be possible to switch cleaning policy to ACP when cleaner is disabled" + ) + + cache.set_cleaning_policy(CleaningPolicy.NOP) -@pytest.mark.skip(reason="not implemented") def test_attach_cleaner_disabled_non_default(pyocf_ctx): """ title: Attach cache with default config does not set clener_disabled. @@ -148,4 +168,11 @@ def test_attach_cleaner_disabled_non_default(pyocf_ctx): requirements: - disable_cleaner::default_setting """ - pass + cache_device = RamVolume(S.from_MiB(50)) + + cache = Cache.start_on_device(cache_device) + + cleaning_size = get_metadata_segment_size(cache, CacheMetadataSegment.CLEANING) + assert ( + cleaning_size > 0 + ), f'Metadata cleaning segment size expected: "> 0", got: "{cleaning_size}"'