xref: /aosp_15_r20/external/webrtc/rtc_base/swap_queue_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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