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 "media/webm/cluster_builder.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/webm/webm_constants.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/webm/webm_parser.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnNull;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { kBlockCount = 5 };
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebMParserClient : public WebMParserClient {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockWebMParserClient() {}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebMParserClient methods.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnListStart, WebMParserClient*(int));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(OnListEnd, bool(int));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnUInt, bool(int, int64));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnFloat, bool(int, double));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3(OnBinary, bool(int, const uint8*, int));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnString, bool(int, const std::string&));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebMParserTest : public testing::Test {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrictMock<MockWebMParserClient> client_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static scoped_ptr<Cluster> CreateCluster(int block_count) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClusterBuilder cb;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cb.SetClusterTimecode(0);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < block_count; i++) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8 data[] = { 0x00 };
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cb.AddSimpleBlock(0, i, 0, data, sizeof(data));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.Finish();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void CreateClusterExpectations(int block_count,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool is_complete_cluster,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      MockWebMParserClient* client) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*client, OnListStart(kWebMIdCluster)).WillOnce(Return(client));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*client, OnUInt(kWebMIdTimecode, 0))
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(true));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < block_count; i++) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*client, OnBinary(kWebMIdSimpleBlock, _, _))
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(true));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_complete_cluster)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*client, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, EmptyCluster) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kEmptyCluster[] = {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1F, 0x43, 0xB6, 0x75, 0x80  // CLUSTER (size = 0)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kEmptyCluster);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdCluster, &client_);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kEmptyCluster, size);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size, result);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parser.IsParsingComplete());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, EmptyClusterInSegment) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kBuffer[] = {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x18, 0x53, 0x80, 0x67, 0x85,  // SEGMENT (size = 5)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1F, 0x43, 0xB6, 0x75, 0x80,  // CLUSTER (size = 0)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kBuffer);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&client_));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListEnd(kWebMIdSegment)).WillOnce(Return(true));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdSegment, &client_);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kBuffer, size);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size, result);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parser.IsParsingComplete());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the case where a non-list child element has a size
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that is beyond the end of the parent.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, ChildNonListLargerThanParent) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kBuffer[] = {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1F, 0x43, 0xB6, 0x75, 0x81,  // CLUSTER (size = 1)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xE7, 0x81, 0x01,  // Timecode (size=1, value=1)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kBuffer);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdCluster, &client_);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kBuffer, size);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, result);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(parser.IsParsingComplete());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the case where a list child element has a size
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that is beyond the end of the parent.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, ChildListLargerThanParent) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kBuffer[] = {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x18, 0x53, 0x80, 0x67, 0x85,  // SEGMENT (size = 5)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1F, 0x43, 0xB6, 0x75, 0x81, 0x11  // CLUSTER (size = 1)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kBuffer);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&client_));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdSegment, &client_);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kBuffer, size);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, result);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(parser.IsParsingComplete());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Expecting to parse a Cluster, but get a Segment.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, ListIdDoesNotMatch) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kBuffer[] = {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x18, 0x53, 0x80, 0x67, 0x80,  // SEGMENT (size = 0)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kBuffer);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdCluster, &client_);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kBuffer, size);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, result);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(parser.IsParsingComplete());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, InvalidElementInList) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kBuffer[] = {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x18, 0x53, 0x80, 0x67, 0x82,  // SEGMENT (size = 2)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xAE, 0x80,  // TrackEntry (size = 0)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kBuffer);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&client_));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdSegment, &client_);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kBuffer, size);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, result);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(parser.IsParsingComplete());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, VoidAndCRC32InList) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kBuffer[] = {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x18, 0x53, 0x80, 0x67, 0x99,  // SEGMENT (size = 25)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xEC, 0x83, 0x00, 0x00, 0x00,  // Void (size = 3)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xBF, 0x83, 0x00, 0x00, 0x00,  // CRC32 (size = 3)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1F, 0x43, 0xB6, 0x75, 0x8A,  // CLUSTER (size = 10)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xEC, 0x83, 0x00, 0x00, 0x00,  // Void (size = 3)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xBF, 0x83, 0x00, 0x00, 0x00,  // CRC32 (size = 3)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kBuffer);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&client_));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdCluster)).WillOnce(Return(&client_));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListEnd(kWebMIdSegment)).WillOnce(Return(true));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdSegment, &client_);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kBuffer, size);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size, result);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parser.IsParsingComplete());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, ParseListElementWithSingleCall) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Cluster> cluster(CreateCluster(kBlockCount));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateClusterExpectations(kBlockCount, true, &client_);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdCluster, &client_);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(cluster->data(), cluster->size());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(cluster->size(), result);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parser.IsParsingComplete());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, ParseListElementWithMultipleCalls) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Cluster> cluster(CreateCluster(kBlockCount));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateClusterExpectations(kBlockCount, true, &client_);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8* data = cluster->data();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = cluster->size();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int default_parse_size = 3;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdCluster, &client_);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int parse_size = std::min(default_parse_size, size);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (size > 0) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int result = parser.Parse(data, parse_size);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_GE(result, 0);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LE(result, parse_size);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result == 0) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The parser needs more data so increase the parse_size a little.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(parser.IsParsingComplete());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parse_size += default_parse_size;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parse_size = std::min(parse_size, size);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parse_size = default_parse_size;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data += result;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size -= result;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ((size == 0), parser.IsParsingComplete());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parser.IsParsingComplete());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(WebMParserTest, Reset) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Cluster> cluster(CreateCluster(kBlockCount));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First expect all but the last block.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateClusterExpectations(kBlockCount - 1, false, &client_);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now expect all blocks.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateClusterExpectations(kBlockCount, true, &client_);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdCluster, &client_);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send slightly less than the full cluster so all but the last block is
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // parsed.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(cluster->data(), cluster->size() - 1);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GT(result, 0);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(result, cluster->size());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(parser.IsParsingComplete());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.Reset();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now parse a whole cluster to verify that all the blocks will get parsed.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = parser.Parse(cluster->data(), cluster->size());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(result, cluster->size());
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parser.IsParsingComplete());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the case where multiple clients are used for different lists.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, MultipleClients) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kBuffer[] = {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x18, 0x53, 0x80, 0x67, 0x94,  // SEGMENT (size = 20)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x16, 0x54, 0xAE, 0x6B, 0x85,  //   TRACKS (size = 5)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xAE, 0x83,                    //     TRACKENTRY (size = 3)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xD7, 0x81, 0x01,              //       TRACKNUMBER (size = 1)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x1F, 0x43, 0xB6, 0x75, 0x85,  //   CLUSTER (size = 5)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0xEC, 0x83, 0x00, 0x00, 0x00,  //     Void (size = 3)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kBuffer);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrictMock<MockWebMParserClient> c1_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrictMock<MockWebMParserClient> c2_;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrictMock<MockWebMParserClient> c3_;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(Return(&c1_));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(c1_, OnListStart(kWebMIdTracks)).WillOnce(Return(&c2_));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(c2_, OnListStart(kWebMIdTrackEntry)).WillOnce(Return(&c3_));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(c3_, OnUInt(kWebMIdTrackNumber, 1)).WillOnce(Return(true));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(c2_, OnListEnd(kWebMIdTrackEntry)).WillOnce(Return(true));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(c1_, OnListEnd(kWebMIdTracks)).WillOnce(Return(true));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(c1_, OnListStart(kWebMIdCluster)).WillOnce(Return(&c2_));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(c1_, OnListEnd(kWebMIdCluster)).WillOnce(Return(true));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListEnd(kWebMIdSegment)).WillOnce(Return(true));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdSegment, &client_);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kBuffer, size);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(size, result);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(parser.IsParsingComplete());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the case where multiple clients are used for different lists.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, InvalidClient) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 kBuffer[] = {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x18, 0x53, 0x80, 0x67, 0x85,  // SEGMENT (size = 20)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0x16, 0x54, 0xAE, 0x6B, 0x80,  //   TRACKS (size = 5)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size = sizeof(kBuffer);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InSequence s;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdSegment)).WillOnce(ReturnNull());
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebMListParser parser(kWebMIdSegment, &client_);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = parser.Parse(kBuffer, size);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, result);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(parser.IsParsingComplete());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, ReservedIds) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k1ByteReservedId[] = { 0xFF, 0x81 };
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k2ByteReservedId[] = { 0x7F, 0xFF, 0x81 };
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k3ByteReservedId[] = { 0x3F, 0xFF, 0xFF, 0x81 };
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k4ByteReservedId[] = { 0x1F, 0xFF, 0xFF, 0xFF, 0x81 };
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8* kBuffers[] = {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k1ByteReservedId,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k2ByteReservedId,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k3ByteReservedId,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k4ByteReservedId
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kBuffers); i++) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 element_size;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int buffer_size = 2 + i;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(buffer_size, WebMParseElementHeader(kBuffers[i], buffer_size,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &id, &element_size));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(id, kWebMReservedId);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(element_size, 1);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(WebMParserTest, ReservedSizes) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k1ByteReservedSize[] = { 0xA3, 0xFF };
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k2ByteReservedSize[] = { 0xA3, 0x7F, 0xFF };
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k3ByteReservedSize[] = { 0xA3, 0x3F, 0xFF, 0xFF };
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k4ByteReservedSize[] = { 0xA3, 0x1F, 0xFF, 0xFF, 0xFF };
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k5ByteReservedSize[] = { 0xA3, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF };
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k6ByteReservedSize[] = { 0xA3, 0x07, 0xFF, 0xFF, 0xFF, 0xFF,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       0xFF };
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k7ByteReservedSize[] = { 0xA3, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       0xFF };
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8 k8ByteReservedSize[] = { 0xA3, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       0xFF, 0xFF };
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8* kBuffers[] = {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k1ByteReservedSize,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k2ByteReservedSize,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k3ByteReservedSize,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k4ByteReservedSize,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k5ByteReservedSize,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k6ByteReservedSize,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k7ByteReservedSize,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k8ByteReservedSize
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kBuffers); i++) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int id;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 element_size;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int buffer_size = 2 + i;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(buffer_size, WebMParseElementHeader(kBuffers[i], buffer_size,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &id, &element_size));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(id, 0xA3);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(element_size, kWebMUnknownSize);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(WebMParserTest, ZeroPaddedStrings) {
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const uint8 kBuffer[] = {
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    0x1A, 0x45, 0xDF, 0xA3, 0x91,  // EBMLHEADER (size = 17)
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    0x42, 0x82, 0x80,  // DocType (size = 0)
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    0x42, 0x82, 0x81, 0x00,  // DocType (size = 1) ""
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    0x42, 0x82, 0x81, 'a',  // DocType (size = 1) "a"
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    0x42, 0x82, 0x83, 'a', 0x00, 0x00  // DocType (size = 3) "a"
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int size = sizeof(kBuffer);
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InSequence s;
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(client_, OnListStart(kWebMIdEBMLHeader))
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      .WillOnce(Return(&client_));
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(client_, OnString(kWebMIdDocType, "")).WillOnce(Return(true));
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(client_, OnString(kWebMIdDocType, "")).WillOnce(Return(true));
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(client_, OnString(kWebMIdDocType, "a")).WillOnce(Return(true));
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(client_, OnString(kWebMIdDocType, "a")).WillOnce(Return(true));
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(client_, OnListEnd(kWebMIdEBMLHeader)).WillOnce(Return(true));
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebMListParser parser(kWebMIdEBMLHeader, &client_);
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int result = parser.Parse(kBuffer, size);
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(size, result);
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(parser.IsParsingComplete());
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
396