Blame lib/python/pqos/test/test_monitoring.py

Packit Service 8a4b7a
################################################################################
Packit Service 8a4b7a
# BSD LICENSE
Packit Service 8a4b7a
#
Packit Service 8a4b7a
# Copyright(c) 2019-2020 Intel Corporation. All rights reserved.
Packit Service 8a4b7a
# All rights reserved.
Packit Service 8a4b7a
#
Packit Service 8a4b7a
# Redistribution and use in source and binary forms, with or without
Packit Service 8a4b7a
# modification, are permitted provided that the following conditions
Packit Service 8a4b7a
# are met:
Packit Service 8a4b7a
#
Packit Service 8a4b7a
#   * Redistributions of source code must retain the above copyright
Packit Service 8a4b7a
#     notice, this list of conditions and the following disclaimer.
Packit Service 8a4b7a
#   * Redistributions in binary form must reproduce the above copyright
Packit Service 8a4b7a
#     notice, this list of conditions and the following disclaimer in
Packit Service 8a4b7a
#     the documentation and/or other materials provided with the
Packit Service 8a4b7a
#     distribution.
Packit Service 8a4b7a
#   * Neither the name of Intel Corporation nor the names of its
Packit Service 8a4b7a
#     contributors may be used to endorse or promote products derived
Packit Service 8a4b7a
#     from this software without specific prior written permission.
Packit Service 8a4b7a
#
Packit Service 8a4b7a
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 8a4b7a
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 8a4b7a
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 8a4b7a
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 8a4b7a
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 8a4b7a
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 8a4b7a
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 8a4b7a
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 8a4b7a
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 8a4b7a
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 8a4b7a
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 8a4b7a
################################################################################
Packit Service 8a4b7a

Packit Service 8a4b7a
"""
Packit Service 8a4b7a
Unit tests for monitoring module.
Packit Service 8a4b7a
"""
Packit Service 8a4b7a

Packit Service 8a4b7a
from __future__ import absolute_import, division, print_function
Packit Service 8a4b7a
import ctypes
Packit Service 8a4b7a
import unittest
Packit Service 8a4b7a

Packit Service 8a4b7a
from unittest.mock import MagicMock
Packit Service 8a4b7a

Packit Service 8a4b7a
from pqos.test.helper import ctypes_ref_set_uint
Packit Service 8a4b7a
from pqos.test.mock_pqos import mock_pqos_lib
Packit Service 8a4b7a

Packit Service 8a4b7a
from pqos.capability import CPqosMonitor
Packit Service 8a4b7a
from pqos.monitoring import PqosMon, CPqosEventValues, CPqosMonData
Packit Service 8a4b7a

Packit Service 8a4b7a

Packit Service 8a4b7a
class TestPqosMon(unittest.TestCase):
Packit Service 8a4b7a
    "Tests for PqosMon class."
Packit Service 8a4b7a

Packit Service 8a4b7a
    @mock_pqos_lib
Packit Service 8a4b7a
    def test_reset(self, lib):
Packit Service 8a4b7a
        "Tests reset() method."
Packit Service 8a4b7a
        # pylint: disable=no-self-use
Packit Service 8a4b7a

Packit Service 8a4b7a
        def pqos_mon_reset_mock():
Packit Service 8a4b7a
            "Mock pqos_mon_reset()."
Packit Service 8a4b7a

Packit Service 8a4b7a
            return 0
Packit Service 8a4b7a

Packit Service 8a4b7a
        func_mock = MagicMock(side_effect=pqos_mon_reset_mock)
Packit Service 8a4b7a
        lib.pqos_mon_reset = func_mock
Packit Service 8a4b7a

Packit Service 8a4b7a
        mon = PqosMon()
Packit Service 8a4b7a
        mon.reset()
Packit Service 8a4b7a

Packit Service 8a4b7a
        lib.pqos_mon_reset.assert_called_once()
Packit Service 8a4b7a

Packit Service 8a4b7a
    @mock_pqos_lib
Packit Service 8a4b7a
    def test_assoc_get(self, lib):
Packit Service 8a4b7a
        "Tests assoc_get() method."
Packit Service 8a4b7a

Packit Service 8a4b7a
        def pqos_mon_assoc_get_mock(core, rmid_ref):
Packit Service 8a4b7a
            "Mock pqos_mon_assoc_get()."
Packit Service 8a4b7a

Packit Service 8a4b7a
            self.assertEqual(core, 3)
Packit Service 8a4b7a
            ctypes_ref_set_uint(rmid_ref, 7)
Packit Service 8a4b7a
            return 0
Packit Service 8a4b7a

Packit Service 8a4b7a
        func_mock = MagicMock(side_effect=pqos_mon_assoc_get_mock)
Packit Service 8a4b7a
        lib.pqos_mon_assoc_get = func_mock
