~ chicken-core (chicken-5) b3affcfd415a71e08e0c53de94759874033f841d
commit b3affcfd415a71e08e0c53de94759874033f841d
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Thu Sep 2 09:44:13 2021 +0200
Commit: Mario Domenech Goulart <mario@parenteses.org>
CommitDate: Sun Sep 5 13:05:54 2021 +0200
Fix posix-tests file permission test on Windows
In Windows, there are three problems with this test:
- Deleting read-only files gives a permission error.
- Permissions don't know about "group" and "other" permissions - the
permissions are always extended from the user so the rest match it.
- It is impossible to give write-only or "no" permissions on a file.
So we make files writable before attempting to delete them, and
we provide a mapping for expected permissions so that we only look
at the user part of the file mode, and always have it include
"readable" as a permission.
See also
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/umask
and
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/remove-wremove
Signed-off-by: Mario Domenech Goulart <mario@parenteses.org>
diff --git a/tests/posix-tests.scm b/tests/posix-tests.scm
index 26f495e7..1c695d9d 100644
--- a/tests/posix-tests.scm
+++ b/tests/posix-tests.scm
@@ -1,4 +1,5 @@
-(import (chicken pathname)
+(import (chicken bitwise)
+ (chicken pathname)
(chicken file)
(chicken file posix)
(chicken platform)
@@ -89,17 +90,38 @@
(assert (not (get-environment-variable "FOO")))
;; file creation and umask interaction
+(define (permission-expectation original-expectation)
+ (cond-expand
+ ;; In Windows, all files are always readable. You cannot give
+ ;; write-only permissions or no permissions. Also, there's no
+ ;; concept of "group" and "other", so we must take the user
+ ;; permissions and extend those over the rest. Finally, it
+ ;; doesn't have an "execute" bit, so ignore that too.
+ (windows (case (arithmetic-shift original-expectation -6)
+ ((6 7 3 2) #o666)
+ (else #o444)))
+ (else original-expectation)))
+
+;; For windows, the file must be writable before it can be deleted!
+(define (delete-maybe-readonly-file filename)
+ (cond-expand
+ (windows (when (file-exists? filename)
+ (set-file-permissions! filename #o666)))
+ (else))
+ (delete-file* filename))
+
(letrec-syntax ((test (syntax-rules ()
((test umask expected)
(test umask "expected" expected "given"))
((test umask given expected)
(test umask "expected" expected "given" given))
((test umask "expected" expected "given" given ...)
- (let ((mode (file-creation-mode)))
+ (let ((mode (file-creation-mode))
+ (exp-perm (permission-expectation expected)))
(set! (file-creation-mode) umask)
- (delete-file* "posix-tests.out")
+ (delete-maybe-readonly-file "posix-tests.out")
(file-close (file-open "posix-tests.out" open/creat given ...))
- (assert (equal? (file-permissions "posix-tests.out") expected))
+ (assert (equal? (file-permissions "posix-tests.out") exp-perm))
(set! (file-creation-mode) mode))))))
;; default file mode
(test #o000 #o666)
Trap