blob: a1cc1775c5575a774a64eae2e4e663dc985dc6f4 [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"
21#include <ndn-cxx/util/dummy-client-face.hpp>
22
23#include "tests/test-common.hpp"
24
25namespace ndn {
26namespace ping {
27namespace client {
28namespace tests {
29
30using namespace ndn::tests;
31
32class StatisticsCollectorFixture
33{
34protected:
35 StatisticsCollectorFixture()
36 : face(util::makeDummyClientFace())
37 , pingOptions(makeOptions())
38 , pingProgram(*face, pingOptions)
39 , sc(pingProgram, pingOptions)
40 {
41 }
42
43private:
44 static Options
45 makeOptions()
46 {
47 Options opt;
48 opt.prefix = "ndn:/ping-prefix";
49 opt.shouldAllowStaleData = false;
50 opt.shouldGenerateRandomSeq = false;
51 opt.shouldPrintTimestamp = false;
52 opt.nPings = 5;
53 opt.interval = time::milliseconds(100);
54 opt.timeout = time::milliseconds(2000);
55 opt.startSeq = 1;
56 return opt;
57 }
58
59protected:
60 shared_ptr<util::DummyClientFace> face;
61 Options pingOptions;
62 Ping pingProgram;
63 StatisticsCollector sc;
64};
65
66BOOST_FIXTURE_TEST_SUITE(PingClientStatisticsCollector, StatisticsCollectorFixture)
67
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
Junxiao Shi2713a3b2015-06-22 16:19:05 -0700188BOOST_AUTO_TEST_SUITE_END()
189
190} // namespace tests
191} // namespace client
192} // namespace ping
193} // namespace ndn