~ruther/guix-local

827d556311b79d44fd67b4bd24cf17e5f781d502 — Ludovic Courtès 12 years ago 56c7282
tests: Rewrite 'fcntl-lock' test.

* tests/utils.scm (temp-file): New variable.
  ("fcntl-flock"): Rewrite to actually test whether the child process
  waits for the lock to be released.  The previous test was wrong
  because (1) it expected F_SETLK semantics, not F_SETLKW, and (2) it
  got EBADF because of a mismatch between the open mode and the lock
  style.
1 files changed, 29 insertions(+), 14 deletions(-)

M tests/utils.scm
M tests/utils.scm => tests/utils.scm +29 -14
@@ 27,6 27,9 @@
  #:use-module (rnrs io ports)
  #:use-module (ice-9 match))

(define temp-file
  (string-append "t-utils-" (number->string (getpid))))

(test-begin "utils")

(test-assert "bytevector->base16-string->bytevector"


@@ 139,33 142,43 @@
                   (append pids1 pids2)))
           (equal? (get-bytevector-all decompressed) data)))))

(false-if-exception (delete-file temp-file))
(test-equal "fcntl-flock"
  0                                               ; the child's exit status
  (let ((file (open-input-file (search-path %load-path "guix.scm"))))
    (fcntl-flock file 'read-lock)
  42                                              ; the child's exit status
  (let ((file (open-file temp-file "w0")))
    ;; Acquire an exclusive lock.
    (fcntl-flock file 'write-lock)
    (match (primitive-fork)
      (0
       (dynamic-wind
         (const #t)
         (lambda ()
           ;; Taking a read lock should be OK.
           (fcntl-flock file 'read-lock)
           (fcntl-flock file 'unlock)

           (catch 'flock-error
             (lambda ()
               ;; Taking an exclusive lock should raise an exception.
               (fcntl-flock file 'write-lock))
             (lambda args
               (primitive-exit 0)))
           ;; Reopen FILE read-only so we can have a read lock.
           (let ((file (open-file temp-file "r")))
             ;; Wait until we can acquire the lock.
             (fcntl-flock file 'read-lock)
             (primitive-exit (read file)))
           (primitive-exit 1))
         (lambda ()
           (primitive-exit 2))))
      (pid
       ;; Write garbage and wait.
       (display "hello, world!"  file)
       (force-output file)
       (sleep 1)

       ;; Write the real answer.
       (seek file 0 SEEK_SET)
       (truncate-file file 0)
       (write 42 file)
       (force-output file)

       ;; Unlock, which should let the child continue.
       (fcntl-flock file 'unlock)

       (match (waitpid pid)
         ((_  . status)
          (let ((result (status:exit-val status)))
            (fcntl-flock file 'unlock)
            (close-port file)
            result)))))))



@@ 178,5 191,7 @@

(test-end)

(false-if-exception (delete-file temp-file))


(exit (= (test-runner-fail-count (test-runner-current)) 0))