aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile34
-rwxr-xr-xa.outbin0 -> 33288 bytes
-rw-r--r--a.tmp31
-rwxr-xr-xft_printf_testbin0 -> 33704 bytes
-rw-r--r--header.h81
-rw-r--r--helper.c27
-rw-r--r--helper.obin0 -> 2088 bytes
-rw-r--r--main.c11
-rw-r--r--main.obin0 -> 4784 bytes
-rw-r--r--moulitest_read_stdout.c74
-rw-r--r--moulitest_read_stdout.obin0 -> 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
diff --git a/a.out b/a.out
new file mode 100755
index 0000000..fcf0f5c
--- /dev/null
+++ b/a.out
Binary files differ
diff --git a/a.tmp b/a.tmp
new file mode 100644
index 0000000..ae0e529
--- /dev/null
+++ b/a.tmp
@@ -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
new file mode 100755
index 0000000..f970eee
--- /dev/null
+++ b/ft_printf_test
Binary files differ
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
new file mode 100644
index 0000000..a070f30
--- /dev/null
+++ b/helper.o
Binary files differ
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..ed2b728
--- /dev/null
+++ b/main.c
@@ -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;
+}
diff --git a/main.o b/main.o
new file mode 100644
index 0000000..7c8d033
--- /dev/null
+++ b/main.o
Binary files differ
diff --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
new file mode 100644
index 0000000..f206a20
--- /dev/null
+++ b/moulitest_read_stdout.o
Binary files differ