diff options
| author | Pierre Téchoueyres | 2019-05-21 23:00:13 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2019-06-08 10:49:35 +0300 |
| commit | 7541b06872ba134bfaa51b1aca7755a617fff807 (patch) | |
| tree | 0190a36f96e0b37f1ea7f97e6b89975a155436af /test/src | |
| parent | faf10bd8eb3272880b774fe220fa9916ed1f00c0 (diff) | |
| download | emacs-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.el | 179 |
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 |