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