blob: 2ca2526c3caaea70f4543c09862b4bbcfaf4cda7 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "rtc_base/stream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020012#include "rtc_base/gunit.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
14namespace rtc {
15
16///////////////////////////////////////////////////////////////////////////////
17// TestStream
18///////////////////////////////////////////////////////////////////////////////
19
20class TestStream : public StreamInterface {
21 public:
Yves Gerey665174f2018-06-19 15:03:05 +020022 TestStream() : pos_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000023
Steve Anton9de3aac2017-10-24 10:08:26 -070024 StreamState GetState() const override { return SS_OPEN; }
25
26 StreamResult Read(void* buffer,
27 size_t buffer_len,
28 size_t* read,
29 int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000030 unsigned char* uc_buffer = static_cast<unsigned char*>(buffer);
31 for (size_t i = 0; i < buffer_len; ++i) {
32 uc_buffer[i] = static_cast<unsigned char>(pos_++);
33 }
34 if (read)
35 *read = buffer_len;
36 return SR_SUCCESS;
37 }
Steve Anton9de3aac2017-10-24 10:08:26 -070038
39 StreamResult Write(const void* data,
40 size_t data_len,
41 size_t* written,
42 int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000043 if (error)
44 *error = -1;
45 return SR_ERROR;
46 }
Steve Anton9de3aac2017-10-24 10:08:26 -070047
48 void Close() override {}
49
50 bool SetPosition(size_t position) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000051 pos_ = position;
52 return true;
53 }
Steve Anton9de3aac2017-10-24 10:08:26 -070054
55 bool GetPosition(size_t* position) const override {
Yves Gerey665174f2018-06-19 15:03:05 +020056 if (position)
57 *position = pos_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000058 return true;
59 }
Steve Anton9de3aac2017-10-24 10:08:26 -070060
61 bool GetSize(size_t* size) const override { return false; }
62
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000063 private:
64 size_t pos_;
65};
66
Yves Gerey665174f2018-06-19 15:03:05 +020067bool VerifyTestBuffer(unsigned char* buffer, size_t len, unsigned char value) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000068 bool passed = true;
69 for (size_t i = 0; i < len; ++i) {
70 if (buffer[i] != value++) {
71 passed = false;
72 break;
73 }
74 }
75 // Ensure that we don't pass again without re-writing
76 memset(buffer, 0, len);
77 return passed;
78}
79
80void SeekTest(StreamInterface* stream, const unsigned char value) {
81 size_t bytes;
Yves Gerey665174f2018-06-19 15:03:05 +020082 unsigned char buffer[13] = {0};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000083 const size_t kBufSize = sizeof(buffer);
84
deadbeef37f5ecf2017-02-27 14:06:41 -080085 EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, nullptr), SR_SUCCESS);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086 EXPECT_EQ(bytes, kBufSize);
87 EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, value));
88 EXPECT_TRUE(stream->GetPosition(&bytes));
89 EXPECT_EQ(13U, bytes);
90
91 EXPECT_TRUE(stream->SetPosition(7));
92
deadbeef37f5ecf2017-02-27 14:06:41 -080093 EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, nullptr), SR_SUCCESS);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000094 EXPECT_EQ(bytes, kBufSize);
95 EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, value + 7));
96 EXPECT_TRUE(stream->GetPosition(&bytes));
97 EXPECT_EQ(20U, bytes);
98}
99
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000100TEST(FifoBufferTest, TestAll) {
101 const size_t kSize = 16;
102 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
103 char out[kSize * 2];
104 void* p;
105 const void* q;
106 size_t bytes;
107 FifoBuffer buf(kSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000108
109 // Test assumptions about base state
Niels Möllera8fa2d02018-10-31 10:19:50 +0100110 EXPECT_EQ(SS_OPEN, buf.GetState());
111 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
112 EXPECT_TRUE(nullptr != buf.GetWriteBuffer(&bytes));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000113 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100114 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000115
116 // Try a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100117 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000118 EXPECT_EQ(kSize, bytes);
119
120 // Try a write that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +0100121 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000122
123 // Try a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100124 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000125 EXPECT_EQ(kSize, bytes);
126 EXPECT_EQ(0, memcmp(in, out, kSize));
127
128 // Try a read that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +0100129 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000130
131 // Try a too-big write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100132 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000133 EXPECT_EQ(bytes, kSize);
134
135 // Try a too-big read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100136 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000137 EXPECT_EQ(kSize, bytes);
138 EXPECT_EQ(0, memcmp(in, out, kSize));
139
140 // Try some small writes and reads
Niels Möllera8fa2d02018-10-31 10:19:50 +0100141 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000142 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100143 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000144 EXPECT_EQ(kSize / 2, bytes);
145 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100146 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000147 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100148 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000149 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100150 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000151 EXPECT_EQ(kSize / 2, bytes);
152 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100153 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000154 EXPECT_EQ(kSize / 2, bytes);
155 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
156
157 // Try wraparound reads and writes in the following pattern
158 // WWWWWWWWWWWW.... 0123456789AB....
159 // RRRRRRRRXXXX.... ........89AB....
160 // WWWW....XXXXWWWW 4567....89AB0123
161 // XXXX....RRRRXXXX 4567........0123
162 // XXXXWWWWWWWWXXXX 4567012345670123
163 // RRRRXXXXXXXXRRRR ....01234567....
164 // ....RRRRRRRR.... ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100165 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000166 EXPECT_EQ(kSize * 3 / 4, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100167 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000168 EXPECT_EQ(kSize / 2, bytes);
169 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100170 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000171 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100172 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 4, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200173 EXPECT_EQ(kSize / 4, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000174 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100175 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000176 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100177 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200178 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000179 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100180 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200181 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000182 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
183
184 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100185 buf.GetWriteBuffer(&bytes);
186 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000187
188 // Try using GetReadData to do a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100189 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
190 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800191 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000192 EXPECT_EQ(kSize, bytes);
193 EXPECT_EQ(0, memcmp(q, in, kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100194 buf.ConsumeReadData(kSize);
195 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000196
197 // Try using GetReadData to do some small reads
Niels Möllera8fa2d02018-10-31 10:19:50 +0100198 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
199 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800200 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000201 EXPECT_EQ(kSize, bytes);
202 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100203 buf.ConsumeReadData(kSize / 2);
204 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800205 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000206 EXPECT_EQ(kSize / 2, bytes);
207 EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100208 buf.ConsumeReadData(kSize / 2);
209 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000210
211 // Try using GetReadData in a wraparound case
212 // WWWWWWWWWWWWWWWW 0123456789ABCDEF
213 // RRRRRRRRRRRRXXXX ............CDEF
214 // WWWWWWWW....XXXX 01234567....CDEF
215 // ............RRRR 01234567........
216 // RRRRRRRR........ ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100217 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
218 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
219 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
220 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800221 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000222 EXPECT_EQ(kSize / 4, bytes);
223 EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100224 buf.ConsumeReadData(kSize / 4);
225 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800226 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000227 EXPECT_EQ(kSize / 2, bytes);
228 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100229 buf.ConsumeReadData(kSize / 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000230
231 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100232 buf.GetWriteBuffer(&bytes);
233 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000234
235 // Try using GetWriteBuffer to do a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100236 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800237 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000238 EXPECT_EQ(kSize, bytes);
239 memcpy(p, in, kSize);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100240 buf.ConsumeWriteBuffer(kSize);
241 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000242 EXPECT_EQ(kSize, bytes);
243 EXPECT_EQ(0, memcmp(in, out, kSize));
244
245 // Try using GetWriteBuffer to do some small writes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100246 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800247 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000248 EXPECT_EQ(kSize, bytes);
249 memcpy(p, in, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100250 buf.ConsumeWriteBuffer(kSize / 2);
251 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800252 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000253 EXPECT_EQ(kSize / 2, bytes);
254 memcpy(p, in + kSize / 2, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100255 buf.ConsumeWriteBuffer(kSize / 2);
256 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000257 EXPECT_EQ(kSize, bytes);
258 EXPECT_EQ(0, memcmp(in, out, kSize));
259
260 // Try using GetWriteBuffer in a wraparound case
261 // WWWWWWWWWWWW.... 0123456789AB....
262 // RRRRRRRRXXXX.... ........89AB....
263 // ........XXXXWWWW ........89AB0123
264 // WWWW....XXXXXXXX 4567....89AB0123
265 // RRRR....RRRRRRRR ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100266 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
267 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
268 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800269 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000270 EXPECT_EQ(kSize / 4, bytes);
271 memcpy(p, in, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100272 buf.ConsumeWriteBuffer(kSize / 4);
273 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800274 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000275 EXPECT_EQ(kSize / 2, bytes);
276 memcpy(p, in + kSize / 4, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100277 buf.ConsumeWriteBuffer(kSize / 4);
278 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000279 EXPECT_EQ(kSize * 3 / 4, bytes);
280 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
281 EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
282
283 // Check that the stream is now empty
Niels Möllera8fa2d02018-10-31 10:19:50 +0100284 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000285
286 // Try growing the buffer
Niels Möllera8fa2d02018-10-31 10:19:50 +0100287 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000288 EXPECT_EQ(kSize, bytes);
289 EXPECT_TRUE(buf.SetCapacity(kSize * 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100290 EXPECT_EQ(SR_SUCCESS, buf.Write(in + kSize, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000291 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100292 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000293 EXPECT_EQ(kSize * 2, bytes);
294 EXPECT_EQ(0, memcmp(in, out, kSize * 2));
295
296 // Try shrinking the buffer
Niels Möllera8fa2d02018-10-31 10:19:50 +0100297 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000298 EXPECT_EQ(kSize, bytes);
299 EXPECT_TRUE(buf.SetCapacity(kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100300 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
301 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000302 EXPECT_EQ(kSize, bytes);
303 EXPECT_EQ(0, memcmp(in, out, kSize));
304
305 // Write to the stream, close it, read the remaining bytes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100306 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
307 buf.Close();
308 EXPECT_EQ(SS_CLOSED, buf.GetState());
309 EXPECT_EQ(SR_EOS, buf.Write(in, kSize / 2, &bytes, nullptr));
310 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000311 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100312 EXPECT_EQ(SR_EOS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000313}
314
315TEST(FifoBufferTest, FullBufferCheck) {
316 FifoBuffer buff(10);
317 buff.ConsumeWriteBuffer(10);
318
319 size_t free;
deadbeef37f5ecf2017-02-27 14:06:41 -0800320 EXPECT_TRUE(buff.GetWriteBuffer(&free) != nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000321 EXPECT_EQ(0U, free);
322}
323
324TEST(FifoBufferTest, WriteOffsetAndReadOffset) {
325 const size_t kSize = 16;
326 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
327 char out[kSize * 2];
328 FifoBuffer buf(kSize);
329
330 // Write 14 bytes.
deadbeef37f5ecf2017-02-27 14:06:41 -0800331 EXPECT_EQ(SR_SUCCESS, buf.Write(in, 14, nullptr, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000332
333 // Make sure data is in |buf|.
334 size_t buffered;
335 EXPECT_TRUE(buf.GetBuffered(&buffered));
336 EXPECT_EQ(14u, buffered);
337
338 // Read 10 bytes.
339 buf.ConsumeReadData(10);
340
341 // There should be now 12 bytes of available space.
342 size_t remaining;
343 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
344 EXPECT_EQ(12u, remaining);
345
346 // Write at offset 12, this should fail.
deadbeef37f5ecf2017-02-27 14:06:41 -0800347 EXPECT_EQ(SR_BLOCK, buf.WriteOffset(in, 10, 12, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000348
349 // Write 8 bytes at offset 4, this wraps around the buffer.
deadbeef37f5ecf2017-02-27 14:06:41 -0800350 EXPECT_EQ(SR_SUCCESS, buf.WriteOffset(in, 8, 4, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000351
352 // Number of available space remains the same until we call
353 // ConsumeWriteBuffer().
354 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
355 EXPECT_EQ(12u, remaining);
356 buf.ConsumeWriteBuffer(12);
357
358 // There's 4 bytes bypassed and 4 bytes no read so skip them and verify the
359 // 8 bytes written.
360 size_t read;
361 EXPECT_EQ(SR_SUCCESS, buf.ReadOffset(out, 8, 8, &read));
362 EXPECT_EQ(8u, read);
363 EXPECT_EQ(0, memcmp(out, in, 8));
364
365 // There should still be 16 bytes available for reading.
366 EXPECT_TRUE(buf.GetBuffered(&buffered));
367 EXPECT_EQ(16u, buffered);
368
369 // Read at offset 16, this should fail since we don't have that much data.
deadbeef37f5ecf2017-02-27 14:06:41 -0800370 EXPECT_EQ(SR_BLOCK, buf.ReadOffset(out, 10, 16, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000371}
372
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000373} // namespace rtc