diff options
| author | Charles <sircharlesaze@gmail.com> | 2019-11-01 17:18:40 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2019-11-01 17:18:40 +0100 |
| commit | 573d059fc002343f280945a6a58482c7e018566c (patch) | |
| tree | 9e5920fe7dc454d5a3017a126bb90ee78fb39a9c | |
| download | ft_printf_test-573d059fc002343f280945a6a58482c7e018566c.tar.gz ft_printf_test-573d059fc002343f280945a6a58482c7e018566c.tar.bz2 ft_printf_test-573d059fc002343f280945a6a58482c7e018566c.zip | |
Basic testing framework
| -rw-r--r-- | Makefile | 34 | ||||
| -rwxr-xr-x | a.out | bin | 0 -> 33288 bytes | |||
| -rw-r--r-- | a.tmp | 31 | ||||
| -rwxr-xr-x | ft_printf_test | bin | 0 -> 33704 bytes | |||
| -rw-r--r-- | header.h | 81 | ||||
| -rw-r--r-- | helper.c | 27 | ||||
| -rw-r--r-- | helper.o | bin | 0 -> 2088 bytes | |||
| -rw-r--r-- | main.c | 11 | ||||
| -rw-r--r-- | main.o | bin | 0 -> 4784 bytes | |||
| -rw-r--r-- | moulitest_read_stdout.c | 74 | ||||
| -rw-r--r-- | moulitest_read_stdout.o | bin | 0 -> 2400 bytes |
11 files changed, 258 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dc4e169 --- /dev/null +++ b/Makefile @@ -0,0 +1,34 @@ +FT_PRINTF_PATH = ../ft_printf + +CC = gcc +CCFLAGS = -Wall -Wextra +LDFLAGS = -L$(FT_PRINTF_PATH) -lftprintf +MAKE = make -j4 + +NAME = ft_printf_test +RM = rm -f + +SRC = main.c helper.c moulitest_read_stdout.c +OBJ = $(SRC:.c=.o) + +run: all + ./$(NAME) + +all: $(NAME) + +$(NAME): ft_printf_all $(OBJ) + $(CC) $(LDFLAGS) $(CCFLAGS) -o $@ $(OBJ) + +%.o: %.c + $(CC) $(CCFLAGS) -c -o $@ $< + +clean: + $(RM) $(OBJ) + +fclean: clean + $(RM) $(NAME) + +re: fclean all + +ft_printf_all: + $(MAKE) -C $(FT_PRINTF_PATH) all Binary files differ@@ -0,0 +1,31 @@ +do { + capture_stdout(); + do { + if ((pid = fork()) < 0) + exit(1); + if (pid == 0) { + do { + origin_ret = printf("%d", 10); + origin_buf = strdup(capture_stdout_get_buf()); + } while(0); + exit(0); + } + wait(&pid); + signaled = (((*(int *)&(pid)) & 0177) != 0177 && ((*(int *)&(pid)) & 0177) != 0); + } while(0);; + origin_signaled = signaled; + do { + if ((pid = fork()) < 0) + exit(1); + if (pid == 0) { + do { + user_ret = ft_printf("%d", 10); + user_buf = strdup(capture_stdout_get_buf()); + } while(0); + exit(0); + } wait(&pid); + signaled = (((*(int *)&(pid)) & 0177) != 0177 && ((*(int *)&(pid)) & 0177) != 0); + } while(0);; + capture_stdout_destroy(); + user_signaled = signaled; +} while (0);; diff --git a/ft_printf_test b/ft_printf_test Binary files differnew file mode 100755 index 0000000..f970eee --- /dev/null +++ b/ft_printf_test diff --git a/header.h b/header.h new file mode 100644 index 0000000..31bfa81 --- /dev/null +++ b/header.h @@ -0,0 +1,81 @@ +#ifndef FT_PRINTF_TEST_HEADER_H +# define FT_PRINTF_TEST_HEADER_H + +# include <sys/wait.h> +# include <stdlib.h> +# include <stdio.h> +# include <unistd.h> +# include <string.h> +# include <stdbool.h> + +# define BUF_SIZE 2048 + +int pid; +bool signaled; +bool origin_signaled; +bool user_signaled; +int origin_ret; +int user_ret; +char *origin_buf; +char *user_buf; + +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_ok(void); +void print_ko(void); + +/* moulitest functions */ +void capture_close_saved_stdout(void); +void capture_stdout(void); +char *capture_stdout_get_buf(void); +void capture_stdout_destroy(void); + +# 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 { \ + capture_stdout(); \ + TEST_SEGFAULT( \ + origin_ret = printf(__VA_ARGS__); \ + origin_buf = strdup(capture_stdout_get_buf()); \ + ); \ + origin_signaled = signaled; \ + TEST_SEGFAULT( \ + user_ret = ft_printf(__VA_ARGS__); \ + user_buf = strdup(capture_stdout_get_buf()); \ + ); \ + capture_stdout_destroy(); \ + user_signaled = signaled; \ +} while (0); + +# define ASSERT_PRINTF(...) do { \ + TEST_PRINTF(__VA_ARGS__); \ + if (!origin_signaled) \ + if (user_signaled) \ + print_signaled_ko(#__VA_ARGS__); \ + else \ + print_ok(); \ + else { \ + if (strcmp(origin_buf, user_buf) != 0) \ + print_buf_ko(#__VA_ARGS__); \ + else if (origin_ret != user_ret) \ + print_ret_ko(#__VA_ARGS__); \ + else \ + print_ko(); \ + } \ + free(origin_buf); \ + free(user_buf); \ +} while (0); + +#endif diff --git a/helper.c b/helper.c new file mode 100644 index 0000000..1c16409 --- /dev/null +++ b/helper.c @@ -0,0 +1,27 @@ +#include <stdio.h> +#include "header.h" + +void print_buf_ko(char *msg) +{ + print_ko(); + printf("ft_printf(%s) has wrong output\n", msg); + printf("actual: \"%s\"", origin_buf); + printf("expected: \"%s\"", user_buf); +} + +void print_ret_ko(char *msg) +{ + print_ko(); + printf("ft_printf(%s) has wrong return value\n", msg); + printf("actual: %d", origin_ret); + printf("expected: %d", user_ret); +} + +void print_signaled_ko(char *msg) +{ + print_ko(); + printf("ft_printf(\"%s\") has been signaled (segfault and friends)\n", msg); +} + +inline void print_ok(void) { printf("\033[32m[OK]\033[0m\n"); } +inline void print_ko(void) { printf("\033[31m[KO]\033[0m "); } diff --git a/helper.o b/helper.o Binary files differnew file mode 100644 index 0000000..a070f30 --- /dev/null +++ b/helper.o @@ -0,0 +1,11 @@ +#include <stdio.h> +#include "header.h" + +int main(int argc, char **argv) +{ + ASSERT_PRINTF("%d", 10); + ASSERT_PRINTF("% asdf"); + ASSERT_PRINTF("%fsdf", 5.3); + + return 0; +} Binary files differdiff --git a/moulitest_read_stdout.c b/moulitest_read_stdout.c new file mode 100644 index 0000000..e2e61d2 --- /dev/null +++ b/moulitest_read_stdout.c @@ -0,0 +1,74 @@ +/* + * This is a copy and paste from + * https://github.com/yyang42/moulitest/blob/205892c29f77027dc45c6a09b6ec26b5a5f8116c/testframework/v3/srcs/capture/capture.c + */ + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +/* #include <capture.h> */ +#include <errno.h> +#include <assert.h> + +#define MAX_LEN 42000 +#define BUF_SIZE MAX_LEN + 1 +#define READ 0 +#define WRITE 1 +#define NO_FD_OPENED -1 + +int saved_stdout = NO_FD_OPENED; +int out_pipe[2]; +char out_buffer[10 * 1000]; + +void capture_close_saved_stdout(void) +{ + extern int saved_stdout; + + if (saved_stdout != NO_FD_OPENED) + { + /* fprintf(stderr, "== close %d ==\n", saved_stdout); */ + dup2(saved_stdout, STDOUT_FILENO); + close(saved_stdout); /* important ! */ + saved_stdout = NO_FD_OPENED; + close(out_pipe[READ]); + close(out_pipe[WRITE]); + } +} + +void capture_stdout(void) +{ + capture_close_saved_stdout(); + if(pipe(out_pipe) != 0) { /* make a pipe */ + assert(0); + } + assert(saved_stdout < 100); + saved_stdout = dup(STDOUT_FILENO); /* save stdout for display later */ + dup2(out_pipe[WRITE], STDOUT_FILENO); /* redirect stdout to the pipe */ +} + +static void capture_unblock_fd(int fd) +{ + int flags = fcntl(fd, F_GETFL, 0); + fcntl(fd, F_SETFL, flags | O_NONBLOCK); +} + +char *capture_stdout_get_buf(void) +{ + int ret; + fflush(stdout); + + capture_unblock_fd(out_pipe[0]); + *(out_buffer) = '\0'; + ret = read(out_pipe[READ], out_buffer, MAX_LEN); /* read from pipe into buffer */ + out_buffer[ret] = '\0'; + return (out_buffer); +} + +void capture_stdout_destroy(void) +{ + extern int saved_stdout; + dup2(saved_stdout, STDOUT_FILENO); /* reconnect stdout for testing */ + capture_close_saved_stdout(); + //free(cap); +} diff --git a/moulitest_read_stdout.o b/moulitest_read_stdout.o Binary files differnew file mode 100644 index 0000000..f206a20 --- /dev/null +++ b/moulitest_read_stdout.o |
