newlisp/qa-specific-tests/qa-libc-libffi

117 lines
3.9 KiB
Text
Executable file

#!/usr/bin/newlisp
; Test libffi routines - all of the tests are performed using only the
; OS platforms libc system library. For tests compiling a C libray
; with source code in util/ffitest.c see qa-libffi
; some simple libc functions
; when doing "make testall" only text lines starting with ">>>" are printed
(set-locale "C")
(when (zero? (& 1024 (sys-info -1)))
(println ">>>>> qa-libc-libffi: tests only run on extended FFI enabled versions compiled with ffilib")
(exit))
(set 'is64bit (not (zero? (& 256 (sys-info -1))))) ; used later
(define (get-libc-name)
(letn (libc-name (first (exec "gcc -print-file-name=libc.so"))
libc-filetype (first (exec (string "file -b " libc-name))))
(if (find "ASCII" libc-filetype)
(first (regex "[^ \t]+/libc\\.so\\.*[0-9]*" (read-file libc-name)))
libc-name))
)
(define LIBC
(case ostype
("Windows" "msvcrt.dll")
("Cygwin" "msvcrt.dll")
("OSX" "libc.dylib")
("BSD" (get-libc-name) )
("Linux" (get-libc-name) )
))
(println "\nTesting imports from " LIBC "\n")
(unless (catch (import LIBC "sprintf" "int" "char*" "char*" "int" "double") 'result)
(println ">>>>> ERR cannot find library in qa-libc-libffi")
(exit))
(set 'buff (dup "\000" 64))
(sprintf buff "int 42 => %i, double Pi => %6.4f" 42 (mul 2 (acos 0)))
(set 'buff (get-string buff)) ;; trim buff of trailing zeroes
(println "->" buff "<-")
(unless (= buff "int 42 => 42, double Pi => 3.1416")
(println ">>>>> ERR problem importing sprinf() in qa-libc-libffi"))
(import LIBC "atof" "double" "char*")
(println {(atof "3.141") => } (atof "3.141"))
(unless (= (atof "3.141") 3.141)
(println ">>>>> ERR problem importing atof() in qa-libc-libffi"))
(import LIBC "atoi" "int" "char*")
(println {(atoi "3434") => } (atoi "3434"))
(unless (= (atoi "3434") 3434)
(println ">>>>> ERR problem importing atoi() in qa-libc-libffi"))
(import LIBC "strcpy" "char*" "char*" "char*")
(set 'from "Hello World")
(set 'to (dup "\000" (length from)))
(strcpy to from)
(println "(strcpy from to) => " to)
(unless (= to from)
(println ">>>>> ERR problem importing strcpy() in qa-libc-libffi"))
(when (!= ostype "Linux")
(import LIBC "fabs" "double" "double")
(println {(fabs -8.230) => } (fabs 8.230))
(println {(fabs 3.14159) => } (fabs 3.14159))
(unless (and (= (fabs -8.230) 8.230) (= (fabs 3.14159) 3.14159))
(println ">>>>> ERR problem importing fabs() in qa-libc-libffi"))
)
; test struct pack unpack
(import LIBC "asctime" "char*" "void*")
(import LIBC "localtime" "void*" "void*")
(if (find ostype '("Windows"))
(struct 'tm "int" "int" "int" "int" "int" "int" "int" "int" "int")
(struct 'tm "int" "int" "int" "int" "int" "int" "int" "int" "int" "long" "char*")
)
(if (find ostype '("Windows" "Cygwin"))
(set 'tmlist '(1 2 3 4 5 6 7 8 9))
(set 'tmlist '(1 2 3 4 5 6 7 8 9 10 "hello world")))
(if (= tmlist (unpack tm (pack tm tmlist)))
(println "unpack pack => true")
(println ">>>>> ERR problem in struct pack/unpack in qa-libc-libffi"))
(set 'ptr (localtime (address (date-value))))
(println "unpack localtime structure => " (unpack tm ptr))
(println "struct testing, today => " (asctime (localtime (address (date-value)))))
; test callback
(import LIBC "qsort" "void" "void*" "int" "int" "void*")
(set 'len 1000)
(set 'rlist (rand 10 len))
(set 'carray (pack (dup "ld " len) rlist))
(define (cmp a b) (- (get-int a) (get-int b)))
(qsort (address carray) len 4 (callback 'cmp "int" "void*" "void*"))
(println "qsort " len " elements => " (apply <= (unpack (dup "ld " len) carray)))
(unless (apply <= (unpack (dup "ld " len) carray))
(println ">>>>> ERR problem in import qsort() with callback in qa-libc-libffi"))
(unless (= ostype "Linux")
(import LIBC "atexit" "void" "void*")
(define (quit) (println "-> Quit ! => true"))
(print "atexit callback => ")
(atexit (callback 'quit "void" "void"))
)
(exit)