-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sched_getattr02: refactor with new LTP API
Link: https://lore.kernel.org/ltp/[email protected]/ Reviewed-by: Petr Vorel <[email protected]> Signed-off-by: Ma Xinjian <[email protected]> [ pvorel: use TST_EXP_FAIL(), other cleanup ] Signed-off-by: Petr Vorel <[email protected]>
- Loading branch information
Showing
1 changed file
with
28 additions
and
73 deletions.
There are no files selected for viewing
101 changes: 28 additions & 73 deletions
101
testcases/kernel/syscalls/sched_getattr/sched_getattr02.c
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,105 +1,60 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
/* | ||
* Copyright (c) Huawei Technologies Co., Ltd., 2015 | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See | ||
* the GNU General Public License for more details. | ||
* Copyright (c) Linux Test Project, 2015-2024 | ||
*/ | ||
|
||
/* Description: | ||
* Verify that: | ||
* 1) sched_getattr fails with unused pid | ||
* 2) sched_getattr fails with invalid address | ||
* 3) sched_getattr fails with invalid value | ||
* 4) sched_getattr fails with invalid flag | ||
/*\ | ||
* [Description] | ||
* | ||
* Verify that, sched_getattr(2) returns -1 and sets errno to: | ||
* | ||
* 1. ESRCH if pid is unused. | ||
* 2. EINVAL if address is NULL. | ||
* 3. EINVAL if size is invalid. | ||
* 4. EINVAL if flag is not zero. | ||
*/ | ||
|
||
#define _GNU_SOURCE | ||
|
||
#include <unistd.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <time.h> | ||
#include <linux/unistd.h> | ||
#include <linux/kernel.h> | ||
#include <linux/types.h> | ||
#include <sys/syscall.h> | ||
#include <pthread.h> | ||
#include <errno.h> | ||
|
||
#include "test.h" | ||
#include "tst_test.h" | ||
#include "lapi/sched.h" | ||
|
||
char *TCID = "sched_getattr02"; | ||
|
||
static pid_t pid; | ||
static pid_t unused_pid; | ||
struct sched_attr attr_copy; | ||
static struct sched_attr attr_copy; | ||
|
||
static struct test_case { | ||
pid_t *pid; | ||
struct sched_attr *a; | ||
struct sched_attr *attr; | ||
unsigned int size; | ||
unsigned int flags; | ||
int exp_errno; | ||
} test_cases[] = { | ||
} tcase[] = { | ||
{&unused_pid, &attr_copy, sizeof(struct sched_attr), 0, ESRCH}, | ||
{&pid, NULL, sizeof(struct sched_attr), 0, EINVAL}, | ||
{&pid, &attr_copy, SCHED_ATTR_SIZE_VER0 - 1, 0, EINVAL}, | ||
{&pid, &attr_copy, sizeof(struct sched_attr), 1000, EINVAL} | ||
}; | ||
|
||
static void setup(void); | ||
static void sched_getattr_verify(const struct test_case *test); | ||
|
||
int TST_TOTAL = ARRAY_SIZE(test_cases); | ||
|
||
static void sched_getattr_verify(const struct test_case *test) | ||
static void verify_sched_getattr(unsigned int n) | ||
{ | ||
TEST(sched_getattr(*(test->pid), test->a, test->size, | ||
test->flags)); | ||
|
||
if (TEST_RETURN != -1) { | ||
tst_resm(TFAIL, "sched_getattr() succeeded unexpectedly."); | ||
return; | ||
} | ||
|
||
if (TEST_ERRNO == test->exp_errno) { | ||
tst_resm(TPASS | TTERRNO, | ||
"sched_getattr() failed expectedly"); | ||
return; | ||
} | ||
struct test_case *tc = &tcase[n]; | ||
|
||
tst_resm(TFAIL | TTERRNO, "sched_getattr() failed unexpectedly " | ||
": expected: %d - %s", | ||
test->exp_errno, tst_strerrno(test->exp_errno)); | ||
TST_EXP_FAIL(sched_getattr(*(tc->pid), tc->attr, tc->size, tc->flags), | ||
tc->exp_errno, "sched_getattr(%d, ..., %d, %d)", *tc->pid, | ||
tc->size, tc->flags); | ||
} | ||
|
||
int main(int argc, char **argv) | ||
static void setup(void) | ||
{ | ||
int lc, i; | ||
|
||
tst_parse_opts(argc, argv, NULL, NULL); | ||
|
||
setup(); | ||
|
||
for (lc = 0; TEST_LOOPING(lc); lc++) { | ||
for (i = 0; i < TST_TOTAL; i++) | ||
sched_getattr_verify(&test_cases[i]); | ||
} | ||
|
||
tst_exit(); | ||
unused_pid = tst_get_unused_pid(); | ||
} | ||
|
||
void setup(void) | ||
{ | ||
unused_pid = tst_get_unused_pid(setup); | ||
|
||
TEST_PAUSE; | ||
} | ||
static struct tst_test test = { | ||
.needs_tmpdir = 1, | ||
.test = verify_sched_getattr, | ||
.tcnt = ARRAY_SIZE(tcase), | ||
.setup = setup, | ||
}; |