15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <utility>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_resource/notification_promo.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_resource/promo_resource_service.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/scoped_testing_local_state.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/smpdtfmt.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochconst char kDateFormat[] = "dd MMM yyyy HH:mm:ss zzzz";
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool YearFromNow(double* date_epoch, std::string* date_string) {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *date_epoch = (base::Time::Now() + base::TimeDelta::FromDays(365)).ToTimeT();
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UErrorCode status = U_ZERO_ERROR;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  icu::SimpleDateFormat simple_formatter(icu::UnicodeString(kDateFormat),
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         icu::Locale("en_US"),
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         status);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!U_SUCCESS(status))
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  icu::UnicodeString date_unicode_string;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  simple_formatter.format(static_cast<UDate>(*date_epoch * 1000),
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          date_unicode_string,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          status);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!U_SUCCESS(status))
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::UTF16ToUTF8(date_unicode_string.getBuffer(),
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           static_cast<size_t>(date_unicode_string.length()),
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           date_string);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PromoResourceServiceTest : public testing::Test {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |promo_resource_service_| must be created after |local_state_|.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PromoResourceServiceTest()
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : local_state_(TestingBrowserProcess::GetGlobal()),
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        promo_resource_service_(new PromoResourceService) {}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedTestingLocalState local_state_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<PromoResourceService> promo_resource_service_;
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop loop_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationPromoTest {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationPromoTest()
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : received_notification_(false),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        start_(0.0),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        end_(0.0),
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        num_groups_(0),
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        initial_segment_(0),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        increment_(1),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        time_slice_(0),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        max_group_(0),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        max_views_(0),
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        closed_(false) {}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(const std::string& json,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const std::string& promo_text,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            double start,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int num_groups, int initial_segment, int increment,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            int time_slice, int max_group, int max_views) {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    double year_from_now_epoch;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string year_from_now_string;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(YearFromNow(&year_from_now_epoch, &year_from_now_string));
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<std::string> replacements;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    replacements.push_back(year_from_now_string);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string json_with_end_date(
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ReplaceStringPlaceholders(json, replacements, NULL));
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::Value* value(base::JSONReader::Read(json_with_end_date));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(value);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* dict = NULL;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value->GetAsDictionary(&dict);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(dict);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_json_.reset(dict);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    promo_type_ = NotificationPromo::NTP_NOTIFICATION_PROMO;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    promo_text_ = promo_text;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    start_ = start;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    end_ = year_from_now_epoch;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_groups_ = num_groups;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initial_segment_ = initial_segment;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    increment_ = increment;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    time_slice_ = time_slice;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_group_ = max_group;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    max_views_ = max_views;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    closed_ = false;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_notification_ = false;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitPromoFromJson(bool should_receive_notification) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.InitFromJson(*test_json_, promo_type_);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(should_receive_notification,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              notification_promo_.new_notification());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test the fields.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestNotification();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestNotification() {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check values.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.promo_text_, promo_text_);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.start_, start_);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.end_, end_);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.num_groups_, num_groups_);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.initial_segment_, initial_segment_);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.increment_, increment_);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.time_slice_, time_slice_);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.max_group_, max_group_);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.max_views_, max_views_);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.closed_, closed_);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check group within bounds.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GE(notification_promo_.group_, 0);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(notification_promo_.group_, num_groups_);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Views should be 0 for now.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.views_, 0);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new NotificationPromo from prefs and compare to current
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notification.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestInitFromPrefs() {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo prefs_notification_promo;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs_notification_promo.InitFromPrefs(promo_type_);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.prefs_,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.prefs_);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.promo_text_,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.promo_text_);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.start_,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.start_);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.end_,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.end_);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.num_groups_,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.num_groups_);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.initial_segment_,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.initial_segment_);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.increment_,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.increment_);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.time_slice_,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.time_slice_);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.max_group_,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.max_group_);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.max_views_,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.max_views_);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.group_,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.group_);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.views_,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.views_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(notification_promo_.closed_,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              prefs_notification_promo.closed_);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestGroup() {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test out of range groups.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int incr = num_groups_ / 20;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = max_group_; i < num_groups_; i += incr) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notification_promo_.group_ = i;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(notification_promo_.CanShow());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test in-range groups.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < max_group_; i += incr) {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notification_promo_.group_ = i;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(notification_promo_.CanShow());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // When max_group_ is 0, all groups pass.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.max_group_ = 0;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < num_groups_; i += incr) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notification_promo_.group_ = i;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(notification_promo_.CanShow());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.WritePrefs();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestViews() {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.views_ = notification_promo_.max_views_ - 2;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.WritePrefs();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo::HandleViewed(promo_type_);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo new_promo;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_promo.InitFromPrefs(promo_type_);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(new_promo.max_views_ - 1, new_promo.views_);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(new_promo.CanShow());
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo::HandleViewed(promo_type_);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_promo.InitFromPrefs(promo_type_);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(new_promo.max_views_, new_promo.views_);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(new_promo.CanShow());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test out of range views.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = max_views_; i < max_views_ * 2; ++i) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_promo.views_ = i;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_FALSE(new_promo.CanShow());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test in range views.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < max_views_; ++i) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_promo.views_ = i;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(new_promo.CanShow());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_promo.WritePrefs();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestClosed() {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo new_promo;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_promo.InitFromPrefs(promo_type_);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(new_promo.closed_);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(new_promo.CanShow());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NotificationPromo::HandleClosed(promo_type_);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_promo.InitFromPrefs(promo_type_);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(new_promo.closed_);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(new_promo.CanShow());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_promo.closed_ = false;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(new_promo.CanShow());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_promo.WritePrefs();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestPromoText() {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.promo_text_.clear();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(notification_promo_.CanShow());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.promo_text_ = promo_text_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(notification_promo_.CanShow());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestTime() {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const double now = base::Time::Now().ToDoubleT();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const double qhour = 15 * 60;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 0;  // For simplicity.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ = now - qhour;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.end_ = now + qhour;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(notification_promo_.CanShow());
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start time has not arrived.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ = now + qhour;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.end_ = now + qhour;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(notification_promo_.CanShow());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // End time has past.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ = now - qhour;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.end_ = now - qhour;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(notification_promo_.CanShow());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ = start_;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.end_ = end_;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(notification_promo_.CanShow());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestIncrement() {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const double now = base::Time::Now().ToDoubleT();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const double slice = 60;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.num_groups_ = 18;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.initial_segment_ = 5;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.increment_ = 3;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.time_slice_ = slice;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ = now - 1;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.end_ = now + slice;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test initial segment.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 4;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(notification_promo_.CanShow());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 5;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(notification_promo_.CanShow());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test first increment.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ -= slice;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 7;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(notification_promo_.CanShow());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 8;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(notification_promo_.CanShow());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test second increment.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ -= slice;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 10;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(notification_promo_.CanShow());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 11;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(notification_promo_.CanShow());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test penultimate increment.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ -= 2 * slice;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 16;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(notification_promo_.CanShow());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.group_ = 17;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(notification_promo_.CanShow());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Test last increment.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notification_promo_.start_ -= slice;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(notification_promo_.CanShow());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NotificationPromo& promo() const { return notification_promo_; }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationPromo notification_promo_;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool received_notification_;
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> test_json_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationPromo::PromoType promo_type_;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string promo_text_;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double start_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double end_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_groups_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int initial_segment_;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int increment_;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int time_slice_;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_group_;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int max_views_;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool closed_;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that everything gets parsed correctly, notifications are sent,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and CanShow() is handled correctly under variety of conditions.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additionally, test that the first string in |strings| is used if
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// no payload.promo_short_message is specified in the JSON response.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PromoResourceServiceTest, NotificationPromoTest) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that prefs are set correctly.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationPromoTest promo_test;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up start date and promo line in a Dictionary as if parsed from the
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // service. date[0].end is replaced with a date 1 year in the future.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.Init("{"
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "  \"ntp_notification_promo\": ["
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "    {"
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"date\":"
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        ["
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          {"
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "            \"start\":\"3 Aug 1999 9:26:06 GMT\","
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "            \"end\":\"$1\""
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          }"
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        ],"
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"strings\":"
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        {"
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"NTP4_HOW_DO_YOU_FEEL_ABOUT_CHROME\":"
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "              \"What do you think of Chrome?\""
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        },"
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"grouping\":"
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        {"
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"buckets\":1000,"
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"segment\":200,"
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment\":100,"
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment_frequency\":3600,"
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment_max\":400"
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        },"
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"payload\":"
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        {"
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"days_active\":7,"
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"install_age_days\":21"
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        },"
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"max_views\":30"
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "    }"
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "  ]"
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "}",
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "What do you think of Chrome?",
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  // The starting date is in 1999 to make tests pass
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  // on Android devices with incorrect or unset date/time.
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  933672366,  // unix epoch for 3 Aug 1999 9:26:06 GMT.
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  1000, 200, 100, 3600, 400, 30);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.InitPromoFromJson(true);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second time should not trigger a notification.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.InitPromoFromJson(false);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestInitFromPrefs();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test various conditions of CanShow.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TestGroup Has the side effect of setting us to a passing group.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestGroup();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestViews();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestClosed();
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestPromoText();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestTime();
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestIncrement();
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that payload.promo_message_short is used if present.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PromoResourceServiceTest, NotificationPromoCompatNoStringsTest) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that prefs are set correctly.
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationPromoTest promo_test;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up start date and promo line in a Dictionary as if parsed from the
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // service. date[0].end is replaced with a date 1 year in the future.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.Init("{"
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "  \"ntp_notification_promo\": ["
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "    {"
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"date\":"
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        ["
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          {"
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "            \"start\":\"3 Aug 1999 9:26:06 GMT\","
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "            \"end\":\"$1\""
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          }"
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        ],"
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"grouping\":"
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        {"
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"buckets\":1000,"
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"segment\":200,"
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment\":100,"
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment_frequency\":3600,"
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment_max\":400"
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        },"
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"payload\":"
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        {"
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"promo_message_short\":"
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "              \"What do you think of Chrome?\","
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"days_active\":7,"
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"install_age_days\":21"
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        },"
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"max_views\":30"
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "    }"
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "  ]"
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "}",
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "What do you think of Chrome?",
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  // The starting date is in 1999 to make tests pass
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  // on Android devices with incorrect or unset date/time.
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  933672366,  // unix epoch for 3 Aug 1999 9:26:06 GMT.
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  1000, 200, 100, 3600, 400, 30);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.InitPromoFromJson(true);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second time should not trigger a notification.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.InitPromoFromJson(false);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestInitFromPrefs();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that strings.|payload.promo_message_short| is used if present.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PromoResourceServiceTest, NotificationPromoCompatPayloadStringsTest) {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that prefs are set correctly.
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationPromoTest promo_test;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up start date and promo line in a Dictionary as if parsed from the
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // service. date[0].end is replaced with a date 1 year in the future.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.Init("{"
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "  \"ntp_notification_promo\": ["
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "    {"
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"date\":"
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        ["
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          {"
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "            \"start\":\"3 Aug 1999 9:26:06 GMT\","
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "            \"end\":\"$1\""
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          }"
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        ],"
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"grouping\":"
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        {"
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"buckets\":1000,"
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"segment\":200,"
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment\":100,"
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment_frequency\":3600,"
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"increment_max\":400"
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        },"
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"strings\":"
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        {"
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"bogus\":\"string\","
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"GOOD_STRING\":"
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "              \"What do you think of Chrome?\""
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        },"
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"payload\":"
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        {"
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"promo_message_short\":"
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "              \"GOOD_STRING\","
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "          \"days_active\":7,"
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"install_age_days\":21"
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "        },"
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "      \"max_views\":30"
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "    }"
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "  ]"
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "}",
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "What do you think of Chrome?",
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  // The starting date is in 1999 to make tests pass
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  // on Android devices with incorrect or unset date/time.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  933672366,  // unix epoch for 3 Aug 1999 9:26:06 GMT.
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  1000, 200, 100, 3600, 400, 30);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.InitPromoFromJson(true);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second time should not trigger a notification.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.InitPromoFromJson(false);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  promo_test.TestInitFromPrefs();
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PromoResourceServiceTest, PromoServerURLTest) {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL promo_server_url = NotificationPromo::PromoServerURL();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(promo_server_url.is_empty());
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(promo_server_url.is_valid());
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(promo_server_url.SchemeIs(url::kHttpsScheme));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(achuith): Test this better.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(ENABLE_APP_LIST)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PromoResourceServiceTest, AppLauncherPromoTest) {
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check that prefs are set correctly.
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NotificationPromoTest promo_test;
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up start date and promo line in a Dictionary as if parsed from the
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // service. date[0].end is replaced with a date 1 year in the future.
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  promo_test.Init("{"
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "  \"ntp_notification_promo\": ["
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "    {"
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "      \"date\":"
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "        ["
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          {"
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "            \"start\":\"3 Aug 1999 9:26:06 GMT\","
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "            \"end\":\"$1\""
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          }"
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "        ],"
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "      \"grouping\":"
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "        {"
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"buckets\":1000,"
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"segment\":200,"
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"increment\":100,"
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"increment_frequency\":3600,"
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"increment_max\":400"
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "        },"
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "      \"payload\":"
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "        {"
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"promo_message_short\":"
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "              \"What do you think of Chrome?\","
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"days_active\":7,"
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"install_age_days\":21,"
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "          \"is_app_launcher_promo\":true"
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "        },"
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "      \"max_views\":30"
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "    }"
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "  ]"
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "}",
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "What do you think of Chrome?",
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  // The starting date is in 1999 to make tests pass
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  // on Android devices with incorrect or unset date/time.
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  933672366,  // unix epoch for 3 Aug 1999 9:26:06 GMT.
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  1000, 200, 100, 3600, 400, 30);
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  promo_test.InitPromoFromJson(true);
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  local_state_.Get()->SetBoolean(prefs::kAppLauncherIsEnabled, true);
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(promo_test.promo().CanShow());
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
583