1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
5 ;;;; Name: memstore-tests.lisp
6 ;;;; Purpose: memstore tests file
7 ;;;; Author: Kevin M. Rosenberg
8 ;;;; Date Started: July 2011
10 ;;;; This file is Copyright (c) 2011 by Kevin M. Rosenberg
12 ;;;; *************************************************************************
15 (defpackage #:memstore-tests
16 (:import-from #:rtest #:*compile-tests* #:*expected-failures*)
17 (:use #:memstore #:cl #:rtest)
18 (:import-from #:memstore #:mem-store #:mem-restore #:mem-del
19 #:serialize #:deserialize
20 #:serialize-clstore #:deserialize-clstore
21 #:serialize-string #:deserialize-string
22 #:+flag-wstring+ #:+flag-clstore+
23 #:+flag-zlib+ #:*realm*)
24 (:import-from #:memcache #:*memcache* #:*use-pool*
25 #:make-memcache-instance))
26 (in-package #:memstore-tests)
28 (eval-when (:compile-toplevel :load-toplevel :execute)
29 (defparameter *test-cnt* 0)
30 (defvar *test-realm* "__mctest__:"))
33 (setq *memcache* (make-memcache-instance :name "Memcache test")))
37 (defun run-tests (&key (compiled *compile-tests*))
38 (let ((*compile-tests* compiled))
41 (defmacro def-readably-value* (val)
43 (deftest ,(intern (format nil "DS.~D" *test-cnt*) '#:keyword)
44 (let* ((ser (serialize (quote ,val)))
47 ((stringp (quote ,val))
48 (unless (and (zerop (logand flags +flag-wstring+))
49 (zerop (logand flags +flag-clstore+)))
50 (error "Should be stored as simple string.")))
52 (unless (and (plusp (logand flags +flag-wstring+))
53 (zerop (logand flags +flag-clstore+)))
54 (error "Should be stored as wstring."))))
57 (deftest ,(intern (format nil "RS.~D" *test-cnt*) '#:keyword)
58 (deserialize-clstore (serialize-clstore (quote ,val)))
60 (deftest ,(intern (format nil "SS.~D" *test-cnt*) '#:keyword)
61 (deserialize-string (serialize-string (quote ,val)))
63 (deftest ,(intern (format nil "MC.~D" *test-cnt*) '#:keyword)
64 (let ((*realm* ,*test-realm*)
65 (key (format nil "~D" ,*test-cnt*)))
66 (mem-store key (quote ,val))
67 (multiple-value-bind (res found) (mem-restore key)
69 (values found (equalp res (quote ,val)))))
73 (defmacro def-readably-value (val)
75 (let ((*use-pool* nil))
76 (def-readably-value* ,val))
78 (def-readably-value* ,val))))
80 (def-readably-value -1)
81 (def-readably-value 10)
82 (def-readably-value 1.5)
83 (def-readably-value #C(1 2))
84 (def-readably-value "")
85 (def-readably-value "abc")
86 (def-readably-value nil)
87 (def-readably-value t)
88 (def-readably-value a)
89 (def-readably-value :a)
90 (def-readably-value (a b))
91 (def-readably-value (a . b))
92 (def-readably-value (:a . "b"))
93 (def-readably-value #(0 1 2))
94 (def-readably-value \#k)
95 (def-readably-value ((:a . 1) (:b . 2)))
96 (def-readably-value #(((:a . 1) (:b . 2.5))
97 ((:c . "a") (:d . a))))
100 (let ((h (make-hash-table :test 'equal)))
101 (setf (gethash "a" h) "A")
102 (setf (gethash "b" h) "B")
103 (let ((ds (deserialize (serialize h))))
104 (list (hash-table-count ds) (gethash "a" ds) (gethash "b" ds))))
107 (let ((h (make-hash-table :test 'equal)))
108 (setf (gethash "a" h) "A")
109 (setf (gethash "b" h) "B")
110 (let ((ds (deserialize-clstore (serialize-clstore h))))
111 (list (hash-table-count ds) (gethash "a" ds) (gethash "b" ds))))
116 (let ((h (make-hash-table :test 'equal)))
117 (setf (gethash "a" h) "A")
118 (setf (gethash "b" h) "B")
119 (serialize-string h)) ;; should be nil as hash tables can't be print-readably to string
122 ;; SBCL can print hash-tables readably
125 (let ((h (make-hash-table :test 'equal)))
126 (setf (gethash "a" h) "A")
127 (setf (gethash "b" h) "B")
128 (let ((ds (deserialize-string (serialize-string h))))
129 (list (hash-table-count ds) (gethash "a" ds) (gethash "b" ds))))
133 (defvar *long-string* (make-string 10000 :initial-element #\space))
134 (defvar *long-array* (make-array '(10000) :initial-element 0))
136 (let* ((ser (serialize *long-string*))
139 (values (< (length data) (length *long-string*))
140 (eql (logand flags +flag-zlib+) +flag-zlib+)
141 (zerop (logand flags +flag-wstring+))
142 (zerop (logand flags +flag-clstore+))
143 (string-equal *long-string* (deserialize ser))))
147 (let* ((ser (serialize *long-array*))
150 (values (< (length data) (length *long-array*))
151 (eql (logand flags +flag-zlib+) +flag-zlib+)
152 (eql (logand flags +flag-wstring+) +flag-wstring+)
153 (zerop (logand flags +flag-clstore+))
154 (equalp *long-array* (deserialize ser))))
158 (let ((*realm* *test-realm*))
163 (mem-incr "i" :delta 5)
164 (mem-incr "i" :delta 3)
165 (mem-decr "i" :delta 2)
168 "STORED" 0 1 6 9 7 6 "DELETED")
171 (let ((*realm* *test-realm*))