[yocto] [ptest-runner][PATCH V5] Added error coverage to support when launching child process fails.
Edwin Plauchu
edwin.plauchu.camacho at linux.intel.com
Wed Sep 21 17:49:25 PDT 2016
From: Edwin Plauchu <edwin.plauchu.camacho at intel.com>
An error message is required when detecting one or more
ptest are not launched.
[YOCTO #9752]
Signed-off-by: Edwin Plauchu <edwin.plauchu.camacho at linux.intel.com>
---
tests/data/fail/ptest/run-ptest | 0
tests/utils.c | 149 +++++++++++++++++++++++++++++++---------
utils.c | 8 ++-
3 files changed, 121 insertions(+), 36 deletions(-)
create mode 100644 tests/data/fail/ptest/run-ptest
diff --git a/tests/data/fail/ptest/run-ptest b/tests/data/fail/ptest/run-ptest
new file mode 100644
index 0000000..e69de29
diff --git a/tests/utils.c b/tests/utils.c
index 5d9a909..c68a636 100644
--- a/tests/utils.c
+++ b/tests/utils.c
@@ -37,13 +37,14 @@ extern char *opts_directory;
static char *ptests_found[] = {
"bash",
+ "fail",
"gcc",
"glibc",
"hang",
"python",
NULL
};
-static int ptests_found_length = 5;
+static int ptests_found_length = 6;
static char *ptests_not_found[] = {
"busybox",
"perl",
@@ -136,6 +137,101 @@ START_TEST(test_filter_ptests)
ptest_list_free_all(head_new);
END_TEST
+static inline void
+find_word(int *found, const char *line, const char *word) {
+
+ char *pivot = NULL;
+
+ pivot = strdup(line);
+ pivot[strlen(word)] = '\0';
+ if (strcmp(pivot, word) == 0) { *found = 1; }
+ free(pivot);
+}
+
+
+static void
+search_for_fail(const int rp, FILE *fp_stdout, FILE *fp_stderr)
+{
+ const char *fail_str = "ERROR";
+ char line_buf[PRINT_PTEST_BUF_SIZE];
+ int found_fail = 0;
+ char *line = NULL;
+
+ ck_assert(rp != 0);
+
+ while ((line = fgets(line_buf, PRINT_PTEST_BUF_SIZE, fp_stdout)) != NULL) {
+ find_word(&found_fail, line, fail_str);
+ }
+
+ ck_assert(found_fail == 1);
+}
+
+
+static void
+search_for_timeout(const int rp, FILE *fp_stdout, FILE *fp_stderr)
+{
+ const char *ptest_hang = "hang";
+ const char *timeout_str = "TIMEOUT";
+ char line_buf[PRINT_PTEST_BUF_SIZE];
+ int found_hang = 0;
+ int found_timeout = 0;
+ int next = 0;
+ char *line = NULL;
+
+ ck_assert(rp != 0);
+
+ while ((line = fgets(line_buf, PRINT_PTEST_BUF_SIZE, fp_stdout)) != NULL) {
+ if (next) {
+ find_word(&found_timeout, line, timeout_str);
+ } else {
+ find_word(&next, line, ptest_hang); // XXX: Only compare the name part
+ }
+ }
+
+ ck_assert(found_timeout == 1);
+
+ /* Test stderr output */
+ line = fgets(line_buf, PRINT_PTEST_BUF_SIZE, fp_stderr);
+ find_word(&found_hang, line, ptest_hang);
+
+ ck_assert(found_hang == 1);
+}
+
+
+static void
+run_specific_one(struct ptest_list *head, const int timeout, char *progname,
+ void (*h_analizer)(const int, FILE *, FILE *))
+{
+ char *buf_stdout;
+ size_t size_stdout = PRINT_PTEST_BUF_SIZE;
+ FILE *fp_stdout;
+ char *buf_stderr;
+ size_t size_stderr = PRINT_PTEST_BUF_SIZE;
+ FILE *fp_stderr;
+
+ fp_stdout = open_memstream(&buf_stdout, &size_stdout);
+ ck_assert(fp_stdout != NULL);
+ fp_stderr = open_memstream(&buf_stderr, &size_stderr);
+ ck_assert(fp_stderr != NULL);
+
+ {
+ struct ptest_list *filtered = filter_ptests(head, &progname, 1);
+ ck_assert(ptest_list_length(filtered) == 1);
+
+ h_analizer(
+ run_ptests(filtered, timeout, progname, fp_stdout, fp_stderr),
+ fp_stdout, fp_stderr
+ );
+
+ PTEST_LIST_FREE_ALL_CLEAN(filtered);
+ }
+
+ fclose(fp_stdout);
+ free(buf_stdout);
+ fclose(fp_stderr);
+ free(buf_stderr);
+}
+
START_TEST(test_run_ptests)
struct ptest_list *head;
int timeout = 1;
@@ -148,13 +244,6 @@ START_TEST(test_run_ptests)
size_t size_stderr = PRINT_PTEST_BUF_SIZE;
FILE *fp_stderr;
- int found_timeout = 0;
- int next = 0;
- const char *ptest_hang = "hang";
- const char *timeout_str = "TIMEOUT";
- char *line;
- char line_buf[PRINT_PTEST_BUF_SIZE];
-
fp_stdout = open_memstream(&buf_stdout, &size_stdout);
ck_assert(fp_stdout != NULL);
fp_stderr = open_memstream(&buf_stderr, &size_stderr);
@@ -162,39 +251,33 @@ START_TEST(test_run_ptests)
head = get_available_ptests(opts_directory);
ptest_list_remove(head, "hang", 1);
+ ptest_list_remove(head, "fail", 1);
rc = run_ptests(head, timeout, "test_run_ptests", fp_stdout, fp_stderr);
ck_assert(rc == 0);
ptest_list_free_all(head);
- head = get_available_ptests(opts_directory);
- rc = run_ptests(head, timeout, "test_run_ptests", fp_stdout, fp_stderr);
+ fclose(fp_stdout);
+ free(buf_stdout);
+ fclose(fp_stderr);
+ free(buf_stderr);
- /* Search for TIMEOUT keyword in output of hang ptest */
- while ((line = fgets(line_buf, PRINT_PTEST_BUF_SIZE, fp_stdout)) != NULL) {
- if (next) {
- line[strlen(timeout_str)] = '\0';
- if (strcmp(line, timeout_str) == 0)
- found_timeout = 1;
- } else {
- line[strlen(ptest_hang)] = '\0'; // XXX: Only compare the name part
- if (strcmp(line, ptest_hang) == 0)
- next = 1;
- }
- }
- ck_assert(found_timeout == 1);
-
- /* Test stderr output */
- line = fgets(line_buf, PRINT_PTEST_BUF_SIZE, fp_stderr);
- line[strlen(ptest_hang)] = '\0';
- ck_assert(strcmp(line, ptest_hang) == 0);
+ head = get_available_ptests(opts_directory);
+ run_specific_one(
+ head,
+ timeout,
+ "hang",
+ search_for_timeout
+ );
+
+ run_specific_one(
+ head,
+ timeout,
+ "fail",
+ search_for_fail
+ );
- ck_assert(rc != 0);
ptest_list_free_all(head);
- fclose(fp_stdout);
- free(buf_stdout);
- fclose(fp_stderr);
- free(buf_stderr);
END_TEST
Suite *
diff --git a/utils.c b/utils.c
index 6991af1..402e6fb 100644
--- a/utils.c
+++ b/utils.c
@@ -249,7 +249,7 @@ run_child(char *run_ptest, int fd_stdout, int fd_stderr)
dup2(fd_stderr, STDERR_FILENO);
execv(run_ptest, argv);
- exit(0);
+ exit(1);
}
static inline int
@@ -336,6 +336,7 @@ run_ptests(struct ptest_list *head, int timeout, const char *progname,
child = fork();
if (child == -1) {
+ fprintf(fp, "ERROR: Fork fatal\n");
rc = -1;
break;
} else if (child == 0) {
@@ -350,9 +351,10 @@ run_ptests(struct ptest_list *head, int timeout, const char *progname,
status = wait_child(ptest_dir, p->run_ptest, child,
timeout, fds, fps);
- if (status)
+ if (status) {
+ fprintf(fp, "ERROR: Program child error\n");
rc += 1;
-
+ }
fprintf(fp, "END: %s\n", ptest_dir);
fprintf(fp, "%s\n", get_stime(stime, GET_STIME_BUF_SIZE));
}
--
2.9.3
More information about the yocto
mailing list