seekable_buffer_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/data_buffer.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/seekable_buffer.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SeekableBufferTest : public testing::Test { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SeekableBufferTest() : buffer_(kBufferSize, kBufferSize) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDataSize = 409600; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kBufferSize = 4096; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kWriteSize = 512; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup seed. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seed = static_cast<int32>(base::Time::Now().ToInternalValue()); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) srand(seed); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Random seed: " << seed; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a test data. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kDataSize; i++) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_[i] = static_cast<char>(rand()); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetRandomInt(int maximum) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rand() % maximum + 1; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SeekableBuffer buffer_; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 data_[kDataSize]; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 write_buffer_[kDataSize]; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SeekableBufferTest, RandomReadWrite) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int write_position = 0; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_position = 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (read_position < kDataSize) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write a random amount of data. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int write_size = GetRandomInt(kBufferSize); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_size = std::min(write_size, kDataSize - write_position); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_append = buffer_.Append(data_ + write_position, write_size); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_position += write_size; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(write_position, read_position); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(write_position - read_position, buffer_.forward_bytes()); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_append, buffer_.forward_bytes() < kBufferSize) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Incorrect buffer full reported"; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Peek a random amount of data. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int copy_size = GetRandomInt(kBufferSize); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_copied = buffer_.Peek(write_buffer_, copy_size); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(copy_size, bytes_copied); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, bytes_copied)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read a random amount of data. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_size = GetRandomInt(kBufferSize); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_read = buffer_.Read(write_buffer_, read_size); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(read_size, bytes_read); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, bytes_read)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += bytes_read; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(write_position, read_position); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(write_position - read_position, buffer_.forward_bytes()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SeekableBufferTest, ReadWriteSeek) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kReadSize = kWriteSize / 4; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10; ++i) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write until buffer is full. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < kBufferSize; j += kWriteSize) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_append = buffer_.Append(data_ + j, kWriteSize); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(j < kBufferSize - kWriteSize, should_append) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Incorrect buffer full reported"; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(j + kWriteSize, buffer_.forward_bytes()); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a read and seek pattern. Each loop reads 4 times, each time 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reading a quarter of |kWriteSize|. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_position = 0; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int forward_bytes = kBufferSize; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < kBufferSize; j += kWriteSize) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_bytes -= kReadSize; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += kReadSize; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Seek forward. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.Seek(2 * kReadSize)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_bytes -= 2 * kReadSize; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += 2 * kReadSize; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize)); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_bytes -= kReadSize; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += kReadSize; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Seek backward. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.Seek(-3 * static_cast<int32>(kReadSize))); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_bytes += 3 * kReadSize; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position -= 3 * kReadSize; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize)); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize)); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_bytes -= kReadSize; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += kReadSize; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Peek(write_buffer_, kReadSize)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_bytes -= kReadSize; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, kReadSize)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += kReadSize; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Seek forward. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.Seek(kReadSize)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_bytes -= kReadSize; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += kReadSize; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, buffer_.forward_bytes()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SeekableBufferTest, BufferFull) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kMaxWriteSize = 2 * kBufferSize; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write and expect the buffer to be not full. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBufferSize - kWriteSize; i += kWriteSize) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.Append(data_ + i, kWriteSize)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(i + kWriteSize, buffer_.forward_bytes()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write until we have kMaxWriteSize bytes in the buffer. Buffer is full in 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these writes. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = buffer_.forward_bytes(); i < kMaxWriteSize; i += kWriteSize) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer_.Append(data_ + i, kWriteSize)); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(i + kWriteSize, buffer_.forward_bytes()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read until the buffer is empty. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_position = 0; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (buffer_.forward_bytes()) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read a random amount of data. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_size = GetRandomInt(kBufferSize); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int forward_bytes = buffer_.forward_bytes(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_read = buffer_.Read(write_buffer_, read_size); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, bytes_read)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (read_size > forward_bytes) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(forward_bytes, bytes_read); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(read_size, bytes_read); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += bytes_read; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(kMaxWriteSize, read_position); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kMaxWriteSize - read_position, buffer_.forward_bytes()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expects we have no bytes left. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_.forward_bytes()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_.Read(write_buffer_, 1)); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SeekableBufferTest, SeekBackward) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_.forward_bytes()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_.backward_bytes()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer_.Seek(1)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer_.Seek(-1)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kReadSize = 256; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write into buffer until it's full. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBufferSize; i += kWriteSize) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write a random amount of data. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_.Append(data_ + i, kWriteSize); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read until buffer is empty. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBufferSize; i += kReadSize) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize)); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + i, kReadSize)); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Seek backward. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.Seek(-static_cast<int32>(kBufferSize))); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer_.Seek(-1)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read again. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBufferSize; i += kReadSize) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kReadSize, buffer_.Read(write_buffer_, kReadSize)); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + i, kReadSize)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SeekableBufferTest, GetCurrentChunk) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSeekSize = kWriteSize / 3; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = DataBuffer::CopyFrom(data_, kWriteSize); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8* data; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer_.GetCurrentChunk(&data, &size)); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_.Append(buffer.get()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.GetCurrentChunk(&data, &size)); 236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(data, buffer->data()); 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(size, buffer->data_size()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_.Seek(kSeekSize); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.GetCurrentChunk(&data, &size)); 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(data, buffer->data() + kSeekSize); 242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(size, buffer->data_size() - kSeekSize); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SeekableBufferTest, SeekForward) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int write_position = 0; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_position = 0; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (read_position < kDataSize) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 10 && write_position < kDataSize; ++i) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write a random amount of data. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int write_size = GetRandomInt(kBufferSize); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_size = std::min(write_size, kDataSize - write_position); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_append = buffer_.Append(data_ + write_position, write_size); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) write_position += write_size; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(write_position, read_position); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(write_position - read_position, buffer_.forward_bytes()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_append, buffer_.forward_bytes() < kBufferSize) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Incorrect buffer full status reported"; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read a random amount of data. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int seek_size = GetRandomInt(kBufferSize); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer_.Seek(seek_size)) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += seek_size; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(write_position, read_position); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(write_position - read_position, buffer_.forward_bytes()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read a random amount of data. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int read_size = GetRandomInt(kBufferSize); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bytes_read = buffer_.Read(write_buffer_, read_size); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(read_size, bytes_read); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(write_buffer_, data_ + read_position, bytes_read)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) read_position += bytes_read; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GE(write_position, read_position); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(write_position - read_position, buffer_.forward_bytes()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SeekableBufferTest, AllMethods) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_.Read(write_buffer_, 0)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_.Read(write_buffer_, 1)); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.Seek(0)); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer_.Seek(-1)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(buffer_.Seek(1)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_.forward_bytes()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, buffer_.backward_bytes()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SeekableBufferTest, GetTime) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int64 kNoTS = kNoTimestamp().ToInternalValue(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 first_time_useconds; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 duration_useconds; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int consume_bytes; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 expected_time; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 1000000, 0, kNoTS }, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 4000000, 0, kNoTS }, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 8000000, 0, kNoTS }, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 1000000, kWriteSize / 2, kNoTS }, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 4000000, kWriteSize / 2, kNoTS }, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 8000000, kWriteSize / 2, kNoTS }, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 1000000, kWriteSize, kNoTS }, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 4000000, kWriteSize, kNoTS }, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { kNoTS, 8000000, kWriteSize, kNoTS }, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 1000000, 0, 0 }, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 4000000, 0, 0 }, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 8000000, 0, 0 }, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 1000000, kWriteSize / 2, 500000 }, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 4000000, kWriteSize / 2, 2000000 }, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 8000000, kWriteSize / 2, 4000000 }, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 1000000, kWriteSize, 1000000 }, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 4000000, kWriteSize, 4000000 }, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 8000000, kWriteSize, 8000000 }, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 1000000, 0, 5 }, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 4000000, 0, 5 }, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 8000000, 0, 5 }, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 1000000, kWriteSize / 2, 500005 }, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 4000000, kWriteSize / 2, 2000005 }, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 8000000, kWriteSize / 2, 4000005 }, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 1000000, kWriteSize, 1000005 }, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 4000000, kWriteSize, 4000005 }, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5, 8000000, kWriteSize, 8000005 }, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current_time() must initially return kNoTimestamp(). 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNoTimestamp().ToInternalValue(), 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_.current_time().ToInternalValue()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<DataBuffer> buffer = DataBuffer::CopyFrom(data_, kWriteSize); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer->set_timestamp(base::TimeDelta::FromMicroseconds( 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tests[i].first_time_useconds)); 336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buffer->set_duration(base::TimeDelta::FromMicroseconds( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tests[i].duration_useconds)); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_.Append(buffer.get()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(buffer_.Seek(tests[i].consume_bytes)); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 actual = buffer_.current_time().ToInternalValue(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_time, actual) << "With test = { start:" 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << tests[i].first_time_useconds << ", duration:" 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << tests[i].duration_useconds << ", consumed:" 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << tests[i].consume_bytes << " }\n"; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer_.Clear(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 353