From 20e2cd1199e2cfbd377847b5c65707bf40060c32 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 10 Oct 2019 08:06:09 +0800 Subject: [PATCH 01/14] Update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f31b30b44..3c137afa0 100755 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ Please select according to languages: - [ ] Support UDP protocol such as QUIC or KCP in cluster. - [ ] Support H.264+Opus codec for WebRTC. - [ ] Support publishing stream by WebRTC. +- [ ] Support playing stream by WebRTC. > Remark: About the milestone and product plan, please read ([CN][v1_CN_Product], [EN][v1_EN_Product]) wiki. From f24d82fada61107e43b4144d6bb6fe31e397a13b Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 10 Oct 2019 08:49:57 +0800 Subject: [PATCH 02/14] Cover AMF0 codec. 3.0.61 --- README.md | 1 + trunk/src/protocol/srs_protocol_amf0.cpp | 2 + trunk/src/utest/srs_utest.cpp | 287 +++++++++++++++++++++++ 3 files changed, 290 insertions(+) diff --git a/README.md b/README.md index 3c137afa0..aa31e382c 100755 --- a/README.md +++ b/README.md @@ -152,6 +152,7 @@ Please select according to languages: ### V3 changes +* v3.0, 2019-10-10, Cover AMF0 codec. 3.0.61 * v3.0, 2019-10-07, [3.0 alpha1(3.0.60)][r3.0a1] released. 107962 lines. * v3.0, 2019-10-06, Support log rotate by init.d command. 3.0.60 * v3.0, 2019-10-06, We prefer ipv4, only use ipv6 if ipv4 is disabled. 3.0.59 diff --git a/trunk/src/protocol/srs_protocol_amf0.cpp b/trunk/src/protocol/srs_protocol_amf0.cpp index 2a65a8274..556c068ad 100644 --- a/trunk/src/protocol/srs_protocol_amf0.cpp +++ b/trunk/src/protocol/srs_protocol_amf0.cpp @@ -216,6 +216,8 @@ void srs_amf0_do_print(SrsAmf0Any* any, stringstream& ss, int level) << "/" << std::hex << any->to_date_time_zone() << endl; } else if (any->is_null()) { ss << "Null" << endl; + } else if (any->is_undefined()) { + ss << "Undefined" << endl; } else if (any->is_ecma_array()) { SrsAmf0EcmaArray* obj = any->to_ecma_array(); ss << "EcmaArray " << "(" << obj->count() << " items)" << endl; diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index 03ec996bc..ad92a4c9d 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -28,6 +28,12 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include +#include +#include + +#include +using namespace std; // Temporary disk config. std::string _srs_tmp_file_prefix = "/tmp/srs-utest-"; @@ -130,3 +136,284 @@ VOID TEST(SampleTest, FastSampleMacrosTest) EXPECT_NEAR(10, 15, 5); } +VOID TEST(ProtocolAMF0Test, Interfaces) +{ + if (true) { + SrsAmf0Any* p = SrsAmf0Any::str("hello"); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_TRUE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + EXPECT_TRUE(string("hello") == p->to_str()); + EXPECT_STREQ("hello", p->to_str_raw()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("String hello\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_string()); + EXPECT_TRUE(string("hello") == j->to_str()); + srs_freep(j); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::boolean(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_TRUE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + EXPECT_FALSE(p->to_boolean()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Boolean false\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_boolean()); + EXPECT_FALSE(j->to_boolean()); + srs_freep(j); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::number(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(!p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + EXPECT_TRUE(0.0 == p->to_number()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Number 0.0\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_integer()); + EXPECT_TRUE(0.0 == j->to_integer()); + srs_freep(j); + + p->set_number(100.1); + EXPECT_TRUE(100.1 == p->to_number()); + + j = p->to_json(); + EXPECT_TRUE(j->is_number()); + EXPECT_TRUE(100.1 == j->to_number()); + srs_freep(j); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::date(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(!p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + EXPECT_TRUE(0 == p->to_date()); + EXPECT_TRUE(0 == p->to_date_time_zone()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Date 0/0\n", d); + delete[] d; + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::null(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(!p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Null\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_null()); + srs_freep(j); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::undefined(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(!p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Undefined\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_null()); + srs_freep(j); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(!p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(!p->is_complex_object()); + EXPECT_TRUE(NULL != p->to_object()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Object (0 items)\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_object()); + srs_freep(j); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object_eof(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(!p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(!p->is_complex_object()); + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_null()); + srs_freep(j); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::ecma_array(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(!p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(!p->is_complex_object()); + EXPECT_TRUE(NULL != p->to_ecma_array()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("EcmaArray (0 items)\n", d); + delete[] d; + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::strict_array(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(!p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(!p->is_complex_object()); + EXPECT_TRUE(NULL != p->to_strict_array()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("StrictArray (0 items)\n", d); + delete[] d; + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Any, p); + EXPECT_FALSE(!p->is_complex_object()); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object_eof(); + SrsAutoFree(SrsAmf0Any, p); + EXPECT_FALSE(!p->is_complex_object()); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::ecma_array(); + SrsAutoFree(SrsAmf0Any, p); + EXPECT_FALSE(!p->is_complex_object()); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::strict_array(); + SrsAutoFree(SrsAmf0Any, p); + EXPECT_FALSE(!p->is_complex_object()); + } +} + From b2e4a5f834ba899c18532bd4702048bab5877a4a Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 11 Oct 2019 09:28:53 +0800 Subject: [PATCH 03/14] Cover AMF0 codec. 3.0.61 --- trunk/src/utest/srs_utest.cpp | 228 +++++++++++++++++++++++++++++++++- 1 file changed, 226 insertions(+), 2 deletions(-) diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index ad92a4c9d..b9d9755a7 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -31,6 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include #include using namespace std; @@ -136,8 +137,10 @@ VOID TEST(SampleTest, FastSampleMacrosTest) EXPECT_NEAR(10, 15, 5); } -VOID TEST(ProtocolAMF0Test, Interfaces) +VOID TEST(ProtocolAMF0Test, InterfacesString) { + srs_error_t err; + if (true) { SrsAmf0Any* p = SrsAmf0Any::str("hello"); SrsAutoFree(SrsAmf0Any, p); @@ -164,7 +167,27 @@ VOID TEST(ProtocolAMF0Test, Interfaces) EXPECT_TRUE(j->is_string()); EXPECT_TRUE(string("hello") == j->to_str()); srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(string("hello") == pp->to_str()); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesBoolean) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::boolean(); @@ -191,7 +214,27 @@ VOID TEST(ProtocolAMF0Test, Interfaces) EXPECT_TRUE(j->is_boolean()); EXPECT_FALSE(j->to_boolean()); srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_FALSE(p->to_boolean()); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesNumber) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::number(); @@ -226,7 +269,27 @@ VOID TEST(ProtocolAMF0Test, Interfaces) EXPECT_TRUE(j->is_number()); EXPECT_TRUE(100.1 == j->to_number()); srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(100.1 == p->to_number()); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesDate) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::date(); @@ -249,7 +312,26 @@ VOID TEST(ProtocolAMF0Test, Interfaces) char* d = p->human_print(NULL, NULL); EXPECT_STREQ("Date 0/0\n", d); delete[] d; + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesNull) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::null(); @@ -274,7 +356,26 @@ VOID TEST(ProtocolAMF0Test, Interfaces) SrsJsonAny* j = p->to_json(); EXPECT_TRUE(j->is_null()); srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesUndefined) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::undefined(); @@ -299,7 +400,26 @@ VOID TEST(ProtocolAMF0Test, Interfaces) SrsJsonAny* j = p->to_json(); EXPECT_TRUE(j->is_null()); srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesObject) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::object(); @@ -325,7 +445,54 @@ VOID TEST(ProtocolAMF0Test, Interfaces) SrsJsonAny* j = p->to_json(); EXPECT_TRUE(j->is_object()); srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(NULL != pp->to_object()); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesObject2) +{ + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Any, p); + + SrsAmf0Object* o = p->to_object(); + EXPECT_TRUE(NULL != o); + + o->set("version", SrsAmf0Any::number(3.0)); + o->set("name", SrsAmf0Any::str("srs")); + + SrsAmf0Any* prop = o->get_property("version"); + EXPECT_TRUE(prop->is_number()); + EXPECT_TRUE(3.0 == prop->to_number()); + + prop = o->ensure_property_number("version"); + EXPECT_TRUE(NULL != prop); + + prop = o->ensure_property_string("name"); + EXPECT_TRUE(NULL != prop); + + o->remove("version"); + EXPECT_TRUE(NULL == o->get_property("version")); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesObjectEOF) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::object_eof(); @@ -346,7 +513,26 @@ VOID TEST(ProtocolAMF0Test, Interfaces) SrsJsonAny* j = p->to_json(); EXPECT_TRUE(j->is_null()); srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesEcmaArray) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::ecma_array(); @@ -368,7 +554,27 @@ VOID TEST(ProtocolAMF0Test, Interfaces) char* d = p->human_print(NULL, NULL); EXPECT_STREQ("EcmaArray (0 items)\n", d); delete[] d; + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(NULL != pp->to_ecma_array()); } +} + +VOID TEST(ProtocolAMF0Test, InterfacesStrictArray) +{ + srs_error_t err; if (true) { SrsAmf0Any* p = SrsAmf0Any::strict_array(); @@ -390,8 +596,26 @@ VOID TEST(ProtocolAMF0Test, Interfaces) char* d = p->human_print(NULL, NULL); EXPECT_STREQ("StrictArray (0 items)\n", d); delete[] d; - } + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(NULL != pp->to_strict_array()); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesOthers) +{ if (true) { SrsAmf0Any* p = SrsAmf0Any::object(); SrsAutoFree(SrsAmf0Any, p); From 9d1249e2564509497811245f17429c9f71b1709a Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 12 Oct 2019 00:32:25 +0000 Subject: [PATCH 04/14] Cover AMF0 codec. 3.0.61 --- trunk/src/utest/srs_utest.cpp | 140 ++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index b9d9755a7..22b8da268 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -487,6 +487,68 @@ VOID TEST(ProtocolAMF0Test, InterfacesObject2) o->remove("version"); EXPECT_TRUE(NULL == o->get_property("version")); + + char* s = p->human_print(NULL, NULL); + EXPECT_TRUE(s != NULL); + srs_freepa(s); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::strict_array(); + SrsAutoFree(SrsAmf0Any, p); + + SrsAmf0StrictArray* o = p->to_strict_array(); + EXPECT_TRUE(NULL != o); + + o->append(SrsAmf0Any::number(3.0)); + o->append(SrsAmf0Any::str("srs")); + + SrsAmf0Any* prop = o->at(0); + EXPECT_TRUE(prop->is_number()); + EXPECT_TRUE(3.0 == prop->to_number()); + + prop = o->at(0); + EXPECT_TRUE(NULL != prop); + + prop = o->at(1); + EXPECT_TRUE(NULL != prop); + + char* s = p->human_print(NULL, NULL); + EXPECT_TRUE(s != NULL); + srs_freepa(s); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::ecma_array(); + SrsAutoFree(SrsAmf0Any, p); + + SrsAmf0EcmaArray* o = p->to_ecma_array(); + EXPECT_TRUE(NULL != o); + + o->set("version", SrsAmf0Any::number(3.0)); + o->set("name", SrsAmf0Any::str("srs")); + + EXPECT_TRUE(string("version") == o->key_at(0)); + EXPECT_STREQ("version", o->key_raw_at(0)); + EXPECT_TRUE(string("name") == o->key_at(1)); + + SrsAmf0Any* prop = o->get_property("version"); + EXPECT_TRUE(prop->is_number()); + EXPECT_TRUE(3.0 == prop->to_number()); + + prop = o->ensure_property_number("version"); + EXPECT_TRUE(NULL != prop); + + prop = o->ensure_property_string("name"); + EXPECT_TRUE(NULL != prop); + + prop = o->value_at(1); + EXPECT_TRUE(NULL != prop); + EXPECT_TRUE(prop->is_string()); + + char* s = p->human_print(NULL, NULL); + EXPECT_TRUE(s != NULL); + srs_freepa(s); } } @@ -641,3 +703,81 @@ VOID TEST(ProtocolAMF0Test, InterfacesOthers) } } +VOID TEST(ProtocolAMF0Test, InterfacesError) +{ + srs_error_t err; + + if (true) { + SrsBuffer b; + HELPER_EXPECT_FAILED(SrsAmf0Any::discovery(&b, NULL)); + } + + if (true) { + char data = 0x3f; + SrsBuffer b(&data, 1); + HELPER_EXPECT_FAILED(SrsAmf0Any::discovery(&b, NULL)); + } + + if (true) { + SrsAmf0Object* o = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, o); + + o->set("name", SrsAmf0Any::number(3.0)); + o->set("name", SrsAmf0Any::str("srs")); + + SrsAmf0Any* prop; + prop = o->ensure_property_number("name"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_string("id"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_string("name"); + ASSERT_TRUE(prop != NULL); + EXPECT_STREQ("srs", prop->to_str_raw()); + } + + if (true) { + SrsAmf0Object* o = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, o); + + o->set("name", SrsAmf0Any::str("srs")); + o->set("name", SrsAmf0Any::number(3.0)); + + SrsAmf0Any* prop; + prop = o->ensure_property_number("id"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_string("name"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_number("name"); + ASSERT_TRUE(prop != NULL); + EXPECT_TRUE(3.0 == prop->to_number()); + } + + if (true) { + SrsAmf0Object* src = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, src); + + SrsAmf0Any* cp = src->copy(); + SrsAutoFree(SrsAmf0Any, cp); + + SrsAmf0Object* o = cp->to_object(); + + o->set("name", SrsAmf0Any::str("srs")); + o->set("name", SrsAmf0Any::number(3.0)); + + SrsAmf0Any* prop; + prop = o->ensure_property_number("id"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_string("name"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_number("name"); + ASSERT_TRUE(prop != NULL); + EXPECT_TRUE(3.0 == prop->to_number()); + } +} + From ebe8fa44e525b7c9255fcf0efb4ee5cb31cd8903 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 12 Oct 2019 00:36:52 +0000 Subject: [PATCH 05/14] Cover AMF0 codec. 3.0.61 --- trunk/src/utest/srs_utest.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index 22b8da268..712ca6a85 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -182,6 +182,10 @@ VOID TEST(ProtocolAMF0Test, InterfacesString) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); EXPECT_TRUE(string("hello") == pp->to_str()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(string("hello") == cp->to_str()); } } @@ -229,6 +233,10 @@ VOID TEST(ProtocolAMF0Test, InterfacesBoolean) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); EXPECT_FALSE(p->to_boolean()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_FALSE(cp->to_boolean()); } } @@ -284,6 +292,10 @@ VOID TEST(ProtocolAMF0Test, InterfacesNumber) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); EXPECT_TRUE(100.1 == p->to_number()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(100.1 == cp->to_number()); } } @@ -460,6 +472,10 @@ VOID TEST(ProtocolAMF0Test, InterfacesObject) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); EXPECT_TRUE(NULL != pp->to_object()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(NULL != cp->to_object()); } } @@ -631,6 +647,10 @@ VOID TEST(ProtocolAMF0Test, InterfacesEcmaArray) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); EXPECT_TRUE(NULL != pp->to_ecma_array()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(NULL != cp->to_ecma_array()); } } @@ -673,6 +693,10 @@ VOID TEST(ProtocolAMF0Test, InterfacesStrictArray) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); EXPECT_TRUE(NULL != pp->to_strict_array()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(NULL != cp->to_strict_array()); } } From f8943f8f7dfdfc29fc86f7097e290912f314a6f4 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 12 Oct 2019 08:39:40 +0800 Subject: [PATCH 06/14] Cover AMF0 codec. 3.0.61 --- trunk/src/protocol/srs_protocol_amf0.cpp | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/trunk/src/protocol/srs_protocol_amf0.cpp b/trunk/src/protocol/srs_protocol_amf0.cpp index 556c068ad..a1449e6be 100644 --- a/trunk/src/protocol/srs_protocol_amf0.cpp +++ b/trunk/src/protocol/srs_protocol_amf0.cpp @@ -1783,24 +1783,8 @@ namespace _srs_internal srs_error_t srs_amf0_write_object_eof(SrsBuffer* stream, SrsAmf0ObjectEOF* value) { - srs_error_t err = srs_success; - srs_assert(value != NULL); - - // value - if (!stream->require(2)) { - return srs_error_new(ERROR_RTMP_AMF0_ENCODE, "requires 2 only %d bytes", stream->left()); - } - stream->write_2bytes(0x00); - - // marker - if (!stream->require(1)) { - return srs_error_new(ERROR_RTMP_AMF0_ENCODE, "requires 1 only %d bytes", stream->left()); - } - - stream->write_1bytes(RTMP_AMF0_ObjectEnd); - - return err; + return value->write(stream); } srs_error_t srs_amf0_write_any(SrsBuffer* stream, SrsAmf0Any* value) From 99ca2b956757f60bb39c94ed927ebb251b6cd806 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 12 Oct 2019 08:56:04 +0800 Subject: [PATCH 07/14] Cover AMF0 codec. 3.0.61 --- trunk/src/utest/srs_utest.cpp | 118 +++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 3 deletions(-) diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index 712ca6a85..bc4e2da5d 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -32,6 +32,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +using namespace _srs_internal; #include using namespace std; @@ -477,6 +478,62 @@ VOID TEST(ProtocolAMF0Test, InterfacesObject) SrsAmf0Any* cp = p->copy(); EXPECT_TRUE(NULL != cp->to_object()); } + + if (true) { + SrsBuffer b; + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + o->set("id", SrsAmf0Any::number(3.0)); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x03, 0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03, 's', 'r', 's'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + o->set("id", SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x03, 0x00, 0x01, 'a'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesObject2) @@ -490,6 +547,7 @@ VOID TEST(ProtocolAMF0Test, InterfacesObject2) o->set("version", SrsAmf0Any::number(3.0)); o->set("name", SrsAmf0Any::str("srs")); + EXPECT_STREQ("version", o->key_raw_at(0)); SrsAmf0Any* prop = o->get_property("version"); EXPECT_TRUE(prop->is_number()); @@ -507,6 +565,10 @@ VOID TEST(ProtocolAMF0Test, InterfacesObject2) char* s = p->human_print(NULL, NULL); EXPECT_TRUE(s != NULL); srs_freepa(s); + + SrsJsonAny* j = o->to_json(); + EXPECT_TRUE(j != NULL); + srs_freep(j); } if (true) { @@ -605,6 +667,56 @@ VOID TEST(ProtocolAMF0Test, InterfacesObjectEOF) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(cp->is_object_eof()); + } + + if (true) { + SrsBuffer b; + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); } } @@ -784,14 +896,14 @@ VOID TEST(ProtocolAMF0Test, InterfacesError) SrsAmf0Object* src = SrsAmf0Any::object(); SrsAutoFree(SrsAmf0Object, src); + src->set("name", SrsAmf0Any::str("srs")); + src->set("name", SrsAmf0Any::number(3.0)); + SrsAmf0Any* cp = src->copy(); SrsAutoFree(SrsAmf0Any, cp); SrsAmf0Object* o = cp->to_object(); - o->set("name", SrsAmf0Any::str("srs")); - o->set("name", SrsAmf0Any::number(3.0)); - SrsAmf0Any* prop; prop = o->ensure_property_number("id"); EXPECT_TRUE(prop == NULL); From da46091d3c7461c9ec4148059fe5403e37394bd1 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 12 Oct 2019 09:27:32 +0800 Subject: [PATCH 08/14] Cover AMF0 codec. 3.0.61 --- trunk/src/utest/srs_utest.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index bc4e2da5d..9293b2871 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -519,7 +519,7 @@ VOID TEST(ProtocolAMF0Test, InterfacesObject) } if (true) { - uint8_t data[] = {0x00, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03, 's', 'r', 's'}; + uint8_t data[] = {0x00, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03}; SrsBuffer b((char*)data, sizeof(data)); SrsAmf0Object* o = SrsAmf0Any::object(); o->set("id", SrsAmf0Any::str("srs")); @@ -534,6 +534,15 @@ VOID TEST(ProtocolAMF0Test, InterfacesObject) HELPER_EXPECT_FAILED(o->read(&b)); srs_freep(o); } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03, 's', 'r', 's'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + o->set("id", SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesObject2) From dccf814794b82c37d8adcd4a4a5a4b548367d33a Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 13 Oct 2019 08:51:36 +0800 Subject: [PATCH 09/14] Use http://ossrs.net:8000 as homepage. --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index aa31e382c..6eabfc9db 100755 --- a/README.md +++ b/README.md @@ -152,6 +152,7 @@ Please select according to languages: ### V3 changes +* v3.0, 2019-10-13, Use http://ossrs.net:8000 as homepage. * v3.0, 2019-10-10, Cover AMF0 codec. 3.0.61 * v3.0, 2019-10-07, [3.0 alpha1(3.0.60)][r3.0a1] released. 107962 lines. * v3.0, 2019-10-06, Support log rotate by init.d command. 3.0.60 @@ -170,7 +171,7 @@ Please select according to languages: * v3.0, 2019-04-06, Merge [#1304][bug #1304], Fix ST coroutine pull error. 3.0.47 * v3.0, 2019-04-05, Merge [#1339][bug #1339], Support HTTP-FLV params. 3.0.46 * v3.0, 2018-11-11, Merge [#1261][bug #1261], Support `_definst_` for Wowza. 3.0.44 -* v3.0, 2018-08-26, SRS [console](https://github.com/ossrs/srs-ngb) support both [Chinese](http://182.92.80.26:1985/console/ng_index.html) and [English](http://182.92.80.26:1985/console/en_index.html). +* v3.0, 2018-08-26, SRS [console](https://github.com/ossrs/srs-ngb) support both [Chinese](http://ossrs.net:1985/console/ng_index.html) and [English](http://ossrs.net:1985/console/en_index.html). * v3.0, 2018-08-25, Fix [#1093][bug #1093], Support HLS encryption. 3.0.42 * v3.0, 2018-08-25, Fix [#1051][bug #1051], Drop ts when republishing stream. 3.0.41 * v3.0, 2018-08-12, For [#1202][bug #1202], Support edge/forward to Aliyun CDN. 3.0.40 @@ -515,7 +516,7 @@ Please select according to languages: * v1.0, 2014-05-27, fix [#84][bug #84], unpublish when edge disconnect. 0.9.119 * v1.0, 2014-05-27, fix [#89][bug #89], config to /dev/null to disable ffmpeg log. 0.9.117 * v1.0, 2014-05-25, fix [#76][bug #76], allow edge vhost to add or remove. 0.9.114 -* v1.0, 2014-05-24, Johnny contribute [ossrs.net](http://182.92.80.26). karthikeyan start to translate wiki to English. +* v1.0, 2014-05-24, Johnny contribute [ossrs.net](http://ossrs.net:8000). karthikeyan start to translate wiki to English. * v1.0, 2014-05-22, fix [#78][bug #78], st joinable thread must be stop by other threads, 0.9.113 * v1.0, 2014-05-22, support amf0 StrictArray(0x0a). 0.9.111. * v1.0, 2014-05-22, support flv parser, add amf0 to librtmp. 0.9.110 @@ -1066,8 +1067,8 @@ Winlin [srs-ngb]: https://github.com/ossrs/srs-ngb [srs-librtmp]: https://github.com/ossrs/srs-librtmp [gitlab]: https://gitlab.com/winlinvip/srs-gitlab -[console]: http://182.92.80.26:1985/console -[player]: http://182.92.80.26/players/srs_player.html +[console]: http://ossrs.net:1985/console +[player]: http://ossrs.net:8000/players/srs_player.html [modules]: https://github.com/ossrs/srs/blob/develop/trunk/modules/readme.txt [docker]: https://github.com/ossrs/srs-docker/tree/centos#usage @@ -1114,8 +1115,8 @@ Winlin [v3_CN_Home]: https://github.com/ossrs/srs/wiki/v3_CN_Home [v3_EN_Home]: https://github.com/ossrs/srs/wiki/v3_EN_Home [donation0]: http://winlinvip.github.io/srs.release/donation/index.html -[donation1]: http://182.92.80.26/srs.release/donation/index.html -[donation2]: http://182.92.80.26/srs.release/donation/paypal.html +[donation1]: http://ossrs.net:8000/srs.release/donation/index.html +[donation2]: http://ossrs.net:8000/srs.release/donation/paypal.html [donations]: https://github.com/ossrs/srs/blob/develop/DONATIONS.txt [v1_CN_Compare]: https://github.com/ossrs/srs/wiki/v1_CN_Compare @@ -1532,7 +1533,7 @@ Winlin [contact]: https://github.com/ossrs/srs/wiki/v1_CN_Contact [more0]: http://winlinvip.github.io/srs.release/releases/ -[more1]: http://182.92.80.26/srs.release/releases/ +[more1]: http://ossrs.net:8000/srs.release/releases/ [LICENSE]: https://github.com/ossrs/srs/blob/develop/LICENSE [LicenseMixing]: https://github.com/ossrs/srs/wiki/LicenseMixing @@ -1544,5 +1545,5 @@ Winlin [release2]: https://github.com/ossrs/srs/wiki/v1_CN_Product#release20 [release3]: https://github.com/ossrs/srs/wiki/v1_CN_Product#release30 [centos0]: http://winlinvip.github.io/srs.release/releases/files/SRS-CentOS6-x86_64-3.0.56.zip -[centos1]: http://182.92.80.26/srs.release/releases/files/SRS-CentOS6-x86_64-3.0.56.zip +[centos1]: http://ossrs.net:8000/srs.release/releases/files/SRS-CentOS6-x86_64-3.0.56.zip From 026b2a2a1e49689c71ffd97d50b02862570dc3df Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 18 Oct 2019 00:48:49 +0000 Subject: [PATCH 10/14] Cover AMF0 codec. 3.0.61 --- trunk/src/utest/srs_utest.cpp | 312 ++++++++++++++++++++++++++++++++++ 1 file changed, 312 insertions(+) diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index 9293b2871..7aa3edf1c 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -188,6 +188,68 @@ VOID TEST(ProtocolAMF0Test, InterfacesString) SrsAmf0Any* cp = p->copy(); EXPECT_TRUE(string("hello") == cp->to_str()); } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x02}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x02, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x02, 0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesBoolean) @@ -239,6 +301,36 @@ VOID TEST(ProtocolAMF0Test, InterfacesBoolean) SrsAmf0Any* cp = p->copy(); EXPECT_FALSE(cp->to_boolean()); } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesNumber) @@ -298,6 +390,36 @@ VOID TEST(ProtocolAMF0Test, InterfacesNumber) SrsAmf0Any* cp = p->copy(); EXPECT_TRUE(100.1 == cp->to_number()); } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesDate) @@ -384,6 +506,28 @@ VOID TEST(ProtocolAMF0Test, InterfacesNull) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::null(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::null(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::null(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesUndefined) @@ -428,6 +572,28 @@ VOID TEST(ProtocolAMF0Test, InterfacesUndefined) b.skip(-1 * b.pos()); HELPER_EXPECT_SUCCESS(pp->read(&b)); } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::undefined(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::undefined(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::undefined(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesObject) @@ -773,6 +939,79 @@ VOID TEST(ProtocolAMF0Test, InterfacesEcmaArray) SrsAmf0Any* cp = p->copy(); EXPECT_TRUE(NULL != cp->to_ecma_array()); } + + if (true) { + SrsBuffer b; + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + o->set("id", SrsAmf0Any::number(3.0)); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + o->set("id", SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 'a'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03, 's', 'r', 's'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + o->set("id", SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesStrictArray) @@ -819,6 +1058,79 @@ VOID TEST(ProtocolAMF0Test, InterfacesStrictArray) SrsAmf0Any* cp = p->copy(); EXPECT_TRUE(NULL != cp->to_strict_array()); } + + if (true) { + SrsBuffer b; + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + o->append(SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x02}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + o->append(SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 'a'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 's', 'r'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + o->append(SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesOthers) From 9542cd2ba5163da6311deeeed341cfd9d3db4274 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 18 Oct 2019 08:54:13 +0800 Subject: [PATCH 11/14] AMF0: Refine utest --- trunk/src/utest/srs_utest.cpp | 1100 --------------------------- trunk/src/utest/srs_utest_amf0.cpp | 1102 +++++++++++++++++++++++++++- 2 files changed, 1099 insertions(+), 1103 deletions(-) diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index 7aa3edf1c..61e868d10 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -138,1103 +138,3 @@ VOID TEST(SampleTest, FastSampleMacrosTest) EXPECT_NEAR(10, 15, 5); } -VOID TEST(ProtocolAMF0Test, InterfacesString) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::str("hello"); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_TRUE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(p->is_complex_object()); - EXPECT_TRUE(string("hello") == p->to_str()); - EXPECT_STREQ("hello", p->to_str_raw()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("String hello\n", d); - delete[] d; - - SrsJsonAny* j = p->to_json(); - EXPECT_TRUE(j->is_string()); - EXPECT_TRUE(string("hello") == j->to_str()); - srs_freep(j); - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - EXPECT_TRUE(string("hello") == pp->to_str()); - - // For copy. - SrsAmf0Any* cp = p->copy(); - EXPECT_TRUE(string("hello") == cp->to_str()); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::str(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::str(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::str(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::str(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::str(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x02}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::str(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x02, 0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::str(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x02, 0x00, 0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::str(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesBoolean) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::boolean(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_TRUE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(p->is_complex_object()); - EXPECT_FALSE(p->to_boolean()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("Boolean false\n", d); - delete[] d; - - SrsJsonAny* j = p->to_json(); - EXPECT_TRUE(j->is_boolean()); - EXPECT_FALSE(j->to_boolean()); - srs_freep(j); - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - EXPECT_FALSE(p->to_boolean()); - - // For copy. - SrsAmf0Any* cp = p->copy(); - EXPECT_FALSE(cp->to_boolean()); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::boolean(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::boolean(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::boolean(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::boolean(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesNumber) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::number(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(!p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(p->is_complex_object()); - EXPECT_TRUE(0.0 == p->to_number()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("Number 0.0\n", d); - delete[] d; - - SrsJsonAny* j = p->to_json(); - EXPECT_TRUE(j->is_integer()); - EXPECT_TRUE(0.0 == j->to_integer()); - srs_freep(j); - - p->set_number(100.1); - EXPECT_TRUE(100.1 == p->to_number()); - - j = p->to_json(); - EXPECT_TRUE(j->is_number()); - EXPECT_TRUE(100.1 == j->to_number()); - srs_freep(j); - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - EXPECT_TRUE(100.1 == p->to_number()); - - // For copy. - SrsAmf0Any* cp = p->copy(); - EXPECT_TRUE(100.1 == cp->to_number()); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::number(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::number(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::number(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::number(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesDate) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::date(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(!p->is_date()); - EXPECT_FALSE(p->is_complex_object()); - EXPECT_TRUE(0 == p->to_date()); - EXPECT_TRUE(0 == p->to_date_time_zone()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("Date 0/0\n", d); - delete[] d; - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesNull) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::null(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(!p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(p->is_complex_object()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("Null\n", d); - delete[] d; - - SrsJsonAny* j = p->to_json(); - EXPECT_TRUE(j->is_null()); - srs_freep(j); - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::null(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::null(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::null(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesUndefined) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::undefined(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(!p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(p->is_complex_object()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("Undefined\n", d); - delete[] d; - - SrsJsonAny* j = p->to_json(); - EXPECT_TRUE(j->is_null()); - srs_freep(j); - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::undefined(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0Any* o = SrsAmf0Any::undefined(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Any* o = SrsAmf0Any::undefined(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesObject) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::object(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(!p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(!p->is_complex_object()); - EXPECT_TRUE(NULL != p->to_object()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("Object (0 items)\n", d); - delete[] d; - - SrsJsonAny* j = p->to_json(); - EXPECT_TRUE(j->is_object()); - srs_freep(j); - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - EXPECT_TRUE(NULL != pp->to_object()); - - // For copy. - SrsAmf0Any* cp = p->copy(); - EXPECT_TRUE(NULL != cp->to_object()); - } - - if (true) { - SrsBuffer b; - SrsAmf0Object* o = SrsAmf0Any::object(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0Object* o = SrsAmf0Any::object(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Object* o = SrsAmf0Any::object(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Object* o = SrsAmf0Any::object(); - o->set("id", SrsAmf0Any::number(3.0)); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x03, 0x00, 0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Object* o = SrsAmf0Any::object(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Object* o = SrsAmf0Any::object(); - o->set("id", SrsAmf0Any::str("srs")); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x03, 0x00, 0x01, 'a'}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Object* o = SrsAmf0Any::object(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03, 's', 'r', 's'}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0Object* o = SrsAmf0Any::object(); - o->set("id", SrsAmf0Any::str("srs")); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesObject2) -{ - if (true) { - SrsAmf0Any* p = SrsAmf0Any::object(); - SrsAutoFree(SrsAmf0Any, p); - - SrsAmf0Object* o = p->to_object(); - EXPECT_TRUE(NULL != o); - - o->set("version", SrsAmf0Any::number(3.0)); - o->set("name", SrsAmf0Any::str("srs")); - EXPECT_STREQ("version", o->key_raw_at(0)); - - SrsAmf0Any* prop = o->get_property("version"); - EXPECT_TRUE(prop->is_number()); - EXPECT_TRUE(3.0 == prop->to_number()); - - prop = o->ensure_property_number("version"); - EXPECT_TRUE(NULL != prop); - - prop = o->ensure_property_string("name"); - EXPECT_TRUE(NULL != prop); - - o->remove("version"); - EXPECT_TRUE(NULL == o->get_property("version")); - - char* s = p->human_print(NULL, NULL); - EXPECT_TRUE(s != NULL); - srs_freepa(s); - - SrsJsonAny* j = o->to_json(); - EXPECT_TRUE(j != NULL); - srs_freep(j); - } - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::strict_array(); - SrsAutoFree(SrsAmf0Any, p); - - SrsAmf0StrictArray* o = p->to_strict_array(); - EXPECT_TRUE(NULL != o); - - o->append(SrsAmf0Any::number(3.0)); - o->append(SrsAmf0Any::str("srs")); - - SrsAmf0Any* prop = o->at(0); - EXPECT_TRUE(prop->is_number()); - EXPECT_TRUE(3.0 == prop->to_number()); - - prop = o->at(0); - EXPECT_TRUE(NULL != prop); - - prop = o->at(1); - EXPECT_TRUE(NULL != prop); - - char* s = p->human_print(NULL, NULL); - EXPECT_TRUE(s != NULL); - srs_freepa(s); - } - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::ecma_array(); - SrsAutoFree(SrsAmf0Any, p); - - SrsAmf0EcmaArray* o = p->to_ecma_array(); - EXPECT_TRUE(NULL != o); - - o->set("version", SrsAmf0Any::number(3.0)); - o->set("name", SrsAmf0Any::str("srs")); - - EXPECT_TRUE(string("version") == o->key_at(0)); - EXPECT_STREQ("version", o->key_raw_at(0)); - EXPECT_TRUE(string("name") == o->key_at(1)); - - SrsAmf0Any* prop = o->get_property("version"); - EXPECT_TRUE(prop->is_number()); - EXPECT_TRUE(3.0 == prop->to_number()); - - prop = o->ensure_property_number("version"); - EXPECT_TRUE(NULL != prop); - - prop = o->ensure_property_string("name"); - EXPECT_TRUE(NULL != prop); - - prop = o->value_at(1); - EXPECT_TRUE(NULL != prop); - EXPECT_TRUE(prop->is_string()); - - char* s = p->human_print(NULL, NULL); - EXPECT_TRUE(s != NULL); - srs_freepa(s); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesObjectEOF) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::object_eof(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(!p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(!p->is_complex_object()); - - SrsJsonAny* j = p->to_json(); - EXPECT_TRUE(j->is_null()); - srs_freep(j); - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - - // For copy. - SrsAmf0Any* cp = p->copy(); - EXPECT_TRUE(cp->is_object_eof()); - } - - if (true) { - SrsBuffer b; - SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00, 0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesEcmaArray) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::ecma_array(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(!p->is_ecma_array()); - EXPECT_FALSE(p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(!p->is_complex_object()); - EXPECT_TRUE(NULL != p->to_ecma_array()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("EcmaArray (0 items)\n", d); - delete[] d; - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - EXPECT_TRUE(NULL != pp->to_ecma_array()); - - // For copy. - SrsAmf0Any* cp = p->copy(); - EXPECT_TRUE(NULL != cp->to_ecma_array()); - } - - if (true) { - SrsBuffer b; - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - o->set("id", SrsAmf0Any::number(3.0)); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - o->set("id", SrsAmf0Any::str("srs")); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 'a'}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03, 's', 'r', 's'}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); - o->set("id", SrsAmf0Any::str("srs")); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesStrictArray) -{ - srs_error_t err; - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::strict_array(); - SrsAutoFree(SrsAmf0Any, p); - - EXPECT_FALSE(p->is_string()); - EXPECT_FALSE(p->is_boolean()); - EXPECT_FALSE(p->is_number()); - EXPECT_FALSE(p->is_null()); - EXPECT_FALSE(p->is_undefined()); - EXPECT_FALSE(p->is_object()); - EXPECT_FALSE(p->is_object_eof()); - EXPECT_FALSE(p->is_ecma_array()); - EXPECT_FALSE(!p->is_strict_array()); - EXPECT_FALSE(p->is_date()); - EXPECT_FALSE(!p->is_complex_object()); - EXPECT_TRUE(NULL != p->to_strict_array()); - - char* d = p->human_print(NULL, NULL); - EXPECT_STREQ("StrictArray (0 items)\n", d); - delete[] d; - - // For marshal and unmarshal. - char* bb = new char[p->total_size()]; - SrsAutoFreeA(char, bb); - SrsBuffer b(bb, p->total_size()); - HELPER_EXPECT_SUCCESS(p->write(&b)); - - b.skip(-1 * b.pos()); - SrsAmf0Any* pp = NULL; - SrsAutoFree(SrsAmf0Any, pp); - HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); - - b.skip(-1 * b.pos()); - HELPER_EXPECT_SUCCESS(pp->read(&b)); - EXPECT_TRUE(NULL != pp->to_strict_array()); - - // For copy. - SrsAmf0Any* cp = p->copy(); - EXPECT_TRUE(NULL != cp->to_strict_array()); - } - - if (true) { - SrsBuffer b; - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - SrsBuffer b; - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x01}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - o->append(SrsAmf0Any::str("srs")); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x00}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x02}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - o->append(SrsAmf0Any::str("srs")); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 'a'}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - HELPER_EXPECT_FAILED(o->read(&b)); - srs_freep(o); - } - - if (true) { - uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 's', 'r'}; - SrsBuffer b((char*)data, sizeof(data)); - SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); - o->append(SrsAmf0Any::str("srs")); - HELPER_EXPECT_FAILED(o->write(&b)); - srs_freep(o); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesOthers) -{ - if (true) { - SrsAmf0Any* p = SrsAmf0Any::object(); - SrsAutoFree(SrsAmf0Any, p); - EXPECT_FALSE(!p->is_complex_object()); - } - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::object_eof(); - SrsAutoFree(SrsAmf0Any, p); - EXPECT_FALSE(!p->is_complex_object()); - } - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::ecma_array(); - SrsAutoFree(SrsAmf0Any, p); - EXPECT_FALSE(!p->is_complex_object()); - } - - if (true) { - SrsAmf0Any* p = SrsAmf0Any::strict_array(); - SrsAutoFree(SrsAmf0Any, p); - EXPECT_FALSE(!p->is_complex_object()); - } -} - -VOID TEST(ProtocolAMF0Test, InterfacesError) -{ - srs_error_t err; - - if (true) { - SrsBuffer b; - HELPER_EXPECT_FAILED(SrsAmf0Any::discovery(&b, NULL)); - } - - if (true) { - char data = 0x3f; - SrsBuffer b(&data, 1); - HELPER_EXPECT_FAILED(SrsAmf0Any::discovery(&b, NULL)); - } - - if (true) { - SrsAmf0Object* o = SrsAmf0Any::object(); - SrsAutoFree(SrsAmf0Object, o); - - o->set("name", SrsAmf0Any::number(3.0)); - o->set("name", SrsAmf0Any::str("srs")); - - SrsAmf0Any* prop; - prop = o->ensure_property_number("name"); - EXPECT_TRUE(prop == NULL); - - prop = o->ensure_property_string("id"); - EXPECT_TRUE(prop == NULL); - - prop = o->ensure_property_string("name"); - ASSERT_TRUE(prop != NULL); - EXPECT_STREQ("srs", prop->to_str_raw()); - } - - if (true) { - SrsAmf0Object* o = SrsAmf0Any::object(); - SrsAutoFree(SrsAmf0Object, o); - - o->set("name", SrsAmf0Any::str("srs")); - o->set("name", SrsAmf0Any::number(3.0)); - - SrsAmf0Any* prop; - prop = o->ensure_property_number("id"); - EXPECT_TRUE(prop == NULL); - - prop = o->ensure_property_string("name"); - EXPECT_TRUE(prop == NULL); - - prop = o->ensure_property_number("name"); - ASSERT_TRUE(prop != NULL); - EXPECT_TRUE(3.0 == prop->to_number()); - } - - if (true) { - SrsAmf0Object* src = SrsAmf0Any::object(); - SrsAutoFree(SrsAmf0Object, src); - - src->set("name", SrsAmf0Any::str("srs")); - src->set("name", SrsAmf0Any::number(3.0)); - - SrsAmf0Any* cp = src->copy(); - SrsAutoFree(SrsAmf0Any, cp); - - SrsAmf0Object* o = cp->to_object(); - - SrsAmf0Any* prop; - prop = o->ensure_property_number("id"); - EXPECT_TRUE(prop == NULL); - - prop = o->ensure_property_string("name"); - EXPECT_TRUE(prop == NULL); - - prop = o->ensure_property_number("name"); - ASSERT_TRUE(prop != NULL); - EXPECT_TRUE(3.0 == prop->to_number()); - } -} - diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index 8f446e3ab..5a045d499 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -22,8 +22,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include -#ifdef ENABLE_UTEST_AMF0 - #include using namespace std; @@ -1264,5 +1262,1103 @@ VOID TEST(ProtocolAMF0Test, ObjectEcmaStrict) EXPECT_EQ(0, arr3->to_ecma_array()->count()); } -#endif +VOID TEST(ProtocolAMF0Test, InterfacesString) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::str("hello"); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_TRUE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + EXPECT_TRUE(string("hello") == p->to_str()); + EXPECT_STREQ("hello", p->to_str_raw()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("String hello\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_string()); + EXPECT_TRUE(string("hello") == j->to_str()); + srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(string("hello") == pp->to_str()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(string("hello") == cp->to_str()); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x02}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x02, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x02, 0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesBoolean) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::boolean(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_TRUE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + EXPECT_FALSE(p->to_boolean()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Boolean false\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_boolean()); + EXPECT_FALSE(j->to_boolean()); + srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_FALSE(p->to_boolean()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_FALSE(cp->to_boolean()); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesNumber) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::number(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(!p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + EXPECT_TRUE(0.0 == p->to_number()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Number 0.0\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_integer()); + EXPECT_TRUE(0.0 == j->to_integer()); + srs_freep(j); + + p->set_number(100.1); + EXPECT_TRUE(100.1 == p->to_number()); + + j = p->to_json(); + EXPECT_TRUE(j->is_number()); + EXPECT_TRUE(100.1 == j->to_number()); + srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(100.1 == p->to_number()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(100.1 == cp->to_number()); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesDate) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::date(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(!p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + EXPECT_TRUE(0 == p->to_date()); + EXPECT_TRUE(0 == p->to_date_time_zone()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Date 0/0\n", d); + delete[] d; + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesNull) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::null(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(!p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Null\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_null()); + srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::null(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::null(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::null(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesUndefined) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::undefined(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(!p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(p->is_complex_object()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Undefined\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_null()); + srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::undefined(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* o = SrsAmf0Any::undefined(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::undefined(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesObject) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(!p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(!p->is_complex_object()); + EXPECT_TRUE(NULL != p->to_object()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("Object (0 items)\n", d); + delete[] d; + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_object()); + srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(NULL != pp->to_object()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(NULL != cp->to_object()); + } + + if (true) { + SrsBuffer b; + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + o->set("id", SrsAmf0Any::number(3.0)); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x03, 0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + o->set("id", SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x03, 0x00, 0x01, 'a'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03, 's', 'r', 's'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Object* o = SrsAmf0Any::object(); + o->set("id", SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesObject2) +{ + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Any, p); + + SrsAmf0Object* o = p->to_object(); + EXPECT_TRUE(NULL != o); + + o->set("version", SrsAmf0Any::number(3.0)); + o->set("name", SrsAmf0Any::str("srs")); + EXPECT_STREQ("version", o->key_raw_at(0)); + + SrsAmf0Any* prop = o->get_property("version"); + EXPECT_TRUE(prop->is_number()); + EXPECT_TRUE(3.0 == prop->to_number()); + + prop = o->ensure_property_number("version"); + EXPECT_TRUE(NULL != prop); + + prop = o->ensure_property_string("name"); + EXPECT_TRUE(NULL != prop); + + o->remove("version"); + EXPECT_TRUE(NULL == o->get_property("version")); + + char* s = p->human_print(NULL, NULL); + EXPECT_TRUE(s != NULL); + srs_freepa(s); + + SrsJsonAny* j = o->to_json(); + EXPECT_TRUE(j != NULL); + srs_freep(j); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::strict_array(); + SrsAutoFree(SrsAmf0Any, p); + + SrsAmf0StrictArray* o = p->to_strict_array(); + EXPECT_TRUE(NULL != o); + + o->append(SrsAmf0Any::number(3.0)); + o->append(SrsAmf0Any::str("srs")); + + SrsAmf0Any* prop = o->at(0); + EXPECT_TRUE(prop->is_number()); + EXPECT_TRUE(3.0 == prop->to_number()); + + prop = o->at(0); + EXPECT_TRUE(NULL != prop); + + prop = o->at(1); + EXPECT_TRUE(NULL != prop); + + char* s = p->human_print(NULL, NULL); + EXPECT_TRUE(s != NULL); + srs_freepa(s); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::ecma_array(); + SrsAutoFree(SrsAmf0Any, p); + + SrsAmf0EcmaArray* o = p->to_ecma_array(); + EXPECT_TRUE(NULL != o); + + o->set("version", SrsAmf0Any::number(3.0)); + o->set("name", SrsAmf0Any::str("srs")); + + EXPECT_TRUE(string("version") == o->key_at(0)); + EXPECT_STREQ("version", o->key_raw_at(0)); + EXPECT_TRUE(string("name") == o->key_at(1)); + + SrsAmf0Any* prop = o->get_property("version"); + EXPECT_TRUE(prop->is_number()); + EXPECT_TRUE(3.0 == prop->to_number()); + + prop = o->ensure_property_number("version"); + EXPECT_TRUE(NULL != prop); + + prop = o->ensure_property_string("name"); + EXPECT_TRUE(NULL != prop); + + prop = o->value_at(1); + EXPECT_TRUE(NULL != prop); + EXPECT_TRUE(prop->is_string()); + + char* s = p->human_print(NULL, NULL); + EXPECT_TRUE(s != NULL); + srs_freepa(s); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesObjectEOF) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object_eof(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(!p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(!p->is_complex_object()); + + SrsJsonAny* j = p->to_json(); + EXPECT_TRUE(j->is_null()); + srs_freep(j); + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(cp->is_object_eof()); + } + + if (true) { + SrsBuffer b; + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0ObjectEOF* o = new SrsAmf0ObjectEOF(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesEcmaArray) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::ecma_array(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(!p->is_ecma_array()); + EXPECT_FALSE(p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(!p->is_complex_object()); + EXPECT_TRUE(NULL != p->to_ecma_array()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("EcmaArray (0 items)\n", d); + delete[] d; + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(NULL != pp->to_ecma_array()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(NULL != cp->to_ecma_array()); + } + + if (true) { + SrsBuffer b; + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + o->set("id", SrsAmf0Any::number(3.0)); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + o->set("id", SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 'a'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 'i', 'd', 0x02, 0x00, 0x03, 's', 'r', 's'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + o->set("id", SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesStrictArray) +{ + srs_error_t err; + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::strict_array(); + SrsAutoFree(SrsAmf0Any, p); + + EXPECT_FALSE(p->is_string()); + EXPECT_FALSE(p->is_boolean()); + EXPECT_FALSE(p->is_number()); + EXPECT_FALSE(p->is_null()); + EXPECT_FALSE(p->is_undefined()); + EXPECT_FALSE(p->is_object()); + EXPECT_FALSE(p->is_object_eof()); + EXPECT_FALSE(p->is_ecma_array()); + EXPECT_FALSE(!p->is_strict_array()); + EXPECT_FALSE(p->is_date()); + EXPECT_FALSE(!p->is_complex_object()); + EXPECT_TRUE(NULL != p->to_strict_array()); + + char* d = p->human_print(NULL, NULL); + EXPECT_STREQ("StrictArray (0 items)\n", d); + delete[] d; + + // For marshal and unmarshal. + char* bb = new char[p->total_size()]; + SrsAutoFreeA(char, bb); + SrsBuffer b(bb, p->total_size()); + HELPER_EXPECT_SUCCESS(p->write(&b)); + + b.skip(-1 * b.pos()); + SrsAmf0Any* pp = NULL; + SrsAutoFree(SrsAmf0Any, pp); + HELPER_EXPECT_SUCCESS(SrsAmf0Any::discovery(&b, &pp)); + + b.skip(-1 * b.pos()); + HELPER_EXPECT_SUCCESS(pp->read(&b)); + EXPECT_TRUE(NULL != pp->to_strict_array()); + + // For copy. + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(NULL != cp->to_strict_array()); + } + + if (true) { + SrsBuffer b; + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + SrsBuffer b; + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + o->append(SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x02}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x03}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + o->append(SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 'a'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 's', 'r'}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + o->append(SrsAmf0Any::str("srs")); + HELPER_EXPECT_FAILED(o->write(&b)); + srs_freep(o); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesOthers) +{ + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Any, p); + EXPECT_FALSE(!p->is_complex_object()); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::object_eof(); + SrsAutoFree(SrsAmf0Any, p); + EXPECT_FALSE(!p->is_complex_object()); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::ecma_array(); + SrsAutoFree(SrsAmf0Any, p); + EXPECT_FALSE(!p->is_complex_object()); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::strict_array(); + SrsAutoFree(SrsAmf0Any, p); + EXPECT_FALSE(!p->is_complex_object()); + } +} + +VOID TEST(ProtocolAMF0Test, InterfacesError) +{ + srs_error_t err; + + if (true) { + SrsBuffer b; + HELPER_EXPECT_FAILED(SrsAmf0Any::discovery(&b, NULL)); + } + + if (true) { + char data = 0x3f; + SrsBuffer b(&data, 1); + HELPER_EXPECT_FAILED(SrsAmf0Any::discovery(&b, NULL)); + } + + if (true) { + SrsAmf0Object* o = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, o); + + o->set("name", SrsAmf0Any::number(3.0)); + o->set("name", SrsAmf0Any::str("srs")); + + SrsAmf0Any* prop; + prop = o->ensure_property_number("name"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_string("id"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_string("name"); + ASSERT_TRUE(prop != NULL); + EXPECT_STREQ("srs", prop->to_str_raw()); + } + + if (true) { + SrsAmf0Object* o = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, o); + + o->set("name", SrsAmf0Any::str("srs")); + o->set("name", SrsAmf0Any::number(3.0)); + + SrsAmf0Any* prop; + prop = o->ensure_property_number("id"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_string("name"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_number("name"); + ASSERT_TRUE(prop != NULL); + EXPECT_TRUE(3.0 == prop->to_number()); + } + + if (true) { + SrsAmf0Object* src = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, src); + + src->set("name", SrsAmf0Any::str("srs")); + src->set("name", SrsAmf0Any::number(3.0)); + + SrsAmf0Any* cp = src->copy(); + SrsAutoFree(SrsAmf0Any, cp); + + SrsAmf0Object* o = cp->to_object(); + + SrsAmf0Any* prop; + prop = o->ensure_property_number("id"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_string("name"); + EXPECT_TRUE(prop == NULL); + + prop = o->ensure_property_number("name"); + ASSERT_TRUE(prop != NULL); + EXPECT_TRUE(3.0 == prop->to_number()); + } +} From 232024ef6729f8b3cdae7170eea7d223acddcb97 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 18 Oct 2019 08:54:59 +0800 Subject: [PATCH 12/14] AMF0: Refine utest --- trunk/src/utest/srs_utest.cpp | 5 ----- trunk/src/utest/srs_utest_amf0.cpp | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/trunk/src/utest/srs_utest.cpp b/trunk/src/utest/srs_utest.cpp index 61e868d10..6e1fda1f2 100644 --- a/trunk/src/utest/srs_utest.cpp +++ b/trunk/src/utest/srs_utest.cpp @@ -28,11 +28,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include -#include -#include -#include -#include -using namespace _srs_internal; #include using namespace std; diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index 5a045d499..5c930091e 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -28,6 +28,11 @@ using namespace std; #include #include #include +#include +#include +#include +#include +using namespace _srs_internal; /** * main scenario to use amf0. From 0a9659b749c36d7caeead1ea98da56f53e03cae2 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 21 Oct 2019 09:29:42 +0800 Subject: [PATCH 13/14] Cover AMF0 codec. 3.0.61 --- trunk/src/utest/srs_utest_amf0.cpp | 69 ++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index 5c930091e..74241565d 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -2125,6 +2125,14 @@ VOID TEST(ProtocolAMF0Test, InterfacesEcmaArray) srs_freep(o); } + if (true) { + uint8_t data[] = {0x08, 0x00, 0x00, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + if (true) { uint8_t data[] = {0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 'a'}; SrsBuffer b((char*)data, sizeof(data)); @@ -2227,6 +2235,14 @@ VOID TEST(ProtocolAMF0Test, InterfacesStrictArray) srs_freep(o); } + if (true) { + uint8_t data[] = {0x0a, 0x00, 0x00, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } + if (true) { uint8_t data[] = {0x0a, 0x00, 0x00, 0x00, 0x01, 0x02}; SrsBuffer b((char*)data, sizeof(data)); @@ -2367,3 +2383,56 @@ VOID TEST(ProtocolAMF0Test, InterfacesError) } } +VOID TEST(ProtocolAMF0Test, Amf0Object2) +{ + if (true) { + SrsAmf0Object* o = SrsAmf0Any::object(); + o->set("id", SrsAmf0Any::number(3.0)); + EXPECT_EQ(1, o->count()); + + o->clear(); + EXPECT_EQ(0, o->count()); + + srs_freep(o); + } + + if (true) { + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + o->set("id", SrsAmf0Any::number(3.0)); + EXPECT_EQ(1, o->count()); + + o->clear(); + EXPECT_EQ(0, o->count()); + + srs_freep(o); + } + + if (true) { + SrsAmf0EcmaArray* o = SrsAmf0Any::ecma_array(); + o->set("id", SrsAmf0Any::number(3.0)); + + SrsJsonAny* j = o->to_json(); + EXPECT_TRUE(j->is_object()); + + SrsJsonObject* jo = j->to_object(); + EXPECT_EQ(1, jo->count()); + + srs_freep(j); + srs_freep(o); + } + + if (true) { + SrsAmf0StrictArray* o = SrsAmf0Any::strict_array(); + o->append(SrsAmf0Any::number(3.0)); + + SrsJsonAny* j = o->to_json(); + EXPECT_TRUE(j->is_array()); + + SrsJsonArray* ja = j->to_array(); + EXPECT_EQ(1, ja->count()); + + srs_freep(j); + srs_freep(o); + } +} + From aee704fd1f4eaa802193e62193e51dcf8a4a5651 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 22 Oct 2019 08:30:46 +0800 Subject: [PATCH 14/14] Cover AMF0 codec. 3.0.61 --- trunk/src/utest/srs_utest_amf0.cpp | 57 ++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index 74241565d..5f6efbf6e 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -1341,6 +1341,14 @@ VOID TEST(ProtocolAMF0Test, InterfacesString) srs_freep(o); } + if (true) { + uint8_t data[] = {0x00, 0x00, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_SUCCESS(o->write(&b)); + srs_freep(o); + } + if (true) { SrsBuffer b; SrsAmf0Any* o = SrsAmf0Any::str(); @@ -1372,6 +1380,14 @@ VOID TEST(ProtocolAMF0Test, InterfacesString) srs_freep(o); } + if (true) { + uint8_t data[] = {0x02, 0x00, 0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::str(); + HELPER_EXPECT_SUCCESS(o->read(&b)); + srs_freep(o); + } + if (true) { uint8_t data[] = {0x02, 0x00, 0x01}; SrsBuffer b((char*)data, sizeof(data)); @@ -1460,6 +1476,14 @@ VOID TEST(ProtocolAMF0Test, InterfacesBoolean) HELPER_EXPECT_FAILED(o->read(&b)); srs_freep(o); } + + if (true) { + uint8_t data[] = {0x00}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::boolean(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesNumber) @@ -1549,6 +1573,14 @@ VOID TEST(ProtocolAMF0Test, InterfacesNumber) HELPER_EXPECT_FAILED(o->read(&b)); srs_freep(o); } + + if (true) { + uint8_t data[] = {0x01}; + SrsBuffer b((char*)data, sizeof(data)); + SrsAmf0Any* o = SrsAmf0Any::number(); + HELPER_EXPECT_FAILED(o->read(&b)); + srs_freep(o); + } } VOID TEST(ProtocolAMF0Test, InterfacesDate) @@ -2385,6 +2417,8 @@ VOID TEST(ProtocolAMF0Test, InterfacesError) VOID TEST(ProtocolAMF0Test, Amf0Object2) { + srs_error_t err; + if (true) { SrsAmf0Object* o = SrsAmf0Any::object(); o->set("id", SrsAmf0Any::number(3.0)); @@ -2434,5 +2468,28 @@ VOID TEST(ProtocolAMF0Test, Amf0Object2) srs_freep(j); srs_freep(o); } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::null(); + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(cp->is_null()); + srs_freep(cp); + srs_freep(p); + } + + if (true) { + SrsAmf0Any* p = SrsAmf0Any::undefined(); + SrsAmf0Any* cp = p->copy(); + EXPECT_TRUE(cp->is_undefined()); + srs_freep(cp); + srs_freep(p); + } + + if (true) { + SrsBuffer b; + SrsAmf0Any* eof = SrsAmf0Any::object_eof(); + HELPER_EXPECT_FAILED(srs_amf0_write_object_eof(&b, (SrsAmf0ObjectEOF*)eof)); + srs_freep(eof); + } }