Packit Service 8a4b7a

Packit Service 8a4b7a
        mon = PqosMon()
Packit Service 8a4b7a
        rmid = mon.assoc_get(3)
Packit Service 8a4b7a

Packit Service 8a4b7a
        self.assertEqual(rmid, 7)
Packit Service 8a4b7a

Packit Service 8a4b7a
        lib.pqos_mon_assoc_get.assert_called_once()
Packit Service 8a4b7a

Packit Service 8a4b7a
    @mock_pqos_lib
Packit Service 8a4b7a
    def test_start(self, lib):
Packit Service 8a4b7a
        "Tests start() method."
Packit Service 8a4b7a

Packit Service 8a4b7a
        values = CPqosEventValues(llc=123, mbm_local=456, mbm_total=789,
Packit Service 8a4b7a
                                  mbm_remote=120, mbm_local_delta=456,
Packit Service 8a4b7a
                                  mbm_total_delta=789, mbm_remote_delta=120)
Packit Service 8a4b7a
        group_mock = CPqosMonData(values=values)
Packit Service 8a4b7a

Packit Service 8a4b7a
        def pqos_mon_start_mock(num_cores, cores_arr, event, _context,
Packit Service 8a4b7a
                                group_ref):
Packit Service 8a4b7a
            "Mock pqos_mon_start()."
Packit Service 8a4b7a

Packit Service 8a4b7a
            self.assertEqual(num_cores, 2)
Packit Service 8a4b7a
            self.assertEqual(cores_arr[0], 1)
Packit Service 8a4b7a
            self.assertEqual(cores_arr[1], 3)
Packit Service 8a4b7a
            exp_event = CPqosMonitor.PQOS_MON_EVENT_L3_OCCUP
Packit Service 8a4b7a
            exp_event |= CPqosMonitor.PQOS_MON_EVENT_LMEM_BW
Packit Service 8a4b7a
            self.assertEqual(event, exp_event)
Packit Service 8a4b7a
            ctypes.memmove(group_ref, ctypes.addressof(group_mock),
Packit Service 8a4b7a
                           ctypes.sizeof(group_mock))
Packit Service 8a4b7a
            return 0
Packit Service 8a4b7a

Packit Service 8a4b7a
        func_mock = MagicMock(side_effect=pqos_mon_start_mock)
Packit Service 8a4b7a
        lib.pqos_mon_start = func_mock
Packit Service 8a4b7a

Packit Service 8a4b7a
        mon = PqosMon()
Packit Service 8a4b7a
        group = mon.start([1, 3], ['l3_occup', 'lmem_bw'])
Packit Service 8a4b7a

Packit Service 8a4b7a
        lib.pqos_mon_start.assert_called_once()
Packit Service 8a4b7a

Packit Service 8a4b7a
        self.assertEqual(group.values.llc, 123)
Packit Service 8a4b7a
        self.assertEqual(group.values.mbm_local, 456)
Packit Service 8a4b7a

Packit Service 8a4b7a
    @mock_pqos_lib
Packit Service 8a4b7a
    def test_start_pids(self, lib):
Packit Service 8a4b7a
        "Tests start_pids() method."
Packit Service 8a4b7a
        values = CPqosEventValues(llc=678, mbm_local=653, mbm_total=721,
Packit Service 8a4b7a
                                  mbm_remote=68, mbm_local_delta=653,
Packit Service 8a4b7a
                                  mbm_total_delta=721, mbm_remote_delta=68,
Packit Service 8a4b7a
                                  ipc=0.98, llc_misses=10, llc_misses_delta=10)
Packit Service 8a4b7a
        group_mock = CPqosMonData(values=values)
Packit Service 8a4b7a

Packit Service 8a4b7a
        def pqos_mon_start_pids_mock(num_pids, pids_arr, event, _context,
Packit Service 8a4b7a
                                     group_ref):
Packit Service 8a4b7a
            "Mock pqos_mon_start_pids()."
Packit Service 8a4b7a

Packit Service 8a4b7a
            self.assertEqual(num_pids, 2)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[0], 1286)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[1], 2251)
Packit Service 8a4b7a
            exp_event = CPqosMonitor.PQOS_MON_EVENT_L3_OCCUP
Packit Service 8a4b7a
            exp_event |= CPqosMonitor.PQOS_MON_EVENT_TMEM_BW
Packit Service 8a4b7a
            self.assertEqual(event, exp_event)
Packit Service 8a4b7a
            ctypes.memmove(group_ref, ctypes.addressof(group_mock),
Packit Service 8a4b7a
                           ctypes.sizeof(group_mock))
Packit Service 8a4b7a
            return 0
Packit Service 8a4b7a

Packit Service 8a4b7a
        func_mock = MagicMock(side_effect=pqos_mon_start_pids_mock)
