web-uri.test 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. ;;;; web-uri.test --- URI library -*- mode: scheme; coding: utf-8; -*-
  2. ;;;;
  3. ;;;; Copyright (C) 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
  4. ;;;;
  5. ;;;; This library is free software; you can redistribute it and/or
  6. ;;;; modify it under the terms of the GNU Lesser General Public
  7. ;;;; License as published by the Free Software Foundation; either
  8. ;;;; version 3 of the License, or (at your option) any later version.
  9. ;;;;
  10. ;;;; This library is distributed in the hope that it will be useful,
  11. ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. ;;;; Lesser General Public License for more details.
  14. ;;;;
  15. ;;;; You should have received a copy of the GNU Lesser General Public
  16. ;;;; License along with this library; if not, write to the Free Software
  17. ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18. (define-module (test-web-uri)
  19. #:use-module (web uri)
  20. #:use-module (ice-9 regex)
  21. #:use-module (test-suite lib))
  22. ;; FIXME: need more decode / encode tests
  23. (define* (uri=? uri #:key scheme userinfo host port path query fragment)
  24. (and (uri? uri)
  25. (equal? (uri-scheme uri) scheme)
  26. (equal? (uri-userinfo uri) userinfo)
  27. (equal? (uri-host uri) host)
  28. (equal? (uri-port uri) port)
  29. (equal? (uri-path uri) path)
  30. (equal? (uri-query uri) query)
  31. (equal? (uri-fragment uri) fragment)))
  32. (define-syntax pass-if-uri-exception
  33. (syntax-rules ()
  34. ((_ name pat exp)
  35. (pass-if name
  36. (catch 'uri-error
  37. (lambda () exp (error "expected uri-error exception"))
  38. (lambda (k message args)
  39. (if (string-match pat message)
  40. #t
  41. (error "unexpected uri-error exception" message args))))))))
  42. (with-test-prefix "build-uri"
  43. (pass-if "ftp:"
  44. (uri=? (build-uri 'ftp)
  45. #:scheme 'ftp
  46. #:path ""))
  47. (pass-if "ftp:foo"
  48. (uri=? (build-uri 'ftp #:path "foo")
  49. #:scheme 'ftp
  50. #:path "foo"))
  51. (pass-if "ftp://foo"
  52. (uri=? (build-uri 'ftp #:host "foo")
  53. #:scheme 'ftp
  54. #:host "foo"
  55. #:path ""))
  56. (pass-if "ftp://foo/bar"
  57. (uri=? (build-uri 'ftp #:host "foo" #:path "/bar")
  58. #:scheme 'ftp
  59. #:host "foo"
  60. #:path "/bar"))
  61. (pass-if "ftp://foo@bar:22/baz"
  62. (uri=? (build-uri 'ftp #:userinfo "foo" #:host "bar" #:port 22 #:path "/baz")
  63. #:scheme 'ftp
  64. #:userinfo "foo"
  65. #:host "bar"
  66. #:port 22
  67. #:path "/baz"))
  68. (pass-if-uri-exception "non-symbol scheme"
  69. "Expected.*symbol"
  70. (build-uri "nonsym"))
  71. (pass-if-uri-exception "http://bad.host.1"
  72. "Expected.*host"
  73. (build-uri 'http #:host "bad.host.1"))
  74. (pass-if "http://bad.host.1 (no validation)"
  75. (uri=? (build-uri 'http #:host "bad.host.1" #:validate? #f)
  76. #:scheme 'http #:host "bad.host.1" #:path ""))
  77. (pass-if "http://1.good.host"
  78. (uri=? (build-uri 'http #:host "1.good.host")
  79. #:scheme 'http #:host "1.good.host" #:path ""))
  80. (when (memq 'socket *features*)
  81. (pass-if "http://192.0.2.1"
  82. (uri=? (build-uri 'http #:host "192.0.2.1")
  83. #:scheme 'http #:host "192.0.2.1" #:path ""))
  84. (pass-if "http://[2001:db8::1]"
  85. (uri=? (build-uri 'http #:host "2001:db8::1")
  86. #:scheme 'http #:host "2001:db8::1" #:path ""))
  87. (pass-if "http://[::ffff:192.0.2.1]"
  88. (uri=? (build-uri 'http #:host "::ffff:192.0.2.1")
  89. #:scheme 'http #:host "::ffff:192.0.2.1" #:path "")))
  90. (pass-if-uri-exception "http://foo:not-a-port"
  91. "Expected.*port"
  92. (build-uri 'http #:host "foo" #:port "not-a-port"))
  93. (pass-if-uri-exception "http://foo:10 but port as string"
  94. "Expected.*port"
  95. (build-uri 'http #:host "foo" #:port "10"))
  96. (pass-if-uri-exception "http://:10"
  97. "Expected.*host"
  98. (build-uri 'http #:port 10))
  99. (pass-if-uri-exception "http://foo@"
  100. "Expected.*host"
  101. (build-uri 'http #:userinfo "foo")))
  102. (with-test-prefix "string->uri"
  103. (pass-if "ftp:"
  104. (uri=? (string->uri "ftp:")
  105. #:scheme 'ftp
  106. #:path ""))
  107. (pass-if "ftp:foo"
  108. (uri=? (string->uri "ftp:foo")
  109. #:scheme 'ftp
  110. #:path "foo"))
  111. (pass-if "ftp://foo/bar"
  112. (uri=? (string->uri "ftp://foo/bar")
  113. #:scheme 'ftp
  114. #:host "foo"
  115. #:path "/bar"))
  116. (pass-if "ftp://foo@bar:22/baz"
  117. (uri=? (string->uri "ftp://foo@bar:22/baz")
  118. #:scheme 'ftp
  119. #:userinfo "foo"
  120. #:host "bar"
  121. #:port 22
  122. #:path "/baz"))
  123. (pass-if "http://bad.host.1"
  124. (not (string->uri "http://bad.host.1")))
  125. (pass-if "http://1.good.host"
  126. (uri=? (string->uri "http://1.good.host")
  127. #:scheme 'http #:host "1.good.host" #:path ""))
  128. (when (memq 'socket *features*)
  129. (pass-if "http://192.0.2.1"
  130. (uri=? (string->uri "http://192.0.2.1")
  131. #:scheme 'http #:host "192.0.2.1" #:path ""))
  132. (pass-if "http://[2001:db8::1]"
  133. (uri=? (string->uri "http://[2001:db8::1]")
  134. #:scheme 'http #:host "2001:db8::1" #:path ""))
  135. (pass-if "http://[2001:db8::1]:80"
  136. (uri=? (string->uri "http://[2001:db8::1]:80")
  137. #:scheme 'http
  138. #:host "2001:db8::1"
  139. #:port 80
  140. #:path ""))
  141. (pass-if "http://[::ffff:192.0.2.1]"
  142. (uri=? (string->uri "http://[::ffff:192.0.2.1]")
  143. #:scheme 'http #:host "::ffff:192.0.2.1" #:path "")))
  144. (pass-if "http://foo:"
  145. (uri=? (string->uri "http://foo:")
  146. #:scheme 'http #:host "foo" #:path ""))
  147. (pass-if "http://foo:/"
  148. (uri=? (string->uri "http://foo:/")
  149. #:scheme 'http #:host "foo" #:path "/"))
  150. (pass-if "http://2012.jsconf.us/"
  151. (uri=? (string->uri "http://2012.jsconf.us/")
  152. #:scheme 'http #:host "2012.jsconf.us" #:path "/"))
  153. (pass-if "http://foo:not-a-port"
  154. (not (string->uri "http://foo:not-a-port")))
  155. (pass-if "http://:10"
  156. (not (string->uri "http://:10")))
  157. (pass-if "http://foo@"
  158. (not (string->uri "http://foo@")))
  159. (pass-if "file:/"
  160. (uri=? (string->uri "file:/")
  161. #:scheme 'file
  162. #:path "/"))
  163. (pass-if "file:/etc/hosts"
  164. (uri=? (string->uri "file:/etc/hosts")
  165. #:scheme 'file
  166. #:path "/etc/hosts"))
  167. (pass-if "file:///etc/hosts"
  168. (uri=? (string->uri "file:///etc/hosts")
  169. #:scheme 'file
  170. #:path "/etc/hosts"))
  171. (pass-if "http://foo#bar"
  172. (uri=? (string->uri "http://foo#bar")
  173. #:scheme 'http
  174. #:host "foo"
  175. #:path ""
  176. #:fragment "bar"))
  177. (pass-if "http://foo:/#bar"
  178. (uri=? (string->uri "http://foo:/#bar")
  179. #:scheme 'http
  180. #:host "foo"
  181. #:path "/"
  182. #:fragment "bar"))
  183. (pass-if "http://foo:100#bar"
  184. (uri=? (string->uri "http://foo:100#bar")
  185. #:scheme 'http
  186. #:host "foo"
  187. #:port 100
  188. #:path ""
  189. #:fragment "bar"))
  190. (pass-if "http://foo:100/#bar"
  191. (uri=? (string->uri "http://foo:100/#bar")
  192. #:scheme 'http
  193. #:host "foo"
  194. #:port 100
  195. #:path "/"
  196. #:fragment "bar"))
  197. (pass-if "http://foo?q#bar"
  198. (uri=? (string->uri "http://foo?q#bar")
  199. #:scheme 'http
  200. #:host "foo"
  201. #:path ""
  202. #:query "q"
  203. #:fragment "bar"))
  204. (pass-if "http://foo:/?q#bar"
  205. (uri=? (string->uri "http://foo:/?q#bar")
  206. #:scheme 'http
  207. #:host "foo"
  208. #:path "/"
  209. #:query "q"
  210. #:fragment "bar"))
  211. (pass-if "http://foo:100?q#bar"
  212. (uri=? (string->uri "http://foo:100?q#bar")
  213. #:scheme 'http
  214. #:host "foo"
  215. #:port 100
  216. #:path ""
  217. #:query "q"
  218. #:fragment "bar"))
  219. (pass-if "http://foo:100/?q#bar"
  220. (uri=? (string->uri "http://foo:100/?q#bar")
  221. #:scheme 'http
  222. #:host "foo"
  223. #:port 100
  224. #:path "/"
  225. #:query "q"
  226. #:fragment "bar")))
  227. (with-test-prefix "string->uri-reference"
  228. (pass-if "/foo"
  229. (uri=? (string->uri-reference "/foo")
  230. #:path "/foo"))
  231. (pass-if "ftp:/foo"
  232. (uri=? (string->uri-reference "ftp:/foo")
  233. #:scheme 'ftp
  234. #:path "/foo"))
  235. (pass-if "ftp:foo"
  236. (uri=? (string->uri-reference "ftp:foo")
  237. #:scheme 'ftp
  238. #:path "foo"))
  239. (pass-if "//foo/bar"
  240. (uri=? (string->uri-reference "//foo/bar")
  241. #:host "foo"
  242. #:path "/bar"))
  243. (pass-if "ftp://foo@bar:22/baz"
  244. (uri=? (string->uri-reference "ftp://foo@bar:22/baz")
  245. #:scheme 'ftp
  246. #:userinfo "foo"
  247. #:host "bar"
  248. #:port 22
  249. #:path "/baz"))
  250. (pass-if "//foo@bar:22/baz"
  251. (uri=? (string->uri-reference "//foo@bar:22/baz")
  252. #:userinfo "foo"
  253. #:host "bar"
  254. #:port 22
  255. #:path "/baz"))
  256. (pass-if "http://bad.host.1"
  257. (not (string->uri-reference "http://bad.host.1")))
  258. (pass-if "//bad.host.1"
  259. (not (string->uri-reference "//bad.host.1")))
  260. (pass-if "http://1.good.host"
  261. (uri=? (string->uri-reference "http://1.good.host")
  262. #:scheme 'http #:host "1.good.host" #:path ""))
  263. (pass-if "//1.good.host"
  264. (uri=? (string->uri-reference "//1.good.host")
  265. #:host "1.good.host" #:path ""))
  266. (when (memq 'socket *features*)
  267. (pass-if "http://192.0.2.1"
  268. (uri=? (string->uri-reference "http://192.0.2.1")
  269. #:scheme 'http #:host "192.0.2.1" #:path ""))
  270. (pass-if "//192.0.2.1"
  271. (uri=? (string->uri-reference "//192.0.2.1")
  272. #:host "192.0.2.1" #:path ""))
  273. (pass-if "http://[2001:db8::1]"
  274. (uri=? (string->uri-reference "http://[2001:db8::1]")
  275. #:scheme 'http #:host "2001:db8::1" #:path ""))
  276. (pass-if "//[2001:db8::1]"
  277. (uri=? (string->uri-reference "//[2001:db8::1]")
  278. #:host "2001:db8::1" #:path ""))
  279. (pass-if "http://[2001:db8::1]:80"
  280. (uri=? (string->uri-reference "http://[2001:db8::1]:80")
  281. #:scheme 'http
  282. #:host "2001:db8::1"
  283. #:port 80
  284. #:path ""))
  285. (pass-if "//[2001:db8::1]:80"
  286. (uri=? (string->uri-reference "//[2001:db8::1]:80")
  287. #:host "2001:db8::1"
  288. #:port 80
  289. #:path ""))
  290. (pass-if "http://[::ffff:192.0.2.1]"
  291. (uri=? (string->uri-reference "http://[::ffff:192.0.2.1]")
  292. #:scheme 'http #:host "::ffff:192.0.2.1" #:path ""))
  293. (pass-if "//[::ffff:192.0.2.1]"
  294. (uri=? (string->uri-reference "//[::ffff:192.0.2.1]")
  295. #:host "::ffff:192.0.2.1" #:path "")))
  296. (pass-if "http://foo:"
  297. (uri=? (string->uri-reference "http://foo:")
  298. #:scheme 'http #:host "foo" #:path ""))
  299. (pass-if "//foo:"
  300. (uri=? (string->uri-reference "//foo:")
  301. #:host "foo" #:path ""))
  302. (pass-if "http://foo:/"
  303. (uri=? (string->uri-reference "http://foo:/")
  304. #:scheme 'http #:host "foo" #:path "/"))
  305. (pass-if "//foo:/"
  306. (uri=? (string->uri-reference "//foo:/")
  307. #:host "foo" #:path "/"))
  308. (pass-if "http://2012.jsconf.us/"
  309. (uri=? (string->uri-reference "http://2012.jsconf.us/")
  310. #:scheme 'http #:host "2012.jsconf.us" #:path "/"))
  311. (pass-if "//2012.jsconf.us/"
  312. (uri=? (string->uri-reference "//2012.jsconf.us/")
  313. #:host "2012.jsconf.us" #:path "/"))
  314. (pass-if "http://foo:not-a-port"
  315. (not (string->uri-reference "http://foo:not-a-port")))
  316. (pass-if "//foo:not-a-port"
  317. (not (string->uri-reference "//foo:not-a-port")))
  318. (pass-if "http://:10"
  319. (not (string->uri-reference "http://:10")))
  320. (pass-if "//:10"
  321. (not (string->uri-reference "//:10")))
  322. (pass-if "http://foo@"
  323. (not (string->uri-reference "http://foo@")))
  324. (pass-if "//foo@"
  325. (not (string->uri-reference "//foo@")))
  326. (pass-if "file:/"
  327. (uri=? (string->uri-reference "file:/")
  328. #:scheme 'file
  329. #:path "/"))
  330. (pass-if "/"
  331. (uri=? (string->uri-reference "/")
  332. #:path "/"))
  333. (pass-if "foo"
  334. (uri=? (string->uri-reference "foo")
  335. #:path "foo"))
  336. (pass-if "file:/etc/hosts"
  337. (uri=? (string->uri-reference "file:/etc/hosts")
  338. #:scheme 'file
  339. #:path "/etc/hosts"))
  340. (pass-if "/etc/hosts"
  341. (uri=? (string->uri-reference "/etc/hosts")
  342. #:path "/etc/hosts"))
  343. (pass-if "file:///etc/hosts"
  344. (uri=? (string->uri-reference "file:///etc/hosts")
  345. #:scheme 'file
  346. #:path "/etc/hosts"))
  347. (pass-if "///etc/hosts"
  348. (uri=? (string->uri-reference "///etc/hosts")
  349. #:path "/etc/hosts"))
  350. (pass-if "/foo#bar"
  351. (uri=? (string->uri-reference "/foo#bar")
  352. #:path "/foo"
  353. #:fragment "bar"))
  354. (pass-if "//foo#bar"
  355. (uri=? (string->uri-reference "//foo#bar")
  356. #:host "foo"
  357. #:path ""
  358. #:fragment "bar"))
  359. (pass-if "//foo:/#bar"
  360. (uri=? (string->uri-reference "//foo:/#bar")
  361. #:host "foo"
  362. #:path "/"
  363. #:fragment "bar"))
  364. (pass-if "//foo:100#bar"
  365. (uri=? (string->uri-reference "//foo:100#bar")
  366. #:host "foo"
  367. #:port 100
  368. #:path ""
  369. #:fragment "bar"))
  370. (pass-if "//foo:100/#bar"
  371. (uri=? (string->uri-reference "//foo:100/#bar")
  372. #:host "foo"
  373. #:port 100
  374. #:path "/"
  375. #:fragment "bar"))
  376. (pass-if "/foo?q#bar"
  377. (uri=? (string->uri-reference "/foo?q#bar")
  378. #:path "/foo"
  379. #:query "q"
  380. #:fragment "bar"))
  381. (pass-if "//foo?q#bar"
  382. (uri=? (string->uri-reference "//foo?q#bar")
  383. #:host "foo"
  384. #:path ""
  385. #:query "q"
  386. #:fragment "bar"))
  387. (pass-if "//foo:/?q#bar"
  388. (uri=? (string->uri-reference "//foo:/?q#bar")
  389. #:host "foo"
  390. #:path "/"
  391. #:query "q"
  392. #:fragment "bar"))
  393. (pass-if "//foo:100?q#bar"
  394. (uri=? (string->uri-reference "//foo:100?q#bar")
  395. #:host "foo"
  396. #:port 100
  397. #:path ""
  398. #:query "q"
  399. #:fragment "bar"))
  400. (pass-if "//foo:100/?q#bar"
  401. (uri=? (string->uri-reference "//foo:100/?q#bar")
  402. #:host "foo"
  403. #:port 100
  404. #:path "/"
  405. #:query "q"
  406. #:fragment "bar")))
  407. (with-test-prefix "uri->string"
  408. (pass-if "ftp:"
  409. (equal? "ftp:"
  410. (uri->string (string->uri "ftp:"))))
  411. (pass-if "ftp:foo"
  412. (equal? "ftp:foo"
  413. (uri->string (string->uri "ftp:foo"))))
  414. (pass-if "ftp://foo/bar"
  415. (equal? "ftp://foo/bar"
  416. (uri->string (string->uri "ftp://foo/bar"))))
  417. (pass-if "//foo/bar"
  418. (equal? "//foo/bar"
  419. (uri->string (string->uri-reference "//foo/bar"))))
  420. (pass-if "ftp://foo@bar:22/baz"
  421. (equal? "ftp://foo@bar:22/baz"
  422. (uri->string (string->uri "ftp://foo@bar:22/baz"))))
  423. (pass-if "//foo@bar:22/baz"
  424. (equal? "//foo@bar:22/baz"
  425. (uri->string (string->uri-reference "//foo@bar:22/baz"))))
  426. (when (memq 'socket *features*)
  427. (pass-if "http://192.0.2.1"
  428. (equal? "http://192.0.2.1"
  429. (uri->string (string->uri "http://192.0.2.1"))))
  430. (pass-if "//192.0.2.1"
  431. (equal? "//192.0.2.1"
  432. (uri->string (string->uri-reference "//192.0.2.1"))))
  433. (pass-if "http://[2001:db8::1]"
  434. (equal? "http://[2001:db8::1]"
  435. (uri->string (string->uri "http://[2001:db8::1]"))))
  436. (pass-if "//[2001:db8::1]"
  437. (equal? "//[2001:db8::1]"
  438. (uri->string (string->uri-reference "//[2001:db8::1]"))))
  439. (pass-if "http://[::ffff:192.0.2.1]"
  440. (equal? "http://[::ffff:192.0.2.1]"
  441. (uri->string (string->uri "http://[::ffff:192.0.2.1]"))))
  442. (pass-if "//[::ffff:192.0.2.1]"
  443. (equal? "//[::ffff:192.0.2.1]"
  444. (uri->string (string->uri-reference "//[::ffff:192.0.2.1]")))))
  445. (pass-if "http://foo:"
  446. (equal? "http://foo"
  447. (uri->string (string->uri "http://foo:"))))
  448. (pass-if "//foo"
  449. (equal? "//foo"
  450. (uri->string (string->uri-reference "//foo"))))
  451. (pass-if "http://foo:/"
  452. (equal? "http://foo/"
  453. (uri->string (string->uri "http://foo:/"))))
  454. (pass-if "//foo:/"
  455. (equal? "//foo/"
  456. (uri->string (string->uri-reference "//foo:/"))))
  457. (pass-if "/"
  458. (equal? "/"
  459. (uri->string (string->uri-reference "/"))))
  460. (pass-if "/foo"
  461. (equal? "/foo"
  462. (uri->string (string->uri-reference "/foo"))))
  463. (pass-if "/foo/"
  464. (equal? "/foo/"
  465. (uri->string (string->uri-reference "/foo/"))))
  466. (pass-if "/foo/?bar#baz"
  467. (equal? "/foo/?bar#baz"
  468. (uri->string (string->uri-reference "/foo/?bar#baz"))))
  469. (pass-if "foo/?bar#baz"
  470. (equal? "foo/?bar#baz"
  471. (uri->string (string->uri-reference "foo/?bar#baz")))))
  472. (with-test-prefix "decode"
  473. (pass-if "foo%20bar"
  474. (equal? "foo bar" (uri-decode "foo%20bar")))
  475. (pass-if "foo+bar"
  476. (equal? "foo bar" (uri-decode "foo+bar")))
  477. (pass-if "foo+bar"
  478. (equal? '("foo+bar") (split-and-decode-uri-path "foo+bar"))))
  479. (with-test-prefix "encode"
  480. (pass-if (equal? "foo%20bar" (uri-encode "foo bar")))
  481. (pass-if (equal? "foo%0A%00bar" (uri-encode "foo\n\x00bar")))
  482. (pass-if (equal? "%3C%3E%5C%5E" (uri-encode "<>\\^"))))