Move some methods from StreamInterface to FifoBuffer
Moved methods: GetReadData, ConsumeReadData, GetWriteBuffer, ConsumeWriteBuffer, GetWriteRemaining. These methods represented an optional interface for reading and writing streams, intended to optimize certain use cases. However, it was implemented only in the FifoBuffer subclass, and the few users of that class all have a concrete FifoBuffer, and hence don't need the methods on the abstract StreamInterface. Bug: webrtc:6424 Change-Id: I6de74d1a9205fcb7037ad84e24679d4a27c1d219 Reviewed-on: https://webrtc-review.googlesource.com/c/108621 Reviewed-by: Karl Wiberg <kwiberg@webrtc.org> Commit-Queue: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25446}
This commit is contained in:
@ -105,56 +105,52 @@ TEST(FifoBufferTest, TestAll) {
|
||||
const void* q;
|
||||
size_t bytes;
|
||||
FifoBuffer buf(kSize);
|
||||
StreamInterface* stream = &buf;
|
||||
|
||||
// Test assumptions about base state
|
||||
EXPECT_EQ(SS_OPEN, stream->GetState());
|
||||
EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_TRUE(nullptr != stream->GetReadData(&bytes));
|
||||
EXPECT_EQ((size_t)0, bytes);
|
||||
stream->ConsumeReadData(0);
|
||||
EXPECT_TRUE(nullptr != stream->GetWriteBuffer(&bytes));
|
||||
EXPECT_EQ(SS_OPEN, buf.GetState());
|
||||
EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_TRUE(nullptr != buf.GetWriteBuffer(&bytes));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
stream->ConsumeWriteBuffer(0);
|
||||
buf.ConsumeWriteBuffer(0);
|
||||
|
||||
// Try a full write
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
|
||||
// Try a write that should block
|
||||
EXPECT_EQ(SR_BLOCK, stream->Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
|
||||
|
||||
// Try a full read
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize));
|
||||
|
||||
// Try a read that should block
|
||||
EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
|
||||
|
||||
// Try a too-big write
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 2, &bytes, nullptr));
|
||||
EXPECT_EQ(bytes, kSize);
|
||||
|
||||
// Try a too-big read
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize));
|
||||
|
||||
// Try some small writes and reads
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize / 2));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize / 2));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize / 2));
|
||||
|
||||
@ -166,51 +162,51 @@ TEST(FifoBufferTest, TestAll) {
|
||||
// XXXXWWWWWWWWXXXX 4567012345670123
|
||||
// RRRRXXXXXXXXRRRR ....01234567....
|
||||
// ....RRRRRRRR.... ................
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 3 / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize * 3 / 4, bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize / 2));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 4, bytes);
|
||||
EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize / 2));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize / 2));
|
||||
|
||||
// Use GetWriteBuffer to reset the read_position for the next tests
|
||||
stream->GetWriteBuffer(&bytes);
|
||||
stream->ConsumeWriteBuffer(0);
|
||||
buf.GetWriteBuffer(&bytes);
|
||||
buf.ConsumeWriteBuffer(0);
|
||||
|
||||
// Try using GetReadData to do a full read
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
|
||||
q = stream->GetReadData(&bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
|
||||
q = buf.GetReadData(&bytes);
|
||||
EXPECT_TRUE(nullptr != q);
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_EQ(0, memcmp(q, in, kSize));
|
||||
stream->ConsumeReadData(kSize);
|
||||
EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
|
||||
buf.ConsumeReadData(kSize);
|
||||
EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
|
||||
|
||||
// Try using GetReadData to do some small reads
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
|
||||
q = stream->GetReadData(&bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
|
||||
q = buf.GetReadData(&bytes);
|
||||
EXPECT_TRUE(nullptr != q);
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_EQ(0, memcmp(q, in, kSize / 2));
|
||||
stream->ConsumeReadData(kSize / 2);
|
||||
q = stream->GetReadData(&bytes);
|
||||
buf.ConsumeReadData(kSize / 2);
|
||||
q = buf.GetReadData(&bytes);
|
||||
EXPECT_TRUE(nullptr != q);
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
|
||||
stream->ConsumeReadData(kSize / 2);
|
||||
EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
|
||||
buf.ConsumeReadData(kSize / 2);
|
||||
EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
|
||||
|
||||
// Try using GetReadData in a wraparound case
|
||||
// WWWWWWWWWWWWWWWW 0123456789ABCDEF
|
||||
@ -218,46 +214,46 @@ TEST(FifoBufferTest, TestAll) {
|
||||
// WWWWWWWW....XXXX 01234567....CDEF
|
||||
// ............RRRR 01234567........
|
||||
// RRRRRRRR........ ................
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 3 / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
|
||||
q = stream->GetReadData(&bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
|
||||
q = buf.GetReadData(&bytes);
|
||||
EXPECT_TRUE(nullptr != q);
|
||||
EXPECT_EQ(kSize / 4, bytes);
|
||||
EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4));
|
||||
stream->ConsumeReadData(kSize / 4);
|
||||
q = stream->GetReadData(&bytes);
|
||||
buf.ConsumeReadData(kSize / 4);
|
||||
q = buf.GetReadData(&bytes);
|
||||
EXPECT_TRUE(nullptr != q);
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(q, in, kSize / 2));
|
||||
stream->ConsumeReadData(kSize / 2);
|
||||
buf.ConsumeReadData(kSize / 2);
|
||||
|
||||
// Use GetWriteBuffer to reset the read_position for the next tests
|
||||
stream->GetWriteBuffer(&bytes);
|
||||
stream->ConsumeWriteBuffer(0);
|
||||
buf.GetWriteBuffer(&bytes);
|
||||
buf.ConsumeWriteBuffer(0);
|
||||
|
||||
// Try using GetWriteBuffer to do a full write
|
||||
p = stream->GetWriteBuffer(&bytes);
|
||||
p = buf.GetWriteBuffer(&bytes);
|
||||
EXPECT_TRUE(nullptr != p);
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
memcpy(p, in, kSize);
|
||||
stream->ConsumeWriteBuffer(kSize);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
|
||||
buf.ConsumeWriteBuffer(kSize);
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize));
|
||||
|
||||
// Try using GetWriteBuffer to do some small writes
|
||||
p = stream->GetWriteBuffer(&bytes);
|
||||
p = buf.GetWriteBuffer(&bytes);
|
||||
EXPECT_TRUE(nullptr != p);
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
memcpy(p, in, kSize / 2);
|
||||
stream->ConsumeWriteBuffer(kSize / 2);
|
||||
p = stream->GetWriteBuffer(&bytes);
|
||||
buf.ConsumeWriteBuffer(kSize / 2);
|
||||
p = buf.GetWriteBuffer(&bytes);
|
||||
EXPECT_TRUE(nullptr != p);
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
memcpy(p, in + kSize / 2, kSize / 2);
|
||||
stream->ConsumeWriteBuffer(kSize / 2);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
|
||||
buf.ConsumeWriteBuffer(kSize / 2);
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize));
|
||||
|
||||
@ -267,53 +263,53 @@ TEST(FifoBufferTest, TestAll) {
|
||||
// ........XXXXWWWW ........89AB0123
|
||||
// WWWW....XXXXXXXX 4567....89AB0123
|
||||
// RRRR....RRRRRRRR ................
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 3 / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
p = stream->GetWriteBuffer(&bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize * 3 / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
p = buf.GetWriteBuffer(&bytes);
|
||||
EXPECT_TRUE(nullptr != p);
|
||||
EXPECT_EQ(kSize / 4, bytes);
|
||||
memcpy(p, in, kSize / 4);
|
||||
stream->ConsumeWriteBuffer(kSize / 4);
|
||||
p = stream->GetWriteBuffer(&bytes);
|
||||
buf.ConsumeWriteBuffer(kSize / 4);
|
||||
p = buf.GetWriteBuffer(&bytes);
|
||||
EXPECT_TRUE(nullptr != p);
|
||||
EXPECT_EQ(kSize / 2, bytes);
|
||||
memcpy(p, in + kSize / 4, kSize / 4);
|
||||
stream->ConsumeWriteBuffer(kSize / 4);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 3 / 4, &bytes, nullptr));
|
||||
buf.ConsumeWriteBuffer(kSize / 4);
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 3 / 4, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize * 3 / 4, bytes);
|
||||
EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
|
||||
EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
|
||||
|
||||
// Check that the stream is now empty
|
||||
EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_BLOCK, buf.Read(out, kSize, &bytes, nullptr));
|
||||
|
||||
// Try growing the buffer
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_TRUE(buf.SetCapacity(kSize * 2));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in + kSize, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in + kSize, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize * 2, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize * 2, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize * 2));
|
||||
|
||||
// Try shrinking the buffer
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_TRUE(buf.SetCapacity(kSize));
|
||||
EXPECT_EQ(SR_BLOCK, stream->Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_BLOCK, buf.Write(in, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize, &bytes, nullptr));
|
||||
EXPECT_EQ(kSize, bytes);
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize));
|
||||
|
||||
// Write to the stream, close it, read the remaining bytes
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
|
||||
stream->Close();
|
||||
EXPECT_EQ(SS_CLOSED, stream->GetState());
|
||||
EXPECT_EQ(SR_EOS, stream->Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Write(in, kSize / 2, &bytes, nullptr));
|
||||
buf.Close();
|
||||
EXPECT_EQ(SS_CLOSED, buf.GetState());
|
||||
EXPECT_EQ(SR_EOS, buf.Write(in, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_SUCCESS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(0, memcmp(in, out, kSize / 2));
|
||||
EXPECT_EQ(SR_EOS, stream->Read(out, kSize / 2, &bytes, nullptr));
|
||||
EXPECT_EQ(SR_EOS, buf.Read(out, kSize / 2, &bytes, nullptr));
|
||||
}
|
||||
|
||||
TEST(FifoBufferTest, FullBufferCheck) {
|
||||
|
||||
Reference in New Issue
Block a user