1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Tools: Update console and httpx.

This commit is contained in:
winlin 2022-08-30 17:37:54 +08:00
parent 2c259bd95b
commit d877c0b76f
9 changed files with 3623 additions and 3598 deletions

View file

@ -262,6 +262,12 @@ func run(ctx context.Context) error {
flag.Var(&skeys, "skey", "the SSL key for domain")
flag.Var(&scerts, "scert", "the SSL cert for domain")
var trimSlashLimit int
var noRedirectIndex, trimLastSlash bool
flag.BoolVar(&noRedirectIndex, "no-redirect-index", false, "Whether serve with index.html without redirect.")
flag.BoolVar(&trimLastSlash, "trim-last-slash", false, "Whether trim last slash by HTTP redirect(302).")
flag.IntVar(&trimSlashLimit, "trim-slash-limit", 0, "Only trim last slash when got enough directories.")
flag.Usage = func() {
fmt.Println(fmt.Sprintf("Usage: %v -t http -s https -d domains -r root -e cache -l lets -k ssk -c ssc -p proxy", os.Args[0]))
fmt.Println(fmt.Sprintf(" "))
@ -272,6 +278,8 @@ func run(ctx context.Context) error {
fmt.Println(fmt.Sprintf(" Listen at port for HTTPS server. Default: 0, disable HTTPS."))
fmt.Println(fmt.Sprintf(" -r, -root string"))
fmt.Println(fmt.Sprintf(" The www root path. Supports relative to argv[0]=%v. Default: ./html", path.Dir(os.Args[0])))
fmt.Println(fmt.Sprintf(" -no-redirect-index=bool"))
fmt.Println(fmt.Sprintf(" Whether serve with index.html without redirect. Default: false"))
fmt.Println(fmt.Sprintf(" -p, -proxy string"))
fmt.Println(fmt.Sprintf(" Proxy path to backend. For example: http://127.0.0.1:8888/api/webrtc"))
fmt.Println(fmt.Sprintf(" Proxy path to backend. For example: http://127.0.0.1:8888/api/webrtc?modifyRequestHost=false"))
@ -317,6 +325,12 @@ func run(ctx context.Context) error {
os.Exit(-1)
}
// If trim last slash, we should enable no redirect index, to avoid infinitely redirect.
if trimLastSlash {
noRedirectIndex = true
}
fmt.Println(fmt.Sprintf("Config trimLastSlash=%v, trimSlashLimit=%v, noRedirectIndex=%v", trimLastSlash, trimSlashLimit, noRedirectIndex))
var proxyUrls []*url.URL
proxies := make(map[string]*url.URL)
for _, oproxy := range []string(oproxies) {
@ -366,7 +380,34 @@ func run(ctx context.Context) error {
html = path.Join(path.Dir(os.Args[0]), html)
}
fs := http.FileServer(http.Dir(html))
serveFileNoRedirect := func (w http.ResponseWriter, r *http.Request, name string) {
upath := path.Join(html, path.Clean(r.URL.Path))
// Redirect without the last slash.
if trimLastSlash && r.URL.Path != "/" && strings.HasSuffix(r.URL.Path, "/") {
u := strings.TrimSuffix(r.URL.Path, "/")
if r.URL.RawQuery != "" {
u += "?" + r.URL.RawQuery
}
if strings.Count(u, "/") >= trimSlashLimit {
http.Redirect(w, r, u, http.StatusFound)
return
}
}
// Append the index.html path if access a directory.
if noRedirectIndex && !strings.Contains(path.Base(upath), ".") {
if d, err := os.Stat(upath); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
} else if d.IsDir() {
upath = path.Join(upath, "index.html")
}
}
http.ServeFile(w, r, upath)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
oh.SetHeader(w)
@ -388,7 +429,7 @@ func run(ctx context.Context) error {
return
}
fs.ServeHTTP(w, r)
serveFileNoRedirect(w, r, path.Join(html, path.Clean(r.URL.Path)))
return
}
@ -417,7 +458,7 @@ func run(ctx context.Context) error {
}
}
fs.ServeHTTP(w, r)
serveFileNoRedirect(w, r, path.Join(html, path.Clean(r.URL.Path)))
})
var protos []string

