aboutsummaryrefslogtreecommitdiffstats
path: root/test/src
diff options
context:
space:
mode:
authorPierre Téchoueyres2019-05-21 23:00:13 +0200
committerEli Zaretskii2019-06-08 10:49:35 +0300
commit7541b06872ba134bfaa51b1aca7755a617fff807 (patch)
tree0190a36f96e0b37f1ea7f97e6b89975a155436af /test/src
parentfaf10bd8eb3272880b774fe220fa9916ed1f00c0 (diff)
downloademacs-7541b06872ba134bfaa51b1aca7755a617fff807.tar.gz
emacs-7541b06872ba134bfaa51b1aca7755a617fff807.zip
Add support for base64url variant of base-64 encoding/decoding
Implement the RFC4648 variant of base64 encoding used by URLs. * doc/lispref/text.texi (base64url-encode-region, base64url-encode-string): Document new functions. (base64-decode-region, base64-decode-string): Document new optional parameter 'base64url' used to use url variant when decoding data. * src/fns.c (base64url-encode-region, base64url-encode-region): New functions to manage url variant. (base64-decode-region, base64-decode-string): Add optional parameter to indicate use of url-variant. (base64_encode_region_1, base64_encode_string_1): Internal functions with extracted code from 'base64_encode_region' and 'base64_encode_string' and optional parameters to manage padding and url variant. (base64-encode-region, base64-encode-string) : Use base64_encode_region_1 and base64_encode_string_1. (base64-encode-1): Add parameters to manage padding and url variant. (base64-decode-1): Add parameter to manage url variant. * test/src/fns-tests.el (fns-tests--with-region): New helper macro to test region variant of base64 encode / decode functions. (fns-tests--string-repeat): Helper function used in base64 tests. (fns-tests-base64-encode-region, fns-tests-base64-encode-string): Tests for standard base64 function. (fns-test-base64url-encode-region, fns-test-base64url-encode-string): Tests for url variant. (fns-tests-base64-decode-string): Tests for decoding part.
Diffstat (limited to 'test/src')
-rw-r--r--test/src/fns-tests.el179
1 files changed, 179 insertions, 0 deletions
diff --git a/test/src/fns-tests.el b/test/src/fns-tests.el
index a9d4d11795c..9d4ae4fdf30 100644
--- a/test/src/fns-tests.el
+++ b/test/src/fns-tests.el
@@ -233,6 +233,185 @@
233 (should (equal (func-arity (eval (lambda (x &optional y)) t)) '(1 . 2))) 233 (should (equal (func-arity (eval (lambda (x &optional y)) t)) '(1 . 2)))
234 (should (equal (func-arity 'let) '(1 . unevalled)))) 234 (should (equal (func-arity 'let) '(1 . unevalled))))
235 235
236(defun fns-tests--string-repeat (s o)
237 (apply 'concat (make-list o s)))
238
239(defmacro fns-tests--with-region (funcname string &rest args)
240 "Apply FUNCNAME in a temp bufer on the region produced by STRING."
241 (declare (indent 1))
242 `(with-temp-buffer
243 (insert ,string)
244 (,funcname (point-min) (point-max) ,@args)
245 (buffer-string)))
246
247(ert-deftest fns-tests-base64-encode-region ()
248 ;; standard variant RFC2045
249 (should (equal (fns-tests--with-region base64-encode-region "") ""))
250 (should (equal (fns-tests--with-region base64-encode-region "f") "Zg=="))
251 (should (equal (fns-tests--with-region base64-encode-region "fo") "Zm8="))
252 (should (equal (fns-tests--with-region base64-encode-region "foo") "Zm9v"))
253 (should (equal (fns-tests--with-region base64-encode-region "foob") "Zm9vYg=="))
254 (should (equal (fns-tests--with-region base64-encode-region "fooba") "Zm9vYmE="))
255 (should (equal (fns-tests--with-region base64-encode-region "foobar") "Zm9vYmFy"))
256 (should (equal (fns-tests--with-region base64-encode-region "\x14\xfb\x9c\x03\xd9\x7e") "FPucA9l+"))
257 (should (equal (fns-tests--with-region base64-encode-region "\x14\xfb\x9c\x03\xd9\x7f") "FPucA9l/")))
258
259(ert-deftest fns-tests-base64-encode-string ()
260 ;; standard variant RFC2045
261 (should (equal (base64-encode-string "") ""))
262 (should (equal (base64-encode-string "f") "Zg=="))
263 (should (equal (base64-encode-string "fo") "Zm8="))
264 (should (equal (base64-encode-string "foo") "Zm9v"))
265 (should (equal (base64-encode-string "foob") "Zm9vYg=="))
266 (should (equal (base64-encode-string "fooba") "Zm9vYmE="))
267 (should (equal (base64-encode-string "foobar") "Zm9vYmFy"))
268 (should (equal (base64-encode-string "\x14\xfb\x9c\x03\xd9\x7e") "FPucA9l+"))
269 (should (equal (base64-encode-string "\x14\xfb\x9c\x03\xd9\x7f") "FPucA9l/")))
270
271(ert-deftest fns-test-base64url-encode-region ()
272 ;; url variant wih padding
273 (should (equal (fns-tests--with-region base64url-encode-region "") ""))
274 (should (equal (fns-tests--with-region base64url-encode-region "f") "Zg=="))
275 (should (equal (fns-tests--with-region base64url-encode-region "fo") "Zm8="))
276 (should (equal (fns-tests--with-region base64url-encode-region "foo") "Zm9v"))
277 (should (equal (fns-tests--with-region base64url-encode-region "foob") "Zm9vYg=="))
278 (should (equal (fns-tests--with-region base64url-encode-region "fooba") "Zm9vYmE="))
279 (should (equal (fns-tests--with-region base64url-encode-region "foobar") "Zm9vYmFy"))
280 (should (equal (fns-tests--with-region base64url-encode-region "\x14\xfb\x9c\x03\xd9\x7e") "FPucA9l-"))
281 (should (equal (fns-tests--with-region base64url-encode-region "\x14\xfb\x9c\x03\xd9\x7f") "FPucA9l_"))
282
283 ;; url variant no padding
284 (should (equal (fns-tests--with-region base64url-encode-region "" t) ""))
285 (should (equal (fns-tests--with-region base64url-encode-region "f" t) "Zg"))
286 (should (equal (fns-tests--with-region base64url-encode-region "fo" t) "Zm8"))
287 (should (equal (fns-tests--with-region base64url-encode-region "foo" t) "Zm9v"))
288 (should (equal (fns-tests--with-region base64url-encode-region "foob" t) "Zm9vYg"))
289 (should (equal (fns-tests--with-region base64url-encode-region "fooba" t) "Zm9vYmE"))
290 (should (equal (fns-tests--with-region base64url-encode-region "foobar" t) "Zm9vYmFy"))
291 (should (equal (fns-tests--with-region base64url-encode-region "\x14\xfb\x9c\x03\xd9\x7e" t) "FPucA9l-"))
292 (should (equal (fns-tests--with-region base64url-encode-region "\x14\xfb\x9c\x03\xd9\x7f" t) "FPucA9l_"))
293
294
295 ;; url variant no line break no padding
296 (should (equal (fns-tests--with-region base64url-encode-region (fns-tests--string-repeat "f" 100) t)
297 (concat (fns-tests--string-repeat "Zm" 66) "Zg")))
298 (should (equal (fns-tests--with-region base64url-encode-region (fns-tests--string-repeat "fo" 50) t)
299 (concat (fns-tests--string-repeat "Zm9mb2Zv" 16) "Zm9mbw")))
300 (should (equal (fns-tests--with-region base64url-encode-region (fns-tests--string-repeat "foo" 25) t)
301 (fns-tests--string-repeat "Zm9v" 25)))
302 (should (equal (fns-tests--with-region base64url-encode-region (fns-tests--string-repeat "foob" 15) t)
303 (fns-tests--string-repeat "Zm9vYmZvb2Jmb29i" 5)))
304 (should (equal (fns-tests--with-region base64url-encode-region (fns-tests--string-repeat "fooba" 15) t)
305 (fns-tests--string-repeat "Zm9vYmFmb29iYWZvb2Jh" 5)))
306 (should (equal (fns-tests--with-region base64url-encode-region (fns-tests--string-repeat "foobar" 15) t)
307 (concat (fns-tests--string-repeat "Zm9vYmFyZm9vYmFy" 7) "Zm9vYmFy")))
308 (should (equal (fns-tests--with-region base64url-encode-region (fns-tests--string-repeat "\x14\xfb\x9c\x03\xd9\x7e" 10) t)
309 (fns-tests--string-repeat "FPucA9l-" 10)))
310 (should (equal (fns-tests--with-region base64url-encode-region (fns-tests--string-repeat "\x14\xfb\x9c\x03\xd9\x7f" 10) t)
311 (fns-tests--string-repeat "FPucA9l_" 10))))
312
313(ert-deftest fns-test-base64url-encode-string ()
314 ;; url variant wih padding
315 (should (equal (base64url-encode-string "") ""))
316 (should (equal (base64url-encode-string "f") "Zg=="))
317 (should (equal (base64url-encode-string "fo") "Zm8="))
318 (should (equal (base64url-encode-string "foo") "Zm9v"))
319 (should (equal (base64url-encode-string "foob") "Zm9vYg=="))
320 (should (equal (base64url-encode-string "fooba") "Zm9vYmE="))
321 (should (equal (base64url-encode-string "foobar") "Zm9vYmFy"))
322 (should (equal (base64url-encode-string "\x14\xfb\x9c\x03\xd9\x7e") "FPucA9l-"))
323 (should (equal (base64url-encode-string "\x14\xfb\x9c\x03\xd9\x7f") "FPucA9l_"))
324
325 ;; url variant no padding
326 (should (equal (base64url-encode-string "" t) ""))
327 (should (equal (base64url-encode-string "f" t) "Zg"))
328 (should (equal (base64url-encode-string "fo" t) "Zm8"))
329 (should (equal (base64url-encode-string "foo" t) "Zm9v"))
330 (should (equal (base64url-encode-string "foob" t) "Zm9vYg"))
331 (should (equal (base64url-encode-string "fooba" t) "Zm9vYmE"))
332 (should (equal (base64url-encode-string "foobar" t) "Zm9vYmFy"))
333 (should (equal (base64url-encode-string "\x14\xfb\x9c\x03\xd9\x7e" t) "FPucA9l-"))
334 (should (equal (base64url-encode-string "\x14\xfb\x9c\x03\xd9\x7f" t) "FPucA9l_"))
335
336
337 ;; url variant no line break no padding
338 (should (equal (base64url-encode-string (fns-tests--string-repeat "f" 100) t) (concat (fns-tests--string-repeat "Zm" 66) "Zg")))
339 (should (equal (base64url-encode-string (fns-tests--string-repeat "fo" 50) t) (concat (fns-tests--string-repeat "Zm9mb2Zv" 16) "Zm9mbw")))
340 (should (equal (base64url-encode-string (fns-tests--string-repeat "foo" 25) t) (fns-tests--string-repeat "Zm9v" 25)))
341 (should (equal (base64url-encode-string (fns-tests--string-repeat "foob" 15) t) (fns-tests--string-repeat "Zm9vYmZvb2Jmb29i" 5)))
342 (should (equal (base64url-encode-string (fns-tests--string-repeat "fooba" 15) t) (fns-tests--string-repeat "Zm9vYmFmb29iYWZvb2Jh" 5)))
343 (should (equal (base64url-encode-string (fns-tests--string-repeat "foobar" 15) t) (concat (fns-tests--string-repeat "Zm9vYmFyZm9vYmFy" 7) "Zm9vYmFy")))
344 (should (equal (base64url-encode-string (fns-tests--string-repeat "\x14\xfb\x9c\x03\xd9\x7e" 10) t) (fns-tests--string-repeat "FPucA9l-" 10)))
345 (should (equal (base64url-encode-string (fns-tests--string-repeat "\x14\xfb\x9c\x03\xd9\x7f" 10) t) (fns-tests--string-repeat "FPucA9l_" 10))))
346
347(ert-deftest fns-tests-base64-decode-string ()
348 ;; standard variant RFC2045
349 (should (equal (base64-decode-string "") ""))
350 (should (equal (base64-decode-string "Zg==") "f"))
351 (should (equal (base64-decode-string "Zm8=") "fo"))
352 (should (equal (base64-decode-string "Zm9v") "foo"))
353 (should (equal (base64-decode-string "Zm9vYg==") "foob"))
354 (should (equal (base64-decode-string "Zm9vYmE=") "fooba"))
355 (should (equal (base64-decode-string "Zm9vYmFy") "foobar"))
356 (should (equal (base64-decode-string "FPucA9l+") "\x14\xfb\x9c\x03\xd9\x7e"))
357 (should (equal (base64-decode-string "FPucA9l/") "\x14\xfb\x9c\x03\xd9\x7f"))
358
359 ;; no paddign
360 (should (equal (base64-decode-string "" t) ""))
361 (should (equal (base64-decode-string "Zg" t) "f"))
362 (should (equal (base64-decode-string "Zm8" t) "fo"))
363 (should (equal (base64-decode-string "Zm9v" t) "foo"))
364 (should (equal (base64-decode-string "Zm9vYg" t) "foob"))
365 (should (equal (base64-decode-string "Zm9vYmE" t) "fooba"))
366 (should (equal (base64-decode-string "Zm9vYmFy" t) "foobar"))
367
368 ;; url variant wih padding
369 (should (equal (base64-decode-string "") ""))
370 (should (equal (base64-decode-string "Zg==" t) "f") )
371 (should (equal (base64-decode-string "Zm8=" t) "fo"))
372 (should (equal (base64-decode-string "Zm9v" t) "foo"))
373 (should (equal (base64-decode-string "Zm9vYg==" t) "foob"))
374 (should (equal (base64-decode-string "Zm9vYmE=" t) "fooba"))
375 (should (equal (base64-decode-string "Zm9vYmFy" t) "foobar"))
376 (should (equal (base64-decode-string "FPucA9l-" t) "\x14\xfb\x9c\x03\xd9\x7e"))
377 (should (equal (base64-decode-string "FPucA9l_" t) "\x14\xfb\x9c\x03\xd9\x7f"))
378
379 ;; url variant no padding
380 (should (equal (base64-decode-string "") ""))
381 (should (equal (base64-decode-string "Zg" t) "f"))
382 (should (equal (base64-decode-string "Zm8" t) "fo"))
383 (should (equal (base64-decode-string "Zm9v" t) "foo"))
384 (should (equal (base64-decode-string "Zm9vYg" t) "foob"))
385 (should (equal (base64-decode-string "Zm9vYmE" t) "fooba"))
386 (should (equal (base64-decode-string "Zm9vYmFy" t) "foobar"))
387 (should (equal (base64-decode-string "FPucA9l-" t) "\x14\xfb\x9c\x03\xd9\x7e"))
388 (should (equal (base64-decode-string "FPucA9l_" t) "\x14\xfb\x9c\x03\xd9\x7f"))
389
390
391 ;; url variant no line break no padding
392 (should (equal (base64-decode-string (concat (fns-tests--string-repeat "Zm" 66) "Zg") t)
393 (fns-tests--string-repeat "f" 100)))
394 (should (equal (base64-decode-string (concat (fns-tests--string-repeat "Zm9mb2Zv" 16) "Zm9mbw") t)
395 (fns-tests--string-repeat "fo" 50)))
396 (should (equal (base64-decode-string (fns-tests--string-repeat "Zm9v" 25) t)
397 (fns-tests--string-repeat "foo" 25)))
398 (should (equal (base64-decode-string (fns-tests--string-repeat "Zm9vYmZvb2Jmb29i" 5) t)
399 (fns-tests--string-repeat "foob" 15)))
400 (should (equal (base64-decode-string (fns-tests--string-repeat "Zm9vYmFmb29iYWZvb2Jh" 5) t)
401 (fns-tests--string-repeat "fooba" 15)))
402 (should (equal (base64-decode-string (concat (fns-tests--string-repeat "Zm9vYmFyZm9vYmFy" 7) "Zm9vYmFy") t)
403 (fns-tests--string-repeat "foobar" 15)))
404 (should (equal (base64-decode-string (fns-tests--string-repeat "FPucA9l-" 10) t)
405 (fns-tests--string-repeat "\x14\xfb\x9c\x03\xd9\x7e" 10)))
406 (should (equal (base64-decode-string (fns-tests--string-repeat "FPucA9l_" 10) t)
407 (fns-tests--string-repeat "\x14\xfb\x9c\x03\xd9\x7f" 10)))
408
409 ;; errors check
410 (should (eq :got-error (condition-case () (base64-decode-string "Zg=") (error :got-error))))
411 (should (eq :got-error (condition-case () (base64-decode-string "Zm9vYmE") (error :got-error))))
412 (should (eq :got-error (condition-case () (base64-decode-string "Zm9vYmFy=") (error :got-error))))
413 (should (eq :got-error (condition-case () (base64-decode-string "Zg=Zg=") (error :got-error)))))
414
236(ert-deftest fns-tests-hash-buffer () 415(ert-deftest fns-tests-hash-buffer ()
237 (should (equal (sha1 "foo") "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33")) 416 (should (equal (sha1 "foo") "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"))
238 (should (equal (with-temp-buffer 417 (should (equal (with-temp-buffer