239 lines
9.9 KiB
C++
239 lines
9.9 KiB
C++
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
#include "base/bind.h"
|
||
|
#include "media/webm/webm_constants.h"
|
||
|
#include "media/webm/webm_content_encodings_client.h"
|
||
|
#include "media/webm/webm_parser.h"
|
||
|
#include "testing/gtest/include/gtest/gtest.h"
|
||
|
|
||
|
namespace media {
|
||
|
|
||
|
class WebMContentEncodingsClientTest : public testing::Test {
|
||
|
public:
|
||
|
WebMContentEncodingsClientTest()
|
||
|
: client_(LogCB()),
|
||
|
parser_(kWebMIdContentEncodings, &client_) {}
|
||
|
|
||
|
void ParseAndExpectToFail(const uint8* buf, int size) {
|
||
|
int result = parser_.Parse(buf, size);
|
||
|
EXPECT_EQ(-1, result);
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
WebMContentEncodingsClient client_;
|
||
|
WebMListParser parser_;
|
||
|
};
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, EmptyContentEncodings) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0x80, // ContentEncodings (size = 0)
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
ParseAndExpectToFail(kContentEncodings, size);
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, EmptyContentEncoding) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0x83, // ContentEncodings (size = 3)
|
||
|
0x63, 0x40, 0x80, // ContentEncoding (size = 0)
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
ParseAndExpectToFail(kContentEncodings, size);
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, SingleContentEncoding) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0xA1, // ContentEncodings (size = 33)
|
||
|
0x62, 0x40, 0x9e, // ContentEncoding (size = 30)
|
||
|
0x50, 0x31, 0x81, 0x00, // ContentEncodingOrder (size = 1)
|
||
|
0x50, 0x32, 0x81, 0x01, // ContentEncodingScope (size = 1)
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
0x50, 0x35, 0x8F, // ContentEncryption (size = 15)
|
||
|
0x47, 0xE1, 0x81, 0x05, // ContentEncAlgo (size = 1)
|
||
|
0x47, 0xE2, 0x88, // ContentEncKeyID (size = 8)
|
||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
|
||
|
int result = parser_.Parse(kContentEncodings, size);
|
||
|
ASSERT_EQ(size, result);
|
||
|
const ContentEncodings& content_encodings = client_.content_encodings();
|
||
|
|
||
|
ASSERT_EQ(1u, content_encodings.size());
|
||
|
ASSERT_TRUE(content_encodings[0]);
|
||
|
EXPECT_EQ(0, content_encodings[0]->order());
|
||
|
EXPECT_EQ(ContentEncoding::kScopeAllFrameContents,
|
||
|
content_encodings[0]->scope());
|
||
|
EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type());
|
||
|
EXPECT_EQ(ContentEncoding::kEncAlgoAes,
|
||
|
content_encodings[0]->encryption_algo());
|
||
|
EXPECT_EQ(8u, content_encodings[0]->encryption_key_id().size());
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, MultipleContentEncoding) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0xC2, // ContentEncodings (size = 66)
|
||
|
0x62, 0x40, 0x9e, // ContentEncoding (size = 30)
|
||
|
0x50, 0x31, 0x81, 0x00, // ContentEncodingOrder (size = 1)
|
||
|
0x50, 0x32, 0x81, 0x03, // ContentEncodingScope (size = 1)
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
0x50, 0x35, 0x8F, // ContentEncryption (size = 15)
|
||
|
0x47, 0xE1, 0x81, 0x05, // ContentEncAlgo (size = 1)
|
||
|
0x47, 0xE2, 0x88, // ContentEncKeyID (size = 8)
|
||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||
|
0x62, 0x40, 0x9e, // ContentEncoding (size = 30)
|
||
|
0x50, 0x31, 0x81, 0x01, // ContentEncodingOrder (size = 1)
|
||
|
0x50, 0x32, 0x81, 0x03, // ContentEncodingScope (size = 1)
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
0x50, 0x35, 0x8F, // ContentEncryption (size = 15)
|
||
|
0x47, 0xE1, 0x81, 0x01, // ContentEncAlgo (size = 1)
|
||
|
0x47, 0xE2, 0x88, // ContentEncKeyID (size = 8)
|
||
|
0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
|
||
|
int result = parser_.Parse(kContentEncodings, size);
|
||
|
ASSERT_EQ(size, result);
|
||
|
const ContentEncodings& content_encodings = client_.content_encodings();
|
||
|
ASSERT_EQ(2u, content_encodings.size());
|
||
|
|
||
|
for (int i = 0; i < 2; ++i) {
|
||
|
ASSERT_TRUE(content_encodings[i]);
|
||
|
EXPECT_EQ(i, content_encodings[i]->order());
|
||
|
EXPECT_EQ(ContentEncoding::kScopeAllFrameContents |
|
||
|
ContentEncoding::kScopeTrackPrivateData,
|
||
|
content_encodings[i]->scope());
|
||
|
EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[i]->type());
|
||
|
EXPECT_EQ(!i ? ContentEncoding::kEncAlgoAes : ContentEncoding::kEncAlgoDes,
|
||
|
content_encodings[i]->encryption_algo());
|
||
|
EXPECT_EQ(8u, content_encodings[i]->encryption_key_id().size());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, DefaultValues) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0x8A, // ContentEncodings (size = 10)
|
||
|
0x62, 0x40, 0x87, // ContentEncoding (size = 7)
|
||
|
// ContentEncodingOrder missing
|
||
|
// ContentEncodingScope missing
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
0x50, 0x35, 0x80, // ContentEncryption (size = 0)
|
||
|
// ContentEncAlgo missing
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
|
||
|
int result = parser_.Parse(kContentEncodings, size);
|
||
|
ASSERT_EQ(size, result);
|
||
|
const ContentEncodings& content_encodings = client_.content_encodings();
|
||
|
|
||
|
ASSERT_EQ(1u, content_encodings.size());
|
||
|
ASSERT_TRUE(content_encodings[0]);
|
||
|
EXPECT_EQ(0, content_encodings[0]->order());
|
||
|
EXPECT_EQ(ContentEncoding::kScopeAllFrameContents,
|
||
|
content_encodings[0]->scope());
|
||
|
EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type());
|
||
|
EXPECT_EQ(ContentEncoding::kEncAlgoNotEncrypted,
|
||
|
content_encodings[0]->encryption_algo());
|
||
|
EXPECT_TRUE(content_encodings[0]->encryption_key_id().empty());
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, ContentEncodingsClientReuse) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0xA1, // ContentEncodings (size = 33)
|
||
|
0x62, 0x40, 0x9e, // ContentEncoding (size = 30)
|
||
|
0x50, 0x31, 0x81, 0x00, // ContentEncodingOrder (size = 1)
|
||
|
0x50, 0x32, 0x81, 0x01, // ContentEncodingScope (size = 1)
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
0x50, 0x35, 0x8F, // ContentEncryption (size = 15)
|
||
|
0x47, 0xE1, 0x81, 0x05, // ContentEncAlgo (size = 1)
|
||
|
0x47, 0xE2, 0x88, // ContentEncKeyID (size = 8)
|
||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
|
||
|
// Parse for the first time.
|
||
|
int result = parser_.Parse(kContentEncodings, size);
|
||
|
ASSERT_EQ(size, result);
|
||
|
|
||
|
// Parse again.
|
||
|
parser_.Reset();
|
||
|
result = parser_.Parse(kContentEncodings, size);
|
||
|
ASSERT_EQ(size, result);
|
||
|
const ContentEncodings& content_encodings = client_.content_encodings();
|
||
|
|
||
|
ASSERT_EQ(1u, content_encodings.size());
|
||
|
ASSERT_TRUE(content_encodings[0]);
|
||
|
EXPECT_EQ(0, content_encodings[0]->order());
|
||
|
EXPECT_EQ(ContentEncoding::kScopeAllFrameContents,
|
||
|
content_encodings[0]->scope());
|
||
|
EXPECT_EQ(ContentEncoding::kTypeEncryption, content_encodings[0]->type());
|
||
|
EXPECT_EQ(ContentEncoding::kEncAlgoAes,
|
||
|
content_encodings[0]->encryption_algo());
|
||
|
EXPECT_EQ(8u, content_encodings[0]->encryption_key_id().size());
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingOrder) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0x8E, // ContentEncodings (size = 14)
|
||
|
0x62, 0x40, 0x8B, // ContentEncoding (size = 11)
|
||
|
0x50, 0x31, 0x81, 0xEE, // ContentEncodingOrder (size = 1), invalid
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
0x50, 0x35, 0x80, // ContentEncryption (size = 0)
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
ParseAndExpectToFail(kContentEncodings, size);
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingScope) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0x8E, // ContentEncodings (size = 14)
|
||
|
0x62, 0x40, 0x8B, // ContentEncoding (size = 11)
|
||
|
0x50, 0x32, 0x81, 0xEE, // ContentEncodingScope (size = 1), invalid
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
0x50, 0x35, 0x80, // ContentEncryption (size = 0)
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
ParseAndExpectToFail(kContentEncodings, size);
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, InvalidContentEncodingType) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0x8E, // ContentEncodings (size = 14)
|
||
|
0x62, 0x40, 0x8B, // ContentEncoding (size = 11)
|
||
|
0x50, 0x33, 0x81, 0x00, // ContentEncodingType (size = 1), invalid
|
||
|
0x50, 0x35, 0x80, // ContentEncryption (size = 0)
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
ParseAndExpectToFail(kContentEncodings, size);
|
||
|
}
|
||
|
|
||
|
// ContentEncodingType is encryption but no ContentEncryption present.
|
||
|
TEST_F(WebMContentEncodingsClientTest, MissingContentEncryption) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0x87, // ContentEncodings (size = 7)
|
||
|
0x62, 0x40, 0x84, // ContentEncoding (size = 4)
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
// ContentEncryption missing
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
ParseAndExpectToFail(kContentEncodings, size);
|
||
|
}
|
||
|
|
||
|
TEST_F(WebMContentEncodingsClientTest, InvalidContentEncAlgo) {
|
||
|
const uint8 kContentEncodings[] = {
|
||
|
0x6D, 0x80, 0x99, // ContentEncodings (size = 25)
|
||
|
0x62, 0x40, 0x96, // ContentEncoding (size = 22)
|
||
|
0x50, 0x33, 0x81, 0x01, // ContentEncodingType (size = 1)
|
||
|
0x50, 0x35, 0x8F, // ContentEncryption (size = 15)
|
||
|
0x47, 0xE1, 0x81, 0xEE, // ContentEncAlgo (size = 1), invalid
|
||
|
0x47, 0xE2, 0x88, // ContentEncKeyID (size = 8)
|
||
|
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||
|
};
|
||
|
int size = sizeof(kContentEncodings);
|
||
|
ParseAndExpectToFail(kContentEncodings, size);
|
||
|
}
|
||
|
|
||
|
} // namespace media
|