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

#ifndef QUICHE_QUIC_QBONE_PLATFORM_MOCK_NETLINK_H_
#define QUICHE_QUIC_QBONE_PLATFORM_MOCK_NETLINK_H_

#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
#include "net/third_party/quiche/src/quic/qbone/platform/netlink_interface.h"

namespace quic {

class MockNetlink : public NetlinkInterface {
 public:
  MOCK_METHOD2(GetLinkInfo, bool(const std::string&, LinkInfo*));

  MOCK_METHOD4(GetAddresses,
               bool(int, uint8_t, std::vector<AddressInfo>*, int*));

  MOCK_METHOD7(ChangeLocalAddress,
               bool(uint32_t,
                    Verb,
                    const QuicIpAddress&,
                    uint8_t,
                    uint8_t,
                    uint8_t,
                    const std::vector<struct rtattr*>&));

  MOCK_METHOD1(GetRouteInfo, bool(std::vector<RoutingRule>*));

  MOCK_METHOD6(
      ChangeRoute,
      bool(Verb, uint32_t, const IpRange&, uint8_t, QuicIpAddress, int32_t));

  MOCK_METHOD1(GetRuleInfo, bool(std::vector<IpRule>*));

  MOCK_METHOD3(ChangeRule, bool(Verb, uint32_t, IpRange));

  MOCK_METHOD2(Send, bool(struct iovec*, size_t));

  MOCK_METHOD2(Recv, bool(uint32_t, NetlinkParserInterface*));
};

}  // namespace quic

#endif  // QUICHE_QUIC_QBONE_PLATFORM_MOCK_NETLINK_H_
