1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
#include "precomp.h"
using namespace System;
using namespace System::Security::Principal;
using namespace Xunit;
using namespace WixInternal::TestSupport;
using namespace WixInternal::TestSupport::XunitExtensions;
static DWORD STDAPICALLTYPE _TestPipeClientThreadProc(
__in LPVOID lpThreadParameter
);
namespace DutilTests
{
public ref class PipeUtil
{
public:
[Fact]
void PipeConnectWriteAndRead()
{
HRESULT hr = S_OK;
HANDLE hServerPipe = INVALID_HANDLE_VALUE;
HANDLE hClientThread = NULL;
PIPE_MESSAGE msg = { };
DWORD dwThread = 42;
DWORD dwTestMessageId = 987654;
try
{
hr = PipeCreate(L"DutilTest", NULL, &hServerPipe);
NativeAssert::Succeeded(hr, "Failed to create server pipe.");
hClientThread = ::CreateThread(NULL, 0, _TestPipeClientThreadProc, &dwTestMessageId, 0, NULL);
if (hClientThread == 0)
{
NativeAssert::Fail("Failed to create client thread.");
return;
}
hr = PipeServerWaitForClientConnect(hServerPipe);
NativeAssert::Succeeded(hr, "Failed to wait for client to connect to pipe.");
hr = PipeReadMessage(hServerPipe, &msg);
NativeAssert::Succeeded(hr, "Failed to read message from client.");
NativeAssert::Equal(dwTestMessageId, msg.dwMessageType);
AppWaitForSingleObject(hClientThread, INFINITE);
::GetExitCodeThread(hClientThread, &dwThread);
NativeAssert::Equal((DWORD)12, dwThread);
}
finally
{
ReleasePipeMessage(&msg);
ReleaseHandle(hClientThread);
ReleasePipeHandle(hServerPipe);
}
}
};
}
static DWORD STDAPICALLTYPE _TestPipeClientThreadProc(
__in LPVOID lpThreadParameter
)
{
HRESULT hr = S_OK;
HANDLE hClientPipe = INVALID_HANDLE_VALUE;
hr = PipeClientConnect(L"DutilTest", &hClientPipe);
if (FAILED(hr))
{
return hr;
}
::Sleep(200);
hr = PipeWriteMessage(hClientPipe, *(LPDWORD)lpThreadParameter, NULL, 0);
if (FAILED(hr))
{
return hr;
}
ReleasePipeHandle(hClientPipe);
return 12;
}
|