added testsuite for the flags
[util-vserver.git] / util-vserver / lib / testsuite / flags.c
1 // $Id$    --*- c -*--
2
3 // Copyright (C) 2004 Enrico Scholz <ensc@delenn.intern.sigma-chemnitz.de>
4 //  
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; version 2 of the License.
8 //  
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //  
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18
19 #ifdef HAVE_CONFIG_H
20 #  include <config.h>
21 #endif
22
23 #include "vserver.h"
24 #include <assert.h>
25 #include <string.h>
26
27 #define TEST_T2F_C(X,Y,Z) assert(vc_text2flag_compat(X,Y)==Z)
28 #define TEST_F2T_C(Y,X) {                       \
29     char const *x=vc_hiflag2text_compat(X);     \
30     assert((x==0 && Y==0) || (x!=0 && Y!=0));   \
31     if (x!=0) assert(strcmp(x, Y)==0);          \
32   }
33
34 #define TEST_LIST_C(STR,LEN,EXP,ERR_POS,ERR_LEN) {      \
35     struct vc_err_listparser    err;                    \
36     char                        buf[] = STR;            \
37     uint32_t                    res;                    \
38     res = vc_list2flag_compat(buf, LEN, &err);          \
39     assert(res==(EXP));                                 \
40     assert(err.len==ERR_LEN);                           \
41     if (ERR_POS==-1) assert(err.ptr==0);                \
42     else             assert(err.ptr==buf+(ERR_POS));    \
43   }
44
45 //----
46
47 #define TEST_T2F(X,Y,Z) assert(vc_text2flag(X,Y)==Z)
48 #define TEST_F2T(Y,X) {                         \
49     uint_least64_t x = (X);                     \
50     char const *rc=vc_loflag2text(&x);          \
51     assert((rc==0 && Y==0) || (rc!=0 && Y!=0)); \
52     if (rc!=0) assert(strcmp(rc, Y)==0);        \
53   }
54 #define TEST_LIST(STR,LEN,EXP_RES,EXP_FLAG,EXP_MASK,ERR_POS,ERR_LEN) {  \
55     struct vc_err_listparser    err;                                    \
56     char                        buf[] = STR;                            \
57     volatile int                res;                                    \
58     struct vc_ctx_flags         flags = {0,0};                          \
59     res = vc_list2flag(buf, LEN, &err, &flags);                         \
60     assert(res==(EXP_RES));                                             \
61     assert(flags.flagword==(EXP_FLAG));                                 \
62     assert(flags.mask    ==(EXP_MASK));                                 \
63     assert(err.len==ERR_LEN);                                           \
64     if (ERR_POS==-1) assert(err.ptr==0);                                \
65     else             assert(err.ptr==buf+(ERR_POS));                    \
66   }
67
68 #define ALL64           (~(uint_least64_t)(0))
69
70 int main()
71 {
72   TEST_T2F_C("lock",     0, S_CTX_INFO_LOCK);
73   TEST_T2F_C("lockXXXX", 4, S_CTX_INFO_LOCK);
74   TEST_T2F_C("locXXXXX", 3, 0);
75   TEST_T2F_C("sched",    0, S_CTX_INFO_SCHED);
76   TEST_T2F_C("nproc",    0, S_CTX_INFO_NPROC);
77   TEST_T2F_C("private",  0, S_CTX_INFO_PRIVATE);
78   TEST_T2F_C("fakeinit", 0, S_CTX_INFO_INIT);
79   TEST_T2F_C("hideinfo", 0, S_CTX_INFO_HIDEINFO);
80   TEST_T2F_C("ulimit",   0, S_CTX_INFO_ULIMIT);
81   TEST_T2F_C("XXX",      0, 0);
82   TEST_T2F_C("",         0, 0);
83
84   TEST_F2T_C("lock",     S_CTX_INFO_LOCK);
85   TEST_F2T_C("sched",    S_CTX_INFO_SCHED);
86   TEST_F2T_C("nproc",    S_CTX_INFO_NPROC);
87   TEST_F2T_C("private",  S_CTX_INFO_PRIVATE);
88   TEST_F2T_C("fakeinit", S_CTX_INFO_INIT);
89   TEST_F2T_C("hideinfo", S_CTX_INFO_HIDEINFO);
90   TEST_F2T_C("ulimit",   S_CTX_INFO_ULIMIT);
91   TEST_F2T_C(0,          0);
92   TEST_F2T_C("ulimit",   64 | 128 | 23 );
93   TEST_F2T_C("fakeinit", 23);
94
95   TEST_LIST_C("lock",         0, S_CTX_INFO_LOCK,                  -1,0);
96   TEST_LIST_C("lock,sched,",  0, S_CTX_INFO_LOCK|S_CTX_INFO_SCHED, -1,0);
97   TEST_LIST_C("lock,XXX",     0, S_CTX_INFO_LOCK,                   5,3);
98   TEST_LIST_C("",             0, 0,                                -1,0);
99   TEST_LIST_C("X",            0, 0,                                 0,1);
100   TEST_LIST_C("lock,sched,", 10, S_CTX_INFO_LOCK|S_CTX_INFO_SCHED, -1,0);
101
102   //-------
103
104   TEST_T2F("fakeinit", 0, VC_VXF_INFO_INIT);
105   TEST_T2F("XXX",      0, 0);
106   TEST_T2F("",         0, 0);
107   
108   TEST_F2T("fakeinit", VC_VXF_INFO_INIT);
109   TEST_F2T(0,          0);
110
111   TEST_LIST("fakeinit",     0,  0, VC_VXF_INFO_INIT, VC_VXF_INFO_INIT,-1,0);
112   TEST_LIST("~fakeinit",    0,  0, 0,               VC_VXF_INFO_INIT,-1,0);
113   TEST_LIST("!fakeinit",    0,  0, 0,               VC_VXF_INFO_INIT,-1,0);
114   TEST_LIST("fakeinit,XXX", 0, -1, VC_VXF_INFO_INIT, VC_VXF_INFO_INIT, 9,3);
115   TEST_LIST("",             0,  0, 0,               0,              -1,0);
116   TEST_LIST("X",            0, -1, 0,               0,               0,1);
117   TEST_LIST("all",          0,  0, ALL64,           ALL64,          -1,0);
118   TEST_LIST("ALL",          0,  0, ALL64,           ALL64,          -1,0);
119   TEST_LIST("any",          0,  0, ALL64,           ALL64,          -1,0);
120   TEST_LIST("ANY",          0,  0, ALL64,           ALL64,          -1,0);
121   TEST_LIST("~all",         0,  0, 0,               ALL64,          -1,0);
122   TEST_LIST("~ALL",         0,  0, 0,               ALL64,          -1,0);
123   TEST_LIST("all,~fakeinit",0,  0, ~VC_VXF_INFO_INIT,ALL64,          -1,0);
124   TEST_LIST("~all,fakeinit",0,  0, VC_VXF_INFO_INIT, ALL64,          -1,0);
125   TEST_LIST("fakeinit,~all",0,  0, 0,               ALL64,          -1,0);
126   TEST_LIST("~",            0, -1, 0,               0,               1,0);
127   TEST_LIST("fakeinit,~",   0, -1, VC_VXF_INFO_INIT, VC_VXF_INFO_INIT,10,0);
128   TEST_LIST("1",            0,  0, 1,               1,              -1,0);
129   TEST_LIST("1,23,42",      0,  0, 1|23|42,         1|23|42,        -1,0);
130   TEST_LIST("~1",           0,  0, 0,               1,              -1,0);
131   TEST_LIST("42,fakeinit",  0,  0, VC_VXF_INFO_INIT|42, VC_VXF_INFO_INIT|42, -1,0);
132   TEST_LIST("42x,1",        0, -1, 0,               0,               0,3);
133
134   TEST_LIST("^4,~^2",       0,  0, 0x10,            0x14,           -1,0);
135
136   TEST_LIST("lock,nproc,private,fakeinit,hide,ulimit,nspace,hard,prio,pause,mem,uptime,setup,init",
137             0, 0,
138             VC_VXF_INFO_LOCK|VC_VXF_INFO_NPROC|VC_VXF_INFO_PRIVATE|VC_VXF_INFO_INIT|
139             VC_VXF_INFO_HIDE|VC_VXF_INFO_ULIMIT|VC_VXF_INFO_NSPACE|
140             VC_VXF_SCHED_HARD|VC_VXF_SCHED_PRIO|VC_VXF_SCHED_PAUSE|
141             VC_VXF_VIRT_MEM|VC_VXF_VIRT_UPTIME|
142             VC_VXF_STATE_SETUP|VC_VXF_STATE_INIT,
143
144             VC_VXF_INFO_LOCK|VC_VXF_INFO_NPROC|VC_VXF_INFO_PRIVATE|VC_VXF_INFO_INIT|
145             VC_VXF_INFO_HIDE|VC_VXF_INFO_ULIMIT|VC_VXF_INFO_NSPACE|
146             VC_VXF_SCHED_HARD|VC_VXF_SCHED_PRIO|VC_VXF_SCHED_PAUSE|
147             VC_VXF_VIRT_MEM|VC_VXF_VIRT_UPTIME|
148             VC_VXF_STATE_SETUP|VC_VXF_STATE_INIT,
149
150             -1,0);
151
152   TEST_LIST("~lock,~nproc,~private,~fakeinit,~hide,~ulimit,~nspace,~hard,~prio,~pause,~mem,~uptime,~setup,~init",
153             0, 0,
154             0,
155             VC_VXF_INFO_LOCK|VC_VXF_INFO_NPROC|VC_VXF_INFO_PRIVATE|VC_VXF_INFO_INIT|
156             VC_VXF_INFO_HIDE|VC_VXF_INFO_ULIMIT|VC_VXF_INFO_NSPACE|
157             VC_VXF_SCHED_HARD|VC_VXF_SCHED_PRIO|VC_VXF_SCHED_PAUSE|
158             VC_VXF_VIRT_MEM|VC_VXF_VIRT_UPTIME|
159             VC_VXF_STATE_SETUP|VC_VXF_STATE_INIT,
160
161             -1,0);
162   
163             
164   return 0;
165 }
166