// Copyright (c) 2011 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/json/json_reader.h"
#include "base/time.h"
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "chrome/browser/extensions/apps_promo.h"
#include "chrome/browser/prefs/browser_prefs.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/web_resource/promo_resource_service.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/testing_browser_process.h"
#include "chrome/test/testing_pref_service.h"
#include "chrome/test/testing_profile.h"
#include "testing/gtest/include/gtest/gtest.h"
typedef testing::Test PromoResourceServiceTest;
// Verifies that custom dates read from a web resource server are written to
// the preferences file.
TEST_F(PromoResourceServiceTest, UnpackLogoSignal) {
// Set up a testing profile and create a promo resource service.
TestingProfile profile;
TestingPrefService local_state;
TestingBrowserProcess* testing_browser_process =
static_cast<TestingBrowserProcess*>(g_browser_process);
testing_browser_process->SetPrefService(&local_state);
browser::RegisterLocalState(&local_state);
scoped_refptr<PromoResourceService> web_resource_service(
new PromoResourceService(&profile));
// Set up start and end dates in a Dictionary as if parsed from the service.
std::string json = "{ "
" \"topic\": {"
" \"answers\": ["
" {"
" \"name\": \"custom_logo_start\","
" \"inproduct\": \"31/01/10 01:00 GMT\""
" },"
" {"
" \"name\": \"custom_logo_end\","
" \"inproduct\": \"31/01/12 01:00 GMT\""
" }"
" ]"
" }"
"}";
scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
base::JSONReader::Read(json, false)));
// Check that prefs are set correctly.
web_resource_service->UnpackLogoSignal(*(test_json.get()));
PrefService* prefs = profile.GetPrefs();
ASSERT_TRUE(prefs != NULL);
double logo_start =
prefs->GetDouble(prefs::kNTPCustomLogoStart);
EXPECT_EQ(logo_start, 1264899600); // unix epoch for Jan 31 2010 0100 GMT.
double logo_end =
prefs->GetDouble(prefs::kNTPCustomLogoEnd);
EXPECT_EQ(logo_end, 1327971600); // unix epoch for Jan 31 2012 0100 GMT.
// Change the start only and recheck.
json = "{ "
" \"topic\": {"
" \"answers\": ["
" {"
" \"name\": \"custom_logo_start\","
" \"inproduct\": \"28/02/10 14:00 GMT\""
" },"
" {"
" \"name\": \"custom_logo_end\","
" \"inproduct\": \"31/01/12 01:00 GMT\""
" }"
" ]"
" }"
"}";
test_json->Clear();
test_json.reset(static_cast<DictionaryValue*>(
base::JSONReader::Read(json, false)));
// Check that prefs are set correctly.
web_resource_service->UnpackLogoSignal(*(test_json.get()));
logo_start = prefs->GetDouble(prefs::kNTPCustomLogoStart);
EXPECT_EQ(logo_start, 1267365600); // date changes to Feb 28 2010 1400 GMT.
// If no date is included in the prefs, reset custom logo dates to 0.
json = "{ "
" \"topic\": {"
" \"answers\": ["
" {"
" }"
" ]"
" }"
"}";
test_json->Clear();
test_json.reset(static_cast<DictionaryValue*>(
base::JSONReader::Read(json, false)));
// Check that prefs are set correctly.
web_resource_service->UnpackLogoSignal(*(test_json.get()));
logo_start = prefs->GetDouble(prefs::kNTPCustomLogoStart);
EXPECT_EQ(logo_start, 0); // date value reset to 0;
logo_end = prefs->GetDouble(prefs::kNTPCustomLogoEnd);
EXPECT_EQ(logo_end, 0); // date value reset to 0;
testing_browser_process->SetPrefService(NULL);
}
TEST_F(PromoResourceServiceTest, UnpackPromoSignal) {
// Set up a testing profile and create a promo resource service.
TestingProfile profile;
TestingPrefService local_state;
TestingBrowserProcess* testing_browser_process =
static_cast<TestingBrowserProcess*>(g_browser_process);
testing_browser_process->SetPrefService(&local_state);
browser::RegisterLocalState(&local_state);
scoped_refptr<PromoResourceService> web_resource_service(
new PromoResourceService(&profile));
// Set up start and end dates and promo line in a Dictionary as if parsed
// from the service.
std::string json = "{ "
" \"topic\": {"
" \"answers\": ["
" {"
" \"name\": \"promo_start\","
" \"question\": \"3:2\","
" \"tooltip\": \"Eat more pie!\","
" \"inproduct\": \"31/01/10 01:00 GMT\""
" },"
" {"
" \"name\": \"promo_end\","
" \"inproduct\": \"31/01/12 01:00 GMT\""
" }"
" ]"
" }"
"}";
scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
base::JSONReader::Read(json, false)));
// Initialize a message loop for this to run on.
MessageLoop loop;
// Check that prefs are set correctly.
web_resource_service->UnpackPromoSignal(*(test_json.get()));
PrefService* prefs = profile.GetPrefs();
ASSERT_TRUE(prefs != NULL);
std::string promo_line = prefs->GetString(prefs::kNTPPromoLine);
EXPECT_EQ(promo_line, "Eat more pie!");
int promo_group = prefs->GetInteger(prefs::kNTPPromoGroup);
EXPECT_GE(promo_group, 0);
EXPECT_LT(promo_group, 16);
int promo_build_type = prefs->GetInteger(prefs::kNTPPromoBuild);
EXPECT_EQ(promo_build_type & PromoResourceService::DEV_BUILD,
PromoResourceService::DEV_BUILD);
EXPECT_EQ(promo_build_type & PromoResourceService::BETA_BUILD,
PromoResourceService::BETA_BUILD);
EXPECT_EQ(promo_build_type & PromoResourceService::STABLE_BUILD, 0);
int promo_time_slice = prefs->GetInteger(prefs::kNTPPromoGroupTimeSlice);
EXPECT_EQ(promo_time_slice, 2);
double promo_start =
prefs->GetDouble(prefs::kNTPPromoStart);
int64 actual_start = 1264899600 + // unix epoch for Jan 31 2010 0100 GMT.
promo_group * 2 * 60 * 60;
EXPECT_EQ(promo_start, actual_start);
double promo_end =
prefs->GetDouble(prefs::kNTPPromoEnd);
EXPECT_EQ(promo_end, 1327971600); // unix epoch for Jan 31 2012 0100 GMT.
testing_browser_process->SetPrefService(NULL);
}
TEST_F(PromoResourceServiceTest, UnpackWebStoreSignal) {
// Set up a testing profile and create a promo resource service.
TestingProfile profile;
TestingPrefService local_state;
TestingBrowserProcess* testing_browser_process =
static_cast<TestingBrowserProcess*>(g_browser_process);
testing_browser_process->SetPrefService(&local_state);
browser::RegisterLocalState(&local_state);
scoped_refptr<PromoResourceService> web_resource_service(
new PromoResourceService(&profile));
web_resource_service->set_channel("dev");
// Set up start and end dates and promo line in a Dictionary as if parsed
// from the service.
std::string json = "{ "
" \"topic\": {"
" \"answers\": ["
" {"
" \"answer_id\": \"341252\","
" \"name\": \"webstore_promo:15\","
" \"question\": \"The header!\","
" \"inproduct_target\": \"The button label!\","
" \"inproduct\": \"http://link.com\","
" \"tooltip\": \"No thanks, hide this.\""
" }"
" ]"
" }"
"}";
scoped_ptr<DictionaryValue> test_json(static_cast<DictionaryValue*>(
base::JSONReader::Read(json, false)));
// Initialize a message loop for this to run on.
MessageLoop loop;
// Check that prefs are set correctly.
web_resource_service->UnpackWebStoreSignal(*(test_json.get()));
PrefService* prefs = profile.GetPrefs();
ASSERT_TRUE(prefs != NULL);
EXPECT_EQ("341252", AppsPromo::GetPromoId());
EXPECT_EQ("The header!", AppsPromo::GetPromoHeaderText());
EXPECT_EQ("The button label!", AppsPromo::GetPromoButtonText());
EXPECT_EQ(GURL("http://link.com"), AppsPromo::GetPromoLink());
EXPECT_EQ("No thanks, hide this.", AppsPromo::GetPromoExpireText());
testing_browser_process->SetPrefService(NULL);
}
TEST_F(PromoResourceServiceTest, IsBuildTargeted) {
// canary
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("canary", 1));
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("canary", 3));
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("canary", 7));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("canary", 15));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("canary", 8));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("canary", 11));
// dev
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("dev", 1));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("dev", 3));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("dev", 7));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("dev", 15));
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("dev", 8));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("dev", 11));
// beta
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("beta", 1));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("beta", 3));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("beta", 7));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("beta", 15));
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("beta", 8));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("beta", 11));
// stable
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("", 1));
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("", 3));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("", 7));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("", 15));
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("", 8));
EXPECT_FALSE(PromoResourceService::IsBuildTargeted("", 11));
EXPECT_TRUE(PromoResourceService::IsBuildTargeted("", 12));
}