blob: 5dcf941b8bb633e6da0d348e76310ab999e1ca6f [file] [log] [blame]
Junxiao Shi2713a3b2015-06-22 16:19:05 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014-2015, Arizona Board of Regents.
4 *
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{
70 sc.recordResponse(time::milliseconds(50));
71
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
83 sc.recordResponse(time::milliseconds(50));
84
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{
99 sc.recordResponse(time::milliseconds(50));
100 sc.recordResponse(time::milliseconds(100));
101
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{
128 sc.recordResponse(time::milliseconds(50));
129 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
143BOOST_AUTO_TEST_SUITE_END()
144
145} // namespace tests
146} // namespace client
147} // namespace ping
148} // namespace ndn