@@ -39,22 +39,37 @@ template <typename T> class JSONTransportTest : public PipePairTest {
3939 }
4040
4141 template <typename P>
42- void
43- RunOnce (std::function<void (llvm::Expected<P>)> callback,
44- std::chrono::milliseconds timeout = std::chrono::milliseconds(100 )) {
42+ Expected<P>
43+ RunOnce (std::chrono::milliseconds timeout = std::chrono::seconds(1 )) {
44+ std::promise<Expected<P>> promised_message;
45+ RunUntil<P>(
46+ [&](Expected<P> message) {
47+ promised_message.set_value (std::move (message));
48+ return /* keep_going*/ false ;
49+ },
50+ timeout);
51+ return promised_message.get_future ().get ();
52+ }
53+
54+ // / RunUntil runs the event loop until the callback returns `false` or a
55+ // / timeout has occured.
56+ template <typename P>
57+ void RunUntil (std::function<bool (Expected<P>)> callback,
58+ std::chrono::milliseconds timeout = std::chrono::seconds(1 )) {
4559 auto handle = transport->RegisterReadObject <P>(
4660 loop, [&](MainLoopBase &loop, llvm::Expected<P> message) {
47- callback (std::move (message));
48- loop.RequestTermination ();
61+ bool keep_going = callback (std::move (message));
62+ if (!keep_going)
63+ loop.RequestTermination ();
4964 });
5065 loop.AddCallback (
5166 [&](MainLoopBase &loop) {
5267 loop.RequestTermination ();
53- FAIL () << " timeout waiting for read callback " ;
68+ callback ( createStringError ( " timeout" )) ;
5469 },
5570 timeout);
56- ASSERT_THAT_EXPECTED (handle, Succeeded ());
57- ASSERT_THAT_ERROR (loop.Run ().takeError (), Succeeded ());
71+ EXPECT_THAT_EXPECTED (handle, Succeeded ());
72+ EXPECT_THAT_ERROR (loop.Run ().takeError (), Succeeded ());
5873 }
5974};
6075
@@ -89,10 +104,8 @@ TEST_F(HTTPDelimitedJSONTransportTest, MalformedRequests) {
89104 ASSERT_THAT_EXPECTED (
90105 input.Write (malformed_header.data (), malformed_header.size ()),
91106 Succeeded ());
92- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
93- ASSERT_THAT_EXPECTED (message,
94- FailedWithMessage (" invalid content length: -1" ));
95- });
107+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
108+ FailedWithMessage (" invalid content length: -1" ));
96109}
97110
98111TEST_F (HTTPDelimitedJSONTransportTest, Read) {
@@ -103,8 +116,32 @@ TEST_F(HTTPDelimitedJSONTransportTest, Read) {
103116 .str ();
104117 ASSERT_THAT_EXPECTED (input.Write (message.data (), message.size ()),
105118 Succeeded ());
106- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
107- ASSERT_THAT_EXPECTED (message, HasValue (testing::FieldsAre (/* str=*/ " foo" )));
119+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
120+ HasValue (testing::FieldsAre (/* str=*/ " foo" )));
121+ }
122+
123+ TEST_F (HTTPDelimitedJSONTransportTest, ReadMultipleMessages) {
124+ std::string json1 = R"json( {"str": "one"})json" ;
125+ std::string json2 = R"json( {"str": "two"})json" ;
126+ std::string message = formatv (" Content-Length: {0}\r\n Content-type: "
127+ " text/json\r\n\r\n {1}Content-Length: "
128+ " {2}\r\n Content-type: text/json\r\n\r\n {3}" ,
129+ json1.size (), json1, json2.size (), json2)
130+ .str ();
131+ ASSERT_THAT_EXPECTED (input.Write (message.data (), message.size ()),
132+ Succeeded ());
133+ unsigned count = 0 ;
134+ RunUntil<JSONTestType>([&](Expected<JSONTestType> message) -> bool {
135+ if (count == 0 ) {
136+ EXPECT_THAT_EXPECTED (message,
137+ HasValue (testing::FieldsAre (/* str=*/ " one" )));
138+ } else if (count == 1 ) {
139+ EXPECT_THAT_EXPECTED (message,
140+ HasValue (testing::FieldsAre (/* str=*/ " two" )));
141+ }
142+
143+ count++;
144+ return count < 2 ;
108145 });
109146}
110147
@@ -115,10 +152,8 @@ TEST_F(HTTPDelimitedJSONTransportTest, ReadAcrossMultipleChunks) {
115152 formatv (" Content-Length: {0}\r\n\r\n {1}" , json.size (), json).str ();
116153 ASSERT_THAT_EXPECTED (input.Write (message.data (), message.size ()),
117154 Succeeded ());
118- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
119- ASSERT_THAT_EXPECTED (message,
120- HasValue (testing::FieldsAre (/* str=*/ long_str)));
121- });
155+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
156+ HasValue (testing::FieldsAre (/* str=*/ long_str)));
122157}
123158
124159TEST_F (HTTPDelimitedJSONTransportTest, ReadPartialMessage) {
@@ -134,16 +169,13 @@ TEST_F(HTTPDelimitedJSONTransportTest, ReadPartialMessage) {
134169 ASSERT_THAT_EXPECTED (input.Write (part2.data (), part2.size ()), Succeeded ());
135170 });
136171
137- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
138- ASSERT_THAT_EXPECTED (message, HasValue (testing::FieldsAre (/* str=*/ " foo" )));
139- });
172+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
173+ HasValue (testing::FieldsAre (/* str=*/ " foo" )));
140174}
141175
142176TEST_F (HTTPDelimitedJSONTransportTest, ReadWithEOF) {
143177 input.CloseWriteFileDescriptor ();
144- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
145- ASSERT_THAT_EXPECTED (message, Failed<TransportEOFError>());
146- });
178+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(), Failed<TransportEOFError>());
147179}
148180
149181TEST_F (HTTPDelimitedJSONTransportTest, ReaderWithUnhandledData) {
@@ -156,9 +188,8 @@ TEST_F(HTTPDelimitedJSONTransportTest, ReaderWithUnhandledData) {
156188 ASSERT_THAT_EXPECTED (input.Write (message.data (), message.size () - 1 ),
157189 Succeeded ());
158190 input.CloseWriteFileDescriptor ();
159- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
160- ASSERT_THAT_EXPECTED (message, Failed<TransportUnhandledContentsError>());
161- });
191+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
192+ Failed<TransportUnhandledContentsError>());
162193}
163194
164195TEST_F (HTTPDelimitedJSONTransportTest, InvalidTransport) {
@@ -184,18 +215,16 @@ TEST_F(JSONRPCTransportTest, MalformedRequests) {
184215 ASSERT_THAT_EXPECTED (
185216 input.Write (malformed_header.data (), malformed_header.size ()),
186217 Succeeded ());
187- RunOnce<JSONTestType>(
188- [&](auto message) { ASSERT_THAT_EXPECTED (message, llvm::Failed ()); });
218+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(), llvm::Failed ());
189219}
190220
191221TEST_F (JSONRPCTransportTest, Read) {
192222 std::string json = R"json( {"str": "foo"})json" ;
193223 std::string message = formatv (" {0}\n " , json).str ();
194224 ASSERT_THAT_EXPECTED (input.Write (message.data (), message.size ()),
195225 Succeeded ());
196- RunOnce<JSONTestType>([&](auto message) {
197- ASSERT_THAT_EXPECTED (message, HasValue (testing::FieldsAre (/* str=*/ " foo" )));
198- });
226+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
227+ HasValue (testing::FieldsAre (/* str=*/ " foo" )));
199228}
200229
201230TEST_F (JSONRPCTransportTest, ReadAcrossMultipleChunks) {
@@ -204,10 +233,8 @@ TEST_F(JSONRPCTransportTest, ReadAcrossMultipleChunks) {
204233 std::string message = formatv (" {0}\n " , json).str ();
205234 ASSERT_THAT_EXPECTED (input.Write (message.data (), message.size ()),
206235 Succeeded ());
207- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
208- ASSERT_THAT_EXPECTED (message,
209- HasValue (testing::FieldsAre (/* str=*/ long_str)));
210- });
236+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
237+ HasValue (testing::FieldsAre (/* str=*/ long_str)));
211238}
212239
213240TEST_F (JSONRPCTransportTest, ReadPartialMessage) {
@@ -222,16 +249,13 @@ TEST_F(JSONRPCTransportTest, ReadPartialMessage) {
222249 ASSERT_THAT_EXPECTED (input.Write (part2.data (), part2.size ()), Succeeded ());
223250 });
224251
225- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
226- ASSERT_THAT_EXPECTED (message, HasValue (testing::FieldsAre (/* str=*/ " foo" )));
227- });
252+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
253+ HasValue (testing::FieldsAre (/* str=*/ " foo" )));
228254}
229255
230256TEST_F (JSONRPCTransportTest, ReadWithEOF) {
231257 input.CloseWriteFileDescriptor ();
232- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
233- ASSERT_THAT_EXPECTED (message, Failed<TransportEOFError>());
234- });
258+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(), Failed<TransportEOFError>());
235259}
236260
237261TEST_F (JSONRPCTransportTest, ReaderWithUnhandledData) {
@@ -241,9 +265,8 @@ TEST_F(JSONRPCTransportTest, ReaderWithUnhandledData) {
241265 ASSERT_THAT_EXPECTED (input.Write (message.data (), message.size () - 1 ),
242266 Succeeded ());
243267 input.CloseWriteFileDescriptor ();
244- RunOnce<JSONTestType>([&](llvm::Expected<JSONTestType> message) {
245- ASSERT_THAT_EXPECTED (message, Failed<TransportUnhandledContentsError>());
246- });
268+ ASSERT_THAT_EXPECTED (RunOnce<JSONTestType>(),
269+ Failed<TransportUnhandledContentsError>());
247270}
248271
249272TEST_F (JSONRPCTransportTest, Write) {
0 commit comments