blob: 4dca9931fb5ea42ed90067f1bdc5b9b51c578e3a [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/metrics/field_trial.h"
#include "base/prefs/pref_service.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/search/hotword_service.h"
#include "chrome/browser/search/hotword_service_factory.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
class HotwordServiceTest : public testing::Test {
protected:
HotwordServiceTest() : field_trial_list_(NULL) {}
virtual ~HotwordServiceTest() {}
void SetApplicationLocale(Profile* profile, const std::string& new_locale) {
#if defined(OS_CHROMEOS)
// On ChromeOS locale is per-profile.
profile->GetPrefs()->SetString(prefs::kApplicationLocale, new_locale);
#else
g_browser_process->SetApplicationLocale(new_locale);
#endif
}
private:
base::FieldTrialList field_trial_list_;
content::TestBrowserThreadBundle thread_bundle_;
};
TEST_F(HotwordServiceTest, ShouldShowOptInPopup) {
TestingProfile::Builder profile_builder;
TestingProfile::Builder otr_profile_builder;
otr_profile_builder.SetIncognito();
scoped_ptr<TestingProfile> profile = profile_builder.Build();
scoped_ptr<TestingProfile> otr_profile = otr_profile_builder.Build();
// Popup should not be shown for incognito profiles.
EXPECT_TRUE(otr_profile.get() != NULL);
EXPECT_FALSE(HotwordServiceFactory::ShouldShowOptInPopup(otr_profile.get()));
HotwordServiceFactory* hotword_service_factory =
HotwordServiceFactory::GetInstance();
HotwordService* hotword_service =
hotword_service_factory->GetForProfile(profile.get());
EXPECT_TRUE(hotword_service != NULL);
// Popup should not be shown if hotword search has been enabled or turned off.
// Test both paths for accessing whether to do the popup. Just in case.
profile->GetPrefs()->SetBoolean(prefs::kHotwordSearchEnabled, true);
EXPECT_FALSE(HotwordServiceFactory::ShouldShowOptInPopup(profile.get()));
EXPECT_FALSE(hotword_service->ShouldShowOptInPopup());
profile->GetPrefs()->SetBoolean(prefs::kHotwordSearchEnabled, false);
EXPECT_FALSE(HotwordServiceFactory::ShouldShowOptInPopup(profile.get()));
EXPECT_FALSE(hotword_service->ShouldShowOptInPopup());
// Rest the enabled pref for the next part of the test.
profile->GetPrefs()->ClearPref(prefs::kHotwordSearchEnabled);
// Popup should be shown until max number of times are reached.
for (int i = 0; i < hotword_service->MaxNumberTimesToShowOptInPopup(); i++) {
EXPECT_TRUE(HotwordServiceFactory::ShouldShowOptInPopup(profile.get()));
EXPECT_TRUE(hotword_service->ShouldShowOptInPopup());
hotword_service->ShowOptInPopup();
}
// The opt in popup should not be shown if it has already been shown the
// maximum number of times.
EXPECT_FALSE(HotwordServiceFactory::ShouldShowOptInPopup(profile.get()));
EXPECT_FALSE(hotword_service->ShouldShowOptInPopup());
}
TEST_F(HotwordServiceTest, IsHotwordAllowedBadFieldTrial) {
TestingProfile::Builder profile_builder;
TestingProfile::Builder otr_profile_builder;
otr_profile_builder.SetIncognito();
scoped_ptr<TestingProfile> profile = profile_builder.Build();
scoped_ptr<TestingProfile> otr_profile = otr_profile_builder.Build();
HotwordServiceFactory* hotword_service_factory =
HotwordServiceFactory::GetInstance();
// Check that the service exists so that a NULL service be ruled out in
// following tests.
HotwordService* hotword_service =
hotword_service_factory->GetForProfile(profile.get());
EXPECT_TRUE(hotword_service != NULL);
// When the field trial is empty or Disabled, it should not be allowed.
std::string group = base::FieldTrialList::FindFullName(
hotword_internal::kHotwordFieldTrialName);
EXPECT_TRUE(group.empty());
EXPECT_FALSE(HotwordServiceFactory::IsHotwordAllowed(profile.get()));
ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
hotword_internal::kHotwordFieldTrialName,
hotword_internal::kHotwordFieldTrialDisabledGroupName));
group = base::FieldTrialList::FindFullName(
hotword_internal::kHotwordFieldTrialName);
EXPECT_TRUE(group ==hotword_internal::kHotwordFieldTrialDisabledGroupName);
EXPECT_FALSE(HotwordServiceFactory::IsHotwordAllowed(profile.get()));
// Set a valid locale with invalid field trial to be sure it is
// still false.
SetApplicationLocale(static_cast<Profile*>(profile.get()), "en");
EXPECT_FALSE(HotwordServiceFactory::IsHotwordAllowed(profile.get()));
// Test that incognito returns false as well.
EXPECT_FALSE(HotwordServiceFactory::IsHotwordAllowed(otr_profile.get()));
}
TEST_F(HotwordServiceTest, IsHotwordAllowedLocale) {
TestingProfile::Builder profile_builder;
TestingProfile::Builder otr_profile_builder;
otr_profile_builder.SetIncognito();
scoped_ptr<TestingProfile> profile = profile_builder.Build();
scoped_ptr<TestingProfile> otr_profile = otr_profile_builder.Build();
HotwordServiceFactory* hotword_service_factory =
HotwordServiceFactory::GetInstance();
// Check that the service exists so that a NULL service be ruled out in
// following tests.
HotwordService* hotword_service =
hotword_service_factory->GetForProfile(profile.get());
EXPECT_TRUE(hotword_service != NULL);
// Set the field trial to a valid one.
ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial(
hotword_internal::kHotwordFieldTrialName, "Good"));
// Set the language to an invalid one.
SetApplicationLocale(static_cast<Profile*>(profile.get()), "non-english");
EXPECT_FALSE(HotwordServiceFactory::IsHotwordAllowed(profile.get()));
// Now with valid locales it should be fine.
SetApplicationLocale(static_cast<Profile*>(profile.get()), "en");
EXPECT_TRUE(HotwordServiceFactory::IsHotwordAllowed(profile.get()));
SetApplicationLocale(static_cast<Profile*>(profile.get()), "en-US");
EXPECT_TRUE(HotwordServiceFactory::IsHotwordAllowed(profile.get()));
SetApplicationLocale(static_cast<Profile*>(profile.get()), "en_us");
EXPECT_TRUE(HotwordServiceFactory::IsHotwordAllowed(profile.get()));
// Test that incognito even with a valid locale and valid field trial
// still returns false.
SetApplicationLocale(static_cast<Profile*>(otr_profile.get()), "en");
EXPECT_FALSE(HotwordServiceFactory::IsHotwordAllowed(otr_profile.get()));
}