// Copyright (c) 2012 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_MOCK_ROUTING_TABLE_H_
#define SHILL_MOCK_ROUTING_TABLE_H_

#include <base/basictypes.h>
#include <gmock/gmock.h>

#include "shill/routing_table.h"

namespace shill {

class MockRoutingTable : public RoutingTable {
 public:
  MockRoutingTable();
  virtual ~MockRoutingTable();

  MOCK_METHOD0(Start, void());
  MOCK_METHOD0(Stop, void());
  MOCK_METHOD2(AddRoute, bool(int interface_index,
                              const RoutingTableEntry &entry));
  MOCK_METHOD3(GetDefaultRoute, bool(int interface_index,
                                     IPAddress::Family family,
                                     RoutingTableEntry *entry));
  MOCK_METHOD3(SetDefaultRoute, bool(int interface_index,
                                     const IPAddress &gateway_address,
                                     uint32 metric));
  MOCK_METHOD3(ConfigureRoutes, bool(int interface_index,
                                     const IPConfigRefPtr &ipconfig,
                                     uint32 metric));
  MOCK_METHOD3(CreateLinkRoute, bool(int interface_index,
                                     const IPAddress &local_address,
                                     const IPAddress &remote_address));
  MOCK_METHOD1(FlushRoutes, void(int interface_index));
  MOCK_METHOD1(FlushRoutesWithTag, void(int tag));
  MOCK_METHOD0(FlushCache, bool());
  MOCK_METHOD1(ResetTable, void(int interface_index));
  MOCK_METHOD2(SetDefaultMetric, void(int interface_index, uint32 metric));
  MOCK_METHOD4(RequestRouteToHost, bool(const IPAddress &addresss,
                                        int interface_index,
                                        int tag,
                                        const Query::Callback &callback));

 private:
  DISALLOW_COPY_AND_ASSIGN(MockRoutingTable);
};

}  // namespace shill

#endif  // SHILL_MOCK_ROUTING_TABLE_H_
