From cfcb3ce7b2cb463fe8dc6b0f1a17a4616ee94cd7 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 12 Dec 2019 15:46:46 +0800 Subject: [PATCH] For #1042, cover RTMP other codes --- trunk/src/protocol/srs_rtmp_stack.cpp | 3 + trunk/src/utest/srs_utest_protostack.cpp | 213 +++++++++++++++++++++++ 2 files changed, 216 insertions(+) diff --git a/trunk/src/protocol/srs_rtmp_stack.cpp b/trunk/src/protocol/srs_rtmp_stack.cpp index 03d88c9a6..bbb6408f2 100644 --- a/trunk/src/protocol/srs_rtmp_stack.cpp +++ b/trunk/src/protocol/srs_rtmp_stack.cpp @@ -774,6 +774,9 @@ srs_error_t SrsProtocol::do_decode_message(SrsMessageHeader& header, SrsBuffer* } else if (header.is_window_ackledgement_size()) { *ppacket = packet = new SrsSetWindowAckSizePacket(); return packet->decode(stream); + } else if (header.is_ackledgement()) { + *ppacket = packet = new SrsAcknowledgementPacket(); + return packet->decode(stream); } else if (header.is_set_chunk_size()) { *ppacket = packet = new SrsSetChunkSizePacket(); return packet->decode(stream); diff --git a/trunk/src/utest/srs_utest_protostack.cpp b/trunk/src/utest/srs_utest_protostack.cpp index 804345f9b..4900c755b 100644 --- a/trunk/src/utest/srs_utest_protostack.cpp +++ b/trunk/src/utest/srs_utest_protostack.cpp @@ -2452,6 +2452,37 @@ VOID TEST(ProtoStackTest, CoverAll) EXPECT_TRUE(r.get_send_bytes() > 0); } + if (true) { + MockBufferIO io; + SrsRtmpClient r(&io); + HELPER_EXPECT_SUCCESS(r.play("livestream", 1, 1024)); + EXPECT_TRUE(io.out_length() > 0); + } + + if (true) { + MockBufferIO io; + SrsRtmpClient r(&io); + HELPER_EXPECT_SUCCESS(r.publish("livestream", 1, 1024)); + EXPECT_TRUE(io.out_length() > 0); + } + + if (true) { + MockBufferIO io; + SrsRtmpClient r(&io); + + SrsAcknowledgementPacket* ack = new SrsAcknowledgementPacket(); + ack->sequence_number = 1024; + HELPER_ASSERT_SUCCESS(r.send_and_free_packet(ack, 0)); + + io.in_buffer.append(&io.out_buffer); + SrsCommonMessage* msg = NULL; + HELPER_ASSERT_SUCCESS(r.recv_message(&msg)); + srs_freep(msg); + } +} + +VOID TEST(ProtoStackTest, CoverBandwidth) +{ if (true) { SrsBandwidthPacket p; @@ -2520,6 +2551,11 @@ VOID TEST(ProtoStackTest, CoverAll) EXPECT_TRUE(p->is_final()); srs_freep(p); } +} + +VOID TEST(ProtoStackTest, CoverAllUnmarshal) +{ + srs_error_t err; if (true) { SrsAmf0Any* name = SrsAmf0Any::str("call"); @@ -2534,6 +2570,7 @@ VOID TEST(ProtoStackTest, CoverAll) SrsBuffer buf(b, nn); HELPER_ASSERT_SUCCESS(name->write(&buf)); HELPER_ASSERT_SUCCESS(arr->write(&buf)); + srs_freep(name); srs_freep(arr); SrsOnMetaDataPacket* p = new SrsOnMetaDataPacket(); SrsAutoFree(SrsOnMetaDataPacket, p); @@ -2545,6 +2582,182 @@ VOID TEST(ProtoStackTest, CoverAll) ASSERT_TRUE(prop && prop->is_string()); EXPECT_STREQ("MIT", prop->to_str().c_str()); } + + if (true) { + MockBufferIO io; + SrsRtmpServer r(&io); + + if (true) { + SrsConnectAppPacket* pkt = new SrsConnectAppPacket(); + pkt->command_object->set("tcUrl", SrsAmf0Any::str("rtmp://127.0.0.1/live")); + pkt->command_object->set("pageUrl", SrsAmf0Any::str("http://ossrs.net")); + pkt->command_object->set("swfUrl", SrsAmf0Any::str("http://ossrs.net/index.swf")); + pkt->command_object->set("objectEncoding", SrsAmf0Any::number(5.0)); + + pkt->args = SrsAmf0Any::object(); + pkt->args->set("license", SrsAmf0Any::str("MIT")); + + HELPER_EXPECT_SUCCESS(r.send_and_free_packet(pkt, 0)); + io.in_buffer.append(&io.out_buffer); + } + + SrsRequest req; + HELPER_EXPECT_SUCCESS(r.connect_app(&req)); + + EXPECT_STREQ("rtmp", req.schema.c_str()); + EXPECT_STREQ("127.0.0.1", req.host.c_str()); + EXPECT_STREQ("127.0.0.1", req.vhost.c_str()); + EXPECT_STREQ("live", req.app.c_str()); + EXPECT_STREQ("http://ossrs.net", req.pageUrl.c_str()); + EXPECT_STREQ("http://ossrs.net/index.swf", req.swfUrl.c_str()); + EXPECT_EQ(5.0, req.objectEncoding); + + ASSERT_TRUE(req.args && req.args->is_object()); + SrsAmf0Any* prop = req.args->get_property("license"); + ASSERT_TRUE(prop && prop->is_string()); + EXPECT_STREQ("MIT", prop->to_str().c_str()); + } + + if (true) { + MockBufferIO io; + SrsRtmpServer r(&io); + + if (true) { + SrsConnectAppPacket* pkt = new SrsConnectAppPacket(); + pkt->command_object->set("tcUrl", SrsAmf0Any::number(3.0)); + HELPER_EXPECT_SUCCESS(r.send_and_free_packet(pkt, 0)); + io.in_buffer.append(&io.out_buffer); + } + + SrsRequest req; + HELPER_EXPECT_FAILED(r.connect_app(&req)); + } + + if (true) { + SrsAmf0Any* name = SrsAmf0Any::str("pause"); + SrsAmf0Any* tid = SrsAmf0Any::number(3.0); + SrsAmf0Any* null = SrsAmf0Any::null(); + SrsAmf0Any* is_pause = SrsAmf0Any::boolean(true); + SrsAmf0Any* ts = SrsAmf0Any::number(30.0); + + int nn = name->total_size() + tid->total_size() + null->total_size() + is_pause->total_size() + ts->total_size(); + char* b = new char[nn]; + SrsAutoFreeA(char, b); + + SrsBuffer buf(b, nn); + HELPER_ASSERT_SUCCESS(name->write(&buf)); + HELPER_ASSERT_SUCCESS(tid->write(&buf)); + HELPER_ASSERT_SUCCESS(null->write(&buf)); + HELPER_ASSERT_SUCCESS(is_pause->write(&buf)); + HELPER_ASSERT_SUCCESS(ts->write(&buf)); + srs_freep(name); srs_freep(tid); srs_freep(null); srs_freep(is_pause); srs_freep(ts); + + SrsPausePacket* p = new SrsPausePacket(); + SrsAutoFree(SrsPausePacket, p); + + buf.skip(-1 * buf.pos()); + HELPER_ASSERT_SUCCESS(p->decode(&buf)); + EXPECT_TRUE(p->is_pause); + EXPECT_EQ(30.0, p->time_ms); + } + + if (true) { + SrsAmf0Any* name = SrsAmf0Any::str("play"); + SrsAmf0Any* tid = SrsAmf0Any::number(3.0); + SrsAmf0Any* null = SrsAmf0Any::null(); + SrsAmf0Any* stream_name = SrsAmf0Any::str("livestream"); + SrsAmf0Any* start = SrsAmf0Any::number(20.0); + SrsAmf0Any* duration = SrsAmf0Any::number(30.0); + SrsAmf0Any* reset = SrsAmf0Any::number(1.0); + + int nn = name->total_size() + tid->total_size() + null->total_size() + stream_name->total_size() + start->total_size() + duration->total_size() + reset->total_size(); + char* b = new char[nn]; + SrsAutoFreeA(char, b); + + SrsBuffer buf(b, nn); + HELPER_ASSERT_SUCCESS(name->write(&buf)); + HELPER_ASSERT_SUCCESS(tid->write(&buf)); + HELPER_ASSERT_SUCCESS(null->write(&buf)); + HELPER_ASSERT_SUCCESS(stream_name->write(&buf)); + HELPER_ASSERT_SUCCESS(start->write(&buf)); + HELPER_ASSERT_SUCCESS(duration->write(&buf)); + HELPER_ASSERT_SUCCESS(reset->write(&buf)); + srs_freep(name); srs_freep(tid); srs_freep(null); srs_freep(stream_name); srs_freep(start); srs_freep(duration); srs_freep(reset); + + SrsPlayPacket* p = new SrsPlayPacket(); + SrsAutoFree(SrsPlayPacket, p); + + buf.skip(-1 * buf.pos()); + HELPER_ASSERT_SUCCESS(p->decode(&buf)); + EXPECT_STREQ("livestream", p->stream_name.c_str()); + EXPECT_EQ(20.0, p->start); + EXPECT_EQ(30.0, p->duration); + EXPECT_TRUE(p->reset); + } + + if (true) { + SrsAmf0Any* name = SrsAmf0Any::str("play"); + SrsAmf0Any* tid = SrsAmf0Any::number(3.0); + SrsAmf0Any* null = SrsAmf0Any::null(); + SrsAmf0Any* stream_name = SrsAmf0Any::str("livestream"); + SrsAmf0Any* start = SrsAmf0Any::number(20.0); + SrsAmf0Any* duration = SrsAmf0Any::number(30.0); + SrsAmf0Any* reset = SrsAmf0Any::boolean(true); + + int nn = name->total_size() + tid->total_size() + null->total_size() + stream_name->total_size() + start->total_size() + duration->total_size() + reset->total_size(); + char* b = new char[nn]; + SrsAutoFreeA(char, b); + + SrsBuffer buf(b, nn); + HELPER_ASSERT_SUCCESS(name->write(&buf)); + HELPER_ASSERT_SUCCESS(tid->write(&buf)); + HELPER_ASSERT_SUCCESS(null->write(&buf)); + HELPER_ASSERT_SUCCESS(stream_name->write(&buf)); + HELPER_ASSERT_SUCCESS(start->write(&buf)); + HELPER_ASSERT_SUCCESS(duration->write(&buf)); + HELPER_ASSERT_SUCCESS(reset->write(&buf)); + srs_freep(name); srs_freep(tid); srs_freep(null); srs_freep(stream_name); srs_freep(start); srs_freep(duration); srs_freep(reset); + + SrsPlayPacket* p = new SrsPlayPacket(); + SrsAutoFree(SrsPlayPacket, p); + + buf.skip(-1 * buf.pos()); + HELPER_ASSERT_SUCCESS(p->decode(&buf)); + EXPECT_STREQ("livestream", p->stream_name.c_str()); + EXPECT_EQ(20.0, p->start); + EXPECT_EQ(30.0, p->duration); + EXPECT_TRUE(p->reset); + } + + if (true) { + SrsAmf0Any* name = SrsAmf0Any::str("play"); + SrsAmf0Any* tid = SrsAmf0Any::number(3.0); + SrsAmf0Any* null = SrsAmf0Any::null(); + SrsAmf0Any* stream_name = SrsAmf0Any::str("livestream"); + SrsAmf0Any* start = SrsAmf0Any::number(20.0); + SrsAmf0Any* duration = SrsAmf0Any::number(30.0); + SrsAmf0Any* reset = SrsAmf0Any::str("true"); + + int nn = name->total_size() + tid->total_size() + null->total_size() + stream_name->total_size() + start->total_size() + duration->total_size() + reset->total_size(); + char* b = new char[nn]; + SrsAutoFreeA(char, b); + + SrsBuffer buf(b, nn); + HELPER_ASSERT_SUCCESS(name->write(&buf)); + HELPER_ASSERT_SUCCESS(tid->write(&buf)); + HELPER_ASSERT_SUCCESS(null->write(&buf)); + HELPER_ASSERT_SUCCESS(stream_name->write(&buf)); + HELPER_ASSERT_SUCCESS(start->write(&buf)); + HELPER_ASSERT_SUCCESS(duration->write(&buf)); + HELPER_ASSERT_SUCCESS(reset->write(&buf)); + srs_freep(name); srs_freep(tid); srs_freep(null); srs_freep(stream_name); srs_freep(start); srs_freep(duration); srs_freep(reset); + + SrsPlayPacket* p = new SrsPlayPacket(); + SrsAutoFree(SrsPlayPacket, p); + + buf.skip(-1 * buf.pos()); + HELPER_EXPECT_FAILED(p->decode(&buf)); + } } VOID TEST(ProtoStackTest, ComplexToSimpleHandshake)