|
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()
|