1 /* 2 * Copyright (C) 2020-2021 Intel Corporation 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 */ 7 8 #pragma once 9 #include "shared/test/common/test_macros/test.h" 10 11 #include "level_zero/core/source/device/device.h" 12 #include "level_zero/core/test/unit_tests/fixtures/device_fixture.h" 13 #include "level_zero/core/test/unit_tests/mock.h" 14 #include "level_zero/core/test/unit_tests/white_box.h" 15 #include "level_zero/tools/source/metrics/metric.h" 16 #include "level_zero/tools/source/metrics/metric_enumeration_imp.h" 17 #include "level_zero/tools/source/metrics/metric_query_imp.h" 18 #include "level_zero/tools/test/unit_tests/sources/metrics/mock_metric_enumeration.h" 19 20 namespace L0 { 21 namespace ult { 22 23 template <> 24 struct WhiteBox<::L0::MetricQuery> : public ::L0::MetricQuery { 25 using BaseClass = ::L0::MetricQuery; 26 }; 27 28 template <> 29 struct WhiteBox<::L0::MetricQueryPool> : public ::L0::MetricQueryPool { 30 using BaseClass = ::L0::MetricQuery; 31 }; 32 33 using MetricQuery = WhiteBox<::L0::MetricQuery>; 34 using MetricQueryPool = WhiteBox<::L0::MetricQueryPool>; 35 36 using MetricsLibraryApi::ClientData_1_0; 37 using MetricsLibraryApi::ClientDataLinuxAdapter_1_0; 38 using MetricsLibraryApi::ClientType_1_0; 39 using MetricsLibraryApi::CommandBufferData_1_0; 40 using MetricsLibraryApi::CommandBufferSize_1_0; 41 using MetricsLibraryApi::ConfigurationActivateData_1_0; 42 using MetricsLibraryApi::ConfigurationCreateData_1_0; 43 using MetricsLibraryApi::ConfigurationHandle_1_0; 44 using MetricsLibraryApi::ContextCreateData_1_0; 45 using MetricsLibraryApi::ContextHandle_1_0; 46 using MetricsLibraryApi::GetReportData_1_0; 47 using MetricsLibraryApi::LinuxAdapterType; 48 using MetricsLibraryApi::MarkerCreateData_1_0; 49 using MetricsLibraryApi::MarkerHandle_1_0; 50 using MetricsLibraryApi::OverrideCreateData_1_0; 51 using MetricsLibraryApi::OverrideHandle_1_0; 52 using MetricsLibraryApi::ParameterType; 53 using MetricsLibraryApi::QueryCreateData_1_0; 54 using MetricsLibraryApi::QueryHandle_1_0; 55 using MetricsLibraryApi::StatusCode; 56 using MetricsLibraryApi::TypedValue_1_0; 57 using MetricsLibraryApi::ValueType; 58 59 struct MockMetricsLibraryApi { 60 61 // Original api functions. 62 static StatusCode ML_STDCALL ContextCreate(ClientType_1_0 clientType, ContextCreateData_1_0 *createData, ContextHandle_1_0 *handle); 63 static StatusCode ML_STDCALL ContextDelete(const ContextHandle_1_0 handle); 64 static StatusCode ML_STDCALL GetParameter(const ParameterType parameter, ValueType *type, TypedValue_1_0 *value); 65 static StatusCode ML_STDCALL CommandBufferGet(const CommandBufferData_1_0 *data); 66 static StatusCode ML_STDCALL CommandBufferGetSize(const CommandBufferData_1_0 *data, CommandBufferSize_1_0 *size); 67 static StatusCode ML_STDCALL QueryCreate(const QueryCreateData_1_0 *createData, QueryHandle_1_0 *handle); 68 static StatusCode ML_STDCALL QueryDelete(const QueryHandle_1_0 handle); 69 static StatusCode ML_STDCALL OverrideCreate(const OverrideCreateData_1_0 *createData, OverrideHandle_1_0 *handle); 70 static StatusCode ML_STDCALL OverrideDelete(const OverrideHandle_1_0 handle); 71 static StatusCode ML_STDCALL MarkerCreate(const MarkerCreateData_1_0 *createData, MarkerHandle_1_0 *handle); 72 static StatusCode ML_STDCALL MarkerDelete(const MarkerHandle_1_0 handle); 73 static StatusCode ML_STDCALL ConfigurationCreate(const ConfigurationCreateData_1_0 *createData, ConfigurationHandle_1_0 *handle); 74 static StatusCode ML_STDCALL ConfigurationActivate(const ConfigurationHandle_1_0 handle, const ConfigurationActivateData_1_0 *activateData); 75 static StatusCode ML_STDCALL ConfigurationDeactivate(const ConfigurationHandle_1_0 handle); 76 static StatusCode ML_STDCALL ConfigurationDelete(const ConfigurationHandle_1_0 handle); 77 static StatusCode ML_STDCALL GetData(GetReportData_1_0 *data); 78 79 // Mocked api functions. 80 MOCK_METHOD(StatusCode, MockContextCreate, (ClientType_1_0 clientType, ContextCreateData_1_0 *createData, ContextHandle_1_0 *handle)); 81 MOCK_METHOD(StatusCode, MockContextDelete, (const ContextHandle_1_0 handle)); 82 MOCK_METHOD(StatusCode, MockGetParameter, (const ParameterType parameter, ValueType *type, TypedValue_1_0 *value)); 83 MOCK_METHOD(StatusCode, MockCommandBufferGet, (const CommandBufferData_1_0 *data)); 84 MOCK_METHOD(StatusCode, MockCommandBufferGetSize, (const CommandBufferData_1_0 *data, CommandBufferSize_1_0 *size)); 85 MOCK_METHOD(StatusCode, MockQueryCreate, (const QueryCreateData_1_0 *createData, QueryHandle_1_0 *handle)); 86 MOCK_METHOD(StatusCode, MockQueryDelete, (const QueryHandle_1_0 handle)); 87 MOCK_METHOD(StatusCode, MockOverrideCreate, (const OverrideCreateData_1_0 *createData, OverrideHandle_1_0 *handle)); 88 MOCK_METHOD(StatusCode, MockOverrideDelete, (const OverrideHandle_1_0 handle)); 89 MOCK_METHOD(StatusCode, MockMarkerCreate, (const MarkerCreateData_1_0 *createData, MarkerHandle_1_0 *handle)); 90 MOCK_METHOD(StatusCode, MockMarkerDelete, (const MarkerHandle_1_0 handle)); 91 MOCK_METHOD(StatusCode, MockConfigurationCreate, (const ConfigurationCreateData_1_0 *createData, ConfigurationHandle_1_0 *handle)); 92 MOCK_METHOD(StatusCode, MockConfigurationActivate, (const ConfigurationHandle_1_0 handle, const ConfigurationActivateData_1_0 *activateData)); 93 MOCK_METHOD(StatusCode, MockConfigurationDeactivate, (const ConfigurationHandle_1_0 handle)); 94 MOCK_METHOD(StatusCode, MockConfigurationDelete, (const ConfigurationHandle_1_0 handle)); 95 MOCK_METHOD(StatusCode, MockGetData, (GetReportData_1_0 * data)); 96 }; 97 98 template <> 99 struct Mock<MetricsLibrary> : public MetricsLibrary { 100 101 public: 102 Mock(::L0::MetricContext &metricContext); 103 ~Mock() override; 104 105 using MetricsLibrary::handle; 106 using MetricsLibrary::initializationState; 107 108 // Api mock enable/disable. 109 void setMockedApi(MockMetricsLibraryApi *mockedApi); 110 111 // Mocked metrics library functions. 112 MOCK_METHOD(bool, load, (), (override)); 113 MOCK_METHOD(bool, getContextData, (::L0::Device &, ContextCreateData_1_0 &), (override)); 114 MOCK_METHOD(bool, getMetricQueryReportSize, (size_t & rawDataSize), (override)); 115 116 // Not mocked metrics library functions. 117 bool metricsLibraryGetContextData(::L0::Device &device, ContextCreateData_1_0 &contextData) { return MetricsLibrary::getContextData(device, contextData); } 118 119 // Original metrics library implementation used by metric context. 120 ::L0::MetricsLibrary *metricsLibrary = nullptr; 121 122 // Mocked metrics library api version. 123 // We cannot use a static instance here since the gtest validates memory usage, 124 // and mocked functions will stay in memory longer than the test. 125 static MockMetricsLibraryApi *g_mockApi; 126 }; 127 128 template <> 129 struct Mock<MetricQueryPool> : public MetricQueryPool { 130 Mock(); 131 ~Mock() override; 132 133 MOCK_METHOD(ze_result_t, createMetricQuery, (uint32_t, zet_metric_query_handle_t *), (override)); 134 MOCK_METHOD(ze_result_t, destroy, (), (override)); 135 }; 136 137 template <> 138 struct Mock<MetricQuery> : public MetricQuery { 139 Mock(); 140 ~Mock() override; 141 142 MOCK_METHOD(ze_result_t, getData, (size_t *, uint8_t *), (override)); 143 MOCK_METHOD(ze_result_t, reset, (), (override)); 144 MOCK_METHOD(ze_result_t, destroy, (), (override)); 145 }; 146 147 class MetricContextFixture : public ContextFixture { 148 149 protected: 150 void SetUp(); 151 void TearDown(); 152 void openMetricsAdapter(); 153 void openMetricsAdapterGroup(); 154 155 public: 156 // Mocked objects. 157 std::unique_ptr<Mock<MetricEnumeration>> mockMetricEnumeration = nullptr; 158 std::unique_ptr<Mock<MetricsLibrary>> mockMetricsLibrary = nullptr; 159 160 // Mocked metrics library/discovery APIs. 161 MockMetricsLibraryApi mockMetricsLibraryApi = {}; 162 MockMetricsDiscoveryApi mockMetricsDiscoveryApi = {}; 163 164 // Metrics discovery device 165 Mock<IAdapterGroup_1_9> adapterGroup; 166 Mock<IAdapter_1_9> adapter; 167 Mock<IMetricsDevice_1_5> metricsDevice; 168 MetricsDiscovery::TMetricsDeviceParams_1_2 metricsDeviceParams = {}; 169 }; 170 171 class MetricMultiDeviceFixture : public MultiDeviceFixture { 172 173 protected: 174 void SetUp(); 175 void TearDown(); 176 void openMetricsAdapter(); 177 void openMetricsAdapterSubDevice(uint32_t subDeviceIndex); 178 void openMetricsAdapterGroup(); 179 180 public: 181 std::vector<L0::Device *> devices; 182 183 // Mocked objects. 184 std::unique_ptr<Mock<MetricEnumeration>> mockMetricEnumeration = nullptr; 185 std::unique_ptr<Mock<MetricsLibrary>> mockMetricsLibrary = nullptr; 186 187 std::vector<std::unique_ptr<Mock<MetricEnumeration>>> mockMetricEnumerationSubDevices; 188 std::vector<std::unique_ptr<Mock<MetricsLibrary>>> mockMetricsLibrarySubDevices; 189 190 // Mocked metrics library/discovery APIs. 191 MockMetricsLibraryApi mockMetricsLibraryApi = {}; 192 MockMetricsDiscoveryApi mockMetricsDiscoveryApi = {}; 193 194 // Metrics discovery device 195 Mock<IAdapterGroup_1_9> adapterGroup; 196 Mock<IAdapter_1_9> adapter; 197 Mock<IMetricsDevice_1_5> metricsDevice; 198 MetricsDiscovery::TMetricsDeviceParams_1_2 metricsDeviceParams = {}; 199 }; 200 201 class MetricStreamerMultiDeviceFixture : public MetricMultiDeviceFixture { 202 public: 203 void cleanup(zet_device_handle_t &hDevice, zet_metric_streamer_handle_t &hStreamer); 204 }; 205 206 } // namespace ult 207 } // namespace L0 208