Jack He | a22dd22 | 2016-12-20 11:57:17 -0800 | [diff] [blame] | 1 | /****************************************************************************** |
| 2 | * |
Jakub Pawlowski | 5b790fe | 2017-09-18 09:00:20 -0700 | [diff] [blame] | 3 | * Copyright 2016 Google, Inc. |
Jack He | a22dd22 | 2016-12-20 11:57:17 -0800 | [diff] [blame] | 4 | * |
| 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | * you may not use this file except in compliance with the License. |
| 7 | * You may obtain a copy of the License at: |
| 8 | * |
| 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | * |
| 11 | * Unless required by applicable law or agreed to in writing, software |
| 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | * See the License for the specific language governing permissions and |
| 15 | * limitations under the License. |
| 16 | * |
| 17 | ******************************************************************************/ |
| 18 | #include <gmock/gmock.h> |
| 19 | #include <gtest/gtest.h> |
| 20 | |
| 21 | #include <base/logging.h> |
| 22 | |
Jack He | 959bc33 | 2018-08-15 12:38:37 -0700 | [diff] [blame] | 23 | #include "common/leaky_bonded_queue.h" |
Jack He | a22dd22 | 2016-12-20 11:57:17 -0800 | [diff] [blame] | 24 | |
| 25 | namespace testing { |
| 26 | |
Jack He | 959bc33 | 2018-08-15 12:38:37 -0700 | [diff] [blame] | 27 | using bluetooth::common::LeakyBondedQueue; |
Jack He | a22dd22 | 2016-12-20 11:57:17 -0800 | [diff] [blame] | 28 | |
Chih-Hung Hsieh | fc25b19 | 2017-08-01 15:04:23 -0700 | [diff] [blame] | 29 | #define ITEM_EQ(a, b) \ |
| 30 | do { \ |
| 31 | EXPECT_EQ(a, b); \ |
| 32 | EXPECT_EQ((a)->index, (b)->index); \ |
Jack He | a22dd22 | 2016-12-20 11:57:17 -0800 | [diff] [blame] | 33 | } while (0) |
| 34 | |
| 35 | class Item { |
| 36 | public: |
| 37 | Item(int i) { index = i; } |
| 38 | virtual ~Item() {} |
| 39 | int index; |
| 40 | }; |
| 41 | |
| 42 | class MockItem : public Item { |
| 43 | public: |
| 44 | MockItem(int i) : Item(i) {} |
Yi Kong | 183eace | 2019-03-29 15:42:58 -0700 | [diff] [blame] | 45 | ~MockItem() override { Destruct(); } |
Jack He | a22dd22 | 2016-12-20 11:57:17 -0800 | [diff] [blame] | 46 | MOCK_METHOD0(Destruct, void()); |
| 47 | }; |
| 48 | |
| 49 | TEST(LeakyBondedQueueTest, TestEnqueueDequeue) { |
| 50 | MockItem* item1 = new MockItem(1); |
| 51 | MockItem* item2 = new MockItem(2); |
| 52 | MockItem* item3 = new MockItem(3); |
| 53 | MockItem* item4 = new MockItem(4); |
| 54 | LeakyBondedQueue<MockItem>* queue = new LeakyBondedQueue<MockItem>(3); |
| 55 | EXPECT_EQ(queue->Capacity(), static_cast<size_t>(3)); |
| 56 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 57 | queue->Enqueue(item1); |
| 58 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 59 | queue->Enqueue(item2); |
| 60 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 61 | queue->Enqueue(item3); |
| 62 | EXPECT_EQ(queue->Length(), static_cast<size_t>(3)); |
| 63 | EXPECT_CALL(*item1, Destruct()).Times(1); |
| 64 | queue->Enqueue(item4); |
| 65 | EXPECT_EQ(queue->Length(), static_cast<size_t>(3)); |
| 66 | MockItem* item2_2 = queue->Dequeue(); |
| 67 | MockItem* item3_3 = queue->Dequeue(); |
| 68 | MockItem* item4_4 = queue->Dequeue(); |
| 69 | EXPECT_THAT(item2_2, NotNull()); |
| 70 | ITEM_EQ(item2_2, item2); |
| 71 | EXPECT_THAT(item3_3, NotNull()); |
| 72 | ITEM_EQ(item3_3, item3); |
| 73 | EXPECT_THAT(item4_4, NotNull()); |
| 74 | ITEM_EQ(item4_4, item4); |
| 75 | LOG(INFO) << "All done release items"; |
| 76 | EXPECT_CALL(*item2_2, Destruct()).Times(1); |
| 77 | delete item2_2; |
| 78 | EXPECT_CALL(*item3_3, Destruct()).Times(1); |
| 79 | delete item3_3; |
| 80 | EXPECT_CALL(*item4_4, Destruct()).Times(1); |
| 81 | delete item4_4; |
| 82 | delete queue; |
| 83 | } |
| 84 | |
| 85 | TEST(LeakyBondedQueueTest, TestEnqueueDequeue2) { |
| 86 | MockItem* item1 = new MockItem(1); |
| 87 | MockItem* item2 = new MockItem(2); |
| 88 | MockItem* item3 = new MockItem(3); |
| 89 | MockItem* item4 = new MockItem(4); |
| 90 | LeakyBondedQueue<MockItem>* queue = new LeakyBondedQueue<MockItem>(2); |
| 91 | EXPECT_EQ(queue->Capacity(), static_cast<size_t>(2)); |
| 92 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 93 | queue->Enqueue(item1); |
| 94 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 95 | MockItem* item1_1 = queue->Dequeue(); |
| 96 | ITEM_EQ(item1, item1_1); |
| 97 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 98 | queue->Enqueue(item2); |
| 99 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 100 | queue->Enqueue(item3); |
| 101 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 102 | EXPECT_CALL(*item2, Destruct()).Times(1); |
| 103 | queue->Enqueue(item4); |
| 104 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 105 | EXPECT_CALL(*item3, Destruct()).Times(1); |
| 106 | queue->Enqueue(item1); |
| 107 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 108 | MockItem* item4_4_4 = queue->Dequeue(); |
| 109 | MockItem* item1_1_1 = queue->Dequeue(); |
| 110 | ITEM_EQ(item4_4_4, item4); |
| 111 | ITEM_EQ(item1_1_1, item1); |
| 112 | EXPECT_CALL(*item1_1_1, Destruct()).Times(1); |
| 113 | delete item1_1_1; |
| 114 | EXPECT_CALL(*item4_4_4, Destruct()).Times(1); |
| 115 | delete item4_4_4; |
| 116 | delete queue; |
| 117 | } |
| 118 | |
| 119 | TEST(LeakyBondedQueueTest, TestEnqueuePop) { |
| 120 | MockItem* item1 = new MockItem(1); |
| 121 | MockItem* item2 = new MockItem(2); |
| 122 | MockItem* item3 = new MockItem(3); |
| 123 | MockItem* item4 = new MockItem(4); |
| 124 | LeakyBondedQueue<MockItem>* queue = new LeakyBondedQueue<MockItem>(2); |
| 125 | EXPECT_EQ(queue->Capacity(), static_cast<size_t>(2)); |
| 126 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 127 | queue->Enqueue(item1); |
| 128 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 129 | MockItem* item1_1 = queue->Dequeue(); |
| 130 | ITEM_EQ(item1, item1_1); |
| 131 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 132 | queue->Enqueue(item2); |
| 133 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 134 | queue->Enqueue(item3); |
| 135 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 136 | MockItem* item2_2 = queue->EnqueueWithPop(item4); |
| 137 | EXPECT_THAT(item2_2, NotNull()); |
| 138 | ITEM_EQ(item2_2, item2); |
| 139 | EXPECT_CALL(*item2, Destruct()).Times(1); |
| 140 | delete item2_2; |
| 141 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 142 | MockItem* item3_3 = queue->EnqueueWithPop(item1); |
| 143 | EXPECT_THAT(item3_3, NotNull()); |
| 144 | ITEM_EQ(item3_3, item3); |
| 145 | EXPECT_CALL(*item3, Destruct()).Times(1); |
| 146 | delete item3_3; |
| 147 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 148 | MockItem* item4_4_4 = queue->Dequeue(); |
| 149 | MockItem* item1_1_1 = queue->Dequeue(); |
| 150 | ITEM_EQ(item4_4_4, item4); |
| 151 | ITEM_EQ(item1_1_1, item1); |
| 152 | EXPECT_CALL(*item1_1_1, Destruct()).Times(1); |
| 153 | delete item1_1_1; |
| 154 | EXPECT_CALL(*item4_4_4, Destruct()).Times(1); |
| 155 | delete item4_4_4; |
| 156 | delete queue; |
| 157 | } |
| 158 | |
| 159 | TEST(LeakyBondedQueueTest, TestQueueClear) { |
| 160 | MockItem* item1 = new MockItem(1); |
| 161 | MockItem* item2 = new MockItem(2); |
| 162 | MockItem* item3 = new MockItem(3); |
| 163 | MockItem* item4 = new MockItem(4); |
| 164 | LeakyBondedQueue<MockItem>* queue = new LeakyBondedQueue<MockItem>(2); |
| 165 | EXPECT_EQ(queue->Capacity(), static_cast<size_t>(2)); |
| 166 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 167 | queue->Enqueue(item1); |
| 168 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 169 | MockItem* item1_1 = queue->Dequeue(); |
| 170 | ITEM_EQ(item1, item1_1); |
| 171 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 172 | queue->Enqueue(item2); |
| 173 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 174 | queue->Enqueue(item3); |
| 175 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 176 | EXPECT_CALL(*item2, Destruct()).Times(1); |
| 177 | queue->Enqueue(item4); |
| 178 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 179 | EXPECT_CALL(*item3, Destruct()).Times(1); |
| 180 | queue->Enqueue(item1); |
| 181 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 182 | EXPECT_CALL(*item1, Destruct()).Times(1); |
| 183 | EXPECT_CALL(*item4, Destruct()).Times(1); |
| 184 | queue->Clear(); |
| 185 | delete queue; |
| 186 | } |
| 187 | |
| 188 | TEST(LeakyBondedQueueTest, TestQueueFree) { |
| 189 | MockItem* item1 = new MockItem(1); |
| 190 | MockItem* item2 = new MockItem(2); |
| 191 | MockItem* item3 = new MockItem(3); |
| 192 | MockItem* item4 = new MockItem(4); |
| 193 | LeakyBondedQueue<MockItem>* queue = new LeakyBondedQueue<MockItem>(2); |
| 194 | EXPECT_EQ(queue->Capacity(), static_cast<size_t>(2)); |
| 195 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 196 | queue->Enqueue(item1); |
| 197 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 198 | MockItem* item1_1 = queue->Dequeue(); |
| 199 | ITEM_EQ(item1, item1_1); |
| 200 | EXPECT_EQ(queue->Length(), static_cast<size_t>(0)); |
| 201 | queue->Enqueue(item2); |
| 202 | EXPECT_EQ(queue->Length(), static_cast<size_t>(1)); |
| 203 | queue->Enqueue(item3); |
| 204 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 205 | EXPECT_CALL(*item2, Destruct()).Times(1); |
| 206 | queue->Enqueue(item4); |
| 207 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 208 | EXPECT_CALL(*item3, Destruct()).Times(1); |
| 209 | queue->Enqueue(item1); |
| 210 | EXPECT_EQ(queue->Length(), static_cast<size_t>(2)); |
| 211 | EXPECT_CALL(*item1, Destruct()).Times(1); |
| 212 | EXPECT_CALL(*item4, Destruct()).Times(1); |
| 213 | delete queue; |
| 214 | } |
| 215 | |
| 216 | TEST(LeakyBondedQueueTest, TestPushNull) { |
| 217 | MockItem* item1 = nullptr; |
| 218 | LeakyBondedQueue<MockItem>* queue = new LeakyBondedQueue<MockItem>(2); |
| 219 | queue->Enqueue(item1); |
| 220 | MockItem* item1_1 = queue->Dequeue(); |
| 221 | EXPECT_THAT(item1_1, IsNull()); |
| 222 | } |
| 223 | |
| 224 | TEST(LeakyBondedQueueTest, TestPushNullOverflowQueue) { |
| 225 | MockItem* item1 = nullptr; |
| 226 | MockItem* item2 = nullptr; |
| 227 | LeakyBondedQueue<MockItem>* queue = new LeakyBondedQueue<MockItem>(1); |
| 228 | queue->Enqueue(item1); |
| 229 | queue->Enqueue(item2); |
| 230 | MockItem* item2_2 = queue->Dequeue(); |
| 231 | EXPECT_THAT(item2_2, IsNull()); |
| 232 | } |
| 233 | |
| 234 | TEST(LeakyBondedQueueTest, TestPushNullDeleteQueue) { |
| 235 | MockItem* item1 = nullptr; |
| 236 | MockItem* item2 = nullptr; |
| 237 | LeakyBondedQueue<MockItem>* queue = new LeakyBondedQueue<MockItem>(2); |
| 238 | queue->Enqueue(item1); |
| 239 | queue->Enqueue(item2); |
| 240 | delete queue; |
| 241 | } |
Jack He | 959bc33 | 2018-08-15 12:38:37 -0700 | [diff] [blame] | 242 | } // namespace testing |