Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
michael@0 | 1 | // Copyright (c) 2010 Google Inc. |
michael@0 | 2 | // All rights reserved. |
michael@0 | 3 | // |
michael@0 | 4 | // Redistribution and use in source and binary forms, with or without |
michael@0 | 5 | // modification, are permitted provided that the following conditions are |
michael@0 | 6 | // met: |
michael@0 | 7 | // |
michael@0 | 8 | // * Redistributions of source code must retain the above copyright |
michael@0 | 9 | // notice, this list of conditions and the following disclaimer. |
michael@0 | 10 | // * Redistributions in binary form must reproduce the above |
michael@0 | 11 | // copyright notice, this list of conditions and the following disclaimer |
michael@0 | 12 | // in the documentation and/or other materials provided with the |
michael@0 | 13 | // distribution. |
michael@0 | 14 | // * Neither the name of Google Inc. nor the names of its |
michael@0 | 15 | // contributors may be used to endorse or promote products derived from |
michael@0 | 16 | // this software without specific prior written permission. |
michael@0 | 17 | // |
michael@0 | 18 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
michael@0 | 19 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
michael@0 | 20 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
michael@0 | 21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
michael@0 | 22 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
michael@0 | 23 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
michael@0 | 24 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
michael@0 | 25 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
michael@0 | 26 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
michael@0 | 27 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
michael@0 | 28 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
michael@0 | 29 | |
michael@0 | 30 | // Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com> |
michael@0 | 31 | |
michael@0 | 32 | // byte_cursor_unittest.cc: Unit tests for google_breakpad::ByteBuffer |
michael@0 | 33 | // and google_breakpad::ByteCursor. |
michael@0 | 34 | |
michael@0 | 35 | #include <string> |
michael@0 | 36 | |
michael@0 | 37 | #include <string.h> |
michael@0 | 38 | |
michael@0 | 39 | #include "breakpad_googletest_includes.h" |
michael@0 | 40 | #include "common/byte_cursor.h" |
michael@0 | 41 | #include "common/using_std_string.h" |
michael@0 | 42 | |
michael@0 | 43 | using google_breakpad::ByteBuffer; |
michael@0 | 44 | using google_breakpad::ByteCursor; |
michael@0 | 45 | |
michael@0 | 46 | TEST(Buffer, SizeOfNothing) { |
michael@0 | 47 | uint8_t data[1]; |
michael@0 | 48 | ByteBuffer buffer(data, 0); |
michael@0 | 49 | EXPECT_EQ(0U, buffer.Size()); |
michael@0 | 50 | } |
michael@0 | 51 | |
michael@0 | 52 | TEST(Buffer, SizeOfSomething) { |
michael@0 | 53 | uint8_t data[10]; |
michael@0 | 54 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 55 | EXPECT_EQ(10U, buffer.Size()); |
michael@0 | 56 | } |
michael@0 | 57 | |
michael@0 | 58 | TEST(Extent, AvailableEmpty) { |
michael@0 | 59 | uint8_t data[1]; |
michael@0 | 60 | ByteBuffer buffer(data, 0); |
michael@0 | 61 | ByteCursor cursor(&buffer); |
michael@0 | 62 | EXPECT_EQ(0U, cursor.Available()); |
michael@0 | 63 | } |
michael@0 | 64 | |
michael@0 | 65 | TEST(Extent, AtEndEmpty) { |
michael@0 | 66 | uint8_t data[1]; |
michael@0 | 67 | ByteBuffer buffer(data, 0); |
michael@0 | 68 | ByteCursor cursor(&buffer); |
michael@0 | 69 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 70 | } |
michael@0 | 71 | |
michael@0 | 72 | TEST(Extent, AsBoolEmpty) { |
michael@0 | 73 | uint8_t data[1]; |
michael@0 | 74 | ByteBuffer buffer(data, 0); |
michael@0 | 75 | ByteCursor cursor(&buffer); |
michael@0 | 76 | EXPECT_TRUE(cursor); |
michael@0 | 77 | } |
michael@0 | 78 | |
michael@0 | 79 | TEST(Extent, AvailableSome) { |
michael@0 | 80 | uint8_t data[10]; |
michael@0 | 81 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 82 | ByteCursor cursor(&buffer); |
michael@0 | 83 | EXPECT_EQ(10U, cursor.Available()); |
michael@0 | 84 | } |
michael@0 | 85 | |
michael@0 | 86 | TEST(Extent, AtEndSome) { |
michael@0 | 87 | uint8_t data[10]; |
michael@0 | 88 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 89 | ByteCursor cursor(&buffer); |
michael@0 | 90 | EXPECT_FALSE(cursor.AtEnd()); |
michael@0 | 91 | EXPECT_TRUE(cursor.Skip(sizeof(data)).AtEnd()); |
michael@0 | 92 | } |
michael@0 | 93 | |
michael@0 | 94 | TEST(Extent, AsBoolSome) { |
michael@0 | 95 | uint8_t data[10]; |
michael@0 | 96 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 97 | ByteCursor cursor(&buffer); |
michael@0 | 98 | EXPECT_TRUE(cursor); |
michael@0 | 99 | EXPECT_TRUE(cursor.Skip(sizeof(data))); |
michael@0 | 100 | EXPECT_FALSE(cursor.Skip(1)); |
michael@0 | 101 | } |
michael@0 | 102 | |
michael@0 | 103 | TEST(Extent, Cursor) { |
michael@0 | 104 | uint8_t data[] = { 0xf7, |
michael@0 | 105 | 0x9f, 0xbe, |
michael@0 | 106 | 0x67, 0xfb, 0xd3, 0x58, |
michael@0 | 107 | 0x6f, 0x36, 0xde, 0xd1, |
michael@0 | 108 | 0x2a, 0x2a, 0x2a }; |
michael@0 | 109 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 110 | ByteCursor cursor(&buffer); |
michael@0 | 111 | |
michael@0 | 112 | uint8_t a; |
michael@0 | 113 | uint16_t b; |
michael@0 | 114 | uint32_t c; |
michael@0 | 115 | uint32_t d; |
michael@0 | 116 | uint8_t stars[3]; |
michael@0 | 117 | |
michael@0 | 118 | EXPECT_EQ(data + 0U, cursor.here()); |
michael@0 | 119 | |
michael@0 | 120 | EXPECT_TRUE(cursor >> a); |
michael@0 | 121 | EXPECT_EQ(data + 1U, cursor.here()); |
michael@0 | 122 | |
michael@0 | 123 | EXPECT_TRUE(cursor >> b); |
michael@0 | 124 | EXPECT_EQ(data + 3U, cursor.here()); |
michael@0 | 125 | |
michael@0 | 126 | EXPECT_TRUE(cursor >> c); |
michael@0 | 127 | EXPECT_EQ(data + 7U, cursor.here()); |
michael@0 | 128 | |
michael@0 | 129 | EXPECT_TRUE(cursor.Skip(4)); |
michael@0 | 130 | EXPECT_EQ(data + 11U, cursor.here()); |
michael@0 | 131 | |
michael@0 | 132 | EXPECT_TRUE(cursor.Read(stars, 3)); |
michael@0 | 133 | EXPECT_EQ(data + 14U, cursor.here()); |
michael@0 | 134 | |
michael@0 | 135 | EXPECT_FALSE(cursor >> d); |
michael@0 | 136 | EXPECT_EQ(data + 14U, cursor.here()); |
michael@0 | 137 | } |
michael@0 | 138 | |
michael@0 | 139 | TEST(Extent, SetOffset) { |
michael@0 | 140 | uint8_t data[] = { 0x5c, 0x79, 0x8c, 0xd5 }; |
michael@0 | 141 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 142 | ByteCursor cursor(&buffer); |
michael@0 | 143 | |
michael@0 | 144 | uint8_t a, b, c, d, e; |
michael@0 | 145 | EXPECT_TRUE(cursor >> a); |
michael@0 | 146 | EXPECT_EQ(0x5cU, a); |
michael@0 | 147 | EXPECT_EQ(data + 1U, cursor.here()); |
michael@0 | 148 | EXPECT_TRUE(((cursor >> b).set_here(data + 3) >> c).set_here(data + 1) |
michael@0 | 149 | >> d >> e); |
michael@0 | 150 | EXPECT_EQ(0x79U, b); |
michael@0 | 151 | EXPECT_EQ(0xd5U, c); |
michael@0 | 152 | EXPECT_EQ(0x79U, d); |
michael@0 | 153 | EXPECT_EQ(0x8cU, e); |
michael@0 | 154 | EXPECT_EQ(data + 3U, cursor.here()); |
michael@0 | 155 | } |
michael@0 | 156 | |
michael@0 | 157 | TEST(BigEndian, Signed1) { |
michael@0 | 158 | uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff }; |
michael@0 | 159 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 160 | ByteCursor cursor(&buffer); |
michael@0 | 161 | cursor.set_big_endian(true); |
michael@0 | 162 | int a, b, c, d, e; |
michael@0 | 163 | ASSERT_TRUE(cursor |
michael@0 | 164 | .Read(1, true, &a) |
michael@0 | 165 | .Read(1, true, &b) |
michael@0 | 166 | .Read(1, true, &c) |
michael@0 | 167 | .Read(1, true, &d)); |
michael@0 | 168 | EXPECT_EQ(0, a); |
michael@0 | 169 | EXPECT_EQ(0x7f, b); |
michael@0 | 170 | EXPECT_EQ(-0x80, c); |
michael@0 | 171 | EXPECT_EQ(-1, d); |
michael@0 | 172 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 173 | EXPECT_FALSE(cursor.Read(1, true, &e)); |
michael@0 | 174 | } |
michael@0 | 175 | |
michael@0 | 176 | TEST(BigEndian, Signed2) { |
michael@0 | 177 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x80, 0x7f, 0xff, |
michael@0 | 178 | 0x80, 0x00, 0x80, 0x80, 0xff, 0xff, |
michael@0 | 179 | 0x39, 0xf1, 0x8a, 0xbc, 0x5a, 0xec }; |
michael@0 | 180 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 181 | ByteCursor cursor(&buffer, true); |
michael@0 | 182 | int a, b, c, d, e, f, g, h, i, j; |
michael@0 | 183 | ASSERT_TRUE(cursor |
michael@0 | 184 | .Read(2, true, &a) |
michael@0 | 185 | .Read(2, true, &b) |
michael@0 | 186 | .Read(2, true, &c) |
michael@0 | 187 | .Read(2, true, &d) |
michael@0 | 188 | .Read(2, true, &e) |
michael@0 | 189 | .Read(2, true, &f) |
michael@0 | 190 | .Read(2, true, &g) |
michael@0 | 191 | .Read(2, true, &h) |
michael@0 | 192 | .Read(2, true, &i)); |
michael@0 | 193 | EXPECT_EQ(0, a); |
michael@0 | 194 | EXPECT_EQ(0x80, b); |
michael@0 | 195 | EXPECT_EQ(0x7fff, c); |
michael@0 | 196 | EXPECT_EQ(-0x8000, d); |
michael@0 | 197 | EXPECT_EQ(-0x7f80, e); |
michael@0 | 198 | EXPECT_EQ(-1, f); |
michael@0 | 199 | EXPECT_EQ(0x39f1, g); |
michael@0 | 200 | EXPECT_EQ(-0x7544, h); |
michael@0 | 201 | EXPECT_EQ(0x5aec, i); |
michael@0 | 202 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 203 | EXPECT_FALSE(cursor.Read(2, true, &j)); |
michael@0 | 204 | } |
michael@0 | 205 | |
michael@0 | 206 | TEST(BigEndian, Signed4) { |
michael@0 | 207 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, |
michael@0 | 208 | 0x7f, 0xff, 0xff, 0xff, |
michael@0 | 209 | 0x80, 0x00, 0x00, 0x00, |
michael@0 | 210 | 0xff, 0xff, 0xff, 0xff, |
michael@0 | 211 | 0xb6, 0xb1, 0xff, 0xef, |
michael@0 | 212 | 0x19, 0x6a, 0xca, 0x46 }; |
michael@0 | 213 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 214 | ByteCursor cursor(&buffer); |
michael@0 | 215 | cursor.set_big_endian(true); |
michael@0 | 216 | int64_t a, b, c, d, e, f, g; |
michael@0 | 217 | ASSERT_TRUE(cursor |
michael@0 | 218 | .Read(4, true, &a) |
michael@0 | 219 | .Read(4, true, &b) |
michael@0 | 220 | .Read(4, true, &c) |
michael@0 | 221 | .Read(4, true, &d) |
michael@0 | 222 | .Read(4, true, &e) |
michael@0 | 223 | .Read(4, true, &f)); |
michael@0 | 224 | EXPECT_EQ(0, a); |
michael@0 | 225 | EXPECT_EQ(0x7fffffff, b); |
michael@0 | 226 | EXPECT_EQ(-0x80000000LL, c); |
michael@0 | 227 | EXPECT_EQ(-1, d); |
michael@0 | 228 | EXPECT_EQ((int32_t) 0xb6b1ffef, e); |
michael@0 | 229 | EXPECT_EQ(0x196aca46, f); |
michael@0 | 230 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 231 | EXPECT_FALSE(cursor.Read(4, true, &g)); |
michael@0 | 232 | } |
michael@0 | 233 | |
michael@0 | 234 | TEST(BigEndian, Signed8) { |
michael@0 | 235 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
michael@0 | 236 | 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
michael@0 | 237 | 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
michael@0 | 238 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
michael@0 | 239 | 0x93, 0x20, 0xd5, 0xe9, 0xd2, 0xd5, 0x87, 0x9c, |
michael@0 | 240 | 0x4e, 0x42, 0x49, 0xd2, 0x7f, 0x84, 0x14, 0xa4 }; |
michael@0 | 241 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 242 | ByteCursor cursor(&buffer, true); |
michael@0 | 243 | int64_t a, b, c, d, e, f, g; |
michael@0 | 244 | ASSERT_TRUE(cursor |
michael@0 | 245 | .Read(8, true, &a) |
michael@0 | 246 | .Read(8, true, &b) |
michael@0 | 247 | .Read(8, true, &c) |
michael@0 | 248 | .Read(8, true, &d) |
michael@0 | 249 | .Read(8, true, &e) |
michael@0 | 250 | .Read(8, true, &f)); |
michael@0 | 251 | EXPECT_EQ(0, a); |
michael@0 | 252 | EXPECT_EQ(0x7fffffffffffffffLL, b); |
michael@0 | 253 | EXPECT_EQ(-0x7fffffffffffffffLL - 1, c); |
michael@0 | 254 | EXPECT_EQ(-1, d); |
michael@0 | 255 | EXPECT_EQ((int64_t) 0x9320d5e9d2d5879cULL, e); |
michael@0 | 256 | EXPECT_EQ(0x4e4249d27f8414a4LL, f); |
michael@0 | 257 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 258 | EXPECT_FALSE(cursor.Read(8, true, &g)); |
michael@0 | 259 | } |
michael@0 | 260 | |
michael@0 | 261 | TEST(BigEndian, Unsigned1) { |
michael@0 | 262 | uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff }; |
michael@0 | 263 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 264 | ByteCursor cursor(&buffer); |
michael@0 | 265 | cursor.set_big_endian(true); |
michael@0 | 266 | int32_t a, b, c, d, e; |
michael@0 | 267 | ASSERT_TRUE(cursor |
michael@0 | 268 | .Read(1, false, &a) |
michael@0 | 269 | .Read(1, false, &b) |
michael@0 | 270 | .Read(1, false, &c) |
michael@0 | 271 | .Read(1, false, &d)); |
michael@0 | 272 | EXPECT_EQ(0, a); |
michael@0 | 273 | EXPECT_EQ(0x7f, b); |
michael@0 | 274 | EXPECT_EQ(0x80, c); |
michael@0 | 275 | EXPECT_EQ(0xff, d); |
michael@0 | 276 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 277 | EXPECT_FALSE(cursor.Read(1, false, &e)); |
michael@0 | 278 | } |
michael@0 | 279 | |
michael@0 | 280 | TEST(BigEndian, Unsigned2) { |
michael@0 | 281 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x80, 0x7f, 0xff, |
michael@0 | 282 | 0x80, 0x00, 0x80, 0x80, 0xff, 0xff, |
michael@0 | 283 | 0x39, 0xf1, 0x8a, 0xbc, 0x5a, 0xec }; |
michael@0 | 284 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 285 | ByteCursor cursor(&buffer, true); |
michael@0 | 286 | int64_t a, b, c, d, e, f, g, h, i, j; |
michael@0 | 287 | ASSERT_TRUE(cursor |
michael@0 | 288 | .Read(2, false, &a) |
michael@0 | 289 | .Read(2, false, &b) |
michael@0 | 290 | .Read(2, false, &c) |
michael@0 | 291 | .Read(2, false, &d) |
michael@0 | 292 | .Read(2, false, &e) |
michael@0 | 293 | .Read(2, false, &f) |
michael@0 | 294 | .Read(2, false, &g) |
michael@0 | 295 | .Read(2, false, &h) |
michael@0 | 296 | .Read(2, false, &i)); |
michael@0 | 297 | EXPECT_EQ(0, a); |
michael@0 | 298 | EXPECT_EQ(0x80, b); |
michael@0 | 299 | EXPECT_EQ(0x7fff, c); |
michael@0 | 300 | EXPECT_EQ(0x8000, d); |
michael@0 | 301 | EXPECT_EQ(0x8080, e); |
michael@0 | 302 | EXPECT_EQ(0xffff, f); |
michael@0 | 303 | EXPECT_EQ(0x39f1, g); |
michael@0 | 304 | EXPECT_EQ(0x8abc, h); |
michael@0 | 305 | EXPECT_EQ(0x5aec, i); |
michael@0 | 306 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 307 | EXPECT_FALSE(cursor.Read(2, false, &j)); |
michael@0 | 308 | } |
michael@0 | 309 | |
michael@0 | 310 | TEST(BigEndian, Unsigned4) { |
michael@0 | 311 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, |
michael@0 | 312 | 0x7f, 0xff, 0xff, 0xff, |
michael@0 | 313 | 0x80, 0x00, 0x00, 0x00, |
michael@0 | 314 | 0xff, 0xff, 0xff, 0xff, |
michael@0 | 315 | 0xb6, 0xb1, 0xff, 0xef, |
michael@0 | 316 | 0x19, 0x6a, 0xca, 0x46 }; |
michael@0 | 317 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 318 | ByteCursor cursor(&buffer); |
michael@0 | 319 | cursor.set_big_endian(true); |
michael@0 | 320 | int64_t a, b, c, d, e, f, g; |
michael@0 | 321 | ASSERT_TRUE(cursor |
michael@0 | 322 | .Read(4, false, &a) |
michael@0 | 323 | .Read(4, false, &b) |
michael@0 | 324 | .Read(4, false, &c) |
michael@0 | 325 | .Read(4, false, &d) |
michael@0 | 326 | .Read(4, false, &e) |
michael@0 | 327 | .Read(4, false, &f)); |
michael@0 | 328 | EXPECT_EQ(0, a); |
michael@0 | 329 | EXPECT_EQ(0x7fffffff, b); |
michael@0 | 330 | EXPECT_EQ(0x80000000, c); |
michael@0 | 331 | EXPECT_EQ(0xffffffff, d); |
michael@0 | 332 | EXPECT_EQ(0xb6b1ffef, e); |
michael@0 | 333 | EXPECT_EQ(0x196aca46, f); |
michael@0 | 334 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 335 | EXPECT_FALSE(cursor.Read(4, false, &g)); |
michael@0 | 336 | } |
michael@0 | 337 | |
michael@0 | 338 | TEST(BigEndian, Unsigned8) { |
michael@0 | 339 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
michael@0 | 340 | 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
michael@0 | 341 | 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
michael@0 | 342 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
michael@0 | 343 | 0x93, 0x20, 0xd5, 0xe9, 0xd2, 0xd5, 0x87, 0x9c, |
michael@0 | 344 | 0x4e, 0x42, 0x49, 0xd2, 0x7f, 0x84, 0x14, 0xa4 }; |
michael@0 | 345 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 346 | ByteCursor cursor(&buffer, true); |
michael@0 | 347 | uint64_t a, b, c, d, e, f, g; |
michael@0 | 348 | ASSERT_TRUE(cursor |
michael@0 | 349 | .Read(8, false, &a) |
michael@0 | 350 | .Read(8, false, &b) |
michael@0 | 351 | .Read(8, false, &c) |
michael@0 | 352 | .Read(8, false, &d) |
michael@0 | 353 | .Read(8, false, &e) |
michael@0 | 354 | .Read(8, false, &f)); |
michael@0 | 355 | EXPECT_EQ(0U, a); |
michael@0 | 356 | EXPECT_EQ(0x7fffffffffffffffULL, b); |
michael@0 | 357 | EXPECT_EQ(0x8000000000000000ULL, c); |
michael@0 | 358 | EXPECT_EQ(0xffffffffffffffffULL, d); |
michael@0 | 359 | EXPECT_EQ(0x9320d5e9d2d5879cULL, e); |
michael@0 | 360 | EXPECT_EQ(0x4e4249d27f8414a4ULL, f); |
michael@0 | 361 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 362 | EXPECT_FALSE(cursor.Read(8, false, &g)); |
michael@0 | 363 | } |
michael@0 | 364 | |
michael@0 | 365 | TEST(LittleEndian, Signed1) { |
michael@0 | 366 | uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff }; |
michael@0 | 367 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 368 | ByteCursor cursor(&buffer); |
michael@0 | 369 | int32_t a, b, c, d, e; |
michael@0 | 370 | ASSERT_TRUE(cursor |
michael@0 | 371 | .Read(1, true, &a) |
michael@0 | 372 | .Read(1, true, &b) |
michael@0 | 373 | .Read(1, true, &c) |
michael@0 | 374 | .Read(1, true, &d)); |
michael@0 | 375 | EXPECT_EQ(0, a); |
michael@0 | 376 | EXPECT_EQ(0x7f, b); |
michael@0 | 377 | EXPECT_EQ(-0x80, c); |
michael@0 | 378 | EXPECT_EQ(-1, d); |
michael@0 | 379 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 380 | EXPECT_FALSE(cursor.Read(1, true, &e)); |
michael@0 | 381 | } |
michael@0 | 382 | |
michael@0 | 383 | TEST(LittleEndian, Signed2) { |
michael@0 | 384 | uint8_t data[] = { 0x00, 0x00, 0x80, 0x00, 0xff, 0x7f, |
michael@0 | 385 | 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, |
michael@0 | 386 | 0xf1, 0x39, 0xbc, 0x8a, 0xec, 0x5a }; |
michael@0 | 387 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 388 | ByteCursor cursor(&buffer, false); |
michael@0 | 389 | int32_t a, b, c, d, e, f, g, h, i, j; |
michael@0 | 390 | ASSERT_TRUE(cursor |
michael@0 | 391 | .Read(2, true, &a) |
michael@0 | 392 | .Read(2, true, &b) |
michael@0 | 393 | .Read(2, true, &c) |
michael@0 | 394 | .Read(2, true, &d) |
michael@0 | 395 | .Read(2, true, &e) |
michael@0 | 396 | .Read(2, true, &f) |
michael@0 | 397 | .Read(2, true, &g) |
michael@0 | 398 | .Read(2, true, &h) |
michael@0 | 399 | .Read(2, true, &i)); |
michael@0 | 400 | EXPECT_EQ(0, a); |
michael@0 | 401 | EXPECT_EQ(0x80, b); |
michael@0 | 402 | EXPECT_EQ(0x7fff, c); |
michael@0 | 403 | EXPECT_EQ(-0x8000, d); |
michael@0 | 404 | EXPECT_EQ(-0x7f80, e); |
michael@0 | 405 | EXPECT_EQ(-1, f); |
michael@0 | 406 | EXPECT_EQ(0x39f1, g); |
michael@0 | 407 | EXPECT_EQ(-0x7544, h); |
michael@0 | 408 | EXPECT_EQ(0x5aec, i); |
michael@0 | 409 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 410 | EXPECT_FALSE(cursor.Read(2, true, &j)); |
michael@0 | 411 | } |
michael@0 | 412 | |
michael@0 | 413 | TEST(LittleEndian, Signed4) { |
michael@0 | 414 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, |
michael@0 | 415 | 0xff, 0xff, 0xff, 0x7f, |
michael@0 | 416 | 0x00, 0x00, 0x00, 0x80, |
michael@0 | 417 | 0xff, 0xff, 0xff, 0xff, |
michael@0 | 418 | 0xef, 0xff, 0xb1, 0xb6, |
michael@0 | 419 | 0x46, 0xca, 0x6a, 0x19 }; |
michael@0 | 420 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 421 | ByteCursor cursor(&buffer); |
michael@0 | 422 | int64_t a, b, c, d, e, f, g; |
michael@0 | 423 | ASSERT_TRUE(cursor |
michael@0 | 424 | .Read(4, true, &a) |
michael@0 | 425 | .Read(4, true, &b) |
michael@0 | 426 | .Read(4, true, &c) |
michael@0 | 427 | .Read(4, true, &d) |
michael@0 | 428 | .Read(4, true, &e) |
michael@0 | 429 | .Read(4, true, &f)); |
michael@0 | 430 | EXPECT_EQ(0, a); |
michael@0 | 431 | EXPECT_EQ(0x7fffffff, b); |
michael@0 | 432 | EXPECT_EQ(-0x80000000LL, c); |
michael@0 | 433 | EXPECT_EQ(-1, d); |
michael@0 | 434 | EXPECT_EQ((int32_t) 0xb6b1ffef, e); |
michael@0 | 435 | EXPECT_EQ(0x196aca46, f); |
michael@0 | 436 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 437 | EXPECT_FALSE(cursor.Read(4, true, &g)); |
michael@0 | 438 | } |
michael@0 | 439 | |
michael@0 | 440 | TEST(LittleEndian, Signed8) { |
michael@0 | 441 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
michael@0 | 442 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, |
michael@0 | 443 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, |
michael@0 | 444 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
michael@0 | 445 | 0x9c, 0x87, 0xd5, 0xd2, 0xe9, 0xd5, 0x20, 0x93, |
michael@0 | 446 | 0xa4, 0x14, 0x84, 0x7f, 0xd2, 0x49, 0x42, 0x4e }; |
michael@0 | 447 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 448 | ByteCursor cursor(&buffer, false); |
michael@0 | 449 | int64_t a, b, c, d, e, f, g; |
michael@0 | 450 | ASSERT_TRUE(cursor |
michael@0 | 451 | .Read(8, true, &a) |
michael@0 | 452 | .Read(8, true, &b) |
michael@0 | 453 | .Read(8, true, &c) |
michael@0 | 454 | .Read(8, true, &d) |
michael@0 | 455 | .Read(8, true, &e) |
michael@0 | 456 | .Read(8, true, &f)); |
michael@0 | 457 | EXPECT_EQ(0, a); |
michael@0 | 458 | EXPECT_EQ(0x7fffffffffffffffLL, b); |
michael@0 | 459 | EXPECT_EQ(-0x7fffffffffffffffLL - 1, c); |
michael@0 | 460 | EXPECT_EQ(-1, d); |
michael@0 | 461 | EXPECT_EQ((int64_t) 0x9320d5e9d2d5879cULL, e); |
michael@0 | 462 | EXPECT_EQ(0x4e4249d27f8414a4LL, f); |
michael@0 | 463 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 464 | EXPECT_FALSE(cursor.Read(8, true, &g)); |
michael@0 | 465 | } |
michael@0 | 466 | |
michael@0 | 467 | TEST(LittleEndian, Unsigned1) { |
michael@0 | 468 | uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff }; |
michael@0 | 469 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 470 | ByteCursor cursor(&buffer); |
michael@0 | 471 | int32_t a, b, c, d, e; |
michael@0 | 472 | ASSERT_TRUE(cursor |
michael@0 | 473 | .Read(1, false, &a) |
michael@0 | 474 | .Read(1, false, &b) |
michael@0 | 475 | .Read(1, false, &c) |
michael@0 | 476 | .Read(1, false, &d)); |
michael@0 | 477 | EXPECT_EQ(0, a); |
michael@0 | 478 | EXPECT_EQ(0x7f, b); |
michael@0 | 479 | EXPECT_EQ(0x80, c); |
michael@0 | 480 | EXPECT_EQ(0xff, d); |
michael@0 | 481 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 482 | EXPECT_FALSE(cursor.Read(1, false, &e)); |
michael@0 | 483 | } |
michael@0 | 484 | |
michael@0 | 485 | TEST(LittleEndian, Unsigned2) { |
michael@0 | 486 | uint8_t data[] = { 0x00, 0x00, 0x80, 0x00, 0xff, 0x7f, |
michael@0 | 487 | 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, |
michael@0 | 488 | 0xf1, 0x39, 0xbc, 0x8a, 0xec, 0x5a }; |
michael@0 | 489 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 490 | ByteCursor cursor(&buffer); |
michael@0 | 491 | int32_t a, b, c, d, e, f, g, h, i, j; |
michael@0 | 492 | ASSERT_TRUE(cursor |
michael@0 | 493 | .Read(2, false, &a) |
michael@0 | 494 | .Read(2, false, &b) |
michael@0 | 495 | .Read(2, false, &c) |
michael@0 | 496 | .Read(2, false, &d) |
michael@0 | 497 | .Read(2, false, &e) |
michael@0 | 498 | .Read(2, false, &f) |
michael@0 | 499 | .Read(2, false, &g) |
michael@0 | 500 | .Read(2, false, &h) |
michael@0 | 501 | .Read(2, false, &i)); |
michael@0 | 502 | EXPECT_EQ(0, a); |
michael@0 | 503 | EXPECT_EQ(0x80, b); |
michael@0 | 504 | EXPECT_EQ(0x7fff, c); |
michael@0 | 505 | EXPECT_EQ(0x8000, d); |
michael@0 | 506 | EXPECT_EQ(0x8080, e); |
michael@0 | 507 | EXPECT_EQ(0xffff, f); |
michael@0 | 508 | EXPECT_EQ(0x39f1, g); |
michael@0 | 509 | EXPECT_EQ(0x8abc, h); |
michael@0 | 510 | EXPECT_EQ(0x5aec, i); |
michael@0 | 511 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 512 | EXPECT_FALSE(cursor.Read(2, false, &j)); |
michael@0 | 513 | } |
michael@0 | 514 | |
michael@0 | 515 | TEST(LittleEndian, Unsigned4) { |
michael@0 | 516 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, |
michael@0 | 517 | 0xff, 0xff, 0xff, 0x7f, |
michael@0 | 518 | 0x00, 0x00, 0x00, 0x80, |
michael@0 | 519 | 0xff, 0xff, 0xff, 0xff, |
michael@0 | 520 | 0xef, 0xff, 0xb1, 0xb6, |
michael@0 | 521 | 0x46, 0xca, 0x6a, 0x19 }; |
michael@0 | 522 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 523 | ByteCursor cursor(&buffer); |
michael@0 | 524 | int64_t a, b, c, d, e, f, g; |
michael@0 | 525 | ASSERT_TRUE(cursor |
michael@0 | 526 | .Read(4, false, &a) |
michael@0 | 527 | .Read(4, false, &b) |
michael@0 | 528 | .Read(4, false, &c) |
michael@0 | 529 | .Read(4, false, &d) |
michael@0 | 530 | .Read(4, false, &e) |
michael@0 | 531 | .Read(4, false, &f)); |
michael@0 | 532 | EXPECT_EQ(0, a); |
michael@0 | 533 | EXPECT_EQ(0x7fffffff, b); |
michael@0 | 534 | EXPECT_EQ(0x80000000, c); |
michael@0 | 535 | EXPECT_EQ(0xffffffff, d); |
michael@0 | 536 | EXPECT_EQ(0xb6b1ffef, e); |
michael@0 | 537 | EXPECT_EQ(0x196aca46, f); |
michael@0 | 538 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 539 | EXPECT_FALSE(cursor.Read(4, false, &g)); |
michael@0 | 540 | } |
michael@0 | 541 | |
michael@0 | 542 | TEST(LittleEndian, Unsigned8) { |
michael@0 | 543 | uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
michael@0 | 544 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, |
michael@0 | 545 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, |
michael@0 | 546 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
michael@0 | 547 | 0x9c, 0x87, 0xd5, 0xd2, 0xe9, 0xd5, 0x20, 0x93, |
michael@0 | 548 | 0xa4, 0x14, 0x84, 0x7f, 0xd2, 0x49, 0x42, 0x4e }; |
michael@0 | 549 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 550 | ByteCursor cursor(&buffer); |
michael@0 | 551 | uint64_t a, b, c, d, e, f, g; |
michael@0 | 552 | ASSERT_TRUE(cursor |
michael@0 | 553 | .Read(8, false, &a) |
michael@0 | 554 | .Read(8, false, &b) |
michael@0 | 555 | .Read(8, false, &c) |
michael@0 | 556 | .Read(8, false, &d) |
michael@0 | 557 | .Read(8, false, &e) |
michael@0 | 558 | .Read(8, false, &f)); |
michael@0 | 559 | EXPECT_EQ(0U, a); |
michael@0 | 560 | EXPECT_EQ(0x7fffffffffffffffULL, b); |
michael@0 | 561 | EXPECT_EQ(0x8000000000000000ULL, c); |
michael@0 | 562 | EXPECT_EQ(0xffffffffffffffffULL, d); |
michael@0 | 563 | EXPECT_EQ(0x9320d5e9d2d5879cULL, e); |
michael@0 | 564 | EXPECT_EQ(0x4e4249d27f8414a4ULL, f); |
michael@0 | 565 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 566 | EXPECT_FALSE(cursor.Read(8, false, &g)); |
michael@0 | 567 | } |
michael@0 | 568 | |
michael@0 | 569 | TEST(Extractor, Signed1) { |
michael@0 | 570 | uint8_t data[] = { 0xfd }; |
michael@0 | 571 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 572 | ByteCursor cursor(&buffer); |
michael@0 | 573 | int8_t a; |
michael@0 | 574 | EXPECT_TRUE(cursor >> a); |
michael@0 | 575 | EXPECT_EQ(-3, a); |
michael@0 | 576 | EXPECT_FALSE(cursor >> a); |
michael@0 | 577 | } |
michael@0 | 578 | |
michael@0 | 579 | TEST(Extractor, Signed2) { |
michael@0 | 580 | uint8_t data[] = { 0x13, 0xcd }; |
michael@0 | 581 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 582 | ByteCursor cursor(&buffer); |
michael@0 | 583 | int16_t a; |
michael@0 | 584 | EXPECT_TRUE(cursor >> a); |
michael@0 | 585 | EXPECT_EQ(-13037, a); |
michael@0 | 586 | EXPECT_FALSE(cursor >> a); |
michael@0 | 587 | } |
michael@0 | 588 | |
michael@0 | 589 | TEST(Extractor, Signed4) { |
michael@0 | 590 | uint8_t data[] = { 0xd2, 0xe4, 0x53, 0xe9 }; |
michael@0 | 591 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 592 | ByteCursor cursor(&buffer); |
michael@0 | 593 | int32_t a; |
michael@0 | 594 | // For some reason, G++ 4.4.1 complains: |
michael@0 | 595 | // warning: array subscript is above array bounds |
michael@0 | 596 | // in ByteCursor::Read(size_t, bool, T *) as it inlines this call, but |
michael@0 | 597 | // I'm not able to see how such a reference would occur. |
michael@0 | 598 | EXPECT_TRUE(cursor >> a); |
michael@0 | 599 | EXPECT_EQ(-380377902, a); |
michael@0 | 600 | EXPECT_FALSE(cursor >> a); |
michael@0 | 601 | } |
michael@0 | 602 | |
michael@0 | 603 | TEST(Extractor, Unsigned1) { |
michael@0 | 604 | uint8_t data[] = { 0xfd }; |
michael@0 | 605 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 606 | ByteCursor cursor(&buffer); |
michael@0 | 607 | uint8_t a; |
michael@0 | 608 | EXPECT_TRUE(cursor >> a); |
michael@0 | 609 | EXPECT_EQ(0xfd, a); |
michael@0 | 610 | EXPECT_FALSE(cursor >> a); |
michael@0 | 611 | } |
michael@0 | 612 | |
michael@0 | 613 | TEST(Extractor, Unsigned2) { |
michael@0 | 614 | uint8_t data[] = { 0x13, 0xcd }; |
michael@0 | 615 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 616 | ByteCursor cursor(&buffer); |
michael@0 | 617 | uint16_t a; |
michael@0 | 618 | EXPECT_TRUE(cursor >> a); |
michael@0 | 619 | EXPECT_EQ(0xcd13, a); |
michael@0 | 620 | EXPECT_FALSE(cursor >> a); |
michael@0 | 621 | } |
michael@0 | 622 | |
michael@0 | 623 | TEST(Extractor, Unsigned4) { |
michael@0 | 624 | uint8_t data[] = { 0xd2, 0xe4, 0x53, 0xe9 }; |
michael@0 | 625 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 626 | ByteCursor cursor(&buffer); |
michael@0 | 627 | uint32_t a; |
michael@0 | 628 | // For some reason, G++ 4.4.1 complains: |
michael@0 | 629 | // warning: array subscript is above array bounds |
michael@0 | 630 | // in ByteCursor::Read(size_t, bool, T *) as it inlines this call, but |
michael@0 | 631 | // I'm not able to see how such a reference would occur. |
michael@0 | 632 | EXPECT_TRUE(cursor >> a); |
michael@0 | 633 | EXPECT_EQ(0xe953e4d2, a); |
michael@0 | 634 | EXPECT_FALSE(cursor >> a); |
michael@0 | 635 | EXPECT_FALSE(cursor >> a); |
michael@0 | 636 | } |
michael@0 | 637 | |
michael@0 | 638 | TEST(Extractor, Mixed) { |
michael@0 | 639 | uint8_t data[] = { 0x42, |
michael@0 | 640 | 0x25, 0x0b, |
michael@0 | 641 | 0x3d, 0x25, 0xed, 0x2a, |
michael@0 | 642 | 0xec, 0x16, 0x9e, 0x14, 0x61, 0x5b, 0x2c, 0xcf, |
michael@0 | 643 | 0xd8, |
michael@0 | 644 | 0x22, 0xa5, |
michael@0 | 645 | 0x3a, 0x02, 0x6a, 0xd7, |
michael@0 | 646 | 0x93, 0x2a, 0x2d, 0x8d, 0xb4, 0x95, 0xe0, 0xc6 }; |
michael@0 | 647 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 648 | ByteCursor cursor(&buffer); |
michael@0 | 649 | cursor.set_big_endian(true); |
michael@0 | 650 | |
michael@0 | 651 | uint8_t a; |
michael@0 | 652 | uint16_t b; |
michael@0 | 653 | uint32_t c; |
michael@0 | 654 | uint64_t d; |
michael@0 | 655 | int8_t e; |
michael@0 | 656 | int16_t f; |
michael@0 | 657 | int32_t g; |
michael@0 | 658 | int64_t h; |
michael@0 | 659 | int z; |
michael@0 | 660 | EXPECT_FALSE(cursor.AtEnd()); |
michael@0 | 661 | EXPECT_TRUE(cursor >> a >> b >> c >> d >> e >> f >> g >> h); |
michael@0 | 662 | EXPECT_EQ(0x42U, a); |
michael@0 | 663 | EXPECT_EQ(0x250bU, b); |
michael@0 | 664 | EXPECT_EQ(0x3d25ed2aU, c); |
michael@0 | 665 | EXPECT_EQ(0xec169e14615b2ccfULL, d); |
michael@0 | 666 | EXPECT_EQ(-40, e); |
michael@0 | 667 | EXPECT_EQ(0x22a5, f); |
michael@0 | 668 | EXPECT_EQ(0x3a026ad7, g); |
michael@0 | 669 | EXPECT_EQ(-7842405714468937530LL, h); |
michael@0 | 670 | |
michael@0 | 671 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 672 | EXPECT_FALSE(cursor >> z); |
michael@0 | 673 | } |
michael@0 | 674 | |
michael@0 | 675 | TEST(Strings, Zero) { |
michael@0 | 676 | uint8_t data[] = { 0xa6 }; |
michael@0 | 677 | ByteBuffer buffer(data, 0); |
michael@0 | 678 | ByteCursor cursor(&buffer); |
michael@0 | 679 | |
michael@0 | 680 | uint8_t received[1]; |
michael@0 | 681 | received[0] = 0xc2; |
michael@0 | 682 | EXPECT_TRUE(cursor.Read(received, 0)); |
michael@0 | 683 | EXPECT_EQ(0xc2U, received[0]); |
michael@0 | 684 | } |
michael@0 | 685 | |
michael@0 | 686 | TEST(Strings, Some) { |
michael@0 | 687 | uint8_t data[] = { 0x5d, 0x31, 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xbb }; |
michael@0 | 688 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 689 | ByteCursor cursor(&buffer); |
michael@0 | 690 | |
michael@0 | 691 | uint8_t received[7] = { 0xa7, 0xf7, 0x43, 0x0c, 0x27, 0xea, 0xed }; |
michael@0 | 692 | EXPECT_TRUE(cursor.Skip(2).Read(received, 5)); |
michael@0 | 693 | uint8_t expected[7] = { 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xea, 0xed }; |
michael@0 | 694 | EXPECT_TRUE(memcmp(received, expected, 7) == 0); |
michael@0 | 695 | } |
michael@0 | 696 | |
michael@0 | 697 | TEST(Strings, TooMuch) { |
michael@0 | 698 | uint8_t data[] = { 0x5d, 0x31, 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xbb }; |
michael@0 | 699 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 700 | ByteCursor cursor(&buffer); |
michael@0 | 701 | |
michael@0 | 702 | uint8_t received1[3]; |
michael@0 | 703 | uint8_t received2[3]; |
michael@0 | 704 | uint8_t received3[3]; |
michael@0 | 705 | EXPECT_FALSE(cursor |
michael@0 | 706 | .Read(received1, 3) |
michael@0 | 707 | .Read(received2, 3) |
michael@0 | 708 | .Read(received3, 3)); |
michael@0 | 709 | uint8_t expected1[3] = { 0x5d, 0x31, 0x09 }; |
michael@0 | 710 | uint8_t expected2[3] = { 0xa6, 0x2e, 0x2c }; |
michael@0 | 711 | |
michael@0 | 712 | EXPECT_TRUE(memcmp(received1, expected1, 3) == 0); |
michael@0 | 713 | EXPECT_TRUE(memcmp(received2, expected2, 3) == 0); |
michael@0 | 714 | } |
michael@0 | 715 | |
michael@0 | 716 | TEST(Strings, PointTo) { |
michael@0 | 717 | uint8_t data[] = { 0x83, 0x80, 0xb4, 0x38, 0x00, 0x2c, 0x0a, 0x27 }; |
michael@0 | 718 | ByteBuffer buffer(data, sizeof(data)); |
michael@0 | 719 | ByteCursor cursor(&buffer); |
michael@0 | 720 | |
michael@0 | 721 | const uint8_t *received1; |
michael@0 | 722 | const uint8_t *received2; |
michael@0 | 723 | const uint8_t *received3; |
michael@0 | 724 | const uint8_t *received4; |
michael@0 | 725 | EXPECT_FALSE(cursor |
michael@0 | 726 | .PointTo(&received1, 3) |
michael@0 | 727 | .PointTo(&received2, 3) |
michael@0 | 728 | .PointTo(&received3) |
michael@0 | 729 | .PointTo(&received4, 3)); |
michael@0 | 730 | EXPECT_EQ(data + 0, received1); |
michael@0 | 731 | EXPECT_EQ(data + 3, received2); |
michael@0 | 732 | EXPECT_EQ(data + 6, received3); |
michael@0 | 733 | EXPECT_EQ(NULL, received4); |
michael@0 | 734 | } |
michael@0 | 735 | |
michael@0 | 736 | TEST(Strings, CString) { |
michael@0 | 737 | uint8_t data[] = "abc\0\0foo"; |
michael@0 | 738 | ByteBuffer buffer(data, sizeof(data) - 1); // don't include terminating '\0' |
michael@0 | 739 | ByteCursor cursor(&buffer); |
michael@0 | 740 | |
michael@0 | 741 | string a, b, c; |
michael@0 | 742 | EXPECT_TRUE(cursor.CString(&a).CString(&b)); |
michael@0 | 743 | EXPECT_EQ("abc", a); |
michael@0 | 744 | EXPECT_EQ("", b); |
michael@0 | 745 | EXPECT_FALSE(cursor.CString(&c)); |
michael@0 | 746 | EXPECT_EQ("", c); |
michael@0 | 747 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 748 | } |
michael@0 | 749 | |
michael@0 | 750 | TEST(Strings, CStringLimit) { |
michael@0 | 751 | uint8_t data[] = "abcdef\0\0foobar"; |
michael@0 | 752 | ByteBuffer buffer(data, sizeof(data) - 1); // don't include terminating '\0' |
michael@0 | 753 | ByteCursor cursor(&buffer); |
michael@0 | 754 | |
michael@0 | 755 | string a, b, c, d, e; |
michael@0 | 756 | |
michael@0 | 757 | EXPECT_TRUE(cursor.CString(&a, 3)); |
michael@0 | 758 | EXPECT_EQ("abc", a); |
michael@0 | 759 | |
michael@0 | 760 | EXPECT_TRUE(cursor.CString(&b, 0)); |
michael@0 | 761 | EXPECT_EQ("", b); |
michael@0 | 762 | |
michael@0 | 763 | EXPECT_TRUE(cursor.CString(&c, 6)); |
michael@0 | 764 | EXPECT_EQ("def", c); |
michael@0 | 765 | |
michael@0 | 766 | EXPECT_TRUE(cursor.CString(&d, 4)); |
michael@0 | 767 | EXPECT_EQ("ooba", d); |
michael@0 | 768 | |
michael@0 | 769 | EXPECT_FALSE(cursor.CString(&e, 4)); |
michael@0 | 770 | EXPECT_EQ("", e); |
michael@0 | 771 | |
michael@0 | 772 | EXPECT_TRUE(cursor.AtEnd()); |
michael@0 | 773 | } |
michael@0 | 774 | |
michael@0 | 775 | // uint8_t data[] = { 0xa6, 0x54, 0xdf, 0x67, 0x51, 0x43, 0xac, 0xf1 }; |
michael@0 | 776 | // ByteBuffer buffer(data, sizeof(data)); |