11
11
#include " lldb/Host/FileSystem.h"
12
12
#include " lldb/Host/HostInfo.h"
13
13
#include " llvm/Testing/Support/Error.h"
14
+ #include " lldb/Host/Socket.h"
14
15
#include " gtest/gtest.h"
15
16
#include < chrono>
16
17
#include < fcntl.h>
@@ -36,6 +37,36 @@ TEST_F(PipeTest, CreateWithUniqueName) {
36
37
llvm::Succeeded ());
37
38
}
38
39
40
+
41
+ TEST_F (PipeTest, select) {
42
+ ASSERT_THAT_ERROR (Socket::Initialize (), llvm::Succeeded ());
43
+ Pipe pipe;
44
+ ASSERT_THAT_ERROR (pipe.CreateNew ().ToError (), llvm::Succeeded ());
45
+ OVERLAPPED ov = {};
46
+ HANDLE event = CreateEvent (NULL , true , false , NULL );
47
+ ASSERT_NE (event, nullptr );
48
+ ov.hEvent = event;
49
+ char buffer[1 ];
50
+ DWORD bytes_read;
51
+ BOOL success = ReadFile (pipe.GetReadPipe (), buffer, 0 , &bytes_read, &ov);
52
+ ASSERT_FALSE (success);
53
+ ASSERT_EQ (GetLastError (), ERROR_IO_PENDING);
54
+ auto start = std::chrono::system_clock::now ();
55
+ std::future<llvm::Expected<size_t >> future_num_bytes = std::async (
56
+ std::launch::async, [&] {
57
+ std::this_thread::sleep_for (std::chrono::seconds (1 ));
58
+ return pipe.Write (" ." , 1 , std::nullopt);
59
+ });
60
+ DWORD result = WSAWaitForMultipleEvents (1 , &event, false , INFINITE, false );
61
+ ASSERT_GT (std::chrono::system_clock::now ()-start, std::chrono::seconds (1 ));
62
+ ASSERT_EQ (result, WSA_WAIT_EVENT_0);
63
+ ASSERT_TRUE (GetOverlappedResult (pipe.GetReadPipe (), &ov, &bytes_read, false ));
64
+ ASSERT_EQ (bytes_read, 0 );
65
+ ASSERT_THAT_EXPECTED (future_num_bytes.get (), llvm::Succeeded ());
66
+ ASSERT_THAT_EXPECTED (pipe.Read (buffer, 1 , std::chrono::seconds (0 )), llvm::HasValue (1 ));
67
+ ASSERT_EQ (buffer[0 ], ' .' );
68
+ }
69
+
39
70
// Test broken
40
71
#ifndef _WIN32
41
72
TEST_F (PipeTest, OpenAsReader) {
0 commit comments