📄 testparsercategories.cxx
字号:
assert(buff == stringString); StringCategory copy(str); assert(copy.value() == stringString); str.value() = "foo"; assert(str.value() == "foo"); } { TR _tr( "Test Token parameters"); Token state; state.value() = Data("active"); state.param(p_expires) = 666; cerr << state << endl; } { TR _tr( "StatusLine, with reason code"); Data statusLineString("SIP/2.0 180 Ringing"); HeaderFieldValue hfv(statusLineString.data(), statusLineString.size()); StatusLine statusLine(&hfv, Headers::UNKNOWN); assert(statusLine.responseCode() == 180); cerr << statusLine.reason() << endl; assert(statusLine.reason() == "Ringing"); assert(statusLine.getSipVersion() == "SIP/2.0"); StatusLine copy(statusLine); assert(copy.responseCode() == 180); assert(copy.reason() == "Ringing"); assert(copy.getSipVersion() == "SIP/2.0"); } { Uri foo; // valgrind complains, but the problem moves when closely observed assert(foo.getAor().empty()); }#define checkHeaderName(_name) cerr << Headers::_name << " " << Headers::getHeaderName(Headers::_name) << " = " << #_name << endl /*;assert(isEqualNoCase(Headers::getHeaderName(Headers::_name), #_name))*/ { // test header hash for (int i = Headers::CSeq; i < Headers::MAX_HEADERS; i++) { if (i == Headers::RESIP_DO_NOT_USE) { continue; } Data hdr = Headers::getHeaderName(i); if (!hdr.size()) continue; Data msg("Checking hash of: "); msg += hdr; TR _tr(msg); assert(Headers::getType(Headers::getHeaderName(i).c_str(), Headers::getHeaderName(i).size()) == i); } checkHeaderName(To); checkHeaderName(From); checkHeaderName(Via); checkHeaderName(CallID); checkHeaderName(CSeq); checkHeaderName(Route); checkHeaderName(RecordRoute); checkHeaderName(Contact); checkHeaderName(Subject); checkHeaderName(Expires); checkHeaderName(MaxForwards); checkHeaderName(Accept); checkHeaderName(AcceptEncoding); checkHeaderName(AcceptLanguage); checkHeaderName(AlertInfo); checkHeaderName(Allow); checkHeaderName(AuthenticationInfo); checkHeaderName(CallInfo); checkHeaderName(ContentDisposition); checkHeaderName(ContentEncoding); checkHeaderName(ContentLanguage); checkHeaderName(ContentTransferEncoding); checkHeaderName(ContentType); checkHeaderName(Date); checkHeaderName(InReplyTo); checkHeaderName(MinExpires); checkHeaderName(MIMEVersion); checkHeaderName(Organization); checkHeaderName(Priority); checkHeaderName(ProxyAuthenticate); checkHeaderName(ProxyAuthorization); checkHeaderName(ProxyRequire); checkHeaderName(ReplyTo); checkHeaderName(Require); checkHeaderName(RetryAfter); checkHeaderName(Server); checkHeaderName(SIPETag); checkHeaderName(SIPIfMatch); checkHeaderName(Supported); checkHeaderName(Timestamp); checkHeaderName(Unsupported); checkHeaderName(UserAgent); checkHeaderName(Warning); checkHeaderName(WWWAuthenticate); checkHeaderName(SubscriptionState); checkHeaderName(ReferTo); checkHeaderName(ReferredBy); checkHeaderName(Authorization); checkHeaderName(Replaces); checkHeaderName(Event); checkHeaderName(AllowEvents); checkHeaderName(SecurityClient); checkHeaderName(SecurityServer); checkHeaderName(SecurityVerify); checkHeaderName(ContentLength); checkHeaderName(ContentId); }#define checkParameterName(_name) cerr << ParameterTypes::_name << " " << ParameterTypes::ParameterNames[ParameterTypes::_name] << " = " << #_name << endl/*;assert(isEqualNoCase(ParameterTypes::ParameterNames[ParameterTypes::_name], #_name))*/ { checkParameterName(data); checkParameterName(control); checkParameterName(mobility); checkParameterName(description); checkParameterName(events); checkParameterName(priority); checkParameterName(methods); checkParameterName(schemes); checkParameterName(application); checkParameterName(video); checkParameterName(language); checkParameterName(type); checkParameterName(isFocus); checkParameterName(actor); checkParameterName(text); checkParameterName(extensions); checkParameterName(Instance); checkParameterName(gruu); checkParameterName(transport); checkParameterName(user); checkParameterName(method); checkParameterName(ttl); checkParameterName(maddr); checkParameterName(lr); checkParameterName(q); checkParameterName(purpose); checkParameterName(expires); checkParameterName(handling); checkParameterName(tag); checkParameterName(toTag); checkParameterName(fromTag); checkParameterName(duration); checkParameterName(branch); checkParameterName(received); checkParameterName(comp); checkParameterName(rport); checkParameterName(algorithm); checkParameterName(cnonce); checkParameterName(domain); checkParameterName(id); checkParameterName(nonce); checkParameterName(nc); checkParameterName(opaque); checkParameterName(realm); checkParameterName(response); checkParameterName(stale); checkParameterName(username); checkParameterName(qop); checkParameterName(uri); checkParameterName(retryAfter); checkParameterName(reason); checkParameterName(dAlg); checkParameterName(dQop); checkParameterName(dVer); checkParameterName(smimeType); checkParameterName(name); checkParameterName(filename); checkParameterName(protocol); checkParameterName(micalg); checkParameterName(boundary); checkParameterName(expiration); checkParameterName(size); checkParameterName(permission); checkParameterName(site); checkParameterName(directory); checkParameterName(mode); checkParameterName(server); checkParameterName(charset); checkParameterName(accessType); checkParameterName(profileType); checkParameterName(vendor); checkParameterName(model); checkParameterName(version); checkParameterName(effectiveBy); checkParameterName(document); checkParameterName(appId); checkParameterName(networkUser); checkParameterName(url); // test parameter hash for (int i = 0; i < ParameterTypes::MAX_PARAMETER; i++) { if (i != ParameterTypes::qopOptions && i != ParameterTypes::qop ) { TR _tr( Data("Checking hash of: ") + Data(ParameterTypes::ParameterNames[i])); assert(ParameterTypes::getType(ParameterTypes::ParameterNames[i].c_str(), ParameterTypes::ParameterNames[i].size()) == i); } } assert(ParameterTypes::ParameterNames[ParameterTypes::qop] == "qop"); assert(ParameterTypes::ParameterNames[ParameterTypes::qopOptions] == "qop"); } { TR _tr( "simple Token parse test"); char *org = "WuggaWuggaFoo"; HeaderFieldValue hfv(org, strlen(org)); Token tok(&hfv, Headers::UNKNOWN); assert(tok.value() == org); } { TR _tr( "Token + parameters parse test"); char *org = "WuggaWuggaFoo;ttl=2"; HeaderFieldValue hfv(org, strlen(org)); Token tok(&hfv, Headers::UNKNOWN); assert(tok.value() == "WuggaWuggaFoo"); assert(tok.param(p_ttl) == 2); } { TR _tr( "Test NameAddr(Data) constructor"); Data nad("bob<sips:bob@foo.com>;tag=wd834f"); NameAddr na(nad); assert(na.uri().user() == "bob"); } { TR _tr( "full on via parse"); char *viaString = /* Via: */ " SIP/2.0/UDP a.b.c.com:5000;ttl=3;maddr=1.2.3.4;received=foo.com"; HeaderFieldValue hfv(viaString, strlen(viaString)); Via via(&hfv, Headers::UNKNOWN); assert(via.sentPort() == 5000); assert(via.sentHost() == "a.b.c.com"); assert(via.param(p_maddr) == "1.2.3.4"); }#ifdef USE_IPV6 { TR _tr( "Via assert bug with malformed IPV6 addr [boom]" ); char* viaString = "SIP/2.0/UDP [boom]:5060;branch=z9hG4bKblah"; HeaderFieldValue hfv(viaString, strlen(viaString)); Via via(&hfv, Headers::UNKNOWN); assert(!via.isWellFormed()); } { TR _tr( "Via assert bug with malformed IPV6 addr [:z]" ); char* viaString = "SIP/2.0/UDP [:z]:5060;branch=z9hG4bKblah"; HeaderFieldValue hfv(viaString, strlen(viaString)); Via via(&hfv, Headers::UNKNOWN); assert(!via.isWellFormed()); }#endif { TR _tr("Test poorly formed DataParameter by construction"); char *viaString = /* Via: */ " SIP/2.0/UDP example.com:5000;;tag="; HeaderFieldValue hfv(viaString, strlen(viaString)); try { Via via(&hfv, Headers::UNKNOWN); via.sentPort(); assert(false); } catch (ParseException& e) { cerr << "Caught parse exception for Via" << endl; } } { TR _tr("Test poorly formed UnknownParameter by construction"); char *viaString = /* Via: */ " SIP/2.0/UDP example.com:5000;;foobar="; HeaderFieldValue hfv(viaString, strlen(viaString)); try { Via via(&hfv, Headers::UNKNOWN); via.sentPort(); UnknownParameterType p_foobar("foobar"); via.exists(p_foobar); assert(false); } catch (ParseException& e) { cerr << "Caught parse exception for Via" << endl; } } { TR _tr("Test poorly formed UInt32Parameter by construction"); char *viaString = /* Via: */ " SIP/2.0/UDP example.com:5000;;duration="; HeaderFieldValue hfv(viaString, strlen(viaString)); try { Via via(&hfv, Headers::UNKNOWN); via.sentPort(); assert(false); } catch (ParseException& e) { cerr << "Caught parse exception for Via " << endl; } } { TR _tr("Test poorly formed QuotedDataParameter by construction"); char *viaString = /* Via: */ " SIP/2.0/UDP example.com:5000;;domain=\""; HeaderFieldValue hfv(viaString, strlen(viaString)); try { Via via(&hfv, Headers::UNKNOWN); via.sentPort(); assert(false); } catch (ParseException& e) { cerr << "Caught parse exception for Via " << endl; } }#ifdef USE_IPV6 { TR _tr( "full on via parse, IPV6"); // !dlb! deal with maddr=[5f1b:df00:ce3e:e200:20:800:2b37:6426] char *viaString = /* Via: */ " SIP/2.0/UDP [5f1b:df00:ce3e:e200:20:800:2b37:6426]:5000;ttl=3;maddr=1.2.3.4;received=foo.com"; HeaderFieldValue hfv(viaString, strlen(viaString)); Via via(&hfv, Headers::UNKNOWN); assert(via.sentPort() == 5000); assert(via.sentHost() == "5f1b:df00:ce3e:e200:20:800:2b37:6426"); assert(via.param(p_maddr) == "1.2.3.4"); }#endif { TR _tr( "URI parse"); Data uriString = "sip:bob@foo.com"; ParseBuffer pb(uriString.data(), uriString.size()); NameAddr to; to.parse(pb); Uri& uri = to.uri(); cerr << "!! " << to << endl; assert(uri.scheme() == "sip"); assert(uri.user() == "bob"); assert(uri.host() == "foo.com"); assert(uri.port() == 0); } { TR _tr( "URI parse, no displayName"); Data uriString = "sips:foo.com"; ParseBuffer pb(uriString.data(), uriString.size()); NameAddr to; to.parse(pb); Uri& uri = to.uri(); assert(uri.scheme() == "sips"); assert(uri.user() == ""); assert(uri.host() == "foo.com"); assert(uri.port() == 0); } { TR _tr( "URI parse, parameters"); Data uriString = "sips:bob;param=gargle:password@foo.com"; ParseBuffer pb(uriString.data(), uriString.size()); NameAddr to; to.parse(pb); Uri& uri = to.uri(); assert(uri.scheme() == "sips"); assert(uri.user() == "bob;param=gargle"); assert(uri.password() == "password"); assert(uri.host() == "foo.com"); } { TR _tr( "URI parse, parameters, port"); Data uriString = "sips:bob;param=gargle:password@foo.com:6000"; ParseBuffer pb(uriString.data(), uriString.size()); NameAddr to; to.parse(pb); Uri& uri = to.uri(); assert(uri.scheme() == "sips"); assert(uri.user() == "bob;param=gargle"); assert(uri.password() == "password"); assert(uri.host() == "foo.com"); assert(uri.port() == 6000);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -