diff --git a/tests/functional/pyocf/types/io.py b/tests/functional/pyocf/types/io.py index dbd0d40..46f6e93 100644 --- a/tests/functional/pyocf/types/io.py +++ b/tests/functional/pyocf/types/io.py @@ -22,6 +22,11 @@ from .data import Data from .shared import OcfCompletion +class WriteMode(IntEnum): + ZERO_PAD = 0 + READ_MODIFY_WRITE = 1 + + class IoDir(IntEnum): READ = 0 WRITE = 1 @@ -120,7 +125,7 @@ class Sync: self.io = io def sync_submit(self, submit_method): - if getattr(self.io, 'callback', None): + if getattr(self.io, "callback", None): raise Exception("completion callback is already set") cmpl = OcfCompletion([("err", c_int)]) self.io.callback = cmpl.callback diff --git a/tests/functional/pyocf/types/volume.py b/tests/functional/pyocf/types/volume.py index d80d0f3..fccbd4e 100644 --- a/tests/functional/pyocf/types/volume.py +++ b/tests/functional/pyocf/types/volume.py @@ -1,5 +1,6 @@ # # Copyright(c) 2019-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause # @@ -24,16 +25,18 @@ from hashlib import md5 import weakref from enum import IntEnum import warnings +from typing import Union -from .io import Io, IoOps, IoDir +from .io import Io, IoOps, IoDir, WriteMode, Sync from .queue import Queue from .shared import OcfErrorCode, Uuid from ..ocf import OcfLib from ..utils import print_buffer, Size as S -from .data import Data +from .data import Data, DataSeek from .queue import Queue + class IoFlags(IntEnum): FLUSH = 1 @@ -341,6 +344,66 @@ class Volume: ) return Io.from_pointer(io) + def sync_io( + self, + queue, + address: int, + data: Data, + direction: IoDir, + io_class=0, + flags=0, + submit_func=Sync.submit, + ): + assert address % 512 == 0 + assert data.size % 512 == 0 + + io = self.new_io(queue, address, data.size, direction, io_class, flags) + io.set_data(data) + completion = submit_func(Sync(io)) + + assert int(completion.results["err"]) == 0 + + def write_sync_4k( + self, + queue: Queue, + address: int, + data: Union[bytes, Data], + mode: WriteMode, + io_class=0, + flags=0, + ): + if mode not in list(WriteMode): + raise ValueError(f"illegal write mode: {mode}") + + size = len(data) + + address_4k = (address // 4096) * 4096 + + end_address_4k = ((address + size + 4095) // 4096) * 4096 + size_4k = end_address_4k - address_4k + + write_data = Data(size_4k) + + if mode == WriteMode.ZERO_PAD: + write_data.zero(size_4k) + elif mode == WriteMode.READ_MODIFY_WRITE: + self.sync_io(queue, address_4k, write_data, IoDir.READ) + + write_data.seek(DataSeek.BEGIN, address - address_4k) + write_data.write(data, size) + + self.sync_io(queue, address_4k, write_data, IoDir.WRITE, io_class, flags) + + def read_sync(self, queue: Queue, address: int, size: int, io_class=0, flags=0) -> bytes: + read_data = Data(size) + self.sync_io(queue, address, read_data, IoDir.READ, io_class, flags) + + data = bytes(size) + read_data.seek(DataSeek.BEGIN, 0) + read_data.read(data, size) + + return data + class RamVolume(Volume): props = None diff --git a/tests/functional/pyocf/types/volume_core.py b/tests/functional/pyocf/types/volume_core.py index 94596bb..7c1c402 100644 --- a/tests/functional/pyocf/types/volume_core.py +++ b/tests/functional/pyocf/types/volume_core.py @@ -5,6 +5,9 @@ # from .volume_exp_obj import OcfInternalVolume +from .queue import Queue +from .io import Sync, IoDir +from .data import Data class CoreVolume(OcfInternalVolume): @@ -18,3 +21,16 @@ class CoreVolume(OcfInternalVolume): def md5(self): return self._exp_obj_md5(4096) + + def sync_io( + self, + queue: Queue, + address: int, + data: Data, + direction: IoDir, + io_class=0, + flags=0, + submit_func=Sync.submit, + ): + super().sync_io(queue, address, data, direction, io_class, flags, submit_func) + self.core.cache.settle() diff --git a/tests/functional/pyocf/utils.py b/tests/functional/pyocf/utils.py index 5497e9e..de4e2d1 100644 --- a/tests/functional/pyocf/utils.py +++ b/tests/functional/pyocf/utils.py @@ -1,5 +1,6 @@ # # Copyright(c) 2019-2022 Intel Corporation +# Copyright(c) 2024 Huawei Technologies # SPDX-License-Identifier: BSD-3-Clause #