blob: 270abb07e3b4e9d68618e1d64b5bec17928fe5c1 [file] [log] [blame]
Davide Pesavento44deacc2014-02-19 10:48:07 +01001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -07003 * Copyright (c) 2014 Regents of the University of California,
4 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology
9 *
10 * This file is part of NFD (Named Data Networking Forwarding Daemon).
11 * See AUTHORS.md for complete list of NFD authors and contributors.
12 *
13 * NFD is free software: you can redistribute it and/or modify it under the terms
14 * of the GNU General Public License as published by the Free Software Foundation,
15 * either version 3 of the License, or (at your option) any later version.
16 *
17 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
18 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
19 * PURPOSE. See the GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along with
22 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
23 **/
Davide Pesavento44deacc2014-02-19 10:48:07 +010024
Alexander Afanasyev0eb70652014-02-27 18:35:07 -080025#include "face/ethernet-factory.hpp"
Davide Pesaventob60cc122014-03-19 19:26:02 +010026#include "core/network-interface.hpp"
Junxiao Shid9ee45c2014-02-27 15:38:11 -070027#include "tests/test-common.hpp"
Davide Pesavento44deacc2014-02-19 10:48:07 +010028
Alexander Afanasyev4a771362014-04-24 21:29:33 -070029#include <ndn-cxx/security/key-chain.hpp>
Davide Pesaventob60cc122014-03-19 19:26:02 +010030#include <pcap/pcap.h>
31
Davide Pesavento44deacc2014-02-19 10:48:07 +010032namespace nfd {
Junxiao Shid9ee45c2014-02-27 15:38:11 -070033namespace tests {
Davide Pesavento44deacc2014-02-19 10:48:07 +010034
Junxiao Shid9ee45c2014-02-27 15:38:11 -070035BOOST_FIXTURE_TEST_SUITE(FaceEthernet, BaseFixture)
Davide Pesavento44deacc2014-02-19 10:48:07 +010036
Davide Pesaventob60cc122014-03-19 19:26:02 +010037class InterfacesFixture : protected BaseFixture
38{
39protected:
40 InterfacesFixture()
41 {
42 std::list< shared_ptr<NetworkInterfaceInfo> > ifs = listNetworkInterfaces();
43 for (std::list< shared_ptr<NetworkInterfaceInfo> >::const_iterator i = ifs.begin();
44 i != ifs.end();
45 ++i)
46 {
47 if (!(*i)->isLoopback() && (*i)->isUp())
48 {
49 pcap_t* p = pcap_create((*i)->name.c_str(), 0);
50 if (!p)
51 continue;
52
53 if (pcap_activate(p) == 0)
54 m_interfaces.push_back(*i);
55
56 pcap_close(p);
57 }
58 }
59 }
60
61protected:
62 std::list< shared_ptr<NetworkInterfaceInfo> > m_interfaces;
63};
64
65
66BOOST_FIXTURE_TEST_CASE(MulticastFacesMap, InterfacesFixture)
Davide Pesavento44deacc2014-02-19 10:48:07 +010067{
Alexander Afanasyev0eb70652014-02-27 18:35:07 -080068 EthernetFactory factory;
Davide Pesavento44deacc2014-02-19 10:48:07 +010069
Davide Pesaventob60cc122014-03-19 19:26:02 +010070 if (m_interfaces.empty())
Davide Pesavento44deacc2014-02-19 10:48:07 +010071 {
Davide Pesaventob60cc122014-03-19 19:26:02 +010072 BOOST_WARN_MESSAGE(false, "No interfaces available, cannot perform MulticastFacesMap test");
Davide Pesavento44deacc2014-02-19 10:48:07 +010073 return;
74 }
75
Davide Pesaventob60cc122014-03-19 19:26:02 +010076 shared_ptr<EthernetFace> face1;
77 BOOST_REQUIRE_NO_THROW(face1 = factory.createMulticastFace(m_interfaces.front(),
78 ethernet::getBroadcastAddress()));
79 shared_ptr<EthernetFace> face1bis;
80 BOOST_REQUIRE_NO_THROW(face1bis = factory.createMulticastFace(m_interfaces.front(),
81 ethernet::getBroadcastAddress()));
82 BOOST_CHECK_EQUAL(face1, face1bis);
83
84 if (m_interfaces.size() > 1)
85 {
86 shared_ptr<EthernetFace> face2;
87 BOOST_REQUIRE_NO_THROW(face2 = factory.createMulticastFace(m_interfaces.back(),
88 ethernet::getBroadcastAddress()));
89 BOOST_CHECK_NE(face1, face2);
90 }
91 else
92 {
93 BOOST_WARN_MESSAGE(false, "Cannot test second EthernetFace creation, "
94 "only one interface available");
95 }
96
97 shared_ptr<EthernetFace> face3;
98 BOOST_REQUIRE_NO_THROW(face3 = factory.createMulticastFace(m_interfaces.front(),
99 ethernet::getDefaultMulticastAddress()));
100 BOOST_CHECK_NE(face1, face3);
101}
102
103BOOST_FIXTURE_TEST_CASE(SendPacket, InterfacesFixture)
104{
105 EthernetFactory factory;
106
107 if (m_interfaces.empty())
108 {
109 BOOST_WARN_MESSAGE(false, "No interfaces available for pcap, cannot perform SendPacket test");
110 return;
111 }
112
113 shared_ptr<EthernetFace> face = factory.createMulticastFace(m_interfaces.front(),
114 ethernet::getDefaultMulticastAddress());
Davide Pesavento44deacc2014-02-19 10:48:07 +0100115
116 BOOST_REQUIRE(static_cast<bool>(face));
Alexander Afanasyev355c0662014-03-20 18:08:17 -0700117
118 BOOST_CHECK(!face->isOnDemand());
Davide Pesavento44deacc2014-02-19 10:48:07 +0100119 BOOST_CHECK_EQUAL(face->isLocal(), false);
Junxiao Shi79494162014-04-02 18:25:11 -0700120 BOOST_CHECK_EQUAL(face->getRemoteUri().toString(),
Davide Pesaventoedae3532014-04-09 03:07:11 +0200121 "ether://" + ethernet::getDefaultMulticastAddress().toString());
Junxiao Shi79494162014-04-02 18:25:11 -0700122 BOOST_CHECK_EQUAL(face->getLocalUri().toString(),
123 "dev://" + m_interfaces.front()->name);
Davide Pesavento44deacc2014-02-19 10:48:07 +0100124
125 Interest interest1("ndn:/TpnzGvW9R");
126 Data data1 ("ndn:/KfczhUqVix");
127 data1.setContent(0, 0);
128 Interest interest2("ndn:/QWiIMfj5sL");
129 Data data2 ("ndn:/XNBV796f");
130 data2.setContent(0, 0);
131
132 ndn::SignatureSha256WithRsa fakeSignature;
133 fakeSignature.setValue(ndn::dataBlock(tlv::SignatureValue, reinterpret_cast<const uint8_t*>(0), 0));
134
135 // set fake signature on data1 and data2
136 data1.setSignature(fakeSignature);
137 data2.setSignature(fakeSignature);
138
139 BOOST_CHECK_NO_THROW(face->sendInterest(interest1));
140 BOOST_CHECK_NO_THROW(face->sendData (data1 ));
141 BOOST_CHECK_NO_THROW(face->sendInterest(interest2));
142 BOOST_CHECK_NO_THROW(face->sendData (data2 ));
143
144// m_ioRemaining = 4;
145// m_ioService.run();
146// m_ioService.reset();
147
148// BOOST_REQUIRE_EQUAL(m_face1_receivedInterests.size(), 1);
149// BOOST_REQUIRE_EQUAL(m_face1_receivedDatas .size(), 1);
150// BOOST_REQUIRE_EQUAL(m_face2_receivedInterests.size(), 1);
151// BOOST_REQUIRE_EQUAL(m_face2_receivedDatas .size(), 1);
152
153// BOOST_CHECK_EQUAL(m_face1_receivedInterests[0].getName(), interest2.getName());
154// BOOST_CHECK_EQUAL(m_face1_receivedDatas [0].getName(), data2.getName());
155// BOOST_CHECK_EQUAL(m_face2_receivedInterests[0].getName(), interest1.getName());
156// BOOST_CHECK_EQUAL(m_face2_receivedDatas [0].getName(), data1.getName());
157}
158
159BOOST_AUTO_TEST_SUITE_END()
160
Junxiao Shid9ee45c2014-02-27 15:38:11 -0700161} // namespace tests
Davide Pesavento44deacc2014-02-19 10:48:07 +0100162} // namespace nfd