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
3 // found in the LICENSE file.
8 #include "base/basictypes.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "base/strings/stringprintf.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "base/test/test_reg_util_win.h"
14 #include "base/time/time.h"
15 #include "base/win/registry.h"
16 #include "chrome/installer/gcapi/gcapi.h"
17 #include "chrome/installer/util/google_update_constants.h"
18 #include "testing/gtest/include/gtest/gtest.h"
21 using base::TimeDelta
;
22 using base::win::RegKey
;
25 class GCAPILastRunTest
: public ::testing::Test
{
28 // Override keys - this is undone during destruction.
29 std::wstring hkcu_override
= base::StringPrintf(
30 L
"hkcu_override\\%ls", base::ASCIIToWide(base::GenerateGUID()));
31 override_manager_
.OverrideRegistry(HKEY_CURRENT_USER
, hkcu_override
);
33 // Create the client state key in the right places.
34 std::wstring
reg_path(google_update::kRegPathClientState
);
36 reg_path
+= google_update::kChromeUpgradeCode
;
37 RegKey
client_state(HKEY_CURRENT_USER
,
40 ASSERT_TRUE(client_state
.Valid());
42 // Place a bogus "pv" value in the right places to make the last run
43 // checker believe Chrome is installed.
44 std::wstring
clients_path(google_update::kRegPathClients
);
45 clients_path
+= L
"\\";
46 clients_path
+= google_update::kChromeUpgradeCode
;
47 RegKey
client_key(HKEY_CURRENT_USER
,
49 KEY_CREATE_SUB_KEY
| KEY_SET_VALUE
);
50 ASSERT_TRUE(client_key
.Valid());
51 client_key
.WriteValue(L
"pv", L
"1.2.3.4");
54 bool SetLastRunTime(int64 last_run_time
) {
55 return SetLastRunTimeString(base::Int64ToString16(last_run_time
));
58 bool SetLastRunTimeString(const base::string16
& last_run_time_string
) {
59 const wchar_t* base_path
= google_update::kRegPathClientState
;
60 std::wstring
path(base_path
);
62 path
+= google_update::kChromeUpgradeCode
;
64 RegKey
client_state(HKEY_CURRENT_USER
, path
.c_str(), KEY_SET_VALUE
);
65 return (client_state
.Valid() &&
66 client_state
.WriteValue(
67 google_update::kRegLastRunTimeField
,
68 last_run_time_string
.c_str()) == ERROR_SUCCESS
);
72 registry_util::RegistryOverrideManager override_manager_
;
75 TEST_F(GCAPILastRunTest
, Basic
) {
76 Time last_run
= Time::NowFromSystemTime() - TimeDelta::FromDays(10);
77 EXPECT_TRUE(SetLastRunTime(last_run
.ToInternalValue()));
79 int days_since_last_run
= GoogleChromeDaysSinceLastRun();
80 EXPECT_EQ(10, days_since_last_run
);
83 TEST_F(GCAPILastRunTest
, NoLastRun
) {
84 int days_since_last_run
= GoogleChromeDaysSinceLastRun();
85 EXPECT_EQ(-1, days_since_last_run
);
88 TEST_F(GCAPILastRunTest
, InvalidLastRun
) {
89 EXPECT_TRUE(SetLastRunTimeString(L
"Hi Mum!"));
90 int days_since_last_run
= GoogleChromeDaysSinceLastRun();
91 EXPECT_EQ(-1, days_since_last_run
);
94 TEST_F(GCAPILastRunTest
, OutOfRangeLastRun
) {
95 Time last_run
= Time::NowFromSystemTime() - TimeDelta::FromDays(-42);
96 EXPECT_TRUE(SetLastRunTime(last_run
.ToInternalValue()));
98 int days_since_last_run
= GoogleChromeDaysSinceLastRun();
99 EXPECT_EQ(-1, days_since_last_run
);