aboutsummaryrefslogtreecommitdiff
path: root/moulitest_read_stdout.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-11-01 17:18:40 +0100
committerCharles <sircharlesaze@gmail.com>2019-11-01 17:18:40 +0100
commit573d059fc002343f280945a6a58482c7e018566c (patch)
tree9e5920fe7dc454d5a3017a126bb90ee78fb39a9c /moulitest_read_stdout.c
downloadft_printf_test-573d059fc002343f280945a6a58482c7e018566c.tar.gz
ft_printf_test-573d059fc002343f280945a6a58482c7e018566c.tar.bz2
ft_printf_test-573d059fc002343f280945a6a58482c7e018566c.zip
Basic testing framework
Diffstat (limited to 'moulitest_read_stdout.c')
-rw-r--r--moulitest_read_stdout.c74
1 files changed, 74 insertions, 0 deletions
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);
+}