blob: 6bcb9fbc0366745493d338622c073866d12e846f [file] [log] [blame]
Junxiao Shi2713a3b2015-06-22 16:19:05 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Teng Liang62884862016-03-31 18:15:36 -07003 * Copyright (c) 2014-2016, Arizona Board of Regents.
Junxiao Shi2713a3b2015-06-22 16:19:05 -07004 *
5 * This file is part of ndn-tools (Named Data Networking Essential Tools).
6 * See AUTHORS.md for complete list of ndn-tools authors and contributors.
7 *
8 * ndn-tools is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
11 *
12 * ndn-tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * ndn-tools, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include "tools/ping/client/statistics-collector.hpp"
Junxiao Shi2713a3b2015-06-22 16:19:05 -070021
22#include "tests/test-common.hpp"
Davide Pesavento013de9b2016-09-01 12:06:56 +000023#include <ndn-cxx/util/dummy-client-face.hpp>
Junxiao Shi2713a3b2015-06-22 16:19:05 -070024
25namespace ndn {
26namespace ping {
27namespace client {
28namespace tests {
29
30using namespace ndn::tests;
31
32class StatisticsCollectorFixture
33{
34protected:
35 StatisticsCollectorFixture()
Junxiao Shiaa1b3c92016-07-14 14:56:53 +000036 : pingOptions(makeOptions())
37 , pingProgram(face, pingOptions)
Junxiao Shi2713a3b2015-06-22 16:19:05 -070038 , sc(pingProgram, pingOptions)
39 {
40 }
41
42private:
43 static Options
44 makeOptions()
45 {
46 Options opt;
47 opt.prefix = "ndn:/ping-prefix";
48 opt.shouldAllowStaleData = false;
49 opt.shouldGenerateRandomSeq = false;
50 opt.shouldPrintTimestamp = false;
51 opt.nPings = 5;
52 opt.interval = time::milliseconds(100);
53 opt.timeout = time::milliseconds(2000);
54 opt.startSeq = 1;
55 return opt;
56 }
57
58protected:
Junxiao Shiaa1b3c92016-07-14 14:56:53 +000059 util::DummyClientFace face;
Junxiao Shi2713a3b2015-06-22 16:19:05 -070060 Options pingOptions;
61 Ping pingProgram;
62 StatisticsCollector sc;
63};
64
Davide Pesavento013de9b2016-09-01 12:06:56 +000065BOOST_AUTO_TEST_SUITE(Ping)
66BOOST_FIXTURE_TEST_SUITE(TestStatisticsCollector, StatisticsCollectorFixture)
Junxiao Shi2713a3b2015-06-22 16:19:05 -070067
68BOOST_AUTO_TEST_CASE(Resp50msResp50ms)
69{
Teng Liang62884862016-03-31 18:15:36 -070070 sc.recordData(time::milliseconds(50));
Junxiao Shi2713a3b2015-06-22 16:19:05 -070071
72 Statistics stats1 = sc.computeStatistics();
73 BOOST_CHECK_EQUAL(stats1.prefix, pingOptions.prefix);
74 BOOST_CHECK_EQUAL(stats1.nSent, 1);
75 BOOST_CHECK_EQUAL(stats1.nReceived, 1);
76 BOOST_CHECK_CLOSE(stats1.minRtt, 50.0, 0.001);
77 BOOST_CHECK_CLOSE(stats1.maxRtt, 50.0, 0.001);
78 BOOST_CHECK_CLOSE(stats1.packetLossRate, 0.0, 0.001);
79 BOOST_CHECK_CLOSE(stats1.sumRtt, 50.0, 0.001);
80 BOOST_CHECK_CLOSE(stats1.avgRtt, 50.0, 0.001);
81 BOOST_CHECK_CLOSE(stats1.stdDevRtt, 0.0, 0.001);
82
Teng Liang62884862016-03-31 18:15:36 -070083 sc.recordData(time::milliseconds(50));
Junxiao Shi2713a3b2015-06-22 16:19:05 -070084
85 Statistics stats2 = sc.computeStatistics();
86 BOOST_CHECK_EQUAL(stats2.prefix, pingOptions.prefix);
87 BOOST_CHECK_EQUAL(stats2.nSent, 2);
88 BOOST_CHECK_EQUAL(stats2.nReceived, 2);
89 BOOST_CHECK_CLOSE(stats2.minRtt, 50.0, 0.001);
90 BOOST_CHECK_CLOSE(stats2.maxRtt, 50.0, 0.001);
91 BOOST_CHECK_CLOSE(stats2.packetLossRate, 0.0, 0.001);
92 BOOST_CHECK_CLOSE(stats2.sumRtt, 100.0, 0.001);
93 BOOST_CHECK_CLOSE(stats2.avgRtt, 50.0, 0.001);
94 BOOST_CHECK_CLOSE(stats2.stdDevRtt, 0.0, 0.001);
95}
96
97BOOST_AUTO_TEST_CASE(Resp50msResp100ms)
98{
Teng Liang62884862016-03-31 18:15:36 -070099 sc.recordData(time::milliseconds(50));
100 sc.recordData(time::milliseconds(100));
Junxiao Shi2713a3b2015-06-22 16:19:05 -0700101
102 Statistics stats = sc.computeStatistics();
103 BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
104 BOOST_CHECK_EQUAL(stats.nSent, 2);
105 BOOST_CHECK_EQUAL(stats.nReceived, 2);
106 BOOST_CHECK_CLOSE(stats.minRtt, 50.0, 0.001);
107 BOOST_CHECK_CLOSE(stats.maxRtt, 100.0, 0.001);
108 BOOST_CHECK_CLOSE(stats.packetLossRate, 0.0, 0.001);
109 BOOST_CHECK_CLOSE(stats.sumRtt, 150.0, 0.001);
110 BOOST_CHECK_CLOSE(stats.avgRtt, 75.0, 0.001);
111 BOOST_CHECK_CLOSE(stats.stdDevRtt, 25.0, 0.001);
112}
113
114BOOST_AUTO_TEST_CASE(LossLoss)
115{
116 sc.recordTimeout();
117 sc.recordTimeout();
118
119 Statistics stats = sc.computeStatistics();
120 BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
121 BOOST_CHECK_EQUAL(stats.nSent, 2);
122 BOOST_CHECK_EQUAL(stats.nReceived, 0);
123 BOOST_CHECK_CLOSE(stats.packetLossRate, 1.0, 0.001);
124}
125
126BOOST_AUTO_TEST_CASE(Resp50msLoss)
127{
Teng Liang62884862016-03-31 18:15:36 -0700128 sc.recordData(time::milliseconds(50));
Junxiao Shi2713a3b2015-06-22 16:19:05 -0700129 sc.recordTimeout();
130
131 Statistics stats = sc.computeStatistics();
132 BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
133 BOOST_CHECK_EQUAL(stats.nSent, 2);
134 BOOST_CHECK_EQUAL(stats.nReceived, 1);
135 BOOST_CHECK_CLOSE(stats.minRtt, 50.0, 0.001);
136 BOOST_CHECK_CLOSE(stats.maxRtt, 50.0, 0.001);
137 BOOST_CHECK_CLOSE(stats.packetLossRate, 0.5, 0.001);
138 BOOST_CHECK_CLOSE(stats.sumRtt, 50.0, 0.001);
139 BOOST_CHECK_CLOSE(stats.avgRtt, 50.0, 0.001);
140 BOOST_CHECK_CLOSE(stats.stdDevRtt, 0.0, 0.001);
141}
142
Teng Liang62884862016-03-31 18:15:36 -0700143BOOST_AUTO_TEST_CASE(NackNack)
144{
145 sc.recordNack();
146 sc.recordNack();
147
148 Statistics stats = sc.computeStatistics();
149 BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
150 BOOST_CHECK_EQUAL(stats.nSent, 2);
151 BOOST_CHECK_EQUAL(stats.nNacked, 2);
152 BOOST_CHECK_EQUAL(stats.nReceived, 0);
153 BOOST_CHECK_CLOSE(stats.packetNackedRate, 1.0, 0.001);
154}
155
156BOOST_AUTO_TEST_CASE(Resp50msNack)
157{
158 sc.recordData(time::milliseconds(50));
159 sc.recordNack();
160
161 Statistics stats = sc.computeStatistics();
162 BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
163 BOOST_CHECK_EQUAL(stats.nSent, 2);
164 BOOST_CHECK_EQUAL(stats.nReceived, 1);
165 BOOST_CHECK_CLOSE(stats.minRtt, 50.0, 0.001);
166 BOOST_CHECK_CLOSE(stats.maxRtt, 50.0, 0.001);
167 BOOST_CHECK_CLOSE(stats.sumRtt, 50.0, 0.001);
168 BOOST_CHECK_CLOSE(stats.avgRtt, 50.0, 0.001);
169 BOOST_CHECK_CLOSE(stats.stdDevRtt, 0.0, 0.001);
170 BOOST_CHECK_EQUAL(stats.nNacked, 1);
171 BOOST_CHECK_CLOSE(stats.packetNackedRate, 0.5, 0.001);
172}
173
174BOOST_AUTO_TEST_CASE(NackLoss)
175{
176 sc.recordNack();
177 sc.recordTimeout();
178
179 Statistics stats = sc.computeStatistics();
180 BOOST_CHECK_EQUAL(stats.prefix, pingOptions.prefix);
181 BOOST_CHECK_EQUAL(stats.nSent, 2);
182 BOOST_CHECK_EQUAL(stats.nReceived, 0);
183 BOOST_CHECK_EQUAL(stats.nNacked, 1);
184 BOOST_CHECK_CLOSE(stats.packetNackedRate, 0.5, 0.001);
185 BOOST_CHECK_CLOSE(stats.packetLossRate, 0.5, 0.001);
186}
187
Davide Pesavento013de9b2016-09-01 12:06:56 +0000188BOOST_AUTO_TEST_SUITE_END() // TestStatisticsCollector
189BOOST_AUTO_TEST_SUITE_END() // Ping
Junxiao Shi2713a3b2015-06-22 16:19:05 -0700190
191} // namespace tests
192} // namespace client
193} // namespace ping
194} // namespace ndn