root/media/formats/webm/webm_content_encodings_client_unittest.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. parser_
  2. ParseAndExpectToFail
  3. TEST_F
  4. TEST_F
  5. TEST_F
  6. TEST_F
  7. TEST_F
  8. TEST_F
  9. TEST_F
  10. TEST_F
  11. TEST_F
  12. TEST_F
  13. TEST_F

// Copyright 2014 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/formats/webm/webm_constants.h"
#include "media/formats/webm/webm_content_encodings_client.h"
#include "media/formats/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

/* [<][>][^][v][top][bottom][index][help] */