blob: 0b085a82f2f0d57e7e79523629d4b6d0d4213ee5 [file] [log] [blame]
Brian Silverman395d6252013-09-13 20:58:14 -07001// Copyright 2012 Google Inc. All Rights Reserved.
2// Author: charliehotel@google.com (Christopher Hoover)
3//
Brian Silverman7221e812013-09-13 22:32:12 -07004// Modified by FRC Team 971.
5//
Brian Silverman395d6252013-09-13 20:58:14 -07006// Tests for Buffer.
7
Brian Silverman7221e812013-09-13 22:32:12 -07008#include "gbuffer.h"
Brian Silverman395d6252013-09-13 20:58:14 -07009
10#include <stdint.h>
11#include <limits>
Brian Silverman7037e872013-09-14 15:35:45 -070012#include <memory>
Brian Silverman395d6252013-09-13 20:58:14 -070013
Brian Silverman395d6252013-09-13 20:58:14 -070014#include <gtest/gtest.h>
15
Brian Silverman7221e812013-09-13 22:32:12 -070016#include "aos/common/queue_testutils.h"
17
Brian Silverman395d6252013-09-13 20:58:14 -070018#define GG_LONGLONG(x) x##LL
19#define GG_ULONGLONG(x) x##ULL
20#define ARRAYSIZE(x) (static_cast<int>(sizeof(x)/sizeof(x[0])))
21
22namespace glibusb {
23namespace {
24
25typedef ::testing::Types<int8_t, int16_t, int32_t, int64_t,
26 uint8_t, uint16_t, uint32_t, uint64_t> AllIntegerTypes;
27
Brian Silverman7221e812013-09-13 22:32:12 -070028class BufferTest : public ::testing::Test {
29 public:
30 BufferTest() {
31 ::aos::common::testing::EnableTestLogging();
32 }
33};
34typedef BufferTest BufferDeathTest;
35
Brian Silverman395d6252013-09-13 20:58:14 -070036// Tests that a newly constructed buffer is empty.
Brian Silverman7221e812013-09-13 22:32:12 -070037TEST_F(BufferTest, EmptyBufferLength) {
Brian Silverman395d6252013-09-13 20:58:14 -070038 Buffer buffer;
Brian Silverman7221e812013-09-13 22:32:12 -070039 EXPECT_EQ(0u, buffer.Length());
Brian Silverman395d6252013-09-13 20:58:14 -070040}
41
42// Tests clearing.
Brian Silverman7221e812013-09-13 22:32:12 -070043TEST_F(BufferTest, EmptyBufferClear) {
Brian Silverman395d6252013-09-13 20:58:14 -070044 Buffer buffer;
45 buffer.Append(uint8_t(1));
46 buffer.Clear();
Brian Silverman7221e812013-09-13 22:32:12 -070047 EXPECT_EQ(0u, buffer.Length());
Brian Silverman395d6252013-09-13 20:58:14 -070048}
49
50// Tests resizing.
Brian Silverman7221e812013-09-13 22:32:12 -070051TEST_F(BufferTest, EmptyBufferResize) {
Brian Silverman395d6252013-09-13 20:58:14 -070052 Buffer buffer;
Brian Silverman7221e812013-09-13 22:32:12 -070053 const Buffer::size_type kSize = 100;
Brian Silverman395d6252013-09-13 20:58:14 -070054 buffer.Resize(kSize);
55 EXPECT_EQ(kSize, buffer.Length());
56}
57
58// Tests getting a pointer on an empty buffer.
Brian Silverman7221e812013-09-13 22:32:12 -070059TEST_F(BufferTest, EmptyBufferGetPointer) {
Brian Silverman395d6252013-09-13 20:58:14 -070060 Buffer buffer;
61 void *p;
62 const void *cp;
63 p = buffer.GetBufferPointer(0);
64 EXPECT_EQ(NULL, p);
65 cp = buffer.GetBufferPointer(0);
66 EXPECT_EQ(NULL, cp);
67 p = buffer.GetBufferPointer(0, 0);
68 EXPECT_EQ(NULL, p);
69 cp = buffer.GetBufferPointer(0, 0);
70 EXPECT_EQ(NULL, cp);
71}
72
73// Tests getting a pointer on an empty buffer.
Brian Silverman7221e812013-09-13 22:32:12 -070074TEST_F(BufferTest, ConstEmptyBufferGetPointer) {
Brian Silverman395d6252013-09-13 20:58:14 -070075 const Buffer buffer;
76 const void *cp;
77 cp = buffer.GetBufferPointer(0);
78 EXPECT_EQ(NULL, cp);
79 cp = buffer.GetBufferPointer(0, 0);
80 EXPECT_EQ(NULL, cp);
81}
82
83
84// Tests Get on an empty buffer.
85template <typename T>
Brian Silverman7221e812013-09-13 22:32:12 -070086class EmptyBufferGetDeathTest : public BufferTest {
Brian Silverman395d6252013-09-13 20:58:14 -070087 public:
88 void Check() {
89 Buffer buffer;
90 T value;
Brian Silverman7221e812013-09-13 22:32:12 -070091 EXPECT_DEATH(buffer.Get(0, &value), "CHECK(.*) failed");
Brian Silverman395d6252013-09-13 20:58:14 -070092 }
93};
94
95// Tests Get for all types on an empty bufer.
96TYPED_TEST_CASE(EmptyBufferGetDeathTest, AllIntegerTypes);
97TYPED_TEST(EmptyBufferGetDeathTest, Check) {
98 this->Check();
99}
100
101
102// Tests Put on an empty buffer.
103template <typename T>
Brian Silverman7221e812013-09-13 22:32:12 -0700104class EmptyBufferPutDeathTest : public BufferTest {
Brian Silverman395d6252013-09-13 20:58:14 -0700105 public:
106 void Check() {
107 Buffer buffer;
108 T value(0);
Brian Silverman7221e812013-09-13 22:32:12 -0700109 EXPECT_DEATH(buffer.Put(0, value), "CHECK(.*) failed");
Brian Silverman395d6252013-09-13 20:58:14 -0700110 }
111};
112
113// Tests Put for all types on an empty bufer.
114TYPED_TEST_CASE(EmptyBufferPutDeathTest, AllIntegerTypes);
115TYPED_TEST(EmptyBufferPutDeathTest, Check) {
116 this->Check();
117}
118
119
120// Tests getting a string on an empty buffer.
Brian Silverman7221e812013-09-13 22:32:12 -0700121TEST_F(BufferDeathTest, EmptyBufferGetString) {
Brian Silverman395d6252013-09-13 20:58:14 -0700122 Buffer buffer;
123 std::string s;
Brian Silverman7221e812013-09-13 22:32:12 -0700124 EXPECT_DEATH(buffer.Get(0, &s), "CHECK(.*) failed");
Brian Silverman395d6252013-09-13 20:58:14 -0700125}
126
127
128// Tests removing the header from an empty buffer.
Brian Silverman7221e812013-09-13 22:32:12 -0700129TEST_F(BufferDeathTest, EmptyBufferRemoveHeader) {
Brian Silverman395d6252013-09-13 20:58:14 -0700130 Buffer buffer;
131 buffer.RemoveHeader(0);
Brian Silverman7221e812013-09-13 22:32:12 -0700132 EXPECT_EQ(0u, buffer.Length());
133 EXPECT_DEATH(buffer.RemoveHeader(1), "CHECK(.*) failed");
Brian Silverman395d6252013-09-13 20:58:14 -0700134}
135
136
137// Tests adding a header of size 0.
Brian Silverman7221e812013-09-13 22:32:12 -0700138TEST_F(BufferTest, EmptyBufferAddHeader) {
Brian Silverman395d6252013-09-13 20:58:14 -0700139 Buffer buffer;
140 buffer.AddHeader(0);
Brian Silverman7221e812013-09-13 22:32:12 -0700141 EXPECT_EQ(0u, buffer.Length());
Brian Silverman395d6252013-09-13 20:58:14 -0700142}
143
144
145// Tests adding a header of size > 0.
Brian Silverman7221e812013-09-13 22:32:12 -0700146TEST_F(BufferTest, EmptyBufferAddHeader2) {
Brian Silverman395d6252013-09-13 20:58:14 -0700147 Buffer buffer;
Brian Silverman7221e812013-09-13 22:32:12 -0700148 const Buffer::size_type kSize = 100;
Brian Silverman395d6252013-09-13 20:58:14 -0700149 buffer.AddHeader(kSize);
150 EXPECT_EQ(kSize, buffer.Length());
151}
152
153
154// Tests copying an empty buffer.
Brian Silverman7221e812013-09-13 22:32:12 -0700155TEST_F(BufferTest, EmptyBufferCopy) {
Brian Silverman395d6252013-09-13 20:58:14 -0700156 Buffer buffer;
157 Buffer buffer2;
158 buffer2.Append(uint8_t(1));
159 buffer2.Copy(buffer);
Brian Silverman7221e812013-09-13 22:32:12 -0700160 EXPECT_EQ(0u, buffer2.Length());
Brian Silverman395d6252013-09-13 20:58:14 -0700161}
162
163// Tests dumping an empty buffer.
Brian Silverman7221e812013-09-13 22:32:12 -0700164TEST_F(BufferTest, EmptyBufferDump) {
Brian Silverman395d6252013-09-13 20:58:14 -0700165 Buffer buffer;
166 std::string s = buffer.Dump();
167 EXPECT_EQ("", s);
168}
169
170
171// Tests slicing an empty buffer.
Brian Silverman7221e812013-09-13 22:32:12 -0700172TEST_F(BufferTest, EmptyBufferSlice) {
Brian Silverman395d6252013-09-13 20:58:14 -0700173 Buffer buffer;
Brian Silverman7037e872013-09-14 15:35:45 -0700174 ::std::unique_ptr<Buffer> slice(buffer.MakeSlice(0, 0));
Brian Silverman7221e812013-09-13 22:32:12 -0700175 EXPECT_EQ(0u, slice->Length());
Brian Silverman395d6252013-09-13 20:58:14 -0700176}
177
178
179// Tests Get, Put and Append for signed and unsigned integers.
180template <typename T>
Brian Silverman7221e812013-09-13 22:32:12 -0700181class PutGetAppendIntegerTest : public BufferTest {
Brian Silverman395d6252013-09-13 20:58:14 -0700182 public:
183 void Check() {
184 static const T kValues[] = {
185 std::numeric_limits<T>::max(),
186 T(0),
187 std::numeric_limits<T>::min()
188 };
189
190 for (int i = 0; i < ARRAYSIZE(kValues); ++i) {
191 const T kValue = kValues[i];
192
193 // Tests Put - Get
194 {
195 Buffer buffer;
196 buffer.Resize(sizeof(T));
197 buffer.Put(0, kValue);
198 T check;
199 buffer.Get(0, &check);
200 EXPECT_EQ(kValue, check);
201 }
202
203 // Tests Append - Get
204 {
205 Buffer buffer;
206 buffer.Append(kValue);
207 T check;
208 buffer.Get(0, &check);
209 EXPECT_EQ(kValue, check);
210 }
211 }
212 }
213};
214
215// Tests Get, Put and Append for all signed integers.
216TYPED_TEST_CASE(PutGetAppendIntegerTest, AllIntegerTypes);
217TYPED_TEST(PutGetAppendIntegerTest, Check) {
218 this->Check();
219}
220
221const uint8_t kDeadBeef[] = {
222 0xef, 0xbe, 0xad, 0xde
223};
224
225// Test harness for a buffer construct from "C" data.
226class ConstructedFromDataBufferTest : public testing::Test {
227 protected:
228 void SetUp() {
229 buffer.reset(new Buffer(kDeadBeef, sizeof(kDeadBeef)));
230 }
231
Brian Silverman7037e872013-09-14 15:35:45 -0700232 ::std::unique_ptr<Buffer> buffer;
Brian Silverman395d6252013-09-13 20:58:14 -0700233};
234
235typedef ConstructedFromDataBufferTest ConstructedFromDataBufferDeathTest;
236
237// Tests constructing a buffer from "C" data.
238TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataBufferLength) {
239 EXPECT_EQ(sizeof(kDeadBeef), buffer->Length());
240}
241
242// Tests that a buffer constructed from "C" data contains the right
243// data.
244TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataByteAccess) {
245 for (int i = 0; i < ARRAYSIZE(kDeadBeef); ++i) {
246 uint8_t u8;
247 buffer->Get(i, &u8);
248 EXPECT_EQ(kDeadBeef[i], u8);
249 }
250}
251
252// Tests clearing.
253TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataClear) {
254 buffer->Clear();
Brian Silverman7221e812013-09-13 22:32:12 -0700255 EXPECT_EQ(0u, buffer->Length());
Brian Silverman395d6252013-09-13 20:58:14 -0700256}
257
258// Tests resizing.
259TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataResize) {
Brian Silverman7221e812013-09-13 22:32:12 -0700260 const Buffer::size_type kSize = 100;
Brian Silverman395d6252013-09-13 20:58:14 -0700261 buffer->Resize(kSize);
262 EXPECT_EQ(kSize, buffer->Length());
263}
264
265// Tests that getting a pointer works.
266TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataGetPointer) {
267 void *p;
268 const void *cp;
269 p = buffer->GetBufferPointer(0);
270 EXPECT_EQ(NULL, p);
271 cp = buffer->GetBufferPointer(0);
272 EXPECT_EQ(NULL, cp);
273 p = buffer->GetBufferPointer(0, 0);
274 EXPECT_EQ(NULL, p);
275 cp = buffer->GetBufferPointer(0, 0);
276 EXPECT_EQ(NULL, cp);
277
278 p = buffer->GetBufferPointer(2);
279 EXPECT_TRUE(p != NULL);
280 EXPECT_EQ(kDeadBeef[0], *static_cast<uint8_t *>(p));
281 EXPECT_EQ(kDeadBeef[1], *(static_cast<uint8_t *>(p) + 1));
282 cp = buffer->GetBufferPointer(2);
283 EXPECT_TRUE(p != NULL);
284 EXPECT_EQ(kDeadBeef[0], *static_cast<uint8_t *>(p));
285 EXPECT_EQ(kDeadBeef[1], *(static_cast<uint8_t *>(p) + 1));
286
287 p = buffer->GetBufferPointer(1, 2);
288 EXPECT_TRUE(p != NULL);
289 EXPECT_EQ(kDeadBeef[1], *static_cast<uint8_t *>(p));
290 EXPECT_EQ(kDeadBeef[2], *(static_cast<uint8_t *>(p) + 1));
291 cp = buffer->GetBufferPointer(1, 2);
292 EXPECT_TRUE(p != NULL);
293 EXPECT_EQ(kDeadBeef[1], *static_cast<uint8_t *>(p));
294 EXPECT_EQ(kDeadBeef[2], *(static_cast<uint8_t *>(p) + 1));
295
296 const Buffer &const_buffer(*buffer);
297 cp = const_buffer.GetBufferPointer(1, 2);
298 EXPECT_TRUE(p != NULL);
299 EXPECT_EQ(kDeadBeef[1], *static_cast<uint8_t *>(p));
300 EXPECT_EQ(kDeadBeef[2], *(static_cast<uint8_t *>(p) + 1));
301}
302
303// Tests that Get{S,U}{8,16,32,64} work on zero.
Brian Silverman7221e812013-09-13 22:32:12 -0700304TEST_F(BufferTest, GetZero) {
Brian Silverman7037e872013-09-14 15:35:45 -0700305 ::std::unique_ptr<Buffer> buffer(new Buffer());
Brian Silverman395d6252013-09-13 20:58:14 -0700306 for (int i = 0; i < 8; ++i) {
307 buffer->Append(uint8_t(0));
308 }
309 int8_t s8;
310 uint8_t u8;
311 int16_t s16;
312 uint16_t u16;
313 int32_t s32;
314 uint32_t u32;
315 int64_t s64;
316 uint64_t u64;
317 buffer->Get(0, &s8);
318 EXPECT_EQ(0, s8);
319 buffer->Get(0, &u8);
Brian Silverman7221e812013-09-13 22:32:12 -0700320 EXPECT_EQ(0u, u8);
Brian Silverman395d6252013-09-13 20:58:14 -0700321 buffer->Get(0, &s16);
322 EXPECT_EQ(0, s16);
323 buffer->Get(0, &u16);
Brian Silverman7221e812013-09-13 22:32:12 -0700324 EXPECT_EQ(0u, u16);
Brian Silverman395d6252013-09-13 20:58:14 -0700325 buffer->Get(0, &s32);
326 EXPECT_EQ(0, s32);
327 buffer->Get(0, &u32);
Brian Silverman7221e812013-09-13 22:32:12 -0700328 EXPECT_EQ(0u, u32);
Brian Silverman395d6252013-09-13 20:58:14 -0700329 buffer->Get(0, &s64);
330 EXPECT_EQ(0, s64);
331 buffer->Get(0, &u64);
Brian Silverman7221e812013-09-13 22:32:12 -0700332 EXPECT_EQ(0u, u64);
Brian Silverman395d6252013-09-13 20:58:14 -0700333}
334
335// Tests that GetU{8,16,32,64} work.
Brian Silverman7221e812013-09-13 22:32:12 -0700336TEST_F(BufferTest, GetUXX) {
Brian Silverman7037e872013-09-14 15:35:45 -0700337 ::std::unique_ptr<Buffer> buffer(new Buffer());
Brian Silverman395d6252013-09-13 20:58:14 -0700338 buffer->Append(uint8_t(0x88));
339 buffer->Append(uint8_t(0x77));
340 buffer->Append(uint8_t(0x66));
341 buffer->Append(uint8_t(0x55));
342 buffer->Append(uint8_t(0x44));
343 buffer->Append(uint8_t(0x33));
344 buffer->Append(uint8_t(0x22));
345 buffer->Append(uint8_t(0x11));
346 uint8_t u8;
347 uint16_t u16;
348 uint32_t u32;
349 uint64_t u64;
350 buffer->Get(0, &u8);
Brian Silverman7221e812013-09-13 22:32:12 -0700351 EXPECT_EQ(0x88u, u8);
Brian Silverman395d6252013-09-13 20:58:14 -0700352 buffer->Get(0, &u16);
Brian Silverman7221e812013-09-13 22:32:12 -0700353 EXPECT_EQ(0x7788u, u16);
Brian Silverman395d6252013-09-13 20:58:14 -0700354 buffer->Get(0, &u32);
Brian Silverman7221e812013-09-13 22:32:12 -0700355 EXPECT_EQ(0x55667788u, u32);
Brian Silverman395d6252013-09-13 20:58:14 -0700356 buffer->Get(0, &u64);
357 EXPECT_EQ(GG_ULONGLONG(0x1122334455667788), u64);
358}
359
360// Tests that GetS{8,16,32,64} work for positive values.
Brian Silverman7221e812013-09-13 22:32:12 -0700361TEST_F(BufferTest, GetSXXPositive) {
Brian Silverman7037e872013-09-14 15:35:45 -0700362 ::std::unique_ptr<Buffer> buffer(new Buffer());
Brian Silverman395d6252013-09-13 20:58:14 -0700363 buffer->Append(uint8_t(0x08));
364 buffer->Append(uint8_t(0x07));
365 buffer->Append(uint8_t(0x06));
366 buffer->Append(uint8_t(0x05));
367 buffer->Append(uint8_t(0x04));
368 buffer->Append(uint8_t(0x03));
369 buffer->Append(uint8_t(0x02));
370 buffer->Append(uint8_t(0x01));
371 int8_t s8;
372 int16_t s16;
373 int32_t s32;
374 int64_t s64;
375 buffer->Get(0, &s8);
376 EXPECT_EQ(0x08, s8);
377 buffer->Get(0, &s16);
378 EXPECT_EQ(0x0708, s16);
379 buffer->Get(0, &s32);
380 EXPECT_EQ(0x05060708, s32);
381 buffer->Get(0, &s64);
Brian Silverman7221e812013-09-13 22:32:12 -0700382 EXPECT_EQ(GG_LONGLONG(0x0102030405060708), s64);
Brian Silverman395d6252013-09-13 20:58:14 -0700383}
384
385// Tests that GetS{8,16,32,64} work for negative values.
Brian Silverman7221e812013-09-13 22:32:12 -0700386TEST_F(BufferTest, GetSXXNegative) {
Brian Silverman7037e872013-09-14 15:35:45 -0700387 ::std::unique_ptr<Buffer> buffer(new Buffer());
Brian Silverman395d6252013-09-13 20:58:14 -0700388 buffer->Append(uint8_t(0xF8));
389 buffer->Append(uint8_t(0xF7));
390 buffer->Append(uint8_t(0x06));
391 buffer->Append(uint8_t(0xF5));
392 buffer->Append(uint8_t(0x04));
393 buffer->Append(uint8_t(0x03));
394 buffer->Append(uint8_t(0x02));
395 buffer->Append(uint8_t(0xF1));
396
397 // Calculate directly the the signed (2's complement) value that we
398 // should expect.
399 const int8_t kExpected8 = 0xF8 - 0xFF - 1;
400 int8_t s8;
401 buffer->Get(0, &s8);
402 EXPECT_EQ(kExpected8, s8);
403
404 const int16_t kExpected16 = 0xF7F8 - 0xFFFF - 1;
405 int16_t s16;
406 buffer->Get(0, &s16);
407 EXPECT_EQ(kExpected16, s16);
408
409 const int32_t kExpected32 = 0xF506F7F8 - 0xFFFFFFFF - 1;
410 int32_t s32;
411 buffer->Get(0, &s32);
412 EXPECT_EQ(kExpected32, s32);
413
414 const int64_t kExpected64 = (GG_LONGLONG(0xF1020304F506F7F8) -
415 GG_LONGLONG(0xFFFFFFFFFFFFFFFF) -
416 GG_LONGLONG(1));
417 int64_t s64;
418 buffer->Get(0, &s64);
419 EXPECT_EQ(kExpected64, s64);
420}
421
422// Tests that getting a string works.
423TEST_F(ConstructedFromDataBufferDeathTest, ConstructedFromDataGetString) {
424 std::string s;
Brian Silverman7221e812013-09-13 22:32:12 -0700425 EXPECT_DEATH(buffer->Get(0, &s), "CHECK(.*) failed");
Brian Silverman395d6252013-09-13 20:58:14 -0700426 buffer->Append(uint8_t(0));
427 Buffer::size_type n = buffer->Get(0, &s);
428 EXPECT_STREQ("\xEF\xBE\xAD\xDE", s.c_str());
Brian Silverman7221e812013-09-13 22:32:12 -0700429 EXPECT_EQ(4u, n);
Brian Silverman395d6252013-09-13 20:58:14 -0700430 n = buffer->Get(1, &s);
431 EXPECT_STREQ("\xBE\xAD\xDE", s.c_str());
Brian Silverman7221e812013-09-13 22:32:12 -0700432 EXPECT_EQ(4u, n);
Brian Silverman395d6252013-09-13 20:58:14 -0700433}
434
435// Tests removing a header.
436TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataRemoveHeader) {
437 buffer->RemoveHeader(0);
438 EXPECT_EQ(sizeof(kDeadBeef), buffer->Length());
439 buffer->RemoveHeader(2);
440 EXPECT_EQ(sizeof(kDeadBeef) - 2, buffer->Length());
441 uint16_t u16;
442 buffer->Get(0, &u16);
Brian Silverman7221e812013-09-13 22:32:12 -0700443 EXPECT_EQ(0xdeadu, u16);
Brian Silverman395d6252013-09-13 20:58:14 -0700444}
445
446// Tests adding a zero-length header.
447TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataAddHeader) {
448 buffer->AddHeader(0);
449 EXPECT_EQ(sizeof(kDeadBeef), buffer->Length());
450}
451
452// Tests adding a header of size > 0.
453TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataAddHeader2) {
454 const int kSize = 100;
455 buffer->AddHeader(kSize);
456 EXPECT_EQ(sizeof(kDeadBeef) + kSize, buffer->Length());
457 uint32_t u32;
458 buffer->Get(kSize, &u32);
Brian Silverman7221e812013-09-13 22:32:12 -0700459 EXPECT_EQ(0xdeadbeefu, u32);
Brian Silverman395d6252013-09-13 20:58:14 -0700460}
461
462// Tests copying.
463TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataCopy) {
464 buffer->Append(uint8_t(0));
465 std::string s;
466 buffer->Get(0, &s);
467
468 Buffer buffer2;
469 buffer2.Copy(*buffer);
470 std::string s2;
471 buffer2.Get(0, &s2);
472
473 EXPECT_STREQ(s.c_str(), s2.c_str());
474}
475
476// Tests dumping.
477TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataDump) {
478 const char kExpected[] =
479 "0x00000000: ef be ad de | ....\n";
480 std::string s = buffer->Dump();
481 EXPECT_STREQ(kExpected, s.c_str());
482}
483
484// Tests emtpy slicing.
485TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataSlice) {
Brian Silverman7037e872013-09-14 15:35:45 -0700486 ::std::unique_ptr<Buffer> slice(buffer->MakeSlice(0, 0));
Brian Silverman7221e812013-09-13 22:32:12 -0700487 EXPECT_EQ(0u, slice->Length());
Brian Silverman395d6252013-09-13 20:58:14 -0700488}
489
490// Tests slicing.
491TEST_F(ConstructedFromDataBufferTest, ConstructedFromDataSlice2) {
Brian Silverman7037e872013-09-14 15:35:45 -0700492 ::std::unique_ptr<Buffer> slice(buffer->MakeSlice(0, 2));
Brian Silverman7221e812013-09-13 22:32:12 -0700493 EXPECT_EQ(2u, slice->Length());
Brian Silverman395d6252013-09-13 20:58:14 -0700494 uint16_t u16;
495 slice->Get(0, &u16);
Brian Silverman7221e812013-09-13 22:32:12 -0700496 EXPECT_EQ(0xbeefu, u16);
Brian Silverman395d6252013-09-13 20:58:14 -0700497}
498
499// Tests dumping.
Brian Silverman7221e812013-09-13 22:32:12 -0700500TEST_F(BufferTest, DumpTest) {
Brian Silverman395d6252013-09-13 20:58:14 -0700501 const char kData[] = "Hello";
502 const char kExpected[] =
503 "0x00000000: 48 65 6c 6c 6f 00 "
504 " | Hello.\n";
505 Buffer buffer(kData, sizeof(kData));
506 std::string s = buffer.Dump();
507 EXPECT_STREQ(kExpected, s.c_str());
508}
509
510#if 0
511// Tests writing to a file.
Brian Silverman7221e812013-09-13 22:32:12 -0700512TEST_F(BufferTest, FileTest) {
Brian Silverman395d6252013-09-13 20:58:14 -0700513 const char kData[] = "Hello";
514 Buffer buffer(kData, sizeof(kData));
515 string out;
516 FileCloser file(MutableStringFile("file", &out,
517 DO_NOT_TAKE_OWNERSHIP,
518 DO_NOT_ALLOW_MMAP));
519 buffer.WriteOrDie(file.get());
520 EXPECT_STREQ(kData, out.c_str());
521}
522
Brian Silverman7221e812013-09-13 22:32:12 -0700523TEST_F(BufferTest, WritePathOrDieTest) {
Brian Silverman395d6252013-09-13 20:58:14 -0700524 const char kData[] = "Hello";
525 Buffer buffer(kData, sizeof(kData));
526 buffer.WriteToPathOrDie("/dev/null");
527}
528#endif
529
530// Tests appending.
Brian Silverman7221e812013-09-13 22:32:12 -0700531TEST_F(BufferTest, AppendBuffer) {
Brian Silverman395d6252013-09-13 20:58:14 -0700532 const char kData1[] = "Hello ";
533 const char kData2[] = "World";
534 Buffer buffer1(kData1, sizeof(kData1) - 1);
535 EXPECT_EQ(sizeof(kData1) - 1, buffer1.Length());
536 Buffer buffer2(kData2, sizeof(kData2));
537 EXPECT_EQ(sizeof(kData2), buffer2.Length());
538 Buffer buffer;
Brian Silverman7221e812013-09-13 22:32:12 -0700539 EXPECT_EQ(0u, buffer.Length());
Brian Silverman395d6252013-09-13 20:58:14 -0700540 buffer.Append(Buffer());
541 buffer.Append(buffer1);
542 buffer.Append(buffer2);
543 std::string s;
544 buffer.Get(0, &s);
545 EXPECT_STREQ("Hello World", s.c_str());
546}
547
548// Tests operator==
Brian Silverman7221e812013-09-13 22:32:12 -0700549TEST_F(BufferTest, OpEqualTrue) {
Brian Silverman395d6252013-09-13 20:58:14 -0700550 Buffer b1;
551 Buffer b2;
552 EXPECT_EQ(b1, b2);
553 b1.Append(uint8_t(1));
554 b2.Append(uint8_t(1));
555 EXPECT_EQ(b1, b2);
556}
557
558// Tests operator==
Brian Silverman7221e812013-09-13 22:32:12 -0700559TEST_F(BufferTest, OpEqualFalse) {
Brian Silverman395d6252013-09-13 20:58:14 -0700560 Buffer empty;
561 Buffer b1;
562 Buffer b2;
563 Buffer b12;
564 b1.Append(uint8_t(1));
565 b2.Append(uint8_t(2));
566 b12.Append(uint8_t(1));
567 b12.Append(uint8_t(2));
568 EXPECT_NE(empty, b1);
569 EXPECT_NE(b1, empty);
570 EXPECT_NE(b1, b2);
571 EXPECT_NE(b1, b12);
572 EXPECT_NE(b12, b1);
573}
574
Brian Silverman7221e812013-09-13 22:32:12 -0700575TEST_F(BufferTest, Dump) {
Brian Silverman395d6252013-09-13 20:58:14 -0700576 Buffer b;
577 b.Append(uint8_t(1));
578 std::string s = b.Dump();
579}
580
581} // namespace
582} // namespace glibusb