// Copyright 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.

#include "net/nqe/network_quality.h"

namespace net {
namespace nqe {
namespace internal {

base::TimeDelta InvalidRTT() {
  return base::TimeDelta::FromMilliseconds(INVALID_RTT_THROUGHPUT);
}

NetworkQuality::NetworkQuality()
    : NetworkQuality(InvalidRTT(), InvalidRTT(), INVALID_RTT_THROUGHPUT) {
  VerifyValueCorrectness();
  DETACH_FROM_SEQUENCE(sequence_checker_);
}

NetworkQuality::NetworkQuality(const base::TimeDelta& http_rtt,
                               const base::TimeDelta& transport_rtt,
                               int32_t downstream_throughput_kbps)
    : http_rtt_(http_rtt),
      transport_rtt_(transport_rtt),
      downstream_throughput_kbps_(downstream_throughput_kbps) {
  VerifyValueCorrectness();
  DETACH_FROM_SEQUENCE(sequence_checker_);
}

NetworkQuality::NetworkQuality(const NetworkQuality& other)
    : NetworkQuality(other.http_rtt_,
                     other.transport_rtt_,
                     other.downstream_throughput_kbps_) {
  VerifyValueCorrectness();
  DETACH_FROM_SEQUENCE(sequence_checker_);
}

NetworkQuality::~NetworkQuality() = default;

NetworkQuality& NetworkQuality::operator=(const NetworkQuality& other) {
  http_rtt_ = other.http_rtt_;
  transport_rtt_ = other.transport_rtt_;
  downstream_throughput_kbps_ = other.downstream_throughput_kbps_;
  VerifyValueCorrectness();
  DETACH_FROM_SEQUENCE(sequence_checker_);
  return *this;
}

bool NetworkQuality::operator==(const NetworkQuality& other) const {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  return http_rtt_ == other.http_rtt_ &&
         transport_rtt_ == other.transport_rtt_ &&
         downstream_throughput_kbps_ == other.downstream_throughput_kbps_;
}

bool NetworkQuality::IsFaster(const NetworkQuality& other) const {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  return (http_rtt() == InvalidRTT() || other.http_rtt() == InvalidRTT() ||
          http_rtt() <= other.http_rtt()) &&
         (transport_rtt() == InvalidRTT() ||
          other.transport_rtt() == InvalidRTT() ||
          transport_rtt() <= other.transport_rtt()) &&
         (downstream_throughput_kbps() == INVALID_RTT_THROUGHPUT ||
          other.downstream_throughput_kbps() == INVALID_RTT_THROUGHPUT ||
          downstream_throughput_kbps() >= other.downstream_throughput_kbps());
}

void NetworkQuality::VerifyValueCorrectness() const {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  DCHECK_LE(INVALID_RTT_THROUGHPUT, http_rtt_.InMilliseconds());
  DCHECK_LE(INVALID_RTT_THROUGHPUT, transport_rtt_.InMilliseconds());
  DCHECK_LE(INVALID_RTT_THROUGHPUT, downstream_throughput_kbps_);
}

}  // namespace internal
}  // namespace nqe
}  // namespace net
