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