Add D-Bus method to get the duration since an update completed.
This new API can be used by Chrome to automatically reboot the device
at N hours after updating. This is implemented as a D-Bus method that
returns the number of micro-seconds on the wall-clock since the update
completed. If the device has not updated, the D-Bus method returns an
error.
For robustness, durations are measured using the CLOCK_BOOTTIME clock
instead of the usual CLOCK_REALTIME clock. This avoids interference
with NTP adjustments, the RTC clock being wrong and other things.
BUG=chromium:218192
TEST=New unit test + unit tests pass + manual test on a device using
the gdbus(1) command as the chronos user.
Change-Id: I51d44d69afe2d3024bb0780916c3c4e3f8ebb19e
Reviewed-on: https://chromium-review.googlesource.com/173032
Reviewed-by: David Zeuthen <zeuthen@chromium.org>
Commit-Queue: David Zeuthen <zeuthen@chromium.org>
Tested-by: David Zeuthen <zeuthen@chromium.org>
diff --git a/update_attempter_unittest.cc b/update_attempter_unittest.cc
index 2e3c6b2..10af01e 100644
--- a/update_attempter_unittest.cc
+++ b/update_attempter_unittest.cc
@@ -1094,4 +1094,22 @@
EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
}
+TEST_F(UpdateAttempterTest, BootTimeInUpdateMarkerFile) {
+ const string update_completed_marker = test_dir_ + "/update-completed-marker";
+ UpdateAttempterUnderTest attempter(&mock_system_state_, &dbus_,
+ update_completed_marker);
+
+ FakeClock fake_clock;
+ fake_clock.SetBootTime(Time::FromTimeT(42));
+ mock_system_state_.set_clock(&fake_clock);
+
+ Time boot_time;
+ EXPECT_FALSE(attempter.GetBootTimeAtUpdate(&boot_time));
+
+ attempter.WriteUpdateCompletedMarker();
+
+ EXPECT_TRUE(attempter.GetBootTimeAtUpdate(&boot_time));
+ EXPECT_EQ(boot_time.ToTimeT(), 42);
+}
+
} // namespace chromeos_update_engine