blob: 0a8056282057c6ccdadd664a2ba072759f8956b9 [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"
Yves Gerey3e707812018-11-28 16:47:49 +010012
13#include <string.h>
14
15#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000016
17namespace rtc {
18
19///////////////////////////////////////////////////////////////////////////////
20// TestStream
21///////////////////////////////////////////////////////////////////////////////
22
23class TestStream : public StreamInterface {
24 public:
Yves Gerey665174f2018-06-19 15:03:05 +020025 TestStream() : pos_(0) {}
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000026
Steve Anton9de3aac2017-10-24 10:08:26 -070027 StreamState GetState() const override { return SS_OPEN; }
28
29 StreamResult Read(void* buffer,
30 size_t buffer_len,
31 size_t* read,
32 int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000033 unsigned char* uc_buffer = static_cast<unsigned char*>(buffer);
34 for (size_t i = 0; i < buffer_len; ++i) {
35 uc_buffer[i] = static_cast<unsigned char>(pos_++);
36 }
37 if (read)
38 *read = buffer_len;
39 return SR_SUCCESS;
40 }
Steve Anton9de3aac2017-10-24 10:08:26 -070041
42 StreamResult Write(const void* data,
43 size_t data_len,
44 size_t* written,
45 int* error) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000046 if (error)
47 *error = -1;
48 return SR_ERROR;
49 }
Steve Anton9de3aac2017-10-24 10:08:26 -070050
51 void Close() override {}
52
53 bool SetPosition(size_t position) override {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000054 pos_ = position;
55 return true;
56 }
Steve Anton9de3aac2017-10-24 10:08:26 -070057
58 bool GetPosition(size_t* position) const override {
Yves Gerey665174f2018-06-19 15:03:05 +020059 if (position)
60 *position = pos_;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000061 return true;
62 }
Steve Anton9de3aac2017-10-24 10:08:26 -070063
64 bool GetSize(size_t* size) const override { return false; }
65
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000066 private:
67 size_t pos_;
68};
69
Yves Gerey665174f2018-06-19 15:03:05 +020070bool VerifyTestBuffer(unsigned char* buffer, size_t len, unsigned char value) {
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000071 bool passed = true;
72 for (size_t i = 0; i < len; ++i) {
73 if (buffer[i] != value++) {
74 passed = false;
75 break;
76 }
77 }
78 // Ensure that we don't pass again without re-writing
79 memset(buffer, 0, len);
80 return passed;
81}
82
83void SeekTest(StreamInterface* stream, const unsigned char value) {
84 size_t bytes;
Yves Gerey665174f2018-06-19 15:03:05 +020085 unsigned char buffer[13] = {0};
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000086 const size_t kBufSize = sizeof(buffer);
87
deadbeef37f5ecf2017-02-27 14:06:41 -080088 EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, nullptr), SR_SUCCESS);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000089 EXPECT_EQ(bytes, kBufSize);
90 EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, value));
91 EXPECT_TRUE(stream->GetPosition(&bytes));
92 EXPECT_EQ(13U, bytes);
93
94 EXPECT_TRUE(stream->SetPosition(7));
95
deadbeef37f5ecf2017-02-27 14:06:41 -080096 EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, nullptr), SR_SUCCESS);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000097 EXPECT_EQ(bytes, kBufSize);
98 EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, value + 7));
99 EXPECT_TRUE(stream->GetPosition(&bytes));
100 EXPECT_EQ(20U, bytes);
101}
102
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000103TEST(FifoBufferTest, TestAll) {
104 const size_t kSize = 16;
105 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
106 char out[kSize * 2];
107 void* p;
108 const void* q;
109 size_t bytes;
110 FifoBuffer buf(kSize);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000111
112 // Test assumptions about base state
Niels Möllera8fa2d02018-10-31 10:19:50 +0100113 EXPECT_EQ(SS_OPEN, buf.GetState());
114 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
115 EXPECT_TRUE(nullptr != buf.GetWriteBuffer(&bytes));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000116 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100117 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000118
119 // Try a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100120 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000121 EXPECT_EQ(kSize, bytes);
122
123 // Try a write that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +0100124 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000125
126 // Try a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100127 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000128 EXPECT_EQ(kSize, bytes);
129 EXPECT_EQ(0, memcmp(in, out, kSize));
130
131 // Try a read that should block
Niels Möllera8fa2d02018-10-31 10:19:50 +0100132 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000133
134 // Try a too-big write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100135 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000136 EXPECT_EQ(bytes, kSize);
137
138 // Try a too-big read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100139 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000140 EXPECT_EQ(kSize, bytes);
141 EXPECT_EQ(0, memcmp(in, out, kSize));
142
143 // Try some small writes and reads
Niels Möllera8fa2d02018-10-31 10:19:50 +0100144 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000145 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100146 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000147 EXPECT_EQ(kSize / 2, bytes);
148 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100149 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000150 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100151 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000152 EXPECT_EQ(kSize / 2, bytes);
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));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100156 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000157 EXPECT_EQ(kSize / 2, bytes);
158 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
159
160 // Try wraparound reads and writes in the following pattern
161 // WWWWWWWWWWWW.... 0123456789AB....
162 // RRRRRRRRXXXX.... ........89AB....
163 // WWWW....XXXXWWWW 4567....89AB0123
164 // XXXX....RRRRXXXX 4567........0123
165 // XXXXWWWWWWWWXXXX 4567012345670123
166 // RRRRXXXXXXXXRRRR ....01234567....
167 // ....RRRRRRRR.... ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100168 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000169 EXPECT_EQ(kSize * 3 / 4, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100170 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000171 EXPECT_EQ(kSize / 2, bytes);
172 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100173 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000174 EXPECT_EQ(kSize / 2, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100175 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 4, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200176 EXPECT_EQ(kSize / 4, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000177 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100178 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000179 EXPECT_EQ(kSize / 2, bytes);
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));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100183 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200184 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000185 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
186
187 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100188 buf.GetWriteBuffer(&bytes);
189 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000190
191 // Try using GetReadData to do a full read
Niels Möllera8fa2d02018-10-31 10:19:50 +0100192 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
193 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800194 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000195 EXPECT_EQ(kSize, bytes);
196 EXPECT_EQ(0, memcmp(q, in, kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100197 buf.ConsumeReadData(kSize);
198 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000199
200 // Try using GetReadData to do some small reads
Niels Möllera8fa2d02018-10-31 10:19:50 +0100201 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
202 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800203 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000204 EXPECT_EQ(kSize, bytes);
205 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100206 buf.ConsumeReadData(kSize / 2);
207 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800208 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000209 EXPECT_EQ(kSize / 2, bytes);
210 EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100211 buf.ConsumeReadData(kSize / 2);
212 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000213
214 // Try using GetReadData in a wraparound case
215 // WWWWWWWWWWWWWWWW 0123456789ABCDEF
216 // RRRRRRRRRRRRXXXX ............CDEF
217 // WWWWWWWW....XXXX 01234567....CDEF
218 // ............RRRR 01234567........
219 // RRRRRRRR........ ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100220 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
221 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
222 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
223 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800224 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000225 EXPECT_EQ(kSize / 4, bytes);
226 EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100227 buf.ConsumeReadData(kSize / 4);
228 q = buf.GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800229 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000230 EXPECT_EQ(kSize / 2, bytes);
231 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100232 buf.ConsumeReadData(kSize / 2);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000233
234 // Use GetWriteBuffer to reset the read_position for the next tests
Niels Möllera8fa2d02018-10-31 10:19:50 +0100235 buf.GetWriteBuffer(&bytes);
236 buf.ConsumeWriteBuffer(0);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000237
238 // Try using GetWriteBuffer to do a full write
Niels Möllera8fa2d02018-10-31 10:19:50 +0100239 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800240 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000241 EXPECT_EQ(kSize, bytes);
242 memcpy(p, in, kSize);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100243 buf.ConsumeWriteBuffer(kSize);
244 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000245 EXPECT_EQ(kSize, bytes);
246 EXPECT_EQ(0, memcmp(in, out, kSize));
247
248 // Try using GetWriteBuffer to do some small writes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100249 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800250 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000251 EXPECT_EQ(kSize, bytes);
252 memcpy(p, in, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100253 buf.ConsumeWriteBuffer(kSize / 2);
254 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800255 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000256 EXPECT_EQ(kSize / 2, bytes);
257 memcpy(p, in + kSize / 2, kSize / 2);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100258 buf.ConsumeWriteBuffer(kSize / 2);
259 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000260 EXPECT_EQ(kSize, bytes);
261 EXPECT_EQ(0, memcmp(in, out, kSize));
262
263 // Try using GetWriteBuffer in a wraparound case
264 // WWWWWWWWWWWW.... 0123456789AB....
265 // RRRRRRRRXXXX.... ........89AB....
266 // ........XXXXWWWW ........89AB0123
267 // WWWW....XXXXXXXX 4567....89AB0123
268 // RRRR....RRRRRRRR ................
Niels Möllera8fa2d02018-10-31 10:19:50 +0100269 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
270 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
271 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800272 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000273 EXPECT_EQ(kSize / 4, bytes);
274 memcpy(p, in, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100275 buf.ConsumeWriteBuffer(kSize / 4);
276 p = buf.GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800277 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000278 EXPECT_EQ(kSize / 2, bytes);
279 memcpy(p, in + kSize / 4, kSize / 4);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100280 buf.ConsumeWriteBuffer(kSize / 4);
281 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000282 EXPECT_EQ(kSize * 3 / 4, bytes);
283 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
284 EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
285
286 // Check that the stream is now empty
Niels Möllera8fa2d02018-10-31 10:19:50 +0100287 EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000288
289 // Try growing the buffer
Niels Möllera8fa2d02018-10-31 10:19:50 +0100290 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000291 EXPECT_EQ(kSize, bytes);
292 EXPECT_TRUE(buf.SetCapacity(kSize * 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100293 EXPECT_EQ(SR_SUCCESS, buf.Write(in + kSize, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000294 EXPECT_EQ(kSize, bytes);
Niels Möllera8fa2d02018-10-31 10:19:50 +0100295 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000296 EXPECT_EQ(kSize * 2, bytes);
297 EXPECT_EQ(0, memcmp(in, out, kSize * 2));
298
299 // Try shrinking the buffer
Niels Möllera8fa2d02018-10-31 10:19:50 +0100300 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000301 EXPECT_EQ(kSize, bytes);
302 EXPECT_TRUE(buf.SetCapacity(kSize));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100303 EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
304 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000305 EXPECT_EQ(kSize, bytes);
306 EXPECT_EQ(0, memcmp(in, out, kSize));
307
308 // Write to the stream, close it, read the remaining bytes
Niels Möllera8fa2d02018-10-31 10:19:50 +0100309 EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
310 buf.Close();
311 EXPECT_EQ(SS_CLOSED, buf.GetState());
312 EXPECT_EQ(SR_EOS, buf.Write(in, kSize / 2, &bytes, nullptr));
313 EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000314 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
Niels Möllera8fa2d02018-10-31 10:19:50 +0100315 EXPECT_EQ(SR_EOS, buf.Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000316}
317
318TEST(FifoBufferTest, FullBufferCheck) {
319 FifoBuffer buff(10);
320 buff.ConsumeWriteBuffer(10);
321
322 size_t free;
deadbeef37f5ecf2017-02-27 14:06:41 -0800323 EXPECT_TRUE(buff.GetWriteBuffer(&free) != nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000324 EXPECT_EQ(0U, free);
325}
326
327TEST(FifoBufferTest, WriteOffsetAndReadOffset) {
328 const size_t kSize = 16;
329 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
330 char out[kSize * 2];
331 FifoBuffer buf(kSize);
332
333 // Write 14 bytes.
deadbeef37f5ecf2017-02-27 14:06:41 -0800334 EXPECT_EQ(SR_SUCCESS, buf.Write(in, 14, nullptr, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000335
336 // Make sure data is in |buf|.
337 size_t buffered;
338 EXPECT_TRUE(buf.GetBuffered(&buffered));
339 EXPECT_EQ(14u, buffered);
340
341 // Read 10 bytes.
342 buf.ConsumeReadData(10);
343
344 // There should be now 12 bytes of available space.
345 size_t remaining;
346 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
347 EXPECT_EQ(12u, remaining);
348
349 // Write at offset 12, this should fail.
deadbeef37f5ecf2017-02-27 14:06:41 -0800350 EXPECT_EQ(SR_BLOCK, buf.WriteOffset(in, 10, 12, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000351
352 // Write 8 bytes at offset 4, this wraps around the buffer.
deadbeef37f5ecf2017-02-27 14:06:41 -0800353 EXPECT_EQ(SR_SUCCESS, buf.WriteOffset(in, 8, 4, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000354
355 // Number of available space remains the same until we call
356 // ConsumeWriteBuffer().
357 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
358 EXPECT_EQ(12u, remaining);
359 buf.ConsumeWriteBuffer(12);
360
361 // There's 4 bytes bypassed and 4 bytes no read so skip them and verify the
362 // 8 bytes written.
363 size_t read;
364 EXPECT_EQ(SR_SUCCESS, buf.ReadOffset(out, 8, 8, &read));
365 EXPECT_EQ(8u, read);
366 EXPECT_EQ(0, memcmp(out, in, 8));
367
368 // There should still be 16 bytes available for reading.
369 EXPECT_TRUE(buf.GetBuffered(&buffered));
370 EXPECT_EQ(16u, buffered);
371
372 // Read at offset 16, this should fail since we don't have that much data.
deadbeef37f5ecf2017-02-27 14:06:41 -0800373 EXPECT_EQ(SR_BLOCK, buf.ReadOffset(out, 10, 16, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000374}
375
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000376} // namespace rtc