toolkit/crashreporter/google-breakpad/src/common/byte_cursor_unittest.cc

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

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));

mercurial