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)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/data_buffer.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Constructor_ZeroSize) {
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Zero-sized buffers are valid. In practice they aren't used very much but it
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // eliminates clients from worrying about null data pointers.
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DataBuffer> buffer = new DataBuffer(0);
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->data());
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->writable_data());
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, buffer->data_size());
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(buffer->end_of_stream());
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Constructor_NonZeroSize) {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Buffer size should be set.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DataBuffer> buffer = new DataBuffer(10);
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->data());
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->writable_data());
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, buffer->data_size());
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(buffer->end_of_stream());
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Constructor_ScopedArray) {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Data should be passed and both data and buffer size should be set.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kSize = 8;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<uint8[]> data(new uint8[kSize]);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const uint8* kData = data.get();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DataBuffer> buffer = new DataBuffer(data.Pass(), kSize);
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->data());
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->writable_data());
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kData, buffer->data());
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kSize, buffer->data_size());
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(buffer->end_of_stream());
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, CopyFrom) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kTestData[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kTestDataSize = arraysize(kTestData);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DataBuffer> buffer =
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DataBuffer::CopyFrom(kTestData, kTestDataSize);
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kTestDataSize, buffer->data_size());
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(buffer->end_of_stream());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure we are copying the data, not just pointing to the original data.
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(0, memcmp(buffer->data(), kTestData, kTestDataSize));
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  buffer->writable_data()[0] = 0xFF;
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_NE(0, memcmp(buffer->data(), kTestData, kTestDataSize));
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, CreateEOSBuffer) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DataBuffer> buffer = DataBuffer::CreateEOSBuffer();
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->end_of_stream());
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Timestamp) {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta kZero;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta kTimestampA = base::TimeDelta::FromMicroseconds(1337);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta kTimestampB = base::TimeDelta::FromMicroseconds(1234);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DataBuffer> buffer = new DataBuffer(0);
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->timestamp() == kZero);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  buffer->set_timestamp(kTimestampA);
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->timestamp() == kTimestampA);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  buffer->set_timestamp(kTimestampB);
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->timestamp() == kTimestampB);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(DataBufferTest, Duration) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta kZero;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta kDurationA = base::TimeDelta::FromMicroseconds(1337);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::TimeDelta kDurationB = base::TimeDelta::FromMicroseconds(1234);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DataBuffer> buffer = new DataBuffer(0);
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->duration() == kZero);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  buffer->set_duration(kDurationA);
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->duration() == kDurationA);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  buffer->set_duration(kDurationB);
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(buffer->duration() == kDurationB);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DataBufferTest, ReadingWriting) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kData[] = "hello";
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kDataSize = arraysize(kData);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kNewData[] = "chromium";
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kNewDataSize = arraysize(kNewData);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a DataBuffer.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<DataBuffer> buffer(new DataBuffer(kDataSize));
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(buffer.get());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uint8* data = buffer->writable_data();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(data);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(data, kData, kDataSize);
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  buffer->set_data_size(kDataSize);
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const uint8* read_only_data = buffer->data();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(data, read_only_data);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, memcmp(read_only_data, kData, kDataSize));
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(buffer->end_of_stream());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<DataBuffer> buffer2(new DataBuffer(kNewDataSize + 10));
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  data = buffer2->writable_data();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(data);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(data, kNewData, kNewDataSize);
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  buffer2->set_data_size(kNewDataSize);
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  read_only_data = buffer2->data();
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(kNewDataSize, buffer2->data_size());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(data, read_only_data);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(read_only_data, kNewData, kNewDataSize));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
125