/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/**
 * Copyright (C) 2013 Regents of the University of California.
 * See COPYING for copyright and distribution information.
 */

#include "management/nfd-forwarder-status.hpp"
#include "data.hpp"

#include "boost-test.hpp"

namespace ndn {
namespace nfd {

BOOST_AUTO_TEST_SUITE(ManagementTestNfdForwarderStatus)

BOOST_AUTO_TEST_CASE(Encode)
{
  ForwarderStatus status1;
  status1.setNfdVersion(1014210635);
  status1.setStartTimestamp(time::fromUnixTimestamp(time::milliseconds(375193249325)));
  status1.setCurrentTimestamp(time::fromUnixTimestamp(time::milliseconds(886109034272)));
  status1.setNNameTreeEntries(1849943160);
  status1.setNFibEntries(621739748);
  status1.setNPitEntries(482129741);
  status1.setNMeasurementsEntries(1771725298);
  status1.setNCsEntries(1264968688);
  status1.setNInInterests(612811615);
  status1.setNInDatas(1843576050);
  status1.setNOutInterests(952144445);
  status1.setNOutDatas(138198826);

  Block wire;
  BOOST_REQUIRE_NO_THROW(wire = status1.wireEncode());

  // These octets are obtained by the snippet below.
  // This check is intended to detect unexpected encoding change in the future.
  //for (Buffer::const_iterator it = wire.begin(); it != wire.end(); ++it) {
  //  printf("0x%02x, ", *it);
  //}
  static const uint8_t expected[] = {
    0x15, 0x50, 0x80, 0x04, 0x3c, 0x73, 0xa0, 0x4b, 0x81, 0x08, 0x00, 0x00,
    0x00, 0x57, 0x5b, 0x42, 0xa6, 0x2d, 0x82, 0x08, 0x00, 0x00, 0x00, 0xce,
    0x50, 0x36, 0xd7, 0x20, 0x83, 0x04, 0x6e, 0x43, 0xe4, 0x78, 0x84, 0x04,
    0x25, 0x0e, 0xfe, 0xe4, 0x85, 0x04, 0x1c, 0xbc, 0xb7, 0x4d, 0x86, 0x04,
    0x69, 0x9a, 0x61, 0xf2, 0x87, 0x04, 0x4b, 0x65, 0xe3, 0xf0, 0x90, 0x04,
    0x24, 0x86, 0xc3, 0x5f, 0x91, 0x04, 0x6d, 0xe2, 0xbc, 0xf2, 0x92, 0x04,
    0x38, 0xc0, 0x92, 0x3d, 0x93, 0x04, 0x08, 0x3c, 0xbf, 0x2a
  };
  BOOST_REQUIRE_EQUAL_COLLECTIONS(expected, expected + sizeof(expected),
                                  wire.begin(), wire.end());

  Data data;
  data.setContent(wire);

  BOOST_REQUIRE_NO_THROW(ForwarderStatus(data.getContent()));
  ForwarderStatus status2(data.getContent());
  BOOST_CHECK_EQUAL(status1.getNfdVersion(), status2.getNfdVersion());
  BOOST_CHECK_EQUAL(status1.getStartTimestamp(), status2.getStartTimestamp());
  BOOST_CHECK_EQUAL(status1.getCurrentTimestamp(), status2.getCurrentTimestamp());
  BOOST_CHECK_EQUAL(status1.getNNameTreeEntries(), status2.getNNameTreeEntries());
  BOOST_CHECK_EQUAL(status1.getNFibEntries(), status2.getNFibEntries());
  BOOST_CHECK_EQUAL(status1.getNPitEntries(), status2.getNPitEntries());
  BOOST_CHECK_EQUAL(status1.getNMeasurementsEntries(), status2.getNMeasurementsEntries());
  BOOST_CHECK_EQUAL(status1.getNCsEntries(), status2.getNCsEntries());
  BOOST_CHECK_EQUAL(status1.getNInInterests(), status2.getNInInterests());
  BOOST_CHECK_EQUAL(status1.getNInDatas(), status2.getNInDatas());
  BOOST_CHECK_EQUAL(status1.getNOutInterests(), status2.getNOutInterests());
  BOOST_CHECK_EQUAL(status1.getNOutDatas(), status2.getNOutDatas());
}

BOOST_AUTO_TEST_SUITE_END()

} // namespace nfd
} // namespace ndn
