Skip to content

Commit 95409c5

Browse files
authored
Deal with even more flaky tests! (#928)
1 parent 328646a commit 95409c5

File tree

5 files changed

+48
-38
lines changed

5 files changed

+48
-38
lines changed

Release/include/cpprest/http_msg.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,9 @@ class _http_request final : public http::details::http_msg_base, public std::ena
878878
http::method m_method;
879879

880880
// Tracks whether or not a response has already been started for this message.
881+
// 0 = No reply sent
882+
// 1 = Usual reply sent
883+
// 2 = Reply aborted by another thread; e.g. server shutdown
881884
pplx::details::atomic_long m_initiated_response;
882885

883886
std::unique_ptr<http::details::_http_server_context> m_server_context;

Release/src/http/listener/http_listener_msg.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ pplx::task<void> details::_http_request::_reply_impl(http_response response)
5858
pplx::task<void> details::_http_request::_reply_if_not_already(status_code status)
5959
{
6060
const long expected = 0;
61-
const long desired = 1;
61+
const long desired = 2;
6262
if (pplx::details::atomic_compare_exchange(m_initiated_response, desired, expected) == expected)
6363
{
6464
return _reply_impl(http_response(status));
@@ -68,11 +68,18 @@ pplx::task<void> details::_http_request::_reply_if_not_already(status_code statu
6868

6969
pplx::task<void> details::_http_request::reply(const http_response &response)
7070
{
71-
if(pplx::details::atomic_increment(m_initiated_response) != 1l)
72-
{
73-
throw http_exception(U("Error: trying to send multiple responses to an HTTP request"));
71+
const long expected = 0;
72+
const long desired = 1;
73+
switch (pplx::details::atomic_compare_exchange(m_initiated_response, desired, expected)) {
74+
case 0:
75+
return _reply_impl(response); // success
76+
case 1:
77+
throw http_exception(U("Error: trying to send multiple responses to an HTTP request"));
78+
case 2:
79+
return pplx::task_from_result(); // already handled
80+
default:
81+
abort();
7482
}
75-
return _reply_impl(response);
7683
}
7784

7885
}} // namespace web::http

Release/tests/functional/http/client/building_request_tests.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ TEST_FIXTURE(uri_address, body_types)
113113
p_request->reply(200);
114114
});
115115
http_asserts::assert_response_equals(client.request(msg).get(), status_codes::OK);
116-
116+
117117
// string - no content type.
118118
msg = http_request(method);
119119
msg.set_body(std::move(str_move_body));
@@ -143,7 +143,7 @@ TEST(set_body_string_with_charset)
143143
{
144144
http_request request;
145145
VERIFY_THROWS(request.set_body(
146-
::utility::conversions::to_utf16string("body_data"),
146+
::utility::conversions::to_utf16string("body_data"),
147147
::utility::conversions::to_utf16string("text/plain;charset=utf-16")), std::invalid_argument);
148148
}
149149

@@ -236,7 +236,7 @@ TEST_FIXTURE(uri_address, set_body_with_charset)
236236
http_request msg(methods::PUT);
237237
msg.set_body("datadatadata", "text/plain;charset=us-ascii");
238238
VERIFY_THROWS(msg.set_body(
239-
::utility::conversions::to_utf16string("datadatadata"),
239+
::utility::conversions::to_utf16string("datadatadata"),
240240
::utility::conversions::to_utf16string("text/plain;charset=us-ascii")), std::invalid_argument);
241241
}
242242

@@ -321,4 +321,4 @@ TEST_FIXTURE(uri_address, reuse_request)
321321

322322
}
323323

324-
}}}}
324+
}}}}

Release/tests/functional/http/client/compression_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1108,7 +1108,7 @@ SUITE(compression_tests)
11081108
}
11091109
else
11101110
{
1111-
memcpy(vv.data(), v.data(), v.size());
1111+
std::copy(v.begin(), v.end(), vv.begin());
11121112
got = v.size();
11131113
}
11141114
VERIFY_ARE_EQUAL(buffer_size, got);

