Index: ios/chrome/browser/ui/ntp/notification_promo_whats_new_unittest.mm |
diff --git a/ios/chrome/browser/ui/ntp/notification_promo_whats_new_unittest.mm b/ios/chrome/browser/ui/ntp/notification_promo_whats_new_unittest.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..538e52e7915b167b6806f42dfacae49ef0f837e9 |
--- /dev/null |
+++ b/ios/chrome/browser/ui/ntp/notification_promo_whats_new_unittest.mm |
@@ -0,0 +1,222 @@ |
+// Copyright (c) 2016 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. |
+ |
+#import "ios/chrome/browser/ui/ntp/notification_promo_whats_new.h" |
+ |
+#include <map> |
+ |
+#include "base/metrics/field_trial.h" |
+#include "base/test/user_action_tester.h" |
+#include "base/time/time.h" |
+#include "base/values.h" |
+#include "components/metrics/metrics_pref_names.h" |
+#include "components/prefs/pref_registry_simple.h" |
+#include "components/prefs/testing_pref_service.h" |
+#include "components/variations/variations_associated_data.h" |
+#include "ios/chrome/browser/ui/commands/ios_command_ids.h" |
+#include "ios/chrome/grit/ios_chromium_strings.h" |
+#include "ios/public/provider/chrome/browser/images/whats_new_icon.h" |
+#include "testing/platform_test.h" |
+#include "ui/base/l10n/l10n_util.h" |
+#include "url/gurl.h" |
+ |
+namespace { |
+ |
+// Test fixture for NotificationPromoWhatsNew. |
+class NotificationPromoWhatsNewTest : public PlatformTest { |
+ public: |
+ NotificationPromoWhatsNewTest() |
+ : promo_(&local_state_), |
+ field_trial_list_(new base::FieldTrialList(NULL)) { |
+ ios::NotificationPromo::RegisterPrefs(local_state_.registry()); |
+ local_state_.registry()->RegisterInt64Pref(metrics::prefs::kInstallDate, 0); |
+ } |
+ |
+ ~NotificationPromoWhatsNewTest() override { |
+ variations::testing::ClearAllVariationParams(); |
+ } |
+ |
+ void TearDown() override { |
+ promo_.ClearAndInitFromJson(base::DictionaryValue()); |
+ PlatformTest::TearDown(); |
+ } |
+ |
+ // Sets up a mock finch trial and inits the NotificationPromoWhatsNew. All |
+ // parameters will be added to the list of finch parameters. |
+ void Init(const std::string& start, |
+ const std::string& end, |
+ const std::string& promo_text, |
+ const std::string& promo_id, |
+ const std::string& promo_type, |
+ const std::string& url, |
+ const std::string& command, |
+ const std::string& metric_name, |
+ const std::string& icon, |
+ const std::string& seconds_since_install, |
+ const std::string& max_seconds_since_install) { |
+ std::map<std::string, std::string> field_trial_params; |
+ field_trial_params["start"] = start; |
+ field_trial_params["end"] = end; |
+ field_trial_params["promo_text"] = promo_text; |
+ field_trial_params["promo_id"] = promo_id; |
+ field_trial_params["promo_type"] = promo_type; |
+ field_trial_params["url"] = url; |
+ field_trial_params["command"] = command; |
+ field_trial_params["metric_name"] = metric_name; |
+ field_trial_params["icon"] = icon; |
+ field_trial_params["seconds_since_install"] = seconds_since_install; |
+ field_trial_params["max_seconds_since_install"] = max_seconds_since_install; |
+ |
+ variations::AssociateVariationParams("IOSNTPPromotion", "Group1", |
+ field_trial_params); |
+ base::FieldTrialList::CreateFieldTrial("IOSNTPPromotion", "Group1"); |
+ |
+ promo_.Init(); |
+ } |
+ |
+ // Tests that |promo_text|, |promo_type|, |url|, |command_id|, and |icon| |
+ // equal their respective values in |promo_|, and that |valid| matches the |
+ // return value of |promo_|'s |CanShow()| method. |icon| is verified only if |
+ // |valid| is true. |
+ void RunTests(const std::string& promo_text, |
+ const std::string& promo_type, |
+ const std::string& url, |
+ int command_id, |
+ WhatsNewIcon icon, |
+ bool valid) { |
+ EXPECT_EQ(promo_text, promo_.promo_text()); |
+ EXPECT_EQ(promo_type, promo_.promo_type()); |
+ if (promo_type == "url") |
+ EXPECT_EQ(url, promo_.url().spec()); |
+ else |
+ EXPECT_EQ(command_id, promo_.command_id()); |
+ |
+ EXPECT_EQ(valid, promo_.CanShow()); |
+ // |icon()| is set only if the promo is valid. |
+ if (valid) |
+ EXPECT_EQ(icon, promo_.icon()); |
+ } |
+ |
+ protected: |
+ TestingPrefServiceSimple local_state_; |
+ NotificationPromoWhatsNew promo_; |
+ |
+ private: |
+ std::unique_ptr<base::FieldTrialList> field_trial_list_; |
+}; |
+ |
+// Test that a command-based, valid promo is shown with the correct text. |
+TEST_F(NotificationPromoWhatsNewTest, NotificationPromoCommandTest) { |
+ Init("3 Aug 1999 9:26:06 GMT", "3 Aug 2199 9:26:06 GMT", |
+ "IDS_IOS_APP_RATING_PROMO_STRING", "0", "chrome_command", "", |
+ "ratethisapp", "RateThisAppPromo", "logo", "0", "0"); |
+ RunTests(l10n_util::GetStringUTF8(IDS_IOS_APP_RATING_PROMO_STRING), |
+ "chrome_command", "", IDC_RATE_THIS_APP, WHATS_NEW_LOGO, true); |
+} |
+ |
+// Test that a url-based, valid promo is shown with the correct text and icon. |
+TEST_F(NotificationPromoWhatsNewTest, NotificationPromoURLTest) { |
+ Init("3 Aug 1999 9:26:06 GMT", "3 Aug 2199 9:26:06 GMT", "Test URL", "0", |
+ "url", "http://blog.chromium.org", "", "TestURLPromo", "", "0", "0"); |
+ RunTests("Test URL", "url", "http://blog.chromium.org/", 0, WHATS_NEW_INFO, |
+ true); |
+} |
+ |
+// Test that an invalid promo is not shown. |
+TEST_F(NotificationPromoWhatsNewTest, NotificationPromoInvalidTest) { |
+ Init("3 Aug 1999 9:26:06 GMT", "3 Aug 2199 9:26:06 GMT", "Test URL", "0", |
+ "url", "", "", "TestURLPromo", "", "0", "0"); |
+ RunTests("Test URL", "url", "", 0, WHATS_NEW_INFO, false); |
+} |
+ |
+// Test that if max_seconds_since_install is set, and the current time is before |
+// the cut off, the promo still shows. |
+TEST_F(NotificationPromoWhatsNewTest, MaxSecondsSinceInstallSuccessTest) { |
+ // Init with max_seconds_since_install set to 2 days. |
+ Init("3 Aug 1999 9:26:06 GMT", "3 Aug 2199 9:26:06 GMT", |
+ "IDS_IOS_APP_RATING_PROMO_STRING", "0", "chrome_command", "", |
+ "ratethisapp", "RateThisAppPromo", "logo", "0", "172800"); |
+ // Set install date to one day before now. |
+ base::Time one_day_before_now_time = |
+ base::Time::Now() - base::TimeDelta::FromDays(1); |
+ int64_t one_day_before_now = one_day_before_now_time.ToTimeT(); |
+ local_state_.SetInt64(metrics::prefs::kInstallDate, one_day_before_now); |
+ // Expect the promo to show since install date was one day ago, and the promo |
+ // can show until 2 days after install date. |
+ EXPECT_TRUE(promo_.CanShow()); |
+} |
+ |
+// Test that if max_seconds_since_install is set, and the current time is after |
+// the cut off, the promo does not show. |
+TEST_F(NotificationPromoWhatsNewTest, MaxSecondsSinceInstallFailureTest) { |
+ // Init with max_seconds_since_install set to 2 days. |
+ Init("3 Aug 1999 9:26:06 GMT", "3 Aug 2199 9:26:06 GMT", |
+ "IDS_IOS_APP_RATING_PROMO_STRING", "0", "chrome_command", "", |
+ "ratethisapp", "RateThisAppPromo", "logo", "0", "172800"); |
+ // Set install date to three days before now. |
+ base::Time three_days_before_now_time = |
+ base::Time::Now() - base::TimeDelta::FromDays(3); |
+ int64_t three_days_before_now = three_days_before_now_time.ToTimeT(); |
+ local_state_.SetInt64(metrics::prefs::kInstallDate, three_days_before_now); |
+ // Expect the promo not to show since install date was three days ago, and |
+ // the promo can show until 2 days after install date. |
+ EXPECT_FALSE(promo_.CanShow()); |
+} |
+// Test that if seconds_since_install is set, and the current time is after |
+// install_date + seconds_since_install, the promo still shows. |
+TEST_F(NotificationPromoWhatsNewTest, SecondsSinceInstallSuccessTest) { |
+ // Init with seconds_since_install set to 2 days. |
+ Init("3 Aug 1999 9:26:06 GMT", "3 Aug 2199 9:26:06 GMT", |
+ "IDS_IOS_APP_RATING_PROMO_STRING", "0", "chrome_command", "", |
+ "ratethisapp", "RateThisAppPromo", "logo", "172800", "0"); |
+ // Set install date to three days before now. |
+ base::Time three_days_before_now_time = |
+ base::Time::Now() - base::TimeDelta::FromDays(3); |
+ int64_t three_days_before_now = three_days_before_now_time.ToTimeT(); |
+ local_state_.SetInt64(metrics::prefs::kInstallDate, three_days_before_now); |
+ // Expect the promo to show since install date was three days ago, and the |
+ // promo can show starting at 2 days after install date. |
+ EXPECT_TRUE(promo_.CanShow()); |
+} |
+ |
+// Test that if seconds_since_install is set, and the current time is before |
+// install_date + seconds_since_install, the promo does not show. |
+TEST_F(NotificationPromoWhatsNewTest, SecondsSinceInstallFailureTest) { |
+ // Init with seconds_since_install set to 2 days. |
+ Init("3 Aug 1999 9:26:06 GMT", "3 Aug 2199 9:26:06 GMT", |
+ "IDS_IOS_APP_RATING_PROMO_STRING", "0", "chrome_command", "", |
+ "ratethisapp", "RateThisAppPromo", "logo", "172800", "0"); |
+ // Set install date to one day before now. |
+ base::Time one_day_before_now_time = |
+ base::Time::Now() - base::TimeDelta::FromDays(1); |
+ int64_t one_day_before_now = one_day_before_now_time.ToTimeT(); |
+ local_state_.SetInt64(metrics::prefs::kInstallDate, one_day_before_now); |
+ // Expect the promo not to show since install date was one day ago, and |
+ // the promo can show starting at 2 days after install date. |
+ EXPECT_FALSE(promo_.CanShow()); |
+} |
+ |
+// Test that user actions are recorded when promo is viewed and closed. |
+TEST_F(NotificationPromoWhatsNewTest, NotificationPromoMetricTest) { |
+ Init("3 Aug 1999 9:26:06 GMT", "3 Aug 2199 9:26:06 GMT", |
+ "IDS_IOS_APP_RATING_PROMO_STRING", "0", "chrome_command", "", |
+ "ratethisapp", "RateThisAppPromo", "logo", "0", "0"); |
+ |
+ base::UserActionTester user_action_tester; |
+ // Assert that promo is appropriately set up to be viewed. |
+ ASSERT_TRUE(promo_.CanShow()); |
+ promo_.HandleViewed(); |
+ EXPECT_EQ(1, user_action_tester.GetActionCount( |
+ "WhatsNewPromoViewed_RateThisAppPromo")); |
+ |
+ // Verify that the promo closed user action count is 0 before |HandleClosed()| |
+ // is called. |
+ EXPECT_EQ(0, user_action_tester.GetActionCount( |
+ "WhatsNewPromoClosed_RateThisAppPromo")); |
+ promo_.HandleClosed(); |
+ EXPECT_EQ(1, user_action_tester.GetActionCount( |
+ "WhatsNewPromoClosed_RateThisAppPromo")); |
+} |
+ |
+} // namespace |