PolicyManager: Add a variable to tell when the Updater was started.

This patch adds a new const variable stating when was the updater
started in wallclock time. This value is required to schedule an
update check shortly after the update_engine starts, but use a
higher interval after the first update check.

BUG=chromium:358269
TEST=Added unittest.

Change-Id: Ife04c280207b5ccbf3a4a7828593cf01d1551a00
Reviewed-on: https://chromium-review.googlesource.com/197200
Reviewed-by: Alex Deymo <deymo@chromium.org>
Tested-by: Alex Deymo <deymo@chromium.org>
Commit-Queue: Alex Deymo <deymo@chromium.org>
diff --git a/policy_manager/fake_updater_provider.h b/policy_manager/fake_updater_provider.h
index 17060ce..0413eb5 100644
--- a/policy_manager/fake_updater_provider.h
+++ b/policy_manager/fake_updater_provider.h
@@ -5,6 +5,8 @@
 #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_FAKE_UPDATER_PROVIDER_H_
 #define CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_FAKE_UPDATER_PROVIDER_H_
 
+#include <string>
+
 #include "update_engine/policy_manager/fake_variable.h"
 #include "update_engine/policy_manager/updater_provider.h"
 
@@ -15,6 +17,10 @@
  public:
   FakeUpdaterProvider() {}
 
+  virtual FakeVariable<base::Time>* var_updater_started_time() override {
+    return &var_updater_started_time_;
+  }
+
   virtual FakeVariable<base::Time>* var_last_checked_time() override {
     return &var_last_checked_time_;
   }
@@ -56,6 +62,8 @@
   }
 
  private:
+  FakeVariable<base::Time> var_updater_started_time_{
+      "updater_started_time", kVariableModePoll};
   FakeVariable<base::Time> var_last_checked_time_{
     "last_checked_time", kVariableModePoll};
   FakeVariable<base::Time> var_update_completed_time_{
diff --git a/policy_manager/real_updater_provider.cc b/policy_manager/real_updater_provider.cc
index dbfae87..9bdb45a 100644
--- a/policy_manager/real_updater_provider.cc
+++ b/policy_manager/real_updater_provider.cc
@@ -8,8 +8,8 @@
 
 #include <string>
 
-#include <base/time/time.h>
 #include <base/strings/stringprintf.h>
+#include <base/time/time.h>
 #include <chromeos/dbus/service_constants.h>
 
 #include "update_engine/clock_interface.h"
@@ -314,6 +314,8 @@
 
 RealUpdaterProvider::RealUpdaterProvider(SystemState* system_state)
   : system_state_(system_state),
+    var_updater_started_time_("updater_started_time",
+                              system_state->clock()->GetWallclockTime()),
     var_last_checked_time_(
         new LastCheckedTimeVariable("last_checked_time", system_state_)),
     var_update_completed_time_(
diff --git a/policy_manager/real_updater_provider.h b/policy_manager/real_updater_provider.h
index e4b308e..619d5ab 100644
--- a/policy_manager/real_updater_provider.h
+++ b/policy_manager/real_updater_provider.h
@@ -7,6 +7,7 @@
 
 #include <base/memory/scoped_ptr.h>
 
+#include "update_engine/policy_manager/generic_variables.h"
 #include "update_engine/policy_manager/updater_provider.h"
 #include "update_engine/system_state.h"
 
@@ -26,6 +27,10 @@
   // Initializes the provider and returns whether it succeeded.
   bool Init() { return true; }
 
+  virtual Variable<base::Time>* var_updater_started_time() override {
+    return &var_updater_started_time_;
+  }
+
   virtual Variable<base::Time>* var_last_checked_time() override {
     return var_last_checked_time_.get();
   }
@@ -70,7 +75,8 @@
   // A pointer to the update engine's system state aggregator.
   chromeos_update_engine::SystemState* system_state_;
 
-  // Pointers to all variable implementations.
+  // Variable implementations.
+  ConstCopyVariable<base::Time> var_updater_started_time_;
   scoped_ptr<Variable<base::Time>> var_last_checked_time_;
   scoped_ptr<Variable<base::Time>> var_update_completed_time_;
   scoped_ptr<Variable<double>> var_progress_;
diff --git a/policy_manager/real_updater_provider_unittest.cc b/policy_manager/real_updater_provider_unittest.cc
index 1f8f86f..e779456 100644
--- a/policy_manager/real_updater_provider_unittest.cc
+++ b/policy_manager/real_updater_provider_unittest.cc
@@ -63,7 +63,7 @@
 class PmRealUpdaterProviderTest : public ::testing::Test {
  protected:
   virtual void SetUp() {
-    fake_sys_state_.set_clock(&fake_clock_);
+    fake_clock_ = fake_sys_state_.fake_clock();
     provider_.reset(new RealUpdaterProvider(&fake_sys_state_));
     PMTEST_ASSERT_NOT_NULL(provider_.get());
     // Check that provider initializes corrrectly.
@@ -101,16 +101,25 @@
     EXPECT_CALL(*fake_sys_state_.mock_update_attempter(),
                 GetBootTimeAtUpdate(_))
         .WillOnce(DoAll(SetArgPointee<0>(kUpdateBootTime), Return(true)));
-    fake_clock_.SetBootTime(kCurrBootTime);
-    fake_clock_.SetWallclockTime(kCurrWallclockTime);
+    fake_clock_->SetBootTime(kCurrBootTime);
+    fake_clock_->SetWallclockTime(kCurrWallclockTime);
     return kCurrWallclockTime - kDurationSinceUpdate;
   }
 
   FakeSystemState fake_sys_state_;
-  FakeClock fake_clock_;
+  FakeClock* fake_clock_;  // Short for fake_sys_state_.fake_clock()
   scoped_ptr<RealUpdaterProvider> provider_;
 };
 
+TEST_F(PmRealUpdaterProviderTest, UpdaterStartedTimeIsWallclockTime) {
+  fake_clock_->SetWallclockTime(Time::FromDoubleT(123.456));
+  fake_clock_->SetMonotonicTime(Time::FromDoubleT(456.123));
+  // Run SetUp again to re-setup the provider under test to use these values.
+  SetUp();
+  PmTestUtils::ExpectVariableHasValue(Time::FromDoubleT(123.456),
+                                      provider_->var_updater_started_time());
+}
+
 TEST_F(PmRealUpdaterProviderTest, GetLastCheckedTimeOkay) {
   EXPECT_CALL(*fake_sys_state_.mock_update_attempter(),
               GetStatus(_, _, _, _, _))
diff --git a/policy_manager/updater_provider.h b/policy_manager/updater_provider.h
index 85074f6..f9a4bff 100644
--- a/policy_manager/updater_provider.h
+++ b/policy_manager/updater_provider.h
@@ -31,6 +31,10 @@
  public:
   virtual ~UpdaterProvider() {}
 
+  // A variable returning the timestamp when the update engine was started in
+  // wallclock time.
+  virtual Variable<base::Time>* var_updater_started_time() = 0;
+
   // A variable returning the last update check time.
   virtual Variable<base::Time>* var_last_checked_time() = 0;