// Copyright (c) 2019 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/third_party/quiche/src/quic/quartc/test/quartc_competing_endpoint.h"

#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"

namespace quic {
namespace test {

QuartcCompetingEndpoint::QuartcCompetingEndpoint(
    simulator::Simulator* simulator,
    QuicTime::Delta send_interval,
    QuicByteCount bytes_per_interval,
    const std::string& name,
    const std::string& peer_name,
    Perspective perspective,
    QuicConnectionId connection_id)
    : Actor(simulator, QuicStrCat(name, " actor")),
      send_interval_(send_interval),
      bytes_per_interval_(bytes_per_interval),
      endpoint_(std::make_unique<simulator::QuicEndpoint>(simulator,
                                                          name,
                                                          peer_name,
                                                          perspective,
                                                          connection_id)) {
  // Schedule the first send for one send interval into the test.
  Schedule(simulator_->GetClock()->Now() + send_interval_);
  last_send_time_ = simulator_->GetClock()->Now();
}

void QuartcCompetingEndpoint::Act() {
  endpoint_->AddBytesToTransfer(bytes_per_interval_);
  if (send_interval_ > QuicTime::Delta::Zero()) {
    Schedule(last_send_time_ + send_interval_);
  }
  last_send_time_ = simulator_->GetClock()->Now();
}

}  // namespace test
}  // namespace quic
