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

#ifndef SHILL_ARP_CLIENT_TEST_HELPER_H_
#define SHILL_ARP_CLIENT_TEST_HELPER_H_

#include <base/macros.h>

#include "shill/arp_packet.h"
#include "shill/mock_arp_client.h"
#include "shill/net/byte_string.h"
#include "shill/net/ip_address.h"

namespace shill {

// Class for simulate ARP client receiving ARP packets for unit test purpose.
class ArpClientTestHelper {
 public:
  explicit ArpClientTestHelper(MockArpClient* client);
  virtual ~ArpClientTestHelper();

  void GeneratePacket(uint16_t operation,
                      const IPAddress& local_ip,
                      const ByteString& local_mac,
                      const IPAddress& remote_ip,
                      const ByteString& remote_mac);

 private:
  bool SimulateReceivePacket(ArpPacket* packet, ByteString* sender);

  MockArpClient* client_;
  ArpPacket packet_;

  DISALLOW_COPY_AND_ASSIGN(ArpClientTestHelper);
};

}  // namespace shill

#endif  // SHILL_ARP_CLIENT_TEST_HELPER_H_
