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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h" 89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_resource/notification_promo.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_resource/promo_resource_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/scoped_testing_local_state.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/web_resource/notification_promo_mobile_ntp.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PromoResourceServiceMobileNtpTest : public testing::Test { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |promo_resource_service_| must be created after |local_state_|. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PromoResourceServiceMobileNtpTest() 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : local_state_(TestingBrowserProcess::GetGlobal()), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) promo_resource_service_(new PromoResourceService) {} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedTestingLocalState local_state_; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PromoResourceService> promo_resource_service_; 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop loop_; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NotificationPromoMobileNtpTest { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationPromoMobileNtpTest() : received_notification_(false) {} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Init(const std::string& json, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& promo_text, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& promo_text_long, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& promo_action_type, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& promo_action_arg0, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& promo_action_arg1) { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Value* value(base::JSONReader::Read(json)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(value); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* dict = NULL; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->GetAsDictionary(&dict); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dict); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_json_.reset(dict); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_text_ = promo_text; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_text_long_ = promo_text_long; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_action_type_ = promo_action_type; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_action_args_.push_back(promo_action_arg0); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_action_args_.push_back(promo_action_arg1); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_notification_ = false; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitPromoFromJson(bool should_receive_notification) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(mobile_promo_.InitFromJson(*test_json_)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mobile_promo_.valid()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(should_receive_notification, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mobile_promo_.notification_promo().new_notification()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test the fields. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNotification(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestNotification() { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check values. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mobile_promo_.valid()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(mobile_promo_.text(), promo_text_); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(mobile_promo_.text_long(), promo_text_long_); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(mobile_promo_.action_type(), promo_action_type_); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mobile_promo_.action_args() != NULL); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2u, promo_action_args_.size()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(mobile_promo_.action_args()->GetSize(), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_action_args_.size()); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::size_t i = 0; i < promo_action_args_.size(); ++i) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string value; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mobile_promo_.action_args()->GetString(i, &value)); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value, promo_action_args_[i]); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new NotificationPromo from prefs and compare to current 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notification. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestInitFromPrefs() { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationPromoMobileNtp prefs_mobile_promo; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(prefs_mobile_promo.InitFromPrefs()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(prefs_mobile_promo.valid()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mobile_promo_.valid()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prefs_mobile_promo.text(), 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mobile_promo_.text()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prefs_mobile_promo.text_long(), 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mobile_promo_.text_long()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prefs_mobile_promo.action_type(), 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mobile_promo_.action_type()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mobile_promo_.action_args() != NULL); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prefs_mobile_promo.action_args()->GetSize(), 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mobile_promo_.action_args()->GetSize()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::size_t i = 0; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i < prefs_mobile_promo.action_args()->GetSize(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string promo_value; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string prefs_value; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_mobile_promo.action_args()->GetString(i, &prefs_value)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mobile_promo_.action_args()->GetString(i, &promo_value)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(promo_value, prefs_value); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationPromoMobileNtp mobile_promo_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_notification_; 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> test_json_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string promo_text_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string promo_text_long_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string promo_action_type_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> promo_action_args_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PromoResourceServiceMobileNtpTest, NotificationPromoMobileNtpTest) { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationPromoMobileNtpTest promo_test; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up start and end dates and promo line in a Dictionary as if parsed 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the service. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_test.Init( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "{" 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"mobile_ntp_sync_promo\": [" 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {" 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"date\":" 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " [" 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {" 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"start\":\"3 Aug 1999 9:26:06 GMT\"," 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"end\":\"7 Jan 2013 5:40:75 PST\"" 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ]," 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"strings\":" 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {" 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"MOBILE_PROMO_CHROME_SHORT_TEXT\":" 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"Like Chrome? Go http://www.google.com/chrome/\"," 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"MOBILE_PROMO_CHROME_LONG_TEXT\":" 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"It's simple. Go http://www.google.com/chrome/\"," 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"MOBILE_PROMO_EMAIL_BODY\":\"This is the body.\"," 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"XXX\":\"XXX value\"" 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"payload\":" 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {" 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"payload_format_version\":3," 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"promo_message_long\":" 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"MOBILE_PROMO_CHROME_LONG_TEXT\"," 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"promo_message_short\":" 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"MOBILE_PROMO_CHROME_SHORT_TEXT\"," 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"promo_action_type\":\"ACTION_EMAIL\"," 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"promo_action_args\":[\"MOBILE_PROMO_EMAIL_BODY\",\"XXX\"]" 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }," 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"max_views\":30" 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }" 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ]" 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}", 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Like Chrome? Go http://www.google.com/chrome/", 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "It\'s simple. Go http://www.google.com/chrome/", 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ACTION_EMAIL", "This is the body.", "XXX value"); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_test.InitPromoFromJson(true); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Second time should not trigger a notification. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_test.InitPromoFromJson(false); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) promo_test.TestInitFromPrefs(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 183