1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/swap_queue.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
14*d9f75844SAndroid Build Coastguard Worker #include <vector>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Worker namespace {
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard Worker // Test parameter for the basic sample based SwapQueue Tests.
23*d9f75844SAndroid Build Coastguard Worker const size_t kChunkSize = 3;
24*d9f75844SAndroid Build Coastguard Worker
25*d9f75844SAndroid Build Coastguard Worker // Queue item verification function for the vector test.
LengthVerifierFunction(const std::vector<int> & v)26*d9f75844SAndroid Build Coastguard Worker bool LengthVerifierFunction(const std::vector<int>& v) {
27*d9f75844SAndroid Build Coastguard Worker return v.size() == kChunkSize;
28*d9f75844SAndroid Build Coastguard Worker }
29*d9f75844SAndroid Build Coastguard Worker
30*d9f75844SAndroid Build Coastguard Worker // Queue item verifier for the vector test.
31*d9f75844SAndroid Build Coastguard Worker class LengthVerifierFunctor {
32*d9f75844SAndroid Build Coastguard Worker public:
LengthVerifierFunctor(size_t length)33*d9f75844SAndroid Build Coastguard Worker explicit LengthVerifierFunctor(size_t length) : length_(length) {}
34*d9f75844SAndroid Build Coastguard Worker
operator ()(const std::vector<int> & v) const35*d9f75844SAndroid Build Coastguard Worker bool operator()(const std::vector<int>& v) const {
36*d9f75844SAndroid Build Coastguard Worker return v.size() == length_;
37*d9f75844SAndroid Build Coastguard Worker }
38*d9f75844SAndroid Build Coastguard Worker
39*d9f75844SAndroid Build Coastguard Worker private:
40*d9f75844SAndroid Build Coastguard Worker size_t length_;
41*d9f75844SAndroid Build Coastguard Worker };
42*d9f75844SAndroid Build Coastguard Worker
43*d9f75844SAndroid Build Coastguard Worker } // anonymous namespace
44*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,BasicOperation)45*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, BasicOperation) {
46*d9f75844SAndroid Build Coastguard Worker std::vector<int> i(kChunkSize, 0);
47*d9f75844SAndroid Build Coastguard Worker SwapQueue<std::vector<int>> queue(2, i);
48*d9f75844SAndroid Build Coastguard Worker
49*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
50*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i.size(), kChunkSize);
51*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
52*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i.size(), kChunkSize);
53*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&i));
54*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i.size(), kChunkSize);
55*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&i));
56*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i.size(), kChunkSize);
57*d9f75844SAndroid Build Coastguard Worker }
58*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,FullQueue)59*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, FullQueue) {
60*d9f75844SAndroid Build Coastguard Worker SwapQueue<int> queue(2);
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker // Fill the queue.
63*d9f75844SAndroid Build Coastguard Worker int i = 0;
64*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
65*d9f75844SAndroid Build Coastguard Worker i = 1;
66*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
67*d9f75844SAndroid Build Coastguard Worker
68*d9f75844SAndroid Build Coastguard Worker // Ensure that the value is not swapped when doing an Insert
69*d9f75844SAndroid Build Coastguard Worker // on a full queue.
70*d9f75844SAndroid Build Coastguard Worker i = 2;
71*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Insert(&i));
72*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i, 2);
73*d9f75844SAndroid Build Coastguard Worker
74*d9f75844SAndroid Build Coastguard Worker // Ensure that the Insert didn't overwrite anything in the queue.
75*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&i));
76*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i, 0);
77*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&i));
78*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i, 1);
79*d9f75844SAndroid Build Coastguard Worker }
80*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,EmptyQueue)81*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, EmptyQueue) {
82*d9f75844SAndroid Build Coastguard Worker SwapQueue<int> queue(2);
83*d9f75844SAndroid Build Coastguard Worker int i = 0;
84*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Remove(&i));
85*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
86*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&i));
87*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Remove(&i));
88*d9f75844SAndroid Build Coastguard Worker }
89*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,Clear)90*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, Clear) {
91*d9f75844SAndroid Build Coastguard Worker SwapQueue<int> queue(2);
92*d9f75844SAndroid Build Coastguard Worker int i = 0;
93*d9f75844SAndroid Build Coastguard Worker
94*d9f75844SAndroid Build Coastguard Worker // Fill the queue.
95*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
96*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
97*d9f75844SAndroid Build Coastguard Worker
98*d9f75844SAndroid Build Coastguard Worker // Ensure full queue.
99*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Insert(&i));
100*d9f75844SAndroid Build Coastguard Worker
101*d9f75844SAndroid Build Coastguard Worker // Empty the queue.
102*d9f75844SAndroid Build Coastguard Worker queue.Clear();
103*d9f75844SAndroid Build Coastguard Worker
104*d9f75844SAndroid Build Coastguard Worker // Ensure that the queue is empty
105*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Remove(&i));
106*d9f75844SAndroid Build Coastguard Worker
107*d9f75844SAndroid Build Coastguard Worker // Ensure that the queue is no longer full.
108*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
109*d9f75844SAndroid Build Coastguard Worker }
110*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,SuccessfulItemVerifyFunction)111*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, SuccessfulItemVerifyFunction) {
112*d9f75844SAndroid Build Coastguard Worker std::vector<int> template_element(kChunkSize);
113*d9f75844SAndroid Build Coastguard Worker SwapQueue<std::vector<int>,
114*d9f75844SAndroid Build Coastguard Worker SwapQueueItemVerifier<std::vector<int>, LengthVerifierFunction>>
115*d9f75844SAndroid Build Coastguard Worker queue(2, template_element);
116*d9f75844SAndroid Build Coastguard Worker std::vector<int> valid_chunk(kChunkSize, 0);
117*d9f75844SAndroid Build Coastguard Worker
118*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&valid_chunk));
119*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(valid_chunk.size(), kChunkSize);
120*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&valid_chunk));
121*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(valid_chunk.size(), kChunkSize);
122*d9f75844SAndroid Build Coastguard Worker }
123*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,SuccessfulItemVerifyFunctor)124*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, SuccessfulItemVerifyFunctor) {
125*d9f75844SAndroid Build Coastguard Worker std::vector<int> template_element(kChunkSize);
126*d9f75844SAndroid Build Coastguard Worker LengthVerifierFunctor verifier(kChunkSize);
127*d9f75844SAndroid Build Coastguard Worker SwapQueue<std::vector<int>, LengthVerifierFunctor> queue(2, template_element,
128*d9f75844SAndroid Build Coastguard Worker verifier);
129*d9f75844SAndroid Build Coastguard Worker std::vector<int> valid_chunk(kChunkSize, 0);
130*d9f75844SAndroid Build Coastguard Worker
131*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&valid_chunk));
132*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(valid_chunk.size(), kChunkSize);
133*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&valid_chunk));
134*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(valid_chunk.size(), kChunkSize);
135*d9f75844SAndroid Build Coastguard Worker }
136*d9f75844SAndroid Build Coastguard Worker
137*d9f75844SAndroid Build Coastguard Worker #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
TEST(SwapQueueDeathTest,UnsuccessfulItemVerifyFunctor)138*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueDeathTest, UnsuccessfulItemVerifyFunctor) {
139*d9f75844SAndroid Build Coastguard Worker // Queue item verifier for the test.
140*d9f75844SAndroid Build Coastguard Worker auto minus_2_verifier = [](const int& i) { return i > -2; };
141*d9f75844SAndroid Build Coastguard Worker SwapQueue<int, decltype(minus_2_verifier)> queue(2, minus_2_verifier);
142*d9f75844SAndroid Build Coastguard Worker
143*d9f75844SAndroid Build Coastguard Worker int valid_value = 1;
144*d9f75844SAndroid Build Coastguard Worker int invalid_value = -4;
145*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&valid_value));
146*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&valid_value));
147*d9f75844SAndroid Build Coastguard Worker EXPECT_DEATH((void)queue.Insert(&invalid_value), "");
148*d9f75844SAndroid Build Coastguard Worker }
149*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueDeathTest,UnSuccessfulItemVerifyInsert)150*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueDeathTest, UnSuccessfulItemVerifyInsert) {
151*d9f75844SAndroid Build Coastguard Worker std::vector<int> template_element(kChunkSize);
152*d9f75844SAndroid Build Coastguard Worker SwapQueue<std::vector<int>,
153*d9f75844SAndroid Build Coastguard Worker SwapQueueItemVerifier<std::vector<int>, &LengthVerifierFunction>>
154*d9f75844SAndroid Build Coastguard Worker queue(2, template_element);
155*d9f75844SAndroid Build Coastguard Worker std::vector<int> invalid_chunk(kChunkSize - 1, 0);
156*d9f75844SAndroid Build Coastguard Worker EXPECT_DEATH((void)queue.Insert(&invalid_chunk), "");
157*d9f75844SAndroid Build Coastguard Worker }
158*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueDeathTest,UnSuccessfulItemVerifyRemove)159*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueDeathTest, UnSuccessfulItemVerifyRemove) {
160*d9f75844SAndroid Build Coastguard Worker std::vector<int> template_element(kChunkSize);
161*d9f75844SAndroid Build Coastguard Worker SwapQueue<std::vector<int>,
162*d9f75844SAndroid Build Coastguard Worker SwapQueueItemVerifier<std::vector<int>, &LengthVerifierFunction>>
163*d9f75844SAndroid Build Coastguard Worker queue(2, template_element);
164*d9f75844SAndroid Build Coastguard Worker std::vector<int> invalid_chunk(kChunkSize - 1, 0);
165*d9f75844SAndroid Build Coastguard Worker std::vector<int> valid_chunk(kChunkSize, 0);
166*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&valid_chunk));
167*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(valid_chunk.size(), kChunkSize);
168*d9f75844SAndroid Build Coastguard Worker EXPECT_DEATH((void)queue.Remove(&invalid_chunk), "");
169*d9f75844SAndroid Build Coastguard Worker }
170*d9f75844SAndroid Build Coastguard Worker #endif
171*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,VectorContentTest)172*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, VectorContentTest) {
173*d9f75844SAndroid Build Coastguard Worker const size_t kQueueSize = 10;
174*d9f75844SAndroid Build Coastguard Worker const size_t kFrameLength = 160;
175*d9f75844SAndroid Build Coastguard Worker const size_t kDataLength = kQueueSize * kFrameLength;
176*d9f75844SAndroid Build Coastguard Worker std::vector<int16_t> buffer_reader(kFrameLength, 0);
177*d9f75844SAndroid Build Coastguard Worker std::vector<int16_t> buffer_writer(kFrameLength, 0);
178*d9f75844SAndroid Build Coastguard Worker SwapQueue<std::vector<int16_t>> queue(kQueueSize,
179*d9f75844SAndroid Build Coastguard Worker std::vector<int16_t>(kFrameLength));
180*d9f75844SAndroid Build Coastguard Worker std::vector<int16_t> samples(kDataLength);
181*d9f75844SAndroid Build Coastguard Worker
182*d9f75844SAndroid Build Coastguard Worker for (size_t k = 0; k < kDataLength; k++) {
183*d9f75844SAndroid Build Coastguard Worker samples[k] = k % 9;
184*d9f75844SAndroid Build Coastguard Worker }
185*d9f75844SAndroid Build Coastguard Worker
186*d9f75844SAndroid Build Coastguard Worker for (size_t k = 0; k < kQueueSize; k++) {
187*d9f75844SAndroid Build Coastguard Worker buffer_writer.clear();
188*d9f75844SAndroid Build Coastguard Worker buffer_writer.insert(buffer_writer.end(), &samples[0] + k * kFrameLength,
189*d9f75844SAndroid Build Coastguard Worker &samples[0] + (k + 1) * kFrameLength);
190*d9f75844SAndroid Build Coastguard Worker
191*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&buffer_writer));
192*d9f75844SAndroid Build Coastguard Worker }
193*d9f75844SAndroid Build Coastguard Worker
194*d9f75844SAndroid Build Coastguard Worker for (size_t k = 0; k < kQueueSize; k++) {
195*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&buffer_reader));
196*d9f75844SAndroid Build Coastguard Worker
197*d9f75844SAndroid Build Coastguard Worker for (size_t j = 0; j < buffer_reader.size(); j++) {
198*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(buffer_reader[j], samples[k * kFrameLength + j]);
199*d9f75844SAndroid Build Coastguard Worker }
200*d9f75844SAndroid Build Coastguard Worker }
201*d9f75844SAndroid Build Coastguard Worker }
202*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,ZeroSlotQueue)203*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, ZeroSlotQueue) {
204*d9f75844SAndroid Build Coastguard Worker SwapQueue<int> queue(0);
205*d9f75844SAndroid Build Coastguard Worker int i = 42;
206*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Insert(&i));
207*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Remove(&i));
208*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i, 42);
209*d9f75844SAndroid Build Coastguard Worker }
210*d9f75844SAndroid Build Coastguard Worker
TEST(SwapQueueTest,OneSlotQueue)211*d9f75844SAndroid Build Coastguard Worker TEST(SwapQueueTest, OneSlotQueue) {
212*d9f75844SAndroid Build Coastguard Worker SwapQueue<int> queue(1);
213*d9f75844SAndroid Build Coastguard Worker int i = 42;
214*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Insert(&i));
215*d9f75844SAndroid Build Coastguard Worker i = 43;
216*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Insert(&i));
217*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i, 43);
218*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(queue.Remove(&i));
219*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(i, 42);
220*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(queue.Remove(&i));
221*d9f75844SAndroid Build Coastguard Worker }
222*d9f75844SAndroid Build Coastguard Worker
223*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
224