1 // Copyright 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "cc/scheduler/delay_based_time_source.h" 6 7 #include "base/basictypes.h" 8 #include "base/test/test_simple_task_runner.h" 9 #include "cc/test/scheduler_test_common.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 namespace cc { 13 namespace { 14 15 base::TimeDelta Interval() { 16 return base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / 17 60); 18 } 19 20 TEST(DelayBasedTimeSourceTest, TaskPostedAndTickCalled) { 21 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 22 new base::TestSimpleTaskRunner; 23 FakeTimeSourceClient client; 24 scoped_refptr<FakeDelayBasedTimeSource> timer = 25 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 26 timer->SetClient(&client); 27 28 timer->SetActive(true); 29 EXPECT_TRUE(timer->Active()); 30 EXPECT_TRUE(task_runner->HasPendingTask()); 31 32 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(16)); 33 task_runner->RunPendingTasks(); 34 EXPECT_TRUE(timer->Active()); 35 EXPECT_TRUE(client.TickCalled()); 36 } 37 38 TEST(DelayBasedTimeSource, TickNotCalledWithTaskPosted) { 39 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 40 new base::TestSimpleTaskRunner; 41 FakeTimeSourceClient client; 42 scoped_refptr<FakeDelayBasedTimeSource> timer = 43 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 44 timer->SetClient(&client); 45 timer->SetActive(true); 46 EXPECT_TRUE(task_runner->HasPendingTask()); 47 timer->SetActive(false); 48 task_runner->RunPendingTasks(); 49 EXPECT_FALSE(client.TickCalled()); 50 } 51 52 TEST(DelayBasedTimeSource, StartTwiceEnqueuesOneTask) { 53 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 54 new base::TestSimpleTaskRunner; 55 FakeTimeSourceClient client; 56 scoped_refptr<FakeDelayBasedTimeSource> timer = 57 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 58 timer->SetClient(&client); 59 timer->SetActive(true); 60 EXPECT_TRUE(task_runner->HasPendingTask()); 61 task_runner->ClearPendingTasks(); 62 timer->SetActive(true); 63 EXPECT_FALSE(task_runner->HasPendingTask()); 64 } 65 66 TEST(DelayBasedTimeSource, StartWhenRunningDoesntTick) { 67 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 68 new base::TestSimpleTaskRunner; 69 FakeTimeSourceClient client; 70 scoped_refptr<FakeDelayBasedTimeSource> timer = 71 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 72 timer->SetClient(&client); 73 timer->SetActive(true); 74 EXPECT_TRUE(task_runner->HasPendingTask()); 75 task_runner->RunPendingTasks(); 76 task_runner->ClearPendingTasks(); 77 timer->SetActive(true); 78 EXPECT_FALSE(task_runner->HasPendingTask()); 79 } 80 81 // At 60Hz, when the tick returns at exactly the requested next time, make sure 82 // a 16ms next delay is posted. 83 TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyOnRequestedTime) { 84 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 85 new base::TestSimpleTaskRunner; 86 FakeTimeSourceClient client; 87 scoped_refptr<FakeDelayBasedTimeSource> timer = 88 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 89 timer->SetClient(&client); 90 timer->SetActive(true); 91 // Run the first tick. 92 task_runner->RunPendingTasks(); 93 94 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 95 96 timer->SetNow(timer->Now() + Interval()); 97 task_runner->RunPendingTasks(); 98 99 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 100 } 101 102 // At 60Hz, when the tick returns at slightly after the requested next time, 103 // make sure a 16ms next delay is posted. 104 TEST(DelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterRequestedTime) { 105 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 106 new base::TestSimpleTaskRunner; 107 FakeTimeSourceClient client; 108 scoped_refptr<FakeDelayBasedTimeSource> timer = 109 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 110 timer->SetClient(&client); 111 timer->SetActive(true); 112 // Run the first tick. 113 task_runner->RunPendingTasks(); 114 115 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 116 117 timer->SetNow(timer->Now() + Interval() + 118 base::TimeDelta::FromMicroseconds(1)); 119 task_runner->RunPendingTasks(); 120 121 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 122 } 123 124 // At 60Hz, when the tick returns at exactly 2*interval after the requested next 125 // time, make sure a 0ms next delay is posted. 126 TEST(DelayBasedTimeSource, NextDelaySaneWhenExactlyTwiceAfterRequestedTime) { 127 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 128 new base::TestSimpleTaskRunner; 129 FakeTimeSourceClient client; 130 scoped_refptr<FakeDelayBasedTimeSource> timer = 131 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 132 timer->SetClient(&client); 133 timer->SetActive(true); 134 // Run the first tick. 135 task_runner->RunPendingTasks(); 136 137 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 138 139 timer->SetNow(timer->Now() + 2 * Interval()); 140 task_runner->RunPendingTasks(); 141 142 EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds()); 143 } 144 145 // At 60Hz, when the tick returns at 2*interval and a bit after the requested 146 // next time, make sure a 16ms next delay is posted. 147 TEST(DelayBasedTimeSource, NextDelaySaneWhenSlightlyAfterTwiceRequestedTime) { 148 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 149 new base::TestSimpleTaskRunner; 150 FakeTimeSourceClient client; 151 scoped_refptr<FakeDelayBasedTimeSource> timer = 152 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 153 timer->SetClient(&client); 154 timer->SetActive(true); 155 // Run the first tick. 156 task_runner->RunPendingTasks(); 157 158 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 159 160 timer->SetNow(timer->Now() + 2 * Interval() + 161 base::TimeDelta::FromMicroseconds(1)); 162 task_runner->RunPendingTasks(); 163 164 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 165 } 166 167 // At 60Hz, when the tick returns halfway to the next frame time, make sure 168 // a correct next delay value is posted. 169 TEST(DelayBasedTimeSource, NextDelaySaneWhenHalfAfterRequestedTime) { 170 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 171 new base::TestSimpleTaskRunner; 172 FakeTimeSourceClient client; 173 scoped_refptr<FakeDelayBasedTimeSource> timer = 174 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 175 timer->SetClient(&client); 176 timer->SetActive(true); 177 // Run the first tick. 178 task_runner->RunPendingTasks(); 179 180 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 181 182 timer->SetNow(timer->Now() + Interval() + 183 base::TimeDelta::FromMilliseconds(8)); 184 task_runner->RunPendingTasks(); 185 186 EXPECT_EQ(8, task_runner->NextPendingTaskDelay().InMilliseconds()); 187 } 188 189 // If the timebase and interval are updated with a jittery source, we want to 190 // make sure we do not double tick. 191 TEST(DelayBasedTimeSource, SaneHandlingOfJitteryTimebase) { 192 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 193 new base::TestSimpleTaskRunner; 194 FakeTimeSourceClient client; 195 scoped_refptr<FakeDelayBasedTimeSource> timer = 196 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 197 timer->SetClient(&client); 198 timer->SetActive(true); 199 // Run the first tick. 200 task_runner->RunPendingTasks(); 201 202 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 203 204 // Jitter timebase ~1ms late 205 timer->SetNow(timer->Now() + Interval()); 206 timer->SetTimebaseAndInterval( 207 timer->Now() + base::TimeDelta::FromMilliseconds(1), Interval()); 208 task_runner->RunPendingTasks(); 209 210 // Without double tick prevention, NextPendingTaskDelay would be 1. 211 EXPECT_EQ(17, task_runner->NextPendingTaskDelay().InMilliseconds()); 212 213 // Jitter timebase ~1ms early 214 timer->SetNow(timer->Now() + Interval()); 215 timer->SetTimebaseAndInterval( 216 timer->Now() - base::TimeDelta::FromMilliseconds(1), Interval()); 217 task_runner->RunPendingTasks(); 218 219 EXPECT_EQ(15, task_runner->NextPendingTaskDelay().InMilliseconds()); 220 } 221 222 TEST(DelayBasedTimeSource, HandlesSignificantTimebaseChangesImmediately) { 223 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 224 new base::TestSimpleTaskRunner; 225 FakeTimeSourceClient client; 226 scoped_refptr<FakeDelayBasedTimeSource> timer = 227 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 228 timer->SetClient(&client); 229 timer->SetActive(true); 230 // Run the first tick. 231 task_runner->RunPendingTasks(); 232 233 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 234 235 // Tick, then shift timebase by +7ms. 236 timer->SetNow(timer->Now() + Interval()); 237 task_runner->RunPendingTasks(); 238 239 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 240 241 client.Reset(); 242 task_runner->ClearPendingTasks(); 243 task_runner->RunPendingTasks(); 244 base::TimeDelta jitter = base::TimeDelta::FromMilliseconds(7) + 245 base::TimeDelta::FromMicroseconds(1); 246 timer->SetTimebaseAndInterval(timer->Now() + jitter, Interval()); 247 248 EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled. 249 EXPECT_EQ(16 + 7, task_runner->NextPendingTaskDelay().InMilliseconds()); 250 251 // Tick, then shift timebase by -7ms. 252 timer->SetNow(timer->Now() + Interval() + jitter); 253 task_runner->RunPendingTasks(); 254 255 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 256 257 client.Reset(); 258 task_runner->ClearPendingTasks(); 259 task_runner->RunPendingTasks(); 260 timer->SetTimebaseAndInterval(base::TimeTicks() + Interval(), Interval()); 261 262 EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled. 263 EXPECT_EQ(16 - 7, task_runner->NextPendingTaskDelay().InMilliseconds()); 264 } 265 266 TEST(DelayBasedTimeSource, HanldlesSignificantIntervalChangesImmediately) { 267 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 268 new base::TestSimpleTaskRunner; 269 FakeTimeSourceClient client; 270 scoped_refptr<FakeDelayBasedTimeSource> timer = 271 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 272 timer->SetClient(&client); 273 timer->SetActive(true); 274 // Run the first tick. 275 task_runner->RunPendingTasks(); 276 277 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 278 279 // Tick, then double the interval. 280 timer->SetNow(timer->Now() + Interval()); 281 task_runner->RunPendingTasks(); 282 283 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 284 285 client.Reset(); 286 task_runner->ClearPendingTasks(); 287 task_runner->RunPendingTasks(); 288 timer->SetTimebaseAndInterval(base::TimeTicks() + Interval(), Interval() * 2); 289 290 EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled. 291 EXPECT_EQ(33, task_runner->NextPendingTaskDelay().InMilliseconds()); 292 293 // Tick, then halve the interval. 294 timer->SetNow(timer->Now() + Interval() * 2); 295 task_runner->RunPendingTasks(); 296 297 EXPECT_EQ(33, task_runner->NextPendingTaskDelay().InMilliseconds()); 298 299 client.Reset(); 300 task_runner->ClearPendingTasks(); 301 task_runner->RunPendingTasks(); 302 timer->SetTimebaseAndInterval(base::TimeTicks() + Interval() * 3, Interval()); 303 304 EXPECT_FALSE(client.TickCalled()); // Make sure pending tasks were canceled. 305 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 306 } 307 308 TEST(DelayBasedTimeSource, JitteryRuntimeWithFutureTimebases) { 309 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 310 new base::TestSimpleTaskRunner; 311 FakeTimeSourceClient client; 312 scoped_refptr<FakeDelayBasedTimeSource> timer = 313 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 314 timer->SetClient(&client); 315 timer->SetActive(true); 316 317 // Run the first tick. 318 task_runner->RunPendingTasks(); 319 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 320 321 base::TimeTicks future_timebase = timer->Now() + Interval() * 10; 322 323 // 1ms jitter 324 base::TimeDelta jitter1 = base::TimeDelta::FromMilliseconds(1); 325 326 // Tick with +1ms of jitter 327 future_timebase += Interval(); 328 timer->SetTimebaseAndInterval(future_timebase, Interval()); 329 timer->SetNow(timer->Now() + Interval() + jitter1); 330 task_runner->RunPendingTasks(); 331 EXPECT_EQ(15, task_runner->NextPendingTaskDelay().InMilliseconds()); 332 333 // Tick with 0ms of jitter 334 future_timebase += Interval(); 335 timer->SetTimebaseAndInterval(future_timebase, Interval()); 336 timer->SetNow(timer->Now() + Interval() - jitter1); 337 task_runner->RunPendingTasks(); 338 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 339 340 // Tick with -1ms of jitter 341 future_timebase += Interval(); 342 timer->SetTimebaseAndInterval(future_timebase, Interval()); 343 timer->SetNow(timer->Now() + Interval() - jitter1); 344 task_runner->RunPendingTasks(); 345 EXPECT_EQ(17, task_runner->NextPendingTaskDelay().InMilliseconds()); 346 347 // Tick with 0ms of jitter 348 future_timebase += Interval(); 349 timer->SetTimebaseAndInterval(future_timebase, Interval()); 350 timer->SetNow(timer->Now() + Interval() + jitter1); 351 task_runner->RunPendingTasks(); 352 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 353 354 // 8 ms jitter 355 base::TimeDelta jitter8 = base::TimeDelta::FromMilliseconds(8); 356 357 // Tick with +8ms of jitter 358 future_timebase += Interval(); 359 timer->SetTimebaseAndInterval(future_timebase, Interval()); 360 timer->SetNow(timer->Now() + Interval() + jitter8); 361 task_runner->RunPendingTasks(); 362 EXPECT_EQ(8, task_runner->NextPendingTaskDelay().InMilliseconds()); 363 364 // Tick with 0ms of jitter 365 future_timebase += Interval(); 366 timer->SetTimebaseAndInterval(future_timebase, Interval()); 367 timer->SetNow(timer->Now() + Interval() - jitter8); 368 task_runner->RunPendingTasks(); 369 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 370 371 // Tick with -8ms of jitter 372 future_timebase += Interval(); 373 timer->SetTimebaseAndInterval(future_timebase, Interval()); 374 timer->SetNow(timer->Now() + Interval() - jitter8); 375 task_runner->RunPendingTasks(); 376 EXPECT_EQ(24, task_runner->NextPendingTaskDelay().InMilliseconds()); 377 378 // Tick with 0ms of jitter 379 future_timebase += Interval(); 380 timer->SetTimebaseAndInterval(future_timebase, Interval()); 381 timer->SetNow(timer->Now() + Interval() + jitter8); 382 task_runner->RunPendingTasks(); 383 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 384 385 // 15 ms jitter 386 base::TimeDelta jitter15 = base::TimeDelta::FromMilliseconds(15); 387 388 // Tick with +15ms jitter 389 future_timebase += Interval(); 390 timer->SetTimebaseAndInterval(future_timebase, Interval()); 391 timer->SetNow(timer->Now() + Interval() + jitter15); 392 task_runner->RunPendingTasks(); 393 EXPECT_EQ(1, task_runner->NextPendingTaskDelay().InMilliseconds()); 394 395 // Tick with 0ms of jitter 396 future_timebase += Interval(); 397 timer->SetTimebaseAndInterval(future_timebase, Interval()); 398 timer->SetNow(timer->Now() + Interval() - jitter15); 399 task_runner->RunPendingTasks(); 400 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 401 402 // Tick with -15ms of jitter 403 future_timebase += Interval(); 404 timer->SetTimebaseAndInterval(future_timebase, Interval()); 405 timer->SetNow(timer->Now() + Interval() - jitter15); 406 task_runner->RunPendingTasks(); 407 EXPECT_EQ(31, task_runner->NextPendingTaskDelay().InMilliseconds()); 408 409 // Tick with 0ms of jitter 410 future_timebase += Interval(); 411 timer->SetTimebaseAndInterval(future_timebase, Interval()); 412 timer->SetNow(timer->Now() + Interval() + jitter15); 413 task_runner->RunPendingTasks(); 414 EXPECT_EQ(16, task_runner->NextPendingTaskDelay().InMilliseconds()); 415 } 416 417 TEST(DelayBasedTimeSourceTest, AchievesTargetRateWithNoNoise) { 418 int num_iterations = 10; 419 420 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 421 new base::TestSimpleTaskRunner; 422 FakeTimeSourceClient client; 423 scoped_refptr<FakeDelayBasedTimeSource> timer = 424 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 425 timer->SetClient(&client); 426 timer->SetActive(true); 427 428 double total_frame_time = 0.0; 429 for (int i = 0; i < num_iterations; ++i) { 430 int64 delay_ms = task_runner->NextPendingTaskDelay().InMilliseconds(); 431 432 // accumulate the "delay" 433 total_frame_time += delay_ms / 1000.0; 434 435 // Run the callback exactly when asked 436 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(delay_ms)); 437 task_runner->RunPendingTasks(); 438 } 439 double average_interval = 440 total_frame_time / static_cast<double>(num_iterations); 441 EXPECT_NEAR(1.0 / 60.0, average_interval, 0.1); 442 } 443 444 TEST(DelayBasedTimeSource, TestDeactivateWhilePending) { 445 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 446 new base::TestSimpleTaskRunner; 447 FakeTimeSourceClient client; 448 scoped_refptr<FakeDelayBasedTimeSource> timer = 449 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 450 timer->SetClient(&client); 451 timer->SetActive(true); // Should post a task. 452 timer->SetActive(false); 453 timer = NULL; 454 // Should run the posted task without crashing. 455 EXPECT_TRUE(task_runner->HasPendingTask()); 456 task_runner->RunPendingTasks(); 457 } 458 459 TEST(DelayBasedTimeSource, TestDeactivateAndReactivateBeforeNextTickTime) { 460 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 461 new base::TestSimpleTaskRunner; 462 FakeTimeSourceClient client; 463 scoped_refptr<FakeDelayBasedTimeSource> timer = 464 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 465 timer->SetClient(&client); 466 467 // Should run the activate task, and pick up a new timebase. 468 timer->SetActive(true); 469 task_runner->RunPendingTasks(); 470 471 // Stop the timer 472 timer->SetActive(false); 473 474 // Task will be pending anyway, run it 475 task_runner->RunPendingTasks(); 476 477 // Start the timer again, but before the next tick time the timer previously 478 // planned on using. That same tick time should still be targeted. 479 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(4)); 480 timer->SetActive(true); 481 EXPECT_EQ(12, task_runner->NextPendingTaskDelay().InMilliseconds()); 482 } 483 484 TEST(DelayBasedTimeSource, TestDeactivateAndReactivateAfterNextTickTime) { 485 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 486 new base::TestSimpleTaskRunner; 487 FakeTimeSourceClient client; 488 scoped_refptr<FakeDelayBasedTimeSource> timer = 489 FakeDelayBasedTimeSource::Create(Interval(), task_runner.get()); 490 timer->SetClient(&client); 491 492 // Should run the activate task, and pick up a new timebase. 493 timer->SetActive(true); 494 task_runner->RunPendingTasks(); 495 496 // Stop the timer. 497 timer->SetActive(false); 498 499 // Task will be pending anyway, run it. 500 task_runner->RunPendingTasks(); 501 502 // Start the timer again, but before the next tick time the timer previously 503 // planned on using. That same tick time should still be targeted. 504 timer->SetNow(timer->Now() + base::TimeDelta::FromMilliseconds(20)); 505 timer->SetActive(true); 506 EXPECT_EQ(13, task_runner->NextPendingTaskDelay().InMilliseconds()); 507 } 508 509 TEST(DelayBasedTimeSource, TestOverflow) { 510 // int(big_now / interval) < 0, so this causes a crash if the number of 511 // intervals elapsed is attempted to be stored in an int. 512 base::TimeDelta interval = base::TimeDelta::FromInternalValue(4000); 513 base::TimeTicks big_now = base::TimeTicks::FromInternalValue(8635916564000); 514 515 scoped_refptr<base::TestSimpleTaskRunner> task_runner = 516 new base::TestSimpleTaskRunner; 517 FakeTimeSourceClient client; 518 scoped_refptr<FakeDelayBasedTimeSource> timer = 519 FakeDelayBasedTimeSource::Create(interval, task_runner.get()); 520 timer->SetClient(&client); 521 timer->SetNow(big_now); 522 timer->SetActive(true); 523 EXPECT_EQ(0, task_runner->NextPendingTaskDelay().InMilliseconds()); 524 } 525 526 } // namespace 527 } // namespace cc 528