Index: util/mach/mach_message_server_test.cc |
diff --git a/util/mach/mach_message_server_test.cc b/util/mach/mach_message_server_test.cc |
index 7cfa9bb42f6be93d0c45714579445cf8ba575e5c..f5ccf42b217724d2c0ac23fb0a61042290012cf8 100644 |
--- a/util/mach/mach_message_server_test.cc |
+++ b/util/mach/mach_message_server_test.cc |
@@ -58,6 +58,7 @@ class TestMachMessageServer : public MachMessageServer::Interface, |
server_options(MACH_MSG_OPTION_NONE), |
server_persistent(MachMessageServer::kOneShot), |
server_nonblocking(MachMessageServer::kBlocking), |
+ server_receive_large(MachMessageServer::kReceiveLargeError), |
server_timeout_ms(MACH_MSG_TIMEOUT_NONE), |
server_mig_retcode(KERN_SUCCESS), |
server_destroy_complex(true), |
@@ -93,6 +94,9 @@ class TestMachMessageServer : public MachMessageServer::Interface, |
// Whether the server should run in blocking or nonblocking mode. |
MachMessageServer::Nonblocking server_nonblocking; |
+ // The strategy for handling large messages. |
+ MachMessageServer::ReceiveLarge server_receive_large; |
+ |
// The server’s timeout. |
mach_msg_timeout_t server_timeout_ms; |
@@ -134,9 +138,8 @@ class TestMachMessageServer : public MachMessageServer::Interface, |
bool client_send_complex; |
// true if the client should send a larger message than the server has |
- // allocated space to receive. If server_options contains MACH_RCV_LARGE, |
- // the server will resize its buffer to receive the message. Otherwise, the |
- // message will be destroyed and the server will return MACH_RCV_TOO_LARGE. |
+ // allocated space to receive. The server’s response is directed by |
+ // server_receive_large. |
bool client_send_large; |
// The type of reply port that the client should provide in its request’s |
@@ -342,6 +345,7 @@ class TestMachMessageServer : public MachMessageServer::Interface, |
options_.server_options, |
options_.server_persistent, |
options_.server_nonblocking, |
+ options_.server_receive_large, |
options_.server_timeout_ms))) |
<< MachErrorMessage(kr, "MachMessageServer"); |
@@ -802,11 +806,11 @@ TEST(MachMessageServer, ComplexNotDestroyedNoReply) { |
test_mach_message_server.Test(); |
} |
-TEST(MachMessageServer, LargeUnexpected) { |
+TEST(MachMessageServer, ReceiveLargeError) { |
// The client sends a request to the server that is larger than the server is |
- // expecting. The server did not specify MACH_RCV_LARGE in its options, so the |
- // request is destroyed and the server returns a MACH_RCV_TOO_LARGE error. The |
- // client does not receive a reply. |
+ // expecting. server_receive_large is kReceiveLargeError, so the request is |
+ // destroyed and the server returns a MACH_RCV_TOO_LARGE error. The client |
+ // does not receive a reply. |
TestMachMessageServer::Options options; |
options.expect_server_result = MACH_RCV_TOO_LARGE; |
options.expect_server_transaction_count = 0; |
@@ -816,14 +820,31 @@ TEST(MachMessageServer, LargeUnexpected) { |
test_mach_message_server.Test(); |
} |
-TEST(MachMessageServer, LargeExpected) { |
+TEST(MachMessageServer, ReceiveLargeRetry) { |
+ // The client sends a request to the server that is larger than the server is |
+ // initially expecting. server_receive_large is kReceiveLargeResize, so a new |
+ // buffer is allocated to receive the message. The server receives the large |
+ // request message, processes it, and returns a reply to the client. |
+ TestMachMessageServer::Options options; |
+ options.server_receive_large = MachMessageServer::kReceiveLargeResize; |
+ options.client_send_large = true; |
+ TestMachMessageServer test_mach_message_server(options); |
+ test_mach_message_server.Test(); |
+} |
+ |
+TEST(MachMessageServer, ReceiveLargeIgnore) { |
// The client sends a request to the server that is larger than the server is |
- // initially expecting. The server did specify MACH_RCV_LARGE in its options, |
- // so a new buffer is allocated to receive the message. The server receives |
- // the large request message, processes it, and returns a reply to the client. |
+ // expecting. server_receive_large is kReceiveLargeIgnore, so the request is |
+ // destroyed but the server does not consider this an error. The server is |
+ // running in blocking mode with a timeout, and continues to wait for a |
+ // message until it times out. The client does not receive a reply. |
TestMachMessageServer::Options options; |
- options.server_options = MACH_RCV_LARGE; |
+ options.server_receive_large = MachMessageServer::kReceiveLargeIgnore; |
+ options.server_timeout_ms = 10; |
+ options.expect_server_result = MACH_RCV_TIMED_OUT; |
+ options.expect_server_transaction_count = 0; |
options.client_send_large = true; |
+ options.client_expect_reply = false; |
TestMachMessageServer test_mach_message_server(options); |
test_mach_message_server.Test(); |
} |