17f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org/*
27f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
37f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org *
47f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org *  Use of this source code is governed by a BSD-style license
57f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org *  that can be found in the LICENSE file in the root of the source
67f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org *  tree. An additional intellectual property rights grant can be found
77f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org *  in the file PATENTS.  All contributing project authors may
87f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
97f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org */
107f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
117f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org#include <stdlib.h>  // NULL
127f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
13a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14a048d7cb0a5bad5ca49bbcc5273cb4cca28c1710pbos@webrtc.org#include "webrtc/modules/rtp_rtcp/source/vp8_partition_aggregator.h"
157f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
167f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgnamespace webrtc {
177f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
187f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(PartitionTreeNode, CreateAndDelete) {
194591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kVector[] = {1, 2, 3};
204591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kVector);
217f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  PartitionTreeNode* node1 =
227f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      PartitionTreeNode::CreateRootNode(kVector, kNumPartitions);
237f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  PartitionTreeNode* node2 =
247f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      new PartitionTreeNode(node1, kVector, kNumPartitions, 17);
257f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete node1;
267f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete node2;
277f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
287f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
297f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(PartitionTreeNode, CreateChildrenAndDelete) {
304591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kVector[] = {1, 2, 3};
314591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kVector);
324591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kMaxSize = 10;
334591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kPenalty = 5;
347f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  PartitionTreeNode* root =
357f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      PartitionTreeNode::CreateRootNode(kVector, kNumPartitions);
367f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_TRUE(root->CreateChildren(kMaxSize));
377f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  ASSERT_TRUE(NULL != root->left_child());
387f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  ASSERT_TRUE(NULL != root->right_child());
394591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(3u, root->left_child()->this_size());
404591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(2u, root->right_child()->this_size());
417f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_EQ(11, root->right_child()->Cost(kPenalty));
427f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_FALSE(root->left_child()->packet_start());
437f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_TRUE(root->right_child()->packet_start());
447f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete root;
457f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
467f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
477f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(PartitionTreeNode, FindOptimalConfig) {
484591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kVector[] = {197, 194, 213, 215, 184, 199, 197, 207};
494591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kVector);
504591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kMaxSize = 1500;
514591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kPenalty = 1;
527f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  PartitionTreeNode* root =
537f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      PartitionTreeNode::CreateRootNode(kVector, kNumPartitions);
547f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  root->set_max_parent_size(500);
557f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  root->set_min_parent_size(300);
567f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  PartitionTreeNode* opt = root->GetOptimalNode(kMaxSize, kPenalty);
577f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  ASSERT_TRUE(opt != NULL);
584591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(4u, opt->NumPackets());
597f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  // Expect optimal sequence to be {1, 0, 1, 0, 1, 0, 1, 0}, which corresponds
607f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  // to (right)-left-right-left-right-left-right-left, where the root node is
617f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  // implicitly a "right" node by definition.
627f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_TRUE(opt->parent()->parent()->parent()->parent()->parent()->
637f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org              parent()->parent()->packet_start());
647f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_FALSE(opt->parent()->parent()->parent()->parent()->parent()->
657f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org               parent()->packet_start());
667f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_TRUE(opt->parent()->parent()->parent()->parent()->parent()->
677f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org              packet_start());
687f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_FALSE(opt->parent()->parent()->parent()->parent()->packet_start());
697f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_TRUE(opt->parent()->parent()->parent()->packet_start());
707f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_FALSE(opt->parent()->parent()->packet_start());
717f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_TRUE(opt->parent()->packet_start());
727f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_FALSE(opt->packet_start());
737f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_TRUE(opt == root->left_child()->right_child()->left_child()->
747f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org              right_child()->left_child()->right_child()->left_child());
757f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete root;
767f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
777f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
787f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(PartitionTreeNode, FindOptimalConfigSinglePartition) {
794591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kVector[] = {17};
804591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kVector);
814591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kMaxSize = 1500;
824591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kPenalty = 1;
837f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  PartitionTreeNode* root =
847f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      PartitionTreeNode::CreateRootNode(kVector, kNumPartitions);
857f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  PartitionTreeNode* opt = root->GetOptimalNode(kMaxSize, kPenalty);
867f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  ASSERT_TRUE(opt != NULL);
874591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(1u, opt->NumPackets());
887f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_TRUE(opt == root);
897f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete root;
907f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
917f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
924591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.orgstatic void VerifyConfiguration(
934591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    const size_t* expected_config,
944591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    size_t expected_config_len,
954591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    const Vp8PartitionAggregator::ConfigVec& opt_config,
964591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org    const RTPFragmentationHeader& fragmentation) {
977f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  ASSERT_EQ(expected_config_len, fragmentation.fragmentationVectorSize);
987f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_EQ(expected_config_len, opt_config.size());
997f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  for (size_t i = 0; i < expected_config_len; ++i) {
1007f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org    EXPECT_EQ(expected_config[i], opt_config[i]);
1017f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  }
1027f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
1037f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
1047f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgstatic void VerifyMinMax(const Vp8PartitionAggregator& aggregator,
1054591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                         const Vp8PartitionAggregator::ConfigVec& opt_config,
1067f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org                         int expected_min,
1077f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org                         int expected_max) {
1087f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  int min_size = -1;
1097f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  int max_size = -1;
1107f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  aggregator.CalcMinMax(opt_config, &min_size, &max_size);
1117f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_EQ(expected_min, min_size);
1127f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_EQ(expected_max, max_size);
1137f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
1147f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
1157f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(Vp8PartitionAggregator, CreateAndDelete) {
1167f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  RTPFragmentationHeader fragmentation;
1177f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.VerifyAndAllocateFragmentationHeader(3);
1187f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  Vp8PartitionAggregator* aggregator =
1197f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      new Vp8PartitionAggregator(fragmentation, 0, 2);
1207f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete aggregator;
1217f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
1227f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
1237f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(Vp8PartitionAggregator, FindOptimalConfig) {
1247f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  RTPFragmentationHeader fragmentation;
1257f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.VerifyAndAllocateFragmentationHeader(8);
1267f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[0] = 197;
1277f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[1] = 194;
1287f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[2] = 213;
1297f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[3] = 215;
1307f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[4] = 184;
1317f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[5] = 199;
1327f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[6] = 197;
1337f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[7] = 207;
1347f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  Vp8PartitionAggregator* aggregator =
1357f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      new Vp8PartitionAggregator(fragmentation, 0, 7);
1367f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  aggregator->SetPriorMinMax(300, 500);
1374591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t kMaxSize = 1500;
1384591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t kPenalty = 1;
1394591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  Vp8PartitionAggregator::ConfigVec opt_config =
1404591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org      aggregator->FindOptimalConfiguration(kMaxSize, kPenalty);
1414591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kExpectedConfig[] = {0, 0, 1, 1, 2, 2, 3, 3};
1424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kExpectedConfigSize = GTEST_ARRAY_SIZE_(kExpectedConfig);
1437f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  VerifyConfiguration(kExpectedConfig, kExpectedConfigSize, opt_config,
1447f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org                      fragmentation);
1457f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  VerifyMinMax(*aggregator, opt_config, 383, 428);
1467f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  // Change min and max and run method again. This time, we expect it to leave
1477f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  // the values unchanged.
1487f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  int min_size = 382;
1497f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  int max_size = 429;
1507f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  aggregator->CalcMinMax(opt_config, &min_size, &max_size);
1517f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_EQ(382, min_size);
1527f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  EXPECT_EQ(429, max_size);
1537f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete aggregator;
1547f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
1557f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
1567f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(Vp8PartitionAggregator, FindOptimalConfigEqualFragments) {
1577f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  RTPFragmentationHeader fragmentation;
1587f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.VerifyAndAllocateFragmentationHeader(8);
1597f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[0] = 200;
1607f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[1] = 200;
1617f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[2] = 200;
1627f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[3] = 200;
1637f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[4] = 200;
1647f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[5] = 200;
1657f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[6] = 200;
1667f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[7] = 200;
1677f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  Vp8PartitionAggregator* aggregator =
1687f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      new Vp8PartitionAggregator(fragmentation, 0, 7);
1694591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t kMaxSize = 1500;
1704591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t kPenalty = 1;
1714591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  Vp8PartitionAggregator::ConfigVec opt_config =
1724591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org      aggregator->FindOptimalConfiguration(kMaxSize, kPenalty);
1734591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kExpectedConfig[] = {0, 0, 0, 0, 1, 1, 1, 1};
1744591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kExpectedConfigSize = GTEST_ARRAY_SIZE_(kExpectedConfig);
1757f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  VerifyConfiguration(kExpectedConfig, kExpectedConfigSize, opt_config,
1767f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org                      fragmentation);
1777f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  VerifyMinMax(*aggregator, opt_config, 800, 800);
1787f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete aggregator;
1797f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
1807f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
1817f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(Vp8PartitionAggregator, FindOptimalConfigSinglePartition) {
1827f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  RTPFragmentationHeader fragmentation;
1837f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.VerifyAndAllocateFragmentationHeader(1);
1847f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  fragmentation.fragmentationLength[0] = 17;
1857f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  Vp8PartitionAggregator* aggregator =
1867f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org      new Vp8PartitionAggregator(fragmentation, 0, 0);
1874591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t kMaxSize = 1500;
1884591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t kPenalty = 1;
1894591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  Vp8PartitionAggregator::ConfigVec opt_config =
1904591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org      aggregator->FindOptimalConfiguration(kMaxSize, kPenalty);
1914591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kExpectedConfig[] = {0};
1924591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  const size_t kExpectedConfigSize = GTEST_ARRAY_SIZE_(kExpectedConfig);
1937f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  VerifyConfiguration(kExpectedConfig, kExpectedConfigSize, opt_config,
1947f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org                      fragmentation);
1957f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  VerifyMinMax(*aggregator, opt_config, 17, 17);
1967f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  delete aggregator;
1977f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
1987f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
1997f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.orgTEST(Vp8PartitionAggregator, TestCalcNumberOfFragments) {
2007f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org  const int kMTU = 1500;
2014591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(2u,
2027f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org            Vp8PartitionAggregator::CalcNumberOfFragments(
2037f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org                1600, kMTU, 1, 300, 900));
2044591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(3u,
2057f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org            Vp8PartitionAggregator::CalcNumberOfFragments(
2067f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org                1600, kMTU, 1, 300, 798));
2074591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  EXPECT_EQ(2u,
2087f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org            Vp8PartitionAggregator::CalcNumberOfFragments(
2097f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org                1600, kMTU, 1, 900, 1000));
2107f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org}
2117f2c2a5db29cb337eb3885b36158773ace880d68henrik.lundin@webrtc.org
2126a6f0893dd1e653410ba4b22e7f33947d15aeb65danilchap}  // namespace webrtc
213