test program 0.5.2
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Thu, 11 Aug 2022 22:58:43 +0000 (08:58 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Thu, 11 Aug 2022 22:58:43 +0000 (08:58 +1000)
overlaytest.lsp [new file with mode: 0755]

diff --git a/overlaytest.lsp b/overlaytest.lsp
new file mode 100755 (executable)
index 0000000..f9aa9ae
--- /dev/null
@@ -0,0 +1,112 @@
+#!/usr/bin/newlisp
+#
+# This is a test script for the overlay function of fusefile.
+#
+# 1) prepare a base image
+# 2) set up a fusefile overlay
+# 3) run tests
+# 4) dismantle the fusefile overlay
+# 5) remove test images
+
+; ID is hour, minute and second values packed into a string
+(constant
+ 'ID (apply string (3 3 (now)))
+ 'BASE (format "%s.raw" ID)
+ 'OLY (format "%s.oly" ID)
+ 'SEGSZ 17000
+ 'SEGN 40
+ )
+
+(constant
+ 'LIBC6 "/lib/x86_64-linux-gnu/libc.so.6"
+ 'MINE "mine"
+ )
+
+(import LIBC6 "on_exit" "int" "void*" "void*")
+
+;; Set up a fusefile
+(define (onexit x y)
+  (write-line 2 (string "terminating: " x " " (get-string y)))
+  (! (format "fusermount -u %s" BASE))
+  (delete-file OLY)
+  (delete-file BASE)
+  )
+## note: BASE is set up as a holes file with SEGN segments of size SEGSZ
+(! (format "dd if=/dev/zero of=%s bs=%d seek=%d count=0 status=none"
+           BASE SEGSZ SEGN))
+(unless (= (! (format "fusefile %s %s -overlay:%s %s"
+                      "-ononempty -oallow_other" BASE OLY BASE)))
+  (exit 1))
+(on_exit (callback 'onexit "void" "int" "void*") MINE)
+
+(println (list BASE OLY))
+
+(define (die) (write-line 2 (apply string (args))))
+
+(define (prog1 x) x)
+
+(define (pos X (OFF 0))
+  (+ (* SEGSZ X) OFF))
+
+(define (read-segment FILE X (OFF 0) (N SEGSZ))
+  (let ((FD (open FILE "r")) (BUFFER ""))
+    (seek FD (pos X OFF))
+    (prog1 (when (= N (read FD BUFFER N)) BUFFER)
+      (close FD))))
+
+(define (write-segment FILE X DATA (OFF 0))
+  (let ((FD (open FILE "u")))
+    (seek FD (pos X OFF))
+    (write FD DATA)
+    ;(seek FD -1)
+    (close FD)))
+
+(define (read-ulong FD)
+  (let ((BUFFER ""))
+    (when (= 8 (read FD BUFFER 8)) ((unpack "ld" BUFFER) 0))))
+
+(define (read-table)
+  (let ((AT (file-info BASE 0)) (FD (open OLY "r")) (COUNT 0) (OUT '()))
+    (seek FD AT)
+    (unless (setf COUNT (read-ulong FD))
+      (write-line 2 "** Bad count")
+      (exit 1))
+    (push COUNT OUT -1)
+    (dotimes (i COUNT)
+      (push (list (read-ulong FD) (read-ulong FD)) OUT -1))
+    OUT))
+
+(define (check-segment AT DATA (OFF 0))
+  (write-segment BASE AT DATA OFF)
+  (println
+   (format "check %2d %d: %s %s %s" AT
+           (length DATA)
+           (if (= (read-segment BASE AT OFF (length DATA)) DATA) "ok" "error")
+           (if (= (read-segment OLY AT OFF (length DATA)) DATA) "ok" "error")
+           (string (read-table))))
+  )
+  
+;; Test 1
+(seed (date-value))
+(setf
+ DATA (pack (dup "b" SEGSZ) (rand 256 SEGSZ))
+ DATB (pack (dup "b" (* 4 SEGSZ)) (rand 256 (* 4 SEGSZ)))
+ AT (- SEGN 4))
+(check-segment 0 DATA 0)
+
+(check-segment AT DATA)
+(check-segment (+ AT 2) DATA)
+(check-segment (+ AT 1) DATA)
+(check-segment (- AT 1) DATA -10)
+(check-segment (- AT 1) DATA 10)
+
+(check-segment 0 DATA 0)
+(check-segment 1 DATA 1)
+(check-segment 2 DATA 2)
+(check-segment 0 DATB 10)
+
+(check-segment (- SEGN 1) DATA 0)
+
+;(setf DATA (pack (dup "b" SEGSZ) (rand 256 SEGSZ)) AT (- SEGN 4))
+
+(exit 0)