Release/tests/functional/http/client/progress_handler_tests.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ TEST_FIXTURE(uri_address, set_progress_handler_no_bodies)
3737

3838
http_request msg(mtd);
3939
msg.set_progress_handler(
40-
[&](message_direction::direction direction, utility::size64_t so_far)
41-
{
40+
[&](message_direction::direction direction, utility::size64_t so_far)
41+
{
4242
calls += 1;
43-
if (direction == message_direction::upload)
44-
upsize = so_far;
45-
else
46-
downsize = so_far;
43+
if (direction == message_direction::upload)
44+
upsize = so_far;
45+
else
46+
downsize = so_far;
4747
});
4848

4949
test_http_server::scoped_server scoped(m_uri);
@@ -123,19 +123,19 @@ TEST_FIXTURE(uri_address, set_progress_handler_download)
123123

124124
http_client client(m_uri, config);
125125
const method mtd = methods::GET;
126-
126+
127127
utility::size64_t upsize = 4711u, downsize = 4711u;
128128
int calls = 0;
129129

130130
http_request msg(mtd);
131131
msg.set_progress_handler(
132-
[&](message_direction::direction direction, utility::size64_t so_far)
133-
{
132+
[&](message_direction::direction direction, utility::size64_t so_far)
133+
{
134134
calls += 1;
135-
if (direction == message_direction::upload)
136-
upsize = so_far;
137-
else
138-
downsize = so_far;
135+
if (direction == message_direction::upload)
136+
upsize = so_far;
137+
else
138+
downsize = so_far;
139139
});
140140

141141
const size_t repeats = 6000;
@@ -179,19 +179,19 @@ TEST_FIXTURE(uri_address, set_progress_handler_upload_and_download)
179179
const size_t repeats = 5500;
180180
for (size_t i = 0; i < repeats; ++i)
181181
data.append(U("abcdefghihklmnopqrstuvwxyz"));
182-
182+
183183
utility::size64_t upsize = 4711u, downsize = 4711u;
184184
int calls = 0;
185185

186186
http_request msg(mtd);
187187
msg.set_progress_handler(
188-
[&](message_direction::direction direction, utility::size64_t so_far)
189-
{
188+
[&](message_direction::direction direction, utility::size64_t so_far)
189+
{
190190
calls += 1;
191-
if (direction == message_direction::upload)
192-
upsize = so_far;
193-
else
194-
downsize = so_far;
191+
if (direction == message_direction::upload)
192+
upsize = so_far;
193+
else
194+
downsize = so_far;
195195
});
196196

197197
msg.set_body(data);
@@ -274,27 +274,27 @@ TEST_FIXTURE(uri_address, set_progress_handler_request_timeout)
274274
const size_t repeats = 5500;
275275
for (size_t i = 0; i < repeats; ++i)
276276
data.append(U("abcdefghihklmnopqrstuvwxyz"));
277-
277+
278278
utility::size64_t upsize = 4711u, downsize = 4711u;
279279
int calls = 0;
280280

281281
http_request msg(mtd);
282282
// We should never see this handler called for download, but for upload should still happen, since
283283
// there's a server (just not a very responsive one) and we're sending data to it.
284284
msg.set_progress_handler(
285-
[&](message_direction::direction direction, utility::size64_t so_far)
286-
{
285+
[&](message_direction::direction direction, utility::size64_t so_far)
286+
{
287287
calls += 1;
288-
if (direction == message_direction::upload)
289-
upsize = so_far;
290-
else
291-
downsize = so_far;
288+
if (direction == message_direction::upload)
289+
upsize = so_far;
290+
else
291+
downsize = so_far;
292292
});
293293

294294
msg.set_body(data);
295295
auto t = scoped.server()->next_request();
296296
auto response = client.request(msg);
297-
297+
298298
#ifdef __APPLE__
299299
// CodePlex 295
300300
VERIFY_THROWS(response.get(), http_exception);

0 commit comments

Comments
 (0)