OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file tests the chrome.alarms extension API. | 5 // This file tests the chrome.alarms extension API. |
6 | 6 |
7 #include "base/test/simple_test_clock.h" | 7 #include "base/test/simple_test_clock.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "chrome/browser/extensions/api/alarms/alarm_manager.h" | 9 #include "chrome/browser/extensions/api/alarms/alarm_manager.h" |
10 #include "chrome/browser/extensions/api/alarms/alarms_api.h" | 10 #include "chrome/browser/extensions/api/alarms/alarms_api.h" |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 CreateAlarms(3); | 434 CreateAlarms(3); |
435 alarm_manager_->GetAllAlarms(extension()->id(), base::Bind( | 435 alarm_manager_->GetAllAlarms(extension()->id(), base::Bind( |
436 ExtensionAlarmsTestClearAllGetAllAlarms1Callback, this)); | 436 ExtensionAlarmsTestClearAllGetAllAlarms1Callback, this)); |
437 } | 437 } |
438 | 438 |
439 class ExtensionAlarmsSchedulingTest : public ExtensionAlarmsTest { | 439 class ExtensionAlarmsSchedulingTest : public ExtensionAlarmsTest { |
440 void GetAlarmCallback(Alarm* alarm) { | 440 void GetAlarmCallback(Alarm* alarm) { |
441 CHECK(alarm); | 441 CHECK(alarm); |
442 const base::Time scheduled_time = | 442 const base::Time scheduled_time = |
443 base::Time::FromJsTime(alarm->js_alarm->scheduled_time); | 443 base::Time::FromJsTime(alarm->js_alarm->scheduled_time); |
444 EXPECT_EQ(scheduled_time, alarm_manager_->test_next_poll_time_); | 444 EXPECT_EQ(scheduled_time, alarm_manager_->next_poll_time_); |
445 } | 445 } |
446 | 446 |
447 static void RemoveAlarmCallback (bool success) { EXPECT_TRUE(success); } | 447 static void RemoveAlarmCallback (bool success) { EXPECT_TRUE(success); } |
448 static void RemoveAllAlarmsCallback () {} | 448 static void RemoveAllAlarmsCallback () {} |
449 public: | 449 public: |
450 // Get the time that the alarm named is scheduled to run. | 450 // Get the time that the alarm named is scheduled to run. |
451 void VerifyScheduledTime(const std::string& alarm_name) { | 451 void VerifyScheduledTime(const std::string& alarm_name) { |
452 alarm_manager_->GetAlarm(extension()->id(), alarm_name, base::Bind( | 452 alarm_manager_->GetAlarm(extension()->id(), alarm_name, base::Bind( |
453 &ExtensionAlarmsSchedulingTest::GetAlarmCallback, | 453 &ExtensionAlarmsSchedulingTest::GetAlarmCallback, |
454 base::Unretained(this))); | 454 base::Unretained(this))); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 { | 494 { |
495 test_clock_->SetNow(base::Time::FromDoubleT(3 * 60 + 1)); | 495 test_clock_->SetNow(base::Time::FromDoubleT(3 * 60 + 1)); |
496 Alarm alarm; | 496 Alarm alarm; |
497 alarm.js_alarm->name = "bb"; | 497 alarm.js_alarm->name = "bb"; |
498 alarm.js_alarm->scheduled_time = 3 * 60000; | 498 alarm.js_alarm->scheduled_time = 3 * 60000; |
499 alarm.js_alarm->period_in_minutes.reset(new double(3)); | 499 alarm.js_alarm->period_in_minutes.reset(new double(3)); |
500 alarm_manager_->AddAlarmImpl(extension()->id(), alarm); | 500 alarm_manager_->AddAlarmImpl(extension()->id(), alarm); |
501 base::MessageLoop::current()->Run(); | 501 base::MessageLoop::current()->Run(); |
502 EXPECT_EQ(base::Time::FromJsTime(3 * 60000) + | 502 EXPECT_EQ(base::Time::FromJsTime(3 * 60000) + |
503 base::TimeDelta::FromMinutes(3), | 503 base::TimeDelta::FromMinutes(3), |
504 alarm_manager_->test_next_poll_time_); | 504 alarm_manager_->next_poll_time_); |
505 RemoveAllAlarms(); | 505 RemoveAllAlarms(); |
506 } | 506 } |
507 { | 507 { |
508 test_clock_->SetNow(base::Time::FromDoubleT(4 * 60 + 1)); | 508 test_clock_->SetNow(base::Time::FromDoubleT(4 * 60 + 1)); |
509 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); | 509 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); |
510 RemoveAlarm("a"); | 510 RemoveAlarm("a"); |
511 Alarm alarm2; | 511 Alarm alarm2; |
512 alarm2.js_alarm->name = "bb"; | 512 alarm2.js_alarm->name = "bb"; |
513 alarm2.js_alarm->scheduled_time = 4 * 60000; | 513 alarm2.js_alarm->scheduled_time = 4 * 60000; |
514 alarm2.js_alarm->period_in_minutes.reset(new double(4)); | 514 alarm2.js_alarm->period_in_minutes.reset(new double(4)); |
515 alarm_manager_->AddAlarmImpl(extension()->id(), alarm2); | 515 alarm_manager_->AddAlarmImpl(extension()->id(), alarm2); |
516 Alarm alarm3; | 516 Alarm alarm3; |
517 alarm3.js_alarm->name = "ccc"; | 517 alarm3.js_alarm->name = "ccc"; |
518 alarm3.js_alarm->scheduled_time = 25 * 60000; | 518 alarm3.js_alarm->scheduled_time = 25 * 60000; |
519 alarm3.js_alarm->period_in_minutes.reset(new double(25)); | 519 alarm3.js_alarm->period_in_minutes.reset(new double(25)); |
520 alarm_manager_->AddAlarmImpl(extension()->id(), alarm3); | 520 alarm_manager_->AddAlarmImpl(extension()->id(), alarm3); |
521 base::MessageLoop::current()->Run(); | 521 base::MessageLoop::current()->Run(); |
522 EXPECT_EQ(base::Time::FromJsTime(4 * 60000) + | 522 EXPECT_EQ(base::Time::FromJsTime(4 * 60000) + |
523 base::TimeDelta::FromMinutes(4), | 523 base::TimeDelta::FromMinutes(4), |
524 alarm_manager_->test_next_poll_time_); | 524 alarm_manager_->next_poll_time_); |
525 RemoveAllAlarms(); | 525 RemoveAllAlarms(); |
526 } | 526 } |
527 } | 527 } |
528 | 528 |
529 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { | 529 TEST_F(ExtensionAlarmsSchedulingTest, ReleasedExtensionPollsInfrequently) { |
530 set_extension(utils::CreateEmptyExtensionWithLocation( | 530 set_extension(utils::CreateEmptyExtensionWithLocation( |
531 extensions::Manifest::INTERNAL)); | 531 extensions::Manifest::INTERNAL)); |
532 test_clock_->SetNow(base::Time::FromJsTime(300000)); | 532 test_clock_->SetNow(base::Time::FromJsTime(300000)); |
533 CreateAlarm("[\"a\", {\"when\": 300010}]"); | 533 CreateAlarm("[\"a\", {\"when\": 300010}]"); |
534 CreateAlarm("[\"b\", {\"when\": 340000}]"); | 534 CreateAlarm("[\"b\", {\"when\": 340000}]"); |
535 | 535 |
536 // On startup (when there's no "last poll"), we let alarms fire as | 536 // On startup (when there's no "last poll"), we let alarms fire as |
537 // soon as they're scheduled. | 537 // soon as they're scheduled. |
538 EXPECT_DOUBLE_EQ(300010, alarm_manager_->test_next_poll_time_.ToJsTime()); | 538 EXPECT_DOUBLE_EQ(300010, alarm_manager_->next_poll_time_.ToJsTime()); |
539 | 539 |
540 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(290000); | 540 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(290000); |
541 // In released extensions, we set the granularity to at least 1 | 541 // In released extensions, we set the granularity to at least 1 |
542 // minute, which makes AddAlarm schedule the next poll after the | 542 // minute, which makes AddAlarm schedule the next poll after the |
543 // extension requested. | 543 // extension requested. |
544 alarm_manager_->ScheduleNextPoll(); | 544 alarm_manager_->ScheduleNextPoll(); |
545 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 545 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
546 base::TimeDelta::FromMinutes(1)).ToJsTime(), | 546 base::TimeDelta::FromMinutes(1)).ToJsTime(), |
547 alarm_manager_->test_next_poll_time_.ToJsTime()); | 547 alarm_manager_->next_poll_time_.ToJsTime()); |
548 } | 548 } |
549 | 549 |
550 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) { | 550 TEST_F(ExtensionAlarmsSchedulingTest, TimerRunning) { |
551 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 551 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
552 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]"); | 552 CreateAlarm("[\"a\", {\"delayInMinutes\": 0.001}]"); |
553 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); | 553 EXPECT_TRUE(alarm_manager_->timer_.IsRunning()); |
554 test_clock_->Advance(base::TimeDelta::FromMilliseconds(60)); | 554 test_clock_->Advance(base::TimeDelta::FromMilliseconds(60)); |
555 base::MessageLoop::current()->Run(); | 555 base::MessageLoop::current()->Run(); |
556 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); | 556 EXPECT_FALSE(alarm_manager_->timer_.IsRunning()); |
557 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); | 557 CreateAlarm("[\"bb\", {\"delayInMinutes\": 10}]"); |
(...skipping 11 matching lines...) Expand all Loading... |
569 CreateAlarm("[\"b\", {\"periodInMinutes\": 2}]"); | 569 CreateAlarm("[\"b\", {\"periodInMinutes\": 2}]"); |
570 test_clock_->Advance(base::TimeDelta::FromMinutes(2)); | 570 test_clock_->Advance(base::TimeDelta::FromMinutes(2)); |
571 | 571 |
572 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(2 * 60000); | 572 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(2 * 60000); |
573 // In released extensions, we set the granularity to at least 1 | 573 // In released extensions, we set the granularity to at least 1 |
574 // minute, which makes scheduler set it to 1 minute, rather than | 574 // minute, which makes scheduler set it to 1 minute, rather than |
575 // 1 second later (when b is supposed to go off). | 575 // 1 second later (when b is supposed to go off). |
576 alarm_manager_->ScheduleNextPoll(); | 576 alarm_manager_->ScheduleNextPoll(); |
577 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 577 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
578 base::TimeDelta::FromMinutes(1)).ToJsTime(), | 578 base::TimeDelta::FromMinutes(1)).ToJsTime(), |
579 alarm_manager_->test_next_poll_time_.ToJsTime()); | 579 alarm_manager_->next_poll_time_.ToJsTime()); |
580 } | 580 } |
581 | 581 |
582 TEST_F(ExtensionAlarmsSchedulingTest, DifferentMinimumGranularities) { | 582 TEST_F(ExtensionAlarmsSchedulingTest, DifferentMinimumGranularities) { |
583 test_clock_->SetNow(base::Time::FromJsTime(0)); | 583 test_clock_->SetNow(base::Time::FromJsTime(0)); |
584 // Create an alarm to go off in 12 seconds. This uses the default, unpacked | 584 // Create an alarm to go off in 12 seconds. This uses the default, unpacked |
585 // extension - so there is no minimum granularity. | 585 // extension - so there is no minimum granularity. |
586 CreateAlarm("[\"a\", {\"periodInMinutes\": 0.2}]"); // 12 seconds. | 586 CreateAlarm("[\"a\", {\"periodInMinutes\": 0.2}]"); // 12 seconds. |
587 | 587 |
588 // Create a new extension, which is packed, and has a granularity of 1 minute. | 588 // Create a new extension, which is packed, and has a granularity of 1 minute. |
589 // CreateAlarm() uses extension_, so keep a ref of the old one around, and | 589 // CreateAlarm() uses extension_, so keep a ref of the old one around, and |
590 // repopulate extension_. | 590 // repopulate extension_. |
591 scoped_refptr<Extension> extension2(extension_ref()); | 591 scoped_refptr<Extension> extension2(extension_ref()); |
592 set_extension( | 592 set_extension( |
593 utils::CreateEmptyExtensionWithLocation(extensions::Manifest::INTERNAL)); | 593 utils::CreateEmptyExtensionWithLocation(extensions::Manifest::INTERNAL)); |
594 | 594 |
595 CreateAlarm("[\"b\", {\"periodInMinutes\": 2}]"); | 595 CreateAlarm("[\"b\", {\"periodInMinutes\": 2}]"); |
596 | 596 |
597 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(0); | 597 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(0); |
598 alarm_manager_->ScheduleNextPoll(); | 598 alarm_manager_->ScheduleNextPoll(); |
599 | 599 |
600 // The next poll time should be 12 seconds from now - the time at which the | 600 // The next poll time should be 12 seconds from now - the time at which the |
601 // first alarm should go off. | 601 // first alarm should go off. |
602 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 602 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
603 base::TimeDelta::FromSeconds(12)).ToJsTime(), | 603 base::TimeDelta::FromSeconds(12)).ToJsTime(), |
604 alarm_manager_->test_next_poll_time_.ToJsTime()); | 604 alarm_manager_->next_poll_time_.ToJsTime()); |
605 } | 605 } |
606 | 606 |
607 // Test that scheduled alarms go off at set intervals, even if their actual | 607 // Test that scheduled alarms go off at set intervals, even if their actual |
608 // trigger is off. | 608 // trigger is off. |
609 TEST_F(ExtensionAlarmsSchedulingTest, RepeatingAlarmsScheduledPredictably) { | 609 TEST_F(ExtensionAlarmsSchedulingTest, RepeatingAlarmsScheduledPredictably) { |
610 test_clock_->SetNow(base::Time::FromJsTime(0)); | 610 test_clock_->SetNow(base::Time::FromJsTime(0)); |
611 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); | 611 CreateAlarm("[\"a\", {\"periodInMinutes\": 2}]"); |
612 | 612 |
613 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(0); | 613 alarm_manager_->last_poll_time_ = base::Time::FromJsTime(0); |
614 alarm_manager_->ScheduleNextPoll(); | 614 alarm_manager_->ScheduleNextPoll(); |
615 | 615 |
616 // We expect the first poll to happen two minutes from the start. | 616 // We expect the first poll to happen two minutes from the start. |
617 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 617 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
618 base::TimeDelta::FromSeconds(120)).ToJsTime(), | 618 base::TimeDelta::FromSeconds(120)).ToJsTime(), |
619 alarm_manager_->test_next_poll_time_.ToJsTime()); | 619 alarm_manager_->next_poll_time_.ToJsTime()); |
620 | 620 |
621 // Poll more than two minutes later. | 621 // Poll more than two minutes later. |
622 test_clock_->Advance(base::TimeDelta::FromSeconds(125)); | 622 test_clock_->Advance(base::TimeDelta::FromSeconds(125)); |
623 alarm_manager_->PollAlarms(); | 623 alarm_manager_->PollAlarms(); |
624 | 624 |
625 // The alarm should have triggered once. | 625 // The alarm should have triggered once. |
626 EXPECT_EQ(1u, alarm_delegate_->alarms_seen.size()); | 626 EXPECT_EQ(1u, alarm_delegate_->alarms_seen.size()); |
627 | 627 |
628 // The next poll should still be scheduled for four minutes from the start, | 628 // The next poll should still be scheduled for four minutes from the start, |
629 // even though this is less than two minutes since the last alarm. | 629 // even though this is less than two minutes since the last alarm. |
630 // Last poll was at 125 seconds; next poll should be at 240 seconds. | 630 // Last poll was at 125 seconds; next poll should be at 240 seconds. |
631 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 631 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
632 base::TimeDelta::FromSeconds(115)).ToJsTime(), | 632 base::TimeDelta::FromSeconds(115)).ToJsTime(), |
633 alarm_manager_->test_next_poll_time_.ToJsTime()); | 633 alarm_manager_->next_poll_time_.ToJsTime()); |
634 | 634 |
635 // Completely miss a scheduled trigger. | 635 // Completely miss a scheduled trigger. |
636 test_clock_->Advance(base::TimeDelta::FromSeconds(255)); // Total Time: 380s | 636 test_clock_->Advance(base::TimeDelta::FromSeconds(255)); // Total Time: 380s |
637 alarm_manager_->PollAlarms(); | 637 alarm_manager_->PollAlarms(); |
638 | 638 |
639 // The alarm should have triggered again at this last poll. | 639 // The alarm should have triggered again at this last poll. |
640 EXPECT_EQ(2u, alarm_delegate_->alarms_seen.size()); | 640 EXPECT_EQ(2u, alarm_delegate_->alarms_seen.size()); |
641 | 641 |
642 // The next poll should be the first poll that hasn't happened and is in-line | 642 // The next poll should be the first poll that hasn't happened and is in-line |
643 // with the original scheduling. | 643 // with the original scheduling. |
644 // Last poll was at 380 seconds; next poll should be at 480 seconds. | 644 // Last poll was at 380 seconds; next poll should be at 480 seconds. |
645 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + | 645 EXPECT_DOUBLE_EQ((alarm_manager_->last_poll_time_ + |
646 base::TimeDelta::FromSeconds(100)).ToJsTime(), | 646 base::TimeDelta::FromSeconds(100)).ToJsTime(), |
647 alarm_manager_->test_next_poll_time_.ToJsTime()); | 647 alarm_manager_->next_poll_time_.ToJsTime()); |
648 } | 648 } |
649 | 649 |
650 } // namespace extensions | 650 } // namespace extensions |
OLD | NEW |