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