11 #include "gtest/gtest.h"
18 dst.reserve(src.size() + dst.size());
19 dst.insert(dst.end(), src.begin(), src.end());
25 retVal.push_back(
static_cast<uint8_t
>(n >> 24));
26 retVal.push_back(
static_cast<uint8_t
>(n >> 16));
27 retVal.push_back(
static_cast<uint8_t
>(n >> 8));
28 retVal.push_back(
static_cast<uint8_t
>(n));
34 auto blobLengthVector = uint32ToBEVector(
static_cast<std::uint32_t
>(blobVector.size() - 8u));
35 memcpy(&blobVector[4], &blobLengthVector[0], 4u);
38 const ByteBuffer kMagicBytes = {0x02, 0x02, 0x02, 0x02};
39 const ByteBuffer kProtocolVersion = {0x0, 0x1};
43 const ByteBuffer kXMLOffset = {0x0u, 0x0u, 0x0u, 0x1Cu};
45 const std::uint32_t kDataSetSize = 1302528u;
46 const std::string kXMLStr =
47 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><SickRecord xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
48 "xsi:noNamespaceSchemaLocation=\"SickRecord_schema.xsd\"><Revision>SICK V1.10 in "
49 "work</Revision><SchemaChecksum>01020304050607080910111213141516</SchemaChecksum><ChecksumFile>checksum.hex</"
50 "ChecksumFile><RecordDescription><Location>V3SXX5-1</Location><StartDateTime>2023-03-31T11:09:33+02:00</"
51 "StartDateTime><EndDateTime>2023-03-31T11:09:37+02:00</EndDateTime><UserName>default</UserName><RecordToolName>Sick "
53 "Recorder</RecordToolName><RecordToolVersion>v0.4</RecordToolVersion><ShortDescription></ShortDescription></"
54 "RecordDescription><DataSets><DataSetDepthMap id=\"1\" "
55 "datacount=\"1\"><DeviceDescription><Family>V3SXX5-1</Family><Ident>Visionary-T Mini CX V3S105-1x "
56 "2.0.0.457B</Ident><Version>3.0.0.2334</Version><SerialNumber>12345678</SerialNumber><LocationName>not "
57 "defined</LocationName><IPAddress>192.168.136.10</IPAddress></"
58 "DeviceDescription><FormatDescriptionDepthMap><TimestampUTC/><Version>uint16</"
59 "Version><DataStream><Interleaved>false</Interleaved><Width>512</Width><Height>424</"
60 "Height><CameraToWorldTransform><value>1.000000</value><value>0.000000</value><value>0.000000</"
61 "value><value>0.000000</value><value>0.000000</value><value>1.000000</value><value>0.000000</value><value>0.000000</"
62 "value><value>0.000000</value><value>0.000000</value><value>1.000000</value><value>-10.000000</"
63 "value><value>0.000000</value><value>0.000000</value><value>0.000000</value><value>1.000000</value></"
64 "CameraToWorldTransform><CameraMatrix><FX>-366.964999</FX><FY>-367.057999</FY><CX>252.118999</CX><CY>205.213999</"
65 "CY></CameraMatrix><CameraDistortionParams><K1>-0.076050</K1><K2>0.217518</K2><P1>0.000000</P1><P2>0.000000</"
66 "P2><K3>0.000000</K3></CameraDistortionParams><FrameNumber>uint32</FrameNumber><Quality>uint8</"
67 "Quality><Status>uint8</Status><PixelSize><X>1.000000</X><Y>1.000000</Y><Z>0.250000</Z></PixelSize><Distance "
68 "decimalexponent=\"0\" min=\"1\" max=\"16384\">uint16</Distance><Intensity decimalexponent=\"0\" min=\"1\" "
69 "max=\"20000\">uint16</Intensity><Confidence decimalexponent=\"0\" min=\"0\" "
70 "max=\"65535\">uint16</Confidence></DataStream><DeviceInfo><Status>OK</Status></DeviceInfo></"
71 "FormatDescriptionDepthMap><DataLink><FileName>data.bin</FileName><Checksum>01020304050607080910111213141516</"
72 "Checksum></DataLink><OverlayLink><FileName>overlay.xml</FileName></OverlayLink></DataSetDepthMap></DataSets></"
74 const ByteBuffer kXMLVec(kXMLStr.begin(), kXMLStr.end());
80 TEST(VisionaryTMiniDataTest, InvalidMagicBytes)
84 buffer.insert(buffer.end(), 5000, 0);
89 dataStream.
open(pTransport);
91 ASSERT_FALSE(dataStream.getNextFrame());
95 TEST(VisionaryTMiniDataTest, MissingHeader)
100 dataStream.
open(pTransport);
102 ASSERT_FALSE(dataStream.getNextFrame());
106 TEST(VisionaryTMiniDataTest, WrongHeader)
111 appendToVector(
length, buffer);
117 dataStream.
open(pTransport);
119 EXPECT_FALSE(dataStream.getNextFrame());
124 buffer = kMagicBytes;
125 length = {0x0, 0x0, 0x0, 0x3};
126 appendToVector(
length, buffer);
127 appendToVector(wrongProtocol, buffer);
128 appendToVector(kPackageType, buffer);
133 dataStream.
open(pTransport);
135 EXPECT_FALSE(dataStream.getNextFrame());
140 buffer = kMagicBytes;
141 length = {0x0, 0x0, 0x0, 0x3};
142 appendToVector(
length, buffer);
143 appendToVector(kProtocolVersion, buffer);
144 buffer.push_back(0x61);
149 dataStream.
open(pTransport);
151 EXPECT_FALSE(dataStream.getNextFrame());
156 TEST(VisionaryTMiniDataTest, NoDataHandler)
160 appendToVector(
length, buffer);
161 appendToVector(kProtocolVersion, buffer);
162 appendToVector(kPackageType, buffer);
164 buffer.insert(buffer.end(), 65536u + 3u, 0u);
170 dataStream.open(pTransport);
171 EXPECT_FALSE(dataStream.getNextFrame());
175 TEST(VisionaryTMiniDataTest, InvalidBlobData)
179 appendToVector(
length, buffer);
180 appendToVector(kProtocolVersion, buffer);
181 appendToVector(kPackageType, buffer);
184 buffer.insert(buffer.end(), 65536u + 3u, 0u);
190 dataStream.
open(pTransport);
191 EXPECT_FALSE(dataStream.getNextFrame());
195 appendToVector(kBlobId, buffer);
196 appendToVector(kNumSegements, buffer);
197 appendToVector(kXMLOffset, buffer);
198 buffer.insert(buffer.end(), 3u, 0x0u);
199 buffer.push_back(0x1u);
200 std::uint32_t binaryOffset =
static_cast<std::uint32_t
>(kXMLVec.size() + 28u);
201 const auto binaryOffsetVec = uint32ToBEVector(binaryOffset);
202 appendToVector(binaryOffsetVec, buffer);
203 buffer.insert(buffer.end(), 4u, 0x0u);
204 const auto footerOffsetVec = uint32ToBEVector(binaryOffset + kDataSetSize + 4u + 8u + 2u + 6u + 8u);
205 appendToVector(footerOffsetVec, buffer);
206 buffer.insert(buffer.end(), 4u, 0x0u);
207 appendToVector(kXMLVec, buffer);
208 const auto bufferWithXMLBase = buffer;
209 buffer.erase(buffer.end() - 10, buffer.end());
210 setBlobLength(buffer);
216 dataStream.
open(pTransport);
217 EXPECT_FALSE(dataStream.getNextFrame());
222 buffer = bufferWithXMLBase;
223 ByteBuffer binLengthVec = uint32ToBEVector(kDataSetSize);
224 std::reverse(binLengthVec.begin(), binLengthVec.end());
225 appendToVector(binLengthVec, buffer);
226 buffer.insert(buffer.end(), 8u, 0x0u);
227 appendToVector(kBlobVersion, buffer);
228 buffer.insert(buffer.end(), 6u, 0x0u);
229 buffer.insert(buffer.end(), kDataSetSize, 0x0u);
230 setBlobLength(buffer);
236 dataStream.
open(pTransport);
237 EXPECT_FALSE(dataStream.getNextFrame());
243 TEST(VisionaryTMiniDataTest, ValidBlobData)
247 appendToVector(
length, buffer);
248 appendToVector(kProtocolVersion, buffer);
249 appendToVector(kPackageType, buffer);
250 appendToVector(kBlobId, buffer);
251 appendToVector(kNumSegements, buffer);
252 appendToVector(kXMLOffset, buffer);
253 buffer.insert(buffer.end(), 3u, 0x0u);
254 buffer.push_back(0x1u);
255 std::uint32_t binaryOffset =
static_cast<std::uint32_t
>(kXMLVec.size() + 28u);
256 const auto binaryOffsetVec = uint32ToBEVector(binaryOffset);
257 appendToVector(binaryOffsetVec, buffer);
258 buffer.insert(buffer.end(), 4u, 0x0u);
259 const auto footerOffsetVec = uint32ToBEVector(binaryOffset + kDataSetSize + 4u + 8u + 2u + 6u + 8u);
260 appendToVector(footerOffsetVec, buffer);
261 buffer.insert(buffer.end(), 4u, 0x0u);
262 appendToVector(kXMLVec, buffer);
263 ByteBuffer binLengthVec = uint32ToBEVector(kDataSetSize);
264 std::reverse(binLengthVec.begin(), binLengthVec.end());
265 appendToVector(binLengthVec, buffer);
266 buffer.insert(buffer.end(), 8u, 0x0u);
267 appendToVector(kBlobVersion, buffer);
268 buffer.insert(buffer.end(), 6u, 0x0u);
269 buffer.insert(buffer.end(), kDataSetSize, 0x0u);
270 buffer.insert(buffer.end(), 4u, 0x0u);
271 appendToVector(binLengthVec, buffer);
272 setBlobLength(buffer);
277 dataStream.
open(pTransport);
278 EXPECT_TRUE(dataStream.getNextFrame());