• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2
3################################################################################
4##                                                                            ##
5## Copyright (c) 2015 SUSE                                                    ##
6##                                                                            ##
7## This program is free software;  you can redistribute it and#or modify      ##
8## it under the terms of the GNU General Public License as published by       ##
9## the Free Software Foundation; either version 2 of the License, or          ##
10## (at your option) any later version.                                        ##
11##                                                                            ##
12## This program is distributed in the hope that it will be useful, but        ##
13## WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY ##
14## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   ##
15## for more details.                                                          ##
16##                                                                            ##
17## You should have received a copy of the GNU General Public License          ##
18## along with this program;  if not, write to the Free Software               ##
19## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301   ##
20## USA                                                                        ##
21##                                                                            ##
22## Author: Cedric Hnyda <chnyda@suse.com>                                     ##
23##                                                                            ##
24################################################################################
25
26# Usage
27# ./pids.sh caseno max
28#
29TST_CLEANUP=cleanup
30TST_SETUP=setup
31TST_TESTFUNC=do_test
32TST_POS_ARGS=2
33TST_USAGE=usage
34TST_NEEDS_ROOT=1
35
36. tst_test.sh
37
38caseno=$1
39max=$2
40mounted=1
41
42usage()
43{
44	cat << EOF
45usage: $0 caseno max_processes
46
47caseno        - testcase number from interval 1-5
48max_processes - maximal number of processes to attach
49                (applicable to testcase 1-4)
50OPTIONS
51EOF
52}
53
54cleanup()
55{
56	killall -9 pids_task2 >/dev/null 2>&1
57
58	tst_res TINFO "removing created directories"
59	rmdir $testpath
60	if [ "$mounted" -ne "1" ]; then
61		tst_res TINFO "Umounting pids"
62		umount $mount_point
63		rmdir $mount_point
64	fi
65}
66
67setup()
68{
69	exist=`grep -w pids /proc/cgroups | cut -f1`;
70	if [ "$exist" = "" ]; then
71		tst_brk TCONF NULL "pids not supported"
72	fi
73
74	mount_point=`grep -w pids /proc/mounts | cut -f 2 | cut -d " " -f2`
75
76	if [ "$mount_point" = "" ]; then
77		mounted=0
78		mount_point=/dev/cgroup
79	fi
80
81	testpath=$mount_point/ltp_$TCID
82
83	if [ "$mounted" -eq "0" ]; then
84		ROD mkdir -p $mount_point
85		ROD mount -t cgroup -o pids none $mount_point
86	fi
87	ROD mkdir -p $testpath
88}
89
90start_pids_tasks2()
91{
92	nb=$1
93	for i in `seq 1 $nb`; do
94		pids_task2 &
95		echo $! > $testpath/tasks
96	done
97
98	if [ $(cat "$testpath/tasks" | wc -l) -ne $nb ]; then
99		tst_brk TBROK "failed to attach process"
100	fi
101}
102
103stop_pids_tasks()
104{
105	for i in `cat $testpath/tasks`; do
106		ROD kill -9 $i
107		wait $i
108	done
109}
110
111case1()
112{
113	start_pids_tasks2 $max
114
115	# should return 0 because there is no limit
116	pids_task1 "$testpath/tasks"
117	ret=$?
118
119	if [ "$ret" -eq "2" ]; then
120		tst_res TFAIL "fork failed unexpectedly"
121	elif [ "$ret" -eq "0" ]; then
122		tst_res TPASS "fork didn't fail"
123	else
124		tst_res TBROK "pids_task1 failed"
125	fi
126
127	stop_pids_tasks
128}
129
130case2()
131{
132	tmp=$((max - 1))
133	tst_res TINFO "limit the number of pid to $max"
134	ROD echo $max \> $testpath/pids.max
135
136	start_pids_tasks2 $tmp
137
138	# should return 2 because the limit of pids is reached
139	pids_task1 "$testpath/tasks"
140	ret=$?
141
142	if [ "$ret" -eq "2" ]; then
143		tst_res TPASS "fork failed as expected"
144	elif [ "$ret" -eq "0" ]; then
145		tst_res TFAIL "fork didn't fail despite the limit"
146	else
147		tst_res TBROK "pids_task1 failed"
148	fi
149
150	stop_pids_tasks
151}
152
153case3()
154{
155	lim=$((max + 2))
156	tst_res TINFO "limit the number of avalaible pid to $lim"
157	ROD echo $lim \> $testpath/pids.max
158
159	start_pids_tasks2 $max
160
161	pids_task1 "$testpath/tasks"
162	ret=$?
163
164	if [ "$ret" -eq "2" ]; then
165		tst_res TFAIL "fork failed unexpectedly"
166	elif [ "$ret" -eq "0" ]; then
167		tst_res TPASS "fork worked as expected"
168	else
169		tst_res TBROK "pids_task1 failed"
170	fi
171
172	stop_pids_tasks
173}
174
175case4()
176{
177	tst_res TINFO "limit the number of avalaible pid to 0"
178	ROD echo 0 \> $testpath/pids.max
179
180	start_pids_tasks2 $max
181
182	tst_res TPASS "all process were attached"
183
184	stop_pids_tasks
185}
186
187case5()
188{
189	tst_res TINFO "try to limit the number of avalaible pid to -1"
190	echo -1 > $testpath/pids.max
191
192	if [ "$?" -eq "0" ]; then
193		tst_res TFAIL "managed to set the limit to -1"
194	else
195		tst_res TPASS "didn't manage to set the limit to -1"
196	fi
197}
198
199do_test()
200{
201	tst_res TINFO "Running testcase $caseno with $max processes"
202	case$caseno
203}
204
205tst_run
206