Fix :bug-309448 test for faster CPUs.
[sbcl.git] / contrib / sb-md5 / md5-tests.lisp
index c0f8da1..ea9e4c8 100644 (file)
@@ -2,18 +2,45 @@
   (:use #:sb-md5 #:cl #:sb-rt))
 (in-package #:sb-md5-tests)
 
+(defun byte-array-to-hex-string (bytevec)
+  (format nil "~(~{~2,'0X~}~)" (coerce bytevec 'list)))
+
+(defun one-shot-test (string)
+  (md5sum-string string :external-format :ascii))
+
+(defun incremental-test (string)
+  (let ((bytevec (sb-ext:string-to-octets string :external-format :ascii))
+        (state (sb-md5:make-md5-state)))
+    (dotimes (i (length bytevec) (sb-md5:finalize-md5-state state))
+      (sb-md5:update-md5-state state bytevec :start i :end (1+ i)))))
+
+(defun fill-pointer-test (string)
+  (let* ((bytevec (sb-ext:string-to-octets string :external-format :ascii))
+         (fillvec (let ((x (make-array (* 2 (length bytevec))
+                                       :fill-pointer 0
+                                       :element-type '(unsigned-byte 8))))
+                    (dotimes (i (length bytevec) x)
+                      (vector-push (aref bytevec i) x)))))
+    (sb-md5:md5sum-sequence fillvec)))
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
+(defun tests-for-test-suite (basename index string expected-result)
+  (loop for (test-kind testfun) in '(("ONE-SHOT" one-shot-test)
+                                     ("INCREMENTAL" incremental-test)
+                                     ("FILL-POINTER" fill-pointer-test))
+     collect `(deftest ,(intern (format nil "~A.~A.~A" basename test-kind index))
+                  (string= (byte-array-to-hex-string (funcall ',testfun ,string))
+                           ,expected-result)
+                t) into test-forms
+       finally (return `(progn ,@test-forms))))
+) ; EVAL-WHEN
+
 (macrolet
     ((define-rfc1321-tests (test-list)
          `(progn
            ,@(loop for i upfrom 0
                    for (string . expected-result) in test-list
-                   collect
-                   `(deftest ,(intern (format nil "SB-MD5.RFC1321.~A" i))
-                     (string= (format nil
-                               "~(~{~2,'0X~}~)"
-                               (coerce (md5sum-string ,string :external-format :ascii) 'list))
-                      ,expected-result)
-                     t)))))
+                   collect (tests-for-test-suite "SB-MD5.RFC1321" i string expected-result)))))
   (define-rfc1321-tests
       (("" . "d41d8cd98f00b204e9800998ecf8427e")
        ("a" ."0cc175b9c0f1b6a831c399e269772661")
          `(progn
            ,@(loop for i upfrom 0
                    for (string . expected-result) in test-list
-                   collect
-                   `(deftest ,(intern (format nil "SB-MD5.OTHER.~A" i))
-                     (string=
-                      (format nil "~(~{~2,'0X~}~)"
-                       (coerce (md5sum-string ,string :external-format :ascii) 'list))
-                      ,expected-result)
-                     t)))))
+                   collect (tests-for-test-suite "SB-MD5.OTHER" i string expected-result)))))
   (define-other-tests
       (;; From padding bug report by Edi Weitz
        ("1631901HERR BUCHHEISTERCITROEN NORD1043360796beckenbauer" . "d734945e5930bb28859ccd13c830358b")
        ("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" . "ab75504250558b788f99d1ebd219abf2"))))
 
 (deftest sb-md5.md5sum-file.0
-    (string= (format nil "~(~{~2,'0X~}~)" (coerce (md5sum-file "/dev/null") 'list))
-             "d41d8cd98f00b204e9800998ecf8427e")
-  t)
+    (let ((file
+           (loop with ret
+                 for filename = (format nil "md5-test-~6,'0D" (random 100000))
+                 do (with-open-file (stream filename :direction :output
+                                            :if-exists nil
+                                            :if-does-not-exist :create)
+                      (when stream
+                        (setf ret stream)))
+                 when ret return ret)))
+      (unwind-protect
+          (string= (format nil "~(~{~2,'0X~}~)"
+                           (coerce (md5sum-file file) 'list))
+                   "d41d8cd98f00b204e9800998ecf8427e")
+        (delete-file file)))
+      t)
 
 (deftest sb-md5.md5sum-sequence.error.0
     (handler-case (md5sum-sequence "foo")