Packit Service 8a4b7a
        lib.pqos_mon_start_pids = func_mock
Packit Service 8a4b7a

Packit Service 8a4b7a
        mon = PqosMon()
Packit Service 8a4b7a
        group = mon.start_pids([1286, 2251], ['l3_occup', 'tmem_bw'])
Packit Service 8a4b7a

Packit Service 8a4b7a
        lib.pqos_mon_start_pids.assert_called_once()
Packit Service 8a4b7a

Packit Service 8a4b7a
        self.assertEqual(group.values.llc, 678)
Packit Service 8a4b7a
        self.assertEqual(group.values.mbm_local, 653)
Packit Service 8a4b7a
        self.assertAlmostEqual(group.values.ipc, 0.98, places=5)
Packit Service 8a4b7a

Packit Service 8a4b7a
    @mock_pqos_lib
Packit Service 8a4b7a
    def test_poll(self, lib):
Packit Service 8a4b7a
        "Tests poll() method."
Packit Service 8a4b7a
        values = CPqosEventValues(llc=678, mbm_local=653, mbm_total=721,
Packit Service 8a4b7a
                                  mbm_remote=68, mbm_local_delta=653,
Packit Service 8a4b7a
                                  mbm_total_delta=721, mbm_remote_delta=68,
Packit Service 8a4b7a
                                  ipc=0.98, llc_misses=10, llc_misses_delta=10)
Packit Service 8a4b7a
        event = CPqosMonitor.PQOS_MON_EVENT_L3_OCCUP
Packit Service 8a4b7a
        group = CPqosMonData(event=event, values=values)
Packit Service 8a4b7a

Packit Service 8a4b7a
        values2 = CPqosEventValues(llc=998, mbm_local=653, mbm_total=721,
Packit Service 8a4b7a
                                   mbm_remote=68, mbm_local_delta=653,
Packit Service 8a4b7a
                                   mbm_total_delta=721, mbm_remote_delta=68,
Packit Service 8a4b7a
                                   ipc=0.98, llc_misses=10, llc_misses_delta=10)
Packit Service 8a4b7a
        group_mock2 = CPqosMonData(values=values2)
Packit Service 8a4b7a

Packit Service 8a4b7a
        def pqos_mon_poll_mock(groups_arr, num_groups):
Packit Service 8a4b7a
            "Mock pqos_mon_poll()."
Packit Service 8a4b7a

Packit Service 8a4b7a
            self.assertEqual(num_groups, 1)
Packit Service 8a4b7a
            ctypes.memmove(groups_arr[0], ctypes.addressof(group_mock2),
Packit Service 8a4b7a
                           ctypes.sizeof(group_mock2))
Packit Service 8a4b7a
            return 0
Packit Service 8a4b7a

Packit Service 8a4b7a
        func_mock = MagicMock(side_effect=pqos_mon_poll_mock)
Packit Service 8a4b7a
        lib.pqos_mon_poll = func_mock
Packit Service 8a4b7a

Packit Service 8a4b7a
        mon = PqosMon()
Packit Service 8a4b7a
        mon.poll([group])
Packit Service 8a4b7a

Packit Service 8a4b7a
        lib.pqos_mon_poll.assert_called_once()
Packit Service 8a4b7a

Packit Service 8a4b7a
        self.assertEqual(group.values.llc, 998)
Packit Service 8a4b7a

Packit Service 8a4b7a

Packit Service 8a4b7a
class TestCPqosMonData(unittest.TestCase):
Packit Service 8a4b7a
    "Tests for CPqosMonData class."
Packit Service 8a4b7a

Packit Service 8a4b7a
    @mock_pqos_lib
Packit Service 8a4b7a
    def test_stop(self, lib):
Packit Service 8a4b7a
        "Tests stop() method."
Packit Service 8a4b7a

Packit Service 8a4b7a
        values = CPqosEventValues(llc=123, mbm_local=456, mbm_total=789,
Packit Service 8a4b7a
                                  mbm_remote=120, mbm_local_delta=456,
Packit Service 8a4b7a
                                  mbm_total_delta=789, mbm_remote_delta=120)
Packit Service 8a4b7a
        group_mock = CPqosMonData(values=values)
Packit Service 8a4b7a

Packit Service 8a4b7a
        def pqos_mon_stop_mock(group_ref):
Packit Service 8a4b7a
            "Mock pqos_mon_stop()."
Packit Service 8a4b7a

Packit Service 8a4b7a
            group_ptr = ctypes.cast(group_ref, ctypes.POINTER(CPqosMonData))
Packit Service 8a4b7a
            group_ptr_addr = ctypes.addressof(group_ptr.contents)
Packit Service 8a4b7a
            mock_addr = ctypes.addressof(group_mock)
