Merge pull request #13804 from chrysn-pull-requests/uri-test-isabsolute

uri_parser: Fix and test non-relative recognition
This commit is contained in:
Cenk Gündoğan 2020-04-05 13:42:11 +02:00 committed by GitHub
commit abd399b934
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 6 deletions

View File

@ -219,6 +219,17 @@ bool uri_parser_is_absolute(const char *uri, size_t uri_len)
/* relative */
return false;
}
for (int i = 0; &uri[i] < colon; ++i) {
if (!(((uri[i] >= 'A') && (uri[i] <= 'Z')) ||
((uri[i] >= 'a') && (uri[i] <= 'z')) ||
((uri[i] >= '0') && (uri[i] <= '9')) ||
(uri[i] == '+') ||
(uri[i] == '-') ||
(uri[i] == '.'))) {
/* relative */
return false;
}
}
/* absolute */
return true;

View File

@ -13,6 +13,7 @@
*/
#include <stdio.h>
#include <stdbool.h>
#include "embUnit.h"
#include "uri_parser.h"
@ -20,9 +21,9 @@
#include "unittests-constants.h"
#include "tests-uri_parser.h"
#define VEC(u, s, us, h, po, pa, q, e) \
{ .uri = u, .scheme = s, .userinfo = us, .host = h, .port = po, \
.path = pa, .query = q, .expected = e}
#define VEC(u, f, s, us, h, po, pa, q, e) \
{ .uri = u, .full_uri = f, .scheme = s, .userinfo = us, .host = h, \
.port = po, .path = pa, .query = q, .expected = e}
#define VEC_CHECK(comp, i, vec_msg) \
do { \
@ -51,6 +52,7 @@
typedef struct {
char uri[64];
bool full_uri;
char scheme[8];
char userinfo[16];
char host[16];
@ -65,9 +67,11 @@ typedef struct {
scheme, userinfo, host, port,
path, query, expected return value)
*/
static const validate_t validate_uris[26] = {
static const validate_t validate_uris[27] = {
/* uri to parse */
VEC("coap://RIOT:test@[2001:db8::1]:5683/.well-known/core?v=1",
/* is URI */
true,
/* parsed scheme */
"coap",
/* parsed userinfo */
@ -83,6 +87,7 @@ static const validate_t validate_uris[26] = {
/* expected return value */
0),
VEC("/.well-known/core?v=1",
false,
"",
"",
"",
@ -91,6 +96,7 @@ static const validate_t validate_uris[26] = {
"v=1",
0),
VEC("coap://R@[2001:db8::1]:5own/v=1",
true,
"coap",
"R",
"[2001:db8::1]",
@ -99,6 +105,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("coap://R@[2001:db8::1]:5own/:v=1",
true,
"coap",
"R",
"[2001:db8::1]",
@ -107,6 +114,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("cap://R@[2001:db8::1]:5own/?v=1",
true,
"cap",
"R",
"[2001:db8::1]",
@ -115,6 +123,7 @@ static const validate_t validate_uris[26] = {
"v=1",
0),
VEC("oap://Y2001:db8::1]:5own/av=1",
true,
"oap",
"",
"Y2001:db8::1]",
@ -123,6 +132,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("//Rb[ʰ00J:d/5v=0",
false,
"",
"",
"",
@ -131,6 +141,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("coap://oap://P@[2001:b",
true,
"",
"",
"",
@ -139,6 +150,7 @@ static const validate_t validate_uris[26] = {
"",
-1),
VEC("coap:///R@[2008::1]:5own//R@[2008::1]:5own/?v=1",
true,
"coap",
"",
"",
@ -147,6 +159,7 @@ static const validate_t validate_uris[26] = {
"v=1",
0),
VEC("coaP://R/RZ[2001[8:01[8::1]:5o:1]:5oTMv=1",
true,
"coaP",
"",
"R",
@ -155,6 +168,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("coap://R@////////////////7///v=1",
true,
"",
"",
"",
@ -163,14 +177,16 @@ static const validate_t validate_uris[26] = {
"",
-1),
VEC("coa[:////[2001:db5ow:5own/Ov=1",
"coa[",
false,
"",
"",
"",
"//[2001:db5ow:5own/Ov=1",
"",
"coa[:////[2001:db5ow:5own/Ov=1",
"",
0),
VEC("tel:+1-816-555-1212",
true,
"tel",
"",
"",
@ -179,6 +195,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("sms:+15105550101,+15105550102?body=hello%20there",
true,
"sms",
"",
"",
@ -187,6 +204,7 @@ static const validate_t validate_uris[26] = {
"body=hello%20there",
0),
VEC("a",
false,
"",
"",
"",
@ -195,6 +213,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("mailto:test@example.com",
true,
"mailto",
"",
"",
@ -203,6 +222,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("ftp://ftp.is.co.za/rfc/rfc1808.txt",
true,
"ftp",
"",
"ftp.is.co.za",
@ -211,6 +231,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("http://www.ietf.org/rfc/rfc2396.txt",
true,
"http",
"",
"www.ietf.org",
@ -219,6 +240,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("ldap://[2001:db8::7]/c=GB?objectClass?one",
true,
"ldap",
"",
"[2001:db8::7]",
@ -227,6 +249,7 @@ static const validate_t validate_uris[26] = {
"objectClass?one",
0),
VEC("mailto:John.Doe@example.com",
true,
"mailto",
"",
"",
@ -235,6 +258,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("news:comp.infosystems.www.servers.unix",
true,
"news",
"",
"",
@ -243,6 +267,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("tel:+1-816-555-1212",
true,
"tel",
"",
"",
@ -251,6 +276,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("telnet://192.0.2.16:80/",
true,
"telnet",
"",
"192.0.2.16",
@ -259,6 +285,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("urn:oasis:names:specification:docbook:dtd:xml:4.1.2",
true,
"urn",
"",
"",
@ -267,6 +294,7 @@ static const validate_t validate_uris[26] = {
"",
0),
VEC("",
false,
"",
"",
"",
@ -275,6 +303,7 @@ static const validate_t validate_uris[26] = {
"",
-1),
VEC("/",
false,
"",
"",
"",
@ -282,6 +311,15 @@ static const validate_t validate_uris[26] = {
"/",
"",
0),
VEC("./this:that",
false,
"",
"",
"",
"",
"./this:that",
"",
0),
};
static char _failure_msg[VEC_MSG_LEN];
@ -291,6 +329,8 @@ static void test_uri_parser__validate(void)
uri_parser_result_t ures;
for (unsigned i = 0; i < ARRAY_SIZE(validate_uris); i++) {
int res = uri_parser_process_string(&ures, validate_uris[i].uri);
TEST_ASSERT_EQUAL_INT(validate_uris[i].full_uri,
uri_parser_is_absolute_string(validate_uris[i].uri));
TEST_ASSERT_EQUAL_INT(validate_uris[i].expected, res);
if (res == 0) {
VEC_CHECK(scheme, i, _failure_msg);