Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Side by Side Diff: util/mach/child_port_server_test.cc

Issue 755313004: Pass Mach message trailers to server handler functions (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Address review feedback Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « util/mach/child_port_server.cc ('k') | util/mach/exc_client_variants_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 30 matching lines...) Expand all
41 // The definition of the request structure from child_port.h isn’t available 41 // The definition of the request structure from child_port.h isn’t available
42 // here. It needs custom initialization code, so duplicate the expected 42 // here. It needs custom initialization code, so duplicate the expected
43 // definition of the structure from child_port.h here in this file, and provide 43 // definition of the structure from child_port.h here in this file, and provide
44 // the initialization code as a method in true object-oriented fashion. 44 // the initialization code as a method in true object-oriented fashion.
45 45
46 struct __attribute__((packed, aligned(4))) ChildPortCheckInRequest { 46 struct __attribute__((packed, aligned(4))) ChildPortCheckInRequest {
47 ChildPortCheckInRequest() { 47 ChildPortCheckInRequest() {
48 memset(this, 0xa5, sizeof(*this)); 48 memset(this, 0xa5, sizeof(*this));
49 Head.msgh_bits = 49 Head.msgh_bits =
50 MACH_MSGH_BITS(0, MACH_MSG_TYPE_PORT_SEND) | MACH_MSGH_BITS_COMPLEX; 50 MACH_MSGH_BITS(0, MACH_MSG_TYPE_PORT_SEND) | MACH_MSGH_BITS_COMPLEX;
51 Head.msgh_size = sizeof(*this); 51 Head.msgh_size = sizeof(*this) - sizeof(trailer);
52 Head.msgh_remote_port = MACH_PORT_NULL; 52 Head.msgh_remote_port = MACH_PORT_NULL;
53 Head.msgh_local_port = kServerLocalPort; 53 Head.msgh_local_port = kServerLocalPort;
54 Head.msgh_id = 10011; 54 Head.msgh_id = 10011;
55 msgh_body.msgh_descriptor_count = 1; 55 msgh_body.msgh_descriptor_count = 1;
56 port.name = kCheckInPort; 56 port.name = kCheckInPort;
57 port.disposition = kCheckInPortRightType; 57 port.disposition = kCheckInPortRightType;
58 port.type = MACH_MSG_PORT_DESCRIPTOR; 58 port.type = MACH_MSG_PORT_DESCRIPTOR;
59 NDR = NDR_record; 59 NDR = NDR_record;
60 token = kCheckInToken; 60 token = kCheckInToken;
61 } 61 }
62 62
63 mach_msg_header_t Head; 63 mach_msg_header_t Head;
64 mach_msg_body_t msgh_body; 64 mach_msg_body_t msgh_body;
65 mach_msg_port_descriptor_t port; 65 mach_msg_port_descriptor_t port;
66 NDR_record_t NDR; 66 NDR_record_t NDR;
67 child_port_token_t token; 67 child_port_token_t token;
68 mach_msg_trailer_t trailer;
68 }; 69 };
69 70
70 struct MIGReply : public mig_reply_error_t { 71 struct MIGReply : public mig_reply_error_t {
71 MIGReply() { 72 MIGReply() {
72 memset(this, 0x5a, sizeof(*this)); 73 memset(this, 0x5a, sizeof(*this));
73 RetCode = KERN_FAILURE; 74 RetCode = KERN_FAILURE;
74 } 75 }
75 76
76 void Verify() { 77 void Verify() {
77 EXPECT_EQ(implicit_cast<mach_msg_bits_t>(MACH_MSGH_BITS(0, 0)), 78 EXPECT_EQ(implicit_cast<mach_msg_bits_t>(MACH_MSGH_BITS(0, 0)),
78 Head.msgh_bits); 79 Head.msgh_bits);
79 EXPECT_EQ(sizeof(*this), Head.msgh_size); 80 EXPECT_EQ(sizeof(*this), Head.msgh_size);
80 EXPECT_EQ(kMachPortNull, Head.msgh_remote_port); 81 EXPECT_EQ(kMachPortNull, Head.msgh_remote_port);
81 EXPECT_EQ(kMachPortNull, Head.msgh_local_port); 82 EXPECT_EQ(kMachPortNull, Head.msgh_local_port);
82 EXPECT_EQ(10111, Head.msgh_id); 83 EXPECT_EQ(10111, Head.msgh_id);
83 EXPECT_EQ(0, memcmp(&NDR, &NDR_record, sizeof(NDR))); 84 EXPECT_EQ(0, memcmp(&NDR, &NDR_record, sizeof(NDR)));
84 EXPECT_EQ(MIG_NO_REPLY, RetCode); 85 EXPECT_EQ(MIG_NO_REPLY, RetCode);
85 } 86 }
86 }; 87 };
87 88
88 class MockChildPortServerInterface : public ChildPortServer::Interface { 89 class MockChildPortServerInterface : public ChildPortServer::Interface {
89 public: 90 public:
90 MOCK_METHOD5(HandleChildPortCheckIn, 91 MOCK_METHOD6(HandleChildPortCheckIn,
91 kern_return_t(child_port_server_t server, 92 kern_return_t(child_port_server_t server,
92 const child_port_token_t token, 93 const child_port_token_t token,
93 mach_port_t port, 94 mach_port_t port,
94 mach_msg_type_name_t right_type, 95 mach_msg_type_name_t right_type,
96 const mach_msg_trailer_t* trailer,
95 bool* destroy_complex_request)); 97 bool* destroy_complex_request));
96 }; 98 };
97 99
98 TEST(ChildPortServer, MockChildPortCheckIn) { 100 TEST(ChildPortServer, MockChildPortCheckIn) {
99 MockChildPortServerInterface server_interface; 101 MockChildPortServerInterface server_interface;
100 ChildPortServer server(&server_interface); 102 ChildPortServer server(&server_interface);
101 103
102 ChildPortCheckInRequest request; 104 ChildPortCheckInRequest request;
103 EXPECT_LE(sizeof(request), server.MachMessageServerRequestSize()); 105 EXPECT_LE(request.Head.msgh_size, server.MachMessageServerRequestSize());
104 106
105 MIGReply reply; 107 MIGReply reply;
106 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize()); 108 EXPECT_LE(sizeof(reply), server.MachMessageServerReplySize());
107 109
108 EXPECT_CALL(server_interface, 110 EXPECT_CALL(server_interface,
109 HandleChildPortCheckIn(kServerLocalPort, 111 HandleChildPortCheckIn(kServerLocalPort,
110 kCheckInToken, 112 kCheckInToken,
111 kCheckInPort, 113 kCheckInPort,
112 kCheckInPortRightType, 114 kCheckInPortRightType,
115 Eq(&request.trailer),
113 Pointee(Eq(false)))) 116 Pointee(Eq(false))))
114 .WillOnce(Return(MIG_NO_REPLY)) 117 .WillOnce(Return(MIG_NO_REPLY))
115 .RetiresOnSaturation(); 118 .RetiresOnSaturation();
116 119
117 bool destroy_complex_request = false; 120 bool destroy_complex_request = false;
118 EXPECT_TRUE(server.MachMessageServerFunction( 121 EXPECT_TRUE(server.MachMessageServerFunction(
119 reinterpret_cast<mach_msg_header_t*>(&request), 122 reinterpret_cast<mach_msg_header_t*>(&request),
120 reinterpret_cast<mach_msg_header_t*>(&reply), 123 reinterpret_cast<mach_msg_header_t*>(&reply),
121 &destroy_complex_request)); 124 &destroy_complex_request));
122 EXPECT_FALSE(destroy_complex_request); 125 EXPECT_FALSE(destroy_complex_request);
123 126
124 reply.Verify(); 127 reply.Verify();
125 } 128 }
126 129
127 } // namespace 130 } // namespace
128 } // namespace test 131 } // namespace test
129 } // namespace crashpad 132 } // namespace crashpad
OLDNEW
« no previous file with comments | « util/mach/child_port_server.cc ('k') | util/mach/exc_client_variants_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698