1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker
6*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingMocks.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingTestUtils.hpp"
8*89c4ff92SAndroid Build Coastguard Worker #include "SendCounterPacketTests.hpp"
9*89c4ff92SAndroid Build Coastguard Worker
10*89c4ff92SAndroid Build Coastguard Worker #include <client/src/BufferManager.hpp>
11*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingUtils.hpp>
12*89c4ff92SAndroid Build Coastguard Worker #include <client/src/SendCounterPacket.hpp>
13*89c4ff92SAndroid Build Coastguard Worker
14*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Utils.hpp>
15*89c4ff92SAndroid Build Coastguard Worker
16*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Assert.hpp>
17*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Conversion.hpp>
18*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Constants.hpp>
19*89c4ff92SAndroid Build Coastguard Worker #include <common/include/CounterDirectory.hpp>
20*89c4ff92SAndroid Build Coastguard Worker #include <common/include/EncodeVersion.hpp>
21*89c4ff92SAndroid Build Coastguard Worker #include <common/include/NumericCast.hpp>
22*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Processes.hpp>
23*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ProfilingException.hpp>
24*89c4ff92SAndroid Build Coastguard Worker
25*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h>
26*89c4ff92SAndroid Build Coastguard Worker
27*89c4ff92SAndroid Build Coastguard Worker #include <chrono>
28*89c4ff92SAndroid Build Coastguard Worker
29*89c4ff92SAndroid Build Coastguard Worker using namespace arm::pipe;
30*89c4ff92SAndroid Build Coastguard Worker
31*89c4ff92SAndroid Build Coastguard Worker namespace
32*89c4ff92SAndroid Build Coastguard Worker {
33*89c4ff92SAndroid Build Coastguard Worker
34*89c4ff92SAndroid Build Coastguard Worker // A short delay to wait for the thread to process a packet.
35*89c4ff92SAndroid Build Coastguard Worker uint16_t constexpr WAIT_UNTIL_READABLE_MS = 20;
36*89c4ff92SAndroid Build Coastguard Worker
SetNotConnectedProfilingState(ProfilingStateMachine & profilingStateMachine)37*89c4ff92SAndroid Build Coastguard Worker void SetNotConnectedProfilingState(ProfilingStateMachine& profilingStateMachine)
38*89c4ff92SAndroid Build Coastguard Worker {
39*89c4ff92SAndroid Build Coastguard Worker ProfilingState currentState = profilingStateMachine.GetCurrentState();
40*89c4ff92SAndroid Build Coastguard Worker switch (currentState)
41*89c4ff92SAndroid Build Coastguard Worker {
42*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::WaitingForAck:
43*89c4ff92SAndroid Build Coastguard Worker profilingStateMachine.TransitionToState(ProfilingState::Active);
44*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
45*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::Uninitialised:
46*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
47*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::Active:
48*89c4ff92SAndroid Build Coastguard Worker profilingStateMachine.TransitionToState(ProfilingState::NotConnected);
49*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
50*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::NotConnected:
51*89c4ff92SAndroid Build Coastguard Worker return;
52*89c4ff92SAndroid Build Coastguard Worker default:
53*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(false, "Invalid profiling state");
54*89c4ff92SAndroid Build Coastguard Worker }
55*89c4ff92SAndroid Build Coastguard Worker }
56*89c4ff92SAndroid Build Coastguard Worker
SetWaitingForAckProfilingState(ProfilingStateMachine & profilingStateMachine)57*89c4ff92SAndroid Build Coastguard Worker void SetWaitingForAckProfilingState(ProfilingStateMachine& profilingStateMachine)
58*89c4ff92SAndroid Build Coastguard Worker {
59*89c4ff92SAndroid Build Coastguard Worker ProfilingState currentState = profilingStateMachine.GetCurrentState();
60*89c4ff92SAndroid Build Coastguard Worker switch (currentState)
61*89c4ff92SAndroid Build Coastguard Worker {
62*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::Uninitialised:
63*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
64*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::Active:
65*89c4ff92SAndroid Build Coastguard Worker profilingStateMachine.TransitionToState(ProfilingState::NotConnected);
66*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
67*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::NotConnected:
68*89c4ff92SAndroid Build Coastguard Worker profilingStateMachine.TransitionToState(ProfilingState::WaitingForAck);
69*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
70*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::WaitingForAck:
71*89c4ff92SAndroid Build Coastguard Worker return;
72*89c4ff92SAndroid Build Coastguard Worker default:
73*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(false, "Invalid profiling state");
74*89c4ff92SAndroid Build Coastguard Worker }
75*89c4ff92SAndroid Build Coastguard Worker }
76*89c4ff92SAndroid Build Coastguard Worker
SetActiveProfilingState(ProfilingStateMachine & profilingStateMachine)77*89c4ff92SAndroid Build Coastguard Worker void SetActiveProfilingState(ProfilingStateMachine& profilingStateMachine)
78*89c4ff92SAndroid Build Coastguard Worker {
79*89c4ff92SAndroid Build Coastguard Worker ProfilingState currentState = profilingStateMachine.GetCurrentState();
80*89c4ff92SAndroid Build Coastguard Worker switch (currentState)
81*89c4ff92SAndroid Build Coastguard Worker {
82*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::Uninitialised:
83*89c4ff92SAndroid Build Coastguard Worker profilingStateMachine.TransitionToState(ProfilingState::NotConnected);
84*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
85*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::NotConnected:
86*89c4ff92SAndroid Build Coastguard Worker profilingStateMachine.TransitionToState(ProfilingState::WaitingForAck);
87*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
88*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::WaitingForAck:
89*89c4ff92SAndroid Build Coastguard Worker profilingStateMachine.TransitionToState(ProfilingState::Active);
90*89c4ff92SAndroid Build Coastguard Worker ARMNN_FALLTHROUGH;
91*89c4ff92SAndroid Build Coastguard Worker case ProfilingState::Active:
92*89c4ff92SAndroid Build Coastguard Worker return;
93*89c4ff92SAndroid Build Coastguard Worker default:
94*89c4ff92SAndroid Build Coastguard Worker CHECK_MESSAGE(false, "Invalid profiling state");
95*89c4ff92SAndroid Build Coastguard Worker }
96*89c4ff92SAndroid Build Coastguard Worker }
97*89c4ff92SAndroid Build Coastguard Worker
98*89c4ff92SAndroid Build Coastguard Worker } // Anonymous namespace
99*89c4ff92SAndroid Build Coastguard Worker
100*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("SendCounterPacketTests")
101*89c4ff92SAndroid Build Coastguard Worker {
102*89c4ff92SAndroid Build Coastguard Worker using PacketType = MockProfilingConnection::PacketType;
103*89c4ff92SAndroid Build Coastguard Worker
104*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("MockSendCounterPacketTest")
105*89c4ff92SAndroid Build Coastguard Worker {
106*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(512);
107*89c4ff92SAndroid Build Coastguard Worker MockSendCounterPacket mockSendCounterPacket(mockBuffer);
108*89c4ff92SAndroid Build Coastguard Worker
109*89c4ff92SAndroid Build Coastguard Worker mockSendCounterPacket.SendStreamMetaDataPacket();
110*89c4ff92SAndroid Build Coastguard Worker
111*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer = mockBuffer.GetReadableBuffer();
112*89c4ff92SAndroid Build Coastguard Worker const char* buffer = reinterpret_cast<const char*>(packetBuffer->GetReadableData());
113*89c4ff92SAndroid Build Coastguard Worker
114*89c4ff92SAndroid Build Coastguard Worker CHECK(strcmp(buffer, "SendStreamMetaDataPacket") == 0);
115*89c4ff92SAndroid Build Coastguard Worker
116*89c4ff92SAndroid Build Coastguard Worker mockBuffer.MarkRead(packetBuffer);
117*89c4ff92SAndroid Build Coastguard Worker
118*89c4ff92SAndroid Build Coastguard Worker CounterDirectory counterDirectory;
119*89c4ff92SAndroid Build Coastguard Worker mockSendCounterPacket.SendCounterDirectoryPacket(counterDirectory);
120*89c4ff92SAndroid Build Coastguard Worker
121*89c4ff92SAndroid Build Coastguard Worker packetBuffer = mockBuffer.GetReadableBuffer();
122*89c4ff92SAndroid Build Coastguard Worker buffer = reinterpret_cast<const char*>(packetBuffer->GetReadableData());
123*89c4ff92SAndroid Build Coastguard Worker
124*89c4ff92SAndroid Build Coastguard Worker CHECK(strcmp(buffer, "SendCounterDirectoryPacket") == 0);
125*89c4ff92SAndroid Build Coastguard Worker
126*89c4ff92SAndroid Build Coastguard Worker mockBuffer.MarkRead(packetBuffer);
127*89c4ff92SAndroid Build Coastguard Worker
128*89c4ff92SAndroid Build Coastguard Worker uint64_t timestamp = 0;
129*89c4ff92SAndroid Build Coastguard Worker std::vector<CounterValue> indexValuePairs;
130*89c4ff92SAndroid Build Coastguard Worker
131*89c4ff92SAndroid Build Coastguard Worker mockSendCounterPacket.SendPeriodicCounterCapturePacket(timestamp, indexValuePairs);
132*89c4ff92SAndroid Build Coastguard Worker
133*89c4ff92SAndroid Build Coastguard Worker packetBuffer = mockBuffer.GetReadableBuffer();
134*89c4ff92SAndroid Build Coastguard Worker buffer = reinterpret_cast<const char*>(packetBuffer->GetReadableData());
135*89c4ff92SAndroid Build Coastguard Worker
136*89c4ff92SAndroid Build Coastguard Worker CHECK(strcmp(buffer, "SendPeriodicCounterCapturePacket") == 0);
137*89c4ff92SAndroid Build Coastguard Worker
138*89c4ff92SAndroid Build Coastguard Worker mockBuffer.MarkRead(packetBuffer);
139*89c4ff92SAndroid Build Coastguard Worker
140*89c4ff92SAndroid Build Coastguard Worker uint32_t capturePeriod = 0;
141*89c4ff92SAndroid Build Coastguard Worker std::vector<uint16_t> selectedCounterIds;
142*89c4ff92SAndroid Build Coastguard Worker mockSendCounterPacket.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
143*89c4ff92SAndroid Build Coastguard Worker
144*89c4ff92SAndroid Build Coastguard Worker packetBuffer = mockBuffer.GetReadableBuffer();
145*89c4ff92SAndroid Build Coastguard Worker buffer = reinterpret_cast<const char*>(packetBuffer->GetReadableData());
146*89c4ff92SAndroid Build Coastguard Worker
147*89c4ff92SAndroid Build Coastguard Worker CHECK(strcmp(buffer, "SendPeriodicCounterSelectionPacket") == 0);
148*89c4ff92SAndroid Build Coastguard Worker
149*89c4ff92SAndroid Build Coastguard Worker mockBuffer.MarkRead(packetBuffer);
150*89c4ff92SAndroid Build Coastguard Worker }
151*89c4ff92SAndroid Build Coastguard Worker
152*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendPeriodicCounterSelectionPacketTest")
153*89c4ff92SAndroid Build Coastguard Worker {
154*89c4ff92SAndroid Build Coastguard Worker // Error no space left in buffer
155*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer1(10);
156*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendPacket1(mockBuffer1,
157*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
158*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
159*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
160*89c4ff92SAndroid Build Coastguard Worker
161*89c4ff92SAndroid Build Coastguard Worker uint32_t capturePeriod = 1000;
162*89c4ff92SAndroid Build Coastguard Worker std::vector<uint16_t> selectedCounterIds;
163*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendPacket1.SendPeriodicCounterSelectionPacket(
164*89c4ff92SAndroid Build Coastguard Worker capturePeriod, selectedCounterIds),
165*89c4ff92SAndroid Build Coastguard Worker BufferExhaustion);
166*89c4ff92SAndroid Build Coastguard Worker
167*89c4ff92SAndroid Build Coastguard Worker // Packet without any counters
168*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer2(512);
169*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendPacket2(mockBuffer2,
170*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
171*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
172*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
173*89c4ff92SAndroid Build Coastguard Worker
174*89c4ff92SAndroid Build Coastguard Worker sendPacket2.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
175*89c4ff92SAndroid Build Coastguard Worker auto readBuffer2 = mockBuffer2.GetReadableBuffer();
176*89c4ff92SAndroid Build Coastguard Worker
177*89c4ff92SAndroid Build Coastguard Worker uint32_t headerWord0 = ReadUint32(readBuffer2, 0);
178*89c4ff92SAndroid Build Coastguard Worker uint32_t headerWord1 = ReadUint32(readBuffer2, 4);
179*89c4ff92SAndroid Build Coastguard Worker uint32_t period = ReadUint32(readBuffer2, 8);
180*89c4ff92SAndroid Build Coastguard Worker
181*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 26) & 0x3F) == 0); // packet family
182*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 16) & 0x3FF) == 4); // packet id
183*89c4ff92SAndroid Build Coastguard Worker CHECK(headerWord1 == 4); // data lenght
184*89c4ff92SAndroid Build Coastguard Worker CHECK(period == 1000); // capture period
185*89c4ff92SAndroid Build Coastguard Worker
186*89c4ff92SAndroid Build Coastguard Worker // Full packet message
187*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer3(512);
188*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendPacket3(mockBuffer3,
189*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
190*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
191*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
192*89c4ff92SAndroid Build Coastguard Worker
193*89c4ff92SAndroid Build Coastguard Worker selectedCounterIds.reserve(5);
194*89c4ff92SAndroid Build Coastguard Worker selectedCounterIds.emplace_back(100);
195*89c4ff92SAndroid Build Coastguard Worker selectedCounterIds.emplace_back(200);
196*89c4ff92SAndroid Build Coastguard Worker selectedCounterIds.emplace_back(300);
197*89c4ff92SAndroid Build Coastguard Worker selectedCounterIds.emplace_back(400);
198*89c4ff92SAndroid Build Coastguard Worker selectedCounterIds.emplace_back(500);
199*89c4ff92SAndroid Build Coastguard Worker sendPacket3.SendPeriodicCounterSelectionPacket(capturePeriod, selectedCounterIds);
200*89c4ff92SAndroid Build Coastguard Worker auto readBuffer3 = mockBuffer3.GetReadableBuffer();
201*89c4ff92SAndroid Build Coastguard Worker
202*89c4ff92SAndroid Build Coastguard Worker headerWord0 = ReadUint32(readBuffer3, 0);
203*89c4ff92SAndroid Build Coastguard Worker headerWord1 = ReadUint32(readBuffer3, 4);
204*89c4ff92SAndroid Build Coastguard Worker period = ReadUint32(readBuffer3, 8);
205*89c4ff92SAndroid Build Coastguard Worker
206*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 26) & 0x3F) == 0); // packet family
207*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 16) & 0x3FF) == 4); // packet id
208*89c4ff92SAndroid Build Coastguard Worker CHECK(headerWord1 == 14); // data lenght
209*89c4ff92SAndroid Build Coastguard Worker CHECK(period == 1000); // capture period
210*89c4ff92SAndroid Build Coastguard Worker
211*89c4ff92SAndroid Build Coastguard Worker uint16_t counterId = 0;
212*89c4ff92SAndroid Build Coastguard Worker uint32_t offset = 12;
213*89c4ff92SAndroid Build Coastguard Worker
214*89c4ff92SAndroid Build Coastguard Worker // Counter Ids
215*89c4ff92SAndroid Build Coastguard Worker for(const uint16_t& id : selectedCounterIds)
216*89c4ff92SAndroid Build Coastguard Worker {
217*89c4ff92SAndroid Build Coastguard Worker counterId = ReadUint16(readBuffer3, offset);
218*89c4ff92SAndroid Build Coastguard Worker CHECK(counterId == id);
219*89c4ff92SAndroid Build Coastguard Worker offset += 2;
220*89c4ff92SAndroid Build Coastguard Worker }
221*89c4ff92SAndroid Build Coastguard Worker }
222*89c4ff92SAndroid Build Coastguard Worker
223*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendPeriodicCounterCapturePacketTest")
224*89c4ff92SAndroid Build Coastguard Worker {
225*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
226*89c4ff92SAndroid Build Coastguard Worker
227*89c4ff92SAndroid Build Coastguard Worker // Error no space left in buffer
228*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer1(10);
229*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendPacket1(mockBuffer1,
230*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
231*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
232*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
233*89c4ff92SAndroid Build Coastguard Worker
234*89c4ff92SAndroid Build Coastguard Worker auto captureTimestamp = std::chrono::steady_clock::now();
235*89c4ff92SAndroid Build Coastguard Worker uint64_t time = static_cast<uint64_t >(captureTimestamp.time_since_epoch().count());
236*89c4ff92SAndroid Build Coastguard Worker std::vector<CounterValue> indexValuePairs;
237*89c4ff92SAndroid Build Coastguard Worker
238*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendPacket1.SendPeriodicCounterCapturePacket(time, indexValuePairs),
239*89c4ff92SAndroid Build Coastguard Worker BufferExhaustion);
240*89c4ff92SAndroid Build Coastguard Worker
241*89c4ff92SAndroid Build Coastguard Worker // Packet without any counters
242*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer2(512);
243*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendPacket2(mockBuffer2,
244*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
245*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
246*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
247*89c4ff92SAndroid Build Coastguard Worker
248*89c4ff92SAndroid Build Coastguard Worker sendPacket2.SendPeriodicCounterCapturePacket(time, indexValuePairs);
249*89c4ff92SAndroid Build Coastguard Worker auto readBuffer2 = mockBuffer2.GetReadableBuffer();
250*89c4ff92SAndroid Build Coastguard Worker
251*89c4ff92SAndroid Build Coastguard Worker uint32_t headerWord0 = ReadUint32(readBuffer2, 0);
252*89c4ff92SAndroid Build Coastguard Worker uint32_t headerWord1 = ReadUint32(readBuffer2, 4);
253*89c4ff92SAndroid Build Coastguard Worker uint64_t readTimestamp = ReadUint64(readBuffer2, 8);
254*89c4ff92SAndroid Build Coastguard Worker
255*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 26) & 0x0000003F) == 3); // packet family
256*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 19) & 0x0000007F) == 0); // packet class
257*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 16) & 0x00000007) == 0); // packet type
258*89c4ff92SAndroid Build Coastguard Worker CHECK(headerWord1 == 8); // data length
259*89c4ff92SAndroid Build Coastguard Worker CHECK(time == readTimestamp); // capture period
260*89c4ff92SAndroid Build Coastguard Worker
261*89c4ff92SAndroid Build Coastguard Worker // Full packet message
262*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer3(512);
263*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendPacket3(mockBuffer3,
264*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
265*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
266*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
267*89c4ff92SAndroid Build Coastguard Worker
268*89c4ff92SAndroid Build Coastguard Worker indexValuePairs.reserve(5);
269*89c4ff92SAndroid Build Coastguard Worker indexValuePairs.emplace_back(CounterValue{0, 100});
270*89c4ff92SAndroid Build Coastguard Worker indexValuePairs.emplace_back(CounterValue{1, 200});
271*89c4ff92SAndroid Build Coastguard Worker indexValuePairs.emplace_back(CounterValue{2, 300});
272*89c4ff92SAndroid Build Coastguard Worker indexValuePairs.emplace_back(CounterValue{3, 400});
273*89c4ff92SAndroid Build Coastguard Worker indexValuePairs.emplace_back(CounterValue{4, 500});
274*89c4ff92SAndroid Build Coastguard Worker sendPacket3.SendPeriodicCounterCapturePacket(time, indexValuePairs);
275*89c4ff92SAndroid Build Coastguard Worker auto readBuffer3 = mockBuffer3.GetReadableBuffer();
276*89c4ff92SAndroid Build Coastguard Worker
277*89c4ff92SAndroid Build Coastguard Worker headerWord0 = ReadUint32(readBuffer3, 0);
278*89c4ff92SAndroid Build Coastguard Worker headerWord1 = ReadUint32(readBuffer3, 4);
279*89c4ff92SAndroid Build Coastguard Worker uint64_t readTimestamp2 = ReadUint64(readBuffer3, 8);
280*89c4ff92SAndroid Build Coastguard Worker
281*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 26) & 0x0000003F) == 3); // packet family
282*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 19) & 0x0000007F) == 0); // packet class
283*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 16) & 0x00000007) == 0); // packet type
284*89c4ff92SAndroid Build Coastguard Worker CHECK(headerWord1 == 38); // data length
285*89c4ff92SAndroid Build Coastguard Worker CHECK(time == readTimestamp2); // capture period
286*89c4ff92SAndroid Build Coastguard Worker
287*89c4ff92SAndroid Build Coastguard Worker uint16_t counterIndex = 0;
288*89c4ff92SAndroid Build Coastguard Worker uint32_t counterValue = 100;
289*89c4ff92SAndroid Build Coastguard Worker uint32_t offset = 16;
290*89c4ff92SAndroid Build Coastguard Worker
291*89c4ff92SAndroid Build Coastguard Worker // Counter Ids
292*89c4ff92SAndroid Build Coastguard Worker for (auto it = indexValuePairs.begin(), end = indexValuePairs.end(); it != end; ++it)
293*89c4ff92SAndroid Build Coastguard Worker {
294*89c4ff92SAndroid Build Coastguard Worker // Check Counter Index
295*89c4ff92SAndroid Build Coastguard Worker uint16_t readIndex = ReadUint16(readBuffer3, offset);
296*89c4ff92SAndroid Build Coastguard Worker CHECK(counterIndex == readIndex);
297*89c4ff92SAndroid Build Coastguard Worker counterIndex++;
298*89c4ff92SAndroid Build Coastguard Worker offset += 2;
299*89c4ff92SAndroid Build Coastguard Worker
300*89c4ff92SAndroid Build Coastguard Worker // Check Counter Value
301*89c4ff92SAndroid Build Coastguard Worker uint32_t readValue = ReadUint32(readBuffer3, offset);
302*89c4ff92SAndroid Build Coastguard Worker CHECK(counterValue == readValue);
303*89c4ff92SAndroid Build Coastguard Worker counterValue += 100;
304*89c4ff92SAndroid Build Coastguard Worker offset += 4;
305*89c4ff92SAndroid Build Coastguard Worker }
306*89c4ff92SAndroid Build Coastguard Worker
307*89c4ff92SAndroid Build Coastguard Worker }
308*89c4ff92SAndroid Build Coastguard Worker
309*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendStreamMetaDataPacketTest")
310*89c4ff92SAndroid Build Coastguard Worker {
311*89c4ff92SAndroid Build Coastguard Worker uint32_t sizeUint32 = arm::pipe::numeric_cast<uint32_t>(sizeof(uint32_t));
312*89c4ff92SAndroid Build Coastguard Worker
313*89c4ff92SAndroid Build Coastguard Worker // Error no space left in buffer
314*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer1(10);
315*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendPacket1(mockBuffer1,
316*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
317*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
318*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
319*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendPacket1.SendStreamMetaDataPacket(), BufferExhaustion);
320*89c4ff92SAndroid Build Coastguard Worker
321*89c4ff92SAndroid Build Coastguard Worker // Full metadata packet
322*89c4ff92SAndroid Build Coastguard Worker
323*89c4ff92SAndroid Build Coastguard Worker std::string processName = GetProcessName().substr(0, 60);
324*89c4ff92SAndroid Build Coastguard Worker
325*89c4ff92SAndroid Build Coastguard Worker uint32_t infoSize = arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_SOFTWARE_INFO.size()) + 1;
326*89c4ff92SAndroid Build Coastguard Worker uint32_t hardwareVersionSize = arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_HARDWARE_VERSION.size()) + 1;
327*89c4ff92SAndroid Build Coastguard Worker uint32_t softwareVersionSize = arm::pipe::numeric_cast<uint32_t>(arm::pipe::ARMNN_SOFTWARE_VERSION.size()) + 1;
328*89c4ff92SAndroid Build Coastguard Worker uint32_t processNameSize = arm::pipe::numeric_cast<uint32_t>(processName.size()) + 1;
329*89c4ff92SAndroid Build Coastguard Worker
330*89c4ff92SAndroid Build Coastguard Worker // Supported Packets
331*89c4ff92SAndroid Build Coastguard Worker // Packet Encoding version 1.0.0
332*89c4ff92SAndroid Build Coastguard Worker // Control packet family
333*89c4ff92SAndroid Build Coastguard Worker // Stream metadata packet (packet family=0; packet id=0)
334*89c4ff92SAndroid Build Coastguard Worker // Connection Acknowledged packet ( packet family=0, packet id=1) Version 1.0.0
335*89c4ff92SAndroid Build Coastguard Worker // Counter Directory packet (packet family=0; packet id=2) Version 1.0.0
336*89c4ff92SAndroid Build Coastguard Worker // Request Counter Directory packet ( packet family=0, packet id=3) Version 1.0.0
337*89c4ff92SAndroid Build Coastguard Worker // Periodic Counter Selection packet ( packet family=0, packet id=4) Version 1.0.0
338*89c4ff92SAndroid Build Coastguard Worker // Per Job Counter Selection packet ( packet family=0, packet id=5) Version 1.0.0
339*89c4ff92SAndroid Build Coastguard Worker // Activate Timeline Reporting (packet family = 0, packet id = 6) Version 1.0.0
340*89c4ff92SAndroid Build Coastguard Worker // Deactivate Timeline Reporting (packet family = 0, packet id = 7) Version 1.0.0
341*89c4ff92SAndroid Build Coastguard Worker // Counter Packet Family
342*89c4ff92SAndroid Build Coastguard Worker // Periodic Counter Capture (packet_family = 3, packet_class = 0, packet_type = 0) Version 1.0.0
343*89c4ff92SAndroid Build Coastguard Worker // Per-Job Counter Capture (packet_family = 3, packet_class = 1, packet_type = 0,1) Version 1.0.0
344*89c4ff92SAndroid Build Coastguard Worker // Timeline Packet Family
345*89c4ff92SAndroid Build Coastguard Worker // Timeline Message Directory (packet_family = 1, packet_class = 0, packet_type = 0) Version 1.0.0
346*89c4ff92SAndroid Build Coastguard Worker // Timeline Message (packet_family = 1, packet_class = 0, packet_type = 1) Version 1.0.0
347*89c4ff92SAndroid Build Coastguard Worker std::vector<std::pair<uint32_t, uint32_t>> packetVersions;
348*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(0, 0), arm::pipe::EncodeVersion(1, 0, 0)));
349*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(0, 1), arm::pipe::EncodeVersion(1, 0, 0)));
350*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(0, 2), arm::pipe::EncodeVersion(1, 0, 0)));
351*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(0, 3), arm::pipe::EncodeVersion(1, 0, 0)));
352*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(0, 4), arm::pipe::EncodeVersion(1, 0, 0)));
353*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(0, 5), arm::pipe::EncodeVersion(1, 0, 0)));
354*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(0, 6), arm::pipe::EncodeVersion(1, 0, 0)));
355*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(0, 7), arm::pipe::EncodeVersion(1, 0, 0)));
356*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(3, 0, 0), arm::pipe::EncodeVersion(1, 0, 0)));
357*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(3, 1, 0), arm::pipe::EncodeVersion(1, 0, 0)));
358*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(3, 1, 1), arm::pipe::EncodeVersion(1, 0, 0)));
359*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(1, 0, 0), arm::pipe::EncodeVersion(1, 0, 0)));
360*89c4ff92SAndroid Build Coastguard Worker packetVersions.push_back(std::make_pair(ConstructHeader(1, 0, 1), arm::pipe::EncodeVersion(1, 0, 0)));
361*89c4ff92SAndroid Build Coastguard Worker
362*89c4ff92SAndroid Build Coastguard Worker uint32_t packetEntries = static_cast<uint32_t>(packetVersions.size());
363*89c4ff92SAndroid Build Coastguard Worker
364*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer2(512);
365*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendPacket2(mockBuffer2,
366*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
367*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
368*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
369*89c4ff92SAndroid Build Coastguard Worker sendPacket2.SendStreamMetaDataPacket();
370*89c4ff92SAndroid Build Coastguard Worker auto readBuffer2 = mockBuffer2.GetReadableBuffer();
371*89c4ff92SAndroid Build Coastguard Worker
372*89c4ff92SAndroid Build Coastguard Worker uint32_t headerWord0 = ReadUint32(readBuffer2, 0);
373*89c4ff92SAndroid Build Coastguard Worker uint32_t headerWord1 = ReadUint32(readBuffer2, sizeUint32);
374*89c4ff92SAndroid Build Coastguard Worker
375*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 26) & 0x3F) == 0); // packet family
376*89c4ff92SAndroid Build Coastguard Worker CHECK(((headerWord0 >> 16) & 0x3FF) == 0); // packet id
377*89c4ff92SAndroid Build Coastguard Worker
378*89c4ff92SAndroid Build Coastguard Worker uint32_t totalLength = arm::pipe::numeric_cast<uint32_t>(2 * sizeUint32 +
379*89c4ff92SAndroid Build Coastguard Worker 10 * sizeUint32 + infoSize +
380*89c4ff92SAndroid Build Coastguard Worker hardwareVersionSize + softwareVersionSize +
381*89c4ff92SAndroid Build Coastguard Worker processNameSize + sizeUint32 +
382*89c4ff92SAndroid Build Coastguard Worker 2 * packetEntries * sizeUint32);
383*89c4ff92SAndroid Build Coastguard Worker
384*89c4ff92SAndroid Build Coastguard Worker CHECK(headerWord1 == totalLength - (2 * sizeUint32)); // data length
385*89c4ff92SAndroid Build Coastguard Worker
386*89c4ff92SAndroid Build Coastguard Worker uint32_t offset = sizeUint32 * 2;
387*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == arm::pipe::PIPE_MAGIC); // pipe_magic
388*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
389*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == arm::pipe::EncodeVersion(1, 0, 0)); // stream_metadata_version
390*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
391*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == MAX_METADATA_PACKET_LENGTH); // max_data_len
392*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
393*89c4ff92SAndroid Build Coastguard Worker int pid = arm::pipe::GetCurrentProcessId();
394*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == arm::pipe::numeric_cast<uint32_t>(pid));
395*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
396*89c4ff92SAndroid Build Coastguard Worker uint32_t poolOffset = 10 * sizeUint32;
397*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == poolOffset); // offset_info
398*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
399*89c4ff92SAndroid Build Coastguard Worker poolOffset += infoSize;
400*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == poolOffset); // offset_hw_version
401*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
402*89c4ff92SAndroid Build Coastguard Worker poolOffset += hardwareVersionSize;
403*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == poolOffset); // offset_sw_version
404*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
405*89c4ff92SAndroid Build Coastguard Worker poolOffset += softwareVersionSize;
406*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == poolOffset); // offset_process_name
407*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
408*89c4ff92SAndroid Build Coastguard Worker poolOffset += processNameSize;
409*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == poolOffset); // offset_packet_version_table
410*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
411*89c4ff92SAndroid Build Coastguard Worker CHECK(ReadUint32(readBuffer2, offset) == 0); // reserved
412*89c4ff92SAndroid Build Coastguard Worker
413*89c4ff92SAndroid Build Coastguard Worker const unsigned char* readData2 = readBuffer2->GetReadableData();
414*89c4ff92SAndroid Build Coastguard Worker
415*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
416*89c4ff92SAndroid Build Coastguard Worker if (infoSize)
417*89c4ff92SAndroid Build Coastguard Worker {
418*89c4ff92SAndroid Build Coastguard Worker CHECK(strcmp(reinterpret_cast<const char *>(&readData2[offset]),
419*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO.c_str()) == 0);
420*89c4ff92SAndroid Build Coastguard Worker offset += infoSize;
421*89c4ff92SAndroid Build Coastguard Worker }
422*89c4ff92SAndroid Build Coastguard Worker
423*89c4ff92SAndroid Build Coastguard Worker if (hardwareVersionSize)
424*89c4ff92SAndroid Build Coastguard Worker {
425*89c4ff92SAndroid Build Coastguard Worker CHECK(strcmp(reinterpret_cast<const char *>(&readData2[offset]),
426*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION.c_str()) == 0);
427*89c4ff92SAndroid Build Coastguard Worker offset += hardwareVersionSize;
428*89c4ff92SAndroid Build Coastguard Worker }
429*89c4ff92SAndroid Build Coastguard Worker
430*89c4ff92SAndroid Build Coastguard Worker if (softwareVersionSize)
431*89c4ff92SAndroid Build Coastguard Worker {
432*89c4ff92SAndroid Build Coastguard Worker CHECK(strcmp(reinterpret_cast<const char *>(&readData2[offset]),
433*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION.c_str()) == 0);
434*89c4ff92SAndroid Build Coastguard Worker offset += softwareVersionSize;
435*89c4ff92SAndroid Build Coastguard Worker }
436*89c4ff92SAndroid Build Coastguard Worker
437*89c4ff92SAndroid Build Coastguard Worker if (processNameSize)
438*89c4ff92SAndroid Build Coastguard Worker {
439*89c4ff92SAndroid Build Coastguard Worker CHECK(strcmp(reinterpret_cast<const char *>(&readData2[offset]), GetProcessName().c_str()) == 0);
440*89c4ff92SAndroid Build Coastguard Worker offset += processNameSize;
441*89c4ff92SAndroid Build Coastguard Worker }
442*89c4ff92SAndroid Build Coastguard Worker
443*89c4ff92SAndroid Build Coastguard Worker if (packetEntries)
444*89c4ff92SAndroid Build Coastguard Worker {
445*89c4ff92SAndroid Build Coastguard Worker uint32_t numberOfEntries = ReadUint32(readBuffer2, offset);
446*89c4ff92SAndroid Build Coastguard Worker CHECK((numberOfEntries >> 16) == packetEntries);
447*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
448*89c4ff92SAndroid Build Coastguard Worker for (std::pair<uint32_t, uint32_t>& packetVersion : packetVersions)
449*89c4ff92SAndroid Build Coastguard Worker {
450*89c4ff92SAndroid Build Coastguard Worker uint32_t readPacketId = ReadUint32(readBuffer2, offset);
451*89c4ff92SAndroid Build Coastguard Worker CHECK(packetVersion.first == readPacketId);
452*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
453*89c4ff92SAndroid Build Coastguard Worker uint32_t readVersion = ReadUint32(readBuffer2, offset);
454*89c4ff92SAndroid Build Coastguard Worker CHECK(packetVersion.second == readVersion);
455*89c4ff92SAndroid Build Coastguard Worker offset += sizeUint32;
456*89c4ff92SAndroid Build Coastguard Worker }
457*89c4ff92SAndroid Build Coastguard Worker }
458*89c4ff92SAndroid Build Coastguard Worker
459*89c4ff92SAndroid Build Coastguard Worker CHECK(offset == totalLength);
460*89c4ff92SAndroid Build Coastguard Worker }
461*89c4ff92SAndroid Build Coastguard Worker
462*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateDeviceRecordTest")
463*89c4ff92SAndroid Build Coastguard Worker {
464*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
465*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
466*89c4ff92SAndroid Build Coastguard Worker
467*89c4ff92SAndroid Build Coastguard Worker // Create a device for testing
468*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceUid = 27;
469*89c4ff92SAndroid Build Coastguard Worker const std::string deviceName = "some_device";
470*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceCores = 3;
471*89c4ff92SAndroid Build Coastguard Worker const DevicePtr device = std::make_unique<Device>(deviceUid, deviceName, deviceCores);
472*89c4ff92SAndroid Build Coastguard Worker
473*89c4ff92SAndroid Build Coastguard Worker // Create a device record
474*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::DeviceRecord deviceRecord;
475*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
476*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateDeviceRecordTest(device, deviceRecord, errorMessage);
477*89c4ff92SAndroid Build Coastguard Worker
478*89c4ff92SAndroid Build Coastguard Worker CHECK(result);
479*89c4ff92SAndroid Build Coastguard Worker CHECK(errorMessage.empty());
480*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecord.size() == 6); // Size in words: header [2] + device name [4]
481*89c4ff92SAndroid Build Coastguard Worker
482*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceRecordWord0[]
483*89c4ff92SAndroid Build Coastguard Worker {
484*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(deviceRecord[0] >> 16),
485*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(deviceRecord[0])
486*89c4ff92SAndroid Build Coastguard Worker };
487*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecordWord0[0] == deviceUid); // uid
488*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecordWord0[1] == deviceCores); // cores
489*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecord[1] == 8); // name_offset
490*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecord[2] == deviceName.size() + 1); // The length of the SWTrace string (name)
491*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(deviceRecord.data() + 3, deviceName.data(), deviceName.size()) == 0); // name
492*89c4ff92SAndroid Build Coastguard Worker }
493*89c4ff92SAndroid Build Coastguard Worker
494*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateInvalidDeviceRecordTest")
495*89c4ff92SAndroid Build Coastguard Worker {
496*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
497*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
498*89c4ff92SAndroid Build Coastguard Worker
499*89c4ff92SAndroid Build Coastguard Worker // Create a device for testing
500*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceUid = 27;
501*89c4ff92SAndroid Build Coastguard Worker const std::string deviceName = "some€£invalid‡device";
502*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceCores = 3;
503*89c4ff92SAndroid Build Coastguard Worker const DevicePtr device = std::make_unique<Device>(deviceUid, deviceName, deviceCores);
504*89c4ff92SAndroid Build Coastguard Worker
505*89c4ff92SAndroid Build Coastguard Worker // Create a device record
506*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::DeviceRecord deviceRecord;
507*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
508*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateDeviceRecordTest(device, deviceRecord, errorMessage);
509*89c4ff92SAndroid Build Coastguard Worker
510*89c4ff92SAndroid Build Coastguard Worker CHECK(!result);
511*89c4ff92SAndroid Build Coastguard Worker CHECK(!errorMessage.empty());
512*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecord.empty());
513*89c4ff92SAndroid Build Coastguard Worker }
514*89c4ff92SAndroid Build Coastguard Worker
515*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateCounterSetRecordTest")
516*89c4ff92SAndroid Build Coastguard Worker {
517*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
518*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
519*89c4ff92SAndroid Build Coastguard Worker
520*89c4ff92SAndroid Build Coastguard Worker // Create a counter set for testing
521*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetUid = 27;
522*89c4ff92SAndroid Build Coastguard Worker const std::string counterSetName = "some_counter_set";
523*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetCount = 3421;
524*89c4ff92SAndroid Build Coastguard Worker const CounterSetPtr counterSet = std::make_unique<CounterSet>(counterSetUid, counterSetName, counterSetCount);
525*89c4ff92SAndroid Build Coastguard Worker
526*89c4ff92SAndroid Build Coastguard Worker // Create a counter set record
527*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::CounterSetRecord counterSetRecord;
528*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
529*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateCounterSetRecordTest(counterSet, counterSetRecord, errorMessage);
530*89c4ff92SAndroid Build Coastguard Worker
531*89c4ff92SAndroid Build Coastguard Worker CHECK(result);
532*89c4ff92SAndroid Build Coastguard Worker CHECK(errorMessage.empty());
533*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecord.size() == 8); // Size in words: header [2] + counter set name [6]
534*89c4ff92SAndroid Build Coastguard Worker
535*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetRecordWord0[]
536*89c4ff92SAndroid Build Coastguard Worker {
537*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(counterSetRecord[0] >> 16),
538*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(counterSetRecord[0])
539*89c4ff92SAndroid Build Coastguard Worker };
540*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecordWord0[0] == counterSetUid); // uid
541*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecordWord0[1] == counterSetCount); // cores
542*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecord[1] == 8); // name_offset
543*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecord[2] == counterSetName.size() + 1); // The length of the SWTrace string (name)
544*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(counterSetRecord.data() + 3, counterSetName.data(), counterSetName.size()) == 0); // name
545*89c4ff92SAndroid Build Coastguard Worker }
546*89c4ff92SAndroid Build Coastguard Worker
547*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateInvalidCounterSetRecordTest")
548*89c4ff92SAndroid Build Coastguard Worker {
549*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
550*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
551*89c4ff92SAndroid Build Coastguard Worker
552*89c4ff92SAndroid Build Coastguard Worker // Create a counter set for testing
553*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetUid = 27;
554*89c4ff92SAndroid Build Coastguard Worker const std::string counterSetName = "some invalid_counter€£set";
555*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetCount = 3421;
556*89c4ff92SAndroid Build Coastguard Worker const CounterSetPtr counterSet = std::make_unique<CounterSet>(counterSetUid, counterSetName, counterSetCount);
557*89c4ff92SAndroid Build Coastguard Worker
558*89c4ff92SAndroid Build Coastguard Worker // Create a counter set record
559*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::CounterSetRecord counterSetRecord;
560*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
561*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateCounterSetRecordTest(counterSet, counterSetRecord, errorMessage);
562*89c4ff92SAndroid Build Coastguard Worker
563*89c4ff92SAndroid Build Coastguard Worker CHECK(!result);
564*89c4ff92SAndroid Build Coastguard Worker CHECK(!errorMessage.empty());
565*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecord.empty());
566*89c4ff92SAndroid Build Coastguard Worker }
567*89c4ff92SAndroid Build Coastguard Worker
568*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateEventRecordTest")
569*89c4ff92SAndroid Build Coastguard Worker {
570*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
571*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
572*89c4ff92SAndroid Build Coastguard Worker
573*89c4ff92SAndroid Build Coastguard Worker // Create a counter for testing
574*89c4ff92SAndroid Build Coastguard Worker uint16_t counterUid = 7256;
575*89c4ff92SAndroid Build Coastguard Worker uint16_t maxCounterUid = 132;
576*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceUid = 132;
577*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetUid = 4497;
578*89c4ff92SAndroid Build Coastguard Worker uint16_t counterClass = 1;
579*89c4ff92SAndroid Build Coastguard Worker uint16_t counterInterpolation = 1;
580*89c4ff92SAndroid Build Coastguard Worker double counterMultiplier = 1234.567f;
581*89c4ff92SAndroid Build Coastguard Worker const std::string counterName = "some_valid_counter";
582*89c4ff92SAndroid Build Coastguard Worker const std::string counterDescription = "a_counter_for_testing";
583*89c4ff92SAndroid Build Coastguard Worker const std::string counterUnits = "Mrads2";
584*89c4ff92SAndroid Build Coastguard Worker const CounterPtr counter = std::make_unique<Counter>(armnn::profiling::BACKEND_ID,
585*89c4ff92SAndroid Build Coastguard Worker counterUid,
586*89c4ff92SAndroid Build Coastguard Worker maxCounterUid,
587*89c4ff92SAndroid Build Coastguard Worker counterClass,
588*89c4ff92SAndroid Build Coastguard Worker counterInterpolation,
589*89c4ff92SAndroid Build Coastguard Worker counterMultiplier,
590*89c4ff92SAndroid Build Coastguard Worker counterName,
591*89c4ff92SAndroid Build Coastguard Worker counterDescription,
592*89c4ff92SAndroid Build Coastguard Worker counterUnits,
593*89c4ff92SAndroid Build Coastguard Worker deviceUid,
594*89c4ff92SAndroid Build Coastguard Worker counterSetUid);
595*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(counter);
596*89c4ff92SAndroid Build Coastguard Worker
597*89c4ff92SAndroid Build Coastguard Worker // Create an event record
598*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::EventRecord eventRecord;
599*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
600*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateEventRecordTest(counter, eventRecord, errorMessage);
601*89c4ff92SAndroid Build Coastguard Worker
602*89c4ff92SAndroid Build Coastguard Worker CHECK(result);
603*89c4ff92SAndroid Build Coastguard Worker CHECK(errorMessage.empty());
604*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord.size() == 24); // Size in words: header [8] + counter name [6] + description [7] + units [3]
605*89c4ff92SAndroid Build Coastguard Worker
606*89c4ff92SAndroid Build Coastguard Worker uint16_t eventRecordWord0[]
607*89c4ff92SAndroid Build Coastguard Worker {
608*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[0] >> 16),
609*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[0])
610*89c4ff92SAndroid Build Coastguard Worker };
611*89c4ff92SAndroid Build Coastguard Worker uint16_t eventRecordWord1[]
612*89c4ff92SAndroid Build Coastguard Worker {
613*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[1] >> 16),
614*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[1])
615*89c4ff92SAndroid Build Coastguard Worker };
616*89c4ff92SAndroid Build Coastguard Worker uint16_t eventRecordWord2[]
617*89c4ff92SAndroid Build Coastguard Worker {
618*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[2] >> 16),
619*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[2])
620*89c4ff92SAndroid Build Coastguard Worker };
621*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecordWord34[]
622*89c4ff92SAndroid Build Coastguard Worker {
623*89c4ff92SAndroid Build Coastguard Worker eventRecord[3],
624*89c4ff92SAndroid Build Coastguard Worker eventRecord[4]
625*89c4ff92SAndroid Build Coastguard Worker };
626*89c4ff92SAndroid Build Coastguard Worker
627*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord0[0] == maxCounterUid); // max_counter_uid
628*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord0[1] == counterUid); // counter_uid
629*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord1[0] == deviceUid); // device
630*89c4ff92SAndroid Build Coastguard Worker
631*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord1[1] == counterSetUid); // counter_set
632*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord2[0] == counterClass); // class
633*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord2[1] == counterInterpolation); // interpolation
634*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(eventRecordWord34, &counterMultiplier, sizeof(counterMultiplier)) == 0); // multiplier
635*89c4ff92SAndroid Build Coastguard Worker
636*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_NO_CONVERSION_WARN_BEGIN
637*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecordBlockSize = 8u * sizeof(uint32_t);
638*89c4ff92SAndroid Build Coastguard Worker uint32_t counterNameOffset = eventRecordBlockSize; // The name is the first item in pool
639*89c4ff92SAndroid Build Coastguard Worker uint32_t counterDescriptionOffset = counterNameOffset + // Counter name offset
640*89c4ff92SAndroid Build Coastguard Worker 4u + // Counter name length (uint32_t)
641*89c4ff92SAndroid Build Coastguard Worker counterName.size() + // 18u
642*89c4ff92SAndroid Build Coastguard Worker 1u + // Null-terminator
643*89c4ff92SAndroid Build Coastguard Worker 1u; // Rounding to the next word
644*89c4ff92SAndroid Build Coastguard Worker
645*89c4ff92SAndroid Build Coastguard Worker size_t counterUnitsOffset = counterDescriptionOffset + // Counter description offset
646*89c4ff92SAndroid Build Coastguard Worker 4u + // Counter description length (uint32_t)
647*89c4ff92SAndroid Build Coastguard Worker counterDescription.size() + // 21u
648*89c4ff92SAndroid Build Coastguard Worker 1u + // Null-terminator
649*89c4ff92SAndroid Build Coastguard Worker 2u; // Rounding to the next word
650*89c4ff92SAndroid Build Coastguard Worker
651*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_NO_CONVERSION_WARN_END
652*89c4ff92SAndroid Build Coastguard Worker
653*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord[5] == counterNameOffset); // name_offset
654*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord[6] == counterDescriptionOffset); // description_offset
655*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord[7] == counterUnitsOffset); // units_offset
656*89c4ff92SAndroid Build Coastguard Worker
657*89c4ff92SAndroid Build Coastguard Worker // Offsets are relative to the start of the eventRecord
658*89c4ff92SAndroid Build Coastguard Worker auto eventRecordPool = reinterpret_cast<unsigned char*>(eventRecord.data());
659*89c4ff92SAndroid Build Coastguard Worker size_t uint32_t_size = sizeof(uint32_t);
660*89c4ff92SAndroid Build Coastguard Worker
661*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace string (name)
662*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterNameOffset] == counterName.size() + 1);
663*89c4ff92SAndroid Build Coastguard Worker // The counter name
664*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(eventRecordPool +
665*89c4ff92SAndroid Build Coastguard Worker counterNameOffset + // Offset
666*89c4ff92SAndroid Build Coastguard Worker uint32_t_size /* The length of the name */,
667*89c4ff92SAndroid Build Coastguard Worker counterName.data(),
668*89c4ff92SAndroid Build Coastguard Worker counterName.size()) == 0); // name
669*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the name
670*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterNameOffset + uint32_t_size + counterName.size()] == '\0');
671*89c4ff92SAndroid Build Coastguard Worker
672*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace string (description)
673*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterDescriptionOffset] == counterDescription.size() + 1);
674*89c4ff92SAndroid Build Coastguard Worker // The counter description
675*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(eventRecordPool +
676*89c4ff92SAndroid Build Coastguard Worker counterDescriptionOffset + // Offset
677*89c4ff92SAndroid Build Coastguard Worker uint32_t_size /* The length of the description */,
678*89c4ff92SAndroid Build Coastguard Worker counterDescription.data(),
679*89c4ff92SAndroid Build Coastguard Worker counterDescription.size()) == 0); // description
680*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the description
681*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterDescriptionOffset + uint32_t_size + counterDescription.size()] == '\0');
682*89c4ff92SAndroid Build Coastguard Worker
683*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace namestring (units)
684*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterUnitsOffset] == counterUnits.size() + 1);
685*89c4ff92SAndroid Build Coastguard Worker // The counter units
686*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(eventRecordPool +
687*89c4ff92SAndroid Build Coastguard Worker counterUnitsOffset + // Offset
688*89c4ff92SAndroid Build Coastguard Worker uint32_t_size /* The length of the units */,
689*89c4ff92SAndroid Build Coastguard Worker counterUnits.data(),
690*89c4ff92SAndroid Build Coastguard Worker counterUnits.size()) == 0); // units
691*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the units
692*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterUnitsOffset + uint32_t_size + counterUnits.size()] == '\0');
693*89c4ff92SAndroid Build Coastguard Worker }
694*89c4ff92SAndroid Build Coastguard Worker
695*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateEventRecordNoUnitsTest")
696*89c4ff92SAndroid Build Coastguard Worker {
697*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
698*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
699*89c4ff92SAndroid Build Coastguard Worker
700*89c4ff92SAndroid Build Coastguard Worker // Create a counter for testing
701*89c4ff92SAndroid Build Coastguard Worker uint16_t counterUid = 44312;
702*89c4ff92SAndroid Build Coastguard Worker uint16_t maxCounterUid = 345;
703*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceUid = 101;
704*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetUid = 34035;
705*89c4ff92SAndroid Build Coastguard Worker uint16_t counterClass = 0;
706*89c4ff92SAndroid Build Coastguard Worker uint16_t counterInterpolation = 1;
707*89c4ff92SAndroid Build Coastguard Worker double counterMultiplier = 4435.0023f;
708*89c4ff92SAndroid Build Coastguard Worker const std::string counterName = "some_valid_counter";
709*89c4ff92SAndroid Build Coastguard Worker const std::string counterDescription = "a_counter_for_testing";
710*89c4ff92SAndroid Build Coastguard Worker const CounterPtr counter = std::make_unique<Counter>(armnn::profiling::BACKEND_ID,
711*89c4ff92SAndroid Build Coastguard Worker counterUid,
712*89c4ff92SAndroid Build Coastguard Worker maxCounterUid,
713*89c4ff92SAndroid Build Coastguard Worker counterClass,
714*89c4ff92SAndroid Build Coastguard Worker counterInterpolation,
715*89c4ff92SAndroid Build Coastguard Worker counterMultiplier,
716*89c4ff92SAndroid Build Coastguard Worker counterName,
717*89c4ff92SAndroid Build Coastguard Worker counterDescription,
718*89c4ff92SAndroid Build Coastguard Worker "",
719*89c4ff92SAndroid Build Coastguard Worker deviceUid,
720*89c4ff92SAndroid Build Coastguard Worker counterSetUid);
721*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(counter);
722*89c4ff92SAndroid Build Coastguard Worker
723*89c4ff92SAndroid Build Coastguard Worker // Create an event record
724*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::EventRecord eventRecord;
725*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
726*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateEventRecordTest(counter, eventRecord, errorMessage);
727*89c4ff92SAndroid Build Coastguard Worker
728*89c4ff92SAndroid Build Coastguard Worker CHECK(result);
729*89c4ff92SAndroid Build Coastguard Worker CHECK(errorMessage.empty());
730*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord.size() == 21); // Size in words: header [8] + counter name [6] + description [7]
731*89c4ff92SAndroid Build Coastguard Worker
732*89c4ff92SAndroid Build Coastguard Worker uint16_t eventRecordWord0[]
733*89c4ff92SAndroid Build Coastguard Worker {
734*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[0] >> 16),
735*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[0])
736*89c4ff92SAndroid Build Coastguard Worker };
737*89c4ff92SAndroid Build Coastguard Worker uint16_t eventRecordWord1[]
738*89c4ff92SAndroid Build Coastguard Worker {
739*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[1] >> 16),
740*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[1])
741*89c4ff92SAndroid Build Coastguard Worker };
742*89c4ff92SAndroid Build Coastguard Worker uint16_t eventRecordWord2[]
743*89c4ff92SAndroid Build Coastguard Worker {
744*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[2] >> 16),
745*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(eventRecord[2])
746*89c4ff92SAndroid Build Coastguard Worker };
747*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecordWord34[]
748*89c4ff92SAndroid Build Coastguard Worker {
749*89c4ff92SAndroid Build Coastguard Worker eventRecord[3],
750*89c4ff92SAndroid Build Coastguard Worker eventRecord[4]
751*89c4ff92SAndroid Build Coastguard Worker };
752*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord0[0] == maxCounterUid); // max_counter_uid
753*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord0[1] == counterUid); // counter_uid
754*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord1[0] == deviceUid); // device
755*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord1[1] == counterSetUid); // counter_set
756*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord2[0] == counterClass); // class
757*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordWord2[1] == counterInterpolation); // interpolation
758*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(eventRecordWord34, &counterMultiplier, sizeof(counterMultiplier)) == 0); // multiplier
759*89c4ff92SAndroid Build Coastguard Worker
760*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_NO_CONVERSION_WARN_BEGIN
761*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecordBlockSize = 8u * sizeof(uint32_t);
762*89c4ff92SAndroid Build Coastguard Worker uint32_t counterNameOffset = eventRecordBlockSize; // The name is the first item in pool
763*89c4ff92SAndroid Build Coastguard Worker uint32_t counterDescriptionOffset = counterNameOffset + // Counter name offset
764*89c4ff92SAndroid Build Coastguard Worker 4u + // Counter name length (uint32_t)
765*89c4ff92SAndroid Build Coastguard Worker counterName.size() + // 18u
766*89c4ff92SAndroid Build Coastguard Worker 1u + // Null-terminator
767*89c4ff92SAndroid Build Coastguard Worker 1u; // Rounding to the next word
768*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_NO_CONVERSION_WARN_END
769*89c4ff92SAndroid Build Coastguard Worker
770*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord[5] == counterNameOffset); // name_offset
771*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord[6] == counterDescriptionOffset); // description_offset
772*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord[7] == 0); // units_offset
773*89c4ff92SAndroid Build Coastguard Worker
774*89c4ff92SAndroid Build Coastguard Worker // Offsets are relative to the start of the eventRecord
775*89c4ff92SAndroid Build Coastguard Worker auto eventRecordPool = reinterpret_cast<unsigned char*>(eventRecord.data());
776*89c4ff92SAndroid Build Coastguard Worker size_t uint32_t_size = sizeof(uint32_t);
777*89c4ff92SAndroid Build Coastguard Worker
778*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace string (name)
779*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterNameOffset] == counterName.size() + 1);
780*89c4ff92SAndroid Build Coastguard Worker // The counter name
781*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(eventRecordPool +
782*89c4ff92SAndroid Build Coastguard Worker counterNameOffset + // Offset
783*89c4ff92SAndroid Build Coastguard Worker uint32_t_size, // The length of the name
784*89c4ff92SAndroid Build Coastguard Worker counterName.data(),
785*89c4ff92SAndroid Build Coastguard Worker counterName.size()) == 0); // name
786*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the name
787*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterNameOffset + uint32_t_size + counterName.size()] == '\0');
788*89c4ff92SAndroid Build Coastguard Worker
789*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace string (description)
790*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterDescriptionOffset] == counterDescription.size() + 1);
791*89c4ff92SAndroid Build Coastguard Worker // The counter description
792*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(eventRecordPool +
793*89c4ff92SAndroid Build Coastguard Worker counterDescriptionOffset + // Offset
794*89c4ff92SAndroid Build Coastguard Worker uint32_t_size, // The length of the description
795*89c4ff92SAndroid Build Coastguard Worker counterDescription.data(),
796*89c4ff92SAndroid Build Coastguard Worker counterDescription.size()) == 0); // description
797*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the description
798*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordPool[counterDescriptionOffset + uint32_t_size + counterDescription.size()] == '\0');
799*89c4ff92SAndroid Build Coastguard Worker }
800*89c4ff92SAndroid Build Coastguard Worker
801*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateInvalidEventRecordTest1")
802*89c4ff92SAndroid Build Coastguard Worker {
803*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
804*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
805*89c4ff92SAndroid Build Coastguard Worker
806*89c4ff92SAndroid Build Coastguard Worker // Create a counter for testing
807*89c4ff92SAndroid Build Coastguard Worker uint16_t counterUid = 7256;
808*89c4ff92SAndroid Build Coastguard Worker uint16_t maxCounterUid = 132;
809*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceUid = 132;
810*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetUid = 4497;
811*89c4ff92SAndroid Build Coastguard Worker uint16_t counterClass = 1;
812*89c4ff92SAndroid Build Coastguard Worker uint16_t counterInterpolation = 1;
813*89c4ff92SAndroid Build Coastguard Worker double counterMultiplier = 1234.567f;
814*89c4ff92SAndroid Build Coastguard Worker const std::string counterName = "some_invalid_counter £££"; // Invalid name
815*89c4ff92SAndroid Build Coastguard Worker const std::string counterDescription = "a_counter_for_testing";
816*89c4ff92SAndroid Build Coastguard Worker const std::string counterUnits = "Mrads2";
817*89c4ff92SAndroid Build Coastguard Worker const CounterPtr counter = std::make_unique<Counter>(armnn::profiling::BACKEND_ID,
818*89c4ff92SAndroid Build Coastguard Worker counterUid,
819*89c4ff92SAndroid Build Coastguard Worker maxCounterUid,
820*89c4ff92SAndroid Build Coastguard Worker counterClass,
821*89c4ff92SAndroid Build Coastguard Worker counterInterpolation,
822*89c4ff92SAndroid Build Coastguard Worker counterMultiplier,
823*89c4ff92SAndroid Build Coastguard Worker counterName,
824*89c4ff92SAndroid Build Coastguard Worker counterDescription,
825*89c4ff92SAndroid Build Coastguard Worker counterUnits,
826*89c4ff92SAndroid Build Coastguard Worker deviceUid,
827*89c4ff92SAndroid Build Coastguard Worker counterSetUid);
828*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(counter);
829*89c4ff92SAndroid Build Coastguard Worker
830*89c4ff92SAndroid Build Coastguard Worker // Create an event record
831*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::EventRecord eventRecord;
832*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
833*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateEventRecordTest(counter, eventRecord, errorMessage);
834*89c4ff92SAndroid Build Coastguard Worker
835*89c4ff92SAndroid Build Coastguard Worker CHECK(!result);
836*89c4ff92SAndroid Build Coastguard Worker CHECK(!errorMessage.empty());
837*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord.empty());
838*89c4ff92SAndroid Build Coastguard Worker }
839*89c4ff92SAndroid Build Coastguard Worker
840*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateInvalidEventRecordTest2")
841*89c4ff92SAndroid Build Coastguard Worker {
842*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
843*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
844*89c4ff92SAndroid Build Coastguard Worker
845*89c4ff92SAndroid Build Coastguard Worker // Create a counter for testing
846*89c4ff92SAndroid Build Coastguard Worker uint16_t counterUid = 7256;
847*89c4ff92SAndroid Build Coastguard Worker uint16_t maxCounterUid = 132;
848*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceUid = 132;
849*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetUid = 4497;
850*89c4ff92SAndroid Build Coastguard Worker uint16_t counterClass = 1;
851*89c4ff92SAndroid Build Coastguard Worker uint16_t counterInterpolation = 1;
852*89c4ff92SAndroid Build Coastguard Worker double counterMultiplier = 1234.567f;
853*89c4ff92SAndroid Build Coastguard Worker const std::string counterName = "some_invalid_counter";
854*89c4ff92SAndroid Build Coastguard Worker const std::string counterDescription = "an invalid d€scription"; // Invalid description
855*89c4ff92SAndroid Build Coastguard Worker const std::string counterUnits = "Mrads2";
856*89c4ff92SAndroid Build Coastguard Worker const CounterPtr counter = std::make_unique<Counter>(armnn::profiling::BACKEND_ID,
857*89c4ff92SAndroid Build Coastguard Worker counterUid,
858*89c4ff92SAndroid Build Coastguard Worker maxCounterUid,
859*89c4ff92SAndroid Build Coastguard Worker counterClass,
860*89c4ff92SAndroid Build Coastguard Worker counterInterpolation,
861*89c4ff92SAndroid Build Coastguard Worker counterMultiplier,
862*89c4ff92SAndroid Build Coastguard Worker counterName,
863*89c4ff92SAndroid Build Coastguard Worker counterDescription,
864*89c4ff92SAndroid Build Coastguard Worker counterUnits,
865*89c4ff92SAndroid Build Coastguard Worker deviceUid,
866*89c4ff92SAndroid Build Coastguard Worker counterSetUid);
867*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(counter);
868*89c4ff92SAndroid Build Coastguard Worker
869*89c4ff92SAndroid Build Coastguard Worker // Create an event record
870*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::EventRecord eventRecord;
871*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
872*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateEventRecordTest(counter, eventRecord, errorMessage);
873*89c4ff92SAndroid Build Coastguard Worker
874*89c4ff92SAndroid Build Coastguard Worker CHECK(!result);
875*89c4ff92SAndroid Build Coastguard Worker CHECK(!errorMessage.empty());
876*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord.empty());
877*89c4ff92SAndroid Build Coastguard Worker }
878*89c4ff92SAndroid Build Coastguard Worker
879*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateInvalidEventRecordTest3")
880*89c4ff92SAndroid Build Coastguard Worker {
881*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
882*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
883*89c4ff92SAndroid Build Coastguard Worker
884*89c4ff92SAndroid Build Coastguard Worker // Create a counter for testing
885*89c4ff92SAndroid Build Coastguard Worker uint16_t counterUid = 7256;
886*89c4ff92SAndroid Build Coastguard Worker uint16_t maxCounterUid = 132;
887*89c4ff92SAndroid Build Coastguard Worker uint16_t deviceUid = 132;
888*89c4ff92SAndroid Build Coastguard Worker uint16_t counterSetUid = 4497;
889*89c4ff92SAndroid Build Coastguard Worker uint16_t counterClass = 1;
890*89c4ff92SAndroid Build Coastguard Worker uint16_t counterInterpolation = 1;
891*89c4ff92SAndroid Build Coastguard Worker double counterMultiplier = 1234.567f;
892*89c4ff92SAndroid Build Coastguard Worker const std::string counterName = "some_invalid_counter";
893*89c4ff92SAndroid Build Coastguard Worker const std::string counterDescription = "a valid description";
894*89c4ff92SAndroid Build Coastguard Worker const std::string counterUnits = "Mrad s2"; // Invalid units
895*89c4ff92SAndroid Build Coastguard Worker const CounterPtr counter = std::make_unique<Counter>(armnn::profiling::BACKEND_ID,
896*89c4ff92SAndroid Build Coastguard Worker counterUid,
897*89c4ff92SAndroid Build Coastguard Worker maxCounterUid,
898*89c4ff92SAndroid Build Coastguard Worker counterClass,
899*89c4ff92SAndroid Build Coastguard Worker counterInterpolation,
900*89c4ff92SAndroid Build Coastguard Worker counterMultiplier,
901*89c4ff92SAndroid Build Coastguard Worker counterName,
902*89c4ff92SAndroid Build Coastguard Worker counterDescription,
903*89c4ff92SAndroid Build Coastguard Worker counterUnits,
904*89c4ff92SAndroid Build Coastguard Worker deviceUid,
905*89c4ff92SAndroid Build Coastguard Worker counterSetUid);
906*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(counter);
907*89c4ff92SAndroid Build Coastguard Worker
908*89c4ff92SAndroid Build Coastguard Worker // Create an event record
909*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::EventRecord eventRecord;
910*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
911*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateEventRecordTest(counter, eventRecord, errorMessage);
912*89c4ff92SAndroid Build Coastguard Worker
913*89c4ff92SAndroid Build Coastguard Worker CHECK(!result);
914*89c4ff92SAndroid Build Coastguard Worker CHECK(!errorMessage.empty());
915*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord.empty());
916*89c4ff92SAndroid Build Coastguard Worker }
917*89c4ff92SAndroid Build Coastguard Worker
918*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateCategoryRecordTest")
919*89c4ff92SAndroid Build Coastguard Worker {
920*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
921*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
922*89c4ff92SAndroid Build Coastguard Worker
923*89c4ff92SAndroid Build Coastguard Worker // Create a category for testing
924*89c4ff92SAndroid Build Coastguard Worker const std::string categoryName = "some_category";
925*89c4ff92SAndroid Build Coastguard Worker const CategoryPtr category = std::make_unique<Category>(categoryName);
926*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(category);
927*89c4ff92SAndroid Build Coastguard Worker category->m_Counters = { 11u, 23u, 5670u };
928*89c4ff92SAndroid Build Coastguard Worker
929*89c4ff92SAndroid Build Coastguard Worker // Create a collection of counters
930*89c4ff92SAndroid Build Coastguard Worker Counters counters;
931*89c4ff92SAndroid Build Coastguard Worker counters.insert(std::make_pair<uint16_t, CounterPtr>(11,
932*89c4ff92SAndroid Build Coastguard Worker CounterPtr(new Counter(armnn::profiling::BACKEND_ID,
933*89c4ff92SAndroid Build Coastguard Worker 0,
934*89c4ff92SAndroid Build Coastguard Worker 11,
935*89c4ff92SAndroid Build Coastguard Worker 0,
936*89c4ff92SAndroid Build Coastguard Worker 0,
937*89c4ff92SAndroid Build Coastguard Worker 534.0003f,
938*89c4ff92SAndroid Build Coastguard Worker "counter1",
939*89c4ff92SAndroid Build Coastguard Worker "the first counter",
940*89c4ff92SAndroid Build Coastguard Worker "millipi2",
941*89c4ff92SAndroid Build Coastguard Worker 0,
942*89c4ff92SAndroid Build Coastguard Worker 0))));
943*89c4ff92SAndroid Build Coastguard Worker counters.insert(std::make_pair<uint16_t, CounterPtr>(23,
944*89c4ff92SAndroid Build Coastguard Worker CounterPtr(new Counter(armnn::profiling::BACKEND_ID,
945*89c4ff92SAndroid Build Coastguard Worker 1,
946*89c4ff92SAndroid Build Coastguard Worker 23,
947*89c4ff92SAndroid Build Coastguard Worker 0,
948*89c4ff92SAndroid Build Coastguard Worker 1,
949*89c4ff92SAndroid Build Coastguard Worker 534.0003f,
950*89c4ff92SAndroid Build Coastguard Worker "this is counter 2",
951*89c4ff92SAndroid Build Coastguard Worker "the second counter",
952*89c4ff92SAndroid Build Coastguard Worker "",
953*89c4ff92SAndroid Build Coastguard Worker 0,
954*89c4ff92SAndroid Build Coastguard Worker 0))));
955*89c4ff92SAndroid Build Coastguard Worker counters.insert(std::make_pair<uint16_t, CounterPtr>(5670,
956*89c4ff92SAndroid Build Coastguard Worker CounterPtr(new Counter(armnn::profiling::BACKEND_ID,
957*89c4ff92SAndroid Build Coastguard Worker 2,
958*89c4ff92SAndroid Build Coastguard Worker 5670,
959*89c4ff92SAndroid Build Coastguard Worker 0,
960*89c4ff92SAndroid Build Coastguard Worker 0,
961*89c4ff92SAndroid Build Coastguard Worker 534.0003f,
962*89c4ff92SAndroid Build Coastguard Worker "and this is number 3",
963*89c4ff92SAndroid Build Coastguard Worker "the third counter",
964*89c4ff92SAndroid Build Coastguard Worker "blah_per_second",
965*89c4ff92SAndroid Build Coastguard Worker 0,
966*89c4ff92SAndroid Build Coastguard Worker 0))));
967*89c4ff92SAndroid Build Coastguard Worker Counter* counter1 = counters.find(11)->second.get();
968*89c4ff92SAndroid Build Coastguard Worker Counter* counter2 = counters.find(23)->second.get();
969*89c4ff92SAndroid Build Coastguard Worker Counter* counter3 = counters.find(5670)->second.get();
970*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(counter1);
971*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(counter2);
972*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_ASSERT(counter3);
973*89c4ff92SAndroid Build Coastguard Worker uint16_t categoryEventCount = armnn::numeric_cast<uint16_t>(counters.size());
974*89c4ff92SAndroid Build Coastguard Worker
975*89c4ff92SAndroid Build Coastguard Worker // Create a category record
976*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::CategoryRecord categoryRecord;
977*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
978*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateCategoryRecordTest(category, counters, categoryRecord, errorMessage);
979*89c4ff92SAndroid Build Coastguard Worker
980*89c4ff92SAndroid Build Coastguard Worker CHECK(result);
981*89c4ff92SAndroid Build Coastguard Worker CHECK(errorMessage.empty());
982*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecord.size() == 79); // Size in words: header [3] + event pointer table [3] +
983*89c4ff92SAndroid Build Coastguard Worker // category name [5] + event records [68 = 22 + 20 + 26]
984*89c4ff92SAndroid Build Coastguard Worker
985*89c4ff92SAndroid Build Coastguard Worker uint16_t categoryRecordWord1[]
986*89c4ff92SAndroid Build Coastguard Worker {
987*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(categoryRecord[0] >> 16),
988*89c4ff92SAndroid Build Coastguard Worker static_cast<uint16_t>(categoryRecord[0])
989*89c4ff92SAndroid Build Coastguard Worker };
990*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordWord1[0] == categoryEventCount); // event_count
991*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordWord1[1] == 0); // reserved
992*89c4ff92SAndroid Build Coastguard Worker
993*89c4ff92SAndroid Build Coastguard Worker size_t uint32_t_size = sizeof(uint32_t);
994*89c4ff92SAndroid Build Coastguard Worker
995*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_NO_CONVERSION_WARN_BEGIN
996*89c4ff92SAndroid Build Coastguard Worker uint32_t categoryRecordBlockSize = 3u * uint32_t_size;
997*89c4ff92SAndroid Build Coastguard Worker uint32_t eventPointerTableOffset = categoryRecordBlockSize; // The event pointer table is the first item in pool
998*89c4ff92SAndroid Build Coastguard Worker uint32_t categoryNameOffset = eventPointerTableOffset + // Event pointer table offset
999*89c4ff92SAndroid Build Coastguard Worker categoryEventCount * uint32_t_size; // The size of the event pointer table
1000*89c4ff92SAndroid Build Coastguard Worker ARM_PIPE_NO_CONVERSION_WARN_END
1001*89c4ff92SAndroid Build Coastguard Worker
1002*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecord[1] == eventPointerTableOffset); // event_pointer_table_offset
1003*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecord[2] == categoryNameOffset); // name_offset
1004*89c4ff92SAndroid Build Coastguard Worker // Offsets are relative to the start of the category record
1005*89c4ff92SAndroid Build Coastguard Worker auto categoryRecordPool = reinterpret_cast<unsigned char*>(categoryRecord.data());
1006*89c4ff92SAndroid Build Coastguard Worker
1007*89c4ff92SAndroid Build Coastguard Worker // The event pointer table
1008*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecord0Offset = categoryRecordPool[eventPointerTableOffset + 0 * uint32_t_size];
1009*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecord1Offset = categoryRecordPool[eventPointerTableOffset + 1 * uint32_t_size];
1010*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecord2Offset = categoryRecordPool[eventPointerTableOffset + 2 * uint32_t_size];
1011*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord0Offset == 32);
1012*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord1Offset == 120);
1013*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord2Offset == 200);
1014*89c4ff92SAndroid Build Coastguard Worker
1015*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace namestring (name)
1016*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordPool[categoryNameOffset] == categoryName.size() + 1);
1017*89c4ff92SAndroid Build Coastguard Worker // The category name
1018*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(categoryRecordPool +
1019*89c4ff92SAndroid Build Coastguard Worker categoryNameOffset + // Offset
1020*89c4ff92SAndroid Build Coastguard Worker uint32_t_size, // The length of the name
1021*89c4ff92SAndroid Build Coastguard Worker categoryName.data(),
1022*89c4ff92SAndroid Build Coastguard Worker categoryName.size()) == 0); // name
1023*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the name
1024*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordPool[categoryNameOffset + uint32_t_size + categoryName.size()] == '\0');
1025*89c4ff92SAndroid Build Coastguard Worker
1026*89c4ff92SAndroid Build Coastguard Worker // For brevity, checking only the UIDs, max counter UIDs and names of the counters in the event records,
1027*89c4ff92SAndroid Build Coastguard Worker // as the event records already have a number of unit tests dedicated to them
1028*89c4ff92SAndroid Build Coastguard Worker
1029*89c4ff92SAndroid Build Coastguard Worker // Counter1 UID and max counter UID
1030*89c4ff92SAndroid Build Coastguard Worker uint16_t eventRecord0Word0[2] = { 0u, 0u };
1031*89c4ff92SAndroid Build Coastguard Worker std::memcpy(eventRecord0Word0, categoryRecordPool + categoryRecordBlockSize + eventRecord0Offset,
1032*89c4ff92SAndroid Build Coastguard Worker sizeof(eventRecord0Word0));
1033*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord0Word0[0] == counter1->m_Uid);
1034*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecord0Word0[1] == counter1->m_MaxCounterUid);
1035*89c4ff92SAndroid Build Coastguard Worker
1036*89c4ff92SAndroid Build Coastguard Worker // Counter1 name
1037*89c4ff92SAndroid Build Coastguard Worker uint32_t counter1NameOffset = 0;
1038*89c4ff92SAndroid Build Coastguard Worker std::memcpy(&counter1NameOffset, categoryRecordPool + eventRecord0Offset + 5u * uint32_t_size, uint32_t_size);
1039*89c4ff92SAndroid Build Coastguard Worker CHECK(counter1NameOffset == 0);
1040*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace string (name)
1041*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordPool[eventRecord0Offset + // Offset to the event record
1042*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize + // Offset to the end of the category record block
1043*89c4ff92SAndroid Build Coastguard Worker 8u * uint32_t_size + // Offset to the event record pool
1044*89c4ff92SAndroid Build Coastguard Worker counter1NameOffset // Offset to the name of the counter
1045*89c4ff92SAndroid Build Coastguard Worker ] == counter1->m_Name.size() + 1); // The length of the name including the
1046*89c4ff92SAndroid Build Coastguard Worker // null-terminator
1047*89c4ff92SAndroid Build Coastguard Worker // The counter1 name
1048*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(categoryRecordPool + // The beginning of the category pool
1049*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize + // Offset to the end of the category record block
1050*89c4ff92SAndroid Build Coastguard Worker eventRecord0Offset + // Offset to the event record
1051*89c4ff92SAndroid Build Coastguard Worker 8u * uint32_t_size + // Offset to the event record pool
1052*89c4ff92SAndroid Build Coastguard Worker counter1NameOffset + // Offset to the name of the counter
1053*89c4ff92SAndroid Build Coastguard Worker uint32_t_size, // The length of the name
1054*89c4ff92SAndroid Build Coastguard Worker counter1->m_Name.data(),
1055*89c4ff92SAndroid Build Coastguard Worker counter1->m_Name.size()) == 0); // name
1056*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the counter1 name
1057*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordPool[eventRecord0Offset + // Offset to the event record
1058*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize + // Offset to the end of the category record block
1059*89c4ff92SAndroid Build Coastguard Worker 8u * uint32_t_size + // Offset to the event record pool
1060*89c4ff92SAndroid Build Coastguard Worker counter1NameOffset + // Offset to the name of the counter
1061*89c4ff92SAndroid Build Coastguard Worker uint32_t_size + // The length of the name
1062*89c4ff92SAndroid Build Coastguard Worker counter1->m_Name.size() // The name of the counter
1063*89c4ff92SAndroid Build Coastguard Worker ] == '\0');
1064*89c4ff92SAndroid Build Coastguard Worker
1065*89c4ff92SAndroid Build Coastguard Worker // Counter2 name
1066*89c4ff92SAndroid Build Coastguard Worker uint32_t counter2NameOffset = 0;
1067*89c4ff92SAndroid Build Coastguard Worker std::memcpy(&counter2NameOffset, categoryRecordPool +
1068*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize +
1069*89c4ff92SAndroid Build Coastguard Worker eventRecord1Offset +
1070*89c4ff92SAndroid Build Coastguard Worker 5u * uint32_t_size,
1071*89c4ff92SAndroid Build Coastguard Worker uint32_t_size);
1072*89c4ff92SAndroid Build Coastguard Worker CHECK(counter2NameOffset == 8u * uint32_t_size );
1073*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace string (name)
1074*89c4ff92SAndroid Build Coastguard Worker
1075*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordPool[eventRecord1Offset + // Offset to the event record
1076*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize +
1077*89c4ff92SAndroid Build Coastguard Worker counter2NameOffset // Offset to the name of the counter
1078*89c4ff92SAndroid Build Coastguard Worker ] == counter2->m_Name.size() + 1); // The length of the name including the
1079*89c4ff92SAndroid Build Coastguard Worker // null-terminator
1080*89c4ff92SAndroid Build Coastguard Worker // The counter2 name
1081*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(categoryRecordPool + // The beginning of the category pool
1082*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize + // Offset to the end of the category record block
1083*89c4ff92SAndroid Build Coastguard Worker eventRecord1Offset + // Offset to the event record
1084*89c4ff92SAndroid Build Coastguard Worker counter2NameOffset + // Offset to the name of the counter
1085*89c4ff92SAndroid Build Coastguard Worker uint32_t_size, // The length of the name
1086*89c4ff92SAndroid Build Coastguard Worker counter2->m_Name.data(),
1087*89c4ff92SAndroid Build Coastguard Worker counter2->m_Name.size()) == 0); // name
1088*89c4ff92SAndroid Build Coastguard Worker
1089*89c4ff92SAndroid Build Coastguard Worker
1090*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the counter2 name
1091*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordPool[eventRecord1Offset + // Offset to the event record
1092*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize + // Offset to the end of the category record block
1093*89c4ff92SAndroid Build Coastguard Worker counter2NameOffset + // Offset to the name of the counter
1094*89c4ff92SAndroid Build Coastguard Worker uint32_t_size + // The length of the name
1095*89c4ff92SAndroid Build Coastguard Worker counter2->m_Name.size() // The name of the counter
1096*89c4ff92SAndroid Build Coastguard Worker ] == '\0');
1097*89c4ff92SAndroid Build Coastguard Worker
1098*89c4ff92SAndroid Build Coastguard Worker // Counter3 name
1099*89c4ff92SAndroid Build Coastguard Worker uint32_t counter3NameOffset = 0;
1100*89c4ff92SAndroid Build Coastguard Worker std::memcpy(&counter3NameOffset, categoryRecordPool + eventRecord2Offset + 5u * uint32_t_size, uint32_t_size);
1101*89c4ff92SAndroid Build Coastguard Worker CHECK(counter3NameOffset == 0);
1102*89c4ff92SAndroid Build Coastguard Worker // The length of the SWTrace string (name)
1103*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordPool[eventRecord2Offset + // Offset to the event record
1104*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize +
1105*89c4ff92SAndroid Build Coastguard Worker 8u * uint32_t_size + // Offset to the event record pool
1106*89c4ff92SAndroid Build Coastguard Worker counter3NameOffset // Offset to the name of the counter
1107*89c4ff92SAndroid Build Coastguard Worker ] == counter3->m_Name.size() + 1); // The length of the name including the
1108*89c4ff92SAndroid Build Coastguard Worker // null-terminator
1109*89c4ff92SAndroid Build Coastguard Worker // The counter3 name
1110*89c4ff92SAndroid Build Coastguard Worker CHECK(std::memcmp(categoryRecordPool + // The beginning of the category pool
1111*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize +
1112*89c4ff92SAndroid Build Coastguard Worker eventRecord2Offset + // Offset to the event record
1113*89c4ff92SAndroid Build Coastguard Worker 8u * uint32_t_size + // Offset to the event record pool
1114*89c4ff92SAndroid Build Coastguard Worker counter3NameOffset + // Offset to the name of the counter
1115*89c4ff92SAndroid Build Coastguard Worker uint32_t_size, // The length of the name
1116*89c4ff92SAndroid Build Coastguard Worker counter3->m_Name.data(),
1117*89c4ff92SAndroid Build Coastguard Worker counter3->m_Name.size()) == 0); // name
1118*89c4ff92SAndroid Build Coastguard Worker // The null-terminator at the end of the counter3 name
1119*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordPool[eventRecord2Offset + // Offset to the event record
1120*89c4ff92SAndroid Build Coastguard Worker categoryRecordBlockSize +
1121*89c4ff92SAndroid Build Coastguard Worker 8u * uint32_t_size + // Offset to the event record pool
1122*89c4ff92SAndroid Build Coastguard Worker counter3NameOffset + // Offset to the name of the counter
1123*89c4ff92SAndroid Build Coastguard Worker uint32_t_size + // The length of the name
1124*89c4ff92SAndroid Build Coastguard Worker counter3->m_Name.size() // The name of the counter
1125*89c4ff92SAndroid Build Coastguard Worker ] == '\0');
1126*89c4ff92SAndroid Build Coastguard Worker }
1127*89c4ff92SAndroid Build Coastguard Worker
1128*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateInvalidCategoryRecordTest1")
1129*89c4ff92SAndroid Build Coastguard Worker {
1130*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
1131*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
1132*89c4ff92SAndroid Build Coastguard Worker
1133*89c4ff92SAndroid Build Coastguard Worker // Create a category for testing
1134*89c4ff92SAndroid Build Coastguard Worker const std::string categoryName = "some invalid category";
1135*89c4ff92SAndroid Build Coastguard Worker const CategoryPtr category = std::make_unique<Category>(categoryName);
1136*89c4ff92SAndroid Build Coastguard Worker CHECK(category);
1137*89c4ff92SAndroid Build Coastguard Worker
1138*89c4ff92SAndroid Build Coastguard Worker // Create a category record
1139*89c4ff92SAndroid Build Coastguard Worker Counters counters;
1140*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::CategoryRecord categoryRecord;
1141*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
1142*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateCategoryRecordTest(category, counters, categoryRecord, errorMessage);
1143*89c4ff92SAndroid Build Coastguard Worker
1144*89c4ff92SAndroid Build Coastguard Worker CHECK(!result);
1145*89c4ff92SAndroid Build Coastguard Worker CHECK(!errorMessage.empty());
1146*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecord.empty());
1147*89c4ff92SAndroid Build Coastguard Worker }
1148*89c4ff92SAndroid Build Coastguard Worker
1149*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("CreateInvalidCategoryRecordTest2")
1150*89c4ff92SAndroid Build Coastguard Worker {
1151*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(0);
1152*89c4ff92SAndroid Build Coastguard Worker SendCounterPacketTest sendCounterPacketTest(mockBuffer);
1153*89c4ff92SAndroid Build Coastguard Worker
1154*89c4ff92SAndroid Build Coastguard Worker // Create a category for testing
1155*89c4ff92SAndroid Build Coastguard Worker const std::string categoryName = "some_category";
1156*89c4ff92SAndroid Build Coastguard Worker const CategoryPtr category = std::make_unique<Category>(categoryName);
1157*89c4ff92SAndroid Build Coastguard Worker CHECK(category);
1158*89c4ff92SAndroid Build Coastguard Worker category->m_Counters = { 11u, 23u, 5670u };
1159*89c4ff92SAndroid Build Coastguard Worker
1160*89c4ff92SAndroid Build Coastguard Worker // Create a collection of counters
1161*89c4ff92SAndroid Build Coastguard Worker Counters counters;
1162*89c4ff92SAndroid Build Coastguard Worker counters.insert(std::make_pair<uint16_t, CounterPtr>(11,
1163*89c4ff92SAndroid Build Coastguard Worker CounterPtr(new Counter(armnn::profiling::BACKEND_ID,
1164*89c4ff92SAndroid Build Coastguard Worker 11,
1165*89c4ff92SAndroid Build Coastguard Worker 1234,
1166*89c4ff92SAndroid Build Coastguard Worker 0,
1167*89c4ff92SAndroid Build Coastguard Worker 1,
1168*89c4ff92SAndroid Build Coastguard Worker 534.0003f,
1169*89c4ff92SAndroid Build Coastguard Worker "count€r1", // Invalid name
1170*89c4ff92SAndroid Build Coastguard Worker "the first counter",
1171*89c4ff92SAndroid Build Coastguard Worker "millipi2",
1172*89c4ff92SAndroid Build Coastguard Worker 0,
1173*89c4ff92SAndroid Build Coastguard Worker 0))));
1174*89c4ff92SAndroid Build Coastguard Worker
1175*89c4ff92SAndroid Build Coastguard Worker Counter* counter1 = counters.find(11)->second.get();
1176*89c4ff92SAndroid Build Coastguard Worker CHECK(counter1);
1177*89c4ff92SAndroid Build Coastguard Worker
1178*89c4ff92SAndroid Build Coastguard Worker // Create a category record
1179*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket::CategoryRecord categoryRecord;
1180*89c4ff92SAndroid Build Coastguard Worker std::string errorMessage;
1181*89c4ff92SAndroid Build Coastguard Worker bool result = sendCounterPacketTest.CreateCategoryRecordTest(category, counters, categoryRecord, errorMessage);
1182*89c4ff92SAndroid Build Coastguard Worker
1183*89c4ff92SAndroid Build Coastguard Worker CHECK(!result);
1184*89c4ff92SAndroid Build Coastguard Worker CHECK(!errorMessage.empty());
1185*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecord.empty());
1186*89c4ff92SAndroid Build Coastguard Worker }
1187*89c4ff92SAndroid Build Coastguard Worker
1188*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendCounterDirectoryPacketTest1")
1189*89c4ff92SAndroid Build Coastguard Worker {
1190*89c4ff92SAndroid Build Coastguard Worker // The counter directory used for testing
1191*89c4ff92SAndroid Build Coastguard Worker CounterDirectory counterDirectory;
1192*89c4ff92SAndroid Build Coastguard Worker
1193*89c4ff92SAndroid Build Coastguard Worker // Register a device
1194*89c4ff92SAndroid Build Coastguard Worker const std::string device1Name = "device1";
1195*89c4ff92SAndroid Build Coastguard Worker const Device* device1 = nullptr;
1196*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(device1 = counterDirectory.RegisterDevice(device1Name, 3));
1197*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetDeviceCount() == 1);
1198*89c4ff92SAndroid Build Coastguard Worker CHECK(device1);
1199*89c4ff92SAndroid Build Coastguard Worker
1200*89c4ff92SAndroid Build Coastguard Worker // Register a device
1201*89c4ff92SAndroid Build Coastguard Worker const std::string device2Name = "device2";
1202*89c4ff92SAndroid Build Coastguard Worker const Device* device2 = nullptr;
1203*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(device2 = counterDirectory.RegisterDevice(device2Name));
1204*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetDeviceCount() == 2);
1205*89c4ff92SAndroid Build Coastguard Worker CHECK(device2);
1206*89c4ff92SAndroid Build Coastguard Worker
1207*89c4ff92SAndroid Build Coastguard Worker // Buffer with not enough space
1208*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(10);
1209*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockBuffer,
1210*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1211*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1212*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1213*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendCounterPacket.SendCounterDirectoryPacket(counterDirectory),
1214*89c4ff92SAndroid Build Coastguard Worker BufferExhaustion);
1215*89c4ff92SAndroid Build Coastguard Worker }
1216*89c4ff92SAndroid Build Coastguard Worker
1217*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendCounterDirectoryPacketTest2")
1218*89c4ff92SAndroid Build Coastguard Worker {
1219*89c4ff92SAndroid Build Coastguard Worker // The counter directory used for testing
1220*89c4ff92SAndroid Build Coastguard Worker CounterDirectory counterDirectory;
1221*89c4ff92SAndroid Build Coastguard Worker
1222*89c4ff92SAndroid Build Coastguard Worker // Register a device
1223*89c4ff92SAndroid Build Coastguard Worker const std::string device1Name = "device1";
1224*89c4ff92SAndroid Build Coastguard Worker const Device* device1 = nullptr;
1225*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(device1 = counterDirectory.RegisterDevice(device1Name, 3));
1226*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetDeviceCount() == 1);
1227*89c4ff92SAndroid Build Coastguard Worker CHECK(device1);
1228*89c4ff92SAndroid Build Coastguard Worker
1229*89c4ff92SAndroid Build Coastguard Worker // Register a device
1230*89c4ff92SAndroid Build Coastguard Worker const std::string device2Name = "device2";
1231*89c4ff92SAndroid Build Coastguard Worker const Device* device2 = nullptr;
1232*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(device2 = counterDirectory.RegisterDevice(device2Name));
1233*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetDeviceCount() == 2);
1234*89c4ff92SAndroid Build Coastguard Worker CHECK(device2);
1235*89c4ff92SAndroid Build Coastguard Worker
1236*89c4ff92SAndroid Build Coastguard Worker // Register a counter set
1237*89c4ff92SAndroid Build Coastguard Worker const std::string counterSet1Name = "counterset1";
1238*89c4ff92SAndroid Build Coastguard Worker const CounterSet* counterSet1 = nullptr;
1239*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(counterSet1 = counterDirectory.RegisterCounterSet(counterSet1Name));
1240*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCounterSetCount() == 1);
1241*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSet1);
1242*89c4ff92SAndroid Build Coastguard Worker
1243*89c4ff92SAndroid Build Coastguard Worker // Register a category associated to "device1" and "counterset1"
1244*89c4ff92SAndroid Build Coastguard Worker const std::string category1Name = "category1";
1245*89c4ff92SAndroid Build Coastguard Worker const Category* category1 = nullptr;
1246*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(category1 = counterDirectory.RegisterCategory(category1Name));
1247*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCategoryCount() == 1);
1248*89c4ff92SAndroid Build Coastguard Worker CHECK(category1);
1249*89c4ff92SAndroid Build Coastguard Worker
1250*89c4ff92SAndroid Build Coastguard Worker // Register a category not associated to "device2" but no counter set
1251*89c4ff92SAndroid Build Coastguard Worker const std::string category2Name = "category2";
1252*89c4ff92SAndroid Build Coastguard Worker const Category* category2 = nullptr;
1253*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(category2 = counterDirectory.RegisterCategory(category2Name));
1254*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCategoryCount() == 2);
1255*89c4ff92SAndroid Build Coastguard Worker CHECK(category2);
1256*89c4ff92SAndroid Build Coastguard Worker
1257*89c4ff92SAndroid Build Coastguard Worker uint16_t numberOfCores = 4;
1258*89c4ff92SAndroid Build Coastguard Worker
1259*89c4ff92SAndroid Build Coastguard Worker // Register a counter associated to "category1"
1260*89c4ff92SAndroid Build Coastguard Worker const Counter* counter1 = nullptr;
1261*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(counter1 = counterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
1262*89c4ff92SAndroid Build Coastguard Worker 0,
1263*89c4ff92SAndroid Build Coastguard Worker category1Name,
1264*89c4ff92SAndroid Build Coastguard Worker 0,
1265*89c4ff92SAndroid Build Coastguard Worker 1,
1266*89c4ff92SAndroid Build Coastguard Worker 123.45f,
1267*89c4ff92SAndroid Build Coastguard Worker "counter1",
1268*89c4ff92SAndroid Build Coastguard Worker "counter1description",
1269*89c4ff92SAndroid Build Coastguard Worker std::string("counter1units"),
1270*89c4ff92SAndroid Build Coastguard Worker numberOfCores));
1271*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCounterCount() == 4);
1272*89c4ff92SAndroid Build Coastguard Worker CHECK(counter1);
1273*89c4ff92SAndroid Build Coastguard Worker
1274*89c4ff92SAndroid Build Coastguard Worker // Register a counter associated to "category1"
1275*89c4ff92SAndroid Build Coastguard Worker const Counter* counter2 = nullptr;
1276*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(counter2 = counterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
1277*89c4ff92SAndroid Build Coastguard Worker 4,
1278*89c4ff92SAndroid Build Coastguard Worker category1Name,
1279*89c4ff92SAndroid Build Coastguard Worker 1,
1280*89c4ff92SAndroid Build Coastguard Worker 0,
1281*89c4ff92SAndroid Build Coastguard Worker 330.1245656765f,
1282*89c4ff92SAndroid Build Coastguard Worker "counter2",
1283*89c4ff92SAndroid Build Coastguard Worker "counter2description",
1284*89c4ff92SAndroid Build Coastguard Worker std::string("counter2units"),
1285*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(),
1286*89c4ff92SAndroid Build Coastguard Worker device2->m_Uid,
1287*89c4ff92SAndroid Build Coastguard Worker 0));
1288*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCounterCount() == 5);
1289*89c4ff92SAndroid Build Coastguard Worker CHECK(counter2);
1290*89c4ff92SAndroid Build Coastguard Worker
1291*89c4ff92SAndroid Build Coastguard Worker // Register a counter associated to "category2"
1292*89c4ff92SAndroid Build Coastguard Worker const Counter* counter3 = nullptr;
1293*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(counter3 = counterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
1294*89c4ff92SAndroid Build Coastguard Worker 5,
1295*89c4ff92SAndroid Build Coastguard Worker category2Name,
1296*89c4ff92SAndroid Build Coastguard Worker 1,
1297*89c4ff92SAndroid Build Coastguard Worker 1,
1298*89c4ff92SAndroid Build Coastguard Worker 0.0000045399f,
1299*89c4ff92SAndroid Build Coastguard Worker "counter3",
1300*89c4ff92SAndroid Build Coastguard Worker "counter3description",
1301*89c4ff92SAndroid Build Coastguard Worker arm::pipe::EmptyOptional(),
1302*89c4ff92SAndroid Build Coastguard Worker numberOfCores,
1303*89c4ff92SAndroid Build Coastguard Worker device2->m_Uid,
1304*89c4ff92SAndroid Build Coastguard Worker counterSet1->m_Uid));
1305*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCounterCount() == 9);
1306*89c4ff92SAndroid Build Coastguard Worker CHECK(counter3);
1307*89c4ff92SAndroid Build Coastguard Worker
1308*89c4ff92SAndroid Build Coastguard Worker // Buffer with enough space
1309*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(1024);
1310*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockBuffer,
1311*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1312*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1313*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1314*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(sendCounterPacket.SendCounterDirectoryPacket(counterDirectory));
1315*89c4ff92SAndroid Build Coastguard Worker
1316*89c4ff92SAndroid Build Coastguard Worker // Get the readable buffer
1317*89c4ff92SAndroid Build Coastguard Worker auto readBuffer = mockBuffer.GetReadableBuffer();
1318*89c4ff92SAndroid Build Coastguard Worker
1319*89c4ff92SAndroid Build Coastguard Worker // Check the packet header
1320*89c4ff92SAndroid Build Coastguard Worker const uint32_t packetHeaderWord0 = ReadUint32(readBuffer, 0);
1321*89c4ff92SAndroid Build Coastguard Worker const uint32_t packetHeaderWord1 = ReadUint32(readBuffer, 4);
1322*89c4ff92SAndroid Build Coastguard Worker CHECK(((packetHeaderWord0 >> 26) & 0x3F) == 0); // packet_family
1323*89c4ff92SAndroid Build Coastguard Worker CHECK(((packetHeaderWord0 >> 16) & 0x3FF) == 2); // packet_id
1324*89c4ff92SAndroid Build Coastguard Worker CHECK(packetHeaderWord1 == 432); // data_length
1325*89c4ff92SAndroid Build Coastguard Worker
1326*89c4ff92SAndroid Build Coastguard Worker // Check the body header
1327*89c4ff92SAndroid Build Coastguard Worker const uint32_t bodyHeaderWord0 = ReadUint32(readBuffer, 8);
1328*89c4ff92SAndroid Build Coastguard Worker const uint32_t bodyHeaderWord1 = ReadUint32(readBuffer, 12);
1329*89c4ff92SAndroid Build Coastguard Worker const uint32_t bodyHeaderWord2 = ReadUint32(readBuffer, 16);
1330*89c4ff92SAndroid Build Coastguard Worker const uint32_t bodyHeaderWord3 = ReadUint32(readBuffer, 20);
1331*89c4ff92SAndroid Build Coastguard Worker const uint32_t bodyHeaderWord4 = ReadUint32(readBuffer, 24);
1332*89c4ff92SAndroid Build Coastguard Worker const uint32_t bodyHeaderWord5 = ReadUint32(readBuffer, 28);
1333*89c4ff92SAndroid Build Coastguard Worker const uint16_t deviceRecordCount = static_cast<uint16_t>(bodyHeaderWord0 >> 16);
1334*89c4ff92SAndroid Build Coastguard Worker const uint16_t counterSetRecordCount = static_cast<uint16_t>(bodyHeaderWord2 >> 16);
1335*89c4ff92SAndroid Build Coastguard Worker const uint16_t categoryRecordCount = static_cast<uint16_t>(bodyHeaderWord4 >> 16);
1336*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecordCount == 2); // device_records_count
1337*89c4ff92SAndroid Build Coastguard Worker CHECK(bodyHeaderWord1 == bodyHeaderSize * 4); // device_records_pointer_table_offset
1338*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecordCount == 1); // counter_set_count
1339*89c4ff92SAndroid Build Coastguard Worker CHECK(bodyHeaderWord3 == 8 + bodyHeaderSize * 4); // counter_set_pointer_table_offset
1340*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordCount == 2); // categories_count
1341*89c4ff92SAndroid Build Coastguard Worker CHECK(bodyHeaderWord5 == 12 + bodyHeaderSize * 4); // categories_pointer_table_offset
1342*89c4ff92SAndroid Build Coastguard Worker
1343*89c4ff92SAndroid Build Coastguard Worker // Check the device records pointer table
1344*89c4ff92SAndroid Build Coastguard Worker const uint32_t deviceRecordOffset0 = ReadUint32(readBuffer, 32);
1345*89c4ff92SAndroid Build Coastguard Worker const uint32_t deviceRecordOffset1 = ReadUint32(readBuffer, 36);
1346*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecordOffset0 == 20); // Device record offset for "device1"
1347*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecordOffset1 == 40); // Device record offset for "device2"
1348*89c4ff92SAndroid Build Coastguard Worker
1349*89c4ff92SAndroid Build Coastguard Worker // Check the counter set pointer table
1350*89c4ff92SAndroid Build Coastguard Worker const uint32_t counterSetRecordOffset0 = ReadUint32(readBuffer, 40);
1351*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecordOffset0 == 52); // Counter set record offset for "counterset1"
1352*89c4ff92SAndroid Build Coastguard Worker
1353*89c4ff92SAndroid Build Coastguard Worker // Check the category pointer table
1354*89c4ff92SAndroid Build Coastguard Worker const uint32_t categoryRecordOffset0 = ReadUint32(readBuffer, 44);
1355*89c4ff92SAndroid Build Coastguard Worker const uint32_t categoryRecordOffset1 = ReadUint32(readBuffer, 48);
1356*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordOffset0 == 72); // Category record offset for "category1"
1357*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordOffset1 == 176); // Category record offset for "category2"
1358*89c4ff92SAndroid Build Coastguard Worker
1359*89c4ff92SAndroid Build Coastguard Worker // Get the device record pool offset
1360*89c4ff92SAndroid Build Coastguard Worker const uint32_t uint32_t_size = sizeof(uint32_t);
1361*89c4ff92SAndroid Build Coastguard Worker const uint32_t packetHeaderSize = 2u * uint32_t_size;
1362*89c4ff92SAndroid Build Coastguard Worker
1363*89c4ff92SAndroid Build Coastguard Worker // Device record structure/collection used for testing
1364*89c4ff92SAndroid Build Coastguard Worker struct DeviceRecord
1365*89c4ff92SAndroid Build Coastguard Worker {
1366*89c4ff92SAndroid Build Coastguard Worker uint16_t uid;
1367*89c4ff92SAndroid Build Coastguard Worker uint16_t cores;
1368*89c4ff92SAndroid Build Coastguard Worker uint32_t name_offset;
1369*89c4ff92SAndroid Build Coastguard Worker uint32_t name_length;
1370*89c4ff92SAndroid Build Coastguard Worker std::string name;
1371*89c4ff92SAndroid Build Coastguard Worker };
1372*89c4ff92SAndroid Build Coastguard Worker std::vector<DeviceRecord> deviceRecords;
1373*89c4ff92SAndroid Build Coastguard Worker const uint32_t deviceRecordsPointerTableOffset = packetHeaderSize +
1374*89c4ff92SAndroid Build Coastguard Worker bodyHeaderWord1; // device_records_pointer_table_offset
1375*89c4ff92SAndroid Build Coastguard Worker
1376*89c4ff92SAndroid Build Coastguard Worker const unsigned char* readData = readBuffer->GetReadableData();
1377*89c4ff92SAndroid Build Coastguard Worker
1378*89c4ff92SAndroid Build Coastguard Worker uint32_t offset = 0;
1379*89c4ff92SAndroid Build Coastguard Worker std::vector<uint32_t> data(800);
1380*89c4ff92SAndroid Build Coastguard Worker
1381*89c4ff92SAndroid Build Coastguard Worker for (uint32_t i = 0; i < 800; i+=uint32_t_size)
1382*89c4ff92SAndroid Build Coastguard Worker {
1383*89c4ff92SAndroid Build Coastguard Worker data[i] = ReadUint32(readBuffer, offset);
1384*89c4ff92SAndroid Build Coastguard Worker offset += uint32_t_size;
1385*89c4ff92SAndroid Build Coastguard Worker }
1386*89c4ff92SAndroid Build Coastguard Worker
1387*89c4ff92SAndroid Build Coastguard Worker std::vector<uint32_t> deviceRecordOffsets(deviceRecordCount);
1388*89c4ff92SAndroid Build Coastguard Worker offset = deviceRecordsPointerTableOffset;
1389*89c4ff92SAndroid Build Coastguard Worker for (uint32_t i = 0; i < deviceRecordCount; ++i)
1390*89c4ff92SAndroid Build Coastguard Worker {
1391*89c4ff92SAndroid Build Coastguard Worker // deviceRecordOffset is relative to the start of the deviceRecordsPointerTable
1392*89c4ff92SAndroid Build Coastguard Worker deviceRecordOffsets[i] = ReadUint32(readBuffer, offset) + deviceRecordsPointerTableOffset;
1393*89c4ff92SAndroid Build Coastguard Worker offset += uint32_t_size;
1394*89c4ff92SAndroid Build Coastguard Worker }
1395*89c4ff92SAndroid Build Coastguard Worker
1396*89c4ff92SAndroid Build Coastguard Worker for (uint32_t i = 0; i < deviceRecordCount; i++)
1397*89c4ff92SAndroid Build Coastguard Worker {
1398*89c4ff92SAndroid Build Coastguard Worker // Collect the data for the device record
1399*89c4ff92SAndroid Build Coastguard Worker const uint32_t deviceRecordWord0 = ReadUint32(readBuffer, deviceRecordOffsets[i] + 0 * uint32_t_size);
1400*89c4ff92SAndroid Build Coastguard Worker const uint32_t deviceRecordWord1 = ReadUint32(readBuffer, deviceRecordOffsets[i] + 1 * uint32_t_size);
1401*89c4ff92SAndroid Build Coastguard Worker DeviceRecord deviceRecord;
1402*89c4ff92SAndroid Build Coastguard Worker deviceRecord.uid = static_cast<uint16_t>(deviceRecordWord0 >> 16); // uid
1403*89c4ff92SAndroid Build Coastguard Worker deviceRecord.cores = static_cast<uint16_t>(deviceRecordWord0); // cores
1404*89c4ff92SAndroid Build Coastguard Worker deviceRecord.name_offset = deviceRecordWord1; // name_offset
1405*89c4ff92SAndroid Build Coastguard Worker
1406*89c4ff92SAndroid Build Coastguard Worker uint32_t deviceRecordPoolOffset = deviceRecordOffsets[i] + // Packet body offset
1407*89c4ff92SAndroid Build Coastguard Worker deviceRecord.name_offset; // Device name offset
1408*89c4ff92SAndroid Build Coastguard Worker uint32_t deviceRecordNameLength = ReadUint32(readBuffer, deviceRecordPoolOffset);
1409*89c4ff92SAndroid Build Coastguard Worker deviceRecord.name_length = deviceRecordNameLength; // name_length
1410*89c4ff92SAndroid Build Coastguard Worker unsigned char deviceRecordNameNullTerminator = // name null-terminator
1411*89c4ff92SAndroid Build Coastguard Worker ReadUint8(readBuffer, deviceRecordPoolOffset + uint32_t_size + deviceRecordNameLength - 1);
1412*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecordNameNullTerminator == '\0');
1413*89c4ff92SAndroid Build Coastguard Worker std::vector<unsigned char> deviceRecordNameBuffer(deviceRecord.name_length - 1);
1414*89c4ff92SAndroid Build Coastguard Worker std::memcpy(deviceRecordNameBuffer.data(),
1415*89c4ff92SAndroid Build Coastguard Worker readData + deviceRecordPoolOffset + uint32_t_size, deviceRecordNameBuffer.size());
1416*89c4ff92SAndroid Build Coastguard Worker deviceRecord.name.assign(deviceRecordNameBuffer.begin(), deviceRecordNameBuffer.end()); // name
1417*89c4ff92SAndroid Build Coastguard Worker
1418*89c4ff92SAndroid Build Coastguard Worker deviceRecords.push_back(deviceRecord);
1419*89c4ff92SAndroid Build Coastguard Worker }
1420*89c4ff92SAndroid Build Coastguard Worker
1421*89c4ff92SAndroid Build Coastguard Worker // Check that the device records are correct
1422*89c4ff92SAndroid Build Coastguard Worker CHECK(deviceRecords.size() == 2);
1423*89c4ff92SAndroid Build Coastguard Worker for (const DeviceRecord& deviceRecord : deviceRecords)
1424*89c4ff92SAndroid Build Coastguard Worker {
1425*89c4ff92SAndroid Build Coastguard Worker const Device* device = counterDirectory.GetDevice(deviceRecord.uid);
1426*89c4ff92SAndroid Build Coastguard Worker CHECK(device);
1427*89c4ff92SAndroid Build Coastguard Worker CHECK(device->m_Uid == deviceRecord.uid);
1428*89c4ff92SAndroid Build Coastguard Worker CHECK(device->m_Cores == deviceRecord.cores);
1429*89c4ff92SAndroid Build Coastguard Worker CHECK(device->m_Name == deviceRecord.name);
1430*89c4ff92SAndroid Build Coastguard Worker }
1431*89c4ff92SAndroid Build Coastguard Worker
1432*89c4ff92SAndroid Build Coastguard Worker
1433*89c4ff92SAndroid Build Coastguard Worker // Counter set record structure/collection used for testing
1434*89c4ff92SAndroid Build Coastguard Worker struct CounterSetRecord
1435*89c4ff92SAndroid Build Coastguard Worker {
1436*89c4ff92SAndroid Build Coastguard Worker uint16_t uid;
1437*89c4ff92SAndroid Build Coastguard Worker uint16_t count;
1438*89c4ff92SAndroid Build Coastguard Worker uint32_t name_offset;
1439*89c4ff92SAndroid Build Coastguard Worker uint32_t name_length;
1440*89c4ff92SAndroid Build Coastguard Worker std::string name;
1441*89c4ff92SAndroid Build Coastguard Worker };
1442*89c4ff92SAndroid Build Coastguard Worker std::vector<CounterSetRecord> counterSetRecords;
1443*89c4ff92SAndroid Build Coastguard Worker const uint32_t counterSetRecordsPointerTableOffset = 2u * uint32_t_size + // packet_header
1444*89c4ff92SAndroid Build Coastguard Worker bodyHeaderWord3; // counter_set_pointer_table_offset
1445*89c4ff92SAndroid Build Coastguard Worker
1446*89c4ff92SAndroid Build Coastguard Worker offset = counterSetRecordsPointerTableOffset;
1447*89c4ff92SAndroid Build Coastguard Worker std::vector<uint32_t> counterSetRecordOffsets(counterSetRecordCount);
1448*89c4ff92SAndroid Build Coastguard Worker
1449*89c4ff92SAndroid Build Coastguard Worker for (uint32_t i = 0; i < counterSetRecordCount; ++i)
1450*89c4ff92SAndroid Build Coastguard Worker {
1451*89c4ff92SAndroid Build Coastguard Worker // counterSetRecordOffset is relative to the start of the dcounterSetRecordsPointerTable
1452*89c4ff92SAndroid Build Coastguard Worker counterSetRecordOffsets[i] = ReadUint32(readBuffer, offset) + counterSetRecordsPointerTableOffset;
1453*89c4ff92SAndroid Build Coastguard Worker offset += uint32_t_size;
1454*89c4ff92SAndroid Build Coastguard Worker }
1455*89c4ff92SAndroid Build Coastguard Worker
1456*89c4ff92SAndroid Build Coastguard Worker for (uint32_t i = 0; i < counterSetRecordCount; i++)
1457*89c4ff92SAndroid Build Coastguard Worker {
1458*89c4ff92SAndroid Build Coastguard Worker // Collect the data for the counter set record
1459*89c4ff92SAndroid Build Coastguard Worker const uint32_t counterSetRecordWord0 = ReadUint32(readBuffer, counterSetRecordOffsets[i] + 0 * uint32_t_size);
1460*89c4ff92SAndroid Build Coastguard Worker const uint32_t counterSetRecordWord1 = ReadUint32(readBuffer, counterSetRecordOffsets[i] + 1 * uint32_t_size);
1461*89c4ff92SAndroid Build Coastguard Worker CounterSetRecord counterSetRecord;
1462*89c4ff92SAndroid Build Coastguard Worker counterSetRecord.uid = static_cast<uint16_t>(counterSetRecordWord0 >> 16); // uid
1463*89c4ff92SAndroid Build Coastguard Worker counterSetRecord.count = static_cast<uint16_t>(counterSetRecordWord0); // count
1464*89c4ff92SAndroid Build Coastguard Worker counterSetRecord.name_offset = counterSetRecordWord1; // name_offset
1465*89c4ff92SAndroid Build Coastguard Worker
1466*89c4ff92SAndroid Build Coastguard Worker uint32_t counterSetRecordPoolOffset = counterSetRecordOffsets[i] + // Packet body offset
1467*89c4ff92SAndroid Build Coastguard Worker counterSetRecord.name_offset; // Counter set name offset
1468*89c4ff92SAndroid Build Coastguard Worker uint32_t counterSetRecordNameLength = ReadUint32(readBuffer, counterSetRecordPoolOffset);
1469*89c4ff92SAndroid Build Coastguard Worker counterSetRecord.name_length = counterSetRecordNameLength; // name_length
1470*89c4ff92SAndroid Build Coastguard Worker unsigned char counterSetRecordNameNullTerminator = // name null-terminator
1471*89c4ff92SAndroid Build Coastguard Worker ReadUint8(readBuffer, counterSetRecordPoolOffset + uint32_t_size + counterSetRecordNameLength - 1);
1472*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecordNameNullTerminator == '\0');
1473*89c4ff92SAndroid Build Coastguard Worker std::vector<unsigned char> counterSetRecordNameBuffer(counterSetRecord.name_length - 1);
1474*89c4ff92SAndroid Build Coastguard Worker std::memcpy(counterSetRecordNameBuffer.data(),
1475*89c4ff92SAndroid Build Coastguard Worker readData + counterSetRecordPoolOffset + uint32_t_size, counterSetRecordNameBuffer.size());
1476*89c4ff92SAndroid Build Coastguard Worker counterSetRecord.name.assign(counterSetRecordNameBuffer.begin(), counterSetRecordNameBuffer.end()); // name
1477*89c4ff92SAndroid Build Coastguard Worker
1478*89c4ff92SAndroid Build Coastguard Worker counterSetRecords.push_back(counterSetRecord);
1479*89c4ff92SAndroid Build Coastguard Worker }
1480*89c4ff92SAndroid Build Coastguard Worker
1481*89c4ff92SAndroid Build Coastguard Worker // Check that the counter set records are correct
1482*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSetRecords.size() == 1);
1483*89c4ff92SAndroid Build Coastguard Worker for (const CounterSetRecord& counterSetRecord : counterSetRecords)
1484*89c4ff92SAndroid Build Coastguard Worker {
1485*89c4ff92SAndroid Build Coastguard Worker const CounterSet* counterSet = counterDirectory.GetCounterSet(counterSetRecord.uid);
1486*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSet);
1487*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSet->m_Uid == counterSetRecord.uid);
1488*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSet->m_Count == counterSetRecord.count);
1489*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSet->m_Name == counterSetRecord.name);
1490*89c4ff92SAndroid Build Coastguard Worker }
1491*89c4ff92SAndroid Build Coastguard Worker
1492*89c4ff92SAndroid Build Coastguard Worker // Event record structure/collection used for testing
1493*89c4ff92SAndroid Build Coastguard Worker struct EventRecord
1494*89c4ff92SAndroid Build Coastguard Worker {
1495*89c4ff92SAndroid Build Coastguard Worker uint16_t counter_uid;
1496*89c4ff92SAndroid Build Coastguard Worker uint16_t max_counter_uid;
1497*89c4ff92SAndroid Build Coastguard Worker uint16_t device;
1498*89c4ff92SAndroid Build Coastguard Worker uint16_t counter_set;
1499*89c4ff92SAndroid Build Coastguard Worker uint16_t counter_class;
1500*89c4ff92SAndroid Build Coastguard Worker uint16_t interpolation;
1501*89c4ff92SAndroid Build Coastguard Worker double multiplier;
1502*89c4ff92SAndroid Build Coastguard Worker uint32_t name_offset;
1503*89c4ff92SAndroid Build Coastguard Worker uint32_t name_length;
1504*89c4ff92SAndroid Build Coastguard Worker std::string name;
1505*89c4ff92SAndroid Build Coastguard Worker uint32_t description_offset;
1506*89c4ff92SAndroid Build Coastguard Worker uint32_t description_length;
1507*89c4ff92SAndroid Build Coastguard Worker std::string description;
1508*89c4ff92SAndroid Build Coastguard Worker uint32_t units_offset;
1509*89c4ff92SAndroid Build Coastguard Worker uint32_t units_length;
1510*89c4ff92SAndroid Build Coastguard Worker std::string units;
1511*89c4ff92SAndroid Build Coastguard Worker };
1512*89c4ff92SAndroid Build Coastguard Worker // Category record structure/collection used for testing
1513*89c4ff92SAndroid Build Coastguard Worker struct CategoryRecord
1514*89c4ff92SAndroid Build Coastguard Worker {
1515*89c4ff92SAndroid Build Coastguard Worker uint16_t event_count;
1516*89c4ff92SAndroid Build Coastguard Worker uint32_t event_pointer_table_offset;
1517*89c4ff92SAndroid Build Coastguard Worker uint32_t name_offset;
1518*89c4ff92SAndroid Build Coastguard Worker uint32_t name_length;
1519*89c4ff92SAndroid Build Coastguard Worker std::string name;
1520*89c4ff92SAndroid Build Coastguard Worker std::vector<uint32_t> event_pointer_table;
1521*89c4ff92SAndroid Build Coastguard Worker std::vector<EventRecord> event_records;
1522*89c4ff92SAndroid Build Coastguard Worker };
1523*89c4ff92SAndroid Build Coastguard Worker std::vector<CategoryRecord> categoryRecords;
1524*89c4ff92SAndroid Build Coastguard Worker const uint32_t categoryRecordsPointerTableOffset = 2u * uint32_t_size + // packet_header
1525*89c4ff92SAndroid Build Coastguard Worker bodyHeaderWord5; // categories_pointer_table_offset
1526*89c4ff92SAndroid Build Coastguard Worker
1527*89c4ff92SAndroid Build Coastguard Worker offset = categoryRecordsPointerTableOffset;
1528*89c4ff92SAndroid Build Coastguard Worker std::vector<uint32_t> categoryRecordOffsets(categoryRecordCount);
1529*89c4ff92SAndroid Build Coastguard Worker for (uint32_t i = 0; i < categoryRecordCount; ++i)
1530*89c4ff92SAndroid Build Coastguard Worker {
1531*89c4ff92SAndroid Build Coastguard Worker // categoryRecordOffset is relative to the start of the categoryRecordsPointerTable
1532*89c4ff92SAndroid Build Coastguard Worker categoryRecordOffsets[i] = ReadUint32(readBuffer, offset) + categoryRecordsPointerTableOffset;
1533*89c4ff92SAndroid Build Coastguard Worker offset += uint32_t_size;
1534*89c4ff92SAndroid Build Coastguard Worker }
1535*89c4ff92SAndroid Build Coastguard Worker
1536*89c4ff92SAndroid Build Coastguard Worker for (uint32_t i = 0; i < categoryRecordCount; i++)
1537*89c4ff92SAndroid Build Coastguard Worker {
1538*89c4ff92SAndroid Build Coastguard Worker // Collect the data for the category record
1539*89c4ff92SAndroid Build Coastguard Worker const uint32_t categoryRecordWord1 = ReadUint32(readBuffer, categoryRecordOffsets[i] + 0 * uint32_t_size);
1540*89c4ff92SAndroid Build Coastguard Worker const uint32_t categoryRecordWord2 = ReadUint32(readBuffer, categoryRecordOffsets[i] + 1 * uint32_t_size);
1541*89c4ff92SAndroid Build Coastguard Worker const uint32_t categoryRecordWord3 = ReadUint32(readBuffer, categoryRecordOffsets[i] + 2 * uint32_t_size);
1542*89c4ff92SAndroid Build Coastguard Worker CategoryRecord categoryRecord;
1543*89c4ff92SAndroid Build Coastguard Worker categoryRecord.event_count = static_cast<uint16_t>(categoryRecordWord1 >> 16); // event_count
1544*89c4ff92SAndroid Build Coastguard Worker categoryRecord.event_pointer_table_offset = categoryRecordWord2; // event_pointer_table_offset
1545*89c4ff92SAndroid Build Coastguard Worker categoryRecord.name_offset = categoryRecordWord3; // name_offset
1546*89c4ff92SAndroid Build Coastguard Worker
1547*89c4ff92SAndroid Build Coastguard Worker uint32_t categoryRecordNameLength = ReadUint32(readBuffer,
1548*89c4ff92SAndroid Build Coastguard Worker categoryRecordOffsets[i] + categoryRecord.name_offset);
1549*89c4ff92SAndroid Build Coastguard Worker categoryRecord.name_length = categoryRecordNameLength; // name_length
1550*89c4ff92SAndroid Build Coastguard Worker unsigned char categoryRecordNameNullTerminator =
1551*89c4ff92SAndroid Build Coastguard Worker ReadUint8(readBuffer,
1552*89c4ff92SAndroid Build Coastguard Worker categoryRecordOffsets[i] +
1553*89c4ff92SAndroid Build Coastguard Worker categoryRecord.name_offset +
1554*89c4ff92SAndroid Build Coastguard Worker uint32_t_size +
1555*89c4ff92SAndroid Build Coastguard Worker categoryRecordNameLength - 1); // name null-terminator
1556*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecordNameNullTerminator == '\0');
1557*89c4ff92SAndroid Build Coastguard Worker std::vector<unsigned char> categoryRecordNameBuffer(categoryRecord.name_length - 1);
1558*89c4ff92SAndroid Build Coastguard Worker std::memcpy(categoryRecordNameBuffer.data(),
1559*89c4ff92SAndroid Build Coastguard Worker readData +
1560*89c4ff92SAndroid Build Coastguard Worker categoryRecordOffsets[i] +
1561*89c4ff92SAndroid Build Coastguard Worker categoryRecord.name_offset +
1562*89c4ff92SAndroid Build Coastguard Worker uint32_t_size,
1563*89c4ff92SAndroid Build Coastguard Worker categoryRecordNameBuffer.size());
1564*89c4ff92SAndroid Build Coastguard Worker categoryRecord.name.assign(categoryRecordNameBuffer.begin(), categoryRecordNameBuffer.end()); // name
1565*89c4ff92SAndroid Build Coastguard Worker
1566*89c4ff92SAndroid Build Coastguard Worker categoryRecord.event_pointer_table.resize(categoryRecord.event_count);
1567*89c4ff92SAndroid Build Coastguard Worker offset = categoryRecordOffsets[i] + categoryRecord.event_pointer_table_offset;
1568*89c4ff92SAndroid Build Coastguard Worker for (uint32_t eventOffsetIndex = 0; eventOffsetIndex < categoryRecord.event_count; ++eventOffsetIndex)
1569*89c4ff92SAndroid Build Coastguard Worker {
1570*89c4ff92SAndroid Build Coastguard Worker // eventRecordOffset is relative to the start of the event pointer table
1571*89c4ff92SAndroid Build Coastguard Worker categoryRecord.event_pointer_table[eventOffsetIndex] = ReadUint32(readBuffer, offset) +
1572*89c4ff92SAndroid Build Coastguard Worker categoryRecordOffsets[i] +
1573*89c4ff92SAndroid Build Coastguard Worker categoryRecord.event_pointer_table_offset;
1574*89c4ff92SAndroid Build Coastguard Worker offset += uint32_t_size;
1575*89c4ff92SAndroid Build Coastguard Worker }
1576*89c4ff92SAndroid Build Coastguard Worker
1577*89c4ff92SAndroid Build Coastguard Worker for (uint32_t eventIndex = 0; eventIndex < categoryRecord.event_count; eventIndex++)
1578*89c4ff92SAndroid Build Coastguard Worker {
1579*89c4ff92SAndroid Build Coastguard Worker const uint32_t eventOffset = categoryRecord.event_pointer_table[eventIndex];
1580*89c4ff92SAndroid Build Coastguard Worker // Collect the data for the event record
1581*89c4ff92SAndroid Build Coastguard Worker const uint32_t eventRecordWord0 = ReadUint32(readBuffer, eventOffset + 0 * uint32_t_size);
1582*89c4ff92SAndroid Build Coastguard Worker const uint32_t eventRecordWord1 = ReadUint32(readBuffer, eventOffset + 1 * uint32_t_size);
1583*89c4ff92SAndroid Build Coastguard Worker const uint32_t eventRecordWord2 = ReadUint32(readBuffer, eventOffset + 2 * uint32_t_size);
1584*89c4ff92SAndroid Build Coastguard Worker const uint64_t eventRecordWord34 = ReadUint64(readBuffer, eventOffset + 3 * uint32_t_size);
1585*89c4ff92SAndroid Build Coastguard Worker const uint32_t eventRecordWord5 = ReadUint32(readBuffer, eventOffset + 5 * uint32_t_size);
1586*89c4ff92SAndroid Build Coastguard Worker const uint32_t eventRecordWord6 = ReadUint32(readBuffer, eventOffset + 6 * uint32_t_size);
1587*89c4ff92SAndroid Build Coastguard Worker const uint32_t eventRecordWord7 = ReadUint32(readBuffer, eventOffset + 7 * uint32_t_size);
1588*89c4ff92SAndroid Build Coastguard Worker
1589*89c4ff92SAndroid Build Coastguard Worker EventRecord eventRecord;
1590*89c4ff92SAndroid Build Coastguard Worker eventRecord.counter_uid = static_cast<uint16_t>(eventRecordWord0); // counter_uid
1591*89c4ff92SAndroid Build Coastguard Worker eventRecord.max_counter_uid = static_cast<uint16_t>(eventRecordWord0 >> 16); // max_counter_uid
1592*89c4ff92SAndroid Build Coastguard Worker eventRecord.device = static_cast<uint16_t>(eventRecordWord1 >> 16); // device
1593*89c4ff92SAndroid Build Coastguard Worker eventRecord.counter_set = static_cast<uint16_t>(eventRecordWord1); // counter_set
1594*89c4ff92SAndroid Build Coastguard Worker eventRecord.counter_class = static_cast<uint16_t>(eventRecordWord2 >> 16); // class
1595*89c4ff92SAndroid Build Coastguard Worker eventRecord.interpolation = static_cast<uint16_t>(eventRecordWord2); // interpolation
1596*89c4ff92SAndroid Build Coastguard Worker std::memcpy(&eventRecord.multiplier, &eventRecordWord34, sizeof(eventRecord.multiplier)); // multiplier
1597*89c4ff92SAndroid Build Coastguard Worker eventRecord.name_offset = static_cast<uint32_t>(eventRecordWord5); // name_offset
1598*89c4ff92SAndroid Build Coastguard Worker eventRecord.description_offset = static_cast<uint32_t>(eventRecordWord6); // description_offset
1599*89c4ff92SAndroid Build Coastguard Worker eventRecord.units_offset = static_cast<uint32_t>(eventRecordWord7); // units_offset
1600*89c4ff92SAndroid Build Coastguard Worker
1601*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecordNameLength = ReadUint32(readBuffer, eventOffset + eventRecord.name_offset);
1602*89c4ff92SAndroid Build Coastguard Worker eventRecord.name_length = eventRecordNameLength; // name_length
1603*89c4ff92SAndroid Build Coastguard Worker unsigned char eventRecordNameNullTerminator =
1604*89c4ff92SAndroid Build Coastguard Worker ReadUint8(readBuffer,
1605*89c4ff92SAndroid Build Coastguard Worker eventOffset +
1606*89c4ff92SAndroid Build Coastguard Worker eventRecord.name_offset +
1607*89c4ff92SAndroid Build Coastguard Worker uint32_t_size +
1608*89c4ff92SAndroid Build Coastguard Worker eventRecordNameLength - 1); // name null-terminator
1609*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordNameNullTerminator == '\0');
1610*89c4ff92SAndroid Build Coastguard Worker std::vector<unsigned char> eventRecordNameBuffer(eventRecord.name_length - 1);
1611*89c4ff92SAndroid Build Coastguard Worker std::memcpy(eventRecordNameBuffer.data(),
1612*89c4ff92SAndroid Build Coastguard Worker readData +
1613*89c4ff92SAndroid Build Coastguard Worker eventOffset +
1614*89c4ff92SAndroid Build Coastguard Worker eventRecord.name_offset +
1615*89c4ff92SAndroid Build Coastguard Worker uint32_t_size,
1616*89c4ff92SAndroid Build Coastguard Worker eventRecordNameBuffer.size());
1617*89c4ff92SAndroid Build Coastguard Worker eventRecord.name.assign(eventRecordNameBuffer.begin(), eventRecordNameBuffer.end()); // name
1618*89c4ff92SAndroid Build Coastguard Worker
1619*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecordDescriptionLength = ReadUint32(readBuffer,
1620*89c4ff92SAndroid Build Coastguard Worker eventOffset + eventRecord.description_offset);
1621*89c4ff92SAndroid Build Coastguard Worker eventRecord.description_length = eventRecordDescriptionLength; // description_length
1622*89c4ff92SAndroid Build Coastguard Worker unsigned char eventRecordDescriptionNullTerminator =
1623*89c4ff92SAndroid Build Coastguard Worker ReadUint8(readBuffer,
1624*89c4ff92SAndroid Build Coastguard Worker eventOffset +
1625*89c4ff92SAndroid Build Coastguard Worker eventRecord.description_offset +
1626*89c4ff92SAndroid Build Coastguard Worker uint32_t_size +
1627*89c4ff92SAndroid Build Coastguard Worker eventRecordDescriptionLength - 1); // description null-terminator
1628*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordDescriptionNullTerminator == '\0');
1629*89c4ff92SAndroid Build Coastguard Worker std::vector<unsigned char> eventRecordDescriptionBuffer(eventRecord.description_length - 1);
1630*89c4ff92SAndroid Build Coastguard Worker std::memcpy(eventRecordDescriptionBuffer.data(),
1631*89c4ff92SAndroid Build Coastguard Worker readData +
1632*89c4ff92SAndroid Build Coastguard Worker eventOffset +
1633*89c4ff92SAndroid Build Coastguard Worker eventRecord.description_offset +
1634*89c4ff92SAndroid Build Coastguard Worker uint32_t_size,
1635*89c4ff92SAndroid Build Coastguard Worker eventRecordDescriptionBuffer.size());
1636*89c4ff92SAndroid Build Coastguard Worker eventRecord.description.assign(eventRecordDescriptionBuffer.begin(),
1637*89c4ff92SAndroid Build Coastguard Worker eventRecordDescriptionBuffer.end()); // description
1638*89c4ff92SAndroid Build Coastguard Worker
1639*89c4ff92SAndroid Build Coastguard Worker if (eventRecord.units_offset > 0)
1640*89c4ff92SAndroid Build Coastguard Worker {
1641*89c4ff92SAndroid Build Coastguard Worker uint32_t eventRecordUnitsLength = ReadUint32(readBuffer,
1642*89c4ff92SAndroid Build Coastguard Worker eventOffset + eventRecord.units_offset);
1643*89c4ff92SAndroid Build Coastguard Worker eventRecord.units_length = eventRecordUnitsLength; // units_length
1644*89c4ff92SAndroid Build Coastguard Worker unsigned char eventRecordUnitsNullTerminator =
1645*89c4ff92SAndroid Build Coastguard Worker ReadUint8(readBuffer,
1646*89c4ff92SAndroid Build Coastguard Worker eventOffset +
1647*89c4ff92SAndroid Build Coastguard Worker eventRecord.units_offset +
1648*89c4ff92SAndroid Build Coastguard Worker uint32_t_size +
1649*89c4ff92SAndroid Build Coastguard Worker eventRecordUnitsLength - 1); // units null-terminator
1650*89c4ff92SAndroid Build Coastguard Worker CHECK(eventRecordUnitsNullTerminator == '\0');
1651*89c4ff92SAndroid Build Coastguard Worker std::vector<unsigned char> eventRecordUnitsBuffer(eventRecord.units_length - 1);
1652*89c4ff92SAndroid Build Coastguard Worker std::memcpy(eventRecordUnitsBuffer.data(),
1653*89c4ff92SAndroid Build Coastguard Worker readData +
1654*89c4ff92SAndroid Build Coastguard Worker eventOffset +
1655*89c4ff92SAndroid Build Coastguard Worker eventRecord.units_offset +
1656*89c4ff92SAndroid Build Coastguard Worker uint32_t_size,
1657*89c4ff92SAndroid Build Coastguard Worker eventRecordUnitsBuffer.size());
1658*89c4ff92SAndroid Build Coastguard Worker eventRecord.units.assign(eventRecordUnitsBuffer.begin(), eventRecordUnitsBuffer.end()); // units
1659*89c4ff92SAndroid Build Coastguard Worker }
1660*89c4ff92SAndroid Build Coastguard Worker
1661*89c4ff92SAndroid Build Coastguard Worker categoryRecord.event_records.push_back(eventRecord);
1662*89c4ff92SAndroid Build Coastguard Worker }
1663*89c4ff92SAndroid Build Coastguard Worker
1664*89c4ff92SAndroid Build Coastguard Worker categoryRecords.push_back(categoryRecord);
1665*89c4ff92SAndroid Build Coastguard Worker }
1666*89c4ff92SAndroid Build Coastguard Worker
1667*89c4ff92SAndroid Build Coastguard Worker // Check that the category records are correct
1668*89c4ff92SAndroid Build Coastguard Worker CHECK(categoryRecords.size() == 2);
1669*89c4ff92SAndroid Build Coastguard Worker for (const CategoryRecord& categoryRecord : categoryRecords)
1670*89c4ff92SAndroid Build Coastguard Worker {
1671*89c4ff92SAndroid Build Coastguard Worker const Category* category = counterDirectory.GetCategory(categoryRecord.name);
1672*89c4ff92SAndroid Build Coastguard Worker CHECK(category);
1673*89c4ff92SAndroid Build Coastguard Worker CHECK(category->m_Name == categoryRecord.name);
1674*89c4ff92SAndroid Build Coastguard Worker CHECK(category->m_Counters.size() == categoryRecord.event_count + static_cast<size_t>(numberOfCores) -1);
1675*89c4ff92SAndroid Build Coastguard Worker CHECK(category->m_Counters.size() == categoryRecord.event_count + static_cast<size_t>(numberOfCores) -1);
1676*89c4ff92SAndroid Build Coastguard Worker
1677*89c4ff92SAndroid Build Coastguard Worker // Check that the event records are correct
1678*89c4ff92SAndroid Build Coastguard Worker for (const EventRecord& eventRecord : categoryRecord.event_records)
1679*89c4ff92SAndroid Build Coastguard Worker {
1680*89c4ff92SAndroid Build Coastguard Worker const Counter* counter = counterDirectory.GetCounter(eventRecord.counter_uid);
1681*89c4ff92SAndroid Build Coastguard Worker CHECK(counter);
1682*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_MaxCounterUid == eventRecord.max_counter_uid);
1683*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_DeviceUid == eventRecord.device);
1684*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_CounterSetUid == eventRecord.counter_set);
1685*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_Class == eventRecord.counter_class);
1686*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_Interpolation == eventRecord.interpolation);
1687*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_Multiplier == eventRecord.multiplier);
1688*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_Name == eventRecord.name);
1689*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_Description == eventRecord.description);
1690*89c4ff92SAndroid Build Coastguard Worker CHECK(counter->m_Units == eventRecord.units);
1691*89c4ff92SAndroid Build Coastguard Worker }
1692*89c4ff92SAndroid Build Coastguard Worker }
1693*89c4ff92SAndroid Build Coastguard Worker }
1694*89c4ff92SAndroid Build Coastguard Worker
1695*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendCounterDirectoryPacketTest3")
1696*89c4ff92SAndroid Build Coastguard Worker {
1697*89c4ff92SAndroid Build Coastguard Worker // Using a mock counter directory that allows to register invalid objects
1698*89c4ff92SAndroid Build Coastguard Worker MockCounterDirectory counterDirectory;
1699*89c4ff92SAndroid Build Coastguard Worker
1700*89c4ff92SAndroid Build Coastguard Worker // Register an invalid device
1701*89c4ff92SAndroid Build Coastguard Worker const std::string deviceName = "inv@lid dev!c€";
1702*89c4ff92SAndroid Build Coastguard Worker const Device* device = nullptr;
1703*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(device = counterDirectory.RegisterDevice(deviceName, 3));
1704*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetDeviceCount() == 1);
1705*89c4ff92SAndroid Build Coastguard Worker CHECK(device);
1706*89c4ff92SAndroid Build Coastguard Worker
1707*89c4ff92SAndroid Build Coastguard Worker // Buffer with enough space
1708*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(1024);
1709*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockBuffer,
1710*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1711*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1712*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1713*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendCounterPacket.SendCounterDirectoryPacket(counterDirectory), arm::pipe::ProfilingException);
1714*89c4ff92SAndroid Build Coastguard Worker }
1715*89c4ff92SAndroid Build Coastguard Worker
1716*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendCounterDirectoryPacketTest4")
1717*89c4ff92SAndroid Build Coastguard Worker {
1718*89c4ff92SAndroid Build Coastguard Worker // Using a mock counter directory that allows to register invalid objects
1719*89c4ff92SAndroid Build Coastguard Worker MockCounterDirectory counterDirectory;
1720*89c4ff92SAndroid Build Coastguard Worker
1721*89c4ff92SAndroid Build Coastguard Worker // Register an invalid counter set
1722*89c4ff92SAndroid Build Coastguard Worker const std::string counterSetName = "inv@lid count€rs€t";
1723*89c4ff92SAndroid Build Coastguard Worker const CounterSet* counterSet = nullptr;
1724*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(counterSet = counterDirectory.RegisterCounterSet(counterSetName));
1725*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCounterSetCount() == 1);
1726*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSet);
1727*89c4ff92SAndroid Build Coastguard Worker
1728*89c4ff92SAndroid Build Coastguard Worker // Buffer with enough space
1729*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(1024);
1730*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockBuffer,
1731*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1732*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1733*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1734*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendCounterPacket.SendCounterDirectoryPacket(counterDirectory), arm::pipe::ProfilingException);
1735*89c4ff92SAndroid Build Coastguard Worker }
1736*89c4ff92SAndroid Build Coastguard Worker
1737*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendCounterDirectoryPacketTest5")
1738*89c4ff92SAndroid Build Coastguard Worker {
1739*89c4ff92SAndroid Build Coastguard Worker // Using a mock counter directory that allows to register invalid objects
1740*89c4ff92SAndroid Build Coastguard Worker MockCounterDirectory counterDirectory;
1741*89c4ff92SAndroid Build Coastguard Worker
1742*89c4ff92SAndroid Build Coastguard Worker // Register an invalid category
1743*89c4ff92SAndroid Build Coastguard Worker const std::string categoryName = "c@t€gory";
1744*89c4ff92SAndroid Build Coastguard Worker const Category* category = nullptr;
1745*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(category = counterDirectory.RegisterCategory(categoryName));
1746*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCategoryCount() == 1);
1747*89c4ff92SAndroid Build Coastguard Worker CHECK(category);
1748*89c4ff92SAndroid Build Coastguard Worker
1749*89c4ff92SAndroid Build Coastguard Worker // Buffer with enough space
1750*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(1024);
1751*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockBuffer,
1752*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1753*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1754*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1755*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendCounterPacket.SendCounterDirectoryPacket(counterDirectory), arm::pipe::ProfilingException);
1756*89c4ff92SAndroid Build Coastguard Worker }
1757*89c4ff92SAndroid Build Coastguard Worker
1758*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendCounterDirectoryPacketTest6")
1759*89c4ff92SAndroid Build Coastguard Worker {
1760*89c4ff92SAndroid Build Coastguard Worker // Using a mock counter directory that allows to register invalid objects
1761*89c4ff92SAndroid Build Coastguard Worker MockCounterDirectory counterDirectory;
1762*89c4ff92SAndroid Build Coastguard Worker
1763*89c4ff92SAndroid Build Coastguard Worker // Register an invalid device
1764*89c4ff92SAndroid Build Coastguard Worker const std::string deviceName = "inv@lid dev!c€";
1765*89c4ff92SAndroid Build Coastguard Worker const Device* device = nullptr;
1766*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(device = counterDirectory.RegisterDevice(deviceName, 3));
1767*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetDeviceCount() == 1);
1768*89c4ff92SAndroid Build Coastguard Worker CHECK(device);
1769*89c4ff92SAndroid Build Coastguard Worker
1770*89c4ff92SAndroid Build Coastguard Worker // Register an invalid counter set
1771*89c4ff92SAndroid Build Coastguard Worker const std::string counterSetName = "inv@lid count€rs€t";
1772*89c4ff92SAndroid Build Coastguard Worker const CounterSet* counterSet = nullptr;
1773*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(counterSet = counterDirectory.RegisterCounterSet(counterSetName));
1774*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCounterSetCount() == 1);
1775*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSet);
1776*89c4ff92SAndroid Build Coastguard Worker
1777*89c4ff92SAndroid Build Coastguard Worker // Register an invalid category associated to an invalid device and an invalid counter set
1778*89c4ff92SAndroid Build Coastguard Worker const std::string categoryName = "c@t€gory";
1779*89c4ff92SAndroid Build Coastguard Worker const Category* category = nullptr;
1780*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(category = counterDirectory.RegisterCategory(categoryName));
1781*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCategoryCount() == 1);
1782*89c4ff92SAndroid Build Coastguard Worker CHECK(category);
1783*89c4ff92SAndroid Build Coastguard Worker
1784*89c4ff92SAndroid Build Coastguard Worker // Buffer with enough space
1785*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(1024);
1786*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockBuffer,
1787*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1788*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1789*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1790*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendCounterPacket.SendCounterDirectoryPacket(counterDirectory), arm::pipe::ProfilingException);
1791*89c4ff92SAndroid Build Coastguard Worker }
1792*89c4ff92SAndroid Build Coastguard Worker
1793*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendCounterDirectoryPacketTest7")
1794*89c4ff92SAndroid Build Coastguard Worker {
1795*89c4ff92SAndroid Build Coastguard Worker // Using a mock counter directory that allows to register invalid objects
1796*89c4ff92SAndroid Build Coastguard Worker MockCounterDirectory counterDirectory;
1797*89c4ff92SAndroid Build Coastguard Worker
1798*89c4ff92SAndroid Build Coastguard Worker // Register an valid device
1799*89c4ff92SAndroid Build Coastguard Worker const std::string deviceName = "valid device";
1800*89c4ff92SAndroid Build Coastguard Worker const Device* device = nullptr;
1801*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(device = counterDirectory.RegisterDevice(deviceName, 3));
1802*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetDeviceCount() == 1);
1803*89c4ff92SAndroid Build Coastguard Worker CHECK(device);
1804*89c4ff92SAndroid Build Coastguard Worker
1805*89c4ff92SAndroid Build Coastguard Worker // Register an valid counter set
1806*89c4ff92SAndroid Build Coastguard Worker const std::string counterSetName = "valid counterset";
1807*89c4ff92SAndroid Build Coastguard Worker const CounterSet* counterSet = nullptr;
1808*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(counterSet = counterDirectory.RegisterCounterSet(counterSetName));
1809*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCounterSetCount() == 1);
1810*89c4ff92SAndroid Build Coastguard Worker CHECK(counterSet);
1811*89c4ff92SAndroid Build Coastguard Worker
1812*89c4ff92SAndroid Build Coastguard Worker // Register an valid category associated to a valid device and a valid counter set
1813*89c4ff92SAndroid Build Coastguard Worker const std::string categoryName = "category";
1814*89c4ff92SAndroid Build Coastguard Worker const Category* category = nullptr;
1815*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(category = counterDirectory.RegisterCategory(categoryName));
1816*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCategoryCount() == 1);
1817*89c4ff92SAndroid Build Coastguard Worker CHECK(category);
1818*89c4ff92SAndroid Build Coastguard Worker
1819*89c4ff92SAndroid Build Coastguard Worker // Register an invalid counter associated to a valid category
1820*89c4ff92SAndroid Build Coastguard Worker const Counter* counter = nullptr;
1821*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(counter = counterDirectory.RegisterCounter(armnn::profiling::BACKEND_ID,
1822*89c4ff92SAndroid Build Coastguard Worker 0,
1823*89c4ff92SAndroid Build Coastguard Worker categoryName,
1824*89c4ff92SAndroid Build Coastguard Worker 0,
1825*89c4ff92SAndroid Build Coastguard Worker 1,
1826*89c4ff92SAndroid Build Coastguard Worker 123.45f,
1827*89c4ff92SAndroid Build Coastguard Worker "counter",
1828*89c4ff92SAndroid Build Coastguard Worker "counter description",
1829*89c4ff92SAndroid Build Coastguard Worker std::string("invalid counter units"),
1830*89c4ff92SAndroid Build Coastguard Worker 5,
1831*89c4ff92SAndroid Build Coastguard Worker device->m_Uid,
1832*89c4ff92SAndroid Build Coastguard Worker counterSet->m_Uid));
1833*89c4ff92SAndroid Build Coastguard Worker CHECK(counterDirectory.GetCounterCount() == 5);
1834*89c4ff92SAndroid Build Coastguard Worker CHECK(counter);
1835*89c4ff92SAndroid Build Coastguard Worker
1836*89c4ff92SAndroid Build Coastguard Worker // Buffer with enough space
1837*89c4ff92SAndroid Build Coastguard Worker MockBufferManager mockBuffer(1024);
1838*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockBuffer,
1839*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1840*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1841*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1842*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendCounterPacket.SendCounterDirectoryPacket(counterDirectory), arm::pipe::ProfilingException);
1843*89c4ff92SAndroid Build Coastguard Worker }
1844*89c4ff92SAndroid Build Coastguard Worker
1845*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadTest0")
1846*89c4ff92SAndroid Build Coastguard Worker {
1847*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
1848*89c4ff92SAndroid Build Coastguard Worker SetActiveProfilingState(profilingStateMachine);
1849*89c4ff92SAndroid Build Coastguard Worker
1850*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
1851*89c4ff92SAndroid Build Coastguard Worker MockStreamCounterBuffer mockStreamCounterBuffer(0);
1852*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockStreamCounterBuffer,
1853*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1854*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1855*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1856*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, mockStreamCounterBuffer, sendCounterPacket);
1857*89c4ff92SAndroid Build Coastguard Worker
1858*89c4ff92SAndroid Build Coastguard Worker // Try to start the send thread many times, it must only start once
1859*89c4ff92SAndroid Build Coastguard Worker
1860*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
1861*89c4ff92SAndroid Build Coastguard Worker CHECK(sendThread.IsRunning());
1862*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
1863*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
1864*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
1865*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
1866*89c4ff92SAndroid Build Coastguard Worker CHECK(sendThread.IsRunning());
1867*89c4ff92SAndroid Build Coastguard Worker
1868*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
1869*89c4ff92SAndroid Build Coastguard Worker CHECK(!sendThread.IsRunning());
1870*89c4ff92SAndroid Build Coastguard Worker }
1871*89c4ff92SAndroid Build Coastguard Worker
1872*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadTest1")
1873*89c4ff92SAndroid Build Coastguard Worker {
1874*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
1875*89c4ff92SAndroid Build Coastguard Worker SetActiveProfilingState(profilingStateMachine);
1876*89c4ff92SAndroid Build Coastguard Worker
1877*89c4ff92SAndroid Build Coastguard Worker unsigned int totalWrittenSize = 0;
1878*89c4ff92SAndroid Build Coastguard Worker
1879*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
1880*89c4ff92SAndroid Build Coastguard Worker MockStreamCounterBuffer mockStreamCounterBuffer(1024);
1881*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockStreamCounterBuffer,
1882*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1883*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1884*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1885*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, mockStreamCounterBuffer, sendCounterPacket);
1886*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
1887*89c4ff92SAndroid Build Coastguard Worker
1888*89c4ff92SAndroid Build Coastguard Worker // Interleaving writes and reads to/from the buffer with pauses to test that the send thread actually waits for
1889*89c4ff92SAndroid Build Coastguard Worker // something to become available for reading
1890*89c4ff92SAndroid Build Coastguard Worker
1891*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
1892*89c4ff92SAndroid Build Coastguard Worker
1893*89c4ff92SAndroid Build Coastguard Worker CounterDirectory counterDirectory;
1894*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendStreamMetaDataPacket();
1895*89c4ff92SAndroid Build Coastguard Worker
1896*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += GetStreamMetaDataPacketSize();
1897*89c4ff92SAndroid Build Coastguard Worker
1898*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
1899*89c4ff92SAndroid Build Coastguard Worker
1900*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
1901*89c4ff92SAndroid Build Coastguard Worker
1902*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendCounterDirectoryPacket(counterDirectory);
1903*89c4ff92SAndroid Build Coastguard Worker
1904*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Counter Directory Packet
1905*89c4ff92SAndroid Build Coastguard Worker unsigned int counterDirectoryPacketSize = 32;
1906*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += counterDirectoryPacketSize;
1907*89c4ff92SAndroid Build Coastguard Worker
1908*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
1909*89c4ff92SAndroid Build Coastguard Worker
1910*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
1911*89c4ff92SAndroid Build Coastguard Worker
1912*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(123u,
1913*89c4ff92SAndroid Build Coastguard Worker {
1914*89c4ff92SAndroid Build Coastguard Worker { 1u, 23u },
1915*89c4ff92SAndroid Build Coastguard Worker { 33u, 1207623u }
1916*89c4ff92SAndroid Build Coastguard Worker });
1917*89c4ff92SAndroid Build Coastguard Worker
1918*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
1919*89c4ff92SAndroid Build Coastguard Worker unsigned int periodicCounterCapturePacketSize = 28;
1920*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
1921*89c4ff92SAndroid Build Coastguard Worker
1922*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
1923*89c4ff92SAndroid Build Coastguard Worker
1924*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
1925*89c4ff92SAndroid Build Coastguard Worker
1926*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(44u,
1927*89c4ff92SAndroid Build Coastguard Worker {
1928*89c4ff92SAndroid Build Coastguard Worker { 211u, 923u }
1929*89c4ff92SAndroid Build Coastguard Worker });
1930*89c4ff92SAndroid Build Coastguard Worker
1931*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
1932*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 22;
1933*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
1934*89c4ff92SAndroid Build Coastguard Worker
1935*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(1234u,
1936*89c4ff92SAndroid Build Coastguard Worker {
1937*89c4ff92SAndroid Build Coastguard Worker { 555u, 23u },
1938*89c4ff92SAndroid Build Coastguard Worker { 556u, 6u },
1939*89c4ff92SAndroid Build Coastguard Worker { 557u, 893454u },
1940*89c4ff92SAndroid Build Coastguard Worker { 558u, 1456623u },
1941*89c4ff92SAndroid Build Coastguard Worker { 559u, 571090u }
1942*89c4ff92SAndroid Build Coastguard Worker });
1943*89c4ff92SAndroid Build Coastguard Worker
1944*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
1945*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 46;
1946*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
1947*89c4ff92SAndroid Build Coastguard Worker
1948*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(997u,
1949*89c4ff92SAndroid Build Coastguard Worker {
1950*89c4ff92SAndroid Build Coastguard Worker { 88u, 11u },
1951*89c4ff92SAndroid Build Coastguard Worker { 96u, 22u },
1952*89c4ff92SAndroid Build Coastguard Worker { 97u, 33u },
1953*89c4ff92SAndroid Build Coastguard Worker { 999u, 444u }
1954*89c4ff92SAndroid Build Coastguard Worker });
1955*89c4ff92SAndroid Build Coastguard Worker
1956*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
1957*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 40;
1958*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
1959*89c4ff92SAndroid Build Coastguard Worker
1960*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
1961*89c4ff92SAndroid Build Coastguard Worker
1962*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
1963*89c4ff92SAndroid Build Coastguard Worker
1964*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterSelectionPacket(1000u, { 1345u, 254u, 4536u, 408u, 54u, 6323u, 428u, 1u, 6u });
1965*89c4ff92SAndroid Build Coastguard Worker
1966*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
1967*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 30;
1968*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
1969*89c4ff92SAndroid Build Coastguard Worker
1970*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
1971*89c4ff92SAndroid Build Coastguard Worker
1972*89c4ff92SAndroid Build Coastguard Worker // To test an exact value of the "read size" in the mock buffer, wait to allow the send thread to
1973*89c4ff92SAndroid Build Coastguard Worker // read all what's remaining in the buffer
1974*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
1975*89c4ff92SAndroid Build Coastguard Worker
1976*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
1977*89c4ff92SAndroid Build Coastguard Worker
1978*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetCommittedSize() == totalWrittenSize);
1979*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetReadableSize() == totalWrittenSize);
1980*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetReadSize() == totalWrittenSize);
1981*89c4ff92SAndroid Build Coastguard Worker }
1982*89c4ff92SAndroid Build Coastguard Worker
1983*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadTest2")
1984*89c4ff92SAndroid Build Coastguard Worker {
1985*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
1986*89c4ff92SAndroid Build Coastguard Worker SetActiveProfilingState(profilingStateMachine);
1987*89c4ff92SAndroid Build Coastguard Worker
1988*89c4ff92SAndroid Build Coastguard Worker unsigned int totalWrittenSize = 0;
1989*89c4ff92SAndroid Build Coastguard Worker
1990*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
1991*89c4ff92SAndroid Build Coastguard Worker MockStreamCounterBuffer mockStreamCounterBuffer(1024);
1992*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockStreamCounterBuffer,
1993*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
1994*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
1995*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
1996*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, mockStreamCounterBuffer, sendCounterPacket);
1997*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
1998*89c4ff92SAndroid Build Coastguard Worker
1999*89c4ff92SAndroid Build Coastguard Worker // Adding many spurious "ready to read" signals throughout the test to check that the send thread is
2000*89c4ff92SAndroid Build Coastguard Worker // capable of handling unnecessary read requests
2001*89c4ff92SAndroid Build Coastguard Worker
2002*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
2003*89c4ff92SAndroid Build Coastguard Worker
2004*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2005*89c4ff92SAndroid Build Coastguard Worker
2006*89c4ff92SAndroid Build Coastguard Worker CounterDirectory counterDirectory;
2007*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendStreamMetaDataPacket();
2008*89c4ff92SAndroid Build Coastguard Worker
2009*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += GetStreamMetaDataPacketSize();
2010*89c4ff92SAndroid Build Coastguard Worker
2011*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2012*89c4ff92SAndroid Build Coastguard Worker
2013*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
2014*89c4ff92SAndroid Build Coastguard Worker
2015*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendCounterDirectoryPacket(counterDirectory);
2016*89c4ff92SAndroid Build Coastguard Worker
2017*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Counter Directory Packet
2018*89c4ff92SAndroid Build Coastguard Worker unsigned int counterDirectoryPacketSize = 32;
2019*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += counterDirectoryPacketSize;
2020*89c4ff92SAndroid Build Coastguard Worker
2021*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2022*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2023*89c4ff92SAndroid Build Coastguard Worker
2024*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
2025*89c4ff92SAndroid Build Coastguard Worker
2026*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(123u,
2027*89c4ff92SAndroid Build Coastguard Worker {
2028*89c4ff92SAndroid Build Coastguard Worker { 1u, 23u },
2029*89c4ff92SAndroid Build Coastguard Worker { 33u, 1207623u }
2030*89c4ff92SAndroid Build Coastguard Worker });
2031*89c4ff92SAndroid Build Coastguard Worker
2032*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2033*89c4ff92SAndroid Build Coastguard Worker unsigned int periodicCounterCapturePacketSize = 28;
2034*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2035*89c4ff92SAndroid Build Coastguard Worker
2036*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2037*89c4ff92SAndroid Build Coastguard Worker
2038*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
2039*89c4ff92SAndroid Build Coastguard Worker
2040*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2041*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2042*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2043*89c4ff92SAndroid Build Coastguard Worker
2044*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
2045*89c4ff92SAndroid Build Coastguard Worker
2046*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2047*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(44u,
2048*89c4ff92SAndroid Build Coastguard Worker {
2049*89c4ff92SAndroid Build Coastguard Worker { 211u, 923u }
2050*89c4ff92SAndroid Build Coastguard Worker });
2051*89c4ff92SAndroid Build Coastguard Worker
2052*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2053*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 22;
2054*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2055*89c4ff92SAndroid Build Coastguard Worker
2056*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(1234u,
2057*89c4ff92SAndroid Build Coastguard Worker {
2058*89c4ff92SAndroid Build Coastguard Worker { 555u, 23u },
2059*89c4ff92SAndroid Build Coastguard Worker { 556u, 6u },
2060*89c4ff92SAndroid Build Coastguard Worker { 557u, 893454u },
2061*89c4ff92SAndroid Build Coastguard Worker { 558u, 1456623u },
2062*89c4ff92SAndroid Build Coastguard Worker { 559u, 571090u }
2063*89c4ff92SAndroid Build Coastguard Worker });
2064*89c4ff92SAndroid Build Coastguard Worker
2065*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2066*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 46;
2067*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2068*89c4ff92SAndroid Build Coastguard Worker
2069*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2070*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(997u,
2071*89c4ff92SAndroid Build Coastguard Worker {
2072*89c4ff92SAndroid Build Coastguard Worker { 88u, 11u },
2073*89c4ff92SAndroid Build Coastguard Worker { 96u, 22u },
2074*89c4ff92SAndroid Build Coastguard Worker { 97u, 33u },
2075*89c4ff92SAndroid Build Coastguard Worker { 999u, 444u }
2076*89c4ff92SAndroid Build Coastguard Worker });
2077*89c4ff92SAndroid Build Coastguard Worker
2078*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2079*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 40;
2080*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2081*89c4ff92SAndroid Build Coastguard Worker
2082*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2083*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2084*89c4ff92SAndroid Build Coastguard Worker
2085*89c4ff92SAndroid Build Coastguard Worker std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_UNTIL_READABLE_MS));
2086*89c4ff92SAndroid Build Coastguard Worker
2087*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterSelectionPacket(1000u, { 1345u, 254u, 4536u, 408u, 54u, 6323u, 428u, 1u, 6u });
2088*89c4ff92SAndroid Build Coastguard Worker
2089*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2090*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 30;
2091*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2092*89c4ff92SAndroid Build Coastguard Worker
2093*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2094*89c4ff92SAndroid Build Coastguard Worker
2095*89c4ff92SAndroid Build Coastguard Worker // To test an exact value of the "read size" in the mock buffer, wait to allow the send thread to
2096*89c4ff92SAndroid Build Coastguard Worker // read all what's remaining in the buffer
2097*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
2098*89c4ff92SAndroid Build Coastguard Worker
2099*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetCommittedSize() == totalWrittenSize);
2100*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetReadableSize() == totalWrittenSize);
2101*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetReadSize() == totalWrittenSize);
2102*89c4ff92SAndroid Build Coastguard Worker }
2103*89c4ff92SAndroid Build Coastguard Worker
2104*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadTest3")
2105*89c4ff92SAndroid Build Coastguard Worker {
2106*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
2107*89c4ff92SAndroid Build Coastguard Worker SetActiveProfilingState(profilingStateMachine);
2108*89c4ff92SAndroid Build Coastguard Worker
2109*89c4ff92SAndroid Build Coastguard Worker unsigned int totalWrittenSize = 0;
2110*89c4ff92SAndroid Build Coastguard Worker
2111*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
2112*89c4ff92SAndroid Build Coastguard Worker MockStreamCounterBuffer mockStreamCounterBuffer(1024);
2113*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(mockStreamCounterBuffer,
2114*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
2115*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
2116*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
2117*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, mockStreamCounterBuffer, sendCounterPacket);
2118*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2119*89c4ff92SAndroid Build Coastguard Worker
2120*89c4ff92SAndroid Build Coastguard Worker // Not using pauses or "grace periods" to stress test the send thread
2121*89c4ff92SAndroid Build Coastguard Worker
2122*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2123*89c4ff92SAndroid Build Coastguard Worker
2124*89c4ff92SAndroid Build Coastguard Worker CounterDirectory counterDirectory;
2125*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendStreamMetaDataPacket();
2126*89c4ff92SAndroid Build Coastguard Worker
2127*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += GetStreamMetaDataPacketSize();
2128*89c4ff92SAndroid Build Coastguard Worker
2129*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2130*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendCounterDirectoryPacket(counterDirectory);
2131*89c4ff92SAndroid Build Coastguard Worker
2132*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Counter Directory Packet
2133*89c4ff92SAndroid Build Coastguard Worker unsigned int counterDirectoryPacketSize =32;
2134*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += counterDirectoryPacketSize;
2135*89c4ff92SAndroid Build Coastguard Worker
2136*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2137*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2138*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(123u,
2139*89c4ff92SAndroid Build Coastguard Worker {
2140*89c4ff92SAndroid Build Coastguard Worker { 1u, 23u },
2141*89c4ff92SAndroid Build Coastguard Worker { 33u, 1207623u }
2142*89c4ff92SAndroid Build Coastguard Worker });
2143*89c4ff92SAndroid Build Coastguard Worker
2144*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2145*89c4ff92SAndroid Build Coastguard Worker unsigned int periodicCounterCapturePacketSize = 28;
2146*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2147*89c4ff92SAndroid Build Coastguard Worker
2148*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2149*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2150*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2151*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2152*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2153*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(44u,
2154*89c4ff92SAndroid Build Coastguard Worker {
2155*89c4ff92SAndroid Build Coastguard Worker { 211u, 923u }
2156*89c4ff92SAndroid Build Coastguard Worker });
2157*89c4ff92SAndroid Build Coastguard Worker
2158*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2159*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 22;
2160*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2161*89c4ff92SAndroid Build Coastguard Worker
2162*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(1234u,
2163*89c4ff92SAndroid Build Coastguard Worker {
2164*89c4ff92SAndroid Build Coastguard Worker { 555u, 23u },
2165*89c4ff92SAndroid Build Coastguard Worker { 556u, 6u },
2166*89c4ff92SAndroid Build Coastguard Worker { 557u, 893454u },
2167*89c4ff92SAndroid Build Coastguard Worker { 558u, 1456623u },
2168*89c4ff92SAndroid Build Coastguard Worker { 559u, 571090u }
2169*89c4ff92SAndroid Build Coastguard Worker });
2170*89c4ff92SAndroid Build Coastguard Worker
2171*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2172*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 46;
2173*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2174*89c4ff92SAndroid Build Coastguard Worker
2175*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2176*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2177*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(997u,
2178*89c4ff92SAndroid Build Coastguard Worker {
2179*89c4ff92SAndroid Build Coastguard Worker { 88u, 11u },
2180*89c4ff92SAndroid Build Coastguard Worker { 96u, 22u },
2181*89c4ff92SAndroid Build Coastguard Worker { 97u, 33u },
2182*89c4ff92SAndroid Build Coastguard Worker { 999u, 444u }
2183*89c4ff92SAndroid Build Coastguard Worker });
2184*89c4ff92SAndroid Build Coastguard Worker
2185*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2186*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 40;
2187*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2188*89c4ff92SAndroid Build Coastguard Worker
2189*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2190*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2191*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterSelectionPacket(1000u, { 1345u, 254u, 4536u, 408u, 54u, 6323u, 428u, 1u, 6u });
2192*89c4ff92SAndroid Build Coastguard Worker
2193*89c4ff92SAndroid Build Coastguard Worker // Get the size of the Periodic Counter Capture Packet
2194*89c4ff92SAndroid Build Coastguard Worker periodicCounterCapturePacketSize = 30;
2195*89c4ff92SAndroid Build Coastguard Worker totalWrittenSize += periodicCounterCapturePacketSize;
2196*89c4ff92SAndroid Build Coastguard Worker
2197*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2198*89c4ff92SAndroid Build Coastguard Worker
2199*89c4ff92SAndroid Build Coastguard Worker // Abruptly terminating the send thread, the amount of data sent may be less that the amount written (the send
2200*89c4ff92SAndroid Build Coastguard Worker // thread is not guaranteed to flush the buffer)
2201*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
2202*89c4ff92SAndroid Build Coastguard Worker
2203*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetCommittedSize() == totalWrittenSize);
2204*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetReadableSize() <= totalWrittenSize);
2205*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetReadSize() <= totalWrittenSize);
2206*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetReadSize() <= mockStreamCounterBuffer.GetReadableSize());
2207*89c4ff92SAndroid Build Coastguard Worker CHECK(mockStreamCounterBuffer.GetReadSize() <= mockStreamCounterBuffer.GetCommittedSize());
2208*89c4ff92SAndroid Build Coastguard Worker }
2209*89c4ff92SAndroid Build Coastguard Worker
2210*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendCounterPacketTestWithSendThread")
2211*89c4ff92SAndroid Build Coastguard Worker {
2212*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
2213*89c4ff92SAndroid Build Coastguard Worker SetWaitingForAckProfilingState(profilingStateMachine);
2214*89c4ff92SAndroid Build Coastguard Worker
2215*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
2216*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(1, 1024);
2217*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(bufferManager,
2218*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
2219*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
2220*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
2221*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, bufferManager, sendCounterPacket, -1);
2222*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2223*89c4ff92SAndroid Build Coastguard Worker
2224*89c4ff92SAndroid Build Coastguard Worker unsigned int streamMetadataPacketsize = GetStreamMetaDataPacketSize();
2225*89c4ff92SAndroid Build Coastguard Worker
2226*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
2227*89c4ff92SAndroid Build Coastguard Worker
2228*89c4ff92SAndroid Build Coastguard Worker // check for packet in ProfilingConnection
2229*89c4ff92SAndroid Build Coastguard Worker CHECK(mockProfilingConnection.CheckForPacket({PacketType::StreamMetaData, streamMetadataPacketsize}) == 1);
2230*89c4ff92SAndroid Build Coastguard Worker
2231*89c4ff92SAndroid Build Coastguard Worker SetActiveProfilingState(profilingStateMachine);
2232*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2233*89c4ff92SAndroid Build Coastguard Worker
2234*89c4ff92SAndroid Build Coastguard Worker // SendCounterDirectoryPacket
2235*89c4ff92SAndroid Build Coastguard Worker CounterDirectory counterDirectory;
2236*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendCounterDirectoryPacket(counterDirectory);
2237*89c4ff92SAndroid Build Coastguard Worker
2238*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
2239*89c4ff92SAndroid Build Coastguard Worker unsigned int counterDirectoryPacketSize = 32;
2240*89c4ff92SAndroid Build Coastguard Worker // check for packet in ProfilingConnection
2241*89c4ff92SAndroid Build Coastguard Worker CHECK(mockProfilingConnection.CheckForPacket(
2242*89c4ff92SAndroid Build Coastguard Worker {PacketType::CounterDirectory, counterDirectoryPacketSize}) == 1);
2243*89c4ff92SAndroid Build Coastguard Worker
2244*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2245*89c4ff92SAndroid Build Coastguard Worker
2246*89c4ff92SAndroid Build Coastguard Worker // SendPeriodicCounterCapturePacket
2247*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(123u,
2248*89c4ff92SAndroid Build Coastguard Worker {
2249*89c4ff92SAndroid Build Coastguard Worker { 1u, 23u },
2250*89c4ff92SAndroid Build Coastguard Worker { 33u, 1207623u }
2251*89c4ff92SAndroid Build Coastguard Worker });
2252*89c4ff92SAndroid Build Coastguard Worker
2253*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
2254*89c4ff92SAndroid Build Coastguard Worker
2255*89c4ff92SAndroid Build Coastguard Worker unsigned int periodicCounterCapturePacketSize = 28;
2256*89c4ff92SAndroid Build Coastguard Worker CHECK(mockProfilingConnection.CheckForPacket(
2257*89c4ff92SAndroid Build Coastguard Worker {PacketType::PeriodicCounterCapture, periodicCounterCapturePacketSize}) == 1);
2258*89c4ff92SAndroid Build Coastguard Worker }
2259*89c4ff92SAndroid Build Coastguard Worker
2260*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadBufferTest")
2261*89c4ff92SAndroid Build Coastguard Worker {
2262*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
2263*89c4ff92SAndroid Build Coastguard Worker SetActiveProfilingState(profilingStateMachine);
2264*89c4ff92SAndroid Build Coastguard Worker
2265*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
2266*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(3, 1024);
2267*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(bufferManager,
2268*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
2269*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
2270*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
2271*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, bufferManager, sendCounterPacket, -1);
2272*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2273*89c4ff92SAndroid Build Coastguard Worker
2274*89c4ff92SAndroid Build Coastguard Worker // SendStreamMetaDataPacket
2275*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendStreamMetaDataPacket();
2276*89c4ff92SAndroid Build Coastguard Worker
2277*89c4ff92SAndroid Build Coastguard Worker // Read data from the buffer
2278*89c4ff92SAndroid Build Coastguard Worker // Buffer should become readable after commit by SendStreamMetaDataPacket
2279*89c4ff92SAndroid Build Coastguard Worker auto packetBuffer = bufferManager.GetReadableBuffer();
2280*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer.get());
2281*89c4ff92SAndroid Build Coastguard Worker
2282*89c4ff92SAndroid Build Coastguard Worker unsigned int streamMetadataPacketsize = GetStreamMetaDataPacketSize();
2283*89c4ff92SAndroid Build Coastguard Worker CHECK(packetBuffer->GetSize() == streamMetadataPacketsize);
2284*89c4ff92SAndroid Build Coastguard Worker
2285*89c4ff92SAndroid Build Coastguard Worker // Recommit to be read by sendCounterPacket
2286*89c4ff92SAndroid Build Coastguard Worker bufferManager.Commit(packetBuffer, streamMetadataPacketsize);
2287*89c4ff92SAndroid Build Coastguard Worker
2288*89c4ff92SAndroid Build Coastguard Worker // SendCounterDirectoryPacket
2289*89c4ff92SAndroid Build Coastguard Worker CounterDirectory counterDirectory;
2290*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendCounterDirectoryPacket(counterDirectory);
2291*89c4ff92SAndroid Build Coastguard Worker
2292*89c4ff92SAndroid Build Coastguard Worker // SendPeriodicCounterCapturePacket
2293*89c4ff92SAndroid Build Coastguard Worker sendCounterPacket.SendPeriodicCounterCapturePacket(123u,
2294*89c4ff92SAndroid Build Coastguard Worker {
2295*89c4ff92SAndroid Build Coastguard Worker { 1u, 23u },
2296*89c4ff92SAndroid Build Coastguard Worker { 33u, 1207623u }
2297*89c4ff92SAndroid Build Coastguard Worker });
2298*89c4ff92SAndroid Build Coastguard Worker
2299*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
2300*89c4ff92SAndroid Build Coastguard Worker
2301*89c4ff92SAndroid Build Coastguard Worker // The buffer is read by the send thread so it should not be in the readable buffer.
2302*89c4ff92SAndroid Build Coastguard Worker auto readBuffer = bufferManager.GetReadableBuffer();
2303*89c4ff92SAndroid Build Coastguard Worker CHECK(!readBuffer);
2304*89c4ff92SAndroid Build Coastguard Worker
2305*89c4ff92SAndroid Build Coastguard Worker // Successfully reserved the buffer with requested size
2306*89c4ff92SAndroid Build Coastguard Worker unsigned int reservedSize = 0;
2307*89c4ff92SAndroid Build Coastguard Worker auto reservedBuffer = bufferManager.Reserve(512, reservedSize);
2308*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedSize == 512);
2309*89c4ff92SAndroid Build Coastguard Worker CHECK(reservedBuffer.get());
2310*89c4ff92SAndroid Build Coastguard Worker
2311*89c4ff92SAndroid Build Coastguard Worker const auto writtenDataSize = mockProfilingConnection.GetWrittenDataSize();
2312*89c4ff92SAndroid Build Coastguard Worker const auto metaDataPacketCount =
2313*89c4ff92SAndroid Build Coastguard Worker mockProfilingConnection.CheckForPacket({PacketType::StreamMetaData, streamMetadataPacketsize});
2314*89c4ff92SAndroid Build Coastguard Worker
2315*89c4ff92SAndroid Build Coastguard Worker CHECK(metaDataPacketCount >= 1);
2316*89c4ff92SAndroid Build Coastguard Worker CHECK(mockProfilingConnection.CheckForPacket({PacketType::CounterDirectory, 32}) == 1);
2317*89c4ff92SAndroid Build Coastguard Worker CHECK(mockProfilingConnection.CheckForPacket({PacketType::PeriodicCounterCapture, 28}) == 1);
2318*89c4ff92SAndroid Build Coastguard Worker // Check that we only received the packets we expected
2319*89c4ff92SAndroid Build Coastguard Worker CHECK(metaDataPacketCount + 2 == writtenDataSize);
2320*89c4ff92SAndroid Build Coastguard Worker }
2321*89c4ff92SAndroid Build Coastguard Worker
2322*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadSendStreamMetadataPacket1")
2323*89c4ff92SAndroid Build Coastguard Worker {
2324*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
2325*89c4ff92SAndroid Build Coastguard Worker
2326*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
2327*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(3, 1024);
2328*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(bufferManager,
2329*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
2330*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
2331*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
2332*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, bufferManager, sendCounterPacket);
2333*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2334*89c4ff92SAndroid Build Coastguard Worker
2335*89c4ff92SAndroid Build Coastguard Worker // The profiling state is set to "Uninitialized", so the send thread should throw an exception
2336*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendThread.Stop(), arm::pipe::ProfilingException);
2337*89c4ff92SAndroid Build Coastguard Worker }
2338*89c4ff92SAndroid Build Coastguard Worker
2339*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadSendStreamMetadataPacket2")
2340*89c4ff92SAndroid Build Coastguard Worker {
2341*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
2342*89c4ff92SAndroid Build Coastguard Worker SetNotConnectedProfilingState(profilingStateMachine);
2343*89c4ff92SAndroid Build Coastguard Worker
2344*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
2345*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(3, 1024);
2346*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(bufferManager,
2347*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
2348*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
2349*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
2350*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, bufferManager, sendCounterPacket);
2351*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2352*89c4ff92SAndroid Build Coastguard Worker
2353*89c4ff92SAndroid Build Coastguard Worker // The profiling state is set to "NotConnected", so the send thread should throw an exception
2354*89c4ff92SAndroid Build Coastguard Worker CHECK_THROWS_AS(sendThread.Stop(), arm::pipe::ProfilingException);
2355*89c4ff92SAndroid Build Coastguard Worker }
2356*89c4ff92SAndroid Build Coastguard Worker
2357*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadSendStreamMetadataPacket3")
2358*89c4ff92SAndroid Build Coastguard Worker {
2359*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
2360*89c4ff92SAndroid Build Coastguard Worker SetWaitingForAckProfilingState(profilingStateMachine);
2361*89c4ff92SAndroid Build Coastguard Worker
2362*89c4ff92SAndroid Build Coastguard Worker unsigned int streamMetadataPacketsize = GetStreamMetaDataPacketSize();
2363*89c4ff92SAndroid Build Coastguard Worker
2364*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
2365*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(3, 1024);
2366*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(bufferManager,
2367*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
2368*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
2369*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
2370*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, bufferManager, sendCounterPacket);
2371*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2372*89c4ff92SAndroid Build Coastguard Worker
2373*89c4ff92SAndroid Build Coastguard Worker // The profiling state is set to "WaitingForAck", so the send thread should send a Stream Metadata packet
2374*89c4ff92SAndroid Build Coastguard Worker // Wait for sendThread to join
2375*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(sendThread.Stop());
2376*89c4ff92SAndroid Build Coastguard Worker
2377*89c4ff92SAndroid Build Coastguard Worker // Check that the buffer contains at least one Stream Metadata packet and no other packets
2378*89c4ff92SAndroid Build Coastguard Worker const auto writtenDataSize = mockProfilingConnection.GetWrittenDataSize();
2379*89c4ff92SAndroid Build Coastguard Worker
2380*89c4ff92SAndroid Build Coastguard Worker CHECK(writtenDataSize >= 1u);
2381*89c4ff92SAndroid Build Coastguard Worker CHECK(mockProfilingConnection.CheckForPacket(
2382*89c4ff92SAndroid Build Coastguard Worker {PacketType::StreamMetaData, streamMetadataPacketsize}) == writtenDataSize);
2383*89c4ff92SAndroid Build Coastguard Worker }
2384*89c4ff92SAndroid Build Coastguard Worker
2385*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("SendThreadSendStreamMetadataPacket4")
2386*89c4ff92SAndroid Build Coastguard Worker {
2387*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine profilingStateMachine;
2388*89c4ff92SAndroid Build Coastguard Worker SetWaitingForAckProfilingState(profilingStateMachine);
2389*89c4ff92SAndroid Build Coastguard Worker
2390*89c4ff92SAndroid Build Coastguard Worker unsigned int streamMetadataPacketsize = GetStreamMetaDataPacketSize();
2391*89c4ff92SAndroid Build Coastguard Worker
2392*89c4ff92SAndroid Build Coastguard Worker MockProfilingConnection mockProfilingConnection;
2393*89c4ff92SAndroid Build Coastguard Worker BufferManager bufferManager(3, 1024);
2394*89c4ff92SAndroid Build Coastguard Worker SendCounterPacket sendCounterPacket(bufferManager,
2395*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_INFO,
2396*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_SOFTWARE_VERSION,
2397*89c4ff92SAndroid Build Coastguard Worker arm::pipe::ARMNN_HARDWARE_VERSION);
2398*89c4ff92SAndroid Build Coastguard Worker SendThread sendThread(profilingStateMachine, bufferManager, sendCounterPacket);
2399*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2400*89c4ff92SAndroid Build Coastguard Worker
2401*89c4ff92SAndroid Build Coastguard Worker // The profiling state is set to "WaitingForAck", so the send thread should send a Stream Metadata packet
2402*89c4ff92SAndroid Build Coastguard Worker // Wait for sendThread to join
2403*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
2404*89c4ff92SAndroid Build Coastguard Worker
2405*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2406*89c4ff92SAndroid Build Coastguard Worker // Check that the profiling state is still "WaitingForAck"
2407*89c4ff92SAndroid Build Coastguard Worker CHECK((profilingStateMachine.GetCurrentState() == ProfilingState::WaitingForAck));
2408*89c4ff92SAndroid Build Coastguard Worker
2409*89c4ff92SAndroid Build Coastguard Worker // Check that the buffer contains at least one Stream Metadata packet
2410*89c4ff92SAndroid Build Coastguard Worker CHECK(mockProfilingConnection.CheckForPacket({PacketType::StreamMetaData, streamMetadataPacketsize}) >= 1);
2411*89c4ff92SAndroid Build Coastguard Worker
2412*89c4ff92SAndroid Build Coastguard Worker mockProfilingConnection.Clear();
2413*89c4ff92SAndroid Build Coastguard Worker
2414*89c4ff92SAndroid Build Coastguard Worker sendThread.Stop();
2415*89c4ff92SAndroid Build Coastguard Worker sendThread.Start(mockProfilingConnection);
2416*89c4ff92SAndroid Build Coastguard Worker
2417*89c4ff92SAndroid Build Coastguard Worker // Try triggering a new buffer read
2418*89c4ff92SAndroid Build Coastguard Worker sendThread.SetReadyToRead();
2419*89c4ff92SAndroid Build Coastguard Worker
2420*89c4ff92SAndroid Build Coastguard Worker // Wait for sendThread to join
2421*89c4ff92SAndroid Build Coastguard Worker CHECK_NOTHROW(sendThread.Stop());
2422*89c4ff92SAndroid Build Coastguard Worker
2423*89c4ff92SAndroid Build Coastguard Worker // Check that the profiling state is still "WaitingForAck"
2424*89c4ff92SAndroid Build Coastguard Worker CHECK((profilingStateMachine.GetCurrentState() == ProfilingState::WaitingForAck));
2425*89c4ff92SAndroid Build Coastguard Worker
2426*89c4ff92SAndroid Build Coastguard Worker // Check that the buffer contains at least one Stream Metadata packet and no other packets
2427*89c4ff92SAndroid Build Coastguard Worker const auto writtenDataSize = mockProfilingConnection.GetWrittenDataSize();
2428*89c4ff92SAndroid Build Coastguard Worker
2429*89c4ff92SAndroid Build Coastguard Worker CHECK(writtenDataSize >= 1u);
2430*89c4ff92SAndroid Build Coastguard Worker CHECK(mockProfilingConnection.CheckForPacket(
2431*89c4ff92SAndroid Build Coastguard Worker {PacketType::StreamMetaData, streamMetadataPacketsize}) == writtenDataSize);
2432*89c4ff92SAndroid Build Coastguard Worker }
2433*89c4ff92SAndroid Build Coastguard Worker
2434*89c4ff92SAndroid Build Coastguard Worker }
2435