/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/**
 * Copyright (c) 2013-2014,  Regents of the University of California.
 * All rights reserved.
 *
 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
 *
 * This file licensed under New BSD License.  See COPYING for detailed information about
 * ndn-cxx library copyright, permissions, and redistribution restrictions.
 */

#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(375193249325LL)));
  status1.setCurrentTimestamp(time::fromUnixTimestamp(time::milliseconds(886109034272LL)));
  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
