Files
improvise/crates/zset-ffi/tests/smoke.lisp
T

43 lines
1.9 KiB
Common Lisp

;;; A CFFI smoke test: load libzset_ffi, add weights, query, hit the overflow code, free.
;;; Run: sbcl --non-interactive --load ~/quicklisp/setup.lisp \
;;; --eval '(defvar cl-user::*zset-lib* "target/release/libzset_ffi.dylib")' \
;;; --load crates/zset-ffi/tests/smoke.lisp
;;; Not a CI gate: sbcl and cffi are not in the dev shell. See context/code/zset-ffi.md.
(ql:quickload :cffi :silent t)
(defpackage :zset-smoke (:use :cl :cffi))
(in-package :zset-smoke)
(load-foreign-library cl-user::*zset-lib*)
(defcfun "zs_abi_version" :uint32)
(defcfun "zs_last_error" :string)
(defcfun "zs_zset_new" :int32 (out :pointer))
(defcfun "zs_zset_free" :void (z :pointer))
(defcfun "zs_zset_insert" :int32 (z :pointer) (key :pointer) (len :size) (weight :int64))
(defcfun "zs_zset_weight" :int32 (z :pointer) (key :pointer) (len :size) (out :pointer))
(defcfun "zs_zset_len" :int32 (z :pointer) (out :pointer))
(defconstant +overflow+ 2)
(defun check (what got want)
(unless (equal got want) (error "~a: got ~s, wanted ~s" what got want))
(format t "ok ~a~%" what))
(defun key-call (fn z key &rest more)
"Calls FN with Z, a foreign copy of the string KEY's UTF-8 bytes, its length, MORE."
(with-foreign-string ((ptr len) key :null-terminated-p nil)
(apply fn z ptr len more)))
(with-foreign-object (out :pointer)
(check "new" (zs-zset-new out) 0)
(let ((z (mem-ref out :pointer)))
(check "insert" (key-call #'zs-zset-insert z "k" 40) 0)
(check "insert again" (key-call #'zs-zset-insert z "k" 2) 0)
(with-foreign-object (w :int64)
(check "weight" (progn (key-call #'zs-zset-weight z "k" w) (mem-ref w :int64)) 42)
(check "overflow code" (key-call #'zs-zset-insert z "k" (1- (expt 2 63))) +overflow+)
(check "error text" (and (search "overflow" (zs-last-error)) t) t)
(check "unchanged" (progn (key-call #'zs-zset-weight z "k" w) (mem-ref w :int64)) 42))
(zs-zset-free z)))
(format t "zset smoke: all ok~%")