147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <sys/time.h> 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_POSIX 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO: Remove this once the cause of sporadic failures in these 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// tests is tracked down. 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <iostream> 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/win32.h" 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_WIN 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/common.h" 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h" 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/logging.h" 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/task.h" 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/taskrunner.h" 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/thread.h" 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/timeutils.h" 30a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.org#include "webrtc/test/testsupport/gtest_disable.h" 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic int64 GetCurrentTime() { 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return static_cast<int64>(Time()) * 10000; 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// feel free to change these numbers. Note that '0' won't work, though 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define STUCK_TASK_COUNT 5 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define HAPPY_TASK_COUNT 20 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// this is a generic timeout task which, when it signals timeout, will 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// include the unique ID of the task in the signal (we don't use this 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// in production code because we haven't yet had occasion to generate 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// an array of the same types of task) 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass IdTimeoutTask : public Task, public sigslot::has_slots<> { 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit IdTimeoutTask(TaskParent *parent) : Task(parent) { 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SignalTimeout.connect(this, &IdTimeoutTask::OnLocalTimeout); 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigslot::signal1<const int> SignalTimeoutId; 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org sigslot::signal1<const int> SignalDoneId; 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int ProcessStart() { 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return STATE_RESPONSE; 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnLocalTimeout() { 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SignalTimeoutId(unique_id()); 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void Stop() { 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SignalDoneId(unique_id()); 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Task::Stop(); 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass StuckTask : public IdTimeoutTask { 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit StuckTask(TaskParent *parent) : IdTimeoutTask(parent) {} 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int ProcessStart() { 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return STATE_BLOCKED; 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass HappyTask : public IdTimeoutTask { 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit HappyTask(TaskParent *parent) : IdTimeoutTask(parent) { 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org time_to_perform_ = rand() % (STUCK_TASK_COUNT / 2); 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int ProcessStart() { 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (ElapsedTime() > (time_to_perform_ * 1000 * 10000)) 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return STATE_RESPONSE; 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org else 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return STATE_BLOCKED; 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int time_to_perform_; 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// simple implementation of a task runner which uses Windows' 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// GetSystemTimeAsFileTime() to get the current clock ticks 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass MyTaskRunner : public TaskRunner { 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void WakeTasks() { RunTasks(); } 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int64 CurrentTime() { 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return GetCurrentTime(); 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool timeout_change() const { 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return timeout_change_; 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void clear_timeout_change() { 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org timeout_change_ = false; 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnTimeoutChange() { 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org timeout_change_ = true; 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool timeout_change_; 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// this unit test is primarily concerned (for now) with the timeout 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// functionality in tasks. It works as follows: 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// * Create a bunch of tasks, some "stuck" (ie., guaranteed to timeout) 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// and some "happy" (will immediately finish). 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// * Set the timeout on the "stuck" tasks to some number of seconds between 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 1 and the number of stuck tasks 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// * Start all the stuck & happy tasks in random order 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// * Wait "number of stuck tasks" seconds and make sure everything timed out 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass TaskTest : public sigslot::has_slots<> { 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TaskTest() {} 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // no need to delete any tasks; the task runner owns them 13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ~TaskTest() {} 13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Start() { 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // create and configure tasks 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < STUCK_TASK_COUNT; ++i) { 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].task_ = new StuckTask(&task_runner_); 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].task_->SignalTimeoutId.connect(this, 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org &TaskTest::OnTimeoutStuck); 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].timed_out_ = false; 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].xlat_ = stuck_[i].task_->unique_id(); 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].task_->set_timeout_seconds(i + 1); 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "Task " << stuck_[i].xlat_ << " created with timeout " 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org << stuck_[i].task_->timeout_seconds(); 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < HAPPY_TASK_COUNT; ++i) { 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[i].task_ = new HappyTask(&task_runner_); 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[i].task_->SignalTimeoutId.connect(this, 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org &TaskTest::OnTimeoutHappy); 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[i].task_->SignalDoneId.connect(this, 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org &TaskTest::OnDoneHappy); 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[i].timed_out_ = false; 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[i].xlat_ = happy_[i].task_->unique_id(); 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // start all the tasks in random order 16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int stuck_index = 0; 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int happy_index = 0; 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < STUCK_TASK_COUNT + HAPPY_TASK_COUNT; ++i) { 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if ((stuck_index < STUCK_TASK_COUNT) && 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org (happy_index < HAPPY_TASK_COUNT)) { 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (rand() % 2 == 1) { 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[stuck_index++].task_->Start(); 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[happy_index++].task_->Start(); 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else if (stuck_index < STUCK_TASK_COUNT) { 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[stuck_index++].task_->Start(); 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } else { 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[happy_index++].task_->Start(); 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < STUCK_TASK_COUNT; ++i) { 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::cout << "Stuck task #" << i << " timeout is " << 18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].task_->timeout_seconds() << " at " << 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].task_->timeout_time() << std::endl; 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // just a little self-check to make sure we started all the tasks 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT_EQ(STUCK_TASK_COUNT, stuck_index); 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT_EQ(HAPPY_TASK_COUNT, happy_index); 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // run the unblocked tasks 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "Running tasks"; 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.RunTasks(); 19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::cout << "Start time is " << GetCurrentTime() << std::endl; 19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // give all the stuck tasks time to timeout 19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; !task_runner_.AllChildrenDone() && i < STUCK_TASK_COUNT; 19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ++i) { 19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::Current()->ProcessMessages(1000); 19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int j = 0; j < HAPPY_TASK_COUNT; ++j) { 19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (happy_[j].task_) { 20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[j].task_->Wake(); 20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "Polling tasks"; 20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.PollTasks(); 20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // We see occasional test failures here due to the stuck tasks not having 20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // timed-out yet, which seems like it should be impossible. To help track 20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // this down we have added logging of the timing information, which we send 21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // directly to stdout so that we get it in opt builds too. 21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::cout << "End time is " << GetCurrentTime() << std::endl; 21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnTimeoutStuck(const int id) { 21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_INFO) << "Timed out task " << id; 21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int i; 21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (i = 0; i < STUCK_TASK_COUNT; ++i) { 21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (stuck_[i].xlat_ == id) { 22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].timed_out_ = true; 22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_[i].task_ = NULL; 22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org break; 22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // getting a bad ID here is a failure, but let's continue 22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // running to see what else might go wrong 22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LT(i, STUCK_TASK_COUNT); 22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnTimeoutHappy(const int id) { 23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int i; 23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (i = 0; i < HAPPY_TASK_COUNT; ++i) { 23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (happy_[i].xlat_ == id) { 23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[i].timed_out_ = true; 23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[i].task_ = NULL; 23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org break; 23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // getting a bad ID here is a failure, but let's continue 24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // running to see what else might go wrong 24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LT(i, HAPPY_TASK_COUNT); 24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnDoneHappy(const int id) { 24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int i; 24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (i = 0; i < HAPPY_TASK_COUNT; ++i) { 24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (happy_[i].xlat_ == id) { 25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_[i].task_ = NULL; 25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org break; 25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // getting a bad ID here is a failure, but let's continue 25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // running to see what else might go wrong 25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LT(i, HAPPY_TASK_COUNT); 25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 26047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void check_passed() { 26147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(task_runner_.AllChildrenDone()); 26247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 26347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // make sure none of our happy tasks timed out 26447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < HAPPY_TASK_COUNT; ++i) { 26547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(happy_[i].timed_out_); 26647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 26747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 26847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // make sure all of our stuck tasks timed out 26947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < STUCK_TASK_COUNT; ++i) { 27047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(stuck_[i].timed_out_); 27147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!stuck_[i].timed_out_) { 27247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::cout << "Stuck task #" << i << " timeout is at " 27347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org << stuck_[i].task_->timeout_time() << std::endl; 27447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 27547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 27647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 27747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org std::cout.flush(); 27847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 27947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 28047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 28147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org struct TaskInfo { 28247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org IdTimeoutTask *task_; 28347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool timed_out_; 28447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int xlat_; 28547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org }; 28647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 28747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org MyTaskRunner task_runner_; 28847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TaskInfo stuck_[STUCK_TASK_COUNT]; 28947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TaskInfo happy_[HAPPY_TASK_COUNT]; 29047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 29147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 29260b0bb686eaec50337df5a6253eb9bc57882189akjellander@webrtc.orgTEST(start_task_test, DISABLED_ON_MAC(Timeout)) { 29347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TaskTest task_test; 29447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_test.Start(); 29547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_test.check_passed(); 29647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 29747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 29847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test for aborting the task while it is running 29947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 30047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AbortTask : public Task { 30147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 30247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org explicit AbortTask(TaskParent *parent) : Task(parent) { 30347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org set_timeout_seconds(1); 30447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 30547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 30647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int ProcessStart() { 30747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Abort(); 30847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return STATE_NEXT; 30947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 31047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 31147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(AbortTask); 31247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 31347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 31447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass TaskAbortTest : public sigslot::has_slots<> { 31547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 31647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TaskAbortTest() {} 31747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 31847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // no need to delete any tasks; the task runner owns them 31947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ~TaskAbortTest() {} 32047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 32147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Start() { 32247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Task *abort_task = new AbortTask(&task_runner_); 32347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org abort_task->SignalTimeout.connect(this, &TaskAbortTest::OnTimeout); 32447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org abort_task->Start(); 32547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 32647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // run the task 32747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.RunTasks(); 32847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 32947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 33047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 33147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnTimeout() { 33247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org FAIL() << "Task timed out instead of aborting."; 33347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 33447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 33547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org MyTaskRunner task_runner_; 33647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(TaskAbortTest); 33747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 33847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 339a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST(start_task_test, DISABLED_ON_MAC(Abort)) { 34047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TaskAbortTest abort_test; 34147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org abort_test.Start(); 34247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 34347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 34447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test for aborting a task to verify that it does the Wake operation 34547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// which gets it deleted. 34647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 34747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass SetBoolOnDeleteTask : public Task { 34847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 34947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SetBoolOnDeleteTask(TaskParent *parent, bool *set_when_deleted) 35047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org : Task(parent), 35147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org set_when_deleted_(set_when_deleted) { 35247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(NULL != set_when_deleted); 35347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(*set_when_deleted); 35447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 35547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 35647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~SetBoolOnDeleteTask() { 35747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *set_when_deleted_ = true; 35847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 35947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 36047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int ProcessStart() { 36147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return STATE_BLOCKED; 36247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 36347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 36447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 36547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool* set_when_deleted_; 36647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(SetBoolOnDeleteTask); 36747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 36847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 36947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass AbortShouldWakeTest : public sigslot::has_slots<> { 37047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 37147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AbortShouldWakeTest() {} 37247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 37347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // no need to delete any tasks; the task runner owns them 37447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ~AbortShouldWakeTest() {} 37547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 37647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Start() { 37747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool task_deleted = false; 37847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Task *task_to_abort = new SetBoolOnDeleteTask(&task_runner_, &task_deleted); 37947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_to_abort->Start(); 38047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 38147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Task::Abort() should call TaskRunner::WakeTasks(). WakeTasks calls 38247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // TaskRunner::RunTasks() immediately which should delete the task. 38347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_to_abort->Abort(); 38447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(task_deleted); 38547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 38647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!task_deleted) { 38747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // avoid a crash (due to referencing a local variable) 38847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // if the test fails. 38947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.RunTasks(); 39047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 39147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 39247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 39347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 39447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnTimeout() { 39547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org FAIL() << "Task timed out instead of aborting."; 39647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 39747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 39847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org MyTaskRunner task_runner_; 39947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(AbortShouldWakeTest); 40047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 40147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 402a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST(start_task_test, DISABLED_ON_MAC(AbortShouldWake)) { 40347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AbortShouldWakeTest abort_should_wake_test; 40447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org abort_should_wake_test.Start(); 40547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 40647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 40747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Validate that TaskRunner's OnTimeoutChange gets called appropriately 40847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// * When a task calls UpdateTaskTimeout 40947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// * When the next timeout task time, times out 41047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass TimeoutChangeTest : public sigslot::has_slots<> { 41147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 41247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TimeoutChangeTest() 41347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org : task_count_(ARRAY_SIZE(stuck_tasks_)) {} 41447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 41547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // no need to delete any tasks; the task runner owns them 41647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ~TimeoutChangeTest() {} 41747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 41847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Start() { 41947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < task_count_; ++i) { 42047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_tasks_[i] = new StuckTask(&task_runner_); 42147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_tasks_[i]->set_timeout_seconds(i + 2); 42247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_tasks_[i]->SignalTimeoutId.connect(this, 42347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org &TimeoutChangeTest::OnTimeoutId); 42447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 42547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 42647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = task_count_ - 1; i >= 0; --i) { 42747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_tasks_[i]->Start(); 42847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 42947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.clear_timeout_change(); 43047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 43147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // At this point, our timeouts are set as follows 43247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // task[0] is 2 seconds, task[1] at 3 seconds, etc. 43347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 43447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_tasks_[0]->set_timeout_seconds(2); 43547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Now, task[0] is 2 seconds, task[1] at 3 seconds... 43647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // so timeout change shouldn't be called. 43747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(task_runner_.timeout_change()); 43847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.clear_timeout_change(); 43947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 44047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_tasks_[0]->set_timeout_seconds(1); 44147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // task[0] is 1 seconds, task[1] at 3 seconds... 44247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The smallest timeout got smaller so timeout change be called. 44347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(task_runner_.timeout_change()); 44447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.clear_timeout_change(); 44547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 44647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_tasks_[1]->set_timeout_seconds(2); 44747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // task[0] is 1 seconds, task[1] at 2 seconds... 44847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The smallest timeout is still 1 second so no timeout change. 44947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_FALSE(task_runner_.timeout_change()); 45047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.clear_timeout_change(); 45147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 45247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org while (task_count_ > 0) { 45347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int previous_count = task_count_; 45447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.PollTasks(); 45547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (previous_count != task_count_) { 45647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // We only get here when a task times out. When that 45747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // happens, the timeout change should get called because 45847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // the smallest timeout is now in the past. 45947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(task_runner_.timeout_change()); 46047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner_.clear_timeout_change(); 46147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 46247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::Current()->socketserver()->Wait(500, false); 46347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 46447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 46547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 46647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 46747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void OnTimeoutId(const int id) { 46847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (int i = 0; i < ARRAY_SIZE(stuck_tasks_); ++i) { 46947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (stuck_tasks_[i] && stuck_tasks_[i]->unique_id() == id) { 47047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_count_--; 47147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org stuck_tasks_[i] = NULL; 47247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org break; 47347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 47447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 47547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 47647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 47747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org MyTaskRunner task_runner_; 47847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org StuckTask* (stuck_tasks_[3]); 47947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int task_count_; 48047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(TimeoutChangeTest); 48147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 48247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 48360b0bb686eaec50337df5a6253eb9bc57882189akjellander@webrtc.orgTEST(start_task_test, DISABLED_ON_MAC(TimeoutChange)) { 48447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TimeoutChangeTest timeout_change_test; 48547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org timeout_change_test.Start(); 48647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 48747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 48847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass DeleteTestTaskRunner : public TaskRunner { 48947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 49047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DeleteTestTaskRunner() { 49147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 49247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void WakeTasks() { } 49347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int64 CurrentTime() { 49447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org return GetCurrentTime(); 49547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 49647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 49747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DISALLOW_EVIL_CONSTRUCTORS(DeleteTestTaskRunner); 49847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 49947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 500a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST(unstarted_task_test, DISABLED_ON_MAC(DeleteTask)) { 50147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // This test ensures that we don't 50247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // crash if a task is deleted without running it. 50347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DeleteTestTaskRunner task_runner; 50447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HappyTask* happy_task = new HappyTask(&task_runner); 50547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_task->Start(); 50647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 50747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // try deleting the task directly 50847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HappyTask* child_happy_task = new HappyTask(happy_task); 50947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org delete child_happy_task; 51047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 51147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // run the unblocked tasks 51247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner.RunTasks(); 51347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 51447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 515a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST(unstarted_task_test, DISABLED_ON_MAC(DoNotDeleteTask1)) { 51647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // This test ensures that we don't 51747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // crash if a task runner is deleted without 51847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // running a certain task. 51947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DeleteTestTaskRunner task_runner; 52047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HappyTask* happy_task = new HappyTask(&task_runner); 52147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_task->Start(); 52247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 52347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HappyTask* child_happy_task = new HappyTask(happy_task); 52447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org child_happy_task->Start(); 52547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 52647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Never run the tasks 52747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 52847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 529a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST(unstarted_task_test, DISABLED_ON_MAC(DoNotDeleteTask2)) { 53047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // This test ensures that we don't 53147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // crash if a taskrunner is delete with a 53247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // task that has never been started. 53347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DeleteTestTaskRunner task_runner; 53447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org HappyTask* happy_task = new HappyTask(&task_runner); 53547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org happy_task->Start(); 53647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 53747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Do not start the task. 53847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Note: this leaks memory, so don't do this. 53947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Instead, always run your tasks or delete them. 54047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org new HappyTask(happy_task); 54147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 54247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // run the unblocked tasks 54347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org task_runner.RunTasks(); 54447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 54547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 54647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 547