blob: ceb955d1310549c22642cbbc30ae7a1b68b9da81 [file] [log] [blame]
Finn Williamse63a0262019-10-22 10:30:49 +01001//
Jim Flynn1fdeb992020-07-09 07:28:37 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Finn Williamse63a0262019-10-22 10:30:49 +01003// SPDX-License-Identifier: MIT
4//
5
Finn Williams8a2b4682020-02-26 10:25:26 +00006#include <TimelineCaptureCommandHandler.hpp>
7#include <TimelineDirectoryCaptureCommandHandler.hpp>
8#include <TimelineDecoder.hpp>
Finn Williamse63a0262019-10-22 10:30:49 +01009
10#include <CommandHandlerFunctor.hpp>
Jim Flynn1fdeb992020-07-09 07:28:37 +010011#include <Threads.hpp>
Finn Williamse63a0262019-10-22 10:30:49 +010012#include <ProfilingService.hpp>
13#include <PacketBuffer.hpp>
14#include <TimelinePacketWriterFactory.hpp>
15
16#include <boost/test/test_tools.hpp>
17#include <boost/test/unit_test_suite.hpp>
18
19BOOST_AUTO_TEST_SUITE(TimelineDecoderTests)
20
21using namespace armnn;
Finn Williams8a2b4682020-02-26 10:25:26 +000022using namespace timelinedecoder;
Finn Williamse63a0262019-10-22 10:30:49 +010023
24void SendTimelinePacketToCommandHandler(const unsigned char* packetBuffer,
25 profiling::CommandHandlerFunctor &CommandHandler)
26{
27 uint32_t uint32_t_size = sizeof(uint32_t);
28 unsigned int offset = 0;
29
30 uint32_t header[2];
31 header[0] = profiling::ReadUint32(packetBuffer, offset);
32 offset += uint32_t_size;
33 header[1] = profiling::ReadUint32(packetBuffer, offset);
34 offset += uint32_t_size;
Finn Williamse63a0262019-10-22 10:30:49 +010035 uint32_t PacketDataLength = header[1] & 0x00FFFFFF;
36
Matteo Martincigh34a407d2019-11-06 15:30:54 +000037 auto uniquePacketData = std::make_unique<unsigned char[]>(PacketDataLength);
Finn Williamse63a0262019-10-22 10:30:49 +010038 std::memcpy(uniquePacketData.get(), packetBuffer + offset, PacketDataLength);
39
Matteo Martincigh34a407d2019-11-06 15:30:54 +000040 armnn::profiling::Packet packet(header[0], PacketDataLength, uniquePacketData);
41
42 BOOST_CHECK(std::memcmp(packetBuffer + offset, packet.GetData(), packet.GetLength()) == 0);
Finn Williamse63a0262019-10-22 10:30:49 +010043
44 CommandHandler(packet);
45}
46
Finn Williams510f6182020-02-21 11:14:08 +000047void PushEntity(TimelineDecoder::Model& model, const ITimelineDecoder::Entity entity)
48{
49 model.m_Entities.emplace_back(entity);
50}
51
52void PushEventClass(TimelineDecoder::Model& model, const ITimelineDecoder::EventClass eventClass)
53{
54 model.m_EventClasses.emplace_back(eventClass);
55}
56
57void PushEvent(TimelineDecoder::Model& model, const ITimelineDecoder::Event event)
58{
59 model.m_Events.emplace_back(event);
60}
61
62void PushLabel(TimelineDecoder::Model& model, const ITimelineDecoder::Label label)
63{
64 model.m_Labels.emplace_back(label);
65}
66
67void PushRelationship(TimelineDecoder::Model& model, const ITimelineDecoder::Relationship relationship)
68{
69 model.m_Relationships.emplace_back(relationship);
70}
71
Matteo Martincigh34a407d2019-11-06 15:30:54 +000072BOOST_AUTO_TEST_CASE(TimelineDirectoryTest)
Finn Williamse63a0262019-10-22 10:30:49 +010073{
Matteo Martincigh34a407d2019-11-06 15:30:54 +000074 uint32_t uint8_t_size = sizeof(uint8_t);
Finn Williamse63a0262019-10-22 10:30:49 +010075 uint32_t uint32_t_size = sizeof(uint32_t);
Matteo Martincigh34a407d2019-11-06 15:30:54 +000076 uint32_t uint64_t_size = sizeof(uint64_t);
Finn Williamse63a0262019-10-22 10:30:49 +010077
78 profiling::BufferManager bufferManager(5);
79 profiling::TimelinePacketWriterFactory timelinePacketWriterFactory(bufferManager);
80
81 std::unique_ptr<profiling::ISendTimelinePacket> sendTimelinePacket =
82 timelinePacketWriterFactory.GetSendTimelinePacket();
83
84 profiling::PacketVersionResolver packetVersionResolver;
85
Finn Williamse6a2ccd2020-02-27 16:21:41 +000086 TimelineDecoder timelineDecoder;
87 TimelineCaptureCommandHandler timelineCaptureCommandHandler(
88 1, 1, packetVersionResolver.ResolvePacketVersion(1, 1).GetEncodedValue(), timelineDecoder);
89
Finn Williams8a2b4682020-02-26 10:25:26 +000090 TimelineDirectoryCaptureCommandHandler timelineDirectoryCaptureCommandHandler(
Finn Williamse6a2ccd2020-02-27 16:21:41 +000091 1, 0, packetVersionResolver.ResolvePacketVersion(1, 0).GetEncodedValue(),
92 timelineCaptureCommandHandler, true);
Finn Williamse63a0262019-10-22 10:30:49 +010093
94 sendTimelinePacket->SendTimelineMessageDirectoryPackage();
95 sendTimelinePacket->Commit();
96
97 std::vector<profiling::SwTraceMessage> swTraceBufferMessages;
98
99 unsigned int offset = uint32_t_size * 2;
100
101 std::unique_ptr<profiling::IPacketBuffer> packetBuffer = bufferManager.GetReadableBuffer();
102
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000103 uint8_t readStreamVersion = ReadUint8(packetBuffer, offset);
104 BOOST_CHECK(readStreamVersion == 4);
105 offset += uint8_t_size;
106 uint8_t readPointerBytes = ReadUint8(packetBuffer, offset);
107 BOOST_CHECK(readPointerBytes == uint64_t_size);
108 offset += uint8_t_size;
109 uint8_t readThreadIdBytes = ReadUint8(packetBuffer, offset);
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100110 BOOST_CHECK(readThreadIdBytes == armnn::profiling::ThreadIdSize);
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000111 offset += uint8_t_size;
112
Finn Williamse63a0262019-10-22 10:30:49 +0100113 uint32_t declarationSize = profiling::ReadUint32(packetBuffer, offset);
114 offset += uint32_t_size;
115 for(uint32_t i = 0; i < declarationSize; ++i)
116 {
Kevin Mayc1351792020-07-28 11:29:04 +0100117 swTraceBufferMessages.push_back(profiling::ReadSwTraceMessage(packetBuffer->GetReadableData(),
118 offset,
119 packetBuffer->GetSize()));
Finn Williamse63a0262019-10-22 10:30:49 +0100120 }
121
122 SendTimelinePacketToCommandHandler(packetBuffer->GetReadableData(), timelineDirectoryCaptureCommandHandler);
123
124 for(uint32_t index = 0; index < declarationSize; ++index)
125 {
126 profiling::SwTraceMessage& bufferMessage = swTraceBufferMessages[index];
127 profiling::SwTraceMessage& handlerMessage = timelineDirectoryCaptureCommandHandler.m_SwTraceMessages[index];
128
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000129 BOOST_CHECK(bufferMessage.m_Name == handlerMessage.m_Name);
130 BOOST_CHECK(bufferMessage.m_UiName == handlerMessage.m_UiName);
131 BOOST_CHECK(bufferMessage.m_Id == handlerMessage.m_Id);
Finn Williamse63a0262019-10-22 10:30:49 +0100132
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000133 BOOST_CHECK(bufferMessage.m_ArgTypes.size() == handlerMessage.m_ArgTypes.size());
134 for(uint32_t i = 0; i < bufferMessage.m_ArgTypes.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100135 {
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000136 BOOST_CHECK(bufferMessage.m_ArgTypes[i] == handlerMessage.m_ArgTypes[i]);
Finn Williamse63a0262019-10-22 10:30:49 +0100137 }
138
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000139 BOOST_CHECK(bufferMessage.m_ArgNames.size() == handlerMessage.m_ArgNames.size());
140 for(uint32_t i = 0; i < bufferMessage.m_ArgNames.size(); ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100141 {
Matteo Martincigh34a407d2019-11-06 15:30:54 +0000142 BOOST_CHECK(bufferMessage.m_ArgNames[i] == handlerMessage.m_ArgNames[i]);
Finn Williamse63a0262019-10-22 10:30:49 +0100143 }
144 }
145}
146
147BOOST_AUTO_TEST_CASE(TimelineCaptureTest)
148{
Finn Williamse63a0262019-10-22 10:30:49 +0100149 profiling::BufferManager bufferManager(50);
150 profiling::TimelinePacketWriterFactory timelinePacketWriterFactory(bufferManager);
151
152 std::unique_ptr<profiling::ISendTimelinePacket> sendTimelinePacket =
153 timelinePacketWriterFactory.GetSendTimelinePacket();
154
155 profiling::PacketVersionResolver packetVersionResolver;
156
Finn Williams510f6182020-02-21 11:14:08 +0000157 TimelineDecoder timelineDecoder;
158 const TimelineDecoder::Model& model = timelineDecoder.GetModel();
Finn Williamse63a0262019-10-22 10:30:49 +0100159
Finn Williamse6a2ccd2020-02-27 16:21:41 +0000160
Finn Williams8a2b4682020-02-26 10:25:26 +0000161 TimelineCaptureCommandHandler timelineCaptureCommandHandler(
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100162 1, 1, packetVersionResolver.ResolvePacketVersion(1, 1).GetEncodedValue(), timelineDecoder,
163 armnn::profiling::ThreadIdSize);
Finn Williamse63a0262019-10-22 10:30:49 +0100164
Keith Davis97da5e22020-03-05 16:25:28 +0000165 using Status = ITimelineDecoder::TimelineStatus;
166 BOOST_CHECK(timelineDecoder.SetEntityCallback(PushEntity) == Status::TimelineStatus_Success);
167 BOOST_CHECK(timelineDecoder.SetEventClassCallback(PushEventClass) == Status::TimelineStatus_Success);
168 BOOST_CHECK(timelineDecoder.SetEventCallback(PushEvent) == Status::TimelineStatus_Success);
169 BOOST_CHECK(timelineDecoder.SetLabelCallback(PushLabel) == Status::TimelineStatus_Success);
170 BOOST_CHECK(timelineDecoder.SetRelationshipCallback(PushRelationship) == Status::TimelineStatus_Success);
Finn Williamse63a0262019-10-22 10:30:49 +0100171
Keith Davis97da5e22020-03-05 16:25:28 +0000172 const uint64_t entityGuid = 111111u;
Finn Williams510f6182020-02-21 11:14:08 +0000173 const uint64_t eventClassGuid = 22222u;
Jim Flynn1892d212020-05-26 21:10:49 +0100174 const uint64_t eventClassNameGuid = 22322u;
Finn Williams510f6182020-02-21 11:14:08 +0000175 const uint64_t timestamp = 33333u;
176 const uint64_t eventGuid = 44444u;
Finn Williamse63a0262019-10-22 10:30:49 +0100177
Jim Flynn1fdeb992020-07-09 07:28:37 +0100178 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Finn Williamse63a0262019-10-22 10:30:49 +0100179
Finn Williams510f6182020-02-21 11:14:08 +0000180 // need to do a bit of work here to extract the value from threadId
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100181 unsigned char* uCharThreadId = new unsigned char[armnn::profiling::ThreadIdSize]();;
Finn Williams510f6182020-02-21 11:14:08 +0000182 uint64_t uint64ThreadId;
Finn Williamse63a0262019-10-22 10:30:49 +0100183
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100184 profiling::WriteBytes(uCharThreadId, 0, &threadId, armnn::profiling::ThreadIdSize);
Finn Williamse63a0262019-10-22 10:30:49 +0100185
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100186 if (armnn::profiling::ThreadIdSize == 4)
Finn Williams510f6182020-02-21 11:14:08 +0000187 {
188 uint64ThreadId = profiling::ReadUint32(uCharThreadId, 0);
189 }
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100190 else if (armnn::profiling::ThreadIdSize == 8)
Finn Williams510f6182020-02-21 11:14:08 +0000191 {
192 uint64ThreadId = profiling::ReadUint64(uCharThreadId, 0);
193 }
194 delete[] uCharThreadId;
195
196 const uint64_t labelGuid = 66666u;
Finn Williamse63a0262019-10-22 10:30:49 +0100197 std::string labelName = "test_label";
198
Finn Williams510f6182020-02-21 11:14:08 +0000199 const uint64_t relationshipGuid = 77777u;
200 const uint64_t headGuid = 888888u;
201 const uint64_t tailGuid = 999999u;
Finn Williamse63a0262019-10-22 10:30:49 +0100202
203 for (int i = 0; i < 10; ++i)
204 {
205 // Send entity
206 sendTimelinePacket->SendTimelineEntityBinaryPacket(entityGuid);
207 sendTimelinePacket->Commit();
208 SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
209 timelineCaptureCommandHandler);
210
211 // Send event class
Jim Flynn1892d212020-05-26 21:10:49 +0100212 sendTimelinePacket->SendTimelineEventClassBinaryPacket(eventClassGuid, eventClassNameGuid);
Finn Williamse63a0262019-10-22 10:30:49 +0100213 sendTimelinePacket->Commit();
214 SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
215 timelineCaptureCommandHandler);
216
217 // Send event
218 sendTimelinePacket->SendTimelineEventBinaryPacket(timestamp, threadId, eventGuid);
219 sendTimelinePacket->Commit();
220 SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
221 timelineCaptureCommandHandler);
222
223 // Send label
224 sendTimelinePacket->SendTimelineLabelBinaryPacket(labelGuid, labelName);
225 sendTimelinePacket->Commit();
226 SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
227 timelineCaptureCommandHandler);
228
229 // Send relationship
230 profiling::ProfilingRelationshipType relationshipType = profiling::ProfilingRelationshipType::DataLink;
231 sendTimelinePacket->SendTimelineRelationshipBinaryPacket(relationshipType,
232 relationshipGuid,
233 headGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100234 tailGuid,
235 0);
Finn Williamse63a0262019-10-22 10:30:49 +0100236 sendTimelinePacket->Commit();
237 SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
238 timelineCaptureCommandHandler);
239 }
240
Finn Williams510f6182020-02-21 11:14:08 +0000241 for (unsigned long i = 0; i < 10; ++i)
Finn Williamse63a0262019-10-22 10:30:49 +0100242 {
Finn Williams510f6182020-02-21 11:14:08 +0000243 BOOST_CHECK(model.m_Entities[i].m_Guid == entityGuid);
Finn Williamse63a0262019-10-22 10:30:49 +0100244
Finn Williams510f6182020-02-21 11:14:08 +0000245 BOOST_CHECK(model.m_EventClasses[i].m_Guid == eventClassGuid);
Finn Williamse63a0262019-10-22 10:30:49 +0100246
Finn Williams510f6182020-02-21 11:14:08 +0000247 BOOST_CHECK(model.m_Events[i].m_TimeStamp == timestamp);
248 BOOST_CHECK(model.m_Events[i].m_ThreadId == uint64ThreadId);
249 BOOST_CHECK(model.m_Events[i].m_Guid == eventGuid);
Finn Williamse63a0262019-10-22 10:30:49 +0100250
Finn Williams510f6182020-02-21 11:14:08 +0000251 BOOST_CHECK(model.m_Labels[i].m_Guid == labelGuid);
252 BOOST_CHECK(model.m_Labels[i].m_Name == labelName);
Finn Williamse63a0262019-10-22 10:30:49 +0100253
Finn Williams510f6182020-02-21 11:14:08 +0000254 BOOST_CHECK(model.m_Relationships[i].m_RelationshipType == ITimelineDecoder::RelationshipType::DataLink);
255 BOOST_CHECK(model.m_Relationships[i].m_Guid == relationshipGuid);
256 BOOST_CHECK(model.m_Relationships[i].m_HeadGuid == headGuid);
257 BOOST_CHECK(model.m_Relationships[i].m_TailGuid == tailGuid);
Finn Williamse63a0262019-10-22 10:30:49 +0100258 }
Finn Williamse63a0262019-10-22 10:30:49 +0100259}
260
Keith Davis5238aff2020-03-11 12:17:05 +0000261BOOST_AUTO_TEST_CASE(TimelineCaptureTestMultipleStringsInBuffer)
262{
Keith Davis5238aff2020-03-11 12:17:05 +0000263 profiling::BufferManager bufferManager(50);
264 profiling::TimelinePacketWriterFactory timelinePacketWriterFactory(bufferManager);
265
266 std::unique_ptr<profiling::ISendTimelinePacket> sendTimelinePacket =
267 timelinePacketWriterFactory.GetSendTimelinePacket();
268
269 profiling::PacketVersionResolver packetVersionResolver;
270
271 TimelineDecoder timelineDecoder;
272 const TimelineDecoder::Model& model = timelineDecoder.GetModel();
273
274 TimelineCaptureCommandHandler timelineCaptureCommandHandler(
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100275 1, 1, packetVersionResolver.ResolvePacketVersion(1, 1).GetEncodedValue(), timelineDecoder,
276 armnn::profiling::ThreadIdSize);
Keith Davis5238aff2020-03-11 12:17:05 +0000277
278 using Status = ITimelineDecoder::TimelineStatus;
279 BOOST_CHECK(timelineDecoder.SetEntityCallback(PushEntity) == Status::TimelineStatus_Success);
280 BOOST_CHECK(timelineDecoder.SetEventClassCallback(PushEventClass) == Status::TimelineStatus_Success);
281 BOOST_CHECK(timelineDecoder.SetEventCallback(PushEvent) == Status::TimelineStatus_Success);
282 BOOST_CHECK(timelineDecoder.SetLabelCallback(PushLabel) == Status::TimelineStatus_Success);
283 BOOST_CHECK(timelineDecoder.SetRelationshipCallback(PushRelationship) == Status::TimelineStatus_Success);
284
Jim Flynn1892d212020-05-26 21:10:49 +0100285 const uint64_t entityGuid = 111111u;
286 const uint64_t eventClassGuid = 22222u;
287 const uint64_t eventClassNameGuid = 22322u;
288 const uint64_t timestamp = 33333u;
289 const uint64_t eventGuid = 44444u;
Keith Davis5238aff2020-03-11 12:17:05 +0000290
Jim Flynn1fdeb992020-07-09 07:28:37 +0100291 const int threadId = armnnUtils::Threads::GetCurrentThreadId();
Keith Davis5238aff2020-03-11 12:17:05 +0000292
293 // need to do a bit of work here to extract the value from threadId
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100294 unsigned char* uCharThreadId = new unsigned char[armnn::profiling::ThreadIdSize]();
Keith Davis5238aff2020-03-11 12:17:05 +0000295 uint64_t uint64ThreadId;
296
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100297 profiling::WriteBytes(uCharThreadId, 0, &threadId, armnn::profiling::ThreadIdSize);
Keith Davis5238aff2020-03-11 12:17:05 +0000298
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100299 if ( armnn::profiling::ThreadIdSize == 4 )
Keith Davis5238aff2020-03-11 12:17:05 +0000300 {
301 uint64ThreadId = profiling::ReadUint32(uCharThreadId, 0);
Colm Donelan5bb3d8a2020-05-12 16:36:46 +0100302 }
303 else if ( armnn::profiling::ThreadIdSize == 8 )
Keith Davis5238aff2020-03-11 12:17:05 +0000304 {
305 uint64ThreadId = profiling::ReadUint64(uCharThreadId, 0);
306 }
307 delete[] uCharThreadId;
308
309 const uint64_t labelGuid = 66666u;
310 std::string labelName = "test_label";
311 std::string labelName2 = "test_label2";
312 std::string labelName3 = "test_label32";
313
314 const uint64_t relationshipGuid = 77777u;
315 const uint64_t headGuid = 888888u;
316 const uint64_t tailGuid = 999999u;
317
318 // Check with multiple messages in the same buffer
319 for ( int i = 0; i < 9; ++i )
320 {
321 // Send entity
322 sendTimelinePacket->SendTimelineEntityBinaryPacket(entityGuid);
323 // Send event class
Jim Flynn1892d212020-05-26 21:10:49 +0100324 sendTimelinePacket->SendTimelineEventClassBinaryPacket(eventClassGuid, eventClassNameGuid);
Keith Davis5238aff2020-03-11 12:17:05 +0000325 // Send event
326 sendTimelinePacket->SendTimelineEventBinaryPacket(timestamp, threadId, eventGuid);
327 // Send label
328 sendTimelinePacket->SendTimelineLabelBinaryPacket(labelGuid, labelName);
329 sendTimelinePacket->SendTimelineLabelBinaryPacket(labelGuid, labelName2);
330 sendTimelinePacket->SendTimelineLabelBinaryPacket(labelGuid, labelName3);
331 // Send relationship
332 profiling::ProfilingRelationshipType relationshipType = profiling::ProfilingRelationshipType::DataLink;
333 sendTimelinePacket->SendTimelineRelationshipBinaryPacket(relationshipType,
334 relationshipGuid,
335 headGuid,
Finn Williams0a336dc2020-05-11 15:39:58 +0100336 tailGuid,
337 0);
Keith Davis5238aff2020-03-11 12:17:05 +0000338 }
339
340 sendTimelinePacket->Commit();
341 SendTimelinePacketToCommandHandler(bufferManager.GetReadableBuffer()->GetReadableData(),
342 timelineCaptureCommandHandler);
343
344 for ( unsigned long i = 0; i < 9; ++i )
345 {
346 BOOST_CHECK(model.m_Entities[i].m_Guid == entityGuid);
347
348 BOOST_CHECK(model.m_EventClasses[i].m_Guid == eventClassGuid);
349
350 BOOST_CHECK(model.m_Labels[i].m_Guid == labelGuid);
351
352 BOOST_CHECK(model.m_Events[i].m_TimeStamp == timestamp);
353 BOOST_CHECK(model.m_Events[i].m_ThreadId == uint64ThreadId);
354 BOOST_CHECK(model.m_Events[i].m_Guid == eventGuid);
355
356 BOOST_CHECK(model.m_Relationships[i].m_RelationshipType == ITimelineDecoder::RelationshipType::DataLink);
357 BOOST_CHECK(model.m_Relationships[i].m_Guid == relationshipGuid);
358 BOOST_CHECK(model.m_Relationships[i].m_HeadGuid == headGuid);
359 BOOST_CHECK(model.m_Relationships[i].m_TailGuid == tailGuid);
360 }
361 for ( unsigned long i = 0; i < 9; i += 3 )
362 {
363 BOOST_CHECK(model.m_Labels[i].m_Name == labelName);
364 BOOST_CHECK(model.m_Labels[i+1].m_Name == labelName2);
365 BOOST_CHECK(model.m_Labels[i+2].m_Name == labelName3);
366 }
367}
368
Finn Williamse63a0262019-10-22 10:30:49 +0100369BOOST_AUTO_TEST_SUITE_END()