// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/notifications/scheduler/internal/stats.h"

#include "base/test/metrics/histogram_tester.h"
#include "chrome/browser/notifications/scheduler/public/notification_data.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace notifications {
namespace stats {
namespace {

void TestLogUserAction(const UserActionData& user_action_data,
                       ActionButtonEvent action_button_event) {
  base::HistogramTester histograms;
  LogUserAction(user_action_data);
}

void TestNotificationShow(const NotificationData& notification_data,
                          SchedulerClientType client_type,
                          bool expect_ihnr_histogram,
                          bool expect_life_cycle_histogram) {
  base::HistogramTester histograms;
  LogNotificationShow(notification_data, client_type);
  if (expect_life_cycle_histogram) {
    histograms.ExpectBucketCount(
        "Notifications.Scheduler.NotificationLifeCycleEvent",
        NotificationLifeCycleEvent::kShown, 1);
    histograms.ExpectBucketCount(
        "Notifications.Scheduler.NotificationLifeCycleEvent.__Test__",
        NotificationLifeCycleEvent::kShown, 1);
  } else {
    histograms.ExpectTotalCount(
        "Notifications.Scheduler.NotificationLifeCycleEvent", 0);
    histograms.ExpectTotalCount(
        "Notifications.Scheduler.NotificationLifeCycleEvent.__Test__", 0);
  }
}

// Verifies that ihnr buttons clicks are logged.
TEST(NotificationSchedulerStatsTest, LogUserActionIhnrButton) {
  UserActionData user_action_data(SchedulerClientType::kTest1,
                                  UserActionType::kButtonClick, "guid");
  user_action_data.button_click_info = ButtonClickInfo();
  user_action_data.button_click_info->type = ActionButtonType::kHelpful;
  TestLogUserAction(user_action_data, ActionButtonEvent::kHelpfulClick);

  user_action_data.button_click_info->type = ActionButtonType::kUnhelpful;
  TestLogUserAction(user_action_data, ActionButtonEvent::kUnhelpfulClick);
}

// Verifies notification show event is logged when there are ihnr buttons.
TEST(NotificationSchedulerStatsTest, LogNotificationShow) {
  NotificationData notification_data;
  notification_data.buttons.emplace_back(NotificationData::Button());

  // Notification without ihnr buttons.
  TestNotificationShow(notification_data, SchedulerClientType::kTest1,
                       false /*expect_ihnr_histogram*/,
                       true /*expect_life_cycle_histogram*/);

  std::vector<ActionButtonType> types{ActionButtonType::kHelpful,
                                      ActionButtonType::kUnhelpful};
  for (auto action_button_type : types) {
    notification_data.buttons.front().type = action_button_type;
    // Notification with ihnr buttons.
    TestNotificationShow(notification_data, SchedulerClientType::kTest1,
                         true /*expect_ihnr_histogram*/,
                         true /*expect_life_cycle_histogram*/);
  }
}

TEST(NotificationSchedulerStatsTest, LogTipsNotificationFeatureTypeAction) {
  base::HistogramTester histograms;
  LogTipsNotificationFeatureTypeAction(
      UserActionType::kClick,
      tips::TipsNotificationsFeatureType::kEnhancedSafeBrowsing);
  histograms.ExpectBucketCount("Notifications.Scheduler.Tips.FeatureTypeAction",
                               UserActionType::kClick, 1);
  histograms.ExpectBucketCount(
      "Notifications.Scheduler.Tips.FeatureTypeAction.EnhancedSafeBrowsing",
      UserActionType::kClick, 1);
}

TEST(NotificationSchedulerStatsTest, LogTipsNotificationFeatureTypeShown) {
  base::HistogramTester histograms;
  LogTipsNotificationFeatureTypeShown(
      tips::TipsNotificationsFeatureType::kQuickDelete);
  histograms.ExpectBucketCount("Notifications.Scheduler.Tips.FeatureTypeShown",
                               tips::TipsNotificationsFeatureType::kQuickDelete,
                               1);
}

}  // namespace
}  // namespace stats
}  // namespace notifications
