1 #include <gtest/gtest.h>
2 
3 #include <ringbuffer.h>
4 
TEST(RingbufferTest,test_new_simple)5 TEST(RingbufferTest, test_new_simple) {
6   ringbuffer_t* rb = ringbuffer_init(4096);
7   ASSERT_TRUE(rb != nullptr);
8   EXPECT_EQ((size_t)4096, ringbuffer_available(rb));
9   EXPECT_EQ((size_t)0, ringbuffer_size(rb));
10   ringbuffer_free(rb);
11 }
12 
TEST(RingbufferTest,test_insert_basic)13 TEST(RingbufferTest, test_insert_basic) {
14   ringbuffer_t* rb = ringbuffer_init(16);
15 
16   uint8_t buffer[10] = {0x01, 0x02, 0x03, 0x04, 0x05,
17                         0x06, 0x07, 0x08, 0x09, 0x0A};
18   ringbuffer_insert(rb, buffer, 10);
19   EXPECT_EQ((size_t)10, ringbuffer_size(rb));
20   EXPECT_EQ((size_t)6, ringbuffer_available(rb));
21 
22   uint8_t peek[10] = {0};
23   size_t peeked = ringbuffer_peek(rb, 0, peek, 10);
24   EXPECT_EQ((size_t)10, ringbuffer_size(rb));  // Ensure size doesn't change
25   EXPECT_EQ((size_t)6, ringbuffer_available(rb));
26   EXPECT_EQ((size_t)10, peeked);
27   ASSERT_TRUE(0 == memcmp(buffer, peek, peeked));
28 
29   ringbuffer_free(rb);
30 }
31 
TEST(RingbufferTest,test_insert_full)32 TEST(RingbufferTest, test_insert_full) {
33   ringbuffer_t* rb = ringbuffer_init(5);
34 
35   uint8_t aa[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
36   uint8_t bb[] = {0xBB, 0xBB, 0xBB, 0xBB, 0xBB};
37   uint8_t peek[5] = {0};
38 
39   size_t added = ringbuffer_insert(rb, aa, 7);
40   EXPECT_EQ((size_t)5, added);
41   EXPECT_EQ((size_t)0, ringbuffer_available(rb));
42   EXPECT_EQ((size_t)5, ringbuffer_size(rb));
43 
44   added = ringbuffer_insert(rb, bb, 5);
45   EXPECT_EQ((size_t)0, added);
46   EXPECT_EQ((size_t)0, ringbuffer_available(rb));
47   EXPECT_EQ((size_t)5, ringbuffer_size(rb));
48 
49   size_t peeked = ringbuffer_peek(rb, 0, peek, 5);
50   EXPECT_EQ((size_t)5, peeked);
51   EXPECT_EQ((size_t)0, ringbuffer_available(rb));
52   EXPECT_EQ((size_t)5, ringbuffer_size(rb));
53 
54   ASSERT_TRUE(0 == memcmp(aa, peek, peeked));
55 
56   ringbuffer_free(rb);
57 }
58 
TEST(RingbufferTest,test_multi_insert_delete)59 TEST(RingbufferTest, test_multi_insert_delete) {
60   ringbuffer_t* rb = ringbuffer_init(16);
61   EXPECT_EQ((size_t)16, ringbuffer_available(rb));
62   EXPECT_EQ((size_t)0, ringbuffer_size(rb));
63 
64   // Insert some bytes
65 
66   uint8_t aa[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
67   size_t added = ringbuffer_insert(rb, aa, sizeof(aa));
68   EXPECT_EQ((size_t)8, added);
69   EXPECT_EQ((size_t)8, ringbuffer_available(rb));
70   EXPECT_EQ((size_t)8, ringbuffer_size(rb));
71 
72   uint8_t bb[] = {0xBB, 0xBB, 0xBB, 0xBB, 0xBB};
73   ringbuffer_insert(rb, bb, sizeof(bb));
74   EXPECT_EQ((size_t)3, ringbuffer_available(rb));
75   EXPECT_EQ((size_t)13, ringbuffer_size(rb));
76 
77   uint8_t content[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
78                        0xAA, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB};
79   uint8_t peek[16] = {0};
80   size_t peeked = ringbuffer_peek(rb, 0, peek, 16);
81   EXPECT_EQ((size_t)13, peeked);
82   ASSERT_TRUE(0 == memcmp(content, peek, peeked));
83 
84   // Delete some bytes
85 
86   ringbuffer_delete(rb, sizeof(aa));
87   EXPECT_EQ((size_t)11, ringbuffer_available(rb));
88   EXPECT_EQ((size_t)5, ringbuffer_size(rb));
89 
90   // Add some more to wrap buffer
91 
92   uint8_t cc[] = {0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC};
93   ringbuffer_insert(rb, cc, sizeof(cc));
94   EXPECT_EQ((size_t)2, ringbuffer_available(rb));
95   EXPECT_EQ((size_t)14, ringbuffer_size(rb));
96 
97   uint8_t content2[] = {0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xCC, 0xCC};
98   peeked = ringbuffer_peek(rb, 0, peek, 7);
99   EXPECT_EQ((size_t)7, peeked);
100   ASSERT_TRUE(0 == memcmp(content2, peek, peeked));
101 
102   // Pop buffer
103 
104   memset(peek, 0, 16);
105   size_t popped = ringbuffer_pop(rb, peek, 7);
106   EXPECT_EQ((size_t)7, popped);
107   EXPECT_EQ((size_t)9, ringbuffer_available(rb));
108   ASSERT_TRUE(0 == memcmp(content2, peek, peeked));
109 
110   // Add more again to check head motion
111 
112   uint8_t dd[] = {0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD};
113   added = ringbuffer_insert(rb, dd, sizeof(dd));
114   EXPECT_EQ((size_t)8, added);
115   EXPECT_EQ((size_t)1, ringbuffer_available(rb));
116 
117   // Delete everything
118 
119   ringbuffer_delete(rb, 16);
120   EXPECT_EQ((size_t)16, ringbuffer_available(rb));
121   EXPECT_EQ((size_t)0, ringbuffer_size(rb));
122 
123   // Add small token
124 
125   uint8_t ae[] = {0xAE, 0xAE, 0xAE};
126   added = ringbuffer_insert(rb, ae, sizeof(ae));
127   EXPECT_EQ((size_t)13, ringbuffer_available(rb));
128 
129   // Get everything
130 
131   popped = ringbuffer_pop(rb, peek, 16);
132   EXPECT_EQ(added, popped);
133   EXPECT_EQ((size_t)16, ringbuffer_available(rb));
134   EXPECT_EQ((size_t)0, ringbuffer_size(rb));
135   ASSERT_TRUE(0 == memcmp(ae, peek, popped));
136 
137   ringbuffer_free(rb);
138 }
139