[PATCH 1/2] t0051: test GIT_TRACE to a windows named pipe

2018-09-07 Thread Jeff Hostetler via GitGitGadget
From: Jeff Hostetler 

Create a test-tool helper to create the server side of
a windows named pipe, wait for a client connection, and
copy data written to the pipe to stdout.

Create t0051 test to route GIT_TRACE output of a command
to a named pipe using the above test-tool helper.

Signed-off-by: Jeff Hostetler 
---
 Makefile   |  1 +
 t/helper/test-tool.c   |  3 ++
 t/helper/test-tool.h   |  3 ++
 t/helper/test-windows-named-pipe.c | 72 ++
 t/t0051-windows-named-pipe.sh  | 17 +++
 5 files changed, 96 insertions(+)
 create mode 100644 t/helper/test-windows-named-pipe.c
 create mode 100755 t/t0051-windows-named-pipe.sh

diff --git a/Makefile b/Makefile
index e4b503d259..b1b934d295 100644
--- a/Makefile
+++ b/Makefile
@@ -731,6 +731,7 @@ TEST_BUILTINS_OBJS += test-submodule-config.o
 TEST_BUILTINS_OBJS += test-subprocess.o
 TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
 TEST_BUILTINS_OBJS += test-wildmatch.o
+TEST_BUILTINS_OBJS += test-windows-named-pipe.o
 TEST_BUILTINS_OBJS += test-write-cache.o
 
 TEST_PROGRAMS_NEED_X += test-dump-fsmonitor
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 805a45de9c..7a9764cd5c 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -41,6 +41,9 @@ static struct test_cmd cmds[] = {
{ "subprocess", cmd__subprocess },
{ "urlmatch-normalization", cmd__urlmatch_normalization },
{ "wildmatch", cmd__wildmatch },
+#ifdef GIT_WINDOWS_NATIVE
+   { "windows-named-pipe", cmd__windows_named_pipe },
+#endif
{ "write-cache", cmd__write_cache },
 };
 
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index 7116ddfb94..01c34fe5e7 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -35,6 +35,9 @@ int cmd__submodule_config(int argc, const char **argv);
 int cmd__subprocess(int argc, const char **argv);
 int cmd__urlmatch_normalization(int argc, const char **argv);
 int cmd__wildmatch(int argc, const char **argv);
+#ifdef GIT_WINDOWS_NATIVE
+int cmd__windows_named_pipe(int argc, const char **argv);
+#endif
 int cmd__write_cache(int argc, const char **argv);
 
 #endif
diff --git a/t/helper/test-windows-named-pipe.c 
b/t/helper/test-windows-named-pipe.c
new file mode 100644
index 00..b4b752b01a
--- /dev/null
+++ b/t/helper/test-windows-named-pipe.c
@@ -0,0 +1,72 @@
+#include "test-tool.h"
+#include "git-compat-util.h"
+#include "strbuf.h"
+
+#ifdef GIT_WINDOWS_NATIVE
+static const char *usage_string = "";
+
+#define TEST_BUFSIZE (4096)
+
+int cmd__windows_named_pipe(int argc, const char **argv)
+{
+   const char *filename;
+   struct strbuf pathname = STRBUF_INIT;
+   int err;
+   HANDLE h;
+   BOOL connected;
+   char buf[TEST_BUFSIZE + 1];
+
+   if (argc < 2)
+   goto print_usage;
+   filename = argv[1];
+   if (strchr(filename, '/') || strchr(filename, '\\'))
+   goto print_usage;
+   strbuf_addf(&pathname, "//./pipe/%s", filename);
+
+   /*
+* Create a single instance of the server side of the named pipe.
+* This will allow exactly one client instance to connect to it.
+*/
+   h = CreateNamedPipeA(
+   pathname.buf,
+   PIPE_ACCESS_INBOUND | FILE_FLAG_FIRST_PIPE_INSTANCE,
+   PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
+   PIPE_UNLIMITED_INSTANCES,
+   TEST_BUFSIZE, TEST_BUFSIZE, 0, NULL);
+   if (h == INVALID_HANDLE_VALUE) {
+   err = err_win_to_posix(GetLastError());
+   fprintf(stderr, "CreateNamedPipe failed: %s\n",
+   strerror(err));
+   return err;
+   }
+
+   connected = ConnectNamedPipe(h, NULL)
+   ? TRUE
+   : (GetLastError() == ERROR_PIPE_CONNECTED);
+   if (!connected) {
+   err = err_win_to_posix(GetLastError());
+   fprintf(stderr, "ConnectNamedPipe failed: %s\n",
+   strerror(err));
+   CloseHandle(h);
+   return err;
+   }
+
+   while (1) {
+   DWORD nbr;
+   BOOL success = ReadFile(h, buf, TEST_BUFSIZE, &nbr, NULL);
+   if (!success || nbr == 0)
+   break;
+   buf[nbr] = 0;
+
+   write(1, buf, nbr);
+   }
+
+   DisconnectNamedPipe(h);
+   CloseHandle(h);
+   return 0;
+
+print_usage:
+   fprintf(stderr, "usage: %s %s\n", argv[0], usage_string);
+   return 1;
+}
+#endif
diff --git a/t/t0051-windows-named-pipe.sh b/t/t0051-windows-named-pipe.sh
new file mode 100755
index 00..10ac92d225
--- /dev/null
+++ b/t/t0051-windows-named-pipe.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+test_description='Windows named pipes'
+
+. ./test-lib.sh
+
+test_expect_success MINGW 'o_append write to named pipe' '
+   GIT_TRACE="$(pwd)/expect" git status >/dev/null 2>&1 &&
+   { tes

Re: [PATCH 1/2] t0051: test GIT_TRACE to a windows named pipe

2018-09-09 Thread Sebastian Schuberth

On 9/7/2018 8:19 PM, Jeff Hostetler via GitGitGadget wrote:


+test_expect_success MINGW 'o_append write to named pipe' '


Shouldn't this be "test_expect_failure" here, and then be changed to 
"test_expect_success" by your second patch?



--
Sebastian Schuberth


Re: [PATCH 1/2] t0051: test GIT_TRACE to a windows named pipe

2018-09-10 Thread Jeff Hostetler




On 9/9/2018 3:28 AM, Sebastian Schuberth wrote:

On 9/7/2018 8:19 PM, Jeff Hostetler via GitGitGadget wrote:


+test_expect_success MINGW 'o_append write to named pipe' '


Shouldn't this be "test_expect_failure" here, and then be changed to 
"test_expect_success" by your second patch?





yes. thanks!
Jeff