1 /* Copyright (C) 2007-2010 Open Information Security Foundation
3 * You can copy, redistribute or modify this Program under the terms of
4 * the GNU General Public License version 2 as published by the Free
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * version 2 along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 * \author Victor Julien <victor@inliniac.net>
22 * \author Pablo Rincon Crespo <pablo.rincon.crespo@gmail.com>
24 * This file now only contains unit tests see macros in threads.h
27 #include "suricata-common.h"
28 #include "util-unittest.h"
30 #include "util-debug.h"
33 #ifdef UNITTESTS /* UNIT TESTS */
36 * \brief Test Mutex macros
38 static int ThreadMacrosTest01Mutex(void)
42 r
|= SCMutexInit(&mut
, NULL
);
43 r
|= SCMutexLock(&mut
);
44 r
|= (SCMutexTrylock(&mut
) == EBUSY
)? 0 : 1;
45 r
|= SCMutexUnlock(&mut
);
46 r
|= SCMutexDestroy(&mut
);
48 return (r
== 0)? 1 : 0;
52 * \brief Test Spinlock Macros
54 * Valgrind's DRD tool (valgrind-3.5.0-Debian) reports:
56 * ==31156== Recursive locking not allowed: mutex 0x7fefff97c, recursion count 1, owner 1.
57 * ==31156== at 0x4C2C77E: pthread_spin_trylock (drd_pthread_intercepts.c:829)
58 * ==31156== by 0x40EB3E: ThreadMacrosTest02Spinlocks (threads.c:40)
59 * ==31156== by 0x532E8A: UtRunTests (util-unittest.c:182)
60 * ==31156== by 0x4065C3: main (suricata.c:789)
62 * To me this is a false positve, as the whole point of "trylock" is to see
63 * if a spinlock is actually locked.
66 static int ThreadMacrosTest02Spinlocks(void)
70 r
|= SCSpinInit(&mut
, 0);
71 r
|= SCSpinLock(&mut
);
73 r
|= (SCSpinTrylock(&mut
) == EBUSY
)? 0 : 1;
75 r
|= (SCSpinTrylock(&mut
) == EDEADLK
)? 0 : 1;
77 r
|= SCSpinUnlock(&mut
);
78 r
|= SCSpinDestroy(&mut
);
80 return (r
== 0)? 1 : 0;
84 * \brief Test RWLock macros
86 static int ThreadMacrosTest03RWLocks(void)
90 r
|= SCRWLockInit(&rwl_write
, NULL
);
91 r
|= SCRWLockWRLock(&rwl_write
);
92 /* OS X/macOS 10.10 (Yosemite) and newer return EDEADLK. Older versions
93 * and other tested OS's return EBUSY. */
94 #if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__>=101000
95 r
|= (SCRWLockTryWRLock(&rwl_write
) == EDEADLK
)? 0 : 1;
97 r
|= (SCRWLockTryWRLock(&rwl_write
) == EBUSY
)? 0 : 1;
99 r
|= SCRWLockUnlock(&rwl_write
);
100 r
|= SCRWLockDestroy(&rwl_write
);
102 return (r
== 0)? 1 : 0;
106 * \brief Test RWLock macros
108 static int ThreadMacrosTest04RWLocks(void)
112 r
|= SCRWLockInit(&rwl_read
, NULL
);
113 r
|= SCRWLockRDLock(&rwl_read
);
114 r
|= (SCRWLockTryWRLock(&rwl_read
) == EBUSY
)? 0 : 1;
115 r
|= SCRWLockUnlock(&rwl_read
);
116 r
|= SCRWLockDestroy(&rwl_read
);
118 return (r
== 0)? 1 : 0;
121 #if 0 // broken on OSX
123 * \brief Test RWLock macros
125 static int ThreadMacrosTest05RWLocks(void)
129 r
|= SCRWLockInit(&rwl_read
, NULL
);
130 r
|= SCRWLockWRLock(&rwl_read
);
131 r
|= (SCRWLockTryRDLock(&rwl_read
) == EBUSY
)? 0 : 1;
132 r
|= SCRWLockUnlock(&rwl_read
);
133 r
|= SCRWLockDestroy(&rwl_read
);
135 return (r
== 0)? 1 : 0;
139 #endif /* UNIT TESTS */
142 * \brief this function registers unit tests for DetectId
144 void ThreadMacrosRegisterTests(void)
146 #ifdef UNITTESTS /* UNIT TESTS */
147 UtRegisterTest("ThreadMacrosTest01Mutex", ThreadMacrosTest01Mutex
);
148 UtRegisterTest("ThreadMacrosTest02Spinlocks", ThreadMacrosTest02Spinlocks
);
149 UtRegisterTest("ThreadMacrosTest03RWLocks", ThreadMacrosTest03RWLocks
);
150 UtRegisterTest("ThreadMacrosTest04RWLocks", ThreadMacrosTest04RWLocks
);
151 // UtRegisterTest("ThreadMacrosTest05RWLocks", ThreadMacrosTest05RWLocks);
152 #endif /* UNIT TESTS */