# SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB)
# Copyright (c) 2019 Mellanox Technologies, Inc. All rights reserved. See COPYING file

"""
Test module for Mlx5 UAR allocation.
"""
import unittest
import errno

from pyverbs.pyverbs_error import PyverbsRDMAError
from pyverbs.providers.mlx5.mlx5dv import Mlx5UAR
from pyverbs.providers.mlx5.mlx5_enums import _MLX5DV_UAR_ALLOC_TYPE_BF, _MLX5DV_UAR_ALLOC_TYPE_NC
from tests.mlx5_base import Mlx5RDMATestCase
from tests.base import BaseResources


class Mlx5UarRes(BaseResources):
    def __init__(self, dev_name, ib_port=None, gid_index=None):
        super().__init__(dev_name, ib_port, gid_index)
        self.uars = []


class Mlx5UarTestCase(Mlx5RDMATestCase):
    def setUp(self):
        super().setUp()
        self.uar_res = Mlx5UarRes(self.dev_name)

    def test_alloc_uar(self):
        try:
            for f in [_MLX5DV_UAR_ALLOC_TYPE_BF, _MLX5DV_UAR_ALLOC_TYPE_NC]:
                self.uar_res.uars.append(Mlx5UAR(self.uar_res.ctx, f))
        except PyverbsRDMAError as ex:
            if ex.error_code == errno.EOPNOTSUPP or ex.error_code == errno.EPROTONOSUPPORT:
                raise unittest.SkipTest(f'UAR allocation (with flag={f}) is not supported')
            raise ex
        finally:
            for uar in self.uar_res.uars:
                uar.close()

    def test_uar_export_dmabuf_fd(self):
        """Test exporting a UAR as a dmabuf FD"""
        try:
            self.uar_res.uars.append(Mlx5UAR(self.uar_res.ctx, _MLX5DV_UAR_ALLOC_TYPE_NC))
            dmabuf_fd = self.uar_res.uars[-1].export_dmabuf_fd()
            self.assertGreater(dmabuf_fd, 0, 'Expected a valid dmabuf FD greater than 0')
        except PyverbsRDMAError as ex:
            if ex.error_code in [errno.EPROTONOSUPPORT, errno.EOPNOTSUPP]:
                raise unittest.SkipTest('UAR dmabuf export is not supported')
            raise ex
        finally:
            for uar in self.uar_res.uars:
                uar.close()
