// Copyright 2020 The Chromium OS 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 "patchpanel/dbus/fake_client.h"

namespace patchpanel {

bool FakeClient::NotifyArcStartup(pid_t) {
  return true;
}

bool FakeClient::NotifyArcShutdown() {
  return true;
}

std::vector<NetworkDevice> FakeClient::NotifyArcVmStartup(uint32_t cid) {
  return {};
}

bool FakeClient::NotifyArcVmShutdown(uint32_t cid) {
  return true;
}

bool FakeClient::NotifyTerminaVmStartup(uint32_t cid,
                                        NetworkDevice* device,
                                        IPv4Subnet* container_subnet) {
  return true;
}

bool FakeClient::NotifyTerminaVmShutdown(uint32_t cid) {
  return true;
}

bool FakeClient::NotifyPluginVmStartup(uint64_t vm_id,
                                       int subnet_index,
                                       NetworkDevice* device) {
  return true;
}

bool FakeClient::NotifyPluginVmShutdown(uint64_t vm_id) {
  return true;
}

bool FakeClient::DefaultVpnRouting(int socket) {
  return true;
}

bool FakeClient::RouteOnVpn(int socket) {
  return true;
}

bool FakeClient::BypassVpn(int socket) {
  return true;
}

std::pair<base::ScopedFD, patchpanel::ConnectNamespaceResponse>
FakeClient::ConnectNamespace(pid_t pid,
                             const std::string& outbound_ifname,
                             bool forward_user_traffic) {
  return {};
}

void FakeClient::GetTrafficCounters(const std::set<std::string>& devices,
                                    GetTrafficCountersCallback callback) {
  if (devices.size() == 0) {
    std::move(callback).Run(
        {stored_traffic_counters_.begin(), stored_traffic_counters_.end()});
    return;
  }

  std::vector<TrafficCounter> return_counters;
  for (const auto& counter : stored_traffic_counters_) {
    if (devices.find(counter.device()) != devices.end())
      return_counters.push_back(counter);
  }

  std::move(callback).Run({return_counters.begin(), return_counters.end()});
}

bool FakeClient::ModifyPortRule(
    patchpanel::ModifyPortRuleRequest::Operation op,
    patchpanel::ModifyPortRuleRequest::RuleType type,
    patchpanel::ModifyPortRuleRequest::Protocol proto,
    const std::string& input_ifname,
    const std::string& input_dst_ip,
    uint32_t input_dst_port,
    const std::string& dst_ip,
    uint32_t dst_port) {
  return true;
}

void FakeClient::RegisterNeighborConnectedStateChangedHandler(
    NeighborConnectedStateChangedHandler handler) {
  neighbor_handlers_.push_back(handler);
}

void FakeClient::TriggerNeighborConnectedStateChange(
    const NeighborConnectedStateChangedSignal& signal) {
  for (const auto& handler : neighbor_handlers_)
    handler.Run(signal);
}

}  // namespace patchpanel
