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