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 override_manager_.OverrideRegistry(HKEY_CURRENT_USER); 30 31 // Create the client state key in the right places. 32 std::wstring reg_path(google_update::kRegPathClientState); 33 reg_path += L"\\"; 34 reg_path += google_update::kChromeUpgradeCode; 35 RegKey client_state(HKEY_CURRENT_USER, 36 reg_path.c_str(), 37 KEY_CREATE_SUB_KEY | KEY_WOW64_32KEY); 38 ASSERT_TRUE(client_state.Valid()); 39 40 // Place a bogus "pv" value in the right places to make the last run 41 // checker believe Chrome is installed. 42 std::wstring clients_path(google_update::kRegPathClients); 43 clients_path += L"\\"; 44 clients_path += google_update::kChromeUpgradeCode; 45 RegKey client_key(HKEY_CURRENT_USER, 46 clients_path.c_str(), 47 KEY_CREATE_SUB_KEY | KEY_SET_VALUE | KEY_WOW64_32KEY); 48 ASSERT_TRUE(client_key.Valid()); 49 client_key.WriteValue(L"pv", L"1.2.3.4"); 50 } 51 52 bool SetLastRunTime(int64 last_run_time) { 53 return SetLastRunTimeString(base::Int64ToString16(last_run_time)); 54 } 55 56 bool SetLastRunTimeString(const base::string16& last_run_time_string) { 57 const wchar_t* base_path = google_update::kRegPathClientState; 58 std::wstring path(base_path); 59 path += L"\\"; 60 path += google_update::kChromeUpgradeCode; 61 62 RegKey client_state( 63 HKEY_CURRENT_USER, path.c_str(), KEY_SET_VALUE | KEY_WOW64_32KEY); 64 return (client_state.Valid() && 65 client_state.WriteValue( 66 google_update::kRegLastRunTimeField, 67 last_run_time_string.c_str()) == ERROR_SUCCESS); 68 } 69 70 private: 71 registry_util::RegistryOverrideManager override_manager_; 72}; 73 74TEST_F(GCAPILastRunTest, Basic) { 75 Time last_run = Time::NowFromSystemTime() - TimeDelta::FromDays(10); 76 EXPECT_TRUE(SetLastRunTime(last_run.ToInternalValue())); 77 78 int days_since_last_run = GoogleChromeDaysSinceLastRun(); 79 EXPECT_EQ(10, days_since_last_run); 80} 81 82TEST_F(GCAPILastRunTest, NoLastRun) { 83 int days_since_last_run = GoogleChromeDaysSinceLastRun(); 84 EXPECT_EQ(-1, days_since_last_run); 85} 86 87TEST_F(GCAPILastRunTest, InvalidLastRun) { 88 EXPECT_TRUE(SetLastRunTimeString(L"Hi Mum!")); 89 int days_since_last_run = GoogleChromeDaysSinceLastRun(); 90 EXPECT_EQ(-1, days_since_last_run); 91} 92 93TEST_F(GCAPILastRunTest, OutOfRangeLastRun) { 94 Time last_run = Time::NowFromSystemTime() - TimeDelta::FromDays(-42); 95 EXPECT_TRUE(SetLastRunTime(last_run.ToInternalValue())); 96 97 int days_since_last_run = GoogleChromeDaysSinceLastRun(); 98 EXPECT_EQ(-1, days_since_last_run); 99} 100