// Copyright 2017 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 "net/nqe/event_creator.h"

#include "base/time/time.h"
#include "net/log/net_log_with_source.h"
#include "net/log/test_net_log.h"
#include "net/log/test_net_log_entry.h"
#include "net/nqe/effective_connection_type.h"
#include "net/nqe/network_quality.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {

namespace nqe {

namespace internal {

namespace {

// Returns the number of entries in |net_log| that have type set to
// |NetLogEventType::NETWORK_QUALITY_CHANGED|.
int GetNetworkQualityChangedEntriesCount(BoundTestNetLog* net_log) {
  TestNetLogEntry::List entries;
  net_log->GetEntries(&entries);

  int count = 0;
  for (const auto& entry : entries) {
    if (entry.type == NetLogEventType::NETWORK_QUALITY_CHANGED)
      ++count;
  }
  return count;
}

// Verify that the net log events are recorded correctly.
TEST(NetworkQualityEstimatorEventCreatorTest, Notified) {
  // std::unique_ptr<BoundTestNetLog>
  // net_log(std::make_unique<BoundTestNetLog>());
  BoundTestNetLog net_log;

  EventCreator event_creator(net_log.bound());

  NetworkQuality network_quality_100(base::TimeDelta::FromMilliseconds(100),
                                     base::TimeDelta::FromMilliseconds(100),
                                     100);

  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_2G, network_quality_100);
  EXPECT_EQ(1, GetNetworkQualityChangedEntriesCount(&net_log));

  // No new entry should be created since the network quality has not changed.
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_2G, network_quality_100);
  EXPECT_EQ(1, GetNetworkQualityChangedEntriesCount(&net_log));

  // A new entry should be created since effective connection type has changed.
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_100);
  EXPECT_EQ(2, GetNetworkQualityChangedEntriesCount(&net_log));

  // A new entry should not be created since HTTP RTT has not changed
  // meaningfully.
  NetworkQuality network_quality_http_rtt_110(
      base::TimeDelta::FromMilliseconds(110),
      base::TimeDelta::FromMilliseconds(100), 100);
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_http_rtt_110);
  EXPECT_EQ(2, GetNetworkQualityChangedEntriesCount(&net_log));

  // A new entry should be created since HTTP RTT has changed meaningfully.
  NetworkQuality network_quality_http_rtt_300(
      base::TimeDelta::FromMilliseconds(300),
      base::TimeDelta::FromMilliseconds(100), 100);
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_http_rtt_300);
  EXPECT_EQ(3, GetNetworkQualityChangedEntriesCount(&net_log));

  // A new entry should be created since transport RTT has changed meaningfully.
  NetworkQuality network_quality_transport_rtt_300(
      base::TimeDelta::FromMilliseconds(300),
      base::TimeDelta::FromMilliseconds(300), 100);
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_transport_rtt_300);
  EXPECT_EQ(4, GetNetworkQualityChangedEntriesCount(&net_log));

  // A new entry should be created since bandwidth has changed meaningfully.
  NetworkQuality network_quality_kbps_300(
      base::TimeDelta::FromMilliseconds(300),
      base::TimeDelta::FromMilliseconds(300), 300);
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_kbps_300);
  EXPECT_EQ(5, GetNetworkQualityChangedEntriesCount(&net_log));

  // A new entry should not be created since network quality has not changed
  // meaningfully.
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_kbps_300);
  EXPECT_EQ(5, GetNetworkQualityChangedEntriesCount(&net_log));

  // A new entry should be created since bandwidth has changed meaningfully.
  NetworkQuality network_quality_kbps_2000(
      base::TimeDelta::FromMilliseconds(300),
      base::TimeDelta::FromMilliseconds(300), 2000);
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_kbps_2000);
  EXPECT_EQ(6, GetNetworkQualityChangedEntriesCount(&net_log));

  // A new entry should not be created since bandwidth has not changed by more
  // than 20%.
  NetworkQuality network_quality_kbps_2200(
      base::TimeDelta::FromMilliseconds(300),
      base::TimeDelta::FromMilliseconds(300), 2200);
  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_kbps_2200);
  EXPECT_EQ(6, GetNetworkQualityChangedEntriesCount(&net_log));
}

}  // namespace

}  // namespace internal

}  // namespace nqe

}  // namespace net