View file

@ -35,7 +35,7 @@ func VersionMinor() int {
}
func VersionRevision() int {
return 19
return 26
}
func Version() string {

5
trunk/configure vendored
View file

@ -387,9 +387,10 @@ fi
#
# utest, the unit-test cases of srs, base on gtest1.6
if [ $SRS_UTEST = YES ]; then
MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_protocol" "srs_utest_kernel" "srs_utest_core"
MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_kernel" "srs_utest_core"
"srs_utest_config" "srs_utest_rtmp" "srs_utest_http" "srs_utest_avc" "srs_utest_reload"
"srs_utest_mp4" "srs_utest_service" "srs_utest_app" "srs_utest_rtc" "srs_utest_protocol2")
"srs_utest_mp4" "srs_utest_service" "srs_utest_app" "srs_utest_rtc"
"srs_utest_protocol")
if [[ $SRS_SRT == YES ]]; then
MODULE_FILES+=("srs_utest_srt")
fi

View file

@ -578,6 +578,23 @@ scApp.filter('sc_filter_preview_url', ['$sc_server', function($sc_server){
};
}]);
scApp.filter('sc_filter_streamURL', function(){
return function(v){
if (!v || !v.url) return '';
const pos = v.url.lastIndexOf('/');
const stream = pos < 0 ? '' : v.url.substr(pos);
const pos2 = v.tcUrl.indexOf('?');
const tcUrl = pos2 < 0 ? v.tcUrl : v.tcUrl.substr(0, pos2);
let params = pos2 < 0 ? '' : v.tcUrl.substr(pos2);
if (params === '?vhost=__defaultVhost__' || params === '?domain=__defaultVhost__') params = '';
return `${tcUrl}${stream}${params}`;
};
});
// the sc nav is the nevigator
scApp.provider("$sc_nav", function(){
this.$get = function(){

View file

@ -16,7 +16,8 @@
<th>Stream</th>
<th>类型</th>
<th>时长</th>
<th>TcUrl</th>
<th>URL</th>
<th>分类</th>
<th>管理</th>
</tr>
<tr ng-repeat="client in clients">
@ -26,7 +27,8 @@
<td><a href="javascript:void(0)" ng-click="gogogo('/streams/' + client.stream)">{{client.stream}}</a></td>
<td>{{client.publish| sc_filter_ctype}}</td>
<td>{{client.alive| sc_filter_time}}</td>
<td>{{client.tcUrl}}</td>
<td>{{client |sc_filter_streamURL}}</td>
<td>{{client.type}}</td>
<td>
<a ng-click="kickoff(client)" href="javascript:void(0)">踢Ta</a>
</td>

View file

@ -16,7 +16,8 @@
<th>Stream</th>
<th>Type</th>
<th>Duration</th>
<th>TcUrl</th>
<th>URL</th>
<th>Category</th>
<th>Manage</th>
</tr>
<tr ng-repeat="client in clients">
@ -26,7 +27,8 @@
<td><a href="javascript:void(0)" ng-click="gogogo('/streams/' + client.stream)">{{client.stream}}</a></td>
<td>{{client.publish| sc_filter_ctype}}</td>
<td>{{client.alive| sc_filter_time}}</td>
<td>{{client.tcUrl}}</td>
<td>{{client |sc_filter_streamURL}}</td>
<td>{{client.type}}</td>
<td>
<a ng-click="kickoff(client)" href="javascript:void(0)">Kickoff It</a>
</td>

File diff suppressed because it is too large Load diff

View file

@ -1,707 +0,0 @@
//
// Copyright (c) 2013-2022 The SRS Authors
//
// SPDX-License-Identifier: MIT or MulanPSL-2.0
//
#include <srs_utest_protocol2.hpp>
using namespace std;
#include <srs_kernel_error.hpp>
#include <srs_core_autofree.hpp>
#include <srs_protocol_utility.hpp>
#include <srs_protocol_rtmp_msg_array.hpp>
#include <srs_protocol_rtmp_stack.hpp>
#include <srs_kernel_utility.hpp>
#include <srs_app_st.hpp>
#include <srs_protocol_amf0.hpp>
#include <srs_protocol_rtmp_stack.hpp>
#include <srs_protocol_http_conn.hpp>
#include <srs_protocol_protobuf.hpp>
#include <srs_kernel_buffer.hpp>
VOID TEST(ProtocolKbpsTest, Connections)
{
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);
SrsNetworkDelta* delta = new SrsNetworkDelta();
SrsAutoFree(SrsNetworkDelta, delta);
delta->set_io(io, io);
// No data, 0kbps.
kbps->add_delta(delta);
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 * SRS_UTIME_MILLISECONDS);
io->set_in(30 * 100 * 1000)->set_out(30 * 100 * 1000);
kbps->add_delta(delta);
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 * SRS_UTIME_MILLISECONDS);
io->set_in(330 * 100 * 1000)->set_out(330 * 100 * 1000);
kbps->add_delta(delta);
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);
SrsNetworkDelta* delta = new SrsNetworkDelta();
SrsAutoFree(SrsNetworkDelta, delta);
delta->set_io(io, io);
// No data, 0kbps.
kbps->add_delta(delta);
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 * SRS_UTIME_MILLISECONDS);
io->set_in(30 * 100 * 1000);
kbps->add_delta(delta);
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 * SRS_UTIME_MILLISECONDS);
io->set_in(330 * 100 * 1000);
kbps->add_delta(delta);
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);
SrsNetworkDelta* delta = new SrsNetworkDelta();
SrsAutoFree(SrsNetworkDelta, delta);
delta->set_io(io, io);
// No data, 0kbps.
kbps->add_delta(delta);
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 * SRS_UTIME_MILLISECONDS);
io->set_out(30 * 100 * 1000);
kbps->add_delta(delta);
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 * SRS_UTIME_MILLISECONDS);
io->set_out(330 * 100 * 1000);
kbps->add_delta(delta);
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());
}
}
VOID TEST(ProtocolKbpsTest, Delta)
{
if (true) {
MockWallClock* clock = new MockWallClock();
SrsAutoFree(MockWallClock, clock);
MockStatistic* io = new MockStatistic();
SrsAutoFree(MockStatistic, io);
SrsNetworkDelta* delta = new SrsNetworkDelta();
SrsAutoFree(SrsNetworkDelta, delta);
delta->set_io(io, io);
// No data.
int64_t in, out;
delta->remark(&in, &out);
EXPECT_EQ(0, in);
EXPECT_EQ(0, out);
// 800kb.
io->set_in(100 * 1000)->set_out(100 * 1000);
delta->remark(&in, &out);
EXPECT_EQ(100 * 1000, in);
EXPECT_EQ(100 * 1000, out);
// No data.
delta->remark(&in, &out);
EXPECT_EQ(0, in);
EXPECT_EQ(0, out);
}
if (true) {
MockWallClock* clock = new MockWallClock();
SrsAutoFree(MockWallClock, clock);
MockStatistic* io = new MockStatistic();
SrsAutoFree(MockStatistic, io);
SrsNetworkDelta* delta = new SrsNetworkDelta();
SrsAutoFree(SrsNetworkDelta, delta);
delta->set_io(io, io);
// No data.
int64_t in, out;
delta->remark(&in, &out);
EXPECT_EQ(0, in);
EXPECT_EQ(0, out);
// 800kb.
io->set_in(100 * 1000)->set_out(100 * 1000);
delta->remark(&in, &out);
EXPECT_EQ(100 * 1000, in);
EXPECT_EQ(100 * 1000, out);
// Kbps without io, gather delta.
SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
SrsAutoFree(SrsKbps, kbps);
// 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 * SRS_UTIME_MILLISECONDS);
kbps->add_delta(30 * in, 30 * out);
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());
}
}
VOID TEST(ProtocolKbpsTest, RAWStatistic)
{
if (true) {
MockWallClock* clock = new MockWallClock();
SrsAutoFree(MockWallClock, clock);
MockStatistic* io = new MockStatistic();
SrsAutoFree(MockStatistic, io);
SrsNetworkDelta* delta = new SrsNetworkDelta();
SrsAutoFree(SrsNetworkDelta, delta);
delta->set_io(io, io);
SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
SrsAutoFree(SrsKbps, kbps);
// No data, 0kbps.
kbps->add_delta(delta);
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 * SRS_UTIME_MILLISECONDS);
io->set_out(30 * 100 * 1000);
kbps->add_delta(delta);
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());
}
if (true) {
MockWallClock* clock = new MockWallClock();
SrsAutoFree(MockWallClock, clock);
SrsKbps* kbps = new SrsKbps(clock->set_clock(0));
SrsAutoFree(SrsKbps, kbps);
// No io, no data.
EXPECT_EQ(0, kbps->get_recv_bytes());
EXPECT_EQ(0, kbps->get_send_bytes());
// With io, zero data.
MockStatistic* io = new MockStatistic();
SrsAutoFree(MockStatistic, io);
SrsNetworkDelta* delta = new SrsNetworkDelta();
SrsAutoFree(SrsNetworkDelta, delta);
delta->set_io(io, io);
kbps->add_delta(delta);
kbps->sample();
EXPECT_EQ(0, kbps->get_recv_bytes());
EXPECT_EQ(0, kbps->get_send_bytes());
// With io with data.
io->set_in(100 * 1000)->set_out(100 * 1000);
kbps->add_delta(delta);
kbps->sample();
EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
// No io, cached data.
delta->set_io(NULL, NULL);
kbps->add_delta(delta);
kbps->sample();
EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
// Use the same IO, but as a fresh io.
delta->set_io(io, io);
kbps->add_delta(delta);
kbps->sample();
EXPECT_EQ(200 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(200 * 1000, kbps->get_send_bytes());
io->set_in(150 * 1000)->set_out(150 * 1000);
kbps->add_delta(delta);
kbps->sample();
EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
// No io, cached data.
delta->set_io(NULL, NULL);
kbps->add_delta(delta);
kbps->sample();
EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
}
}
VOID TEST(ProtocolKbpsTest, WriteLargeIOVs)
{
srs_error_t err;
if (true) {
iovec iovs[1];
iovs[0].iov_base = (char*)"Hello";
iovs[0].iov_len = 5;
MockBufferIO io;
ssize_t nn = 0;
HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, 1, &nn));
EXPECT_EQ(5, nn);
EXPECT_EQ(5, io.sbytes);
}
if (true) {
iovec iovs[1024];
int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
for (int i = 0; i < nn_iovs; i++) {
iovs[i].iov_base = (char*)"Hello";
iovs[i].iov_len = 5;
}
MockBufferIO io;
ssize_t nn = 0;
HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
EXPECT_EQ(5 * nn_iovs, nn);
EXPECT_EQ(5 * nn_iovs, io.sbytes);
}
if (true) {
iovec iovs[1025];
int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
for (int i = 0; i < nn_iovs; i++) {
iovs[i].iov_base = (char*)"Hello";
iovs[i].iov_len = 5;
}
MockBufferIO io;
ssize_t nn = 0;
HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
EXPECT_EQ(5 * nn_iovs, nn);
EXPECT_EQ(5 * nn_iovs, io.sbytes);
}
if (true) {
iovec iovs[4096];
int nn_iovs = (int)(sizeof(iovs)/sizeof(iovec));
for (int i = 0; i < nn_iovs; i++) {
iovs[i].iov_base = (char*)"Hello";
iovs[i].iov_len = 5;
}
MockBufferIO io;
ssize_t nn = 0;
HELPER_EXPECT_SUCCESS(srs_write_large_iovs(&io, iovs, nn_iovs, &nn));
EXPECT_EQ(5 * nn_iovs, nn);
EXPECT_EQ(5 * nn_iovs, io.sbytes);
}
}
VOID TEST(ProtocolKbpsTest, ConnectionsSugar)
{
if (true) {
MockWallClock* clock = new MockWallClock();
SrsAutoFree(MockWallClock, clock);
MockStatistic* io = new MockStatistic();
SrsAutoFree(MockStatistic, io);
SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
SrsAutoFree(SrsNetworkKbps, 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 * SRS_UTIME_MILLISECONDS);
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 * SRS_UTIME_MILLISECONDS);
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);
SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
SrsAutoFree(SrsNetworkKbps, 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 * SRS_UTIME_MILLISECONDS);
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 * SRS_UTIME_MILLISECONDS);
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);
SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
SrsAutoFree(SrsNetworkKbps, 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 * SRS_UTIME_MILLISECONDS);
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 * SRS_UTIME_MILLISECONDS);
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());
}
}
VOID TEST(ProtocolKbpsTest, DeltaSugar)
{
if (true) {
MockWallClock* clock = new MockWallClock();
SrsAutoFree(MockWallClock, clock);
MockStatistic* io = new MockStatistic();
SrsAutoFree(MockStatistic, io);
// Kbps without io, gather delta.
SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
SrsAutoFree(SrsNetworkKbps, 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 * SRS_UTIME_MILLISECONDS);
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());
}
}
VOID TEST(ProtocolKbpsTest, RAWStatisticSugar)
{
if (true) {
MockWallClock* clock = new MockWallClock();
SrsAutoFree(MockWallClock, clock);
MockStatistic* io = new MockStatistic();
SrsAutoFree(MockStatistic, io);
SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
SrsAutoFree(SrsNetworkKbps, 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 * SRS_UTIME_MILLISECONDS);
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());
}
if (true) {
MockWallClock* clock = new MockWallClock();
SrsAutoFree(MockWallClock, clock);
SrsNetworkKbps* kbps = new SrsNetworkKbps(clock->set_clock(0));
SrsAutoFree(SrsNetworkKbps, kbps);
// No io, no data.
EXPECT_EQ(0, kbps->get_recv_bytes());
EXPECT_EQ(0, kbps->get_send_bytes());
// With io, zero data.
MockStatistic* io = new MockStatistic();
SrsAutoFree(MockStatistic, io);
kbps->set_io(io, io);
kbps->sample();
EXPECT_EQ(0, kbps->get_recv_bytes());
EXPECT_EQ(0, kbps->get_send_bytes());
// With io with data.
io->set_in(100 * 1000)->set_out(100 * 1000);
kbps->sample();
EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
// No io, cached data.
kbps->set_io(NULL, NULL);
kbps->sample();
EXPECT_EQ(100 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(100 * 1000, kbps->get_send_bytes());
// Use the same IO, but as a fresh io.
kbps->set_io(io, io);
kbps->sample();
EXPECT_EQ(200 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(200 * 1000, kbps->get_send_bytes());
io->set_in(150 * 1000)->set_out(150 * 1000);
kbps->sample();
EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
// No io, cached data.
kbps->set_io(NULL, NULL);
kbps->sample();
EXPECT_EQ(250 * 1000, kbps->get_recv_bytes());
EXPECT_EQ(250 * 1000, kbps->get_send_bytes());
}
}

View file

@ -1,16 +0,0 @@
//
// Copyright (c) 2013-2022 The SRS Authors
//
// SPDX-License-Identifier: MIT or MulanPSL-2.0
//
#ifndef SRS_UTEST_PROTOCOL2_HPP
#define SRS_UTEST_PROTOCOL2_HPP
/*
#include <srs_utest_protocol2.hpp>
*/
#include <srs_utest_protocol.hpp>
#endif