1 | #include <QtTest> |
2 | #include <limits> |
3 | #include <cbor.h> |
4 | |
5 | Q_DECLARE_METATYPE(CborError) |
6 | |
7 | template <size_t N> QByteArray raw(const char (&data)[N]) |
8 | { |
9 | return QByteArray::fromRawData(data, size: N - 1); |
10 | } |
11 | |
12 | void addIntegers() |
13 | { |
14 | QTest::addColumn<QByteArray>(name: "data" ); |
15 | QTest::addColumn<quint64>(name: "expectedRaw" ); |
16 | QTest::addColumn<qint64>(name: "expectedValue" ); |
17 | QTest::addColumn<bool>(name: "isNegative" ); |
18 | QTest::addColumn<bool>(name: "inInt64Range" ); |
19 | |
20 | // unsigned integers |
21 | QTest::newRow(dataTag: "0" ) << raw(data: "\x00" ) << Q_UINT64_C(0) << Q_INT64_C(0) << false << true; |
22 | QTest::newRow(dataTag: "1" ) << raw(data: "\x01" ) << Q_UINT64_C(1) << Q_INT64_C(1) << false << true; |
23 | QTest::newRow(dataTag: "10" ) << raw(data: "\x0a" ) << Q_UINT64_C(10) << Q_INT64_C(10) << false << true; |
24 | QTest::newRow(dataTag: "23" ) << raw(data: "\x17" ) << Q_UINT64_C(23) << Q_INT64_C(23) << false << true; |
25 | QTest::newRow(dataTag: "24" ) << raw(data: "\x18\x18" ) << Q_UINT64_C(24) << Q_INT64_C(24) << false << true; |
26 | QTest::newRow(dataTag: "UINT8_MAX" ) << raw(data: "\x18\xff" ) << Q_UINT64_C(255) << Q_INT64_C(255) << false << true; |
27 | QTest::newRow(dataTag: "UINT8_MAX+1" ) << raw(data: "\x19\x01\x00" ) << Q_UINT64_C(256) << Q_INT64_C(256) << false << true; |
28 | QTest::newRow(dataTag: "UINT16_MAX" ) << raw(data: "\x19\xff\xff" ) << Q_UINT64_C(65535) << Q_INT64_C(65535) << false << true; |
29 | QTest::newRow(dataTag: "UINT16_MAX+1" ) << raw(data: "\x1a\0\1\x00\x00" ) << Q_UINT64_C(65536) << Q_INT64_C(65536) << false << true; |
30 | QTest::newRow(dataTag: "UINT32_MAX" ) << raw(data: "\x1a\xff\xff\xff\xff" ) << Q_UINT64_C(4294967295) << Q_INT64_C(4294967295) << false << true; |
31 | QTest::newRow(dataTag: "UINT32_MAX+1" ) << raw(data: "\x1b\0\0\0\1\0\0\0\0" ) << Q_UINT64_C(4294967296) << Q_INT64_C(4294967296) << false << true; |
32 | QTest::newRow(dataTag: "INT64_MAX" ) << raw(data: "\x1b" "\x7f\xff\xff\xff" "\xff\xff\xff\xff" ) |
33 | << quint64(std::numeric_limits<qint64>::max()) |
34 | << std::numeric_limits<qint64>::max() << false << true; |
35 | QTest::newRow(dataTag: "UINT64_MAX" ) << raw(data: "\x1b" "\xff\xff\xff\xff" "\xff\xff\xff\xff" ) |
36 | << std::numeric_limits<quint64>::max() << qint64(-123456) << false << false; |
37 | |
38 | // negative integers |
39 | QTest::newRow(dataTag: "-1" ) << raw(data: "\x20" ) << Q_UINT64_C(0) << Q_INT64_C(-1) << true << true; |
40 | QTest::newRow(dataTag: "-2" ) << raw(data: "\x21" ) << Q_UINT64_C(1) << Q_INT64_C(-2) << true << true; |
41 | QTest::newRow(dataTag: "-24" ) << raw(data: "\x37" ) << Q_UINT64_C(23) << Q_INT64_C(-24) << true << true; |
42 | QTest::newRow(dataTag: "-25" ) << raw(data: "\x38\x18" ) << Q_UINT64_C(24) << Q_INT64_C(-25) << true << true; |
43 | QTest::newRow(dataTag: "-UINT8_MAX" ) << raw(data: "\x38\xff" ) << Q_UINT64_C(255) << Q_INT64_C(-256) << true << true; |
44 | QTest::newRow(dataTag: "-UINT8_MAX-1" ) << raw(data: "\x39\x01\x00" ) << Q_UINT64_C(256) << Q_INT64_C(-257) << true << true; |
45 | QTest::newRow(dataTag: "-UINT16_MAX" ) << raw(data: "\x39\xff\xff" ) << Q_UINT64_C(65535) << Q_INT64_C(-65536) << true << true; |
46 | QTest::newRow(dataTag: "-UINT16_MAX-1" ) << raw(data: "\x3a\0\1\x00\x00" ) << Q_UINT64_C(65536) << Q_INT64_C(-65537) << true << true; |
47 | QTest::newRow(dataTag: "-UINT32_MAX" ) << raw(data: "\x3a\xff\xff\xff\xff" ) << Q_UINT64_C(4294967295) << Q_INT64_C(-4294967296) << true << true; |
48 | QTest::newRow(dataTag: "-UINT32_MAX-1" ) << raw(data: "\x3b\0\0\0\1\0\0\0\0" ) << Q_UINT64_C(4294967296) << Q_INT64_C(-4294967297) << true << true; |
49 | QTest::newRow(dataTag: "INT64_MIN+1" ) << raw(data: "\x3b\x7f\xff\xff\xff" "\xff\xff\xff\xfe" ) |
50 | << quint64(std::numeric_limits<qint64>::max() - 1) |
51 | << (std::numeric_limits<qint64>::min() + 1) |
52 | << true << true; |
53 | QTest::newRow(dataTag: "INT64_MIN" ) << raw(data: "\x3b\x7f\xff\xff\xff" "\xff\xff\xff\xff" ) |
54 | << quint64(std::numeric_limits<qint64>::max()) |
55 | << std::numeric_limits<qint64>::min() |
56 | << true << true; |
57 | QTest::newRow(dataTag: "INT64_MIN-1" ) << raw(data: "\x3b\x80\0\0\0" "\0\0\0\0" ) << Q_UINT64_C(9223372036854775808) << qint64(-123456) << true << false; |
58 | QTest::newRow(dataTag: "-UINT64_MAX" ) << raw(data: "\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xfe" ) |
59 | << (std::numeric_limits<quint64>::max() - 1) << qint64(-123456) << true << false; |
60 | QTest::newRow(dataTag: "-UINT64_MAX+1" ) << raw(data: "\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xff" ) |
61 | << std::numeric_limits<quint64>::max() << qint64(-123456) << true << false; |
62 | } |
63 | |
64 | void addColumns() |
65 | { |
66 | QTest::addColumn<QByteArray>(name: "data" ); |
67 | QTest::addColumn<QString>(name: "expected" ); |
68 | QTest::addColumn<int>(name: "n" ); // some aux integer, not added in all columns |
69 | } |
70 | |
71 | void addFixedData() |
72 | { |
73 | // unsigned integers |
74 | QTest::newRow(dataTag: "0" ) << raw(data: "\x00" ) << "0" ; |
75 | QTest::newRow(dataTag: "1" ) << raw(data: "\x01" ) << "1" ; |
76 | QTest::newRow(dataTag: "10" ) << raw(data: "\x0a" ) << "10" ; |
77 | QTest::newRow(dataTag: "23" ) << raw(data: "\x17" ) << "23" ; |
78 | QTest::newRow(dataTag: "24" ) << raw(data: "\x18\x18" ) << "24" ; |
79 | QTest::newRow(dataTag: "UINT8_MAX" ) << raw(data: "\x18\xff" ) << "255" ; |
80 | QTest::newRow(dataTag: "UINT8_MAX+1" ) << raw(data: "\x19\x01\x00" ) << "256" ; |
81 | QTest::newRow(dataTag: "UINT16_MAX" ) << raw(data: "\x19\xff\xff" ) << "65535" ; |
82 | QTest::newRow(dataTag: "UINT16_MAX+1" ) << raw(data: "\x1a\0\1\x00\x00" ) << "65536" ; |
83 | QTest::newRow(dataTag: "UINT32_MAX" ) << raw(data: "\x1a\xff\xff\xff\xff" ) << "4294967295" ; |
84 | QTest::newRow(dataTag: "UINT32_MAX+1" ) << raw(data: "\x1b\0\0\0\1\0\0\0\0" ) << "4294967296" ; |
85 | QTest::newRow(dataTag: "UINT64_MAX" ) << raw(data: "\x1b" "\xff\xff\xff\xff" "\xff\xff\xff\xff" ) |
86 | << QString::number(std::numeric_limits<uint64_t>::max()); |
87 | |
88 | // negative integers |
89 | QTest::newRow(dataTag: "-1" ) << raw(data: "\x20" ) << "-1" ; |
90 | QTest::newRow(dataTag: "-2" ) << raw(data: "\x21" ) << "-2" ; |
91 | QTest::newRow(dataTag: "-24" ) << raw(data: "\x37" ) << "-24" ; |
92 | QTest::newRow(dataTag: "-25" ) << raw(data: "\x38\x18" ) << "-25" ; |
93 | QTest::newRow(dataTag: "-UINT8_MAX" ) << raw(data: "\x38\xff" ) << "-256" ; |
94 | QTest::newRow(dataTag: "-UINT8_MAX-1" ) << raw(data: "\x39\x01\x00" ) << "-257" ; |
95 | QTest::newRow(dataTag: "-UINT16_MAX" ) << raw(data: "\x39\xff\xff" ) << "-65536" ; |
96 | QTest::newRow(dataTag: "-UINT16_MAX-1" ) << raw(data: "\x3a\0\1\x00\x00" ) << "-65537" ; |
97 | QTest::newRow(dataTag: "-UINT32_MAX" ) << raw(data: "\x3a\xff\xff\xff\xff" ) << "-4294967296" ; |
98 | QTest::newRow(dataTag: "-UINT32_MAX-1" ) << raw(data: "\x3b\0\0\0\1\0\0\0\0" ) << "-4294967297" ; |
99 | QTest::newRow(dataTag: "INT64_MIN+1" ) << raw(data: "\x3b\x7f\xff\xff\xff" "\xff\xff\xff\xfe" ) |
100 | << QString::number(std::numeric_limits<int64_t>::min() + 1); |
101 | QTest::newRow(dataTag: "INT64_MIN" ) << raw(data: "\x3b\x7f\xff\xff\xff" "\xff\xff\xff\xff" ) |
102 | << QString::number(std::numeric_limits<int64_t>::min()); |
103 | QTest::newRow(dataTag: "INT64_MIN-1" ) << raw(data: "\x3b\x80\0\0\0" "\0\0\0\0" ) << "-9223372036854775809" ; |
104 | QTest::newRow(dataTag: "-UINT64_MAX" ) << raw(data: "\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xfe" ) |
105 | << '-' + QString::number(std::numeric_limits<uint64_t>::max()); |
106 | QTest::newRow(dataTag: "-UINT64_MAX+1" ) << raw(data: "\x3b" "\xff\xff\xff\xff" "\xff\xff\xff\xff" ) |
107 | << "-18446744073709551616" ; |
108 | |
109 | // overlongs |
110 | QTest::newRow(dataTag: "0*1" ) << raw(data: "\x18\x00" ) << "0_0" ; |
111 | QTest::newRow(dataTag: "0*2" ) << raw(data: "\x19\x00\x00" ) << "0_1" ; |
112 | QTest::newRow(dataTag: "0*4" ) << raw(data: "\x1a\0\0\0\0" ) << "0_2" ; |
113 | QTest::newRow(dataTag: "0*8" ) << raw(data: "\x1b\0\0\0\0\0\0\0\0" ) << "0_3" ; |
114 | QTest::newRow(dataTag: "-1*1" ) << raw(data: "\x38\x00" ) << "-1_0" ; |
115 | QTest::newRow(dataTag: "-1*2" ) << raw(data: "\x39\x00\x00" ) << "-1_1" ; |
116 | QTest::newRow(dataTag: "-1*4" ) << raw(data: "\x3a\0\0\0\0" ) << "-1_2" ; |
117 | QTest::newRow(dataTag: "-1*8" ) << raw(data: "\x3b\0\0\0\0\0\0\0\0" ) << "-1_3" ; |
118 | |
119 | QTest::newRow(dataTag: "simple0" ) << raw(data: "\xe0" ) << "simple(0)" ; |
120 | QTest::newRow(dataTag: "simple19" ) << raw(data: "\xf3" ) << "simple(19)" ; |
121 | QTest::newRow(dataTag: "false" ) << raw(data: "\xf4" ) << "false" ; |
122 | QTest::newRow(dataTag: "true" ) << raw(data: "\xf5" ) << "true" ; |
123 | QTest::newRow(dataTag: "null" ) << raw(data: "\xf6" ) << "null" ; |
124 | QTest::newRow(dataTag: "undefined" ) << raw(data: "\xf7" ) << "undefined" ; |
125 | QTest::newRow(dataTag: "simple32" ) << raw(data: "\xf8\x20" ) << "simple(32)" ; |
126 | QTest::newRow(dataTag: "simple255" ) << raw(data: "\xf8\xff" ) << "simple(255)" ; |
127 | |
128 | // floating point |
129 | |
130 | QTest::newRow(dataTag: "0.f16" ) << raw(data: "\xf9\0\0" ) << "0.f16" ; |
131 | QTest::newRow(dataTag: "0.f" ) << raw(data: "\xfa\0\0\0\0" ) << "0.f" ; |
132 | QTest::newRow(dataTag: "0." ) << raw(data: "\xfb\0\0\0\0\0\0\0\0" ) << "0." ; |
133 | QTest::newRow(dataTag: "-1.f16" ) << raw(data: "\xf9\xbc\x00" ) << "-1.f16" ; |
134 | QTest::newRow(dataTag: "-1.f" ) << raw(data: "\xfa\xbf\x80\0\0" ) << "-1.f" ; |
135 | QTest::newRow(dataTag: "-1." ) << raw(data: "\xfb\xbf\xf0\0\0\0\0\0\0" ) << "-1." ; |
136 | QTest::newRow(dataTag: "65504.f16" ) << raw(data: "\xf9\x7b\xff" ) << "65504.f16" ; |
137 | QTest::newRow(dataTag: "16777215.f" ) << raw(data: "\xfa\x4b\x7f\xff\xff" ) << "16777215.f" ; |
138 | QTest::newRow(dataTag: "16777215." ) << raw(data: "\xfb\x41\x6f\xff\xff\xe0\0\0\0" ) << "16777215." ; |
139 | QTest::newRow(dataTag: "-16777215.f" ) << raw(data: "\xfa\xcb\x7f\xff\xff" ) << "-16777215.f" ; |
140 | QTest::newRow(dataTag: "-16777215." ) << raw(data: "\xfb\xc1\x6f\xff\xff\xe0\0\0\0" ) << "-16777215." ; |
141 | |
142 | QTest::newRow(dataTag: "0.5f16" ) << raw(data: "\xf9\x38\0" ) << "0.5f16" ; |
143 | QTest::newRow(dataTag: "0.5f" ) << raw(data: "\xfa\x3f\0\0\0" ) << "0.5f" ; |
144 | QTest::newRow(dataTag: "0.5" ) << raw(data: "\xfb\x3f\xe0\0\0\0\0\0\0" ) << "0.5" ; |
145 | QTest::newRow(dataTag: "2.f16^11-1" ) << raw(data: "\xf9\x67\xff" ) << "2047.f16" ; |
146 | QTest::newRow(dataTag: "2.f^24-1" ) << raw(data: "\xfa\x4b\x7f\xff\xff" ) << "16777215.f" ; |
147 | QTest::newRow(dataTag: "2.^53-1" ) << raw(data: "\xfb\x43\x3f\xff\xff" "\xff\xff\xff\xff" ) << "9007199254740991." ; |
148 | QTest::newRow(dataTag: "2.f^64-epsilon" ) << raw(data: "\xfa\x5f\x7f\xff\xff" ) << "18446742974197923840.f" ; |
149 | QTest::newRow(dataTag: "2.^64-epsilon" ) << raw(data: "\xfb\x43\xef\xff\xff" "\xff\xff\xff\xff" ) << "18446744073709549568." ; |
150 | QTest::newRow(dataTag: "2.f^64" ) << raw(data: "\xfa\x5f\x80\0\0" ) << "1.8446744073709552e+19f" ; |
151 | QTest::newRow(dataTag: "2.^64" ) << raw(data: "\xfb\x43\xf0\0\0\0\0\0\0" ) << "1.8446744073709552e+19" ; |
152 | |
153 | QTest::newRow(dataTag: "nan_f16" ) << raw(data: "\xf9\x7e\x00" ) << "nan" ; |
154 | QTest::newRow(dataTag: "nan_f" ) << raw(data: "\xfa\x7f\xc0\0\0" ) << "nan" ; |
155 | QTest::newRow(dataTag: "nan" ) << raw(data: "\xfb\x7f\xf8\0\0\0\0\0\0" ) << "nan" ; |
156 | QTest::newRow(dataTag: "-inf_f16" ) << raw(data: "\xf9\xfc\x00" ) << "-inf" ; |
157 | QTest::newRow(dataTag: "-inf_f" ) << raw(data: "\xfa\xff\x80\0\0" ) << "-inf" ; |
158 | QTest::newRow(dataTag: "-inf" ) << raw(data: "\xfb\xff\xf0\0\0\0\0\0\0" ) << "-inf" ; |
159 | QTest::newRow(dataTag: "+inf_f16" ) << raw(data: "\xf9\x7c\x00" ) << "inf" ; |
160 | QTest::newRow(dataTag: "+inf_f" ) << raw(data: "\xfa\x7f\x80\0\0" ) << "inf" ; |
161 | QTest::newRow(dataTag: "+inf" ) << raw(data: "\xfb\x7f\xf0\0\0\0\0\0\0" ) << "inf" ; |
162 | |
163 | } |
164 | |
165 | void addNonChunkedStringsData() |
166 | { |
167 | // byte strings |
168 | QTest::newRow(dataTag: "emptybytestring" ) << raw(data: "\x40" ) << "h''" ; |
169 | QTest::newRow(dataTag: "bytestring1" ) << raw(data: "\x41 " ) << "h'20'" ; |
170 | QTest::newRow(dataTag: "bytestring1-nul" ) << raw(data: "\x41\0" ) << "h'00'" ; |
171 | QTest::newRow(dataTag: "bytestring5" ) << raw(data: "\x45Hello" ) << "h'48656c6c6f'" ; |
172 | QTest::newRow(dataTag: "bytestring24" ) << raw(data: "\x58\x18" "123456789012345678901234" ) |
173 | << "h'313233343536373839303132333435363738393031323334'" ; |
174 | QTest::newRow(dataTag: "bytestring256" ) << raw(data: "\x59\1\0" ) + QByteArray(256, '3') |
175 | << "h'" + QString(256 * 2, '3') + '\''; |
176 | |
177 | // text strings |
178 | QTest::newRow(dataTag: "emptytextstring" ) << raw(data: "\x60" ) << "\"\"" ; |
179 | QTest::newRow(dataTag: "textstring1" ) << raw(data: "\x61 " ) << "\" \"" ; |
180 | QTest::newRow(dataTag: "textstring1-nul" ) << raw(data: "\x61\0" ) << "\"\\u0000\"" ; |
181 | QTest::newRow(dataTag: "textstring5" ) << raw(data: "\x65Hello" ) << "\"Hello\"" ; |
182 | QTest::newRow(dataTag: "textstring24" ) << raw(data: "\x78\x18" "123456789012345678901234" ) |
183 | << "\"123456789012345678901234\"" ; |
184 | QTest::newRow(dataTag: "textstring256" ) << raw(data: "\x79\1\0" ) + QByteArray(256, '3') |
185 | << '"' + QString(256, '3') + '"'; |
186 | |
187 | // some strings with UTF-8 content |
188 | // we had a bug in the pretty dumper - see issue #54 |
189 | QTest::newRow(dataTag: "textstringutf8-2char" ) << raw(data: "\x62\xc2\xa0" ) << "\"\\u00A0\"" ; |
190 | QTest::newRow(dataTag: "textstringutf8-2char2" ) << raw(data: "\x64\xc2\xa0\xc2\xa9" ) << "\"\\u00A0\\u00A9\"" ; |
191 | QTest::newRow(dataTag: "textstringutf8-3char" ) << raw(data: "\x63\xe2\x88\x80" ) << "\"\\u2200\"" ; |
192 | QTest::newRow(dataTag: "textstringutf8-4char" ) << raw(data: "\x64\xf0\x90\x88\x83" ) << "\"\\uD800\\uDE03\"" ; |
193 | |
194 | // strings with overlong length |
195 | QTest::newRow(dataTag: "emptybytestring*1" ) << raw(data: "\x58\x00" ) << "h''_0" ; |
196 | QTest::newRow(dataTag: "emptytextstring*1" ) << raw(data: "\x78\x00" ) << "\"\"_0" ; |
197 | QTest::newRow(dataTag: "emptybytestring*2" ) << raw(data: "\x59\x00\x00" ) << "h''_1" ; |
198 | QTest::newRow(dataTag: "emptytextstring*2" ) << raw(data: "\x79\x00\x00" ) << "\"\"_1" ; |
199 | QTest::newRow(dataTag: "emptybytestring*4" ) << raw(data: "\x5a\0\0\0\0" ) << "h''_2" ; |
200 | QTest::newRow(dataTag: "emptytextstring*4" ) << raw(data: "\x7a\0\0\0\0" ) << "\"\"_2" ; |
201 | QTest::newRow(dataTag: "emptybytestring*8" ) << raw(data: "\x5b\0\0\0\0\0\0\0\0" ) << "h''_3" ; |
202 | QTest::newRow(dataTag: "emptytextstring*8" ) << raw(data: "\x7b\0\0\0\0\0\0\0\0" ) << "\"\"_3" ; |
203 | QTest::newRow(dataTag: "bytestring5*1" ) << raw(data: "\x58\x05Hello" ) << "h'48656c6c6f'_0" ; |
204 | QTest::newRow(dataTag: "textstring5*1" ) << raw(data: "\x78\x05Hello" ) << "\"Hello\"_0" ; |
205 | QTest::newRow(dataTag: "bytestring5*2" ) << raw(data: "\x59\0\5Hello" ) << "h'48656c6c6f'_1" ; |
206 | QTest::newRow(dataTag: "textstring5*2" ) << raw(data: "\x79\0\x05Hello" ) << "\"Hello\"_1" ; |
207 | QTest::newRow(dataTag: "bytestring5*4" ) << raw(data: "\x5a\0\0\0\5Hello" ) << "h'48656c6c6f'_2" ; |
208 | QTest::newRow(dataTag: "textstring5*4" ) << raw(data: "\x7a\0\0\0\x05Hello" ) << "\"Hello\"_2" ; |
209 | QTest::newRow(dataTag: "bytestring5*8" ) << raw(data: "\x5b\0\0\0\0\0\0\0\5Hello" ) << "h'48656c6c6f'_3" ; |
210 | QTest::newRow(dataTag: "textstring5*8" ) << raw(data: "\x7b\0\0\0\0\0\0\0\x05Hello" ) << "\"Hello\"_3" ; |
211 | |
212 | } |
213 | |
214 | void addStringsData() |
215 | { |
216 | addNonChunkedStringsData(); |
217 | |
218 | // strings with undefined length |
219 | QTest::newRow(dataTag: "_emptybytestring" ) << raw(data: "\x5f\xff" ) << "(_ )" ; |
220 | QTest::newRow(dataTag: "_emptytextstring" ) << raw(data: "\x7f\xff" ) << "(_ )" ; |
221 | QTest::newRow(dataTag: "_emptybytestring2" ) << raw(data: "\x5f\x40\xff" ) << "(_ h'')" ; |
222 | QTest::newRow(dataTag: "_emptytextstring2" ) << raw(data: "\x7f\x60\xff" ) << "(_ \"\")" ; |
223 | QTest::newRow(dataTag: "_emptybytestring2*1" ) << raw(data: "\x5f\x58\x00\xff" ) << "(_ h''_0)" ; |
224 | QTest::newRow(dataTag: "_emptytextstring2*1" ) << raw(data: "\x7f\x78\x00\xff" ) << "(_ \"\"_0)" ; |
225 | QTest::newRow(dataTag: "_emptybytestring3" ) << raw(data: "\x5f\x40\x40\xff" ) << "(_ h'', h'')" ; |
226 | QTest::newRow(dataTag: "_emptytextstring3" ) << raw(data: "\x7f\x60\x60\xff" ) << "(_ \"\", \"\")" ; |
227 | QTest::newRow(dataTag: "_emptybytestring3*2" ) << raw(data: "\x5f\x59\x00\x00\x40\xff" ) << "(_ h''_1, h'')" ; |
228 | QTest::newRow(dataTag: "_emptytextstring3*2" ) << raw(data: "\x7f\x79\x00\x00\x60\xff" ) << "(_ \"\"_1, \"\")" ; |
229 | QTest::newRow(dataTag: "_bytestring5x2" ) << raw(data: "\x5f\x43Hel\x42lo\xff" ) << "(_ h'48656c', h'6c6f')" ; |
230 | QTest::newRow(dataTag: "_textstring5x2" ) << raw(data: "\x7f\x63Hel\x62lo\xff" ) << "(_ \"Hel\", \"lo\")" ; |
231 | QTest::newRow(dataTag: "_bytestring5x2*8*4" ) << raw(data: "\x5f\x5b\0\0\0\0\0\0\0\3Hel\x5a\0\0\0\2lo\xff" ) << "(_ h'48656c'_3, h'6c6f'_2)" ; |
232 | QTest::newRow(dataTag: "_textstring5x2*8*4" ) << raw(data: "\x7f\x7b\0\0\0\0\0\0\0\3Hel\x7a\0\0\0\2lo\xff" ) << "(_ \"Hel\"_3, \"lo\"_2)" ; |
233 | QTest::newRow(dataTag: "_bytestring5x5" ) << raw(data: "\x5f\x41H\x41" "e\x41l\x41l\x41o\xff" ) << "(_ h'48', h'65', h'6c', h'6c', h'6f')" ; |
234 | QTest::newRow(dataTag: "_textstring5x5" ) << raw(data: "\x7f\x61H\x61" "e\x61l\x61l\x61o\xff" ) << "(_ \"H\", \"e\", \"l\", \"l\", \"o\")" ; |
235 | QTest::newRow(dataTag: "_bytestring5x6" ) << raw(data: "\x5f\x41H\x41" "e\x40\x41l\x41l\x41o\xff" ) << "(_ h'48', h'65', h'', h'6c', h'6c', h'6f')" ; |
236 | QTest::newRow(dataTag: "_textstring5x6" ) << raw(data: "\x7f\x61H\x61" "e\x61l\x60\x61l\x61o\xff" ) << "(_ \"H\", \"e\", \"l\", \"\", \"l\", \"o\")" ; |
237 | } |
238 | |
239 | void addTagsData() |
240 | { |
241 | // since parseOne() works recursively for tags, we can't test lone tags |
242 | QTest::newRow(dataTag: "tag0" ) << raw(data: "\xc0\x00" ) << "0(0)" ; |
243 | QTest::newRow(dataTag: "tag1" ) << raw(data: "\xc1\x00" ) << "1(0)" ; |
244 | QTest::newRow(dataTag: "tag24" ) << raw(data: "\xd8\x18\x00" ) << "24(0)" ; |
245 | QTest::newRow(dataTag: "tag255" ) << raw(data: "\xd8\xff\x00" ) << "255(0)" ; |
246 | QTest::newRow(dataTag: "tag256" ) << raw(data: "\xd9\1\0\x00" ) << "256(0)" ; |
247 | QTest::newRow(dataTag: "tag65535" ) << raw(data: "\xd9\xff\xff\x00" ) << "65535(0)" ; |
248 | QTest::newRow(dataTag: "tag65536" ) << raw(data: "\xda\0\1\0\0\x00" ) << "65536(0)" ; |
249 | QTest::newRow(dataTag: "tagUINT32_MAX-1" ) << raw(data: "\xda\xff\xff\xff\xff\x00" ) << "4294967295(0)" ; |
250 | QTest::newRow(dataTag: "tagUINT32_MAX" ) << raw(data: "\xdb\0\0\0\1\0\0\0\0\x00" ) << "4294967296(0)" ; |
251 | QTest::newRow(dataTag: "tagUINT64_MAX" ) << raw(data: "\xdb" "\xff\xff\xff\xff" "\xff\xff\xff\xff" "\x00" ) |
252 | << QString::number(std::numeric_limits<uint64_t>::max()) + "(0)" ; |
253 | |
254 | // overlong tags |
255 | QTest::newRow(dataTag: "tag0*1" ) << raw(data: "\xd8\0\x00" ) << "0_0(0)" ; |
256 | QTest::newRow(dataTag: "tag0*2" ) << raw(data: "\xd9\0\0\x00" ) << "0_1(0)" ; |
257 | QTest::newRow(dataTag: "tag0*4" ) << raw(data: "\xda\0\0\0\0\x00" ) << "0_2(0)" ; |
258 | QTest::newRow(dataTag: "tag0*8" ) << raw(data: "\xdb\0\0\0\0\0\0\0\0\x00" ) << "0_3(0)" ; |
259 | |
260 | // tag other things |
261 | QTest::newRow(dataTag: "unixtime" ) << raw(data: "\xc1\x1a\x55\x4b\xbf\xd3" ) << "1(1431027667)" ; |
262 | QTest::newRow(dataTag: "rfc3339date" ) << raw(data: "\xc0\x78\x19" "2015-05-07 12:41:07-07:00" ) |
263 | << "0(\"2015-05-07 12:41:07-07:00\")" ; |
264 | QTest::newRow(dataTag: "tag6+false" ) << raw(data: "\xc6\xf4" ) << "6(false)" ; |
265 | QTest::newRow(dataTag: "tag25+true" ) << raw(data: "\xd8\x19\xf5" ) << "25(true)" ; |
266 | QTest::newRow(dataTag: "tag256+null" ) << raw(data: "\xd9\1\0\xf6" ) << "256(null)" ; |
267 | QTest::newRow(dataTag: "tag65536+simple32" ) << raw(data: "\xda\0\1\0\0\xf8\x20" ) << "65536(simple(32))" ; |
268 | QTest::newRow(dataTag: "float+unixtime" ) << raw(data: "\xc1\xfa\x4e\xaa\x97\x80" ) << "1(1431027712.f)" ; |
269 | QTest::newRow(dataTag: "double+unixtime" ) << raw(data: "\xc1\xfb" "\x41\xd5\x52\xef" "\xf4\xc7\xce\xfe" ) |
270 | << "1(1431027667.1220088)" ; |
271 | } |
272 | |
273 | void addEmptyContainersData() |
274 | { |
275 | QTest::newRow(dataTag: "emptyarray" ) << raw(data: "\x80" ) << "[]" << 0; |
276 | QTest::newRow(dataTag: "emptymap" ) << raw(data: "\xa0" ) << "{}" << 0; |
277 | QTest::newRow(dataTag: "_emptyarray" ) << raw(data: "\x9f\xff" ) << "[_ ]" << -1; |
278 | QTest::newRow(dataTag: "_emptymap" ) << raw(data: "\xbf\xff" ) << "{_ }" << -1; |
279 | } |
280 | |
281 | void addMapMixedData() |
282 | { |
283 | QTest::newRow(dataTag: "map-0-24" ) << raw(data: "\xa1\0\x18\x18" ) << "{0: 24}" << 1; |
284 | QTest::newRow(dataTag: "map-0*1-24" ) << raw(data: "\xa1\x18\0\x18\x18" ) << "{0_0: 24}" << 1; |
285 | QTest::newRow(dataTag: "map-0*1-24*2" ) << raw(data: "\xa1\x18\0\x19\0\x18" ) << "{0_0: 24_1}" << 1; |
286 | QTest::newRow(dataTag: "map-0*4-24*2" ) << raw(data: "\xa1\x1a\0\0\0\0\x19\0\x18" ) << "{0_2: 24_1}" << 1; |
287 | QTest::newRow(dataTag: "map-24-0" ) << raw(data: "\xa1\x18\x18\0" ) << "{24: 0}" << 1; |
288 | QTest::newRow(dataTag: "map-24-0*1" ) << raw(data: "\xa1\x18\x18\x18\0" ) << "{24: 0_0}" << 1; |
289 | QTest::newRow(dataTag: "map-255-65535" ) << raw(data: "\xa1\x18\xff\x19\xff\xff" ) << "{255: 65535}" << 1; |
290 | |
291 | QTest::newRow(dataTag: "_map-0-24" ) << raw(data: "\xbf\0\x18\x18\xff" ) << "{_ 0: 24}" << 1; |
292 | QTest::newRow(dataTag: "_map-0*1-24" ) << raw(data: "\xbf\x18\0\x18\x18\xff" ) << "{_ 0_0: 24}" << 1; |
293 | QTest::newRow(dataTag: "_map-0*1-24*2" ) << raw(data: "\xbf\x18\0\x19\0\x18\xff" ) << "{_ 0_0: 24_1}" << 1; |
294 | QTest::newRow(dataTag: "_map-0*4-24*2" ) << raw(data: "\xbf\x1a\0\0\0\0\x19\0\x18\xff" ) << "{_ 0_2: 24_1}" << 1; |
295 | QTest::newRow(dataTag: "_map-24-0" ) << raw(data: "\xbf\x18\x18\0\xff" ) << "{_ 24: 0}" << 1; |
296 | QTest::newRow(dataTag: "_map-24-0*1" ) << raw(data: "\xbf\x18\x18\x18\0\xff" ) << "{_ 24: 0_0}" << 1; |
297 | QTest::newRow(dataTag: "_map-255-65535" ) << raw(data: "\xbf\x18\xff\x19\xff\xff\xff" ) << "{_ 255: 65535}" << 1; |
298 | } |
299 | |
300 | void addChunkedStringData() |
301 | { |
302 | QTest::addColumn<QByteArray>(name: "data" ); |
303 | QTest::addColumn<QString>(name: "concatenated" ); |
304 | QTest::addColumn<QStringList>(name: "chunks" ); |
305 | |
306 | // non-chunked: |
307 | QTest::newRow(dataTag: "emptybytestring" ) << raw(data: "\x40" ) << "h''" << QStringList{"h''" }; |
308 | QTest::newRow(dataTag: "bytestring1" ) << raw(data: "\x41 " ) << "h'20'" << QStringList{"h'20'" }; |
309 | QTest::newRow(dataTag: "emptytextstring" ) << raw(data: "\x60" ) << "\"\"" << QStringList{"\"\"" }; |
310 | QTest::newRow(dataTag: "textstring1" ) << raw(data: "\x61 " ) << "\" \"" << QStringList{"\" \"" }; |
311 | |
312 | // empty chunked: |
313 | QTest::newRow(dataTag: "_emptybytestring" ) << raw(data: "\x5f\xff" ) << "h''" << QStringList{}; |
314 | QTest::newRow(dataTag: "_emptytextstring" ) << raw(data: "\x7f\xff" ) << "\"\"" << QStringList{}; |
315 | QTest::newRow(dataTag: "_emptybytestring2" ) << raw(data: "\x5f\x40\xff" ) << "h''" << QStringList{"h''" }; |
316 | QTest::newRow(dataTag: "_emptytextstring2" ) << raw(data: "\x7f\x60\xff" ) << "\"\"" << QStringList{"\"\"" }; |
317 | QTest::newRow(dataTag: "_emptybytestring3" ) << raw(data: "\x5f\x40\x40\xff" ) << "h''" << QStringList{"h''" , "h''" }; |
318 | QTest::newRow(dataTag: "_emptytextstring3" ) << raw(data: "\x7f\x60\x60\xff" ) << "\"\"" << QStringList{"\"\"" , "\"\"" }; |
319 | |
320 | // regular chunks |
321 | QTest::newRow(dataTag: "_bytestring1" ) << raw(data: "\x5f\x41 \xff" ) << "h'20'" << QStringList{"h'20'" }; |
322 | QTest::newRow(dataTag: "_bytestring2" ) << raw(data: "\x5f\x41 \x41z\xff" ) << "h'207a'" << QStringList{"h'20'" , "h'7a'" }; |
323 | QTest::newRow(dataTag: "_bytestring3" ) << raw(data: "\x5f\x41 \x58\x18" "123456789012345678901234\x41z\xff" ) |
324 | << "h'203132333435363738393031323334353637383930313233347a'" |
325 | << QStringList{"h'20'" , "h'313233343536373839303132333435363738393031323334'" , "h'7a'" }; |
326 | |
327 | QTest::newRow(dataTag: "_textstring1" ) << raw(data: "\x7f\x61 \xff" ) << "\" \"" << QStringList{"\" \"" }; |
328 | QTest::newRow(dataTag: "_textstring2" ) << raw(data: "\x7f\x61 \x61z\xff" ) << "\" z\"" << QStringList{"\" \"" , "\"z\"" }; |
329 | QTest::newRow(dataTag: "_textstring3" ) << raw(data: "\x7f\x61 \x78\x18" "123456789012345678901234\x61z\xff" ) |
330 | << "\" 123456789012345678901234z\"" |
331 | << QStringList{"\" \"" , "\"123456789012345678901234\"" , "\"z\"" }; |
332 | } |
333 | |
334 | void addValidationColumns() |
335 | { |
336 | QTest::addColumn<QByteArray>(name: "data" ); |
337 | QTest::addColumn<int>(name: "flags" ); // future |
338 | QTest::addColumn<CborError>(name: "expectedError" ); |
339 | } |
340 | |
341 | void addValidationData(size_t minInvalid = ~size_t(0)) |
342 | { |
343 | // illegal numbers are future extension points |
344 | QTest::newRow(dataTag: "illegal-number-in-unsigned-1" ) << raw(data: "\x81\x1c" ) << 0 << CborErrorIllegalNumber; |
345 | QTest::newRow(dataTag: "illegal-number-in-unsigned-2" ) << raw(data: "\x81\x1d" ) << 0 << CborErrorIllegalNumber; |
346 | QTest::newRow(dataTag: "illegal-number-in-unsigned-3" ) << raw(data: "\x81\x1e" ) << 0 << CborErrorIllegalNumber; |
347 | QTest::newRow(dataTag: "illegal-number-in-unsigned-4" ) << raw(data: "\x81\x1f" ) << 0 << CborErrorIllegalNumber; |
348 | QTest::newRow(dataTag: "illegal-number-in-negative-1" ) << raw(data: "\x81\x3c" ) << 0 << CborErrorIllegalNumber; |
349 | QTest::newRow(dataTag: "illegal-number-in-negative-2" ) << raw(data: "\x81\x3d" ) << 0 << CborErrorIllegalNumber; |
350 | QTest::newRow(dataTag: "illegal-number-in-negative-3" ) << raw(data: "\x81\x3e" ) << 0 << CborErrorIllegalNumber; |
351 | QTest::newRow(dataTag: "illegal-number-in-negative-4" ) << raw(data: "\x81\x3f" ) << 0 << CborErrorIllegalNumber; |
352 | QTest::newRow(dataTag: "illegal-number-in-bytearray-length-1" ) << raw(data: "\x81\x5c" ) << 0 << CborErrorIllegalNumber; |
353 | QTest::newRow(dataTag: "illegal-number-in-bytearray-length-2" ) << raw(data: "\x81\x5d" ) << 0 << CborErrorIllegalNumber; |
354 | QTest::newRow(dataTag: "illegal-number-in-bytearray-length-3" ) << raw(data: "\x81\x5e" ) << 0 << CborErrorIllegalNumber; |
355 | QTest::newRow(dataTag: "illegal-number-in-string-length-1" ) << raw(data: "\x81\x7c" ) << 0 << CborErrorIllegalNumber; |
356 | QTest::newRow(dataTag: "illegal-number-in-string-length-2" ) << raw(data: "\x81\x7d" ) << 0 << CborErrorIllegalNumber; |
357 | QTest::newRow(dataTag: "illegal-number-in-string-length-3" ) << raw(data: "\x81\x7e" ) << 0 << CborErrorIllegalNumber; |
358 | QTest::newRow(dataTag: "illegal-number-in-array-length-1" ) << raw(data: "\x81\x9c" ) << 0 << CborErrorIllegalNumber; |
359 | QTest::newRow(dataTag: "illegal-number-in-array-length-2" ) << raw(data: "\x81\x9d" ) << 0 << CborErrorIllegalNumber; |
360 | QTest::newRow(dataTag: "illegal-number-in-array-length-3" ) << raw(data: "\x81\x9e" ) << 0 << CborErrorIllegalNumber; |
361 | QTest::newRow(dataTag: "illegal-number-in-map-length-1" ) << raw(data: "\x81\xbc" ) << 0 << CborErrorIllegalNumber; |
362 | QTest::newRow(dataTag: "illegal-number-in-map-length-2" ) << raw(data: "\x81\xbd" ) << 0 << CborErrorIllegalNumber; |
363 | QTest::newRow(dataTag: "illegal-number-in-map-length-3" ) << raw(data: "\x81\xbe" ) << 0 << CborErrorIllegalNumber; |
364 | QTest::newRow(dataTag: "illegal-number-in-tag-1" ) << raw(data: "\x81\xdc" ) << 0 << CborErrorIllegalNumber; |
365 | QTest::newRow(dataTag: "illegal-number-in-tag-2" ) << raw(data: "\x81\xdd" ) << 0 << CborErrorIllegalNumber; |
366 | QTest::newRow(dataTag: "illegal-number-in-tag-3" ) << raw(data: "\x81\xde" ) << 0 << CborErrorIllegalNumber; |
367 | QTest::newRow(dataTag: "illegal-number-in-tag-4" ) << raw(data: "\x81\xdf" ) << 0 << CborErrorIllegalNumber; |
368 | |
369 | QTest::newRow(dataTag: "unsigned-too-short-1-0" ) << raw(data: "\x81\x18" ) << 0 << CborErrorUnexpectedEOF; // requires 1 byte, 0 given |
370 | QTest::newRow(dataTag: "unsigned-too-short-2-0" ) << raw(data: "\x81\x19" ) << 0 << CborErrorUnexpectedEOF; // requires 2 bytes, 0 given |
371 | QTest::newRow(dataTag: "unsigned-too-short-2-1" ) << raw(data: "\x81\x19\x01" ) << 0 << CborErrorUnexpectedEOF; // etc |
372 | QTest::newRow(dataTag: "unsigned-too-short-4-0" ) << raw(data: "\x81\x1a" ) << 0 << CborErrorUnexpectedEOF; |
373 | QTest::newRow(dataTag: "unsigned-too-short-4-3" ) << raw(data: "\x81\x1a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
374 | QTest::newRow(dataTag: "unsigned-too-short-8-0" ) << raw(data: "\x81\x1b" ) << 0 << CborErrorUnexpectedEOF; |
375 | QTest::newRow(dataTag: "unsigned-too-short-8-7" ) << raw(data: "\x81\x1b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
376 | QTest::newRow(dataTag: "negative-length-too-short-1-0" ) << raw(data: "\x81\x38" ) << 0 << CborErrorUnexpectedEOF; |
377 | QTest::newRow(dataTag: "negative-length-too-short-2-0" ) << raw(data: "\x81\x39" ) << 0 << CborErrorUnexpectedEOF; |
378 | QTest::newRow(dataTag: "negative-length-too-short-2-1" ) << raw(data: "\x81\x39\x01" ) << 0 << CborErrorUnexpectedEOF; |
379 | QTest::newRow(dataTag: "negative-length-too-short-4-0" ) << raw(data: "\x81\x3a" ) << 0 << CborErrorUnexpectedEOF; |
380 | QTest::newRow(dataTag: "negative-length-too-short-4-3" ) << raw(data: "\x81\x3a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
381 | QTest::newRow(dataTag: "negative-length-too-short-8-0" ) << raw(data: "\x81\x3b" ) << 0 << CborErrorUnexpectedEOF; |
382 | QTest::newRow(dataTag: "negative-length-too-short-8-7" ) << raw(data: "\x81\x3b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
383 | QTest::newRow(dataTag: "bytearray-length-too-short-1-0" ) << raw(data: "\x81\x58" ) << 0 << CborErrorUnexpectedEOF; |
384 | QTest::newRow(dataTag: "bytearray-length-too-short-2-0" ) << raw(data: "\x81\x59" ) << 0 << CborErrorUnexpectedEOF; |
385 | QTest::newRow(dataTag: "bytearray-length-too-short-2-1" ) << raw(data: "\x81\x59\x01" ) << 0 << CborErrorUnexpectedEOF; |
386 | QTest::newRow(dataTag: "bytearray-length-too-short-4-0" ) << raw(data: "\x81\x5a" ) << 0 << CborErrorUnexpectedEOF; |
387 | QTest::newRow(dataTag: "bytearray-length-too-short-4-3" ) << raw(data: "\x81\x5a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
388 | QTest::newRow(dataTag: "bytearray-length-too-short-8-0" ) << raw(data: "\x81\x5b" ) << 0 << CborErrorUnexpectedEOF; |
389 | QTest::newRow(dataTag: "bytearray-length-too-short-8-7" ) << raw(data: "\x81\x5b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
390 | QTest::newRow(dataTag: "string-length-too-short-1-0" ) << raw(data: "\x81\x78" ) << 0 << CborErrorUnexpectedEOF; |
391 | QTest::newRow(dataTag: "string-length-too-short-2-0" ) << raw(data: "\x81\x79" ) << 0 << CborErrorUnexpectedEOF; |
392 | QTest::newRow(dataTag: "string-length-too-short-2-1" ) << raw(data: "\x81\x79\x01" ) << 0 << CborErrorUnexpectedEOF; |
393 | QTest::newRow(dataTag: "string-length-too-short-4-0" ) << raw(data: "\x81\x7a" ) << 0 << CborErrorUnexpectedEOF; |
394 | QTest::newRow(dataTag: "string-length-too-short-4-3" ) << raw(data: "\x81\x7a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
395 | QTest::newRow(dataTag: "string-length-too-short-8-0" ) << raw(data: "\x81\x7b" ) << 0 << CborErrorUnexpectedEOF; |
396 | QTest::newRow(dataTag: "string-length-too-short-8-7" ) << raw(data: "\x81\x7b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
397 | QTest::newRow(dataTag: "bytearray-chunked-length-too-short-1-0" ) << raw(data: "\x81\x5f\x58" ) << 0 << CborErrorUnexpectedEOF; |
398 | QTest::newRow(dataTag: "bytearray-chunked-length-too-short-2-0" ) << raw(data: "\x81\x5f\x59" ) << 0 << CborErrorUnexpectedEOF; |
399 | QTest::newRow(dataTag: "bytearray-chunked-length-too-short-2-1" ) << raw(data: "\x81\x5f\x59\x01" ) << 0 << CborErrorUnexpectedEOF; |
400 | QTest::newRow(dataTag: "bytearray-chunked-length-too-short-4-0" ) << raw(data: "\x81\x5f\x5a" ) << 0 << CborErrorUnexpectedEOF; |
401 | QTest::newRow(dataTag: "bytearray-chunked-length-too-short-4-3" ) << raw(data: "\x81\x5f\x5a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
402 | QTest::newRow(dataTag: "bytearray-chunked-length-too-short-8-0" ) << raw(data: "\x81\x5f\x5b" ) << 0 << CborErrorUnexpectedEOF; |
403 | QTest::newRow(dataTag: "bytearray-chunked-length-too-short-8-7" ) << raw(data: "\x81\x5f\x5b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
404 | QTest::newRow(dataTag: "string-chunked-length-too-short-1-0" ) << raw(data: "\x81\x7f\x78" ) << 0 << CborErrorUnexpectedEOF; |
405 | QTest::newRow(dataTag: "string-chunked-length-too-short-2-0" ) << raw(data: "\x81\x7f\x79" ) << 0 << CborErrorUnexpectedEOF; |
406 | QTest::newRow(dataTag: "string-chunked-length-too-short-2-1" ) << raw(data: "\x81\x7f\x79\x01" ) << 0 << CborErrorUnexpectedEOF; |
407 | QTest::newRow(dataTag: "string-chunked-length-too-short-4-0" ) << raw(data: "\x81\x7f\x7a" ) << 0 << CborErrorUnexpectedEOF; |
408 | QTest::newRow(dataTag: "string-chunked-length-too-short-4-3" ) << raw(data: "\x81\x7f\x7a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
409 | QTest::newRow(dataTag: "string-chunked-length-too-short-8-0" ) << raw(data: "\x81\x7f\x7b" ) << 0 << CborErrorUnexpectedEOF; |
410 | QTest::newRow(dataTag: "string-chunked-length-too-short-8-7" ) << raw(data: "\x81\x7f\x7b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
411 | QTest::newRow(dataTag: "bytearray-chunked-2-length-too-short-1-0" ) << raw(data: "\x81\x5f\x40\x58" ) << 0 << CborErrorUnexpectedEOF; |
412 | QTest::newRow(dataTag: "bytearray-chunked-2-length-too-short-2-0" ) << raw(data: "\x81\x5f\x40\x59" ) << 0 << CborErrorUnexpectedEOF; |
413 | QTest::newRow(dataTag: "bytearray-chunked-2-length-too-short-2-1" ) << raw(data: "\x81\x5f\x40\x59\x01" ) << 0 << CborErrorUnexpectedEOF; |
414 | QTest::newRow(dataTag: "bytearray-chunked-2-length-too-short-4-0" ) << raw(data: "\x81\x5f\x40\x5a" ) << 0 << CborErrorUnexpectedEOF; |
415 | QTest::newRow(dataTag: "bytearray-chunked-2-length-too-short-4-3" ) << raw(data: "\x81\x5f\x40\x5a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
416 | QTest::newRow(dataTag: "bytearray-chunked-2-length-too-short-8-0" ) << raw(data: "\x81\x5f\x40\x5b" ) << 0 << CborErrorUnexpectedEOF; |
417 | QTest::newRow(dataTag: "bytearray-chunked-2-length-too-short-8-7" ) << raw(data: "\x81\x5f\x40\x5b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
418 | QTest::newRow(dataTag: "string-chunked-2-length-too-short-1-0" ) << raw(data: "\x81\x7f\x60\x78" ) << 0 << CborErrorUnexpectedEOF; |
419 | QTest::newRow(dataTag: "string-chunked-2-length-too-short-2-0" ) << raw(data: "\x81\x7f\x60\x79" ) << 0 << CborErrorUnexpectedEOF; |
420 | QTest::newRow(dataTag: "string-chunked-2-length-too-short-2-1" ) << raw(data: "\x81\x7f\x60\x79\x01" ) << 0 << CborErrorUnexpectedEOF; |
421 | QTest::newRow(dataTag: "string-chunked-2-length-too-short-4-0" ) << raw(data: "\x81\x7f\x60\x7a" ) << 0 << CborErrorUnexpectedEOF; |
422 | QTest::newRow(dataTag: "string-chunked-2-length-too-short-4-3" ) << raw(data: "\x81\x7f\x60\x7a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
423 | QTest::newRow(dataTag: "string-chunked-2-length-too-short-8-0" ) << raw(data: "\x81\x7f\x60\x7b" ) << 0 << CborErrorUnexpectedEOF; |
424 | QTest::newRow(dataTag: "string-chunked-2-length-too-short-8-7" ) << raw(data: "\x81\x7f\x60\x7b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
425 | QTest::newRow(dataTag: "array-length-too-short-1-0" ) << raw(data: "\x81\x98" ) << 0 << CborErrorUnexpectedEOF; |
426 | QTest::newRow(dataTag: "array-length-too-short-2-0" ) << raw(data: "\x81\x99" ) << 0 << CborErrorUnexpectedEOF; |
427 | QTest::newRow(dataTag: "array-length-too-short-2-1" ) << raw(data: "\x81\x99\x01" ) << 0 << CborErrorUnexpectedEOF; |
428 | QTest::newRow(dataTag: "array-length-too-short-4-0" ) << raw(data: "\x81\x9a" ) << 0 << CborErrorUnexpectedEOF; |
429 | QTest::newRow(dataTag: "array-length-too-short-4-3" ) << raw(data: "\x81\x9a\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
430 | QTest::newRow(dataTag: "array-length-too-short-8-0" ) << raw(data: "\x81\x9b" ) << 0 << CborErrorUnexpectedEOF; |
431 | QTest::newRow(dataTag: "array-length-too-short-8-7" ) << raw(data: "\x81\x9b\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
432 | QTest::newRow(dataTag: "map-length-too-short-1-0" ) << raw(data: "\x81\xb8" ) << 0 << CborErrorUnexpectedEOF; |
433 | QTest::newRow(dataTag: "map-length-too-short-2-0" ) << raw(data: "\x81\xb9" ) << 0 << CborErrorUnexpectedEOF; |
434 | QTest::newRow(dataTag: "map-length-too-short-2-1" ) << raw(data: "\x81\xb9\x01" ) << 0 << CborErrorUnexpectedEOF; |
435 | QTest::newRow(dataTag: "map-length-too-short-4-0" ) << raw(data: "\x81\xba" ) << 0 << CborErrorUnexpectedEOF; |
436 | QTest::newRow(dataTag: "map-length-too-short-4-3" ) << raw(data: "\x81\xba\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
437 | QTest::newRow(dataTag: "map-length-too-short-8-0" ) << raw(data: "\x81\xbb" ) << 0 << CborErrorUnexpectedEOF; |
438 | QTest::newRow(dataTag: "map-length-too-short-8-7" ) << raw(data: "\x81\xbb\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
439 | QTest::newRow(dataTag: "tag-too-short-1-0" ) << raw(data: "\x81\xd8" ) << 0 << CborErrorUnexpectedEOF; |
440 | QTest::newRow(dataTag: "tag-too-short-2-0" ) << raw(data: "\x81\xd9" ) << 0 << CborErrorUnexpectedEOF; |
441 | QTest::newRow(dataTag: "tag-too-short-2-1" ) << raw(data: "\x81\xd9\x01" ) << 0 << CborErrorUnexpectedEOF; |
442 | QTest::newRow(dataTag: "tag-too-short-4-0" ) << raw(data: "\x81\xda" ) << 0 << CborErrorUnexpectedEOF; |
443 | QTest::newRow(dataTag: "tag-too-short-4-3" ) << raw(data: "\x81\xda\x01\x02\x03" ) << 0 << CborErrorUnexpectedEOF; |
444 | QTest::newRow(dataTag: "tag-too-short-8-0" ) << raw(data: "\x81\xdb" ) << 0 << CborErrorUnexpectedEOF; |
445 | QTest::newRow(dataTag: "tag-too-short-8-7" ) << raw(data: "\x81\xdb\1\2\3\4\5\6\7" ) << 0 << CborErrorUnexpectedEOF; |
446 | QTest::newRow(dataTag: "fp16-too-short1" ) << raw(data: "\x81\xf9" ) << 0 << CborErrorUnexpectedEOF; |
447 | QTest::newRow(dataTag: "fp16-too-short2" ) << raw(data: "\x81\xf9\x00" ) << 0 << CborErrorUnexpectedEOF; |
448 | QTest::newRow(dataTag: "float-too-short1" ) << raw(data: "\x81\xfa" ) << 0 << CborErrorUnexpectedEOF; |
449 | QTest::newRow(dataTag: "float-too-short2" ) << raw(data: "\x81\xfa\0\0\0" ) << 0 << CborErrorUnexpectedEOF; |
450 | QTest::newRow(dataTag: "double-too-short1" ) << raw(data: "\x81\xfb" ) << 0 << CborErrorUnexpectedEOF; |
451 | QTest::newRow(dataTag: "double-too-short2" ) << raw(data: "\x81\xfb\0\0\0\0\0\0\0" ) << 0 << CborErrorUnexpectedEOF; |
452 | |
453 | QTest::newRow(dataTag: "bytearray-too-short1" ) << raw(data: "\x81\x42z" ) << 0 << CborErrorUnexpectedEOF; |
454 | QTest::newRow(dataTag: "bytearray-too-short2" ) << raw(data: "\x81\x58\x02z" ) << 0 << CborErrorUnexpectedEOF; |
455 | QTest::newRow(dataTag: "bytearray-too-short3" ) << raw(data: "\x81\x5a\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
456 | QTest::newRow(dataTag: "bytearray-too-short4" ) << raw(data: "\x81\x5b\0\0\0\0\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
457 | QTest::newRow(dataTag: "string-too-short1" ) << raw(data: "\x81\x62z" ) << 0 << CborErrorUnexpectedEOF; |
458 | QTest::newRow(dataTag: "string-too-short2" ) << raw(data: "\x81\x78\x02z" ) << 0 << CborErrorUnexpectedEOF; |
459 | QTest::newRow(dataTag: "string-too-short3" ) << raw(data: "\x81\x7a\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
460 | QTest::newRow(dataTag: "string-too-short4" ) << raw(data: "\x81\x7b\0\0\0\0\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
461 | QTest::newRow(dataTag: "bytearray-chunked-too-short1" ) << raw(data: "\x81\x5f\x42z" ) << 0 << CborErrorUnexpectedEOF; |
462 | QTest::newRow(dataTag: "bytearray-chunked-too-short2" ) << raw(data: "\x81\x5f\x58\x02z" ) << 0 << CborErrorUnexpectedEOF; |
463 | QTest::newRow(dataTag: "bytearray-chunked-too-short3" ) << raw(data: "\x81\x5f\x5a\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
464 | QTest::newRow(dataTag: "bytearray-chunked-too-short4" ) << raw(data: "\x81\x5f\x5b\0\0\0\0\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
465 | QTest::newRow(dataTag: "string-chunked-too-short1" ) << raw(data: "\x81\x7f\x62z" ) << 0 << CborErrorUnexpectedEOF; |
466 | QTest::newRow(dataTag: "string-chunked-too-short2" ) << raw(data: "\x81\x7f\x78\x02z" ) << 0 << CborErrorUnexpectedEOF; |
467 | QTest::newRow(dataTag: "string-chunked-too-short3" ) << raw(data: "\x81\x7f\x7a\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
468 | QTest::newRow(dataTag: "string-chunked-too-short4" ) << raw(data: "\x81\x7f\x7b\0\0\0\0\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
469 | QTest::newRow(dataTag: "bytearray-chunked-too-short1x2" ) << raw(data: "\x81\x5f\x40\x42z" ) << 0 << CborErrorUnexpectedEOF; |
470 | QTest::newRow(dataTag: "bytearray-chunked-too-short2x2" ) << raw(data: "\x81\x5f\x40\x58\x02z" ) << 0 << CborErrorUnexpectedEOF; |
471 | QTest::newRow(dataTag: "bytearray-chunked-too-short3x2" ) << raw(data: "\x81\x5f\x40\x5a\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
472 | QTest::newRow(dataTag: "bytearray-chunked-too-short4x2" ) << raw(data: "\x81\x5f\x40\x5b\0\0\0\0\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
473 | QTest::newRow(dataTag: "string-chunked-too-short1x2" ) << raw(data: "\x81\x7f\x60\x62z" ) << 0 << CborErrorUnexpectedEOF; |
474 | QTest::newRow(dataTag: "string-chunked-too-short2x2" ) << raw(data: "\x81\x7f\x60\x78\x02z" ) << 0 << CborErrorUnexpectedEOF; |
475 | QTest::newRow(dataTag: "string-chunked-too-short3x2" ) << raw(data: "\x81\x7f\x60\x7a\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
476 | QTest::newRow(dataTag: "string-chunked-too-short4x2" ) << raw(data: "\x81\x7f\x60\x7b\0\0\0\0\0\0\0\2z" ) << 0 << CborErrorUnexpectedEOF; |
477 | |
478 | QTest::newRow(dataTag: "bytearray-no-break1" ) << raw(data: "\x81\x5f" ) << 0 << CborErrorUnexpectedEOF; |
479 | QTest::newRow(dataTag: "bytearray-no-break2" ) << raw(data: "\x81\x5f\x40" ) << 0 << CborErrorUnexpectedEOF; |
480 | QTest::newRow(dataTag: "string-no-break1" ) << raw(data: "\x81\x7f" ) << 0 << CborErrorUnexpectedEOF; |
481 | QTest::newRow(dataTag: "string-no-break2" ) << raw(data: "\x81\x7f\x60" ) << 0 << CborErrorUnexpectedEOF; |
482 | QTest::newRow(dataTag: "array-no-break1" ) << raw(data: "\x81\x9f" ) << 0 << CborErrorUnexpectedEOF; |
483 | QTest::newRow(dataTag: "array-no-break2" ) << raw(data: "\x81\x9f\0" ) << 0 << CborErrorUnexpectedEOF; |
484 | QTest::newRow(dataTag: "map-no-break1" ) << raw(data: "\x81\xbf" ) << 0 << CborErrorUnexpectedEOF; |
485 | QTest::newRow(dataTag: "map-no-break2" ) << raw(data: "\x81\xbf\0\0" ) << 0 << CborErrorUnexpectedEOF; |
486 | QTest::newRow(dataTag: "map-break-after-key" ) << raw(data: "\x81\xbf\0\xff" ) << 0 << CborErrorUnexpectedBreak; |
487 | QTest::newRow(dataTag: "map-break-after-value-tag" ) << raw(data: "\x81\xbf\0\xc0\xff" ) << 0 << CborErrorUnexpectedBreak; |
488 | QTest::newRow(dataTag: "map-break-after-value-tag2" ) << raw(data: "\x81\xbf\0\xd8\x20\xff" ) << 0 << CborErrorUnexpectedBreak; |
489 | |
490 | // check for pointer additions wrapping over the limit of the address space |
491 | auto wraparoundError = [minInvalid](uint64_t encodedSize) { |
492 | if (encodedSize > minInvalid) |
493 | return CborErrorDataTooLarge; |
494 | return CborErrorUnexpectedEOF; |
495 | }; |
496 | constexpr uint64_t FourGB = UINT32_MAX + UINT64_C(1); |
497 | // on 32-bit systems, this is a -1 |
498 | QTest::newRow(dataTag: "bytearray-wraparound1" ) << raw(data: "\x81\x5a\xff\xff\xff\xff" ) << 0 << wraparoundError(UINT32_MAX); |
499 | QTest::newRow(dataTag: "string-wraparound1" ) << raw(data: "\x81\x7a\xff\xff\xff\xff" ) << 0 << wraparoundError(UINT32_MAX); |
500 | // on 32-bit systems, a 4GB addition could be dropped |
501 | QTest::newRow(dataTag: "bytearray-wraparound2" ) << raw(data: "\x81\x5b\0\0\0\1\0\0\0\0" ) << 0 << wraparoundError(FourGB); |
502 | QTest::newRow(dataTag: "string-wraparound2" ) << raw(data: "\x81\x7b\0\0\0\1\0\0\0\0" ) << 0 << wraparoundError(FourGB); |
503 | // on 64-bit systems, this could be a -1 |
504 | QTest::newRow(dataTag: "bytearray-wraparound3" ) << raw(data: "\x81\x5b\xff\xff\xff\xff\xff\xff\xff\xff" ) << 0 |
505 | << wraparoundError(UINT64_MAX); |
506 | QTest::newRow(dataTag: "string-wraparound3" ) << raw(data: "\x81\x7b\xff\xff\xff\xff\xff\xff\xff\xff" ) << 0 |
507 | << wraparoundError(UINT64_MAX); |
508 | |
509 | // ditto on chunks |
510 | QTest::newRow(dataTag: "bytearray-chunk-wraparound1" ) << raw(data: "\x81\x5f\x5a\xff\xff\xff\xff" ) << 0 << wraparoundError(UINT32_MAX); |
511 | QTest::newRow(dataTag: "string-chunk-wraparound1" ) << raw(data: "\x81\x7f\x7a\xff\xff\xff\xff" ) << 0 << wraparoundError(UINT32_MAX); |
512 | // on 32-bit systems, a 4GB addition could be dropped |
513 | QTest::newRow(dataTag: "bytearray-chunk-wraparound2" ) << raw(data: "\x81\x5f\x5b\0\0\0\1\0\0\0\0" ) << 0 << wraparoundError(FourGB); |
514 | QTest::newRow(dataTag: "string-chunk-wraparound2" ) << raw(data: "\x81\x7f\x7b\0\0\0\1\0\0\0\0" ) << 0 << wraparoundError(FourGB); |
515 | // on 64-bit systems, this could be a -1 |
516 | QTest::newRow(dataTag: "bytearray-chunk-wraparound3" ) << raw(data: "\x81\x5f\x5b\xff\xff\xff\xff\xff\xff\xff\xff" ) << 0 |
517 | << wraparoundError(UINT64_MAX); |
518 | QTest::newRow(dataTag: "string-chunk-wraparound3" ) << raw(data: "\x81\x7f\x7b\xff\xff\xff\xff\xff\xff\xff\xff" ) << 0 |
519 | << wraparoundError(UINT64_MAX); |
520 | |
521 | QTest::newRow(dataTag: "eof-after-array" ) << raw(data: "\x81" ) << 0 << CborErrorUnexpectedEOF; |
522 | QTest::newRow(dataTag: "eof-after-array2" ) << raw(data: "\x81\x78\x20" ) << 0 << CborErrorUnexpectedEOF; |
523 | QTest::newRow(dataTag: "eof-after-array-element" ) << raw(data: "\x81\x82\x01" ) << 0 << CborErrorUnexpectedEOF; |
524 | QTest::newRow(dataTag: "eof-after-object" ) << raw(data: "\x81\xa1" ) << 0 << CborErrorUnexpectedEOF; |
525 | QTest::newRow(dataTag: "eof-after-object2" ) << raw(data: "\x81\xb8\x20" ) << 0 << CborErrorUnexpectedEOF; |
526 | QTest::newRow(dataTag: "eof-after-object-key" ) << raw(data: "\x81\xa1\x01" ) << 0 << CborErrorUnexpectedEOF; |
527 | QTest::newRow(dataTag: "eof-after-object-value" ) << raw(data: "\x81\xa2\x01\x01" ) << 0 << CborErrorUnexpectedEOF; |
528 | QTest::newRow(dataTag: "eof-after-tag" ) << raw(data: "\x81\xc0" ) << 0 << CborErrorUnexpectedEOF; |
529 | QTest::newRow(dataTag: "eof-after-tag2" ) << raw(data: "\x81\xd8\x20" ) << 0 << CborErrorUnexpectedEOF; |
530 | |
531 | // major type 7 has future types |
532 | QTest::newRow(dataTag: "future-type-28" ) << raw(data: "\x81\xfc" ) << 0 << CborErrorUnknownType; |
533 | QTest::newRow(dataTag: "future-type-29" ) << raw(data: "\x81\xfd" ) << 0 << CborErrorUnknownType; |
534 | QTest::newRow(dataTag: "future-type-30" ) << raw(data: "\x81\xfe" ) << 0 << CborErrorUnknownType; |
535 | QTest::newRow(dataTag: "unexpected-break" ) << raw(data: "\x81\xff" ) << 0 << CborErrorUnexpectedBreak; |
536 | QTest::newRow(dataTag: "illegal-simple-0" ) << raw(data: "\x81\xf8\0" ) << 0 << CborErrorIllegalSimpleType; |
537 | QTest::newRow(dataTag: "illegal-simple-31" ) << raw(data: "\x81\xf8\x1f" ) << 0 << CborErrorIllegalSimpleType; |
538 | |
539 | // not only too big (UINT_MAX or UINT_MAX+1 in size), but also incomplete |
540 | if (sizeof(size_t) < sizeof(uint64_t)) { |
541 | QTest::newRow(dataTag: "bytearray-too-big1" ) << raw(data: "\x81\x5b\0\0\0\1\0\0\0\0" ) << 0 << CborErrorDataTooLarge; |
542 | QTest::newRow(dataTag: "string-too-big1" ) << raw(data: "\x81\x7b\0\0\0\1\0\0\0\0" ) << 0 << CborErrorDataTooLarge; |
543 | } |
544 | QTest::newRow(dataTag: "array-too-big1" ) << raw(data: "\x81\x9a\xff\xff\xff\xff\0\0\0\0" ) << 0 << CborErrorDataTooLarge; |
545 | QTest::newRow(dataTag: "array-too-big2" ) << raw(data: "\x81\x9b\0\0\0\1\0\0\0\0" ) << 0 << CborErrorDataTooLarge; |
546 | QTest::newRow(dataTag: "object-too-big1" ) << raw(data: "\x81\xba\xff\xff\xff\xff\0\0\0\0" ) << 0 << CborErrorDataTooLarge; |
547 | QTest::newRow(dataTag: "object-too-big2" ) << raw(data: "\x81\xbb\0\0\0\1\0\0\0\0" ) << 0 << CborErrorDataTooLarge; |
548 | |
549 | QTest::newRow(dataTag: "no-break-for-array0" ) << raw(data: "\x81\x9f" ) << 0 << CborErrorUnexpectedEOF; |
550 | QTest::newRow(dataTag: "no-break-for-array1" ) << raw(data: "\x81\x9f\x01" ) << 0 << CborErrorUnexpectedEOF; |
551 | |
552 | QTest::newRow(dataTag: "no-break-string0" ) << raw(data: "\x81\x7f" ) << 0 << CborErrorUnexpectedEOF; |
553 | QTest::newRow(dataTag: "no-break-string1" ) << raw(data: "\x81\x7f\x61Z" ) << 0 << CborErrorUnexpectedEOF; |
554 | |
555 | QTest::newRow(dataTag: "nested-indefinite-length-bytearrays" ) << raw(data: "\x81\x5f\x5f\xff\xff" ) << 0 << CborErrorIllegalNumber; |
556 | QTest::newRow(dataTag: "nested-indefinite-length-strings" ) << raw(data: "\x81\x7f\x7f\xff\xff" ) << 0 << CborErrorIllegalNumber; |
557 | |
558 | QTest::newRow(dataTag: "string-chunk-unsigned" ) << raw(data: "\x81\x7f\0\xff" ) << 0 << CborErrorIllegalType; |
559 | QTest::newRow(dataTag: "string-chunk-negative" ) << raw(data: "\x81\x7f\x20\xff" ) << 0 << CborErrorIllegalType; |
560 | QTest::newRow(dataTag: "string-chunk-bytearray" ) << raw(data: "\x81\x7f\x40\xff" ) << 0 << CborErrorIllegalType; |
561 | QTest::newRow(dataTag: "string-chunk-array" ) << raw(data: "\x81\x7f\x80\xff" ) << 0 << CborErrorIllegalType; |
562 | QTest::newRow(dataTag: "string-chunk-map" ) << raw(data: "\x81\x7f\xa0\xff" ) << 0 << CborErrorIllegalType; |
563 | QTest::newRow(dataTag: "string-chunk-tag" ) << raw(data: "\x81\x7f\xc0\xff" ) << 0 << CborErrorIllegalType; |
564 | QTest::newRow(dataTag: "string-chunk-tagged-string" ) << raw(data: "\x81\x7f\xc0\x60\xff" ) << 0 << CborErrorIllegalType; |
565 | QTest::newRow(dataTag: "string-chunk-simple0" ) << raw(data: "\x81\x7f\xe0\xff" ) << 0 << CborErrorIllegalType; |
566 | QTest::newRow(dataTag: "string-chunk-false" ) << raw(data: "\x81\x7f\xf4\xff" ) << 0 << CborErrorIllegalType; |
567 | QTest::newRow(dataTag: "string-chunk-true" ) << raw(data: "\x81\x7f\xf5\xff" ) << 0 << CborErrorIllegalType; |
568 | QTest::newRow(dataTag: "string-chunk-null" ) << raw(data: "\x81\x7f\xf6\xff" ) << 0 << CborErrorIllegalType; |
569 | QTest::newRow(dataTag: "string-chunk-undefined" ) << raw(data: "\x81\x7f\xf7\xff" ) << 0 << CborErrorIllegalType; |
570 | |
571 | QTest::newRow(dataTag: "bytearray-chunk-string" ) << raw(data: "\x81\x5f\x60\xff" ) << 0 << CborErrorIllegalType; |
572 | QTest::newRow(dataTag: "bytearray-chunk-tagged-bytearray" ) << raw(data: "\x81\x7f\xc0\x40\xff" ) << 0 << CborErrorIllegalType; |
573 | |
574 | // RFC 7049 Section 2.2.2 "Indefinite-Length Byte Strings and Text Strings" says |
575 | // Text strings with indefinite lengths act the same as byte strings |
576 | // with indefinite lengths, except that all their chunks MUST be |
577 | // definite-length text strings. Note that this implies that the bytes |
578 | // of a single UTF-8 character cannot be spread between chunks: a new |
579 | // chunk can only be started at a character boundary. |
580 | // This test technically tests the dumper, not the parser. |
581 | QTest::newRow(dataTag: "string-utf8-chunk-split" ) << raw(data: "\x81\x7f\x61\xc2\x61\xa0\xff" ) << 0 << CborErrorInvalidUtf8TextString; |
582 | } |
583 | |