* [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus()
@ 2014-07-13 5:49 Xiaoguang Wang
2014-07-13 5:49 ` [LTP] [PATCH v2 2/2] syscalls: fix testcases which take TCONF as TFAIL Xiaoguang Wang
2014-07-15 14:24 ` [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus() chrubis
0 siblings, 2 replies; 10+ messages in thread
From: Xiaoguang Wang @ 2014-07-13 5:49 UTC (permalink / raw)
To: ltp-list
In case we need do real test work in child porcess, it is OK for child process
to use tst_resm(), tst_brkm() or tst_exit(). Parent process can use
tst_record_childstatus() to make child process's test results propagated to parent
process correctly.
Meanwhile we reset T_exitval to 0 for child process in tst_fork(), which will
make child process can record test results with tst_resm() or tst_brkm() correctly.
Signed-off-by: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
---
include/test.h | 10 ++++++++++
lib/tst_res.c | 29 ++++++++++++++++++++++++++++-
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/include/test.h b/include/test.h
index 011866d..3672a8c 100644
--- a/include/test.h
+++ b/include/test.h
@@ -135,9 +135,19 @@ void tst_flush(void);
/*
* tst_flush() + fork
+ * NOTE: tst_fork() will reset T_exitval to 0 for child process.
*/
pid_t tst_fork(void);
+/* lib/tst_res.c */
+/*
+ * In case we need do real test work in child porcess, it is OK for
+ * child process to use tst_resm(), tst_brkm() or tst_exit(). Parent
+ * process can use tst_record_childstatus() to make child process's
+ * test results propagated to parent process correctly.
+ */
+void tst_record_childstatus(void (*cleanup)(void), pid_t child);
+
extern int tst_count;
/* lib/tst_sig.c */
diff --git a/lib/tst_res.c b/lib/tst_res.c
index 31186e0..35eefa3 100644
--- a/lib/tst_res.c
+++ b/lib/tst_res.c
@@ -101,6 +101,9 @@
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
#include "test.h"
#include "usctest.h"
#include "ltp_priv.h"
@@ -568,8 +571,32 @@ void tst_exit(void)
pid_t tst_fork(void)
{
+ pid_t child;
+
tst_flush();
- return fork();
+
+ child = fork();
+ if (child == 0)
+ T_exitval = 0;
+
+ return child;
+}
+
+void tst_record_childstatus(void (*cleanup)(void), pid_t child)
+{
+ int status, ttype_result;
+
+ if (waitpid(child, &status, 0) < 0)
+ tst_brkm(TBROK | TERRNO, cleanup, "waitpid(%d) failed", child);
+
+ if (WIFEXITED(status)) {
+ ttype_result = WEXITSTATUS(status);
+ ttype_result = TTYPE_RESULT(ttype_result);
+ T_exitval |= ttype_result;
+ } else {
+ tst_brkm(TBROK, cleanup, "child process(%d) killed by "
+ "unexpected signal", child);
+ }
}
pid_t tst_vfork(void)
--
1.8.2.1
------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [LTP] [PATCH v2 2/2] syscalls: fix testcases which take TCONF as TFAIL
2014-07-13 5:49 [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus() Xiaoguang Wang
@ 2014-07-13 5:49 ` Xiaoguang Wang
2014-07-15 14:24 ` [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus() chrubis
1 sibling, 0 replies; 10+ messages in thread
From: Xiaoguang Wang @ 2014-07-13 5:49 UTC (permalink / raw)
To: ltp-list
This issue was introduced by commit: 6f6878f4e1406d79cae53564777c5e1245d2a124
In this commit, we took TCONF as a special state, to let user know the real
LTP test coverage.
But setreuid04.c, setreuid05.c, setreuid07.c and setfsuid04.c do real test
work in child process, if 16-bit version of setreuid or setfsuid is not supported
on some platforms, child process will return a TCONF(see syscalls/utils/compat_16.h),
then parent process will get a non-zero return value and take it as TFAIL directly, fix this.
Signed-off-by: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
---
testcases/kernel/syscalls/setfsuid/setfsuid04.c | 28 ++++++++++---------------
testcases/kernel/syscalls/setreuid/setreuid04.c | 17 +++------------
testcases/kernel/syscalls/setreuid/setreuid05.c | 16 +++-----------
testcases/kernel/syscalls/setreuid/setreuid07.c | 26 ++++++++++-------------
4 files changed, 28 insertions(+), 59 deletions(-)
diff --git a/testcases/kernel/syscalls/setfsuid/setfsuid04.c b/testcases/kernel/syscalls/setfsuid/setfsuid04.c
index 6818987..f2dc351 100644
--- a/testcases/kernel/syscalls/setfsuid/setfsuid04.c
+++ b/testcases/kernel/syscalls/setfsuid/setfsuid04.c
@@ -58,7 +58,6 @@ int main(int ac, char **av)
{
pid_t pid;
const char *msg;
- int status;
if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
@@ -72,12 +71,7 @@ int main(int ac, char **av)
if (pid == 0)
do_master_child();
- if (waitpid(pid, &status, 0) == -1)
- tst_resm(TBROK | TERRNO, "waitpid failed");
- if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
- tst_resm(TFAIL, "child process terminated abnormally");
- else
- tst_resm(TPASS, "Test passed");
+ tst_record_childstatus(cleanup, pid);
cleanup();
tst_exit();
@@ -90,7 +84,7 @@ static void do_master_child(void)
if (SETFSUID(NULL, ltpuser->pw_uid) == -1) {
perror("setfsuid failed");
- exit(1);
+ exit(TFAIL);
}
/* Test 1: Check the process with new uid cannot open the file
@@ -101,14 +95,14 @@ static void do_master_child(void)
if (TEST_RETURN != -1) {
close(TEST_RETURN);
printf("open succeeded unexpectedly\n");
- exit(1);
+ exit(TFAIL);
}
if (TEST_ERRNO == EACCES) {
printf("open failed with EACCESS as expected\n");
} else {
printf("open returned unexpected errno - %d\n", TEST_ERRNO);
- exit(1);
+ exit(TFAIL);
}
/* Test 2: Check a son process cannot open the file
@@ -117,7 +111,7 @@ static void do_master_child(void)
pid = FORK_OR_VFORK();
if (pid < 0) {
perror("Fork failed");
- exit(1);
+ exit(TFAIL);
}
if (pid == 0) {
@@ -127,7 +121,7 @@ static void do_master_child(void)
if (TEST_RETURN != -1) {
close(TEST_RETURN);
printf("open succeeded unexpectedly\n");
- exit(1);
+ exit(TFAIL);
}
if (TEST_ERRNO == EACCES) {
@@ -135,13 +129,13 @@ static void do_master_child(void)
} else {
printf("open returned unexpected errno - %d\n",
TEST_ERRNO);
- exit(1);
+ exit(TFAIL);
}
} else {
/* Wait for son completion */
if (waitpid(pid, &status, 0) == -1) {
perror("waitpid failed");
- exit(1);
+ exit(TFAIL);
}
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
@@ -154,19 +148,19 @@ static void do_master_child(void)
tst_count++;
if (SETFSUID(NULL, 0) == -1) {
perror("setfsuid failed");
- exit(1);
+ exit(TFAIL);
}
TEST(open(testfile, O_RDWR));
if (TEST_RETURN == -1) {
perror("open failed unexpectedly");
- exit(1);
+ exit(TFAIL);
} else {
printf("open call succeeded\n");
close(TEST_RETURN);
}
- exit(0);
+ exit(TPASS);
}
static void setup(void)
diff --git a/testcases/kernel/syscalls/setreuid/setreuid04.c b/testcases/kernel/syscalls/setreuid/setreuid04.c
index f1d2ab0..6c782f3 100644
--- a/testcases/kernel/syscalls/setreuid/setreuid04.c
+++ b/testcases/kernel/syscalls/setreuid/setreuid04.c
@@ -36,9 +36,6 @@ TCID_DEFINE(setreuid04);
static uid_t neg_one = -1;
-/* flag to tell parent if child passed or failed. */
-static int flag;
-
static struct passwd nobody, root;
/*
@@ -75,10 +72,8 @@ int main(int ac, char **av)
setup();
- flag = 0;
-
for (lc = 0; TEST_LOOPING(lc); lc++) {
- int i, pid, status;
+ int i, pid;
tst_count = 0;
@@ -102,20 +97,15 @@ int main(int ac, char **av)
"did not return as expected.",
*test_data[i].real_uid,
*test_data[i].eff_uid);
- flag = -1;
}
uid_verify(test_data[i].exp_real_usr,
test_data[i].exp_eff_usr,
test_data[i].test_msg);
}
- exit(flag);
+ tst_exit();
} else { /* parent */
- waitpid(pid, &status, 0);
- if (WEXITSTATUS(status) != 0) {
- tst_resm(TFAIL, "test failed within "
- "child process.");
- }
+ tst_record_childstatus(cleanup, pid);
}
}
cleanup();
@@ -153,6 +143,5 @@ static void uid_verify(struct passwd *ru, struct passwd *eu, char *when)
when, getuid(), geteuid());
tst_resm(TINFO, "Expected: real uid = %d; effective uid = %d",
ru->pw_uid, eu->pw_uid);
- flag = -1;
}
}
diff --git a/testcases/kernel/syscalls/setreuid/setreuid05.c b/testcases/kernel/syscalls/setreuid/setreuid05.c
index 42fcbb9..14b0ade 100644
--- a/testcases/kernel/syscalls/setreuid/setreuid05.c
+++ b/testcases/kernel/syscalls/setreuid/setreuid05.c
@@ -34,9 +34,6 @@
TCID_DEFINE(setreuid05);
-/* flag to tell parent if child passed or failed. */
-int flag = 0;
-
static int fail = -1;
static int pass;
static uid_t neg_one = -1;
@@ -99,7 +96,7 @@ int main(int argc, char **argv)
pass = 0;
for (lc = 0; TEST_LOOPING(lc); lc++) {
- int i, pid, status;
+ int i, pid;
tst_count = 0;
@@ -122,7 +119,6 @@ int main(int argc, char **argv)
[i].real_uid,
*test_data
[i].eff_uid);
- flag = -1;
continue;
}
tst_resm(TPASS,
@@ -142,7 +138,6 @@ int main(int argc, char **argv)
"did not return as expected.",
*test_data[i].real_uid,
*test_data[i].eff_uid);
- flag = -1;
}
if (TEST_RETURN == -1) {
@@ -152,13 +147,9 @@ int main(int argc, char **argv)
test_data[i].exp_eff_usr,
test_data[i].test_msg);
}
- exit(flag);
+ tst_exit();
} else { /* parent */
- waitpid(pid, &status, 0);
- if (WEXITSTATUS(status) != 0) {
- tst_resm(TFAIL, "test failed within "
- "child process.");
- }
+ tst_record_childstatus(cleanup, pid);
}
}
cleanup();
@@ -207,6 +198,5 @@ static void uid_verify(struct passwd *ru, struct passwd *eu, char *when)
when, getuid(), geteuid());
tst_resm(TINFO, "Expected: real uid = %d; effective uid = %d",
ru->pw_uid, eu->pw_uid);
- flag = -1;
}
}
diff --git a/testcases/kernel/syscalls/setreuid/setreuid07.c b/testcases/kernel/syscalls/setreuid/setreuid07.c
index b6714f9..753ee16 100644
--- a/testcases/kernel/syscalls/setreuid/setreuid07.c
+++ b/testcases/kernel/syscalls/setreuid/setreuid07.c
@@ -55,7 +55,6 @@ int main(int ac, char **av)
{
pid_t pid;
const char *msg;
- int status;
if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
@@ -69,10 +68,7 @@ int main(int ac, char **av)
if (pid == 0)
do_master_child();
- if (waitpid(pid, &status, 0) == -1)
- tst_resm(TBROK | TERRNO, "waitpid failed");
- if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
- tst_resm(TFAIL, "child process terminated abnormally");
+ tst_record_childstatus(cleanup, pid);
cleanup();
tst_exit();
@@ -91,7 +87,7 @@ static void do_master_child(void)
if (SETREUID(NULL, 0, ltpuser->pw_uid) == -1) {
perror("setreuid failed");
- exit(1);
+ exit(TFAIL);
}
/* Test 1: Check the process with new uid cannot open the file
@@ -102,14 +98,14 @@ static void do_master_child(void)
if (TEST_RETURN != -1) {
printf("open succeeded unexpectedly\n");
close(tst_fd);
- exit(1);
+ exit(TFAIL);
}
if (TEST_ERRNO == EACCES) {
printf("open failed with EACCES as expected\n");
} else {
perror("open failed unexpectedly");
- exit(1);
+ exit(TFAIL);
}
/* Test 2: Check a son process cannot open the file
@@ -128,23 +124,23 @@ static void do_master_child(void)
if (TEST_RETURN != -1) {
printf("call succeeded unexpectedly\n");
close(tst_fd2);
- exit(1);
+ exit(TFAIL);
}
TEST_ERROR_LOG(TEST_ERRNO);
if (TEST_ERRNO == EACCES) {
printf("open failed with EACCES as expected\n");
- exit(0);
+ exit(TPASS);
} else {
printf("open failed unexpectedly\n");
- exit(1);
+ exit(TFAIL);
}
} else {
/* Wait for son completion */
if (waitpid(pid, &status, 0) == -1) {
perror("waitpid failed");
- exit(1);
+ exit(TFAIL);
}
if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
exit(WEXITSTATUS(status));
@@ -156,20 +152,20 @@ static void do_master_child(void)
tst_count++;
if (SETREUID(NULL, 0, 0) == -1) {
perror("setreuid failed");
- exit(1);
+ exit(TFAIL);
}
TEST(tst_fd = open(testfile, O_RDWR));
if (TEST_RETURN == -1) {
perror("open failed unexpectedly");
- exit(1);
+ exit(TFAIL);
} else {
printf("open call succeeded\n");
close(tst_fd);
}
}
- exit(0);
+ exit(TPASS);
}
static void setup(void)
--
1.8.2.1
------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus()
2014-07-13 5:49 [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus() Xiaoguang Wang
2014-07-13 5:49 ` [LTP] [PATCH v2 2/2] syscalls: fix testcases which take TCONF as TFAIL Xiaoguang Wang
@ 2014-07-15 14:24 ` chrubis
[not found] ` <53CCA4B9.2070005@cn.fujitsu.com>
1 sibling, 1 reply; 10+ messages in thread
From: chrubis @ 2014-07-15 14:24 UTC (permalink / raw)
To: Xiaoguang Wang; +Cc: ltp-list
Hi!
> In case we need do real test work in child porcess, it is OK for child process
> to use tst_resm(), tst_brkm() or tst_exit(). Parent process can use
> tst_record_childstatus() to make child process's test results propagated to parent
> process correctly.
>
> Meanwhile we reset T_exitval to 0 for child process in tst_fork(), which will
> make child process can record test results with tst_resm() or tst_brkm() correctly.
Looks technically correct to me. The only caveat is that you have to
decide to use either tst_* interface in child or plain exit() and do not
to mix them.
Also as the code si now we don't have to reset the T_exitval because
what we do now is or the flags form child to add them to the paren't
flags (which will be set anyway if the child has started with nonzero
flags).
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus()
[not found] ` <53CCA4B9.2070005@cn.fujitsu.com>
@ 2014-07-22 14:30 ` chrubis
2014-07-28 11:51 ` [LTP] [PATCH v3 1/3] " Xiaoguang Wang
0 siblings, 1 reply; 10+ messages in thread
From: chrubis @ 2014-07-22 14:30 UTC (permalink / raw)
To: Xiaoguang Wang; +Cc: ltp-list
Hi!
> >> In case we need do real test work in child porcess, it is OK for child process
> >> to use tst_resm(), tst_brkm() or tst_exit(). Parent process can use
> >> tst_record_childstatus() to make child process's test results propagated to parent
> >> process correctly.
> >>
> >> Meanwhile we reset T_exitval to 0 for child process in tst_fork(), which will
> >> make child process can record test results with tst_resm() or tst_brkm() correctly.
> >
> > Looks technically correct to me. The only caveat is that you have to
> > decide to use either tst_* interface in child or plain exit() and do not
> > to mix them.
> Yeah, Or I should write some notes about using tst_* interfaces in child process in Test Writing Guidelines.
> And sorry for the delay, I was busy last week.
Yes, this patch would need more changes into the Test Writing Guidelines
anyway...
> > Also as the code si now we don't have to reset the T_exitval because
> > what we do now is or the flags form child to add them to the paren't
> > flags (which will be set anyway if the child has started with nonzero
> > flags).
>
> Ah, you are right.
> But I think reseting T_exitval is necessary, at least we should give child process
> a clean test environment...
> Assume a simple case:
> Parent already has TFAIL set, then it fork() a child to have some
> other test work and everything is OK in child, child only calls tst_resm(TPASS,...),
> then in child, T_exitval will have TPASS and TFAIL set. Finally, child calls
> tst_exit() to report the test results, in this case, child will return a
> non-zero value, it seems child exits abnormally, though it does not affect the final
> test results, it is still not reasonable, obviously 0 value is reasonable for child,
> after all child does not do any wrong.
Yes, it's better to reset it but it's not really necessary.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 10+ messages in thread
* [LTP] [PATCH v3 1/3] lib/tst_res.c: introduce tst_record_childstatus()
2014-07-22 14:30 ` chrubis
@ 2014-07-28 11:51 ` Xiaoguang Wang
2014-07-28 11:51 ` [LTP] [PATCH v3 2/3] doc: add paragraph to describe using test interface in child process Xiaoguang Wang
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Xiaoguang Wang @ 2014-07-28 11:51 UTC (permalink / raw)
To: ltp-list
In case we need do real test work in child porcess, it is OK for child process
to use tst_resm(), tst_brkm() or tst_exit(). Parent process can use
tst_record_childstatus() to make child process's test results propagated to parent
process correctly.
Meanwhile we reset T_exitval to 0 for child process in tst_fork(), which will
make child process can record test results with tst_resm() or tst_brkm() correctly.
Signed-off-by: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
---
include/test.h | 10 ++++++++++
lib/tst_res.c | 29 ++++++++++++++++++++++++++++-
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/include/test.h b/include/test.h
index 2013a36..b49ae22 100644
--- a/include/test.h
+++ b/include/test.h
@@ -161,9 +161,19 @@ void tst_flush(void);
/*
* tst_flush() + fork
+ * NOTE: tst_fork() will reset T_exitval to 0 for child process.
*/
pid_t tst_fork(void);
+/* lib/tst_res.c */
+/*
+ * In case we need do real test work in child porcess, it is OK for
+ * child process to use tst_resm(), tst_brkm() or tst_exit(). Parent
+ * process can use tst_record_childstatus() to make child process's
+ * test results propagated to parent process correctly.
+ */
+void tst_record_childstatus(void (*cleanup)(void), pid_t child);
+
extern int tst_count;
/* lib/tst_sig.c */
diff --git a/lib/tst_res.c b/lib/tst_res.c
index c584265..57f2d07 100644
--- a/lib/tst_res.c
+++ b/lib/tst_res.c
@@ -72,6 +72,9 @@
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
#include "test.h"
#include "usctest.h"
#include "ltp_priv.h"
@@ -542,8 +545,32 @@ void tst_exit(void)
pid_t tst_fork(void)
{
+ pid_t child;
+
tst_flush();
- return fork();
+
+ child = fork();
+ if (child == 0)
+ T_exitval = 0;
+
+ return child;
+}
+
+void tst_record_childstatus(void (*cleanup)(void), pid_t child)
+{
+ int status, ttype_result;
+
+ if (waitpid(child, &status, 0) < 0)
+ tst_brkm(TBROK | TERRNO, cleanup, "waitpid(%d) failed", child);
+
+ if (WIFEXITED(status)) {
+ ttype_result = WEXITSTATUS(status);
+ ttype_result = TTYPE_RESULT(ttype_result);
+ T_exitval |= ttype_result;
+ } else {
+ tst_brkm(TBROK, cleanup, "child process(%d) killed by "
+ "unexpected signal", child);
+ }
}
pid_t tst_vfork(void)
--
1.8.2.1
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [LTP] [PATCH v3 2/3] doc: add paragraph to describe using test interface in child process
2014-07-28 11:51 ` [LTP] [PATCH v3 1/3] " Xiaoguang Wang
@ 2014-07-28 11:51 ` Xiaoguang Wang
2014-07-29 9:58 ` chrubis
2014-07-28 11:51 ` [LTP] [PATCH v3 3/3] syscalls: fix testcases which take TCONF as TFAIL Xiaoguang Wang
2014-07-29 9:56 ` [LTP] [PATCH v3 1/3] lib/tst_res.c: introduce tst_record_childstatus() chrubis
2 siblings, 1 reply; 10+ messages in thread
From: Xiaoguang Wang @ 2014-07-28 11:51 UTC (permalink / raw)
To: ltp-list
Signed-off-by: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
---
doc/test-writing-guidelines.txt | 76 ++++++++++++++++++++++++-----------------
1 file changed, 44 insertions(+), 32 deletions(-)
diff --git a/doc/test-writing-guidelines.txt b/doc/test-writing-guidelines.txt
index 4779100..965ca6c 100644
--- a/doc/test-writing-guidelines.txt
+++ b/doc/test-writing-guidelines.txt
@@ -571,30 +571,42 @@ printed by the parent and each of the children.
To avoid that, you should either call 'tst_flush()' right before the 'fork()',
or even better - use 'tst_fork()' instead.
-2.2.7 Fork() and Parent-child synchronization
+2.2.7 Using test interface in child process
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you have to do some test work in child process, now you can use test interface
+('tst_resm()', 'tst_brkm()', 'tst_exit()', ...) in child process, but there are some
+rules you must obey:
+ 1) If you use tst_resm() to record test results in child process, you *MUST* use
+ tst_exit() in the end.
+
+ 2) If you use tst_brkm() with a non-NULL cleanup argument in child process, you're
+ strongly recommended to create a separate cleanup function for child process that
+ will only clean up what has been allocated in child process.
+ *Imagine the 'cleanup()' is called both from the parent and child, the test
+ will likely fail in 'tst_rmdir()', because the directory was removed already
+ by the child.
+
+ 3) Meanwhile, in parent process, you'd better call tst_record_childstatus() to make
+ child process's test results propagated to parent process correctly.
+
+ [source,c]
+ -------------------------------------------------------------------------------
+ #include "test.h"
+
+ void tst_record_childstatus(void (*cleanup)(void), pid_t child);
+ -------------------------------------------------------------------------------
+ This function will have a waitpid() on child process and record child process's
+ return value in T_exitval correctly.
+
+If you don't plan to use test interface in child process, then you will use a plain exit()
+to report test results to parent process. You'd better use TPASS or TFAIL, other than numerical value.
+
+2.2.8 Fork() and Parent-child synchronization
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
As LTP tests are written for Linux, most of the test involves fork()-ing and
-parent-child process synchronization. But first of all:
-
-WARNING: Usage of test interface ('tst_resm()', 'tst_brkm()', 'tst_exit()',
- ...) from child process is forbidden.
-
-If you happen to use the interface from a child process the outcome would
-likely be disastrous. Just to name a few examples:
-
-* Imagine the 'cleanup()' is called both from the parent and child, the test
- will likely fail in 'tst_rmdir()', because the directory was removed
- already by the child.
-
-* The test failures reported via 'tst_resm()' are not propagated from the
- child to the parent (how could they, it's just a static variable in the
- test library). And the test will report success even when the test in the
- child process has reported failure.
-
-* And many more...
-
-Now to the child-parent synchronization. We have a checkpoint library code
+parent-child process synchronization. We have a checkpoint library code
that works even for two different processes, all they need to is to run with
the same working directory (they use FIFO for synchronization). The checkpoint
interface provides two pairs of signal and wait functions. One pair to be used
@@ -607,7 +619,7 @@ There is also an interface that allows parent to wait until child is blocked
in kernel (for example waits in 'pause()'), see 'include/tst_process_state.h'
for more.
-2.2.8 Signal handlers
+2.2.9 Signal handlers
^^^^^^^^^^^^^^^^^^^^^
If you need to use signal handlers, keep the code short and simple. Don't
@@ -640,14 +652,14 @@ but this one DOES NOT imply volatile (it's just a typedef to int). So the
correct type for a flag that is changed from a signal handler is either
'volatile int' or 'volatile sig_atomic_t'.
-2.2.9 Kernel Modules
-^^^^^^^^^^^^^^^^^^^^
+2.2.10 Kernel Modules
+^^^^^^^^^^^^^^^^^^^^^
There are certain cases where the test needs a kernel part and userspace part,
happily, LTP can build a kernel module and then insert it to the kernel on test
start for you. See 'testcases/kernel/device-drivers/block' for details.
-2.2.10 Usefull macros
+2.2.11 Usefull macros
^^^^^^^^^^^^^^^^^^^^^
[source,c]
@@ -665,7 +677,7 @@ LTP_ALIGN(x, a)
Aligns the x to be next multiple of a. The a must be power of 2.
-2.2.11 Filesystem type detection
+2.2.12 Filesystem type detection
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Some tests are known to fail on certain filesytems (you cannot swap on TMPFS,
@@ -701,7 +713,7 @@ below:
}
-------------------------------------------------------------------------------
-2.2.12 Thread-safety in the LTP library
+2.2.13 Thread-safety in the LTP library
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
It is safe to use library 'tst_' functions in multi-threaded tests.
@@ -735,7 +747,7 @@ void test01(void)
}
-------------------------------------------------------------------------------
-2.2.13 Acquiring a block device
+2.2.14 Acquiring a block device
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Some tests needs a block device (inotify tests, syscall 'EROFS' failures,
@@ -776,7 +788,7 @@ void tst_release_device(void (cleanup_fn)(void), const char *dev);
Releases the device acquired by 'tst_acquire_device()'.
-2.2.14 Formatting a device with a filesystem
+2.2.15 Formatting a device with a filesystem
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[source,c]
@@ -807,7 +819,7 @@ options passed to mkfs.
The extra options 'fs_opts' should either be 'NULL' if there are none, or a
'NULL' terminated array of strings such as '{"-b", "1024", NULL}'.
-2.2.15 Verifying a filesystem's free space
+2.2.16 Verifying a filesystem's free space
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Some tests have size requirements for the filesystem's free space. If these
@@ -837,7 +849,7 @@ The required free space is calculated by 'size * mult', e.g.
filesystem, which '"/tmp/testfile"' is in, has 64MB free space at least, and 0
if not.
-2.2.16 Getting the maximum number of links to a regular file or directory
+2.2.17 Getting the maximum number of links to a regular file or directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Some tests need to know the maximum count of links to a regular file or
@@ -880,7 +892,7 @@ newly created dir has two links already - the '.' and the link from parent
dir). If no limit is hit or if 'mkdir(2)' failed with 'ENOSPC' or 'EDQUOT',
zero is returned and previously created directories are removed.
-2.2.17 Getting an unused PID number
+2.2.18 Getting an unused PID number
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Some tests require a 'PID', which is not used by the OS (does not belong to
--
1.8.2.1
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [LTP] [PATCH v3 3/3] syscalls: fix testcases which take TCONF as TFAIL
2014-07-28 11:51 ` [LTP] [PATCH v3 1/3] " Xiaoguang Wang
2014-07-28 11:51 ` [LTP] [PATCH v3 2/3] doc: add paragraph to describe using test interface in child process Xiaoguang Wang
@ 2014-07-28 11:51 ` Xiaoguang Wang
2014-07-29 10:09 ` chrubis
2014-07-29 9:56 ` [LTP] [PATCH v3 1/3] lib/tst_res.c: introduce tst_record_childstatus() chrubis
2 siblings, 1 reply; 10+ messages in thread
From: Xiaoguang Wang @ 2014-07-28 11:51 UTC (permalink / raw)
To: ltp-list
This issue was introduced by commit: 6f6878f4e1406d79cae53564777c5e1245d2a124
In this commit, we took TCONF as a special state, to let user know the real
LTP test coverage.
But setreuid04.c, setreuid05.c, setreuid07.c and setfsuid04.c do real test
work in child process, if 16-bit version of setreuid or setfsuid is not supported
on some platforms, child process will return a TCONF(see syscalls/utils/compat_16.h),
then parent process will get a non-zero return value and take it as TFAIL directly, fix this.
Signed-off-by: Xiaoguang Wang <wangxg.fnst@cn.fujitsu.com>
---
testcases/kernel/syscalls/setfsuid/setfsuid04.c | 28 ++++++++++---------------
testcases/kernel/syscalls/setreuid/setreuid04.c | 17 +++------------
testcases/kernel/syscalls/setreuid/setreuid05.c | 16 +++-----------
testcases/kernel/syscalls/setreuid/setreuid07.c | 26 ++++++++++-------------
4 files changed, 28 insertions(+), 59 deletions(-)
diff --git a/testcases/kernel/syscalls/setfsuid/setfsuid04.c b/testcases/kernel/syscalls/setfsuid/setfsuid04.c
index 6818987..f2dc351 100644
--- a/testcases/kernel/syscalls/setfsuid/setfsuid04.c
+++ b/testcases/kernel/syscalls/setfsuid/setfsuid04.c
@@ -58,7 +58,6 @@ int main(int ac, char **av)
{
pid_t pid;
const char *msg;
- int status;
if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg);
@@ -72,12 +71,7 @@ int main(int ac, char **av)
if (pid == 0)
do_master_child();
- if (waitpid(pid, &status, 0) == -1)
- tst_resm(TBROK | TERRNO, "waitpid failed");
- if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
- tst_resm(TFAIL, "child process terminated abnormally");
- else
- tst_resm(TPASS, "Test passed");
+ tst_record_childstatus(cleanup, pid);
cleanup();
tst_exit();
@@ -90,7 +84,7 @@ static void do_master_child(void)
if (SETFSUID(NULL, ltpuser->pw_uid) == -1) {
perror("setfsuid failed");
- exit(1);
+ exit(TFAIL);
}
/* Test 1: Check the process with new uid cannot open the file
@@ -101,14 +95,14 @@ static void do_master_child(void)
if (TEST_RETURN != -1) {
close(TEST_RETURN);
printf("open succeeded unexpectedly\n");
- exit(1);
+ exit(TFAIL);
}
if (TEST_ERRNO == EACCES) {
printf("open failed with EACCESS as expected\n");
} else {
printf("open returned unexpected errno - %d\n", TEST_ERRNO);
- exit(1);
+ exit(TFAIL);
}
/* Test 2: Check a son process cannot open the file
@@ -117,7 +111,7 @@ static void do_master_child(void)
pid = FORK_OR_VFORK();
if (pid < 0) {
perror("Fork failed");
- exit(1);
+ exit(TFAIL);
}
if (pid == 0) {
@@ -127,7 +121,7 @@ static void do_master_child(void)
if (TEST_RETURN != -1) {
close(TEST_RETURN);
printf("open succeeded unexpectedly\n");
- exit(1);
+ exit(TFAIL);
}
if (TEST_ERRNO == EACCES) {
@@ -135,13 +129,13 @@ static void do_master_child(void)
} else {
printf("open returned unexpected errno - %d\n",
TEST_ERRNO);
- exit(1);
+ exit(TFAIL);
}
} else {
/* Wait for son completion */
if (waitpid(pid, &status, 0) == -1) {
perror("waitpid failed");
- exit(1);
+ exit(TFAIL);
}
if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
@@ -154,19 +148,19 @@ static void do_master_child(void)
tst_count++;
if (SETFSUID(NULL, 0) == -1) {
perror("setfsuid failed");
- exit(1);
+ exit(TFAIL);
}
TEST(open(testfile, O_RDWR));
if (TEST_RETURN == -1) {
perror("open failed unexpectedly");
- exit(1);
+ exit(TFAIL);
} else {
printf("open call succeeded\n");
close(TEST_RETURN);
}
- exit(0);
+ exit(TPASS);
}
static void setup(void)
diff --git a/testcases/kernel/syscalls/setreuid/setreuid04.c b/testcases/kernel/syscalls/setreuid/setreuid04.c
index f1d2ab0..6c782f3 100644
--- a/testcases/kernel/syscalls/setreuid/setreuid04.c
+++ b/testcases/kernel/syscalls/setreuid/setreuid04.c
@@ -36,9 +36,6 @@ TCID_DEFINE(setreuid04);
static uid_t neg_one = -1;
-/* flag to tell parent if child passed or failed. */
-static int flag;
-
static struct passwd nobody, root;
/*
@@ -75,10 +72,8 @@ int main(int ac, char **av)
setup();
- flag = 0;
-
for (lc = 0; TEST_LOOPING(lc); lc++) {
- int i, pid, status;
+ int i, pid;
tst_count = 0;
@@ -102,20 +97,15 @@ int main(int ac, char **av)
"did not return as expected.",
*test_data[i].real_uid,
*test_data[i].eff_uid);
- flag = -1;
}
uid_verify(test_data[i].exp_real_usr,
test_data[i].exp_eff_usr,
test_data[i].test_msg);
}
- exit(flag);
+ tst_exit();
} else { /* parent */
- waitpid(pid, &status, 0);
- if (WEXITSTATUS(status) != 0) {
- tst_resm(TFAIL, "test failed within "
- "child process.");
- }
+ tst_record_childstatus(cleanup, pid);
}
}
cleanup();
@@ -153,6 +143,5 @@ static void uid_verify(struct passwd *ru, struct passwd *eu, char *when)
when, getuid(), geteuid());
tst_resm(TINFO, "Expected: real uid = %d; effective uid = %d",
ru->pw_uid, eu->pw_uid);
- flag = -1;
}
}
diff --git a/testcases/kernel/syscalls/setreuid/setreuid05.c b/testcases/kernel/syscalls/setreuid/setreuid05.c
index 42fcbb9..14b0ade 100644
--- a/testcases/kernel/syscalls/setreuid/setreuid05.c
+++ b/testcases/kernel/syscalls/setreuid/setreuid05.c
@@ -34,9 +34,6 @@
TCID_DEFINE(setreuid05);
-/* flag to tell parent if child passed or failed. */
-int flag = 0;
-
static int fail = -1;
static int pass;
static uid_t neg_one = -1;
@@ -99,7 +96,7 @@ int main(int argc, char **argv)
pass = 0;
for (lc = 0; TEST_LOOPING(lc); lc++) {
- int i, pid, status;
+ int i, pid;
tst_count = 0;
@@ -122,7 +119,6 @@ int main(int argc, char **argv)
[i].real_uid,
*test_data
[i].eff_uid);
- flag = -1;
continue;
}
tst_resm(TPASS,
@@ -142,7 +138,6 @@ int main(int argc, char **argv)
"did not return as expected.",
*test_data[i].real_uid,
*test_data[i].eff_uid);
- flag = -1;
}
if (TEST_RETURN == -1) {
@@ -152,13 +147,9 @@ int main(int argc, char **argv)
test_data[i].exp_eff_usr,
test_data[i].test_msg);
}
- exit(flag);
+ tst_exit();
} else { /* parent */
- waitpid(pid, &status, 0);
- if (WEXITSTATUS(status) != 0) {
- tst_resm(TFAIL, "test failed within "
- "child process.");
- }
+ tst_record_childstatus(cleanup, pid);
}
}
cleanup();
@@ -207,6 +198,5 @@ static void uid_verify(struct passwd *ru, struct passwd *eu, char *when)
when, getuid(), geteuid());
tst_resm(TINFO, "Expected: real uid = %d; effective uid = %d",
ru->pw_uid, eu->pw_uid);
- flag = -1;
}
}
diff --git a/testcases/kernel/syscalls/setreuid/setreuid07.c b/testcases/kernel/syscalls/setreuid/setreuid07.c
index b6714f9..753ee16 100644
--- a/testcases/kernel/syscalls/setreuid/setreuid07.c
+++ b/testcases/kernel/syscalls/setreuid/setreuid07.c
@@ -55,7 +55,6 @@ int main(int ac, char **av)
{
pid_t pid;
const char *msg;
- int status;
if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL)
tst_brkm(TBROK, cleanup, "OPTION PARSING ERROR - %s", msg);
@@ -69,10 +68,7 @@ int main(int ac, char **av)
if (pid == 0)
do_master_child();
- if (waitpid(pid, &status, 0) == -1)
- tst_resm(TBROK | TERRNO, "waitpid failed");
- if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
- tst_resm(TFAIL, "child process terminated abnormally");
+ tst_record_childstatus(cleanup, pid);
cleanup();
tst_exit();
@@ -91,7 +87,7 @@ static void do_master_child(void)
if (SETREUID(NULL, 0, ltpuser->pw_uid) == -1) {
perror("setreuid failed");
- exit(1);
+ exit(TFAIL);
}
/* Test 1: Check the process with new uid cannot open the file
@@ -102,14 +98,14 @@ static void do_master_child(void)
if (TEST_RETURN != -1) {
printf("open succeeded unexpectedly\n");
close(tst_fd);
- exit(1);
+ exit(TFAIL);
}
if (TEST_ERRNO == EACCES) {
printf("open failed with EACCES as expected\n");
} else {
perror("open failed unexpectedly");
- exit(1);
+ exit(TFAIL);
}
/* Test 2: Check a son process cannot open the file
@@ -128,23 +124,23 @@ static void do_master_child(void)
if (TEST_RETURN != -1) {
printf("call succeeded unexpectedly\n");
close(tst_fd2);
- exit(1);
+ exit(TFAIL);
}
TEST_ERROR_LOG(TEST_ERRNO);
if (TEST_ERRNO == EACCES) {
printf("open failed with EACCES as expected\n");
- exit(0);
+ exit(TPASS);
} else {
printf("open failed unexpectedly\n");
- exit(1);
+ exit(TFAIL);
}
} else {
/* Wait for son completion */
if (waitpid(pid, &status, 0) == -1) {
perror("waitpid failed");
- exit(1);
+ exit(TFAIL);
}
if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
exit(WEXITSTATUS(status));
@@ -156,20 +152,20 @@ static void do_master_child(void)
tst_count++;
if (SETREUID(NULL, 0, 0) == -1) {
perror("setreuid failed");
- exit(1);
+ exit(TFAIL);
}
TEST(tst_fd = open(testfile, O_RDWR));
if (TEST_RETURN == -1) {
perror("open failed unexpectedly");
- exit(1);
+ exit(TFAIL);
} else {
printf("open call succeeded\n");
close(tst_fd);
}
}
- exit(0);
+ exit(TPASS);
}
static void setup(void)
--
1.8.2.1
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v3 1/3] lib/tst_res.c: introduce tst_record_childstatus()
2014-07-28 11:51 ` [LTP] [PATCH v3 1/3] " Xiaoguang Wang
2014-07-28 11:51 ` [LTP] [PATCH v3 2/3] doc: add paragraph to describe using test interface in child process Xiaoguang Wang
2014-07-28 11:51 ` [LTP] [PATCH v3 3/3] syscalls: fix testcases which take TCONF as TFAIL Xiaoguang Wang
@ 2014-07-29 9:56 ` chrubis
2 siblings, 0 replies; 10+ messages in thread
From: chrubis @ 2014-07-29 9:56 UTC (permalink / raw)
To: Xiaoguang Wang; +Cc: ltp-list
Hi!
> In case we need do real test work in child porcess, it is OK for child process
> to use tst_resm(), tst_brkm() or tst_exit(). Parent process can use
> tst_record_childstatus() to make child process's test results propagated to parent
> process correctly.
Pushed with small enhancements.
I've changed the tst_record_childstatus() to print which signal has
killed the child and made it a bit more verbose. Added simple test under
lib/tests/ etc.
Thanks.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v3 2/3] doc: add paragraph to describe using test interface in child process
2014-07-28 11:51 ` [LTP] [PATCH v3 2/3] doc: add paragraph to describe using test interface in child process Xiaoguang Wang
@ 2014-07-29 9:58 ` chrubis
0 siblings, 0 replies; 10+ messages in thread
From: chrubis @ 2014-07-29 9:58 UTC (permalink / raw)
To: Xiaoguang Wang; +Cc: ltp-list
Hi!
I've fixed the formatting (so that asciidoc renders the document fine)
and reworded it a bit and pushed.
Thanks.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [LTP] [PATCH v3 3/3] syscalls: fix testcases which take TCONF as TFAIL
2014-07-28 11:51 ` [LTP] [PATCH v3 3/3] syscalls: fix testcases which take TCONF as TFAIL Xiaoguang Wang
@ 2014-07-29 10:09 ` chrubis
0 siblings, 0 replies; 10+ messages in thread
From: chrubis @ 2014-07-29 10:09 UTC (permalink / raw)
To: Xiaoguang Wang; +Cc: ltp-list
Hi!
Pushed, thanks.
--
Cyril Hrubis
chrubis@suse.cz
------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls.
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2014-07-29 10:09 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-13 5:49 [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus() Xiaoguang Wang
2014-07-13 5:49 ` [LTP] [PATCH v2 2/2] syscalls: fix testcases which take TCONF as TFAIL Xiaoguang Wang
2014-07-15 14:24 ` [LTP] [PATCH v2 1/2] lib/tst_res.c: introduce tst_record_childstatus() chrubis
[not found] ` <53CCA4B9.2070005@cn.fujitsu.com>
2014-07-22 14:30 ` chrubis
2014-07-28 11:51 ` [LTP] [PATCH v3 1/3] " Xiaoguang Wang
2014-07-28 11:51 ` [LTP] [PATCH v3 2/3] doc: add paragraph to describe using test interface in child process Xiaoguang Wang
2014-07-29 9:58 ` chrubis
2014-07-28 11:51 ` [LTP] [PATCH v3 3/3] syscalls: fix testcases which take TCONF as TFAIL Xiaoguang Wang
2014-07-29 10:09 ` chrubis
2014-07-29 9:56 ` [LTP] [PATCH v3 1/3] lib/tst_res.c: introduce tst_record_childstatus() chrubis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox