Home | History | Annotate | Download | only in dmapi
      1 /*
      2  *   Copyright (c) International Business Machines  Corp., 2004
      3  *
      4  *   This program is free software;  you can redistribute it and/or modify
      5  *   it under the terms of the GNU General Public License as published by
      6  *   the Free Software Foundation; either version 2 of the License, or
      7  *   (at your option) any later version.
      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
     12  *   the 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     17  */
     18 
     19 /*
     20  * TEST CASE	: config.c
     21  *
     22  * VARIATIONS	: 28
     23  *
     24  * API'S TESTED	: dm_get_config
     25  */
     26 #include <string.h>
     27 #include <stdio.h>
     28 #include <errno.h>
     29 #include <fcntl.h>
     30 #include <unistd.h>
     31 #include <sys/stat.h>
     32 #include "dm_test.h"
     33 
     34 int main(int argc, char **argv)
     35 {
     36 
     37 	char *szFuncName;
     38 	char *varstr;
     39 	int rc;
     40 	int i;
     41 
     42 	DMOPT_PARSE(argc, argv);
     43 	DMLOG_START();
     44 
     45 	/* CANNOT DO ANYTHING WITHOUT SUCCESSFUL INITIALIZATION AND NO PREEXISTING FILES!!! */
     46 	if ((rc = dm_init_service(&varstr)) != 0) {
     47 		DMLOG_PRINT(DMLVL_ERR,
     48 			    "dm_init_service failed! (rc = %d, errno = %d)\n",
     49 			    rc, errno);
     50 		DM_EXIT();
     51 	}
     52 
     53 	DMLOG_PRINT(DMLVL_DEBUG, "Starting DMAPI configuration tests\n");
     54 
     55 	szFuncName = "dm_get_config";
     56 
     57 	/*
     58 	 * TEST    : dm_get_config - invalid hanp
     59 	 * EXPECTED: rc = -1, errno = EFAULT
     60 	 */
     61 	if (DMVAR_EXEC(GET_CONFIG_BASE + 1)) {
     62 		int fd;
     63 		void *hanp;
     64 		size_t hlen;
     65 		dm_size_t retval;
     66 
     67 		/* Variation set up */
     68 		if ((fd =
     69 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
     70 			  DUMMY_FILE_RW_MODE)) == -1) {
     71 			/* No clean up */
     72 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
     73 			close(fd);
     74 			remove(DUMMY_FILE);
     75 		}
     76 		if (fd == -1 || rc == -1) {
     77 			DMLOG_PRINT(DMLVL_DEBUG,
     78 				    "Unable to set up variation! (errno = %d)\n",
     79 				    errno);
     80 			DMVAR_SKIP();
     81 		} else {
     82 			/* Variation */
     83 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hanp)\n",
     84 				    szFuncName);
     85 			rc = dm_get_config((void *)INVALID_ADDR, hlen,
     86 					   DM_CONFIG_BULKALL, &retval);
     87 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
     88 
     89 			/* Variation clean up */
     90 			rc = close(fd);
     91 			rc |= remove(DUMMY_FILE);
     92 			if (rc == -1) {
     93 				DMLOG_PRINT(DMLVL_DEBUG,
     94 					    "Unable to clean up variation! (errno = %d)\n",
     95 					    errno);
     96 			}
     97 			dm_handle_free(hanp, hlen);
     98 		}
     99 	}
    100 
    101 	/*
    102 	 * TEST    : dm_get_config - invalid hlen
    103 	 * EXPECTED: rc = -1, errno = EBADF
    104 	 */
    105 	if (DMVAR_EXEC(GET_CONFIG_BASE + 2)) {
    106 		int fd;
    107 		void *hanp;
    108 		size_t hlen;
    109 		dm_size_t retval;
    110 
    111 		/* Variation set up */
    112 		if ((fd =
    113 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
    114 			  DUMMY_FILE_RW_MODE)) == -1) {
    115 			/* No clean up */
    116 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    117 			close(fd);
    118 			remove(DUMMY_FILE);
    119 		}
    120 		if (fd == -1 || rc == -1) {
    121 			DMLOG_PRINT(DMLVL_DEBUG,
    122 				    "Unable to set up variation! (errno = %d)\n",
    123 				    errno);
    124 			DMVAR_SKIP();
    125 		} else {
    126 			/* Variation */
    127 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid hlen)\n",
    128 				    szFuncName);
    129 			rc = dm_get_config(hanp, INVALID_ADDR,
    130 					   DM_CONFIG_BULKALL, &retval);
    131 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
    132 
    133 			/* Variation clean up */
    134 			rc = close(fd);
    135 			rc |= remove(DUMMY_FILE);
    136 			if (rc == -1) {
    137 				DMLOG_PRINT(DMLVL_DEBUG,
    138 					    "Unable to clean up variation! (errno = %d)\n",
    139 					    errno);
    140 			}
    141 			dm_handle_free(hanp, hlen);
    142 		}
    143 	}
    144 
    145 	/*
    146 	 * TEST    : dm_get_config - invalid flagname
    147 	 * EXPECTED: rc = -1, errno = EINVAL
    148 	 */
    149 	if (DMVAR_EXEC(GET_CONFIG_BASE + 3)) {
    150 		int fd;
    151 		void *hanp;
    152 		size_t hlen;
    153 		dm_size_t retval;
    154 
    155 		/* Variation set up */
    156 		if ((fd =
    157 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
    158 			  DUMMY_FILE_RW_MODE)) == -1) {
    159 			/* No clean up */
    160 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    161 			close(fd);
    162 			remove(DUMMY_FILE);
    163 		}
    164 		if (fd == -1 || rc == -1) {
    165 			DMLOG_PRINT(DMLVL_DEBUG,
    166 				    "Unable to set up variation! (errno = %d)\n",
    167 				    errno);
    168 			DMVAR_SKIP();
    169 		} else {
    170 			/* Variation */
    171 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid flagname)\n",
    172 				    szFuncName);
    173 			rc = dm_get_config(hanp, hlen, INVALID_ADDR, &retval);
    174 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EINVAL);
    175 
    176 			/* Variation clean up */
    177 			rc = close(fd);
    178 			rc |= remove(DUMMY_FILE);
    179 			if (rc == -1) {
    180 				DMLOG_PRINT(DMLVL_DEBUG,
    181 					    "Unable to clean up variation! (errno = %d)\n",
    182 					    errno);
    183 			}
    184 			dm_handle_free(hanp, hlen);
    185 		}
    186 	}
    187 
    188 	/*
    189 	 * TEST    : dm_get_config - invalid retvalp
    190 	 * EXPECTED: rc = -1, errno = EFAULT
    191 	 */
    192 	if (DMVAR_EXEC(GET_CONFIG_BASE + 4)) {
    193 		int fd;
    194 		void *hanp;
    195 		size_t hlen;
    196 
    197 		/* Variation set up */
    198 		if ((fd =
    199 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
    200 			  DUMMY_FILE_RW_MODE)) == -1) {
    201 			/* No clean up */
    202 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    203 			close(fd);
    204 			remove(DUMMY_FILE);
    205 		}
    206 		if (fd == -1 || rc == -1) {
    207 			DMLOG_PRINT(DMLVL_DEBUG,
    208 				    "Unable to set up variation! (errno = %d)\n",
    209 				    errno);
    210 			DMVAR_SKIP();
    211 		} else {
    212 			/* Variation */
    213 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalid retvalp)\n",
    214 				    szFuncName);
    215 			rc = dm_get_config(hanp, hlen, DM_CONFIG_BULKALL,
    216 					   (dm_size_t *) INVALID_ADDR);
    217 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EFAULT);
    218 
    219 			/* Variation clean up */
    220 			rc = close(fd);
    221 			rc |= remove(DUMMY_FILE);
    222 			if (rc == -1) {
    223 				DMLOG_PRINT(DMLVL_DEBUG,
    224 					    "Unable to clean up variation! (errno = %d)\n",
    225 					    errno);
    226 			}
    227 			dm_handle_free(hanp, hlen);
    228 		}
    229 	}
    230 
    231 	/*
    232 	 * TEST    : dm_get_config - global handle
    233 	 * EXPECTED: rc = -1, errno = EBADF
    234 	 */
    235 	if (DMVAR_EXEC(GET_CONFIG_BASE + 5)) {
    236 		dm_size_t retval;
    237 
    238 		/* Variation set up */
    239 
    240 		/* Variation */
    241 		DMLOG_PRINT(DMLVL_DEBUG, "%s(global handle)\n", szFuncName);
    242 		rc = dm_get_config(DM_GLOBAL_HANP, DM_GLOBAL_HLEN,
    243 				   DM_CONFIG_BULKALL, &retval);
    244 		DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
    245 
    246 		/* Variation clean up */
    247 	}
    248 
    249 	/*
    250 	 * TEST    : dm_get_config - file handle
    251 	 * EXPECTED: rc = 0
    252 	 */
    253 	if (DMVAR_EXEC(GET_CONFIG_BASE + 6)) {
    254 		int fd;
    255 		void *hanp;
    256 		size_t hlen;
    257 		dm_size_t retval;
    258 
    259 		/* Variation set up */
    260 		if ((fd =
    261 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
    262 			  DUMMY_FILE_RW_MODE)) == -1) {
    263 			/* No clean up */
    264 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    265 			close(fd);
    266 			remove(DUMMY_FILE);
    267 		}
    268 		if (fd == -1 || rc == -1) {
    269 			DMLOG_PRINT(DMLVL_DEBUG,
    270 				    "Unable to set up variation! (errno = %d)\n",
    271 				    errno);
    272 			DMVAR_SKIP();
    273 		} else {
    274 			/* Variation */
    275 			DMLOG_PRINT(DMLVL_DEBUG, "%s(file handle)\n",
    276 				    szFuncName);
    277 			rc = dm_get_config(hanp, hlen, DM_CONFIG_BULKALL,
    278 					   &retval);
    279 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
    280 
    281 			/* Variation clean up */
    282 			rc = close(fd);
    283 			rc |= remove(DUMMY_FILE);
    284 			if (rc == -1) {
    285 				DMLOG_PRINT(DMLVL_DEBUG,
    286 					    "Unable to clean up variation! (errno = %d)\n",
    287 					    errno);
    288 			}
    289 			dm_handle_free(hanp, hlen);
    290 		}
    291 	}
    292 
    293 	/*
    294 	 * TEST    : dm_get_config - directory handle
    295 	 * EXPECTED: rc = 0
    296 	 */
    297 	if (DMVAR_EXEC(GET_CONFIG_BASE + 7)) {
    298 		int fd;
    299 		void *hanp;
    300 		size_t hlen;
    301 		dm_size_t retval;
    302 
    303 		/* Variation set up */
    304 		if ((rc = mkdir(DUMMY_SUBDIR, DUMMY_DIR_RW_MODE)) == -1) {
    305 			/* No clean up */
    306 		} else if ((rc = dm_path_to_handle(DUMMY_SUBDIR, &hanp, &hlen))
    307 			   == -1) {
    308 			rmdir(DUMMY_SUBDIR);
    309 		}
    310 		if (fd == -1 || rc == -1) {
    311 			DMLOG_PRINT(DMLVL_DEBUG,
    312 				    "Unable to set up variation! (errno = %d)\n",
    313 				    errno);
    314 			DMVAR_SKIP();
    315 		} else {
    316 			/* Variation */
    317 			DMLOG_PRINT(DMLVL_DEBUG, "%s(dir handle)\n",
    318 				    szFuncName);
    319 			rc = dm_get_config(hanp, hlen, DM_CONFIG_BULKALL,
    320 					   &retval);
    321 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
    322 
    323 			/* Variation clean up */
    324 			rc = rmdir(DUMMY_SUBDIR);
    325 			if (rc == -1) {
    326 				DMLOG_PRINT(DMLVL_DEBUG,
    327 					    "Unable to clean up variation! (errno = %d)\n",
    328 					    errno);
    329 			}
    330 			dm_handle_free(hanp, hlen);
    331 		}
    332 	}
    333 
    334 	/*
    335 	 * TEST    : dm_get_config - fs handle
    336 	 * EXPECTED: rc = 0
    337 	 */
    338 	if (DMVAR_EXEC(GET_CONFIG_BASE + 8)) {
    339 		int fd;
    340 		void *hanp;
    341 		size_t hlen;
    342 		dm_size_t retval;
    343 
    344 		/* Variation set up */
    345 		if ((fd =
    346 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
    347 			  DUMMY_FILE_RW_MODE)) == -1) {
    348 			/* No clean up */
    349 		} else if ((rc = dm_path_to_fshandle(DUMMY_FILE, &hanp, &hlen))
    350 			   == -1) {
    351 			close(fd);
    352 			remove(DUMMY_FILE);
    353 		}
    354 		if (fd == -1 || rc == -1) {
    355 			DMLOG_PRINT(DMLVL_DEBUG,
    356 				    "Unable to set up variation! (errno = %d)\n",
    357 				    errno);
    358 			DMVAR_SKIP();
    359 		} else {
    360 			/* Variation */
    361 			DMLOG_PRINT(DMLVL_DEBUG, "%s(fs handle)\n", szFuncName);
    362 			rc = dm_get_config(hanp, hlen, DM_CONFIG_BULKALL,
    363 					   &retval);
    364 			DMVAR_ENDPASSEXP(szFuncName, 0, rc);
    365 
    366 			/* Variation clean up */
    367 			rc = close(fd);
    368 			rc |= remove(DUMMY_FILE);
    369 			if (rc == -1) {
    370 				DMLOG_PRINT(DMLVL_DEBUG,
    371 					    "Unable to clean up variation! (errno = %d)\n",
    372 					    errno);
    373 			}
    374 			dm_handle_free(hanp, hlen);
    375 		}
    376 	}
    377 
    378 	/*
    379 	 * TEST    : dm_get_config - invalidated handle
    380 	 * EXPECTED: rc = -1, errno = EBADF
    381 	 */
    382 	if (DMVAR_EXEC(GET_CONFIG_BASE + 9)) {
    383 		int fd;
    384 		void *hanp;
    385 		size_t hlen;
    386 		dm_size_t retval;
    387 
    388 		/* Variation set up */
    389 		if ((fd =
    390 		     open(DUMMY_FILE, O_RDWR | O_CREAT,
    391 			  DUMMY_FILE_RW_MODE)) == -1) {
    392 			/* No clean up */
    393 		} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) == -1) {
    394 			close(fd);
    395 			remove(DUMMY_FILE);
    396 		} else if ((rc = close(fd)) == -1) {
    397 			dm_handle_free(hanp, hlen);
    398 			remove(DUMMY_FILE);
    399 		} else if ((rc = remove(DUMMY_FILE)) == -1) {
    400 			dm_handle_free(hanp, hlen);
    401 		}
    402 		if (fd == -1 || rc == -1) {
    403 			DMLOG_PRINT(DMLVL_DEBUG,
    404 				    "Unable to set up variation! (errno = %d)\n",
    405 				    errno);
    406 			DMVAR_SKIP();
    407 		} else {
    408 			/* Variation */
    409 			DMLOG_PRINT(DMLVL_DEBUG, "%s(invalidated handle)\n",
    410 				    szFuncName);
    411 			rc = dm_get_config(hanp, hlen, DM_CONFIG_BULKALL,
    412 					   &retval);
    413 			DMVAR_ENDFAILEXP(szFuncName, -1, rc, EBADF);
    414 
    415 			/* Variation clean up */
    416 			dm_handle_free(hanp, hlen);
    417 		}
    418 	}
    419 
    420 	/*
    421 	 * TEST    : dm_get_config
    422 	 * EXPECTED: rc = 0
    423 	 */
    424 	for (i = 1; i < CONFIG_MAX; i++) {
    425 		if (DMVAR_EXEC(GET_CONFIG_BASE + 9 + i)) {
    426 			int fd;
    427 			void *hanp;
    428 			size_t hlen;
    429 			dm_size_t retval;
    430 
    431 			/* Variation set up */
    432 			if ((fd =
    433 			     open(DUMMY_FILE, O_RDWR | O_CREAT,
    434 				  DUMMY_FILE_RW_MODE)) == -1) {
    435 				/* No clean up */
    436 			} else if ((rc = dm_fd_to_handle(fd, &hanp, &hlen)) ==
    437 				   -1) {
    438 				close(fd);
    439 				remove(DUMMY_FILE);
    440 			}
    441 			if (fd == -1 || rc == -1) {
    442 				DMLOG_PRINT(DMLVL_DEBUG,
    443 					    "Unable to set up variation! (errno = %d)\n",
    444 					    errno);
    445 				DMVAR_SKIP();
    446 			} else {
    447 				/* Variation */
    448 				DMLOG_PRINT(DMLVL_DEBUG, "%s(%s)\n", szFuncName,
    449 					    dmimpl_expectedResults[i].name);
    450 				rc = dm_get_config(hanp, hlen, i, &retval);
    451 				if (rc == 0) {
    452 					if (retval ==
    453 					    dmimpl_expectedResults[i].result) {
    454 						DMLOG_PRINT(DMLVL_DEBUG,
    455 							    "%s passed with expected rc = %d\n",
    456 							    szFuncName, 0);
    457 						DMVAR_PASS();
    458 					} else {
    459 						DMLOG_PRINT(DMLVL_ERR,
    460 							    "%s failed with expected rc = %d but unexpected retval (%lld vs %lld)\n",
    461 							    szFuncName, 0,
    462 							    retval,
    463 							    dmimpl_expectedResults
    464 							    [i].result);
    465 						DMVAR_FAIL();
    466 					}
    467 				} else {
    468 					DMLOG_PRINT(DMLVL_ERR,
    469 						    "%s failed with unexpected rc = %d (errno = %d)\n",
    470 						    szFuncName, rc, errno);
    471 					DMVAR_FAIL();
    472 				}
    473 
    474 				/* Variation clean up */
    475 				rc = close(fd);
    476 				rc |= remove(DUMMY_FILE);
    477 				if (rc == -1) {
    478 					DMLOG_PRINT(DMLVL_DEBUG,
    479 						    "Unable to clean up variation! (errno = %d)\n",
    480 						    errno);
    481 				}
    482 				dm_handle_free(hanp, hlen);
    483 			}
    484 		}
    485 	}
    486 
    487 	DMLOG_STOP();
    488 
    489 	tst_exit();
    490 
    491 }
    492