1 // Copyright 2020 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 "chrome/browser/chromeos/login/version_updater/update_time_estimator.h"
6 
7 #include "base/test/simple_test_tick_clock.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 
10 namespace {
11 
12 constexpr int kFinalizingTimeInSeconds = 5 * 60;
13 
14 constexpr base::TimeDelta kTimeAdvanceSeconds10 =
15     base::TimeDelta::FromSeconds(10);
16 constexpr base::TimeDelta kTimeAdvanceSeconds60 =
17     base::TimeDelta::FromSeconds(60);
18 constexpr base::TimeDelta kZeroTime = base::TimeDelta();
19 
20 }  // anonymous namespace
21 
22 namespace chromeos {
23 
24 class UpdateTimeEstimatorUnitTest : public testing::Test {
25  public:
26   UpdateTimeEstimatorUnitTest() = default;
27 
SetUp()28   void SetUp() override {
29     time_estimator_.set_tick_clock_for_testing(&tick_clock_);
30   }
31 
CreateStatusResult(update_engine::Operation stage,double image_size,double progress)32   update_engine::StatusResult CreateStatusResult(update_engine::Operation stage,
33                                                  double image_size,
34                                                  double progress) {
35     update_engine::StatusResult status;
36     status.set_current_operation(stage);
37     status.set_new_size(image_size);
38     status.set_progress(progress);
39     return status;
40   }
41 
42   UpdateTimeEstimator time_estimator_;
43 
44   base::SimpleTestTickClock tick_clock_;
45 
46  private:
47   DISALLOW_COPY_AND_ASSIGN(UpdateTimeEstimatorUnitTest);
48 };
49 
TEST_F(UpdateTimeEstimatorUnitTest,DownloadingTimeLeft)50 TEST_F(UpdateTimeEstimatorUnitTest, DownloadingTimeLeft) {
51   update_engine::StatusResult status =
52       CreateStatusResult(update_engine::Operation::DOWNLOADING, 1.0, 0.0);
53   time_estimator_.Update(status);
54 
55   tick_clock_.Advance(kTimeAdvanceSeconds10);
56   status.set_progress(0.01);
57   time_estimator_.Update(status);
58   EXPECT_EQ(time_estimator_.GetDownloadTimeLeft().InSeconds(), 990);
59 
60   tick_clock_.Advance(kTimeAdvanceSeconds10);
61   status.set_progress(0.10);
62   time_estimator_.Update(status);
63   EXPECT_EQ(time_estimator_.GetDownloadTimeLeft().InSeconds(), 500);
64 }
65 
TEST_F(UpdateTimeEstimatorUnitTest,TotalTimeLeft)66 TEST_F(UpdateTimeEstimatorUnitTest, TotalTimeLeft) {
67   update_engine::StatusResult status =
68       CreateStatusResult(update_engine::Operation::FINALIZING, 0.0, 0.0);
69   time_estimator_.Update(status);
70 
71   tick_clock_.Advance(kTimeAdvanceSeconds10);
72   EXPECT_EQ(time_estimator_.GetUpdateStatus().time_left,
73             base::TimeDelta::FromSeconds(kFinalizingTimeInSeconds) -
74                 kTimeAdvanceSeconds10);
75 
76   tick_clock_.Advance(base::TimeDelta::FromSeconds(kFinalizingTimeInSeconds));
77   EXPECT_EQ(time_estimator_.GetUpdateStatus().time_left, kZeroTime);
78 }
79 
TEST_F(UpdateTimeEstimatorUnitTest,DownloadingProgress)80 TEST_F(UpdateTimeEstimatorUnitTest, DownloadingProgress) {
81   update_engine::StatusResult status =
82       CreateStatusResult(update_engine::Operation::DOWNLOADING, 1.0, 0.0);
83   time_estimator_.Update(status);
84   EXPECT_EQ(time_estimator_.GetUpdateStatus().progress, 0);
85 
86   tick_clock_.Advance(kTimeAdvanceSeconds10);
87   status.set_progress(0.01);
88   time_estimator_.Update(status);
89   EXPECT_EQ(time_estimator_.GetUpdateStatus().progress, 1);
90 
91   tick_clock_.Advance(kTimeAdvanceSeconds10);
92   status.set_progress(0.10);
93   time_estimator_.Update(status);
94   EXPECT_EQ(time_estimator_.GetUpdateStatus().progress, 9);
95 
96   status = CreateStatusResult(update_engine::Operation::VERIFYING, 0.0, 0.0);
97   time_estimator_.Update(status);
98   EXPECT_EQ(time_estimator_.GetUpdateStatus().progress, 90);
99   tick_clock_.Advance(kTimeAdvanceSeconds60);
100   EXPECT_EQ(time_estimator_.GetUpdateStatus().progress, 91);
101 
102   status = CreateStatusResult(update_engine::Operation::FINALIZING, 0.0, 0.0);
103   time_estimator_.Update(status);
104   EXPECT_EQ(time_estimator_.GetUpdateStatus().progress, 95);
105   tick_clock_.Advance(kTimeAdvanceSeconds60);
106   EXPECT_EQ(time_estimator_.GetUpdateStatus().progress, 96);
107 }
108 
109 }  // namespace chromeos
110