15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2011, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h" 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/stream.h" 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// TestStream 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass TestStream : public StreamInterface { 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestStream() : pos_(0) { } 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual StreamState GetState() const { return SS_OPEN; } 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual StreamResult Read(void* buffer, size_t buffer_len, 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t* read, int* error) { 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org unsigned char* uc_buffer = static_cast<unsigned char*>(buffer); 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < buffer_len; ++i) { 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org uc_buffer[i] = static_cast<unsigned char>(pos_++); 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (read) 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *read = buffer_len; 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return SR_SUCCESS; 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual StreamResult Write(const void* data, size_t data_len, 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t* written, int* error) { 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (error) 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *error = -1; 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return SR_ERROR; 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void Close() { } 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool SetPosition(size_t position) { 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pos_ = position; 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetPosition(size_t* position) const { 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (position) *position = pos_; 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return true; 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetSize(size_t* size) const { 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool GetAvailable(size_t* size) const { 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return false; 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t pos_; 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgbool VerifyTestBuffer(unsigned char* buffer, size_t len, 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org unsigned char value) { 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool passed = true; 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (size_t i = 0; i < len; ++i) { 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (buffer[i] != value++) { 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org passed = false; 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org break; 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Ensure that we don't pass again without re-writing 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org memset(buffer, 0, len); 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return passed; 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid SeekTest(StreamInterface* stream, const unsigned char value) { 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t bytes; 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org unsigned char buffer[13] = { 0 }; 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const size_t kBufSize = sizeof(buffer); 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_SUCCESS); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(bytes, kBufSize); 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, value)); 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(stream->GetPosition(&bytes)); 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(13U, bytes); 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(stream->SetPosition(7)); 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_SUCCESS); 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(bytes, kBufSize); 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, value + 7)); 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(stream->GetPosition(&bytes)); 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(20U, bytes); 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(StreamSegment, TranslatesPosition) { 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestStream* test = new TestStream; 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify behavior of original stream 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SeekTest(test, 0); 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StreamSegment* segment = new StreamSegment(test); 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Verify behavior of adapted stream (all values offset by 20) 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SeekTest(segment, 20); 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete segment; 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(StreamSegment, SupportsArtificialTermination) { 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TestStream* test = new TestStream; 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t bytes; 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org unsigned char buffer[5000] = { 0 }; 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const size_t kBufSize = sizeof(buffer); 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StreamInterface* stream = test; 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Read a lot of bytes 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_SUCCESS); 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(bytes, kBufSize); 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, 0)); 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test seeking far ahead 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(stream->SetPosition(12345)); 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Read a bunch more bytes 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_SUCCESS); 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(bytes, kBufSize); 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, 12345 % 256)); 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Create a segment of test stream in range [100,600) 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(test->SetPosition(100)); 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StreamSegment* segment = new StreamSegment(test, 500); 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StreamInterface* stream = segment; 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_SUCCESS); 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(500U, bytes); 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(VerifyTestBuffer(buffer, 500, 100)); 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_EOS); 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test seeking past "end" of stream 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(stream->SetPosition(12345)); 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(stream->SetPosition(501)); 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test seeking to end (edge case) 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(stream->SetPosition(500)); 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_EOS); 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test seeking to start 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(stream->SetPosition(0)); 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_SUCCESS); 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(500U, bytes); 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(VerifyTestBuffer(buffer, 500, 100)); 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, NULL), SR_EOS); 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org delete segment; 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(FifoBufferTest, TestAll) { 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const size_t kSize = 16; 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char out[kSize * 2]; 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void* p; 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const void* q; 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t bytes; 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FifoBuffer buf(kSize); 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StreamInterface* stream = &buf; 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Test assumptions about base state 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SS_OPEN, stream->GetState()); 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, NULL)); 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != stream->GetReadData(&bytes)); 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ((size_t)0, bytes); 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeReadData(0); 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != stream->GetWriteBuffer(&bytes)); 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeWriteBuffer(0); 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try a full write 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, NULL)); 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try a write that should block 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, stream->Write(in, kSize, &bytes, NULL)); 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try a full read 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, NULL)); 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize)); 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try a read that should block 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, NULL)); 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try a too-big write 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 2, &bytes, NULL)); 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(bytes, kSize); 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try a too-big read 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 2, &bytes, NULL)); 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize)); 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try some small writes and reads 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, NULL)); 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, NULL)); 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize / 2)); 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, NULL)); 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, NULL)); 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, NULL)); 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize / 2)); 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, NULL)); 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize / 2)); 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try wraparound reads and writes in the following pattern 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // WWWWWWWWWWWW.... 0123456789AB.... 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // RRRRRRRRXXXX.... ........89AB.... 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // WWWW....XXXXWWWW 4567....89AB0123 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // XXXX....RRRRXXXX 4567........0123 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // XXXXWWWWWWWWXXXX 4567012345670123 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // RRRRXXXXXXXXRRRR ....01234567.... 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // ....RRRRRRRR.... ................ 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 3 / 4, &bytes, NULL)); 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize * 3 / 4, bytes); 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, NULL)); 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize / 2)); 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, NULL)); 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 4, &bytes, NULL)); 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 4 , bytes); 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4)); 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, NULL)); 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, NULL)); 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2 , bytes); 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize / 2)); 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, NULL)); 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2 , bytes); 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize / 2)); 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Use GetWriteBuffer to reset the read_position for the next tests 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->GetWriteBuffer(&bytes); 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeWriteBuffer(0); 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try using GetReadData to do a full read 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, NULL)); 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org q = stream->GetReadData(&bytes); 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != q); 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(q, in, kSize)); 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeReadData(kSize); 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, NULL)); 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try using GetReadData to do some small reads 2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, NULL)); 2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org q = stream->GetReadData(&bytes); 2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != q); 2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(q, in, kSize / 2)); 2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeReadData(kSize / 2); 2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org q = stream->GetReadData(&bytes); 2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != q); 2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2)); 2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeReadData(kSize / 2); 2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, NULL)); 2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try using GetReadData in a wraparound case 2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // WWWWWWWWWWWWWWWW 0123456789ABCDEF 2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // RRRRRRRRRRRRXXXX ............CDEF 2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // WWWWWWWW....XXXX 01234567....CDEF 2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // ............RRRR 01234567........ 2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // RRRRRRRR........ ................ 2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, NULL)); 2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 3 / 4, &bytes, NULL)); 3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, NULL)); 3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org q = stream->GetReadData(&bytes); 3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != q); 3035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 4, bytes); 3045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4)); 3055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeReadData(kSize / 4); 3065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org q = stream->GetReadData(&bytes); 3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != q); 3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(q, in, kSize / 2)); 3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeReadData(kSize / 2); 3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Use GetWriteBuffer to reset the read_position for the next tests 3135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->GetWriteBuffer(&bytes); 3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeWriteBuffer(0); 3155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try using GetWriteBuffer to do a full write 3175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org p = stream->GetWriteBuffer(&bytes); 3185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != p); 3195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 3205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org memcpy(p, in, kSize); 3215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeWriteBuffer(kSize); 3225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, NULL)); 3235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 3245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize)); 3255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try using GetWriteBuffer to do some small writes 3275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org p = stream->GetWriteBuffer(&bytes); 3285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != p); 3295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 3305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org memcpy(p, in, kSize / 2); 3315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeWriteBuffer(kSize / 2); 3325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org p = stream->GetWriteBuffer(&bytes); 3335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != p); 3345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 3355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org memcpy(p, in + kSize / 2, kSize / 2); 3365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeWriteBuffer(kSize / 2); 3375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, NULL)); 3385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 3395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize)); 3405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try using GetWriteBuffer in a wraparound case 3425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // WWWWWWWWWWWW.... 0123456789AB.... 3435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // RRRRRRRRXXXX.... ........89AB.... 3445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // ........XXXXWWWW ........89AB0123 3455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // WWWW....XXXXXXXX 4567....89AB0123 3465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // RRRR....RRRRRRRR ................ 3475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 3 / 4, &bytes, NULL)); 3485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, NULL)); 3495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org p = stream->GetWriteBuffer(&bytes); 3505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != p); 3515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 4, bytes); 3525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org memcpy(p, in, kSize / 4); 3535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeWriteBuffer(kSize / 4); 3545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org p = stream->GetWriteBuffer(&bytes); 3555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(NULL != p); 3565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize / 2, bytes); 3575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org memcpy(p, in + kSize / 4, kSize / 4); 3585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->ConsumeWriteBuffer(kSize / 4); 3595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 3 / 4, &bytes, NULL)); 3605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize * 3 / 4, bytes); 3615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4)); 3625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4)); 3635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Check that the stream is now empty 3655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, NULL)); 3665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try growing the buffer 3685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, NULL)); 3695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 3705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(buf.SetCapacity(kSize * 2)); 3715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in + kSize, kSize, &bytes, NULL)); 3725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 3735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 2, &bytes, NULL)); 3745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize * 2, bytes); 3755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize * 2)); 3765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Try shrinking the buffer 3785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, NULL)); 3795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 3805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(buf.SetCapacity(kSize)); 3815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, stream->Write(in, kSize, &bytes, NULL)); 3825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, NULL)); 3835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(kSize, bytes); 3845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize)); 3855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Write to the stream, close it, read the remaining bytes 3875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, NULL)); 3885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream->Close(); 3895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SS_CLOSED, stream->GetState()); 3905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_EOS, stream->Write(in, kSize / 2, &bytes, NULL)); 3915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, NULL)); 3925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(in, out, kSize / 2)); 3935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_EOS, stream->Read(out, kSize / 2, &bytes, NULL)); 3945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 3955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(FifoBufferTest, FullBufferCheck) { 3975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FifoBuffer buff(10); 3985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buff.ConsumeWriteBuffer(10); 3995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t free; 4015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(buff.GetWriteBuffer(&free) != NULL); 4025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0U, free); 4035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(FifoBufferTest, WriteOffsetAndReadOffset) { 4065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const size_t kSize = 16; 4075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; 4085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char out[kSize * 2]; 4095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FifoBuffer buf(kSize); 4105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Write 14 bytes. 4125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, buf.Write(in, 14, NULL, NULL)); 4135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Make sure data is in |buf|. 4155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t buffered; 4165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(buf.GetBuffered(&buffered)); 4175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(14u, buffered); 4185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Read 10 bytes. 4205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buf.ConsumeReadData(10); 4215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // There should be now 12 bytes of available space. 4235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t remaining; 4245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(buf.GetWriteRemaining(&remaining)); 4255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(12u, remaining); 4265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Write at offset 12, this should fail. 4285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, buf.WriteOffset(in, 10, 12, NULL)); 4295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Write 8 bytes at offset 4, this wraps around the buffer. 4315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, buf.WriteOffset(in, 8, 4, NULL)); 4325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Number of available space remains the same until we call 4345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // ConsumeWriteBuffer(). 4355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(buf.GetWriteRemaining(&remaining)); 4365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(12u, remaining); 4375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buf.ConsumeWriteBuffer(12); 4385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // There's 4 bytes bypassed and 4 bytes no read so skip them and verify the 4405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // 8 bytes written. 4415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t read; 4425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, buf.ReadOffset(out, 8, 8, &read)); 4435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(8u, read); 4445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(out, in, 8)); 4455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // There should still be 16 bytes available for reading. 4475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(buf.GetBuffered(&buffered)); 4485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(16u, buffered); 4495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Read at offset 16, this should fail since we don't have that much data. 4515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_BLOCK, buf.ReadOffset(out, 10, 16, NULL)); 4525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 4535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST(AsyncWriteTest, TestWrite) { 4555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org FifoBuffer* buf = new FifoBuffer(100); 4565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org AsyncWriteStream stream(buf, Thread::Current()); 4575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SS_OPEN, stream.GetState()); 4585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Write "abc". Will go to the logging thread, which is the current 4605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // thread. 4615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream.Write("abc", 3, NULL, NULL); 4625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org char bytes[100]; 4635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t count; 4645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Messages on the thread's queue haven't been processed, so "abc" 4655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // hasn't been written yet. 4665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(SR_SUCCESS, buf->ReadOffset(&bytes, 3, 0, &count)); 4675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Now we process the messages on the thread's queue, so "abc" has 4685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // been written. 4695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE_WAIT(SR_SUCCESS == buf->ReadOffset(&bytes, 3, 0, &count), 10); 4705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(3u, count); 4715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(bytes, "abc", 3)); 4725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Write "def". Will go to the logging thread, which is the current 4745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // thread. 4755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream.Write("d", 1, &count, NULL); 4765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream.Write("e", 1, &count, NULL); 4775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream.Write("f", 1, &count, NULL); 4785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1u, count); 4795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Messages on the thread's queue haven't been processed, so "def" 4805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // hasn't been written yet. 4815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(SR_SUCCESS, buf->ReadOffset(&bytes, 3, 3, &count)); 4825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Flush() causes the message to be processed, so "def" has now been 4835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // written. 4845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream.Flush(); 4855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, buf->ReadOffset(&bytes, 3, 3, &count)); 4865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(3u, count); 4875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(bytes, "def", 3)); 4885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 4895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Write "xyz". Will go to the logging thread, which is the current 4905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // thread. 4915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream.Write("xyz", 3, &count, NULL); 4925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(3u, count); 4935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Messages on the thread's queue haven't been processed, so "xyz" 4945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // hasn't been written yet. 4955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_NE(SR_SUCCESS, buf->ReadOffset(&bytes, 3, 6, &count)); 4965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Close() causes the message to be processed, so "xyz" has now been 4975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // written. 4985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org stream.Close(); 4995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_SUCCESS, buf->ReadOffset(&bytes, 3, 6, &count)); 5005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(3u, count); 5015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(0, memcmp(bytes, "xyz", 3)); 5025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SS_CLOSED, stream.GetState()); 5035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Is't closed, so the writes should fail. 5055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(SR_ERROR, stream.Write("000", 3, NULL, NULL)); 5065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 5085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 5095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace talk_base 510