swapon01.c revision ac9784e4b6099dba38e356f4dde08a8d91846a48
1ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew/*
2ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * Copyright (c) Wipro Technologies Ltd, 2002.  All Rights Reserved.
3ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
4ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * This program is free software; you can redistribute it and/or modify it
5ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * under the terms of version 2 of the GNU General Public License as
6ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * published by the Free Software Foundation.
7ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
8ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * This program is distributed in the hope that it would be useful, but
9ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * WITHOUT ANY WARRANTY; without even the implied warranty of
10ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
12ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * You should have received a copy of the GNU General Public License along
13ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * with this program; if not, write the Free Software Foundation, Inc., 59
14ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * Temple Place - Suite 330, Boston MA 02111-1307, USA.
15ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
16ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew */
17ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew/**************************************************************************
18ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
19ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    TEST IDENTIFIER	: swapon1
20ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
21ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    EXECUTED BY	: root / superuser
22ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
23ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    TEST TITLE	: Basic test for swapon(2)
24ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
25ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    TEST CASE TOTAL	: 1
26ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
27ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    AUTHOR		: Aniruddha Marathe <aniruddha.marathe@wipro.com>
28ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
29ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    SIGNALS
30ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * 	Uses SIGUSR1 to pause before test if option set.
31ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * 	(See the parse_opts(3) man page).
32ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
33ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    DESCRIPTION
34ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    This is a Phase I test for the swapon(2) system call.
35ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *    It is intended to provide a limited exposure of the system call.
36ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
37ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * 	Setup:
38ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	  Setup signal handling.
39ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	  Pause for SIGUSR1 if option specified.
40ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	  Create a temporary directory.
41ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	  Create file of size 40K ( minimum swapfile size).
42ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	  Make this file as swap file using mkswap(8)
43ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
44ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * 	Test:
45ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	 Loop if the proper options are given.
46ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	 Turn on the swapfile to test the system call
47ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	  Execute system call
48ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	  Check return code, if system call failed (return=-1)
49ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *		Log the errno and Issue a FAIL message.
50ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	  Otherwise, Issue a PASS message.
51ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
52ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * 	Cleanup:
53ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * 	  Print errno log and/or timing stats if options given
54ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
55ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * USAGE:  <for command-line>
56ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * swapon01 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p]
57ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * where:
58ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * 	-c n : run n copies simultaneously.
59ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	-e   : Turn on errno logging.
60ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	-i n : Execute test n times.
61ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	-I x : Execute test for x seconds.
62ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	-p   : Pause for SIGUSR1 before starting
63ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	-P x : Pause for x seconds between iterations.
64ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *	-t   : Turn on syscall timing.
65ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *
66ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *RESTRICTIONS:
67ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * Not compatible with kernel versions below 2.1.35
68ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew *****************************************************************************/
69ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
70ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include <unistd.h>
71ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include "test.h"
72ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include "usctest.h"
73ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include <errno.h>
74ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include <sys/swap.h>
75ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew#include <stdlib.h>
76ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
77ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewstatic void setup();
78ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewstatic void cleanup();
79ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
80ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewchar *TCID = "swapon01"; /* Test program identifier.    */
81ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewint TST_TOTAL = 1;	/* Total number of test cases. */
82ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewextern int Tst_count;	/* Test Case counter for tst_* routines */
83ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
84ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewint
85ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewmain(int ac, char **av)
86ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew{
87ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
88ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	int lc;		/* loop counter */
89ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	char *msg;	/* message returned from parse_opts */
90ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
91ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* parse standard options */
92ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL))
93ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		!= (char *)NULL) {
94ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		tst_brkm(TBROK, tst_exit, "OPTION PARSING ERROR - %s", msg);
95ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	}
96ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
97ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* perform global setup for test */
98ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	setup();
99ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
100ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* check looping state if -i option given */
101ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	for (lc = 0; TEST_LOOPING(lc); lc++) {
102ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
103ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		/* reset Tst_count in case we are looping. */
104ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		Tst_count = 0;
105ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
106ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		TEST(swapon("./swapfile01", 0));
107ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
108ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		/* check return code */
109ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		if (TEST_RETURN == -1) {
110ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew			TEST_ERROR_LOG(TEST_ERRNO);
111ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew			tst_resm(TFAIL, "swapon(2) Failed to turn on"
112ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew				" swapfile.");
113ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		} else {
114ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew			tst_resm(TPASS, "swapon(2) passed and turned on"
115ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew					" swapfile");
116ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew			/*we need to turn this swap file off for -i option */
117ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew			if(swapoff("./swapfile01") != 0) {
118ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew				tst_brkm(TBROK, cleanup, "Failed to turn off"
119ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew							" swapfile. system"
120ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew							" reboot after"
121ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew							" execution of LTP"
122ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew							" test suite is"
123ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew							" recommended.");
124ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew			}
125ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		}
126ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	}	/*End for TEST_LOOPING*/
127ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
128ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/*Clean up and exit*/
129ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	cleanup();
130ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
131ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/*NOTREACHED*/
132ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	return 0;
133ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew}
134ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
135ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew/* setup() - performs all ONE TIME setup for this test */
136ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewvoid
137ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewsetup()
138ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew{
139ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* capture signals */
140ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	tst_sig(FORK, DEF_HANDLER, cleanup);
141ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
142ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* Check whether we are root*/
143ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	if (geteuid() != 0) {
144ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		tst_brkm(TBROK, tst_exit, "Test must be run as root");
145ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	}
146ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
147ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* Pause if that option was specified */
148ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	TEST_PAUSE;
149ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
150ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* make a temp directory and cd to it */
151ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	tst_tmpdir();
152ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
153ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/*create file*/
154ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	if(system("dd if=/dev/zero of=swapfile01 bs=1048  count=40 >"
155ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew				" tmpfile 2>&1") != 0) {
156ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		tst_brkm(TBROK, cleanup, "Failed to create file for swap");
157ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	}
158ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
159ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* make above file a swap file*/
160ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	if( system("mkswap swapfile01 > tmpfile 2>&1") != 0) {
161ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew		tst_brkm(TBROK, cleanup, "Failed to make swapfile");
162ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	}
163ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew}	/* End setup() */
164ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
165ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew/*
166ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * cleanup() - Performs one time cleanup for this test at
167ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew * completion or premature exit
168ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew */
169ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewvoid
170ac9784e4b6099dba38e356f4dde08a8d91846a48robbiewcleanup()
171ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew{
172ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/*
173ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	* print timing stats if that option was specified.
174ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	* print errno log if that option was specified.
175ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	*/
176ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	TEST_CLEANUP;
177ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
178ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* Remove tmp dir and all files inside it. */
179ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	tst_rmdir();
180ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew
181ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	/* exit with return code appropriate for results */
182ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew	tst_exit();
183ac9784e4b6099dba38e356f4dde08a8d91846a48robbiew}	/* End cleanup() */
184