blob: f039c791c5ce52aba0417e69425251d9c7c5bd48 [file] [log] [blame]
Alexander Afanasyevf1e013f2012-07-11 17:59:40 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011,2012 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
20
21#include "ndnSIM-pit.h"
22#include "ns3/core-module.h"
23#include "ns3/ndnSIM-module.h"
24
25#include <boost/lexical_cast.hpp>
26
27NS_LOG_COMPONENT_DEFINE ("CcnxPitTest");
28
29namespace ns3
30{
31
32class Client : public CcnxApp
33{
34protected:
35 void
36 StartApplication ()
37 {
38 CcnxApp::StartApplication ();
39
40 // add default route
41 Ptr<CcnxFibEntry> fibEntry = GetNode ()->GetObject<CcnxFib> ()->Add (CcnxNameComponents ("/"), m_face, 0);
42 fibEntry->UpdateStatus (m_face, CcnxFibFaceMetric::NDN_FIB_GREEN);
43
44 Simulator::Schedule (Seconds (0.1), &Client::SendPacket, this, std::string("/1"), 1);
45 Simulator::Schedule (Seconds (0.2), &Client::SendPacket, this, std::string("/2"), 1);
46 Simulator::Schedule (Seconds (0.3), &Client::SendPacket, this, std::string("/3"), 1);
47 Simulator::Schedule (Seconds (0.4), &Client::SendPacket, this, std::string("/1"), 2);
48 }
49
50 void
51 StopApplication ()
52 {
53 CcnxApp::StopApplication ();
54 }
55
56private:
57 void
58 SendPacket (const std::string &prefix, uint32_t nonce)
59 {
60 Ptr<Packet> pkt = Create<Packet> (0);
61 CcnxInterestHeader i;
62 i.SetName (Create<CcnxNameComponents> (prefix));
63 i.SetNonce (nonce);
64 i.SetInterestLifetime (Seconds (0.5));
65
66 pkt->AddHeader (i);
67 m_protocolHandler (pkt);
68 }
69};
70
71void
72PitTest::Test (Ptr<CcnxFib> fib)
73{
74 NS_TEST_ASSERT_MSG_EQ (fib->GetSize (), 1, "There should be only one entry");
75
76 Ptr<const CcnxFibEntry> fibEntry = fib->Begin ();
77 NS_TEST_ASSERT_MSG_EQ (fibEntry->GetPrefix (), CcnxNameComponents ("/"), "prefix should be /");
78}
79
80void
81PitTest::Check0 (Ptr<CcnxPit> pit)
82{
83 // NS_LOG_DEBUG (*GetNode ()->GetObject<CcnxPit> ());
84 NS_TEST_ASSERT_MSG_EQ (pit->GetSize (), 0, "There should 0 entries in PIT");
85}
86
87void
88PitTest::Check1 (Ptr<CcnxPit> pit)
89{
90 NS_TEST_ASSERT_MSG_EQ (pit->GetSize (), 1, "There should 1 entry in PIT");
91}
92
93void
94PitTest::Check2 (Ptr<CcnxPit> pit)
95{
96 // NS_LOG_DEBUG (*GetNode ()->GetObject<CcnxPit> ());
97 NS_TEST_ASSERT_MSG_EQ (pit->GetSize (), 2, "There should 2 entries in PIT");
98}
99
100void
101PitTest::Check3 (Ptr<CcnxPit> pit)
102{
103 // NS_LOG_DEBUG (*GetNode ()->GetObject<CcnxPit> ());
104 NS_TEST_ASSERT_MSG_EQ (pit->GetSize (), 3, "There should 3 entries in PIT");
105}
106
107
108void
109PitTest::DoRun ()
110{
111 Ptr<Node> node = CreateObject<Node> ();
112 CcnxStackHelper ccnx;
113 ccnx.Install (node);
114
115 Ptr<Client> app1 = CreateObject<Client> ();
116 node->AddApplication (app1);
117
118 Simulator::Schedule (Seconds (0.0001), &PitTest::Test, this, node->GetObject<CcnxFib> ());
119
120 Simulator::Schedule (Seconds (0.01), &PitTest::Check0, this, node->GetObject<CcnxPit> ());
121
122 Simulator::Schedule (Seconds (0.11), &PitTest::Check1, this, node->GetObject<CcnxPit> ());
123 Simulator::Schedule (Seconds (0.21), &PitTest::Check2, this, node->GetObject<CcnxPit> ());
124 Simulator::Schedule (Seconds (0.31), &PitTest::Check3, this, node->GetObject<CcnxPit> ());
125
126 Simulator::Schedule (Seconds (0.61), &PitTest::Check3, this, node->GetObject<CcnxPit> ());
127 Simulator::Schedule (Seconds (0.71), &PitTest::Check2, this, node->GetObject<CcnxPit> ());
128 Simulator::Schedule (Seconds (0.81), &PitTest::Check1, this, node->GetObject<CcnxPit> ());
129
130 Simulator::Schedule (Seconds (0.91), &PitTest::Check0, this, node->GetObject<CcnxPit> ());
131
132 Simulator::Stop (Seconds (1.0));
133 Simulator::Run ();
134 Simulator::Destroy ();
135}
136
137}