blob: 5d559b67a3e58e2dca56de3bf18a5eafbef54624 [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "config/stats_config_util.h"
#include <map>
#include <string>
#include "base/file_util.h"
#include "base/singleton.h"
#include "base/system_util.h"
#include "base/win_api_test_helper.h"
#include "testing/base/public/gunit.h"
#ifdef OS_ANDROID
#include "config/config_handler.h"
#include "config/config.pb.h"
DECLARE_string(test_tmpdir);
#endif // OS_ANDROID
namespace mozc {
namespace config {
#ifdef GOOGLE_JAPANESE_INPUT_BUILD
#ifdef OS_WIN
namespace {
const wchar_t kOmahaGUID[] = L"{DDCCD2A9-025E-4142-BCEB-F467B88CF830}";
const wchar_t kOmahaUsageKey[] =
L"Software\\Google\\Update\\ClientState\\"
L"{DDCCD2A9-025E-4142-BCEB-F467B88CF830}";
const wchar_t kOmahaUsageKeyForEveryone[] =
L"Software\\Google\\Update\\ClientStateMedium\\"
L"{DDCCD2A9-025E-4142-BCEB-F467B88CF830}";
const wchar_t kSendStatsName[] = L"usagestats";
#define INT2HKEY(value) ((HKEY)(ULONG_PTR)((LONG)(value)))
const HKEY kHKCU_ClientState = INT2HKEY(1);
const HKEY kHKLM_ClientState = INT2HKEY(2);
const HKEY kHKLM_ClientStateMedium = INT2HKEY(3);
#undef INT2HKEY
const int kRunLevelLow = 0;
const int kRunLevelMedium = 1;
const int kRunLevelHigh = 2;
bool TryGetKnownKey(HKEY key, LPCWSTR sub_key, HKEY *result_key) {
HKEY dummy = NULL;
HKEY &result = (result_key != NULL ? *result_key : dummy);
if (HKEY_CURRENT_USER == key) {
if (wstring(kOmahaUsageKey) == sub_key) {
result = kHKCU_ClientState;
return true;
}
} else if (HKEY_LOCAL_MACHINE == key) {
if (wstring(kOmahaUsageKey) == sub_key) {
result = kHKLM_ClientState;
return true;
} else if (wstring(kOmahaUsageKeyForEveryone) == sub_key) {
result = kHKLM_ClientStateMedium;
return true;
}
}
return false;
}
// Win32 registry emulator for unit testing. To separate internal state,
// set unique id at the template parameter.
// This template class is mainly used for migration codes of http://b/2451942
// and http://b/2452672
template<int Id>
class RegistryEmulator {
public:
template<int Id>
class PropertySelector {
public:
PropertySelector() : run_level_(kRunLevelMedium) {
}
bool contains_key_in_usagestats_map(HKEY key) const {
return usagestats_map_.find(key) != usagestats_map_.end();
}
void clear_usagestats_map() {
usagestats_map_.clear();
}
void erase_entry_from_usagestats_map(HKEY key) {
usagestats_map_.erase(key);
}
void set_entry_to_usagestats_map(HKEY key, DWORD value) {
usagestats_map_[key] = value;
}
DWORD get_entry_from_usagestats_map(HKEY key) const {
map<HKEY, DWORD>::const_iterator i = usagestats_map_.find(key);
if (i == usagestats_map_.end()) {
return 0;
}
return i->second;
}
map<HKEY, DWORD> & usagestats_map() const {
return usagestats_map_;
}
int run_level() const {
return run_level_;
}
void set_run_level(int run_level) {
run_level_ = run_level;
}
private:
map<HKEY, DWORD> usagestats_map_;
int run_level_;
};
typedef PropertySelector<Id> Property;
RegistryEmulator() {
vector<WinAPITestHelper::HookRequest> requests;
requests.push_back(
DEFINE_HOOK("advapi32.dll", RegCreateKeyExW, TestRegCreateKeyExW));
requests.push_back(
DEFINE_HOOK("advapi32.dll", RegSetValueExW, TestRegSetValueExW));
requests.push_back(
DEFINE_HOOK("advapi32.dll", RegCloseKey, TestRegCloseKey));
requests.push_back(
DEFINE_HOOK("advapi32.dll", RegOpenKeyExW, TestRegOpenKeyExW));
requests.push_back(
DEFINE_HOOK("advapi32.dll", RegQueryValueExW, TestRegQueryValueExW));
requests.push_back(
DEFINE_HOOK("advapi32.dll", RegDeleteValueW, TestRegDeleteValueW));
restore_info_ = WinAPITestHelper::DoHook(
::GetModuleHandle(nullptr), requests);
}
~RegistryEmulator() {
WinAPITestHelper::RestoreHook(restore_info_);
restore_info_ = nullptr;
}
static void SetRunLevel(int run_level) {
mozc::Singleton<Property>::get()->set_run_level(run_level);
}
static bool HasUsagestatsValue(HKEY key) {
if (!mozc::Singleton<Property>::get()->
contains_key_in_usagestats_map(key)) {
return false;
}
return true;
}
static bool GetUsagestatsValue(HKEY key, DWORD *value) {
if (!HasUsagestatsValue(key)) {
return false;
}
if (value != NULL) {
*value =
mozc::Singleton<Property>::get()->get_entry_from_usagestats_map(key);
}
return true;
}
static bool CheckWritable(HKEY key) {
// Note that kHKLM_ClientStateMedium does not require admin rights.
if (key == kHKLM_ClientState) {
// Requires admin rights to update the value
if (mozc::Singleton<Property>::get()->run_level() <
kRunLevelHigh) {
return false;
}
} else if (key == kHKLM_ClientStateMedium) {
if (mozc::Singleton<Property>::get()->run_level() <
kRunLevelMedium) {
return false;
}
} else if (key == kHKCU_ClientState) {
if (mozc::Singleton<Property>::get()->run_level() <
kRunLevelMedium) {
return false;
}
}
return true;
}
static void SetUsagestatsValue(HKEY key, DWORD value) {
mozc::Singleton<Property>::get()->set_entry_to_usagestats_map(key, value);
}
static void DeleteUsagestatsValue(HKEY key) {
if (!HasUsagestatsValue(key)) {
return;
}
mozc::Singleton<Property>::get()->erase_entry_from_usagestats_map(key);
}
static void ClearUsagestatsValue() {
mozc::Singleton<Property>::get()->clear_usagestats_map();
}
static LSTATUS WINAPI TestRegCreateKeyExW(
HKEY key, LPCWSTR sub_key, DWORD reserved, LPWSTR class_name,
DWORD options, REGSAM sam, LPSECURITY_ATTRIBUTES security_attributes,
PHKEY result, LPDWORD disposition) {
HKEY dummy = NULL;
HKEY &result_key = result != NULL ? *result : dummy;
if (!TryGetKnownKey(key, sub_key, &result_key)) {
return ERROR_ACCESS_DENIED;
}
if (!CheckWritable(result_key)) {
return ERROR_ACCESS_DENIED;
}
return ERROR_SUCCESS;
}
static LSTATUS WINAPI TestRegSetValueExW(
HKEY key, LPCWSTR value_name, DWORD reserved, DWORD type,
const BYTE *data, DWORD num_data) {
if (type != REG_DWORD || wstring(kSendStatsName) != value_name) {
// Do nothing for other cases.
return ERROR_SUCCESS;
}
if (!CheckWritable(key)) {
return ERROR_ACCESS_DENIED;
}
SetUsagestatsValue(key, *reinterpret_cast<const DWORD*>(data));
return ERROR_SUCCESS;
}
static LSTATUS WINAPI TestRegCloseKey(HKEY key) {
return ERROR_SUCCESS;
}
static LSTATUS WINAPI TestRegOpenKeyExW(
HKEY key, LPCWSTR sub_key, DWORD options, REGSAM sam, PHKEY result) {
if (!TryGetKnownKey(key, sub_key, result)) {
return ERROR_FILE_NOT_FOUND;
}
return ERROR_SUCCESS;
}
static LSTATUS WINAPI TestRegQueryValueExW(
HKEY key, LPCWSTR value_name, LPDWORD reserved, LPDWORD type,
LPBYTE data, LPDWORD num_data) {
if (wstring(kSendStatsName) != value_name) {
return ERROR_SUCCESS;
}
if (!HasUsagestatsValue(key)) {
return ERROR_FILE_NOT_FOUND;
}
GetUsagestatsValue(key, reinterpret_cast<DWORD*>(data));
if (type != NULL) { *type = REG_DWORD; }
return ERROR_SUCCESS;
}
static LSTATUS WINAPI TestRegDeleteValueW(HKEY key, LPCWSTR value_name) {
if (wstring(kSendStatsName) != value_name) {
return ERROR_SUCCESS;
}
if (!HasUsagestatsValue(key)) {
return ERROR_FILE_NOT_FOUND;
}
DeleteUsagestatsValue(key);
return ERROR_SUCCESS;
}
WinAPITestHelper::RestoreInfoHandle restore_info_;
};
} // namespace
#if defined(CHANNEL_DEV)
TEST(StatsConfigUtilTestWin, IsEnabledIgnoresRegistrySettings) {
// In dev channel, settings in the registry are simply ignored and
// StatsConfigUtil::IsEnabled always returns true.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelHigh);
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (None, None)
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (None, Disabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (None, Enabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Disabled, None)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 0);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Disabled, Disabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 0);
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Disabled, Enabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 0);
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Enabled, None)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 1);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Enabled, Disabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 1);
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Enabled, Enabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 1);
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
}
TEST(StatsConfigUtilTestWin, SetEnabledForRunLevelHighInDevChannel) {
// In dev channel, StatsConfigUtil::SetEnabled always returns true.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelHigh);
DWORD value = 0;
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientState));
test.GetUsagestatsValue(kHKLM_ClientState, &value);
EXPECT_EQ(1, value);
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientState));
test.GetUsagestatsValue(kHKLM_ClientState, &value);
EXPECT_EQ(1, value);
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
}
TEST(StatsConfigUtilTestWin, SetEnabledForRunLevelMediumInDevChannel) {
// In dev channel, StatsConfigUtil::SetEnabled always returns true.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelMedium);
DWORD value = 0;
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(1, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(0, value);
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(1, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(0, value);
}
TEST(StatsConfigUtilTestWin, SetEnabledForRunLevelLowInDevChannel) {
// In dev channel, StatsConfigUtil::SetEnabled always returns true.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelLow);
DWORD value = 0;
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(1, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(0, value);
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(1, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(0, value);
}
TEST(StatsConfigUtilTestWin, SetEnabledNeverFailsForRunLevelMedium) {
// In dev channel, StatsConfigUtil::SetEnabled does not update the
// the registry but always returns true.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelMedium);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
}
TEST(StatsConfigUtilTestWin, SetEnabledNeverFailsForRunLevelLow) {
// In dev channel, StatsConfigUtil::SetEnabled does not update the
// the registry but always returns true.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelLow);
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
}
#endif // CHANNEL_DEV
#if !defined(CHANNEL_DEV)
TEST(StatsConfigUtilTestWin, SetEnabledForRunLevelHigh) {
// In beta and stable channel, StatsConfigUtil::SetEnabled requires
// sufficient rights.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelHigh);
DWORD value = 0;
// Check if SetEnabled(true) works as expected.
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientState));
test.GetUsagestatsValue(kHKLM_ClientState, &value);
EXPECT_EQ(1, value);
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
// Check if SetEnabled(false) works as expected.
test.ClearUsagestatsValue();
EXPECT_TRUE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientState));
test.GetUsagestatsValue(kHKLM_ClientState, &value);
EXPECT_EQ(0, value);
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
}
TEST(StatsConfigUtilTestWin, SetEnabledForRunLevelMedium) {
// In beta and stable channels, StatsConfigUtil::SetEnabled requires
// sufficient rights.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelMedium);
DWORD value = 0;
test.ClearUsagestatsValue();
EXPECT_FALSE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_FALSE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(1, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_FALSE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(0, value);
test.ClearUsagestatsValue();
EXPECT_FALSE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_FALSE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(1, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_FALSE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(0, value);
}
TEST(StatsConfigUtilTestWin, SetEnabledForRunLevelLow) {
// In beta and stable channels, StatsConfigUtil::SetEnabled requires
// sufficient rights.
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelLow);
DWORD value = 0;
// Check if SetEnabled(true) fails as expected.
test.ClearUsagestatsValue();
EXPECT_FALSE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
// Check if SetEnabled(false) fails as expected.
test.ClearUsagestatsValue();
EXPECT_FALSE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_FALSE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(1, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_FALSE(StatsConfigUtil::SetEnabled(true));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(0, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_FALSE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(1, value);
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_FALSE(StatsConfigUtil::SetEnabled(false));
EXPECT_FALSE(test.HasUsagestatsValue(kHKCU_ClientState));
EXPECT_FALSE(test.HasUsagestatsValue(kHKLM_ClientState));
EXPECT_TRUE(test.HasUsagestatsValue(kHKLM_ClientStateMedium));
test.GetUsagestatsValue(kHKLM_ClientStateMedium, &value);
EXPECT_EQ(0, value);
}
TEST(StatsConfigUtilTestWin, IsEnabled) {
RegistryEmulator<__COUNTER__> test;
test.SetRunLevel(kRunLevelHigh);
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (None, None)
test.ClearUsagestatsValue();
EXPECT_FALSE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (None, Disabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_FALSE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (None, Enabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Disabled, None)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 0);
EXPECT_FALSE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Disabled, Disabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 0);
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_FALSE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Disabled, Enabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 0);
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Enabled, None)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 1);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Enabled, Disabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 1);
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 0);
EXPECT_FALSE(StatsConfigUtil::IsEnabled());
// (kHKLM_ClientState, kHKLM_ClientStateMedium) == (Enabled, Enabled)
test.ClearUsagestatsValue();
test.SetUsagestatsValue(kHKLM_ClientState, 1);
test.SetUsagestatsValue(kHKLM_ClientStateMedium, 1);
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
}
#endif // !CHANNEL_DEV
#endif // OS_WIN
#ifdef OS_ANDROID
TEST(StatsConfigUtilTestAndroid, DefaultValueTest) {
const string config_file = FileUtil::JoinPath(FLAGS_test_tmpdir,
"mozc_stats_config_util_test_tmp");
FileUtil::Unlink(config_file);
ConfigHandler::SetConfigFileName(config_file);
EXPECT_EQ(config_file, ConfigHandler::GetConfigFileName());
ConfigHandler::Reload();
#ifdef CHANNEL_DEV
EXPECT_TRUE(StatsConfigUtil::IsEnabled());
#else // CHANNEL_DEV
EXPECT_FALSE(StatsConfigUtil::IsEnabled());
#endif // CHANNEL_DEV
}
#endif // OS_ANDROID
#ifdef OS_LINUX
#ifndef OS_ANDROID
TEST(StatsConfigUtilTestLinux, DefaultValueTest) {
EXPECT_FALSE(StatsConfigUtil::IsEnabled());
}
#endif // OS_ANDROID
#endif // OS_LINUX
#else // !GOOGLE_JAPANESE_INPUT_BUILD
TEST(StatsConfigUtilTestNonOfficialBuild, DefaultValueTest) {
EXPECT_FALSE(StatsConfigUtil::IsEnabled());
}
#endif
} // namespace config
} // namespace mozc