gcapi_last_run_test.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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.
4
5#include <limits>
6#include <string>
7
8#include "base/basictypes.h"
9#include "base/guid.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"
19
20using base::Time;
21using base::TimeDelta;
22using base::win::RegKey;
23
24
25class GCAPILastRunTest : public ::testing::Test {
26 protected:
27  void SetUp() {
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);
32
33    // Create the client state key in the right places.
34    std::wstring reg_path(google_update::kRegPathClientState);
35    reg_path += L"\\";
36    reg_path += google_update::kChromeUpgradeCode;
37    RegKey client_state(HKEY_CURRENT_USER,
38                        reg_path.c_str(),
39                        KEY_CREATE_SUB_KEY);
40    ASSERT_TRUE(client_state.Valid());
41
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,
48                      clients_path.c_str(),
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");
52  }
53
54  bool SetLastRunTime(int64 last_run_time) {
55    return SetLastRunTimeString(base::Int64ToString16(last_run_time));
56  }
57
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);
61    path += L"\\";
62    path += google_update::kChromeUpgradeCode;
63
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);
69  }
70
71 private:
72  registry_util::RegistryOverrideManager override_manager_;
73};
74
75TEST_F(GCAPILastRunTest, Basic) {
76  Time last_run = Time::NowFromSystemTime() - TimeDelta::FromDays(10);
77  EXPECT_TRUE(SetLastRunTime(last_run.ToInternalValue()));
78
79  int days_since_last_run = GoogleChromeDaysSinceLastRun();
80  EXPECT_EQ(10, days_since_last_run);
81}
82
83TEST_F(GCAPILastRunTest, NoLastRun) {
84  int days_since_last_run = GoogleChromeDaysSinceLastRun();
85  EXPECT_EQ(-1, days_since_last_run);
86}
87
88TEST_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);
92}
93
94TEST_F(GCAPILastRunTest, OutOfRangeLastRun) {
95  Time last_run = Time::NowFromSystemTime() - TimeDelta::FromDays(-42);
96  EXPECT_TRUE(SetLastRunTime(last_run.ToInternalValue()));
97
98  int days_since_last_run = GoogleChromeDaysSinceLastRun();
99  EXPECT_EQ(-1, days_since_last_run);
100}
101