Packit Service 8a4b7a
            self.assertEqual(group_ptr_addr, mock_addr)
Packit Service 8a4b7a
            return 0
Packit Service 8a4b7a

Packit Service 8a4b7a
        func_mock = MagicMock(side_effect=pqos_mon_stop_mock)
Packit Service 8a4b7a
        lib.pqos_mon_stop = func_mock
Packit Service 8a4b7a

Packit Service 8a4b7a
        group_mock.stop()
Packit Service 8a4b7a

Packit Service 8a4b7a
        lib.pqos_mon_stop.assert_called_once()
Packit Service 8a4b7a

Packit Service 8a4b7a
    @mock_pqos_lib
Packit Service 8a4b7a
    def test_add_pids(self, lib):
Packit Service 8a4b7a
        "Tests add_pids() method."
Packit Service 8a4b7a

Packit Service 8a4b7a
        values = CPqosEventValues(llc=123, mbm_local=456, mbm_total=789,
Packit Service 8a4b7a
                                  mbm_remote=120, mbm_local_delta=456,
Packit Service 8a4b7a
                                  mbm_total_delta=789, mbm_remote_delta=120)
Packit Service 8a4b7a
        group_mock = CPqosMonData(values=values)
Packit Service 8a4b7a

Packit Service 8a4b7a
        def pqos_mon_add_pids_mock(num_pids, pids_arr, group_ref):
Packit Service 8a4b7a
            "Mock pqos_mon_add_pids()."
Packit Service 8a4b7a

Packit Service 8a4b7a
            group_ptr = ctypes.cast(group_ref, ctypes.POINTER(CPqosMonData))
Packit Service 8a4b7a
            group_ptr_addr = ctypes.addressof(group_ptr.contents)
Packit Service 8a4b7a
            mock_addr = ctypes.addressof(group_mock)
Packit Service 8a4b7a
            self.assertEqual(group_ptr_addr, mock_addr)
Packit Service 8a4b7a

Packit Service 8a4b7a
            self.assertEqual(num_pids, 3)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[0], 101)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[1], 202)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[2], 303)
Packit Service 8a4b7a

Packit Service 8a4b7a
            return 0
Packit Service 8a4b7a

Packit Service 8a4b7a
        func_mock = MagicMock(side_effect=pqos_mon_add_pids_mock)
Packit Service 8a4b7a
        lib.pqos_mon_add_pids = func_mock
Packit Service 8a4b7a

Packit Service 8a4b7a
        group_mock.add_pids([101, 202, 303])
Packit Service 8a4b7a

Packit Service 8a4b7a
        lib.pqos_mon_add_pids.assert_called_once()
Packit Service 8a4b7a

Packit Service 8a4b7a
    @mock_pqos_lib
Packit Service 8a4b7a
    def test_remove_pids(self, lib):
Packit Service 8a4b7a
        "Tests remove_pids() method."
Packit Service 8a4b7a

Packit Service 8a4b7a
        values = CPqosEventValues(llc=123, mbm_local=456, mbm_total=789,
Packit Service 8a4b7a
                                  mbm_remote=120, mbm_local_delta=456,
Packit Service 8a4b7a
                                  mbm_total_delta=789, mbm_remote_delta=120)
Packit Service 8a4b7a
        group_mock = CPqosMonData(values=values)
Packit Service 8a4b7a

Packit Service 8a4b7a
        def pqos_mon_remove_pids_mock(num_pids, pids_arr, group_ref):
Packit Service 8a4b7a
            "Mock pqos_mon_remove_pids()."
Packit Service 8a4b7a

Packit Service 8a4b7a
            group_ptr = ctypes.cast(group_ref, ctypes.POINTER(CPqosMonData))
Packit Service 8a4b7a
            group_ptr_addr = ctypes.addressof(group_ptr.contents)
Packit Service 8a4b7a
            mock_addr = ctypes.addressof(group_mock)
Packit Service 8a4b7a
            self.assertEqual(group_ptr_addr, mock_addr)
Packit Service 8a4b7a

Packit Service 8a4b7a
            self.assertEqual(num_pids, 4)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[0], 555)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[1], 444)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[2], 321)
Packit Service 8a4b7a
            self.assertEqual(pids_arr[3], 121)
Packit Service 8a4b7a

Packit Service 8a4b7a
            return 0
Packit Service 8a4b7a

Packit Service 8a4b7a
        func_mock = MagicMock(side_effect=pqos_mon_remove_pids_mock)
Packit Service 8a4b7a
        lib.pqos_mon_remove_pids = func_mock
Packit Service 8a4b7a

Packit Service 8a4b7a
        group_mock.remove_pids([555, 444, 321, 121])
Packit Service 8a4b7a

Packit Service 8a4b7a
        lib.pqos_mon_remove_pids.assert_called_once()