blob: 689ed2457863d009b0bcb5aa2b612ff521be008a [file] [log] [blame]
Austin Schuh25356e22019-09-11 19:27:07 -07001#include "aos/ipc_lib/index.h"
2
3#include "aos/testing/test_logging.h"
4#include "gtest/gtest.h"
5
6namespace aos {
7namespace ipc_lib {
8namespace testing {
9
10class QueueIndexTest : public ::testing::Test {
11 protected:
12 uint32_t GetIndex(const QueueIndex &index) {
13 printf("Index, count: %x, %x\n", index.index_, index.count_);
14 return index.index();
15 }
16
17 QueueIndex Make(uint32_t index, uint32_t count) {
18 return QueueIndex(index, count);
19 }
20};
21
22// Tests that an invalid index is invalid.
23TEST_F(QueueIndexTest, TestValid) {
24 QueueIndex invalid = QueueIndex::Invalid();
25
26 EXPECT_EQ(0xffffffff, GetIndex(invalid));
27 EXPECT_FALSE(invalid.valid());
28
29 QueueIndex valid = Make(5, 7);
30
31 EXPECT_TRUE(valid.valid());
32}
33
34// Tests that the max index function returns the max index as expected.
35TEST_F(QueueIndexTest, TestMaxIndex) {
36 EXPECT_EQ(QueueIndex::MaxIndex(12u, 4u), 12u);
37 EXPECT_EQ(QueueIndex::MaxIndex(13u, 4u), 12u);
38 EXPECT_EQ(QueueIndex::MaxIndex(14u, 4u), 12u);
39 EXPECT_EQ(QueueIndex::MaxIndex(15u, 4u), 12u);
40 EXPECT_EQ(QueueIndex::MaxIndex(16u, 4u), 16u);
41}
42
43// Tests that incrementing an index works as expected.
44TEST_F(QueueIndexTest, TestIncrement) {
45 QueueIndex zero = Make(0, 3);
46
47 EXPECT_EQ(GetIndex(zero), 0u);
48
49 QueueIndex one = zero.Increment();
50 EXPECT_EQ(GetIndex(one), 1u);
51
52 // Try it with a base 3. Apparently 3 fits exactly.
53 {
54 QueueIndex two_below = Make(QueueIndex::MaxIndex(0xffffffffu, 3u) - 2, 3);
55 EXPECT_EQ(GetIndex(two_below), 0xfffffffdu);
56
57 QueueIndex one_below = two_below.Increment();
58 EXPECT_EQ(GetIndex(one_below), 0xfffffffeu);
59
60 QueueIndex wrapped = one_below.Increment();
61 EXPECT_EQ(GetIndex(wrapped), 0);
62
63 EXPECT_EQ(wrapped, zero);
64 }
65
66 // Now try it with base 4. Should still work.
67 {
68 QueueIndex two_below = Make(QueueIndex::MaxIndex(0xffffffffu, 4u) - 2, 4);
69 EXPECT_EQ(GetIndex(two_below), 0xfffffffau);
70
71 QueueIndex one_below = two_below.Increment();
72 EXPECT_EQ(GetIndex(one_below), 0xfffffffbu);
73
74 QueueIndex wrapped = one_below.Increment();
75 EXPECT_EQ(GetIndex(wrapped), 0);
76 }
77}
78
79// Tests that decrementing and incrementing again an index works as expected.
80TEST_F(QueueIndexTest, TestDecrement) {
81 {
82 QueueIndex zero = Make(0, 3);
83 EXPECT_EQ(GetIndex(zero), 0x00000000u);
84
85 QueueIndex negative10 = zero.DecrementBy(10);
86 EXPECT_EQ(GetIndex(negative10), 0xffffffff - 10);
87
88 EXPECT_EQ(zero, negative10.IncrementBy(10));
89 }
90 {
91 QueueIndex zero = Make(0, 4);
92 EXPECT_EQ(GetIndex(zero), 0x00000000u);
93
94 QueueIndex negative10 = zero.DecrementBy(10);
95 EXPECT_EQ(GetIndex(negative10), 0xfffffffc - 10);
96
97 EXPECT_EQ(zero, negative10.IncrementBy(10));
98 }
99
100 {
101 QueueIndex five = Make(5, 3);
102 EXPECT_EQ(GetIndex(five), 5u);
103
104 QueueIndex negative10 = five.DecrementBy(10);
105 EXPECT_EQ(GetIndex(negative10), 0xffffffff - 5);
106
107 EXPECT_EQ(five, negative10.IncrementBy(10));
108 }
109 {
110 QueueIndex five = Make(5, 4);
111 EXPECT_EQ(GetIndex(five), 5u);
112
113 QueueIndex negative10 = five.DecrementBy(10);
114 EXPECT_EQ(GetIndex(negative10), 0xfffffffc - 5);
115
116 EXPECT_EQ(five, negative10.IncrementBy(10));
117 }
118}
119
120// Tests that an invalid index is invalid, and a valid one is valid.
121TEST(IndexTest, TestInvalid) {
122 EXPECT_FALSE(Index::Invalid().valid());
123
124 EXPECT_TRUE(Index(0, 0).valid());
125}
126
127// Tests that we get back the two indices as expected.
128TEST(IndexTest, TestRecoverIndices) {
129 QueueIndex five = QueueIndex::Zero(100).IncrementBy(5);
130 Index index(five, 11);
131 EXPECT_EQ(index.queue_index(), 5);
132 EXPECT_EQ(index.message_index(), 11);
133}
134
135// Tests that Plausible behaves.
136TEST(IndexTest, TestPlausible) {
137 QueueIndex five = QueueIndex::Zero(100).IncrementBy(5);
138 QueueIndex ffff = QueueIndex::Zero(100).IncrementBy(0xffff);
139
140 // Tests that if five has wrapped, we still return plausible.
141 for (int i = 0; i < 100; ++i) {
142 Index index(five, i);
143 EXPECT_EQ(index.queue_index(), 5);
144
145 EXPECT_TRUE(index.IsPlausible(five));
146
147 EXPECT_EQ(index.message_index(), i);
148
149 five = five.IncrementBy(0x10000);
150 }
151
152 // Tests that a queue index with a value of 0xffff doesn't match an invalid
153 // index.
154 for (int i = 0; i < 100; ++i) {
155 Index index(ffff, i);
156 EXPECT_EQ(index.queue_index(), 0xffff);
157
158 EXPECT_TRUE(index.IsPlausible(ffff));
159 EXPECT_FALSE(index.IsPlausible(QueueIndex::Invalid()));
160
161 EXPECT_EQ(index.message_index(), i);
162 }
163}
164
165} // namespace testing
166} // namespace ipc_lib
167} // namespace aos