winlin

change to 0.9.15, finish amf0 utest

@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "14" 34 +#define VERSION_REVISION "15"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "srs" 37 #define RTMP_SIG_SRS_KEY "srs"
@@ -1174,14 +1174,15 @@ int srs_amf0_read_utf8(SrsStream* stream, string& value) @@ -1174,14 +1174,15 @@ int srs_amf0_read_utf8(SrsStream* stream, string& value)
1174 // support utf8-1 only 1174 // support utf8-1 only
1175 // 1.3.1 Strings and UTF-8 1175 // 1.3.1 Strings and UTF-8
1176 // UTF8-1 = %x00-7F 1176 // UTF8-1 = %x00-7F
1177 - for (int i = 0; i < len; i++) { 1177 + // TODO: support other utf-8 strings
  1178 + /*for (int i = 0; i < len; i++) {
1178 char ch = *(str.data() + i); 1179 char ch = *(str.data() + i);
1179 if ((ch & 0x80) != 0) { 1180 if ((ch & 0x80) != 0) {
1180 ret = ERROR_RTMP_AMF0_DECODE; 1181 ret = ERROR_RTMP_AMF0_DECODE;
1181 srs_error("ignored. only support utf8-1, 0x00-0x7F, actual is %#x. ret=%d", (int)ch, ret); 1182 srs_error("ignored. only support utf8-1, 0x00-0x7F, actual is %#x. ret=%d", (int)ch, ret);
1182 ret = ERROR_SUCCESS; 1183 ret = ERROR_SUCCESS;
1183 } 1184 }
1184 - } 1185 + }*/
1185 1186
1186 value = str; 1187 value = str;
1187 srs_verbose("amf0 read string data success. str=%s", str.c_str()); 1188 srs_verbose("amf0 read string data success. str=%s", str.c_str());
@@ -22,11 +22,156 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -22,11 +22,156 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */ 22 */
23 #include <srs_utest_amf0.hpp> 23 #include <srs_utest_amf0.hpp>
24 24
  25 +#include <string>
  26 +using namespace std;
  27 +
25 #include <srs_core_autofree.hpp> 28 #include <srs_core_autofree.hpp>
26 #include <srs_kernel_error.hpp> 29 #include <srs_kernel_error.hpp>
27 #include <srs_kernel_stream.hpp> 30 #include <srs_kernel_stream.hpp>
28 31
29 -VOID TEST(AMF0Test, Size) 32 +// user scenario: coding and decoding with amf0
  33 +VOID TEST(AMF0Test, ScenarioMain)
  34 +{
  35 + // coded amf0 object
  36 + int nb_bytes = 0;
  37 + char* bytes = NULL;
  38 +
  39 + // coding data to binaries by amf0
  40 + // for example, send connect app response to client.
  41 + if (true) {
  42 + // props: object
  43 + // fmsVer: string
  44 + // capabilities: number
  45 + // mode: number
  46 + // info: object
  47 + // level: string
  48 + // code: string
  49 + // descrption: string
  50 + // objectEncoding: number
  51 + // data: array
  52 + // version: string
  53 + // srs_sig: string
  54 + SrsAmf0Object* props = SrsAmf0Any::object();
  55 + SrsAutoFree(SrsAmf0Object, props, false);
  56 + props->set("fmsVer", SrsAmf0Any::str("FMS/3,5,3,888"));
  57 + props->set("capabilities", SrsAmf0Any::number(253));
  58 + props->set("mode", SrsAmf0Any::number(123));
  59 +
  60 + SrsAmf0Object* info = SrsAmf0Any::object();
  61 + SrsAutoFree(SrsAmf0Object, info, false);
  62 + info->set("level", SrsAmf0Any::str("info"));
  63 + info->set("code", SrsAmf0Any::str("NetStream.Connnect.Success"));
  64 + info->set("descrption", SrsAmf0Any::str("connected"));
  65 + info->set("objectEncoding", SrsAmf0Any::number(3));
  66 +
  67 + SrsAmf0EcmaArray* data = SrsAmf0Any::ecma_array();
  68 + info->set("data", data);
  69 + data->set("version", SrsAmf0Any::str("FMS/3,5,3,888"));
  70 + data->set("srs_sig", SrsAmf0Any::str("srs"));
  71 +
  72 + // buf store the serialized props/info
  73 + nb_bytes = props->total_size() + info->total_size();
  74 + ASSERT_GT(nb_bytes, 0);
  75 + bytes = new char[nb_bytes];
  76 +
  77 + // use SrsStream to write props/info to binary buf.
  78 + SrsStream s;
  79 + EXPECT_EQ(ERROR_SUCCESS, s.initialize(bytes, nb_bytes));
  80 + EXPECT_EQ(ERROR_SUCCESS, props->write(&s));
  81 + EXPECT_EQ(ERROR_SUCCESS, info->write(&s));
  82 + EXPECT_TRUE(s.empty());
  83 +
  84 + // now, user can use the buf
  85 + EXPECT_EQ(0x03, bytes[0]);
  86 + EXPECT_EQ(0x09, bytes[nb_bytes - 1]);
  87 + }
  88 + SrsAutoFree(char, bytes, true);
  89 +
  90 + // decoding amf0 object from bytes
  91 + // when user know the schema
  92 + if (true) {
  93 + ASSERT_TRUE(NULL != bytes);
  94 +
  95 + // use SrsStream to assist amf0 object to read from bytes.
  96 + SrsStream s;
  97 + EXPECT_EQ(ERROR_SUCCESS, s.initialize(bytes, nb_bytes));
  98 +
  99 + // decoding
  100 + // if user know the schema, for instance, it's an amf0 object,
  101 + // user can use specified object to decoding.
  102 + SrsAmf0Object* props = SrsAmf0Any::object();
  103 + SrsAutoFree(SrsAmf0Object, props, false);
  104 + EXPECT_EQ(ERROR_SUCCESS, props->read(&s));
  105 +
  106 + // user can use specified object to decoding.
  107 + SrsAmf0Object* info = SrsAmf0Any::object();
  108 + SrsAutoFree(SrsAmf0Object, info, false);
  109 + EXPECT_EQ(ERROR_SUCCESS, info->read(&s));
  110 +
  111 + // use the decoded data.
  112 + SrsAmf0Any* prop = NULL;
  113 +
  114 + // if user requires specified property, use ensure of amf0 object
  115 + EXPECT_TRUE(NULL != (prop = props->ensure_property_string("fmsVer")));
  116 + // the property can assert to string.
  117 + ASSERT_TRUE(prop->is_string());
  118 + // get the prop string value.
  119 + EXPECT_STREQ("FMS/3,5,3,888", prop->to_str().c_str());
  120 +
  121 + // get other type property value
  122 + EXPECT_TRUE(NULL != (prop = info->get_property("data")));
  123 + // we cannot assert the property is ecma array
  124 + if (prop->is_ecma_array()) {
  125 + SrsAmf0EcmaArray* data = prop->to_ecma_array();
  126 + // it must be a ecma array.
  127 + ASSERT_TRUE(NULL != data);
  128 +
  129 + // get property of array
  130 + EXPECT_TRUE(NULL != (prop = data->ensure_property_string("srs_sig")));
  131 + ASSERT_TRUE(prop->is_string());
  132 + EXPECT_STREQ("srs", prop->to_str().c_str());
  133 + }
  134 +
  135 + // confidence about the schema
  136 + EXPECT_TRUE(NULL != (prop = info->ensure_property_string("level")));
  137 + ASSERT_TRUE(prop->is_string());
  138 + EXPECT_STREQ("info", prop->to_str().c_str());
  139 + }
  140 +
  141 + // use any to decoding it,
  142 + // if user donot know the schema
  143 + if (true) {
  144 + ASSERT_TRUE(NULL != bytes);
  145 +
  146 + // use SrsStream to assist amf0 object to read from bytes.
  147 + SrsStream s;
  148 + EXPECT_EQ(ERROR_SUCCESS, s.initialize(bytes, nb_bytes));
  149 +
  150 + // decoding a amf0 any, for user donot know
  151 + SrsAmf0Any* any = NULL;
  152 + EXPECT_EQ(ERROR_SUCCESS, srs_amf0_read_any(&s, &any));
  153 + SrsAutoFree(SrsAmf0Any, any, false);
  154 +
  155 + // for amf0 object
  156 + if (any->is_object()) {
  157 + SrsAmf0Object* obj = any->to_object();
  158 + ASSERT_TRUE(NULL != obj);
  159 +
  160 + // use foreach to process properties
  161 + for (int i = 0; i < obj->count(); ++i) {
  162 + string name = obj->key_at(i);
  163 + SrsAmf0Any* value = obj->value_at(i);
  164 +
  165 + // use the property name
  166 + EXPECT_TRUE("" != name);
  167 + // use the property value
  168 + EXPECT_TRUE(NULL != value);
  169 + }
  170 + }
  171 + }
  172 +}
  173 +
  174 +VOID TEST(AMF0Test, ApiSize)
30 { 175 {
31 // size of elem 176 // size of elem
32 EXPECT_EQ(2+6, SrsAmf0Size::utf8("winlin")); 177 EXPECT_EQ(2+6, SrsAmf0Size::utf8("winlin"));
@@ -282,7 +427,7 @@ VOID TEST(AMF0Test, Size) @@ -282,7 +427,7 @@ VOID TEST(AMF0Test, Size)
282 } 427 }
283 } 428 }
284 429
285 -VOID TEST(AMF0Test, AnyElem) 430 +VOID TEST(AMF0Test, ApiAnyElem)
286 { 431 {
287 SrsAmf0Any* o = NULL; 432 SrsAmf0Any* o = NULL;
288 433
@@ -365,7 +510,7 @@ VOID TEST(AMF0Test, AnyElem) @@ -365,7 +510,7 @@ VOID TEST(AMF0Test, AnyElem)
365 } 510 }
366 } 511 }
367 512
368 -VOID TEST(AMF0Test, AnyIO) 513 +VOID TEST(AMF0Test, ApiAnyIO)
369 { 514 {
370 SrsStream s; 515 SrsStream s;
371 SrsAmf0Any* o = NULL; 516 SrsAmf0Any* o = NULL;
@@ -675,7 +820,7 @@ VOID TEST(AMF0Test, AnyIO) @@ -675,7 +820,7 @@ VOID TEST(AMF0Test, AnyIO)
675 } 820 }
676 } 821 }
677 822
678 -VOID TEST(AMF0Test, AnyAssert) 823 +VOID TEST(AMF0Test, ApiAnyAssert)
679 { 824 {
680 SrsStream s; 825 SrsStream s;
681 SrsAmf0Any* o = NULL; 826 SrsAmf0Any* o = NULL;
@@ -749,7 +894,7 @@ VOID TEST(AMF0Test, AnyAssert) @@ -749,7 +894,7 @@ VOID TEST(AMF0Test, AnyAssert)
749 } 894 }
750 } 895 }
751 896
752 -VOID TEST(AMF0Test, ObjectProps) 897 +VOID TEST(AMF0Test, ApiObjectProps)
753 { 898 {
754 SrsAmf0Object* o = NULL; 899 SrsAmf0Object* o = NULL;
755 900
@@ -827,7 +972,7 @@ VOID TEST(AMF0Test, ObjectProps) @@ -827,7 +972,7 @@ VOID TEST(AMF0Test, ObjectProps)
827 } 972 }
828 } 973 }
829 974
830 -VOID TEST(AMF0Test, EcmaArrayProps) 975 +VOID TEST(AMF0Test, ApiEcmaArrayProps)
831 { 976 {
832 SrsAmf0EcmaArray* o = NULL; 977 SrsAmf0EcmaArray* o = NULL;
833 978