aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2013-02-15 10:48:59 -0500
committerBjoern Brandenburg <bbb@mpi-sws.org>2013-02-15 10:48:59 -0500
commit7051511d6b059097f2eb5f650294e0ead7d8f488 (patch)
treeca8d7cd5fecc7c143cf3a673a9770c68f3deda94
parentf308b757af1574632627b727c90e08a65b1dfc96 (diff)
Add test cases that check whether nesting is prohibited
The kernel should deny attempts to nest resources in ways that are not supported.
-rw-r--r--tests/nesting.c468
1 files changed, 468 insertions, 0 deletions
diff --git a/tests/nesting.c b/tests/nesting.c
new file mode 100644
index 0000000..7b30715
--- /dev/null
+++ b/tests/nesting.c
@@ -0,0 +1,468 @@
1#include <fcntl.h>
2#include <unistd.h>
3#include <stdio.h>
4
5#include "tests.h"
6#include "litmus.h"
7
8TESTCASE(lock_fmlp_nesting, PSN_EDF | GSN_EDF | P_FP,
9 "FMLP no nesting allowed")
10{
11 int fd, od, od2;
12
13 SYSCALL( fd = open(".fmlp_locks", O_RDONLY | O_CREAT) );
14
15 SYSCALL( sporadic_partitioned(10, 100, 0) );
16 SYSCALL( task_mode(LITMUS_RT_TASK) );
17
18 SYSCALL( od = open_fmlp_sem(fd, 0) );
19 SYSCALL( od2 = open_fmlp_sem(fd, 1) );
20
21 SYSCALL( litmus_lock(od) );
22 SYSCALL( litmus_unlock(od) );
23
24 SYSCALL( litmus_lock(od2) );
25 SYSCALL( litmus_unlock(od2) );
26
27 SYSCALL( litmus_lock(od) );
28 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
29 SYSCALL( litmus_unlock(od) );
30
31 SYSCALL( litmus_lock(od2) );
32 SYSCALL_FAILS(EBUSY, litmus_lock(od));
33 SYSCALL( litmus_unlock(od2) );
34
35 SYSCALL( od_close(od) );
36 SYSCALL( od_close(od2) );
37
38 SYSCALL( close(fd) );
39
40 SYSCALL( remove(".fmlp_locks") );
41}
42
43TESTCASE(lock_fmlp_srp_nesting, PSN_EDF | P_FP,
44 "FMLP no nesting with SRP resources allowed")
45{
46 int fd, od, od2;
47
48 SYSCALL( fd = open(".fmlp_locks", O_RDONLY | O_CREAT) );
49
50 SYSCALL( sporadic_partitioned(10, 100, 0) );
51 SYSCALL( task_mode(LITMUS_RT_TASK) );
52
53 SYSCALL( od = open_fmlp_sem(fd, 0) );
54 SYSCALL( od2 = open_srp_sem(fd, 1) );
55
56 SYSCALL( litmus_lock(od) );
57 SYSCALL( litmus_unlock(od) );
58
59 SYSCALL( litmus_lock(od2) );
60 SYSCALL( litmus_unlock(od2) );
61
62 SYSCALL( litmus_lock(od) );
63 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
64 SYSCALL( litmus_unlock(od) );
65
66 SYSCALL( litmus_lock(od2) );
67 SYSCALL_FAILS(EBUSY, litmus_lock(od));
68 SYSCALL( litmus_unlock(od2) );
69
70 SYSCALL( od_close(od) );
71 SYSCALL( od_close(od2) );
72
73 SYSCALL( close(fd) );
74
75 SYSCALL( remove(".fmlp_locks") );
76}
77
78TESTCASE(lock_srp_nesting, PSN_EDF | P_FP,
79 "SRP nesting allowed")
80{
81 int fd, od, od2;
82
83 SYSCALL( fd = open(".fmlp_locks", O_RDONLY | O_CREAT) );
84
85 SYSCALL( sporadic_partitioned(10, 100, 0) );
86 SYSCALL( task_mode(LITMUS_RT_TASK) );
87
88 SYSCALL( od = open_srp_sem(fd, 0) );
89 SYSCALL( od2 = open_srp_sem(fd, 1) );
90
91 SYSCALL( litmus_lock(od) );
92 SYSCALL( litmus_unlock(od) );
93
94 SYSCALL( litmus_lock(od2) );
95 SYSCALL( litmus_unlock(od2) );
96
97 SYSCALL( litmus_lock(od) );
98 SYSCALL( litmus_lock(od2) );
99 SYSCALL( litmus_unlock(od2) );
100 SYSCALL( litmus_unlock(od) );
101
102 SYSCALL( litmus_lock(od2) );
103 SYSCALL( litmus_lock(od) );
104 SYSCALL( litmus_unlock(od) );
105 SYSCALL( litmus_unlock(od2) );
106
107 SYSCALL( od_close(od) );
108 SYSCALL( od_close(od2) );
109
110 SYSCALL( close(fd) );
111
112 SYSCALL( remove(".fmlp_locks") );
113}
114
115TESTCASE(lock_pcp_nesting, P_FP,
116 "PCP nesting allowed")
117{
118 int od, od2;
119 const char* namespace = ".pcp_locks";
120
121 SYSCALL( sporadic_partitioned(10, 100, 0) );
122 SYSCALL( task_mode(LITMUS_RT_TASK) );
123
124 SYSCALL( od = litmus_open_lock(PCP_SEM, 0, namespace, NULL) );
125 SYSCALL( od2 = litmus_open_lock(PCP_SEM, 1, namespace, NULL) );
126
127 SYSCALL( litmus_lock(od) );
128 SYSCALL( litmus_unlock(od) );
129
130 SYSCALL( litmus_lock(od2) );
131 SYSCALL( litmus_unlock(od2) );
132
133 SYSCALL( litmus_lock(od) );
134 SYSCALL( litmus_lock(od2) );
135 SYSCALL( litmus_unlock(od2) );
136 SYSCALL( litmus_unlock(od) );
137
138 SYSCALL( litmus_lock(od2) );
139 SYSCALL( litmus_lock(od) );
140 SYSCALL( litmus_unlock(od) );
141 SYSCALL( litmus_unlock(od2) );
142
143 SYSCALL( od_close(od) );
144 SYSCALL( od_close(od2) );
145
146 SYSCALL( remove(namespace) );
147}
148
149TESTCASE(lock_mpcp_pcp_no_nesting, P_FP,
150 "PCP and MPCP nesting not allowed")
151{
152 int od, od2;
153 const char* namespace = ".pcp_locks";
154
155 SYSCALL( sporadic_partitioned(10, 100, 0) );
156 SYSCALL( task_mode(LITMUS_RT_TASK) );
157
158 SYSCALL( od = litmus_open_lock(PCP_SEM, 0, namespace, NULL) );
159 SYSCALL( od2 = litmus_open_lock(MPCP_SEM, 1, namespace, NULL) );
160
161 SYSCALL( litmus_lock(od) );
162 SYSCALL( litmus_unlock(od) );
163
164 SYSCALL( litmus_lock(od2) );
165 SYSCALL( litmus_unlock(od2) );
166
167 SYSCALL( litmus_lock(od) );
168 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
169 SYSCALL( litmus_unlock(od) );
170
171 SYSCALL( litmus_lock(od2) );
172 SYSCALL_FAILS(EBUSY, litmus_lock(od));
173 SYSCALL( litmus_unlock(od2) );
174
175 SYSCALL( od_close(od) );
176 SYSCALL( od_close(od2) );
177
178 SYSCALL( remove(namespace) );
179}
180
181TESTCASE(lock_fmlp_pcp_no_nesting, P_FP,
182 "PCP and FMLP nesting not allowed")
183{
184 int od, od2;
185 const char* namespace = ".pcp_locks";
186
187 SYSCALL( sporadic_partitioned(10, 100, 0) );
188 SYSCALL( task_mode(LITMUS_RT_TASK) );
189
190 SYSCALL( od = litmus_open_lock(PCP_SEM, 0, namespace, NULL) );
191 SYSCALL( od2 = litmus_open_lock(FMLP_SEM, 1, namespace, NULL) );
192
193 SYSCALL( litmus_lock(od) );
194 SYSCALL( litmus_unlock(od) );
195
196 SYSCALL( litmus_lock(od2) );
197 SYSCALL( litmus_unlock(od2) );
198
199 SYSCALL( litmus_lock(od) );
200 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
201 SYSCALL( litmus_unlock(od) );
202
203 SYSCALL( litmus_lock(od2) );
204 SYSCALL_FAILS(EBUSY, litmus_lock(od));
205 SYSCALL( litmus_unlock(od2) );
206
207 SYSCALL( od_close(od) );
208 SYSCALL( od_close(od2) );
209
210 SYSCALL( remove(namespace) );
211}
212
213TESTCASE(lock_dpcp_pcp_no_nesting, P_FP,
214 "PCP and DPCP nesting not allowed")
215{
216 int od, od2;
217 int cpu = 0;
218 const char* namespace = ".pcp_locks";
219
220 SYSCALL( sporadic_partitioned(10, 100, 0) );
221 SYSCALL( task_mode(LITMUS_RT_TASK) );
222
223 SYSCALL( od = litmus_open_lock(PCP_SEM, 0, namespace, NULL) );
224 SYSCALL( od2 = litmus_open_lock(DPCP_SEM, 1, namespace, &cpu) );
225
226 SYSCALL( litmus_lock(od) );
227 SYSCALL( litmus_unlock(od) );
228
229 SYSCALL( litmus_lock(od2) );
230 SYSCALL( litmus_unlock(od2) );
231
232 SYSCALL( litmus_lock(od) );
233 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
234 SYSCALL( litmus_unlock(od) );
235
236 SYSCALL( litmus_lock(od2) );
237 SYSCALL_FAILS(EBUSY, litmus_lock(od));
238 SYSCALL( litmus_unlock(od2) );
239
240 SYSCALL( od_close(od) );
241 SYSCALL( od_close(od2) );
242
243 SYSCALL( remove(namespace) );
244}
245
246TESTCASE(lock_mpcp_srp_no_nesting, P_FP,
247 "SRP and MPCP nesting not allowed")
248{
249 int od, od2;
250 const char* namespace = ".pcp_locks";
251
252 SYSCALL( sporadic_partitioned(10, 100, 0) );
253 SYSCALL( task_mode(LITMUS_RT_TASK) );
254
255 SYSCALL( od = litmus_open_lock(SRP_SEM, 0, namespace, NULL) );
256 SYSCALL( od2 = litmus_open_lock(MPCP_SEM, 1, namespace, NULL) );
257
258 SYSCALL( litmus_lock(od) );
259 SYSCALL( litmus_unlock(od) );
260
261 SYSCALL( litmus_lock(od2) );
262 SYSCALL( litmus_unlock(od2) );
263
264 SYSCALL( litmus_lock(od) );
265 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
266 SYSCALL( litmus_unlock(od) );
267
268 SYSCALL( litmus_lock(od2) );
269 SYSCALL_FAILS(EBUSY, litmus_lock(od));
270 SYSCALL( litmus_unlock(od2) );
271
272 SYSCALL( od_close(od) );
273 SYSCALL( od_close(od2) );
274
275 SYSCALL( remove(namespace) );
276}
277
278TESTCASE(lock_dpcp_srp_no_nesting, P_FP,
279 "SRP and DPCP nesting not allowed")
280{
281 int od, od2;
282 int cpu = 0;
283 const char* namespace = ".pcp_locks";
284
285 SYSCALL( sporadic_partitioned(10, 100, 0) );
286 SYSCALL( task_mode(LITMUS_RT_TASK) );
287
288 SYSCALL( od = litmus_open_lock(SRP_SEM, 0, namespace, NULL) );
289 SYSCALL( od2 = litmus_open_lock(DPCP_SEM, 1, namespace, &cpu) );
290
291 SYSCALL( litmus_lock(od) );
292 SYSCALL( litmus_unlock(od) );
293
294 SYSCALL( litmus_lock(od2) );
295 SYSCALL( litmus_unlock(od2) );
296
297 SYSCALL( litmus_lock(od) );
298 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
299 SYSCALL( litmus_unlock(od) );
300
301 SYSCALL( litmus_lock(od2) );
302 SYSCALL_FAILS(EBUSY, litmus_lock(od));
303 SYSCALL( litmus_unlock(od2) );
304
305 SYSCALL( od_close(od) );
306 SYSCALL( od_close(od2) );
307
308 SYSCALL( remove(namespace) );
309}
310
311TESTCASE(lock_fmlp_mpcp_no_nesting, P_FP,
312 "MPCP and FMLP nesting not allowed")
313{
314 int od, od2;
315 const char* namespace = ".pcp_locks";
316
317 SYSCALL( sporadic_partitioned(10, 100, 0) );
318 SYSCALL( task_mode(LITMUS_RT_TASK) );
319
320 SYSCALL( od = litmus_open_lock(MPCP_SEM, 0, namespace, NULL) );
321 SYSCALL( od2 = litmus_open_lock(FMLP_SEM, 1, namespace, NULL) );
322
323 SYSCALL( litmus_lock(od) );
324 SYSCALL( litmus_unlock(od) );
325
326 SYSCALL( litmus_lock(od2) );
327 SYSCALL( litmus_unlock(od2) );
328
329 SYSCALL( litmus_lock(od) );
330 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
331 SYSCALL( litmus_unlock(od) );
332
333 SYSCALL( litmus_lock(od2) );
334 SYSCALL_FAILS(EBUSY, litmus_lock(od));
335 SYSCALL( litmus_unlock(od2) );
336
337 SYSCALL( od_close(od) );
338 SYSCALL( od_close(od2) );
339
340 SYSCALL( remove(namespace) );
341}
342
343TESTCASE(lock_fmlp_dpcp_no_nesting, P_FP,
344 "DPCP and FMLP nesting not allowed")
345{
346 int od, od2;
347 const char* namespace = ".pcp_locks";
348 int cpu = 0;
349
350 SYSCALL( sporadic_partitioned(10, 100, 0) );
351 SYSCALL( task_mode(LITMUS_RT_TASK) );
352
353 SYSCALL( od = litmus_open_lock(DPCP_SEM, 0, namespace, &cpu) );
354 SYSCALL( od2 = litmus_open_lock(FMLP_SEM, 1, namespace, NULL) );
355
356 SYSCALL( litmus_lock(od) );
357 SYSCALL( litmus_unlock(od) );
358
359 SYSCALL( litmus_lock(od2) );
360 SYSCALL( litmus_unlock(od2) );
361
362 SYSCALL( litmus_lock(od) );
363 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
364 SYSCALL( litmus_unlock(od) );
365
366 SYSCALL( litmus_lock(od2) );
367 SYSCALL_FAILS(EBUSY, litmus_lock(od));
368 SYSCALL( litmus_unlock(od2) );
369
370 SYSCALL( od_close(od) );
371 SYSCALL( od_close(od2) );
372
373 SYSCALL( remove(namespace) );
374}
375
376TESTCASE(mpcp_nesting, P_FP,
377 "MPCP no nesting allowed")
378{
379 int od, od2;
380
381 SYSCALL( sporadic_partitioned(10, 100, 0) );
382 SYSCALL( task_mode(LITMUS_RT_TASK) );
383
384 SYSCALL( od = litmus_open_lock(MPCP_SEM, 0, ".mpcp_locks", NULL) );
385 SYSCALL( od2 = litmus_open_lock(MPCP_SEM, 1, ".mpcp_locks", NULL) );
386
387 SYSCALL( litmus_lock(od) );
388 SYSCALL( litmus_unlock(od) );
389
390 SYSCALL( litmus_lock(od2) );
391 SYSCALL( litmus_unlock(od2) );
392
393 SYSCALL( litmus_lock(od) );
394 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
395 SYSCALL( litmus_unlock(od) );
396
397 SYSCALL( litmus_lock(od2) );
398 SYSCALL_FAILS(EBUSY, litmus_lock(od));
399 SYSCALL( litmus_unlock(od2) );
400
401 SYSCALL( od_close(od) );
402 SYSCALL( od_close(od2) );
403
404 SYSCALL( remove(".mpcp_locks") );
405}
406
407TESTCASE(mpcpvs_nesting, P_FP,
408 "MPCP-VS no nesting allowed")
409{
410 int od, od2;
411
412 SYSCALL( sporadic_partitioned(10, 100, 0) );
413 SYSCALL( task_mode(LITMUS_RT_TASK) );
414
415 SYSCALL( od = litmus_open_lock(MPCP_VS_SEM, 0, ".mpcp_locks", NULL) );
416 SYSCALL( od2 = litmus_open_lock(MPCP_VS_SEM, 1, ".mpcp_locks", NULL) );
417
418 SYSCALL( litmus_lock(od) );
419 SYSCALL( litmus_unlock(od) );
420
421 SYSCALL( litmus_lock(od2) );
422 SYSCALL( litmus_unlock(od2) );
423
424 SYSCALL( litmus_lock(od) );
425 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
426 SYSCALL( litmus_unlock(od) );
427
428 SYSCALL( litmus_lock(od2) );
429 SYSCALL_FAILS(EBUSY, litmus_lock(od));
430 SYSCALL( litmus_unlock(od2) );
431
432 SYSCALL( od_close(od) );
433 SYSCALL( od_close(od2) );
434
435 SYSCALL( remove(".mpcp_locks") );
436}
437
438TESTCASE(dpcp_nesting, P_FP,
439 "DPCP no nesting allowed")
440{
441 int od, od2;
442 int cpu = 0;
443
444 SYSCALL( sporadic_partitioned(10, 100, 0) );
445 SYSCALL( task_mode(LITMUS_RT_TASK) );
446
447 SYSCALL( od = litmus_open_lock(DPCP_SEM, 0, ".dpcp_locks", &cpu) );
448 SYSCALL( od2 = litmus_open_lock(DPCP_SEM, 1, ".dpcp_locks", &cpu) );
449
450 SYSCALL( litmus_lock(od) );
451 SYSCALL( litmus_unlock(od) );
452
453 SYSCALL( litmus_lock(od2) );
454 SYSCALL( litmus_unlock(od2) );
455
456 SYSCALL( litmus_lock(od) );
457 SYSCALL_FAILS(EBUSY, litmus_lock(od2));
458 SYSCALL( litmus_unlock(od) );
459
460 SYSCALL( litmus_lock(od2) );
461 SYSCALL_FAILS(EBUSY, litmus_lock(od));
462 SYSCALL( litmus_unlock(od2) );
463
464 SYSCALL( od_close(od) );
465 SYSCALL( od_close(od2) );
466
467 SYSCALL( remove(".dpcp_locks") );
468}