blob: 0e44bf2095b193d030c45e67c0374747822b5825 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "rtc_base/memory/fifo_buffer.h"
12
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <string.h>
14
15#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000016
17namespace rtc {
18
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000019TEST(FifoBufferTest, TestAll) {
Niels Möller83830f32022-05-20 09:12:57 +020020 rtc::AutoThread main_thread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000021 const size_t kSize = 16;
22 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
23 char out[kSize * 2];
24 void* p;
25 const void* q;
26 size_t bytes;
27 FifoBuffer buf(kSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000028
29 // Test assumptions about base state
Niels Möllera8fa2d02018-10-31 10:19:50 +010030 EXPECT_EQ(SS_OPEN, buf.GetState());
31 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
32 EXPECT_TRUE(nullptr != buf.GetWriteBuffer(&bytes));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000033 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010034 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000035
36 // Try a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +010037 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000038 EXPECT_EQ(kSize, bytes);
39
40 // Try a write that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +010041 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000042
43 // Try a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +010044 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000045 EXPECT_EQ(kSize, bytes);
46 EXPECT_EQ(0, memcmp(in, out, kSize));
47
48 // Try a read that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +010049 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000050
51 // Try a too-big write
Niels Möllera8fa2d02018-10-31 10:19:50 +010052 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000053 EXPECT_EQ(bytes, kSize);
54
55 // Try a too-big read
Niels Möllera8fa2d02018-10-31 10:19:50 +010056 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000057 EXPECT_EQ(kSize, bytes);
58 EXPECT_EQ(0, memcmp(in, out, kSize));
59
60 // Try some small writes and reads
Niels Möllera8fa2d02018-10-31 10:19:50 +010061 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000062 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010063 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000064 EXPECT_EQ(kSize / 2, bytes);
65 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010066 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000067 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010068 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000069 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010070 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000071 EXPECT_EQ(kSize / 2, bytes);
72 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010073 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000074 EXPECT_EQ(kSize / 2, bytes);
75 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
76
77 // Try wraparound reads and writes in the following pattern
78 // WWWWWWWWWWWW.... 0123456789AB....
79 // RRRRRRRRXXXX.... ........89AB....
80 // WWWW....XXXXWWWW 4567....89AB0123
81 // XXXX....RRRRXXXX 4567........0123
82 // XXXXWWWWWWWWXXXX 4567012345670123
83 // RRRRXXXXXXXXRRRR ....01234567....
84 // ....RRRRRRRR.... ................
Niels Möllera8fa2d02018-10-31 10:19:50 +010085 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086 EXPECT_EQ(kSize * 3 / 4, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010087 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000088 EXPECT_EQ(kSize / 2, bytes);
89 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +010090 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000091 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010092 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 4, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +020093 EXPECT_EQ(kSize / 4, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +010095 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000096 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +010097 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +020098 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000099 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100100 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200101 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000102 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
103
104 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100105 buf.GetWriteBuffer(&bytes);
106 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000107
108 // Try using GetReadData to do a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100109 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
110 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800111 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000112 EXPECT_EQ(kSize, bytes);
113 EXPECT_EQ(0, memcmp(q, in, kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100114 buf.ConsumeReadData(kSize);
115 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000116
117 // Try using GetReadData to do some small reads
Niels Möllera8fa2d02018-10-31 10:19:50 +0100118 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
119 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800120 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000121 EXPECT_EQ(kSize, bytes);
122 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100123 buf.ConsumeReadData(kSize / 2);
124 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800125 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000126 EXPECT_EQ(kSize / 2, bytes);
127 EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100128 buf.ConsumeReadData(kSize / 2);
129 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000130
131 // Try using GetReadData in a wraparound case
132 // WWWWWWWWWWWWWWWW 0123456789ABCDEF
133 // RRRRRRRRRRRRXXXX ............CDEF
134 // WWWWWWWW....XXXX 01234567....CDEF
135 // ............RRRR 01234567........
136 // RRRRRRRR........ ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100137 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
138 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
139 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
140 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800141 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000142 EXPECT_EQ(kSize / 4, bytes);
143 EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100144 buf.ConsumeReadData(kSize / 4);
145 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800146 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000147 EXPECT_EQ(kSize / 2, bytes);
148 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100149 buf.ConsumeReadData(kSize / 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000150
151 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100152 buf.GetWriteBuffer(&bytes);
153 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154
155 // Try using GetWriteBuffer to do a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100156 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800157 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000158 EXPECT_EQ(kSize, bytes);
159 memcpy(p, in, kSize);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100160 buf.ConsumeWriteBuffer(kSize);
161 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000162 EXPECT_EQ(kSize, bytes);
163 EXPECT_EQ(0, memcmp(in, out, kSize));
164
165 // Try using GetWriteBuffer to do some small writes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100166 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800167 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000168 EXPECT_EQ(kSize, bytes);
169 memcpy(p, in, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100170 buf.ConsumeWriteBuffer(kSize / 2);
171 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800172 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000173 EXPECT_EQ(kSize / 2, bytes);
174 memcpy(p, in + kSize / 2, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100175 buf.ConsumeWriteBuffer(kSize / 2);
176 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000177 EXPECT_EQ(kSize, bytes);
178 EXPECT_EQ(0, memcmp(in, out, kSize));
179
180 // Try using GetWriteBuffer in a wraparound case
181 // WWWWWWWWWWWW.... 0123456789AB....
182 // RRRRRRRRXXXX.... ........89AB....
183 // ........XXXXWWWW ........89AB0123
184 // WWWW....XXXXXXXX 4567....89AB0123
185 // RRRR....RRRRRRRR ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100186 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
187 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
188 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800189 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000190 EXPECT_EQ(kSize / 4, bytes);
191 memcpy(p, in, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100192 buf.ConsumeWriteBuffer(kSize / 4);
193 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800194 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000195 EXPECT_EQ(kSize / 2, bytes);
196 memcpy(p, in + kSize / 4, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100197 buf.ConsumeWriteBuffer(kSize / 4);
198 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000199 EXPECT_EQ(kSize * 3 / 4, bytes);
200 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
201 EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
202
203 // Check that the stream is now empty
Niels Möllera8fa2d02018-10-31 10:19:50 +0100204 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000205
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000206 // Write to the stream, close it, read the remaining bytes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100207 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
208 buf.Close();
209 EXPECT_EQ(SS_CLOSED, buf.GetState());
210 EXPECT_EQ(SR_EOS, buf.Write(in, kSize / 2, &bytes, nullptr));
211 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000212 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100213 EXPECT_EQ(SR_EOS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000214}
215
216TEST(FifoBufferTest, FullBufferCheck) {
Niels Möller83830f32022-05-20 09:12:57 +0200217 rtc::AutoThread main_thread;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000218 FifoBuffer buff(10);
219 buff.ConsumeWriteBuffer(10);
220
221 size_t free;
deadbeef37f5ecf2017-02-27 14:06:41 -0800222 EXPECT_TRUE(buff.GetWriteBuffer(&free) != nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000223 EXPECT_EQ(0U, free);
224}
225
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000226} // namespace rtc