blob: 616783cb4dc76011f60793a06a28b08ff798320e [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);
108 StreamInterface* stream = &buf;
109
110 // Test assumptions about base state
111 EXPECT_EQ(SS_OPEN, stream->GetState());
deadbeef37f5ecf2017-02-27 14:06:41 -0800112 EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
113 EXPECT_TRUE(nullptr != stream->GetReadData(&bytes));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000114 EXPECT_EQ((size_t)0, bytes);
115 stream->ConsumeReadData(0);
deadbeef37f5ecf2017-02-27 14:06:41 -0800116 EXPECT_TRUE(nullptr != stream->GetWriteBuffer(&bytes));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000117 EXPECT_EQ(kSize, bytes);
118 stream->ConsumeWriteBuffer(0);
119
120 // Try a full write
deadbeef37f5ecf2017-02-27 14:06:41 -0800121 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000122 EXPECT_EQ(kSize, bytes);
123
124 // Try a write that should block
deadbeef37f5ecf2017-02-27 14:06:41 -0800125 EXPECT_EQ(SR_BLOCK, stream->Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000126
127 // Try a full read
deadbeef37f5ecf2017-02-27 14:06:41 -0800128 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000129 EXPECT_EQ(kSize, bytes);
130 EXPECT_EQ(0, memcmp(in, out, kSize));
131
132 // Try a read that should block
deadbeef37f5ecf2017-02-27 14:06:41 -0800133 EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000134
135 // Try a too-big write
deadbeef37f5ecf2017-02-27 14:06:41 -0800136 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000137 EXPECT_EQ(bytes, kSize);
138
139 // Try a too-big read
deadbeef37f5ecf2017-02-27 14:06:41 -0800140 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000141 EXPECT_EQ(kSize, bytes);
142 EXPECT_EQ(0, memcmp(in, out, kSize));
143
144 // Try some small writes and reads
deadbeef37f5ecf2017-02-27 14:06:41 -0800145 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000146 EXPECT_EQ(kSize / 2, bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800147 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000148 EXPECT_EQ(kSize / 2, bytes);
149 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
deadbeef37f5ecf2017-02-27 14:06:41 -0800150 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000151 EXPECT_EQ(kSize / 2, bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800152 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000153 EXPECT_EQ(kSize / 2, bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800154 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000155 EXPECT_EQ(kSize / 2, bytes);
156 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
deadbeef37f5ecf2017-02-27 14:06:41 -0800157 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000158 EXPECT_EQ(kSize / 2, bytes);
159 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
160
161 // Try wraparound reads and writes in the following pattern
162 // WWWWWWWWWWWW.... 0123456789AB....
163 // RRRRRRRRXXXX.... ........89AB....
164 // WWWW....XXXXWWWW 4567....89AB0123
165 // XXXX....RRRRXXXX 4567........0123
166 // XXXXWWWWWWWWXXXX 4567012345670123
167 // RRRRXXXXXXXXRRRR ....01234567....
168 // ....RRRRRRRR.... ................
deadbeef37f5ecf2017-02-27 14:06:41 -0800169 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000170 EXPECT_EQ(kSize * 3 / 4, bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800171 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000172 EXPECT_EQ(kSize / 2, bytes);
173 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
deadbeef37f5ecf2017-02-27 14:06:41 -0800174 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000175 EXPECT_EQ(kSize / 2, bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800176 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 4, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200177 EXPECT_EQ(kSize / 4, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000178 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
deadbeef37f5ecf2017-02-27 14:06:41 -0800179 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000180 EXPECT_EQ(kSize / 2, bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800181 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200182 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000183 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
deadbeef37f5ecf2017-02-27 14:06:41 -0800184 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
Yves Gerey665174f2018-06-19 15:03:05 +0200185 EXPECT_EQ(kSize / 2, bytes);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000186 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
187
188 // Use GetWriteBuffer to reset the read_position for the next tests
189 stream->GetWriteBuffer(&bytes);
190 stream->ConsumeWriteBuffer(0);
191
192 // Try using GetReadData to do a full read
deadbeef37f5ecf2017-02-27 14:06:41 -0800193 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000194 q = stream->GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800195 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000196 EXPECT_EQ(kSize, bytes);
197 EXPECT_EQ(0, memcmp(q, in, kSize));
198 stream->ConsumeReadData(kSize);
deadbeef37f5ecf2017-02-27 14:06:41 -0800199 EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000200
201 // Try using GetReadData to do some small reads
deadbeef37f5ecf2017-02-27 14:06:41 -0800202 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000203 q = stream->GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800204 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000205 EXPECT_EQ(kSize, bytes);
206 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
207 stream->ConsumeReadData(kSize / 2);
208 q = stream->GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800209 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000210 EXPECT_EQ(kSize / 2, bytes);
211 EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
212 stream->ConsumeReadData(kSize / 2);
deadbeef37f5ecf2017-02-27 14:06:41 -0800213 EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000214
215 // Try using GetReadData in a wraparound case
216 // WWWWWWWWWWWWWWWW 0123456789ABCDEF
217 // RRRRRRRRRRRRXXXX ............CDEF
218 // WWWWWWWW....XXXX 01234567....CDEF
219 // ............RRRR 01234567........
220 // RRRRRRRR........ ................
deadbeef37f5ecf2017-02-27 14:06:41 -0800221 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
222 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 3 / 4, &bytes, nullptr));
223 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000224 q = stream->GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800225 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000226 EXPECT_EQ(kSize / 4, bytes);
227 EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4));
228 stream->ConsumeReadData(kSize / 4);
229 q = stream->GetReadData(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800230 EXPECT_TRUE(nullptr != q);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000231 EXPECT_EQ(kSize / 2, bytes);
232 EXPECT_EQ(0, memcmp(q, in, kSize / 2));
233 stream->ConsumeReadData(kSize / 2);
234
235 // Use GetWriteBuffer to reset the read_position for the next tests
236 stream->GetWriteBuffer(&bytes);
237 stream->ConsumeWriteBuffer(0);
238
239 // Try using GetWriteBuffer to do a full write
240 p = stream->GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800241 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000242 EXPECT_EQ(kSize, bytes);
243 memcpy(p, in, kSize);
244 stream->ConsumeWriteBuffer(kSize);
deadbeef37f5ecf2017-02-27 14:06:41 -0800245 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000246 EXPECT_EQ(kSize, bytes);
247 EXPECT_EQ(0, memcmp(in, out, kSize));
248
249 // Try using GetWriteBuffer to do some small writes
250 p = stream->GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800251 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000252 EXPECT_EQ(kSize, bytes);
253 memcpy(p, in, kSize / 2);
254 stream->ConsumeWriteBuffer(kSize / 2);
255 p = stream->GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800256 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000257 EXPECT_EQ(kSize / 2, bytes);
258 memcpy(p, in + kSize / 2, kSize / 2);
259 stream->ConsumeWriteBuffer(kSize / 2);
deadbeef37f5ecf2017-02-27 14:06:41 -0800260 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000261 EXPECT_EQ(kSize, bytes);
262 EXPECT_EQ(0, memcmp(in, out, kSize));
263
264 // Try using GetWriteBuffer in a wraparound case
265 // WWWWWWWWWWWW.... 0123456789AB....
266 // RRRRRRRRXXXX.... ........89AB....
267 // ........XXXXWWWW ........89AB0123
268 // WWWW....XXXXXXXX 4567....89AB0123
269 // RRRR....RRRRRRRR ................
deadbeef37f5ecf2017-02-27 14:06:41 -0800270 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 3 / 4, &bytes, nullptr));
271 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000272 p = stream->GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800273 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000274 EXPECT_EQ(kSize / 4, bytes);
275 memcpy(p, in, kSize / 4);
276 stream->ConsumeWriteBuffer(kSize / 4);
277 p = stream->GetWriteBuffer(&bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800278 EXPECT_TRUE(nullptr != p);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000279 EXPECT_EQ(kSize / 2, bytes);
280 memcpy(p, in + kSize / 4, kSize / 4);
281 stream->ConsumeWriteBuffer(kSize / 4);
deadbeef37f5ecf2017-02-27 14:06:41 -0800282 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 3 / 4, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000283 EXPECT_EQ(kSize * 3 / 4, bytes);
284 EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
285 EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
286
287 // Check that the stream is now empty
deadbeef37f5ecf2017-02-27 14:06:41 -0800288 EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000289
290 // Try growing the buffer
deadbeef37f5ecf2017-02-27 14:06:41 -0800291 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000292 EXPECT_EQ(kSize, bytes);
293 EXPECT_TRUE(buf.SetCapacity(kSize * 2));
deadbeef37f5ecf2017-02-27 14:06:41 -0800294 EXPECT_EQ(SR_SUCCESS, stream->Write(in + kSize, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000295 EXPECT_EQ(kSize, bytes);
deadbeef37f5ecf2017-02-27 14:06:41 -0800296 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000297 EXPECT_EQ(kSize * 2, bytes);
298 EXPECT_EQ(0, memcmp(in, out, kSize * 2));
299
300 // Try shrinking the buffer
deadbeef37f5ecf2017-02-27 14:06:41 -0800301 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000302 EXPECT_EQ(kSize, bytes);
303 EXPECT_TRUE(buf.SetCapacity(kSize));
deadbeef37f5ecf2017-02-27 14:06:41 -0800304 EXPECT_EQ(SR_BLOCK, stream->Write(in, kSize, &bytes, nullptr));
305 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000306 EXPECT_EQ(kSize, bytes);
307 EXPECT_EQ(0, memcmp(in, out, kSize));
308
309 // Write to the stream, close it, read the remaining bytes
deadbeef37f5ecf2017-02-27 14:06:41 -0800310 EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000311 stream->Close();
312 EXPECT_EQ(SS_CLOSED, stream->GetState());
deadbeef37f5ecf2017-02-27 14:06:41 -0800313 EXPECT_EQ(SR_EOS, stream->Write(in, kSize / 2, &bytes, nullptr));
314 EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000315 EXPECT_EQ(0, memcmp(in, out, kSize / 2));
deadbeef37f5ecf2017-02-27 14:06:41 -0800316 EXPECT_EQ(SR_EOS, stream->Read(out, kSize / 2, &bytes, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000317}
318
319TEST(FifoBufferTest, FullBufferCheck) {
320 FifoBuffer buff(10);
321 buff.ConsumeWriteBuffer(10);
322
323 size_t free;
deadbeef37f5ecf2017-02-27 14:06:41 -0800324 EXPECT_TRUE(buff.GetWriteBuffer(&free) != nullptr);
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000325 EXPECT_EQ(0U, free);
326}
327
328TEST(FifoBufferTest, WriteOffsetAndReadOffset) {
329 const size_t kSize = 16;
330 const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
331 char out[kSize * 2];
332 FifoBuffer buf(kSize);
333
334 // Write 14 bytes.
deadbeef37f5ecf2017-02-27 14:06:41 -0800335 EXPECT_EQ(SR_SUCCESS, buf.Write(in, 14, nullptr, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000336
337 // Make sure data is in |buf|.
338 size_t buffered;
339 EXPECT_TRUE(buf.GetBuffered(&buffered));
340 EXPECT_EQ(14u, buffered);
341
342 // Read 10 bytes.
343 buf.ConsumeReadData(10);
344
345 // There should be now 12 bytes of available space.
346 size_t remaining;
347 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
348 EXPECT_EQ(12u, remaining);
349
350 // Write at offset 12, this should fail.
deadbeef37f5ecf2017-02-27 14:06:41 -0800351 EXPECT_EQ(SR_BLOCK, buf.WriteOffset(in, 10, 12, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000352
353 // Write 8 bytes at offset 4, this wraps around the buffer.
deadbeef37f5ecf2017-02-27 14:06:41 -0800354 EXPECT_EQ(SR_SUCCESS, buf.WriteOffset(in, 8, 4, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000355
356 // Number of available space remains the same until we call
357 // ConsumeWriteBuffer().
358 EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
359 EXPECT_EQ(12u, remaining);
360 buf.ConsumeWriteBuffer(12);
361
362 // There's 4 bytes bypassed and 4 bytes no read so skip them and verify the
363 // 8 bytes written.
364 size_t read;
365 EXPECT_EQ(SR_SUCCESS, buf.ReadOffset(out, 8, 8, &read));
366 EXPECT_EQ(8u, read);
367 EXPECT_EQ(0, memcmp(out, in, 8));
368
369 // There should still be 16 bytes available for reading.
370 EXPECT_TRUE(buf.GetBuffered(&buffered));
371 EXPECT_EQ(16u, buffered);
372
373 // Read at offset 16, this should fail since we don't have that much data.
deadbeef37f5ecf2017-02-27 14:06:41 -0800374 EXPECT_EQ(SR_BLOCK, buf.ReadOffset(out, 10, 16, nullptr));
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000375}
376
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000377} // namespace rtc