From aef838338cd3777399dcc7cbc69d56b936d6d275 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 23 Dec 2018 21:19:17 +0800 Subject: [PATCH] Add utest for kbps connections --- trunk/src/protocol/srs_protocol_kbps.cpp | 66 ++++++------ trunk/src/protocol/srs_protocol_kbps.hpp | 3 + trunk/src/utest/srs_utest_protocol.cpp | 123 +++++++++++++++++++++++ 3 files changed, 159 insertions(+), 33 deletions(-) diff --git a/trunk/src/protocol/srs_protocol_kbps.cpp b/trunk/src/protocol/srs_protocol_kbps.cpp index 7f4520983..781e8fddd 100644 --- a/trunk/src/protocol/srs_protocol_kbps.cpp +++ b/trunk/src/protocol/srs_protocol_kbps.cpp @@ -27,10 +27,22 @@ SrsKbpsSample::SrsKbpsSample() { - bytes = time = 0; + bytes = time = -1; kbps = 0; } +SrsKbpsSample::~SrsKbpsSample() +{ +} + +SrsKbpsSample* SrsKbpsSample::update(int64_t b, int64_t t, int k) +{ + bytes = b; + time = t; + kbps = k; + return this; +} + SrsKbpsSlice::SrsKbpsSlice(SrsWallClock* c) { clk = c; @@ -53,46 +65,34 @@ void SrsKbpsSlice::sample() int64_t now = clk->time_ms(); int64_t total_bytes = get_total_bytes(); - if (sample_30s.time <= 0) { - sample_30s.kbps = 0; - sample_30s.time = now; - sample_30s.bytes = total_bytes; + if (sample_30s.time < 0) { + sample_30s.update(total_bytes, now, 0); } - if (sample_1m.time <= 0) { - sample_1m.kbps = 0; - sample_1m.time = now; - sample_1m.bytes = total_bytes; + if (sample_1m.time < 0) { + sample_1m.update(total_bytes, now, 0); } - if (sample_5m.time <= 0) { - sample_5m.kbps = 0; - sample_5m.time = now; - sample_5m.bytes = total_bytes; + if (sample_5m.time < 0) { + sample_5m.update(total_bytes, now, 0); } - if (sample_60m.time <= 0) { - sample_60m.kbps = 0; - sample_60m.time = now; - sample_60m.bytes = total_bytes; + if (sample_60m.time < 0) { + sample_60m.update(total_bytes, now, 0); } - if (now - sample_30s.time > 30 * 1000) { - sample_30s.kbps = (int)((total_bytes - sample_30s.bytes) * 8 / (now - sample_30s.time)); - sample_30s.time = now; - sample_30s.bytes = total_bytes; + if (now - sample_30s.time >= 30 * 1000) { + int kbps = (int)((total_bytes - sample_30s.bytes) * 8 / (now - sample_30s.time)); + sample_30s.update(total_bytes, now, kbps); } - if (now - sample_1m.time > 60 * 1000) { - sample_1m.kbps = (int)((total_bytes - sample_1m.bytes) * 8 / (now - sample_1m.time)); - sample_1m.time = now; - sample_1m.bytes = total_bytes; + if (now - sample_1m.time >= 60 * 1000) { + int kbps = (int)((total_bytes - sample_1m.bytes) * 8 / (now - sample_1m.time)); + sample_1m.update(total_bytes, now, kbps); } - if (now - sample_5m.time > 300 * 1000) { - sample_5m.kbps = (int)((total_bytes - sample_5m.bytes) * 8 / (now - sample_5m.time)); - sample_5m.time = now; - sample_5m.bytes = total_bytes; + if (now - sample_5m.time >= 300 * 1000) { + int kbps = (int)((total_bytes - sample_5m.bytes) * 8 / (now - sample_5m.time)); + sample_5m.update(total_bytes, now, kbps); } - if (now - sample_60m.time > 3600 * 1000) { - sample_60m.kbps = (int)((total_bytes - sample_60m.bytes) * 8 / (now - sample_60m.time)); - sample_60m.time = now; - sample_60m.bytes = total_bytes; + if (now - sample_60m.time >= 3600 * 1000) { + int kbps = (int)((total_bytes - sample_60m.bytes) * 8 / (now - sample_60m.time)); + sample_60m.update(total_bytes, now, kbps); } } diff --git a/trunk/src/protocol/srs_protocol_kbps.hpp b/trunk/src/protocol/srs_protocol_kbps.hpp index 163906862..ae2ba9a4e 100644 --- a/trunk/src/protocol/srs_protocol_kbps.hpp +++ b/trunk/src/protocol/srs_protocol_kbps.hpp @@ -42,6 +42,9 @@ public: int kbps; public: SrsKbpsSample(); + virtual ~SrsKbpsSample(); +public: + virtual SrsKbpsSample* update(int64_t b, int64_t t, int k); }; /** diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp index 0dd42b022..2eff05d5a 100644 --- a/trunk/src/utest/srs_utest_protocol.cpp +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -5697,6 +5697,7 @@ VOID TEST(ProtocolKbpsTest, Connections) SrsAutoFree(SrsKbps, kbps); kbps->set_io(io, io); + // No data, 0kbps. kbps->sample(); EXPECT_EQ(0, kbps->get_recv_kbps()); @@ -5706,6 +5707,128 @@ VOID TEST(ProtocolKbpsTest, Connections) EXPECT_EQ(0, kbps->get_send_kbps()); EXPECT_EQ(0, kbps->get_send_kbps_30s()); EXPECT_EQ(0, kbps->get_send_kbps_5m()); + + // 800kbps in 30s. + clock->set_clock(30 * 1000); + io->set_in(30 * 100 * 1000)->set_out(30 * 100 * 1000); + kbps->sample(); + + EXPECT_EQ(800, kbps->get_recv_kbps()); + EXPECT_EQ(800, kbps->get_recv_kbps_30s()); + EXPECT_EQ(0, kbps->get_recv_kbps_5m()); + + EXPECT_EQ(800, kbps->get_send_kbps()); + EXPECT_EQ(800, kbps->get_send_kbps_30s()); + EXPECT_EQ(0, kbps->get_send_kbps_5m()); + + // 800kbps in 300s. + clock->set_clock(330 * 1000); + io->set_in(330 * 100 * 1000)->set_out(330 * 100 * 1000); + kbps->sample(); + + EXPECT_EQ(800, kbps->get_recv_kbps()); + EXPECT_EQ(800, kbps->get_recv_kbps_30s()); + EXPECT_EQ(800, kbps->get_recv_kbps_5m()); + + EXPECT_EQ(800, kbps->get_send_kbps()); + EXPECT_EQ(800, kbps->get_send_kbps_30s()); + EXPECT_EQ(800, kbps->get_send_kbps_5m()); + } + + if (true) { + MockWallClock* clock = new MockWallClock(); + SrsAutoFree(MockWallClock, clock); + MockStatistic* io = new MockStatistic(); + SrsAutoFree(MockStatistic, io); + + SrsKbps* kbps = new SrsKbps(clock->set_clock(0)); + SrsAutoFree(SrsKbps, kbps); + kbps->set_io(io, io); + + // No data, 0kbps. + kbps->sample(); + + EXPECT_EQ(0, kbps->get_recv_kbps()); + EXPECT_EQ(0, kbps->get_recv_kbps_30s()); + EXPECT_EQ(0, kbps->get_recv_kbps_5m()); + + EXPECT_EQ(0, kbps->get_send_kbps()); + EXPECT_EQ(0, kbps->get_send_kbps_30s()); + EXPECT_EQ(0, kbps->get_send_kbps_5m()); + + // 800kbps in 30s. + clock->set_clock(30 * 1000); + io->set_in(30 * 100 * 1000); + kbps->sample(); + + EXPECT_EQ(800, kbps->get_recv_kbps()); + EXPECT_EQ(800, kbps->get_recv_kbps_30s()); + EXPECT_EQ(0, kbps->get_recv_kbps_5m()); + + EXPECT_EQ(0, kbps->get_send_kbps()); + EXPECT_EQ(0, kbps->get_send_kbps_30s()); + EXPECT_EQ(0, kbps->get_send_kbps_5m()); + + // 800kbps in 300s. + clock->set_clock(330 * 1000); + io->set_in(330 * 100 * 1000); + kbps->sample(); + + EXPECT_EQ(800, kbps->get_recv_kbps()); + EXPECT_EQ(800, kbps->get_recv_kbps_30s()); + EXPECT_EQ(800, kbps->get_recv_kbps_5m()); + + EXPECT_EQ(0, kbps->get_send_kbps()); + EXPECT_EQ(0, kbps->get_send_kbps_30s()); + EXPECT_EQ(0, kbps->get_send_kbps_5m()); + } + + if (true) { + MockWallClock* clock = new MockWallClock(); + SrsAutoFree(MockWallClock, clock); + MockStatistic* io = new MockStatistic(); + SrsAutoFree(MockStatistic, io); + + SrsKbps* kbps = new SrsKbps(clock->set_clock(0)); + SrsAutoFree(SrsKbps, kbps); + kbps->set_io(io, io); + + // No data, 0kbps. + kbps->sample(); + + EXPECT_EQ(0, kbps->get_recv_kbps()); + EXPECT_EQ(0, kbps->get_recv_kbps_30s()); + EXPECT_EQ(0, kbps->get_recv_kbps_5m()); + + EXPECT_EQ(0, kbps->get_send_kbps()); + EXPECT_EQ(0, kbps->get_send_kbps_30s()); + EXPECT_EQ(0, kbps->get_send_kbps_5m()); + + // 800kbps in 30s. + clock->set_clock(30 * 1000); + io->set_out(30 * 100 * 1000); + kbps->sample(); + + EXPECT_EQ(0, kbps->get_recv_kbps()); + EXPECT_EQ(0, kbps->get_recv_kbps_30s()); + EXPECT_EQ(0, kbps->get_recv_kbps_5m()); + + EXPECT_EQ(800, kbps->get_send_kbps()); + EXPECT_EQ(800, kbps->get_send_kbps_30s()); + EXPECT_EQ(0, kbps->get_send_kbps_5m()); + + // 800kbps in 300s. + clock->set_clock(330 * 1000); + io->set_out(330 * 100 * 1000); + kbps->sample(); + + EXPECT_EQ(0, kbps->get_recv_kbps()); + EXPECT_EQ(0, kbps->get_recv_kbps_30s()); + EXPECT_EQ(0, kbps->get_recv_kbps_5m()); + + EXPECT_EQ(800, kbps->get_send_kbps()); + EXPECT_EQ(800, kbps->get_send_kbps_30s()); + EXPECT_EQ(800, kbps->get_send_kbps_5m()); } }