Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: chrome/browser/extensions/api/alarms/alarms_api_unittest.cc

Issue 145353013: Do not reschedule all alarms when adding a new alarm (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Yoyo's Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/extensions/api/alarms/alarm_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/alarms/alarm_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698