FourSuite.cpp 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. /*
  2. * uriparser - RFC 3986 URI parsing library
  3. *
  4. * Copyright (C) 2007, Weijia Song <songweijia@gmail.com>
  5. * Copyright (C) 2007, Sebastian Pipping <sebastian@pipping.org>
  6. *
  7. * This library is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * This library is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this library; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include <gtest/gtest.h>
  22. #include <uriparser/Uri.h>
  23. // All testcases in this file are coming from
  24. // http://cvs.4suite.org/viewcvs/4Suite/test/Lib/test_uri.py
  25. namespace {
  26. bool testAddOrRemoveBaseHelper(const char * ref, const char * base,
  27. const char * expected, bool add = true, bool domainRootMode = false) {
  28. UriParserStateA stateA;
  29. // Base
  30. UriUriA baseUri;
  31. stateA.uri = &baseUri;
  32. int res = uriParseUriA(&stateA, base);
  33. if (res != 0) {
  34. return false;
  35. }
  36. // Rel
  37. UriUriA relUri;
  38. stateA.uri = &relUri;
  39. res = uriParseUriA(&stateA, ref);
  40. if (res != 0) {
  41. uriFreeUriMembersA(&baseUri);
  42. return false;
  43. }
  44. // Expected result
  45. UriUriA expectedUri;
  46. stateA.uri = &expectedUri;
  47. res = uriParseUriA(&stateA, expected);
  48. if (res != 0) {
  49. uriFreeUriMembersA(&baseUri);
  50. uriFreeUriMembersA(&relUri);
  51. uriFreeUriMembersA(&expectedUri);
  52. return false;
  53. }
  54. // Transform
  55. UriUriA transformedUri;
  56. if (add) {
  57. res = uriAddBaseUriA(&transformedUri, &relUri, &baseUri);
  58. } else {
  59. res = uriRemoveBaseUriA(&transformedUri, &relUri, &baseUri,
  60. domainRootMode ? URI_TRUE : URI_FALSE);
  61. }
  62. if (res != 0) {
  63. uriFreeUriMembersA(&baseUri);
  64. uriFreeUriMembersA(&relUri);
  65. uriFreeUriMembersA(&expectedUri);
  66. uriFreeUriMembersA(&transformedUri);
  67. return false;
  68. }
  69. const bool equal = (URI_TRUE == uriEqualsUriA(&transformedUri, &expectedUri));
  70. if (!equal) {
  71. char transformedUriText[1024 * 8];
  72. char expectedUriText[1024 * 8];
  73. uriToStringA(transformedUriText, &transformedUri, 1024 * 8, NULL);
  74. uriToStringA(expectedUriText, &expectedUri, 1024 * 8, NULL);
  75. printf("\n\n\nExpected: \"%s\"\nReceived: \"%s\"\n\n\n", expectedUriText, transformedUriText);
  76. }
  77. uriFreeUriMembersA(&baseUri);
  78. uriFreeUriMembersA(&relUri);
  79. uriFreeUriMembersA(&expectedUri);
  80. uriFreeUriMembersA(&transformedUri);
  81. return equal;
  82. }
  83. } // namespace
  84. TEST(FourSuite, AbsolutizeTestCases) {
  85. const char * const BASE_URI[] = {
  86. "http://a/b/c/d;p?q",
  87. "http://a/b/c/d;p?q=1/2",
  88. "http://a/b/c/d;p=1/2?q",
  89. "fred:///s//a/b/c",
  90. "http:///s//a/b/c"};
  91. // ref, base, exptected
  92. // http://lists.w3.org/Archives/Public/uri/2004Feb/0114.html
  93. ASSERT_TRUE(testAddOrRemoveBaseHelper("../c", "foo:a/b", "foo:c"));
  94. ASSERT_TRUE(testAddOrRemoveBaseHelper("foo:.", "foo:a", "foo:"));
  95. ASSERT_TRUE(testAddOrRemoveBaseHelper("/foo/../../../bar", "zz:abc", "zz:/bar"));
  96. ASSERT_TRUE(testAddOrRemoveBaseHelper("/foo/../bar", "zz:abc", "zz:/bar"));
  97. ASSERT_TRUE(testAddOrRemoveBaseHelper("foo/../../../bar", "zz:abc", "zz:bar"));
  98. ASSERT_TRUE(testAddOrRemoveBaseHelper("foo/../bar", "zz:abc", "zz:bar"));
  99. ASSERT_TRUE(testAddOrRemoveBaseHelper("zz:.", "zz:abc", "zz:"));
  100. ASSERT_TRUE(testAddOrRemoveBaseHelper("/.", BASE_URI[0], "http://a/"));
  101. ASSERT_TRUE(testAddOrRemoveBaseHelper("/.foo", BASE_URI[0], "http://a/.foo"));
  102. ASSERT_TRUE(testAddOrRemoveBaseHelper(".foo", BASE_URI[0], "http://a/b/c/.foo"));
  103. // http://gbiv.com/protocols/uri/test/rel_examples1.html
  104. // examples from RFC 2396
  105. ASSERT_TRUE(testAddOrRemoveBaseHelper("g:h", BASE_URI[0], "g:h"));
  106. ASSERT_TRUE(testAddOrRemoveBaseHelper("g", BASE_URI[0], "http://a/b/c/g"));
  107. ASSERT_TRUE(testAddOrRemoveBaseHelper("./g", BASE_URI[0], "http://a/b/c/g"));
  108. ASSERT_TRUE(testAddOrRemoveBaseHelper("g/", BASE_URI[0], "http://a/b/c/g/"));
  109. ASSERT_TRUE(testAddOrRemoveBaseHelper("/g", BASE_URI[0], "http://a/g"));
  110. ASSERT_TRUE(testAddOrRemoveBaseHelper("//g", BASE_URI[0], "http://g"));
  111. // changed with RFC 2396bis
  112. ASSERT_TRUE(testAddOrRemoveBaseHelper("?y", BASE_URI[0], "http://a/b/c/d;p?y"));
  113. ASSERT_TRUE(testAddOrRemoveBaseHelper("g?y", BASE_URI[0], "http://a/b/c/g?y"));
  114. // changed with RFC 2396bis
  115. ASSERT_TRUE(testAddOrRemoveBaseHelper("#s", BASE_URI[0], "http://a/b/c/d;p?q#s"));
  116. ASSERT_TRUE(testAddOrRemoveBaseHelper("g#s", BASE_URI[0], "http://a/b/c/g#s"));
  117. ASSERT_TRUE(testAddOrRemoveBaseHelper("g?y#s", BASE_URI[0], "http://a/b/c/g?y#s"));
  118. ASSERT_TRUE(testAddOrRemoveBaseHelper(";x", BASE_URI[0], "http://a/b/c/;x"));
  119. ASSERT_TRUE(testAddOrRemoveBaseHelper("g;x", BASE_URI[0], "http://a/b/c/g;x"));
  120. ASSERT_TRUE(testAddOrRemoveBaseHelper("g;x?y#s", BASE_URI[0], "http://a/b/c/g;x?y#s"));
  121. // changed with RFC 2396bis
  122. ASSERT_TRUE(testAddOrRemoveBaseHelper("", BASE_URI[0], "http://a/b/c/d;p?q"));
  123. ASSERT_TRUE(testAddOrRemoveBaseHelper(".", BASE_URI[0], "http://a/b/c/"));
  124. ASSERT_TRUE(testAddOrRemoveBaseHelper("./", BASE_URI[0], "http://a/b/c/"));
  125. ASSERT_TRUE(testAddOrRemoveBaseHelper("..", BASE_URI[0], "http://a/b/"));
  126. ASSERT_TRUE(testAddOrRemoveBaseHelper("../", BASE_URI[0], "http://a/b/"));
  127. ASSERT_TRUE(testAddOrRemoveBaseHelper("../g", BASE_URI[0], "http://a/b/g"));
  128. ASSERT_TRUE(testAddOrRemoveBaseHelper("../..", BASE_URI[0], "http://a/"));
  129. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../", BASE_URI[0], "http://a/"));
  130. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../g", BASE_URI[0], "http://a/g"));
  131. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../../g", BASE_URI[0], "http://a/g")); // http://a/../g
  132. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../../../g", BASE_URI[0], "http://a/g")); // http://a/../../g
  133. // changed with RFC 2396bis
  134. ASSERT_TRUE(testAddOrRemoveBaseHelper("/./g", BASE_URI[0], "http://a/g"));
  135. // changed with RFC 2396bis
  136. ASSERT_TRUE(testAddOrRemoveBaseHelper("/../g", BASE_URI[0], "http://a/g"));
  137. ASSERT_TRUE(testAddOrRemoveBaseHelper("g.", BASE_URI[0], "http://a/b/c/g."));
  138. ASSERT_TRUE(testAddOrRemoveBaseHelper(".g", BASE_URI[0], "http://a/b/c/.g"));
  139. ASSERT_TRUE(testAddOrRemoveBaseHelper("g..", BASE_URI[0], "http://a/b/c/g.."));
  140. ASSERT_TRUE(testAddOrRemoveBaseHelper("..g", BASE_URI[0], "http://a/b/c/..g"));
  141. ASSERT_TRUE(testAddOrRemoveBaseHelper("./../g", BASE_URI[0], "http://a/b/g"));
  142. ASSERT_TRUE(testAddOrRemoveBaseHelper("./g/.", BASE_URI[0], "http://a/b/c/g/"));
  143. ASSERT_TRUE(testAddOrRemoveBaseHelper("g/./h", BASE_URI[0], "http://a/b/c/g/h"));
  144. ASSERT_TRUE(testAddOrRemoveBaseHelper("g/../h", BASE_URI[0], "http://a/b/c/h"));
  145. ASSERT_TRUE(testAddOrRemoveBaseHelper("g;x=1/./y", BASE_URI[0], "http://a/b/c/g;x=1/y"));
  146. ASSERT_TRUE(testAddOrRemoveBaseHelper("g;x=1/../y", BASE_URI[0], "http://a/b/c/y"));
  147. ASSERT_TRUE(testAddOrRemoveBaseHelper("g?y/./x", BASE_URI[0], "http://a/b/c/g?y/./x"));
  148. ASSERT_TRUE(testAddOrRemoveBaseHelper("g?y/../x", BASE_URI[0], "http://a/b/c/g?y/../x"));
  149. ASSERT_TRUE(testAddOrRemoveBaseHelper("g#s/./x", BASE_URI[0], "http://a/b/c/g#s/./x"));
  150. ASSERT_TRUE(testAddOrRemoveBaseHelper("g#s/../x", BASE_URI[0], "http://a/b/c/g#s/../x"));
  151. ASSERT_TRUE(testAddOrRemoveBaseHelper("http:g", BASE_URI[0], "http:g")); // http://a/b/c/g
  152. ASSERT_TRUE(testAddOrRemoveBaseHelper("http:", BASE_URI[0], "http:")); // BASE_URI[0]
  153. // not sure where this one originated
  154. ASSERT_TRUE(testAddOrRemoveBaseHelper("/a/b/c/./../../g", BASE_URI[0], "http://a/a/g"));
  155. // http://gbiv.com/protocols/uri/test/rel_examples2.html
  156. // slashes in base URI's query args
  157. ASSERT_TRUE(testAddOrRemoveBaseHelper("g", BASE_URI[1], "http://a/b/c/g"));
  158. ASSERT_TRUE(testAddOrRemoveBaseHelper("./g", BASE_URI[1], "http://a/b/c/g"));
  159. ASSERT_TRUE(testAddOrRemoveBaseHelper("g/", BASE_URI[1], "http://a/b/c/g/"));
  160. ASSERT_TRUE(testAddOrRemoveBaseHelper("/g", BASE_URI[1], "http://a/g"));
  161. ASSERT_TRUE(testAddOrRemoveBaseHelper("//g", BASE_URI[1], "http://g"));
  162. // changed in RFC 2396bis
  163. // ASSERT_TRUE(testAddOrRemoveBaseHelper("?y", BASE_URI[1], "http://a/b/c/?y"));
  164. ASSERT_TRUE(testAddOrRemoveBaseHelper("?y", BASE_URI[1], "http://a/b/c/d;p?y"));
  165. ASSERT_TRUE(testAddOrRemoveBaseHelper("g?y", BASE_URI[1], "http://a/b/c/g?y"));
  166. ASSERT_TRUE(testAddOrRemoveBaseHelper("g?y/./x", BASE_URI[1], "http://a/b/c/g?y/./x"));
  167. ASSERT_TRUE(testAddOrRemoveBaseHelper("g?y/../x", BASE_URI[1], "http://a/b/c/g?y/../x"));
  168. ASSERT_TRUE(testAddOrRemoveBaseHelper("g#s", BASE_URI[1], "http://a/b/c/g#s"));
  169. ASSERT_TRUE(testAddOrRemoveBaseHelper("g#s/./x", BASE_URI[1], "http://a/b/c/g#s/./x"));
  170. ASSERT_TRUE(testAddOrRemoveBaseHelper("g#s/../x", BASE_URI[1], "http://a/b/c/g#s/../x"));
  171. ASSERT_TRUE(testAddOrRemoveBaseHelper("./", BASE_URI[1], "http://a/b/c/"));
  172. ASSERT_TRUE(testAddOrRemoveBaseHelper("../", BASE_URI[1], "http://a/b/"));
  173. ASSERT_TRUE(testAddOrRemoveBaseHelper("../g", BASE_URI[1], "http://a/b/g"));
  174. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../", BASE_URI[1], "http://a/"));
  175. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../g", BASE_URI[1], "http://a/g"));
  176. // http://gbiv.com/protocols/uri/test/rel_examples3.html
  177. // slashes in path params
  178. // all of these changed in RFC 2396bis
  179. ASSERT_TRUE(testAddOrRemoveBaseHelper("g", BASE_URI[2], "http://a/b/c/d;p=1/g"));
  180. ASSERT_TRUE(testAddOrRemoveBaseHelper("./g", BASE_URI[2], "http://a/b/c/d;p=1/g"));
  181. ASSERT_TRUE(testAddOrRemoveBaseHelper("g/", BASE_URI[2], "http://a/b/c/d;p=1/g/"));
  182. ASSERT_TRUE(testAddOrRemoveBaseHelper("g?y", BASE_URI[2], "http://a/b/c/d;p=1/g?y"));
  183. ASSERT_TRUE(testAddOrRemoveBaseHelper(";x", BASE_URI[2], "http://a/b/c/d;p=1/;x"));
  184. ASSERT_TRUE(testAddOrRemoveBaseHelper("g;x", BASE_URI[2], "http://a/b/c/d;p=1/g;x"));
  185. ASSERT_TRUE(testAddOrRemoveBaseHelper("g;x=1/./y", BASE_URI[2], "http://a/b/c/d;p=1/g;x=1/y"));
  186. ASSERT_TRUE(testAddOrRemoveBaseHelper("g;x=1/../y", BASE_URI[2], "http://a/b/c/d;p=1/y"));
  187. ASSERT_TRUE(testAddOrRemoveBaseHelper("./", BASE_URI[2], "http://a/b/c/d;p=1/"));
  188. ASSERT_TRUE(testAddOrRemoveBaseHelper("../", BASE_URI[2], "http://a/b/c/"));
  189. ASSERT_TRUE(testAddOrRemoveBaseHelper("../g", BASE_URI[2], "http://a/b/c/g"));
  190. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../", BASE_URI[2], "http://a/b/"));
  191. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../g", BASE_URI[2], "http://a/b/g"));
  192. // http://gbiv.com/protocols/uri/test/rel_examples4.html
  193. // double and triple slash, unknown scheme
  194. ASSERT_TRUE(testAddOrRemoveBaseHelper("g:h", BASE_URI[3], "g:h"));
  195. ASSERT_TRUE(testAddOrRemoveBaseHelper("g", BASE_URI[3], "fred:///s//a/b/g"));
  196. ASSERT_TRUE(testAddOrRemoveBaseHelper("./g", BASE_URI[3], "fred:///s//a/b/g"));
  197. ASSERT_TRUE(testAddOrRemoveBaseHelper("g/", BASE_URI[3], "fred:///s//a/b/g/"));
  198. ASSERT_TRUE(testAddOrRemoveBaseHelper("/g", BASE_URI[3], "fred:///g")); // may change to fred:///s//a/g
  199. ASSERT_TRUE(testAddOrRemoveBaseHelper("//g", BASE_URI[3], "fred://g")); // may change to fred:///s//g
  200. ASSERT_TRUE(testAddOrRemoveBaseHelper("//g/x", BASE_URI[3], "fred://g/x")); // may change to fred:///s//g/x
  201. ASSERT_TRUE(testAddOrRemoveBaseHelper("///g", BASE_URI[3], "fred:///g"));
  202. ASSERT_TRUE(testAddOrRemoveBaseHelper("./", BASE_URI[3], "fred:///s//a/b/"));
  203. ASSERT_TRUE(testAddOrRemoveBaseHelper("../", BASE_URI[3], "fred:///s//a/"));
  204. ASSERT_TRUE(testAddOrRemoveBaseHelper("../g", BASE_URI[3], "fred:///s//a/g"));
  205. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../", BASE_URI[3], "fred:///s//")); // may change to fred:///s//a/../
  206. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../g", BASE_URI[3], "fred:///s//g")); // may change to fred:///s//a/../g
  207. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../../g", BASE_URI[3], "fred:///s/g")); // may change to fred:///s//a/../../g
  208. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../../../g", BASE_URI[3], "fred:///g")); // may change to fred:///s//a/../../../g
  209. // http://gbiv.com/protocols/uri/test/rel_examples5.html
  210. // double and triple slash, well-known scheme
  211. ASSERT_TRUE(testAddOrRemoveBaseHelper("g:h", BASE_URI[4], "g:h"));
  212. ASSERT_TRUE(testAddOrRemoveBaseHelper("g", BASE_URI[4], "http:///s//a/b/g"));
  213. ASSERT_TRUE(testAddOrRemoveBaseHelper("./g", BASE_URI[4], "http:///s//a/b/g"));
  214. ASSERT_TRUE(testAddOrRemoveBaseHelper("g/", BASE_URI[4], "http:///s//a/b/g/"));
  215. ASSERT_TRUE(testAddOrRemoveBaseHelper("/g", BASE_URI[4], "http:///g")); // may change to http:///s//a/g
  216. ASSERT_TRUE(testAddOrRemoveBaseHelper("//g", BASE_URI[4], "http://g")); // may change to http:///s//g
  217. ASSERT_TRUE(testAddOrRemoveBaseHelper("//g/x", BASE_URI[4], "http://g/x")); // may change to http:///s//g/x
  218. ASSERT_TRUE(testAddOrRemoveBaseHelper("///g", BASE_URI[4], "http:///g"));
  219. ASSERT_TRUE(testAddOrRemoveBaseHelper("./", BASE_URI[4], "http:///s//a/b/"));
  220. ASSERT_TRUE(testAddOrRemoveBaseHelper("../", BASE_URI[4], "http:///s//a/"));
  221. ASSERT_TRUE(testAddOrRemoveBaseHelper("../g", BASE_URI[4], "http:///s//a/g"));
  222. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../", BASE_URI[4], "http:///s//")); // may change to http:///s//a/../
  223. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../g", BASE_URI[4], "http:///s//g")); // may change to http:///s//a/../g
  224. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../../g", BASE_URI[4], "http:///s/g")); // may change to http:///s//a/../../g
  225. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../../../g", BASE_URI[4], "http:///g")); // may change to http:///s//a/../../../g
  226. // from Dan Connelly's tests in http://www.w3.org/2000/10/swap/uripath.py
  227. ASSERT_TRUE(testAddOrRemoveBaseHelper("bar:abc", "foo:xyz", "bar:abc"));
  228. ASSERT_TRUE(testAddOrRemoveBaseHelper("../abc", "http://example/x/y/z", "http://example/x/abc"));
  229. ASSERT_TRUE(testAddOrRemoveBaseHelper("http://example/x/abc", "http://example2/x/y/z", "http://example/x/abc"));
  230. ASSERT_TRUE(testAddOrRemoveBaseHelper("../r", "http://ex/x/y/z", "http://ex/x/r"));
  231. ASSERT_TRUE(testAddOrRemoveBaseHelper("q/r", "http://ex/x/y", "http://ex/x/q/r"));
  232. ASSERT_TRUE(testAddOrRemoveBaseHelper("q/r#s", "http://ex/x/y", "http://ex/x/q/r#s"));
  233. ASSERT_TRUE(testAddOrRemoveBaseHelper("q/r#s/t", "http://ex/x/y", "http://ex/x/q/r#s/t"));
  234. ASSERT_TRUE(testAddOrRemoveBaseHelper("ftp://ex/x/q/r", "http://ex/x/y", "ftp://ex/x/q/r"));
  235. ASSERT_TRUE(testAddOrRemoveBaseHelper("", "http://ex/x/y", "http://ex/x/y"));
  236. ASSERT_TRUE(testAddOrRemoveBaseHelper("", "http://ex/x/y/", "http://ex/x/y/"));
  237. ASSERT_TRUE(testAddOrRemoveBaseHelper("", "http://ex/x/y/pdq", "http://ex/x/y/pdq"));
  238. ASSERT_TRUE(testAddOrRemoveBaseHelper("z/", "http://ex/x/y/", "http://ex/x/y/z/"));
  239. ASSERT_TRUE(testAddOrRemoveBaseHelper("#Animal", "file:/swap/test/animal.rdf", "file:/swap/test/animal.rdf#Animal"));
  240. ASSERT_TRUE(testAddOrRemoveBaseHelper("../abc", "file:/e/x/y/z", "file:/e/x/abc"));
  241. ASSERT_TRUE(testAddOrRemoveBaseHelper("/example/x/abc", "file:/example2/x/y/z", "file:/example/x/abc"));
  242. ASSERT_TRUE(testAddOrRemoveBaseHelper("../r", "file:/ex/x/y/z", "file:/ex/x/r"));
  243. ASSERT_TRUE(testAddOrRemoveBaseHelper("/r", "file:/ex/x/y/z", "file:/r"));
  244. ASSERT_TRUE(testAddOrRemoveBaseHelper("q/r", "file:/ex/x/y", "file:/ex/x/q/r"));
  245. ASSERT_TRUE(testAddOrRemoveBaseHelper("q/r#s", "file:/ex/x/y", "file:/ex/x/q/r#s"));
  246. ASSERT_TRUE(testAddOrRemoveBaseHelper("q/r#", "file:/ex/x/y", "file:/ex/x/q/r#"));
  247. ASSERT_TRUE(testAddOrRemoveBaseHelper("q/r#s/t", "file:/ex/x/y", "file:/ex/x/q/r#s/t"));
  248. ASSERT_TRUE(testAddOrRemoveBaseHelper("ftp://ex/x/q/r", "file:/ex/x/y", "ftp://ex/x/q/r"));
  249. ASSERT_TRUE(testAddOrRemoveBaseHelper("", "file:/ex/x/y", "file:/ex/x/y"));
  250. ASSERT_TRUE(testAddOrRemoveBaseHelper("", "file:/ex/x/y/", "file:/ex/x/y/"));
  251. ASSERT_TRUE(testAddOrRemoveBaseHelper("", "file:/ex/x/y/pdq", "file:/ex/x/y/pdq"));
  252. ASSERT_TRUE(testAddOrRemoveBaseHelper("z/", "file:/ex/x/y/", "file:/ex/x/y/z/"));
  253. ASSERT_TRUE(testAddOrRemoveBaseHelper("file://meetings.example.com/cal#m1", "file:/devel/WWW/2000/10/swap/test/reluri-1.n3", "file://meetings.example.com/cal#m1"));
  254. ASSERT_TRUE(testAddOrRemoveBaseHelper("file://meetings.example.com/cal#m1", "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3", "file://meetings.example.com/cal#m1"));
  255. ASSERT_TRUE(testAddOrRemoveBaseHelper("./#blort", "file:/some/dir/foo", "file:/some/dir/#blort"));
  256. ASSERT_TRUE(testAddOrRemoveBaseHelper("./#", "file:/some/dir/foo", "file:/some/dir/#"));
  257. // Ryan Lee
  258. ASSERT_TRUE(testAddOrRemoveBaseHelper("./", "http://example/x/abc.efg", "http://example/x/"));
  259. // Graham Klyne's tests
  260. // http://www.ninebynine.org/Software/HaskellUtils/Network/UriTest.xls
  261. // 01-31 are from Connelly's cases
  262. // 32-49
  263. ASSERT_TRUE(testAddOrRemoveBaseHelper("./q:r", "http://ex/x/y", "http://ex/x/q:r"));
  264. ASSERT_TRUE(testAddOrRemoveBaseHelper("./p=q:r", "http://ex/x/y", "http://ex/x/p=q:r"));
  265. ASSERT_TRUE(testAddOrRemoveBaseHelper("?pp/rr", "http://ex/x/y?pp/qq", "http://ex/x/y?pp/rr"));
  266. ASSERT_TRUE(testAddOrRemoveBaseHelper("y/z", "http://ex/x/y?pp/qq", "http://ex/x/y/z"));
  267. ASSERT_TRUE(testAddOrRemoveBaseHelper("local/qual@domain.org#frag", "mailto:local", "mailto:local/qual@domain.org#frag"));
  268. ASSERT_TRUE(testAddOrRemoveBaseHelper("more/qual2@domain2.org#frag", "mailto:local/qual1@domain1.org", "mailto:local/more/qual2@domain2.org#frag"));
  269. ASSERT_TRUE(testAddOrRemoveBaseHelper("y?q", "http://ex/x/y?q", "http://ex/x/y?q"));
  270. ASSERT_TRUE(testAddOrRemoveBaseHelper("/x/y?q", "http://ex?p", "http://ex/x/y?q"));
  271. ASSERT_TRUE(testAddOrRemoveBaseHelper("c/d", "foo:a/b", "foo:a/c/d"));
  272. ASSERT_TRUE(testAddOrRemoveBaseHelper("/c/d", "foo:a/b", "foo:/c/d"));
  273. ASSERT_TRUE(testAddOrRemoveBaseHelper("", "foo:a/b?c#d", "foo:a/b?c"));
  274. ASSERT_TRUE(testAddOrRemoveBaseHelper("b/c", "foo:a", "foo:b/c"));
  275. ASSERT_TRUE(testAddOrRemoveBaseHelper("../b/c", "foo:/a/y/z", "foo:/a/b/c"));
  276. ASSERT_TRUE(testAddOrRemoveBaseHelper("./b/c", "foo:a", "foo:b/c"));
  277. ASSERT_TRUE(testAddOrRemoveBaseHelper("/./b/c", "foo:a", "foo:/b/c"));
  278. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../d", "foo://a//b/c", "foo://a/d"));
  279. ASSERT_TRUE(testAddOrRemoveBaseHelper(".", "foo:a", "foo:"));
  280. ASSERT_TRUE(testAddOrRemoveBaseHelper("..", "foo:a", "foo:"));
  281. // 50-57 (cf. TimBL comments --
  282. // http://lists.w3.org/Archives/Public/uri/2003Feb/0028.html,
  283. // http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html)
  284. ASSERT_TRUE(testAddOrRemoveBaseHelper("abc", "http://example/x/y%2Fz", "http://example/x/abc"));
  285. ASSERT_TRUE(testAddOrRemoveBaseHelper("../../x%2Fabc", "http://example/a/x/y/z", "http://example/a/x%2Fabc"));
  286. ASSERT_TRUE(testAddOrRemoveBaseHelper("../x%2Fabc", "http://example/a/x/y%2Fz", "http://example/a/x%2Fabc"));
  287. ASSERT_TRUE(testAddOrRemoveBaseHelper("abc", "http://example/x%2Fy/z", "http://example/x%2Fy/abc"));
  288. ASSERT_TRUE(testAddOrRemoveBaseHelper("q%3Ar", "http://ex/x/y", "http://ex/x/q%3Ar"));
  289. ASSERT_TRUE(testAddOrRemoveBaseHelper("/x%2Fabc", "http://example/x/y%2Fz", "http://example/x%2Fabc"));
  290. ASSERT_TRUE(testAddOrRemoveBaseHelper("/x%2Fabc", "http://example/x/y/z", "http://example/x%2Fabc"));
  291. ASSERT_TRUE(testAddOrRemoveBaseHelper("/x%2Fabc", "http://example/x/y%2Fz", "http://example/x%2Fabc"));
  292. // 70-77
  293. ASSERT_TRUE(testAddOrRemoveBaseHelper("local2@domain2", "mailto:local1@domain1?query1", "mailto:local2@domain2"));
  294. ASSERT_TRUE(testAddOrRemoveBaseHelper("local2@domain2?query2", "mailto:local1@domain1", "mailto:local2@domain2?query2"));
  295. ASSERT_TRUE(testAddOrRemoveBaseHelper("local2@domain2?query2", "mailto:local1@domain1?query1", "mailto:local2@domain2?query2"));
  296. ASSERT_TRUE(testAddOrRemoveBaseHelper("?query2", "mailto:local@domain?query1", "mailto:local@domain?query2"));
  297. ASSERT_TRUE(testAddOrRemoveBaseHelper("local@domain?query2", "mailto:?query1", "mailto:local@domain?query2"));
  298. ASSERT_TRUE(testAddOrRemoveBaseHelper("?query2", "mailto:local@domain?query1", "mailto:local@domain?query2"));
  299. ASSERT_TRUE(testAddOrRemoveBaseHelper("http://example/a/b?c/../d", "foo:bar", "http://example/a/b?c/../d"));
  300. ASSERT_TRUE(testAddOrRemoveBaseHelper("http://example/a/b#c/../d", "foo:bar", "http://example/a/b#c/../d"));
  301. // 82-88
  302. ASSERT_TRUE(testAddOrRemoveBaseHelper("http:this", "http://example.org/base/uri", "http:this"));
  303. ASSERT_TRUE(testAddOrRemoveBaseHelper("http:this", "http:base", "http:this"));
  304. // Whole in the URI spec, see http://lists.w3.org/Archives/Public/uri/2007Aug/0003.html
  305. // ASSERT_TRUE(testAddOrRemoveBaseHelper(".//g", "f:/a", "f://g")); // ORIGINAL
  306. ASSERT_TRUE(testAddOrRemoveBaseHelper(".//g", "f:/a", "f:/.//g")); // FIXED ONE
  307. ASSERT_TRUE(testAddOrRemoveBaseHelper("b/c//d/e", "f://example.org/base/a", "f://example.org/base/b/c//d/e"));
  308. ASSERT_TRUE(testAddOrRemoveBaseHelper("m2@example.ord/c2@example.org", "mid:m@example.ord/c@example.org", "mid:m@example.ord/m2@example.ord/c2@example.org"));
  309. ASSERT_TRUE(testAddOrRemoveBaseHelper("mini1.xml", "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/", "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/mini1.xml"));
  310. ASSERT_TRUE(testAddOrRemoveBaseHelper("../b/c", "foo:a/y/z", "foo:a/b/c"));
  311. }
  312. TEST(FourSuite, RelativizeTestCases) {
  313. const bool REMOVE_MODE = false;
  314. const bool DOMAIN_ROOT_MODE = true;
  315. // to convert, base, exptected
  316. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c", "s://ex/a/d", "b/c", REMOVE_MODE));
  317. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/b/b/c", "s://ex/a/d", "/b/b/c", REMOVE_MODE, DOMAIN_ROOT_MODE));
  318. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c", "s://ex/a/b/", "c", REMOVE_MODE));
  319. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://other.ex/a/b/", "s://ex/a/d", "//other.ex/a/b/", REMOVE_MODE));
  320. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c", "s://other.ex/a/d", "//ex/a/b/c", REMOVE_MODE));
  321. ASSERT_TRUE(testAddOrRemoveBaseHelper("t://ex/a/b/c", "s://ex/a/d", "t://ex/a/b/c", REMOVE_MODE));
  322. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c", "t://ex/a/d", "s://ex/a/b/c", REMOVE_MODE));
  323. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a", "s://ex/b/c/d", "/a", REMOVE_MODE, DOMAIN_ROOT_MODE));
  324. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/b/c/d", "s://ex/a", "b/c/d", REMOVE_MODE));
  325. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c?h", "s://ex/a/d?w", "b/c?h", REMOVE_MODE));
  326. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c#h", "s://ex/a/d#w", "b/c#h", REMOVE_MODE));
  327. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c?h#i", "s://ex/a/d?w#j", "b/c?h#i", REMOVE_MODE));
  328. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a#i", "s://ex/a", "#i", REMOVE_MODE));
  329. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a?i", "s://ex/a", "?i", REMOVE_MODE));
  330. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/", "s://ex/a/b/", "", REMOVE_MODE));
  331. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b", "s://ex/a/b", "", REMOVE_MODE));
  332. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/", "s://ex/", "", REMOVE_MODE));
  333. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c", "s://ex/a/d/c", "../b/c", REMOVE_MODE));
  334. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c/", "s://ex/a/d/c", "../b/c/", REMOVE_MODE));
  335. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c/d", "s://ex/a/d/c/d", "../../b/c/d", REMOVE_MODE));
  336. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/c", "s://ex/d/e/f", "/a/b/c", REMOVE_MODE, DOMAIN_ROOT_MODE));
  337. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b/", "s://ex/a/c/d/e", "../../b/", REMOVE_MODE));
  338. // Some tests to ensure that empty path segments don't cause problems.
  339. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/b", "s://ex/a//b/c", "../../b", REMOVE_MODE));
  340. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a///b", "s://ex/a/", ".///b", REMOVE_MODE));
  341. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a/", "s://ex/a///b", "../../", REMOVE_MODE));
  342. ASSERT_TRUE(testAddOrRemoveBaseHelper("s://ex/a//b/c", "s://ex/a/b", ".//b/c", REMOVE_MODE));
  343. }
  344. namespace {
  345. int testParseUri(const char * uriText, const char ** expectedErrorPos = NULL) {
  346. UriParserStateA state;
  347. UriUriA uri;
  348. state.uri = &uri;
  349. int res = uriParseUriA(&state, uriText);
  350. if (expectedErrorPos != NULL) {
  351. *expectedErrorPos = state.errorPos;
  352. }
  353. uriFreeUriMembersA(&uri);
  354. return res;
  355. }
  356. bool testGoodUri(const char * uriText) {
  357. return (testParseUri(uriText) == 0);
  358. }
  359. bool testBadUri(const char * uriText, int expectedErrorOffset = -1) {
  360. const char * errorPos = NULL;
  361. const int ret = testParseUri(uriText, &errorPos);
  362. return ((ret == URI_ERROR_SYNTAX)
  363. && (errorPos != NULL)
  364. && (
  365. (expectedErrorOffset == -1)
  366. || (errorPos == (uriText + expectedErrorOffset))
  367. ));
  368. }
  369. } // namespace
  370. TEST(FourSuite, GoodUriReferences) {
  371. ASSERT_TRUE(testGoodUri("file:///foo/bar"));
  372. ASSERT_TRUE(testGoodUri("mailto:user@host?subject=blah"));
  373. ASSERT_TRUE(testGoodUri("dav:")); // empty opaque part / rel-path allowed by RFC 2396bis
  374. ASSERT_TRUE(testGoodUri("about:")); // empty opaque part / rel-path allowed by RFC 2396bis
  375. // the following test cases are from a Perl script by David A. Wheeler
  376. // at http://www.dwheeler.com/secure-programs/url.pl
  377. ASSERT_TRUE(testGoodUri("http://www.yahoo.com"));
  378. ASSERT_TRUE(testGoodUri("http://www.yahoo.com/"));
  379. ASSERT_TRUE(testGoodUri("http://1.2.3.4/"));
  380. ASSERT_TRUE(testGoodUri("http://www.yahoo.com/stuff"));
  381. ASSERT_TRUE(testGoodUri("http://www.yahoo.com/stuff/"));
  382. ASSERT_TRUE(testGoodUri("http://www.yahoo.com/hello%20world/"));
  383. ASSERT_TRUE(testGoodUri("http://www.yahoo.com?name=obi"));
  384. ASSERT_TRUE(testGoodUri("http://www.yahoo.com?name=obi+wan&status=jedi"));
  385. ASSERT_TRUE(testGoodUri("http://www.yahoo.com?onery"));
  386. ASSERT_TRUE(testGoodUri("http://www.yahoo.com#bottom"));
  387. ASSERT_TRUE(testGoodUri("http://www.yahoo.com/yelp.html#bottom"));
  388. ASSERT_TRUE(testGoodUri("https://www.yahoo.com/"));
  389. ASSERT_TRUE(testGoodUri("ftp://www.yahoo.com/"));
  390. ASSERT_TRUE(testGoodUri("ftp://www.yahoo.com/hello"));
  391. ASSERT_TRUE(testGoodUri("demo.txt"));
  392. ASSERT_TRUE(testGoodUri("demo/hello.txt"));
  393. ASSERT_TRUE(testGoodUri("demo/hello.txt?query=hello#fragment"));
  394. ASSERT_TRUE(testGoodUri("/cgi-bin/query?query=hello#fragment"));
  395. ASSERT_TRUE(testGoodUri("/demo.txt"));
  396. ASSERT_TRUE(testGoodUri("/hello/demo.txt"));
  397. ASSERT_TRUE(testGoodUri("hello/demo.txt"));
  398. ASSERT_TRUE(testGoodUri("/"));
  399. ASSERT_TRUE(testGoodUri(""));
  400. ASSERT_TRUE(testGoodUri("#"));
  401. ASSERT_TRUE(testGoodUri("#here"));
  402. // Wheeler's script says these are invalid, but they aren't
  403. ASSERT_TRUE(testGoodUri("http://www.yahoo.com?name=%00%01"));
  404. ASSERT_TRUE(testGoodUri("http://www.yaho%6f.com"));
  405. ASSERT_TRUE(testGoodUri("http://www.yahoo.com/hello%00world/"));
  406. ASSERT_TRUE(testGoodUri("http://www.yahoo.com/hello+world/"));
  407. ASSERT_TRUE(testGoodUri("http://www.yahoo.com?name=obi&"));
  408. ASSERT_TRUE(testGoodUri("http://www.yahoo.com?name=obi&type="));
  409. ASSERT_TRUE(testGoodUri("http://www.yahoo.com/yelp.html#"));
  410. ASSERT_TRUE(testGoodUri("//"));
  411. // the following test cases are from a Haskell program by Graham Klyne
  412. // at http://www.ninebynine.org/Software/HaskellUtils/Network/URITest.hs
  413. ASSERT_TRUE(testGoodUri("http://example.org/aaa/bbb#ccc"));
  414. ASSERT_TRUE(testGoodUri("mailto:local@domain.org"));
  415. ASSERT_TRUE(testGoodUri("mailto:local@domain.org#frag"));
  416. ASSERT_TRUE(testGoodUri("HTTP://EXAMPLE.ORG/AAA/BBB#CCC"));
  417. ASSERT_TRUE(testGoodUri("//example.org/aaa/bbb#ccc"));
  418. ASSERT_TRUE(testGoodUri("/aaa/bbb#ccc"));
  419. ASSERT_TRUE(testGoodUri("bbb#ccc"));
  420. ASSERT_TRUE(testGoodUri("#ccc"));
  421. ASSERT_TRUE(testGoodUri("#"));
  422. ASSERT_TRUE(testGoodUri("A'C"));
  423. // escapes
  424. ASSERT_TRUE(testGoodUri("http://example.org/aaa%2fbbb#ccc"));
  425. ASSERT_TRUE(testGoodUri("http://example.org/aaa%2Fbbb#ccc"));
  426. ASSERT_TRUE(testGoodUri("%2F"));
  427. ASSERT_TRUE(testGoodUri("aaa%2Fbbb"));
  428. // ports
  429. ASSERT_TRUE(testGoodUri("http://example.org:80/aaa/bbb#ccc"));
  430. ASSERT_TRUE(testGoodUri("http://example.org:/aaa/bbb#ccc"));
  431. ASSERT_TRUE(testGoodUri("http://example.org./aaa/bbb#ccc"));
  432. ASSERT_TRUE(testGoodUri("http://example.123./aaa/bbb#ccc"));
  433. // bare authority
  434. ASSERT_TRUE(testGoodUri("http://example.org"));
  435. // IPv6 literals (from RFC2732):
  436. ASSERT_TRUE(testGoodUri("http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html"));
  437. ASSERT_TRUE(testGoodUri("http://[1080:0:0:0:8:800:200C:417A]/index.html"));
  438. ASSERT_TRUE(testGoodUri("http://[3ffe:2a00:100:7031::1]"));
  439. ASSERT_TRUE(testGoodUri("http://[1080::8:800:200C:417A]/foo"));
  440. ASSERT_TRUE(testGoodUri("http://[::192.9.5.5]/ipng"));
  441. ASSERT_TRUE(testGoodUri("http://[::FFFF:129.144.52.38]:80/index.html"));
  442. ASSERT_TRUE(testGoodUri("http://[2010:836B:4179::836B:4179]"));
  443. ASSERT_TRUE(testGoodUri("//[2010:836B:4179::836B:4179]"));
  444. // Random other things that crop up
  445. ASSERT_TRUE(testGoodUri("http://example/Andr&#567;"));
  446. ASSERT_TRUE(testGoodUri("file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"));
  447. }
  448. TEST(FourSuite, BadUriReferences) {
  449. ASSERT_TRUE(testBadUri("beepbeep\x07\x07", 8));
  450. ASSERT_TRUE(testBadUri("\n", 0));
  451. ASSERT_TRUE(testBadUri("::", 0)); // not OK, per Roy Fielding on the W3C uri list on 2004-04-01
  452. // the following test cases are from a Perl script by David A. Wheeler
  453. // at http://www.dwheeler.com/secure-programs/url.pl
  454. ASSERT_TRUE(testBadUri("http://www yahoo.com", 10));
  455. ASSERT_TRUE(testBadUri("http://www.yahoo.com/hello world/", 26));
  456. ASSERT_TRUE(testBadUri("http://www.yahoo.com/yelp.html#\"", 31));
  457. // the following test cases are from a Haskell program by Graham Klyne
  458. // at http://www.ninebynine.org/Software/HaskellUtils/Network/URITest.hs
  459. ASSERT_TRUE(testBadUri("[2010:836B:4179::836B:4179]", 0));
  460. ASSERT_TRUE(testBadUri(" ", 0));
  461. ASSERT_TRUE(testBadUri("%", 1));
  462. ASSERT_TRUE(testBadUri("A%Z", 2));
  463. ASSERT_TRUE(testBadUri("%ZZ", 1));
  464. ASSERT_TRUE(testBadUri("%AZ", 2));
  465. ASSERT_TRUE(testBadUri("A C", 1));
  466. ASSERT_TRUE(testBadUri("A\\'C", 1)); // r"A\'C"
  467. ASSERT_TRUE(testBadUri("A`C", 1));
  468. ASSERT_TRUE(testBadUri("A<C", 1));
  469. ASSERT_TRUE(testBadUri("A>C", 1));
  470. ASSERT_TRUE(testBadUri("A^C", 1));
  471. ASSERT_TRUE(testBadUri("A\\\\C", 1)); // r'A\\C'
  472. ASSERT_TRUE(testBadUri("A{C", 1));
  473. ASSERT_TRUE(testBadUri("A|C", 1));
  474. ASSERT_TRUE(testBadUri("A}C", 1));
  475. ASSERT_TRUE(testBadUri("A[C", 1));
  476. ASSERT_TRUE(testBadUri("A]C", 1));
  477. ASSERT_TRUE(testBadUri("A[**]C", 1));
  478. ASSERT_TRUE(testBadUri("http://[xyz]/", 8));
  479. ASSERT_TRUE(testBadUri("http://]/", 7));
  480. ASSERT_TRUE(testBadUri("http://example.org/[2010:836B:4179::836B:4179]", 19));
  481. ASSERT_TRUE(testBadUri("http://example.org/abc#[2010:836B:4179::836B:4179]", 23));
  482. ASSERT_TRUE(testBadUri("http://example.org/xxx/[qwerty]#a[b]", 23));
  483. // from a post to the W3C uri list on 2004-02-17
  484. // breaks at 22 instead of 17 because everything up to that point is a valid userinfo
  485. ASSERT_TRUE(testBadUri("http://w3c.org:80path1/path2", 22));
  486. }
  487. namespace {
  488. bool normalizeAndCompare(const char * uriText,
  489. const char * expectedNormalized) {
  490. UriParserStateA stateA;
  491. int res;
  492. UriUriA testUri;
  493. stateA.uri = &testUri;
  494. res = uriParseUriA(&stateA, uriText);
  495. if (res != 0) {
  496. uriFreeUriMembersA(&testUri);
  497. return false;
  498. }
  499. // Expected result
  500. UriUriA expectedUri;
  501. stateA.uri = &expectedUri;
  502. res = uriParseUriA(&stateA, expectedNormalized);
  503. if (res != 0) {
  504. uriFreeUriMembersA(&testUri);
  505. uriFreeUriMembersA(&expectedUri);
  506. return false;
  507. }
  508. res = uriNormalizeSyntaxA(&testUri);
  509. if (res != 0) {
  510. uriFreeUriMembersA(&testUri);
  511. uriFreeUriMembersA(&expectedUri);
  512. return false;
  513. }
  514. const bool equalAfter = (URI_TRUE == uriEqualsUriA(&testUri, &expectedUri));
  515. uriFreeUriMembersA(&testUri);
  516. uriFreeUriMembersA(&expectedUri);
  517. return equalAfter;
  518. }
  519. } // namespace
  520. TEST(FourSuite, CaseNormalizationTests) {
  521. ASSERT_TRUE(normalizeAndCompare("HTTP://www.EXAMPLE.com/", "http://www.example.com/"));
  522. ASSERT_TRUE(normalizeAndCompare("example://A/b/c/%7bfoo%7d", "example://a/b/c/%7Bfoo%7D"));
  523. }
  524. TEST(FourSuite, PctEncNormalizationTests) {
  525. ASSERT_TRUE(normalizeAndCompare("http://host/%7Euser/x/y/z", "http://host/~user/x/y/z"));
  526. ASSERT_TRUE(normalizeAndCompare("http://host/%7euser/x/y/z", "http://host/~user/x/y/z"));
  527. }
  528. TEST(FourSuite, PathSegmentNormalizationTests) {
  529. ASSERT_TRUE(normalizeAndCompare("/a/b/../../c", "/c"));
  530. // ASSERT_TRUE(normalizeAndCompare("a/b/../../c", "a/b/../../c"));
  531. // Fixed:
  532. ASSERT_TRUE(normalizeAndCompare("a/b/../../c", "c"));
  533. ASSERT_TRUE(normalizeAndCompare("/a/b/././c", "/a/b/c"));
  534. // ASSERT_TRUE(normalizeAndCompare("a/b/././c", "a/b/././c"));
  535. // Fixed:
  536. ASSERT_TRUE(normalizeAndCompare("a/b/././c", "a/b/c"));
  537. ASSERT_TRUE(normalizeAndCompare("/a/b/../c/././d", "/a/c/d"));
  538. // ASSERT_TRUE(normalizeAndCompare("a/b/../c/././d", "a/b/../c/././d"));
  539. // Fixed:
  540. ASSERT_TRUE(normalizeAndCompare("a/b/../c/././d", "a/c/d"));
  541. }