Skip to content

Commit 82911f1

Browse files
committed
[lldb][test] Skip ReadAfterClose JSON Transport tests on Windows
These were failing on our Windows on Arm bot, or more precisely, not even completing. This is because Microsoft's C runtime does extra parameter validation. So when we called _read with an invalid fd, it called an invalid parameter handler instead of returning an error. https://learn.microsoft.com/en-us/%20cpp/c-runtime-library/reference/read?view=msvc-170 https://learn.microsoft.com/en-us/%20cpp/c-runtime-library/parameter-validation?view=msvc-170 (lldb) run Process 8440 launched: 'C:\Users\tcwg\llvm-worker\lldb-aarch64-windows\build\tools\lldb\unittests\Host\HostTests.exe' (aarch64) Process 8440 stopped * thread #1, stop reason = Exception 0xc0000409 encountered at address 0x7ffb7453564c frame #0: 0x00007ffb7453564c ucrtbase.dll`_get_thread_local_invalid_parameter_handler + 652 ucrtbase.dll`_get_thread_local_invalid_parameter_handler: -> 0x7ffb7453564c <+652>: brk #0xf003 ucrtbase.dll`_invalid_parameter_noinfo: 0x7ffb74535650 <+0>: b 0x7ffb745354d8 ; _get_thread_local_invalid_parameter_handler + 280 0x7ffb74535654 <+4>: nop 0x7ffb74535658 <+8>: nop You can override this handler but I'm assuming that this reading after close isn't a crucial feature, so disabling the tests seems like the way to go. If it is crucial, we can check the fd before we use it. Tests added by llvm#143946.
1 parent e6a3579 commit 82911f1

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

lldb/unittests/Host/JSONTransportTest.cpp

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,6 @@ TEST_F(HTTPDelimitedJSONTransportTest, ReadWithEOF) {
8484
Failed<TransportEOFError>());
8585
}
8686

87-
TEST_F(HTTPDelimitedJSONTransportTest, ReadAfterClosed) {
88-
input.CloseReadFileDescriptor();
89-
ASSERT_THAT_EXPECTED(
90-
transport->Read<JSONTestType>(std::chrono::milliseconds(1)),
91-
llvm::Failed());
92-
}
9387

9488
TEST_F(HTTPDelimitedJSONTransportTest, InvalidTransport) {
9589
transport = std::make_unique<HTTPDelimitedJSONTransport>(nullptr, nullptr);
@@ -136,13 +130,6 @@ TEST_F(JSONRPCTransportTest, ReadWithEOF) {
136130
Failed<TransportEOFError>());
137131
}
138132

139-
TEST_F(JSONRPCTransportTest, ReadAfterClosed) {
140-
input.CloseReadFileDescriptor();
141-
ASSERT_THAT_EXPECTED(
142-
transport->Read<JSONTestType>(std::chrono::milliseconds(1)),
143-
llvm::Failed());
144-
}
145-
146133
TEST_F(JSONRPCTransportTest, Write) {
147134
ASSERT_THAT_ERROR(transport->Write(JSONTestType{"foo"}), Succeeded());
148135
output.CloseWriteFileDescriptor();
@@ -173,4 +160,22 @@ TEST_F(JSONRPCTransportTest, ReadWithTimeout) {
173160
transport->Read<JSONTestType>(std::chrono::milliseconds(1)),
174161
Failed<TransportTimeoutError>());
175162
}
163+
164+
// Windows CRT _read checks that the file descriptor is valid and calls a
165+
// handler if not. This handler is normally a breakpoint, which looks like a
166+
// crash when not handled by a debugger.
167+
// https://learn.microsoft.com/en-us/%20cpp/c-runtime-library/reference/read?view=msvc-170
168+
TEST_F(HTTPDelimitedJSONTransportTest, ReadAfterClosed) {
169+
input.CloseReadFileDescriptor();
170+
ASSERT_THAT_EXPECTED(
171+
transport->Read<JSONTestType>(std::chrono::milliseconds(1)),
172+
llvm::Failed());
173+
}
174+
175+
TEST_F(JSONRPCTransportTest, ReadAfterClosed) {
176+
input.CloseReadFileDescriptor();
177+
ASSERT_THAT_EXPECTED(
178+
transport->Read<JSONTestType>(std::chrono::milliseconds(1)),
179+
llvm::Failed());
180+
}
176181
#endif

0 commit comments

Comments
 (0)