aboutsummaryrefslogtreecommitdiff
path: root/header.h
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-04-02 20:51:30 +0200
committerCharles <sircharlesaze@gmail.com>2020-04-02 20:52:13 +0200
commit25d81fe88c7e9aebe011b7b625b4eb7d31936591 (patch)
tree9990ee49ac9ad31ea2b6eb45dad285cc398e7e0c /header.h
parent63e9453f1543cfa98dcb9d2b5078bc919f90d9a9 (diff)
downloadft_printf_test-25d81fe88c7e9aebe011b7b625b4eb7d31936591.tar.gz
ft_printf_test-25d81fe88c7e9aebe011b7b625b4eb7d31936591.tar.bz2
ft_printf_test-25d81fe88c7e9aebe011b7b625b4eb7d31936591.zip
Added timeout detection
Diffstat (limited to 'header.h')
-rw-r--r--header.h125
1 files changed, 84 insertions, 41 deletions
diff --git a/header.h b/header.h
index ddbc9fd..07ab46e 100644
--- a/header.h
+++ b/header.h
@@ -6,13 +6,14 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/06 18:13:32 by cacharle #+# #+# */
-/* Updated: 2020/02/21 01:21:48 by cacharle ### ########.fr */
+/* Updated: 2020/04/02 20:49:26 by charles ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef FT_PRINTF_TEST_HEADER_H
# define FT_PRINTF_TEST_HEADER_H
+# include <sys/select.h>
# include <sys/wait.h>
# include <stdlib.h>
# include <stdio.h>
@@ -21,6 +22,7 @@
# include <stdbool.h>
int pid;
+int pid2;
bool signaled;
static bool origin_signaled = false;
static bool user_signaled = false;
@@ -29,6 +31,18 @@ int user_ret;
char *origin_buf;
char *user_buf;
+struct timeval timeout;
+fd_set input_set;
+int timeout_pipe[2];
+int fd_read_num;
+
+#define PIPE_WRITE 1
+#define PIPE_READ 0
+
+// #define PRINTF_NULL_STR "(nil)"
+
+// int printf_wrapper(const char *format, ...);
+
void generated_test(void);
void saved_test(void);
@@ -37,6 +51,7 @@ int ft_printf(const char *format, ...);
void print_buf_ko(char *msg);
void print_ret_ko(char *msg);
void print_signaled_ko(char *msg);
+void print_timeouted(char *msg);
void print_ok(void);
void print_ko(void);
void ft_putstr_non_printable(char *str);
@@ -45,50 +60,78 @@ void test_setup(void);
void test_tear_down(void);
char *read_stdout_buf(void);
-# define TEST_SEGFAULT(x) do { \
- if ((pid = fork()) < 0) \
- exit(EXIT_FAILURE); \
- if (pid == 0) { \
- do { x } while(0); \
- exit(EXIT_SUCCESS); \
- } else { \
- wait(&pid); \
- signaled = WIFSIGNALED(pid); \
- } \
+char fd_buf[10];
+
+# define TEST_TIMEOUT(x) do { \
+ if ((pid2 = fork()) == -1) \
+ exit(EXIT_FAILURE); \
+ if (pid2 == 0) { \
+ do { x; } while (0); \
+ write(timeout_pipe[PIPE_WRITE], "a", 1); \
+ exit(EXIT_SUCCESS); \
+ } \
+ FD_ZERO(&input_set); \
+ FD_SET(timeout_pipe[PIPE_READ], &input_set); \
+ fd_read_num = select(FD_SETSIZE, &input_set, NULL, NULL, &timeout); \
+ if (fd_read_num == -1) \
+ exit(EXIT_FAILURE); \
+ if (fd_read_num == 0) \
+ kill(pid2, 9); \
+ else { \
+ wait(&pid2); \
+ read(timeout_pipe[PIPE_READ], fd_buf, 1); \
+ } \
+} while (0);
+
+# define TEST_SEGFAULT(x) do { \
+ if ((pid = fork()) < 0) \
+ exit(EXIT_FAILURE); \
+ if (pid == 0) { \
+ do { x } while(0); \
+ exit(EXIT_SUCCESS); \
+ } \
+ wait(&pid); \
+ signaled = WIFSIGNALED(pid); \
} while(0);
-# define TEST_PRINTF(...) do { \
- test_setup(); \
- TEST_SEGFAULT( \
- origin_ret = printf(__VA_ARGS__); \
- ); \
- origin_buf = strdup(read_stdout_buf()); \
- origin_signaled = signaled; \
- TEST_SEGFAULT( \
- user_ret = ft_printf(__VA_ARGS__); \
- ); \
- user_buf = strdup(read_stdout_buf()); \
- user_signaled = signaled; \
- test_tear_down(); \
+# define TEST_PRINTF(...) do { \
+ test_setup(); \
+ TEST_SEGFAULT( \
+ origin_ret = printf(__VA_ARGS__); \
+ ); \
+ origin_buf = strdup(read_stdout_buf()); \
+ origin_signaled = signaled; \
+ fd_read_num = 1; \
+ TEST_SEGFAULT( \
+ TEST_TIMEOUT(user_ret = ft_printf(__VA_ARGS__)); \
+ ); \
+ user_buf = strdup(read_stdout_buf()); \
+ user_signaled = signaled; \
+ test_tear_down(); \
} while (0)
-# define ASSERT_PRINTF(...) do { \
- TEST_PRINTF(__VA_ARGS__); \
- if (!origin_signaled && user_signaled) \
- print_signaled_ko(#__VA_ARGS__); \
- else if (origin_signaled && user_signaled) \
- print_ok(); \
- else if (!origin_signaled && !user_signaled) { \
- if (memcmp(origin_buf, user_buf, \
- strlen(origin_buf) + 1) != 0) \
- print_buf_ko(#__VA_ARGS__); \
- else if (origin_ret != user_ret) \
- print_ret_ko(#__VA_ARGS__); \
- else \
- print_ok(); \
- } \
- if (!origin_signaled) free(origin_buf); \
- if (!user_signaled) free(user_buf); \
+# define ASSERT_PRINTF(...) do { \
+ TEST_PRINTF(__VA_ARGS__); \
+ if (fd_read_num == 0) \
+ print_timeouted(#__VA_ARGS__); \
+ else \
+ { \
+ if (!origin_signaled && user_signaled) \
+ print_signaled_ko(#__VA_ARGS__); \
+ else if (origin_signaled && user_signaled) \
+ print_ok(); \
+ else if (!origin_signaled && !user_signaled) { \
+ if (memcmp(origin_buf, user_buf, \
+ strlen(origin_buf) + 1) != 0) \
+ print_buf_ko(#__VA_ARGS__); \
+ else if (origin_ret != user_ret) \
+ print_ret_ko(#__VA_ARGS__); \
+ else \
+ print_ok(); \
+ } \
+ } \
+ free(origin_buf); \
+ free(user_buf); \
} while(0);
#endif