11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <list>
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector>
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/basictypes.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/threading/thread.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/balanced_media_task_runner_factory.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/media_task_runner.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromecast {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct MediaTaskRunnerTestContext {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MediaTaskRunnerTestContext();
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ~MediaTaskRunnerTestContext();
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<MediaTaskRunner> media_task_runner;
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool is_pending_task;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<base::TimeDelta> task_timestamp_list;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t task_index;
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeDelta max_timestamp;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMediaTaskRunnerTestContext::MediaTaskRunnerTestContext() {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMediaTaskRunnerTestContext::~MediaTaskRunnerTestContext() {
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BalancedMediaTaskRunnerTest : public testing::Test {
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BalancedMediaTaskRunnerTest();
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~BalancedMediaTaskRunnerTest();
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetupTest(base::TimeDelta max_delta,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const std::vector<std::vector<int> >& timestamps_in_ms,
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const std::vector<size_t>& pattern,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 const std::vector<int>& expected_task_timestamps_ms);
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ProcessAllTasks();
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Expected task order based on their timestamps.
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::list<base::TimeDelta> expected_task_timestamps_;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ScheduleTask();
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Task(size_t task_runner_id, base::TimeDelta timestamp);
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnTestTimeout();
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<BalancedMediaTaskRunnerFactory> media_task_runner_factory_;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Schedule first a task on media task runner #scheduling_pattern[0]
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // then a task on media task runner #scheduling_pattern[1] and so on.
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Wrap around when reaching the end of the pattern.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<size_t> scheduling_pattern_;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t pattern_index_;
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // For each media task runner, keep a track of which task has already been
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // scheduled.
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<MediaTaskRunnerTestContext> contexts_;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(BalancedMediaTaskRunnerTest);
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBalancedMediaTaskRunnerTest::BalancedMediaTaskRunnerTest() {
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBalancedMediaTaskRunnerTest::~BalancedMediaTaskRunnerTest() {
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BalancedMediaTaskRunnerTest::SetupTest(
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::TimeDelta max_delta,
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<std::vector<int> >& timestamps_in_ms,
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<size_t>& pattern,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<int>& expected_task_timestamps_ms) {
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  media_task_runner_factory_ = new BalancedMediaTaskRunnerFactory(max_delta);
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scheduling_pattern_ = pattern;
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pattern_index_ = 0;
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Setup each task runner.
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t n = timestamps_in_ms.size();
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  contexts_.resize(n);
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t k = 0; k < n; k++) {
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    contexts_[k].media_task_runner =
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        media_task_runner_factory_->CreateMediaTaskRunner(
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            base::MessageLoopProxy::current());
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    contexts_[k].is_pending_task = false;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    contexts_[k].task_index = 0;
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    contexts_[k].task_timestamp_list.resize(
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        timestamps_in_ms[k].size());
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (size_t i = 0; i < timestamps_in_ms[k].size(); i++) {
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      contexts_[k].task_timestamp_list[i] =
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::TimeDelta::FromMilliseconds(timestamps_in_ms[k][i]);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Expected task order (for tasks that are actually run).
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t k = 0; k < expected_task_timestamps_ms.size(); k++) {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expected_task_timestamps_.push_back(
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::TimeDelta::FromMilliseconds(expected_task_timestamps_ms[k]));
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BalancedMediaTaskRunnerTest::ProcessAllTasks() {
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::MessageLoop::current()->PostDelayedTask(
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FROM_HERE,
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&BalancedMediaTaskRunnerTest::OnTestTimeout,
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)),
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::TimeDelta::FromSeconds(5));
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScheduleTask();
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BalancedMediaTaskRunnerTest::ScheduleTask() {
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool has_task = false;
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t k = 0; k < contexts_.size(); k++) {
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (contexts_[k].task_index < contexts_[k].task_timestamp_list.size())
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      has_task = true;
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!has_task) {
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::MessageLoop::current()->QuitWhenIdle();
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t next_pattern_index =
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (pattern_index_ + 1) % scheduling_pattern_.size();
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t task_runner_id = scheduling_pattern_[pattern_index_];
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MediaTaskRunnerTestContext& context = contexts_[task_runner_id];
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Check whether all tasks have been scheduled for that task runner
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // or if there is already one pending task.
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (context.task_index >= context.task_timestamp_list.size() ||
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      context.is_pending_task) {
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pattern_index_ = next_pattern_index;
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::MessageLoopProxy::current()->PostTask(
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FROM_HERE,
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&BalancedMediaTaskRunnerTest::ScheduleTask,
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   base::Unretained(this)));
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool expected_may_run = false;
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (context.task_timestamp_list[context.task_index] >=
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      context.max_timestamp) {
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expected_may_run = true;
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    context.max_timestamp = context.task_timestamp_list[context.task_index];
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool may_run = context.media_task_runner->PostMediaTask(
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FROM_HERE,
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&BalancedMediaTaskRunnerTest::Task,
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this),
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 task_runner_id,
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 context.task_timestamp_list[context.task_index]),
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      context.task_timestamp_list[context.task_index]);
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(may_run, expected_may_run);
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (may_run)
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    context.is_pending_task = true;
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  context.task_index++;
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pattern_index_ = next_pattern_index;
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::MessageLoopProxy::current()->PostTask(
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FROM_HERE,
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&BalancedMediaTaskRunnerTest::ScheduleTask,
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(this)));
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BalancedMediaTaskRunnerTest::Task(
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    size_t task_runner_id, base::TimeDelta timestamp) {
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_FALSE(expected_task_timestamps_.empty());
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(timestamp, expected_task_timestamps_.front());
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_task_timestamps_.pop_front();
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  contexts_[task_runner_id].is_pending_task = false;
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BalancedMediaTaskRunnerTest::OnTestTimeout() {
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ADD_FAILURE() << "Test timed out";
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (base::MessageLoop::current())
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::MessageLoop::current()->QuitWhenIdle();
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BalancedMediaTaskRunnerTest, OneTaskRunner) {
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Timestamps of tasks for the single task runner.
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int timestamps0_ms[] = {0, 10, 20, 30, 40, 30, 50, 60, 20, 30, 70};
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::vector<int> > timestamps_ms(1);
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  timestamps_ms[0] = std::vector<int>(
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      timestamps0_ms, timestamps0_ms + arraysize(timestamps0_ms));
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Scheduling pattern.
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<size_t> scheduling_pattern(1);
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scheduling_pattern[0] = 0;
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Expected results.
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int expected_timestamps[] = {0, 10, 20, 30, 40, 50, 60, 70};
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<int> expected_timestamps_ms(std::vector<int>(
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      expected_timestamps,
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      expected_timestamps + arraysize(expected_timestamps)));
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetupTest(base::TimeDelta::FromMilliseconds(30),
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            timestamps_ms,
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            scheduling_pattern,
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected_timestamps_ms);
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ProcessAllTasks();
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  message_loop->Run();
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(expected_task_timestamps_.empty());
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BalancedMediaTaskRunnerTest, TwoTaskRunnerUnbalanced) {
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Timestamps of tasks for the 2 task runners.
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int timestamps0_ms[] = {0, 10, 20, 30, 40, 30, 50, 60, 20, 30, 70};
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int timestamps1_ms[] = {5, 15, 25, 35, 45, 35, 55, 65, 25, 35, 75};
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::vector<int> > timestamps_ms(2);
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  timestamps_ms[0] = std::vector<int>(
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      timestamps0_ms, timestamps0_ms + arraysize(timestamps0_ms));
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  timestamps_ms[1] = std::vector<int>(
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      timestamps1_ms, timestamps1_ms + arraysize(timestamps1_ms));
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Scheduling pattern.
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  size_t pattern[] = {1, 0, 0, 0, 0};
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<size_t> scheduling_pattern = std::vector<size_t>(
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      pattern, pattern + arraysize(pattern));
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Expected results.
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int expected_timestamps[] = {
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    5, 0, 10, 20, 30, 15, 40, 25, 50, 35, 60, 45, 70, 55, 65, 75 };
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<int> expected_timestamps_ms(std::vector<int>(
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      expected_timestamps,
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      expected_timestamps + arraysize(expected_timestamps)));
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SetupTest(base::TimeDelta::FromMilliseconds(30),
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            timestamps_ms,
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            scheduling_pattern,
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected_timestamps_ms);
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ProcessAllTasks();
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  message_loop->Run();
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(expected_task_timestamps_.empty());
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace media
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace chromecast
264