OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/edk/system/core.h" | 5 #include "mojo/edk/system/core.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
(...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
990 // Should get two distinct, valid handles. | 990 // Should get two distinct, valid handles. |
991 EXPECT_NE(ph, MOJO_HANDLE_INVALID); | 991 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
992 EXPECT_NE(ch, MOJO_HANDLE_INVALID); | 992 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
993 EXPECT_NE(ph, ch); | 993 EXPECT_NE(ph, ch); |
994 | 994 |
995 // Producer should be never-readable, but already writable. | 995 // Producer should be never-readable, but already writable. |
996 hss = kEmptyMojoHandleSignalsState; | 996 hss = kEmptyMojoHandleSignalsState; |
997 EXPECT_EQ( | 997 EXPECT_EQ( |
998 MOJO_RESULT_FAILED_PRECONDITION, | 998 MOJO_RESULT_FAILED_PRECONDITION, |
999 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); | 999 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
1000 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 1000 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1001 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1001 hss.satisfied_signals); |
| 1002 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1003 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1002 hss.satisfiable_signals); | 1004 hss.satisfiable_signals); |
1003 hss = kEmptyMojoHandleSignalsState; | 1005 hss = kEmptyMojoHandleSignalsState; |
1004 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0, | 1006 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0, |
1005 MakeUserPointer(&hss))); | 1007 MakeUserPointer(&hss))); |
1006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 1008 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1007 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1009 hss.satisfied_signals); |
| 1010 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1011 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1008 hss.satisfiable_signals); | 1012 hss.satisfiable_signals); |
1009 | 1013 |
1010 // Consumer should be never-writable, and not yet readable. | 1014 // Consumer should be never-writable, and not yet readable. |
1011 hss = kFullMojoHandleSignalsState; | 1015 hss = kFullMojoHandleSignalsState; |
1012 EXPECT_EQ( | 1016 EXPECT_EQ( |
1013 MOJO_RESULT_FAILED_PRECONDITION, | 1017 MOJO_RESULT_FAILED_PRECONDITION, |
1014 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss))); | 1018 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss))); |
1015 EXPECT_EQ(0u, hss.satisfied_signals); | 1019 EXPECT_EQ(0u, hss.satisfied_signals); |
1016 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1020 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
1017 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1021 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1172 hss = kFullMojoHandleSignalsState; | 1176 hss = kFullMojoHandleSignalsState; |
1173 EXPECT_EQ( | 1177 EXPECT_EQ( |
1174 MOJO_RESULT_FAILED_PRECONDITION, | 1178 MOJO_RESULT_FAILED_PRECONDITION, |
1175 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); | 1179 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
1176 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 1180 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
1177 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 1181 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
1178 | 1182 |
1179 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); | 1183 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
1180 } | 1184 } |
1181 | 1185 |
| 1186 TEST_F(CoreTest, DataPipeSetGetProducerOptions) { |
| 1187 MojoCreateDataPipeOptions options = { |
| 1188 sizeof(MojoCreateDataPipeOptions), // |struct_size|. |
| 1189 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1190 8, // |element_num_bytes|. |
| 1191 800 // |capacity_num_bytes|. |
| 1192 }; |
| 1193 MojoHandle ph, ch; // p is for producer and c is for consumer. |
| 1194 |
| 1195 EXPECT_EQ(MOJO_RESULT_OK, |
| 1196 core()->CreateDataPipe(MakeUserPointer(&options), |
| 1197 MakeUserPointer(&ph), MakeUserPointer(&ch))); |
| 1198 // Should get two distinct, valid handles. |
| 1199 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
| 1200 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
| 1201 EXPECT_NE(ph, ch); |
| 1202 |
| 1203 // Get it. |
| 1204 MojoDataPipeProducerOptions popts = {}; |
| 1205 const uint32_t kPoptsSize = static_cast<uint32_t>(sizeof(popts)); |
| 1206 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions( |
| 1207 ph, MakeUserPointer(&popts), kPoptsSize)); |
| 1208 EXPECT_EQ(kPoptsSize, popts.struct_size); |
| 1209 EXPECT_EQ(0u, popts.write_threshold_num_bytes); |
| 1210 |
| 1211 // Invalid write threshold. |
| 1212 popts.struct_size = kPoptsSize; |
| 1213 popts.write_threshold_num_bytes = 4; |
| 1214 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 1215 core()->SetDataPipeProducerOptions(ph, MakeUserPointer(&popts))); |
| 1216 // The options shouldn't change. |
| 1217 popts = MojoDataPipeProducerOptions(); |
| 1218 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions( |
| 1219 ph, MakeUserPointer(&popts), kPoptsSize)); |
| 1220 EXPECT_EQ(kPoptsSize, popts.struct_size); |
| 1221 EXPECT_EQ(0u, popts.write_threshold_num_bytes); |
| 1222 |
| 1223 // Valid write threshold. |
| 1224 popts.struct_size = kPoptsSize; |
| 1225 popts.write_threshold_num_bytes = 8; |
| 1226 EXPECT_EQ(MOJO_RESULT_OK, |
| 1227 core()->SetDataPipeProducerOptions(ph, MakeUserPointer(&popts))); |
| 1228 popts = MojoDataPipeProducerOptions(); |
| 1229 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions( |
| 1230 ph, MakeUserPointer(&popts), kPoptsSize)); |
| 1231 EXPECT_EQ(kPoptsSize, popts.struct_size); |
| 1232 EXPECT_EQ(8u, popts.write_threshold_num_bytes); |
| 1233 |
| 1234 // Invalid write threshold. |
| 1235 popts.struct_size = kPoptsSize; |
| 1236 popts.write_threshold_num_bytes = 9; |
| 1237 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 1238 core()->SetDataPipeProducerOptions(ph, MakeUserPointer(&popts))); |
| 1239 // The options shouldn't change. |
| 1240 popts = MojoDataPipeProducerOptions(); |
| 1241 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions( |
| 1242 ph, MakeUserPointer(&popts), kPoptsSize)); |
| 1243 EXPECT_EQ(kPoptsSize, popts.struct_size); |
| 1244 EXPECT_EQ(8u, popts.write_threshold_num_bytes); |
| 1245 |
| 1246 // Valid write threshold. |
| 1247 popts.struct_size = kPoptsSize; |
| 1248 popts.write_threshold_num_bytes = 16; |
| 1249 EXPECT_EQ(MOJO_RESULT_OK, |
| 1250 core()->SetDataPipeProducerOptions(ph, MakeUserPointer(&popts))); |
| 1251 popts = MojoDataPipeProducerOptions(); |
| 1252 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions( |
| 1253 ph, MakeUserPointer(&popts), kPoptsSize)); |
| 1254 EXPECT_EQ(kPoptsSize, popts.struct_size); |
| 1255 EXPECT_EQ(16u, popts.write_threshold_num_bytes); |
| 1256 |
| 1257 // Can also set to default by passing null. |
| 1258 EXPECT_EQ(MOJO_RESULT_OK, |
| 1259 core()->SetDataPipeProducerOptions(ph, NullUserPointer())); |
| 1260 popts = MojoDataPipeProducerOptions(); |
| 1261 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions( |
| 1262 ph, MakeUserPointer(&popts), kPoptsSize)); |
| 1263 EXPECT_EQ(kPoptsSize, popts.struct_size); |
| 1264 // Note: Should be reported as 0 ("default"), even if it means the element |
| 1265 // struct_size. |
| 1266 EXPECT_EQ(0u, popts.write_threshold_num_bytes); |
| 1267 |
| 1268 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); |
| 1269 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
| 1270 } |
| 1271 |
1182 TEST_F(CoreTest, DataPipeSetGetConsumerOptions) { | 1272 TEST_F(CoreTest, DataPipeSetGetConsumerOptions) { |
1183 MojoCreateDataPipeOptions options = { | 1273 MojoCreateDataPipeOptions options = { |
1184 sizeof(MojoCreateDataPipeOptions), // |struct_size|. | 1274 sizeof(MojoCreateDataPipeOptions), // |struct_size|. |
1185 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1275 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
1186 8, // |element_num_bytes|. | 1276 8, // |element_num_bytes|. |
1187 800 // |capacity_num_bytes|. | 1277 800 // |capacity_num_bytes|. |
1188 }; | 1278 }; |
1189 MojoHandle ph, ch; // p is for producer and c is for consumer. | 1279 MojoHandle ph, ch; // p is for producer and c is for consumer. |
1190 | 1280 |
1191 EXPECT_EQ(MOJO_RESULT_OK, | 1281 EXPECT_EQ(MOJO_RESULT_OK, |
1192 core()->CreateDataPipe(MakeUserPointer(&options), | 1282 core()->CreateDataPipe(MakeUserPointer(&options), |
1193 MakeUserPointer(&ph), MakeUserPointer(&ch))); | 1283 MakeUserPointer(&ph), MakeUserPointer(&ch))); |
1194 // Should get two distinct, valid handles. | 1284 // Should get two distinct, valid handles. |
1195 EXPECT_NE(ph, MOJO_HANDLE_INVALID); | 1285 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
1196 EXPECT_NE(ch, MOJO_HANDLE_INVALID); | 1286 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
1197 EXPECT_NE(ph, ch); | 1287 EXPECT_NE(ph, ch); |
1198 | 1288 |
1199 // Read it. | 1289 // Get it. |
1200 MojoDataPipeConsumerOptions copts = {}; | 1290 MojoDataPipeConsumerOptions copts = {}; |
1201 const uint32_t kCoptsSize = static_cast<uint32_t>(sizeof(copts)); | 1291 const uint32_t kCoptsSize = static_cast<uint32_t>(sizeof(copts)); |
1202 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions( | 1292 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions( |
1203 ch, MakeUserPointer(&copts), kCoptsSize)); | 1293 ch, MakeUserPointer(&copts), kCoptsSize)); |
1204 EXPECT_EQ(kCoptsSize, copts.struct_size); | 1294 EXPECT_EQ(kCoptsSize, copts.struct_size); |
1205 EXPECT_EQ(0u, copts.read_threshold_num_bytes); | 1295 EXPECT_EQ(0u, copts.read_threshold_num_bytes); |
1206 | 1296 |
1207 // Invalid read threshold. | 1297 // Invalid read threshold. |
1208 copts.struct_size = kCoptsSize; | 1298 copts.struct_size = kCoptsSize; |
1209 copts.read_threshold_num_bytes = 4; | 1299 copts.read_threshold_num_bytes = 4; |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1543 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result); | 1633 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result); |
1544 | 1634 |
1545 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 1635 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
1546 } | 1636 } |
1547 | 1637 |
1548 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. | 1638 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. |
1549 | 1639 |
1550 } // namespace | 1640 } // namespace |
1551 } // namespace system | 1641 } // namespace system |
1552 } // namespace mojo | 1642 } // namespace mojo |
OLD | NEW |