| OLD | NEW |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 // MACH_SEND_INVALID_DEST, and the client will not expect a reply. | 51 // MACH_SEND_INVALID_DEST, and the client will not expect a reply. |
| 52 kReplyPortDead, | 52 kReplyPortDead, |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 Options() | 55 Options() |
| 56 : expect_server_interface_method_called(true), | 56 : expect_server_interface_method_called(true), |
| 57 parent_wait_for_child_pipe(false), | 57 parent_wait_for_child_pipe(false), |
| 58 server_options(MACH_MSG_OPTION_NONE), | 58 server_options(MACH_MSG_OPTION_NONE), |
| 59 server_persistent(MachMessageServer::kOneShot), | 59 server_persistent(MachMessageServer::kOneShot), |
| 60 server_nonblocking(MachMessageServer::kBlocking), | 60 server_nonblocking(MachMessageServer::kBlocking), |
| 61 server_receive_large(MachMessageServer::kReceiveLargeError), |
| 61 server_timeout_ms(MACH_MSG_TIMEOUT_NONE), | 62 server_timeout_ms(MACH_MSG_TIMEOUT_NONE), |
| 62 server_mig_retcode(KERN_SUCCESS), | 63 server_mig_retcode(KERN_SUCCESS), |
| 63 server_destroy_complex(true), | 64 server_destroy_complex(true), |
| 64 expect_server_destroyed_complex(true), | 65 expect_server_destroyed_complex(true), |
| 65 expect_server_result(KERN_SUCCESS), | 66 expect_server_result(KERN_SUCCESS), |
| 66 expect_server_transaction_count(1), | 67 expect_server_transaction_count(1), |
| 67 child_wait_for_parent_pipe_early(false), | 68 child_wait_for_parent_pipe_early(false), |
| 68 client_send_request_count(1), | 69 client_send_request_count(1), |
| 69 client_send_complex(false), | 70 client_send_complex(false), |
| 70 client_send_large(false), | 71 client_send_large(false), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 86 | 87 |
| 87 // Options to pass to MachMessageServer::Run() as the |options| parameter. | 88 // Options to pass to MachMessageServer::Run() as the |options| parameter. |
| 88 mach_msg_options_t server_options; | 89 mach_msg_options_t server_options; |
| 89 | 90 |
| 90 // Whether the server should run in one-shot or persistent mode. | 91 // Whether the server should run in one-shot or persistent mode. |
| 91 MachMessageServer::Persistent server_persistent; | 92 MachMessageServer::Persistent server_persistent; |
| 92 | 93 |
| 93 // Whether the server should run in blocking or nonblocking mode. | 94 // Whether the server should run in blocking or nonblocking mode. |
| 94 MachMessageServer::Nonblocking server_nonblocking; | 95 MachMessageServer::Nonblocking server_nonblocking; |
| 95 | 96 |
| 97 // The strategy for handling large messages. |
| 98 MachMessageServer::ReceiveLarge server_receive_large; |
| 99 |
| 96 // The server’s timeout. | 100 // The server’s timeout. |
| 97 mach_msg_timeout_t server_timeout_ms; | 101 mach_msg_timeout_t server_timeout_ms; |
| 98 | 102 |
| 99 // The return code that the server returns to the client via the | 103 // The return code that the server returns to the client via the |
| 100 // mig_reply_error_t::RetCode field. A client would normally see this as | 104 // mig_reply_error_t::RetCode field. A client would normally see this as |
| 101 // a Mach RPC return value. | 105 // a Mach RPC return value. |
| 102 kern_return_t server_mig_retcode; | 106 kern_return_t server_mig_retcode; |
| 103 | 107 |
| 104 // The value that the server function should set its destroy_complex_request | 108 // The value that the server function should set its destroy_complex_request |
| 105 // parameter to. This is true if resources sent in complex request messages | 109 // parameter to. This is true if resources sent in complex request messages |
| (...skipping 21 matching lines...) Expand all Loading... |
| 127 bool child_wait_for_parent_pipe_early; | 131 bool child_wait_for_parent_pipe_early; |
| 128 | 132 |
| 129 // The number of requests that the client should send to the server. | 133 // The number of requests that the client should send to the server. |
| 130 size_t client_send_request_count; | 134 size_t client_send_request_count; |
| 131 | 135 |
| 132 // true if the client should send a complex message, one that carries a port | 136 // true if the client should send a complex message, one that carries a port |
| 133 // descriptor in its body. Normally false. | 137 // descriptor in its body. Normally false. |
| 134 bool client_send_complex; | 138 bool client_send_complex; |
| 135 | 139 |
| 136 // true if the client should send a larger message than the server has | 140 // true if the client should send a larger message than the server has |
| 137 // allocated space to receive. If server_options contains MACH_RCV_LARGE, | 141 // allocated space to receive. The server’s response is directed by |
| 138 // the server will resize its buffer to receive the message. Otherwise, the | 142 // server_receive_large. |
| 139 // message will be destroyed and the server will return MACH_RCV_TOO_LARGE. | |
| 140 bool client_send_large; | 143 bool client_send_large; |
| 141 | 144 |
| 142 // The type of reply port that the client should provide in its request’s | 145 // The type of reply port that the client should provide in its request’s |
| 143 // mach_msg_header_t::msgh_local_port, which will appear to the server as | 146 // mach_msg_header_t::msgh_local_port, which will appear to the server as |
| 144 // mach_msg_header_t::msgh_remote_port. | 147 // mach_msg_header_t::msgh_remote_port. |
| 145 ReplyPortType client_reply_port_type; | 148 ReplyPortType client_reply_port_type; |
| 146 | 149 |
| 147 // true if the client should wait for a reply from the server. For | 150 // true if the client should wait for a reply from the server. For |
| 148 // non-normal reply ports or requests which the server responds to with no | 151 // non-normal reply ports or requests which the server responds to with no |
| 149 // reply (MIG_NO_REPLY), the server will either not send a reply or not | 152 // reply (MIG_NO_REPLY), the server will either not send a reply or not |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 CheckedReadFD(ReadPipeFD(), &c, 1); | 338 CheckedReadFD(ReadPipeFD(), &c, 1); |
| 336 EXPECT_EQ('\0', c); | 339 EXPECT_EQ('\0', c); |
| 337 } | 340 } |
| 338 | 341 |
| 339 ASSERT_EQ(options_.expect_server_result, | 342 ASSERT_EQ(options_.expect_server_result, |
| 340 (kr = MachMessageServer::Run(this, | 343 (kr = MachMessageServer::Run(this, |
| 341 local_port, | 344 local_port, |
| 342 options_.server_options, | 345 options_.server_options, |
| 343 options_.server_persistent, | 346 options_.server_persistent, |
| 344 options_.server_nonblocking, | 347 options_.server_nonblocking, |
| 348 options_.server_receive_large, |
| 345 options_.server_timeout_ms))) | 349 options_.server_timeout_ms))) |
| 346 << MachErrorMessage(kr, "MachMessageServer"); | 350 << MachErrorMessage(kr, "MachMessageServer"); |
| 347 | 351 |
| 348 if (options_.client_send_complex) { | 352 if (options_.client_send_complex) { |
| 349 EXPECT_NE(kMachPortNull, parent_complex_message_port_); | 353 EXPECT_NE(kMachPortNull, parent_complex_message_port_); |
| 350 mach_port_type_t type; | 354 mach_port_type_t type; |
| 351 | 355 |
| 352 if (!options_.expect_server_destroyed_complex) { | 356 if (!options_.expect_server_destroyed_complex) { |
| 353 // MachMessageServer should not have destroyed the resources sent in the | 357 // MachMessageServer should not have destroyed the resources sent in the |
| 354 // complex request message. | 358 // complex request message. |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 options.server_mig_retcode = MIG_NO_REPLY; | 799 options.server_mig_retcode = MIG_NO_REPLY; |
| 796 options.server_destroy_complex = false; | 800 options.server_destroy_complex = false; |
| 797 options.expect_server_destroyed_complex = false; | 801 options.expect_server_destroyed_complex = false; |
| 798 options.client_send_complex = true; | 802 options.client_send_complex = true; |
| 799 options.client_expect_reply = false; | 803 options.client_expect_reply = false; |
| 800 options.child_wait_for_parent_pipe_late = true; | 804 options.child_wait_for_parent_pipe_late = true; |
| 801 TestMachMessageServer test_mach_message_server(options); | 805 TestMachMessageServer test_mach_message_server(options); |
| 802 test_mach_message_server.Test(); | 806 test_mach_message_server.Test(); |
| 803 } | 807 } |
| 804 | 808 |
| 805 TEST(MachMessageServer, LargeUnexpected) { | 809 TEST(MachMessageServer, ReceiveLargeError) { |
| 806 // The client sends a request to the server that is larger than the server is | 810 // The client sends a request to the server that is larger than the server is |
| 807 // expecting. The server did not specify MACH_RCV_LARGE in its options, so the | 811 // expecting. server_receive_large is kReceiveLargeError, so the request is |
| 808 // request is destroyed and the server returns a MACH_RCV_TOO_LARGE error. The | 812 // destroyed and the server returns a MACH_RCV_TOO_LARGE error. The client |
| 809 // client does not receive a reply. | 813 // does not receive a reply. |
| 810 TestMachMessageServer::Options options; | 814 TestMachMessageServer::Options options; |
| 811 options.expect_server_result = MACH_RCV_TOO_LARGE; | 815 options.expect_server_result = MACH_RCV_TOO_LARGE; |
| 812 options.expect_server_transaction_count = 0; | 816 options.expect_server_transaction_count = 0; |
| 813 options.client_send_large = true; | 817 options.client_send_large = true; |
| 814 options.client_expect_reply = false; | 818 options.client_expect_reply = false; |
| 815 TestMachMessageServer test_mach_message_server(options); | 819 TestMachMessageServer test_mach_message_server(options); |
| 816 test_mach_message_server.Test(); | 820 test_mach_message_server.Test(); |
| 817 } | 821 } |
| 818 | 822 |
| 819 TEST(MachMessageServer, LargeExpected) { | 823 TEST(MachMessageServer, ReceiveLargeRetry) { |
| 820 // The client sends a request to the server that is larger than the server is | 824 // The client sends a request to the server that is larger than the server is |
| 821 // initially expecting. The server did specify MACH_RCV_LARGE in its options, | 825 // initially expecting. server_receive_large is kReceiveLargeResize, so a new |
| 822 // so a new buffer is allocated to receive the message. The server receives | 826 // buffer is allocated to receive the message. The server receives the large |
| 823 // the large request message, processes it, and returns a reply to the client. | 827 // request message, processes it, and returns a reply to the client. |
| 824 TestMachMessageServer::Options options; | 828 TestMachMessageServer::Options options; |
| 825 options.server_options = MACH_RCV_LARGE; | 829 options.server_receive_large = MachMessageServer::kReceiveLargeResize; |
| 826 options.client_send_large = true; | 830 options.client_send_large = true; |
| 827 TestMachMessageServer test_mach_message_server(options); | 831 TestMachMessageServer test_mach_message_server(options); |
| 828 test_mach_message_server.Test(); | 832 test_mach_message_server.Test(); |
| 829 } | 833 } |
| 834 |
| 835 TEST(MachMessageServer, ReceiveLargeIgnore) { |
| 836 // The client sends a request to the server that is larger than the server is |
| 837 // expecting. server_receive_large is kReceiveLargeIgnore, so the request is |
| 838 // destroyed but the server does not consider this an error. The server is |
| 839 // running in blocking mode with a timeout, and continues to wait for a |
| 840 // message until it times out. The client does not receive a reply. |
| 841 TestMachMessageServer::Options options; |
| 842 options.server_receive_large = MachMessageServer::kReceiveLargeIgnore; |
| 843 options.server_timeout_ms = 10; |
| 844 options.expect_server_result = MACH_RCV_TIMED_OUT; |
| 845 options.expect_server_transaction_count = 0; |
| 846 options.client_send_large = true; |
| 847 options.client_expect_reply = false; |
| 848 TestMachMessageServer test_mach_message_server(options); |
| 849 test_mach_message_server.Test(); |
| 850 } |
| 830 | 851 |
| 831 } // namespace | 852 } // namespace |
| 832 } // namespace test | 853 } // namespace test |
| 833 } // namespace crashpad | 854 } // namespace crashpad |
| OLD | NEW |