"Port" DataPipeWriteThreshold to SystemImplTest. This is just like 0e03266c97428aa635dcbb53f83c134dd3c96588, but for producers instead of consumers. R=vardhan@google.com BUG=#442 Review URL: https://codereview.chromium.org/1888643002 .
diff --git a/mojo/public/platform/native/system_impl_private_unittest.cc b/mojo/public/platform/native/system_impl_private_unittest.cc index f54b5e3..871d055 100644 --- a/mojo/public/platform/native/system_impl_private_unittest.cc +++ b/mojo/public/platform/native/system_impl_private_unittest.cc
@@ -269,8 +269,155 @@ // 2 SystemImpls are leaked... } -// TODO(vtl): Once thunks are in: -// TEST(SystemImplTest, DataPipeWriteThreshold) { ... } +TEST(SystemImplTest, DataPipeWriteThreshold) { + MojoSystemImpl sys0 = MojoSystemImplCreateImpl(); + MojoSystemImpl sys1 = MojoSystemImplCreateImpl(); + EXPECT_NE(sys0, sys1); + + const MojoCreateDataPipeOptions options = { + static_cast<uint32_t>( + sizeof(MojoCreateDataPipeOptions)), // |struct_size|. + MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. + 2u, // |element_num_bytes|. + 4u // |capacity_num_bytes|. + }; + MojoHandle hp = MOJO_HANDLE_INVALID; + MojoHandle hc = MOJO_HANDLE_INVALID; + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplCreateDataPipe(sys0, &options, &hp, &hc)); + EXPECT_NE(hp, MOJO_HANDLE_INVALID); + EXPECT_NE(hc, MOJO_HANDLE_INVALID); + EXPECT_NE(hc, hp); + + // Move the other end of the pipe to a different SystemImpl. + EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplTransferHandle(sys0, hc, sys1, &hc)); + EXPECT_NE(hc, MOJO_HANDLE_INVALID); + + MojoDataPipeProducerOptions popts; + static const uint32_t kPoptsSize = static_cast<uint32_t>(sizeof(popts)); + + // Check the current write threshold; should be the default. + memset(&popts, 255, kPoptsSize); + EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetDataPipeProducerOptions( + sys0, hp, &popts, kPoptsSize)); + EXPECT_EQ(kPoptsSize, popts.struct_size); + EXPECT_EQ(0u, popts.write_threshold_num_bytes); + + // Should already have the write threshold signal. + MojoHandleSignalsState state = {}; + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplWait(sys0, hp, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, + &state)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, + state.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | + MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, + state.satisfiable_signals); + + // Try setting the write threshold to something invalid. + popts.struct_size = kPoptsSize; + popts.write_threshold_num_bytes = 1u; + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, + MojoSystemImplSetDataPipeProducerOptions(sys0, hp, &popts)); + // It shouldn't change the options. + memset(&popts, 255, kPoptsSize); + EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetDataPipeProducerOptions( + sys0, hp, &popts, kPoptsSize)); + EXPECT_EQ(kPoptsSize, popts.struct_size); + EXPECT_EQ(0u, popts.write_threshold_num_bytes); + + // Write an element. + static const uint16_t kTestElem = 12345u; + uint32_t num_bytes = 2u; + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplWriteData(sys0, hp, &kTestElem, &num_bytes, + MOJO_WRITE_MESSAGE_FLAG_NONE)); + EXPECT_EQ(2u, num_bytes); + + // Should still have the write threshold signal. + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplWait(sys0, hp, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, + nullptr)); + + // Write another element. + static const uint16_t kAnotherTestElem = 12345u; + num_bytes = 2u; + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplWriteData(sys0, hp, &kAnotherTestElem, &num_bytes, + MOJO_WRITE_MESSAGE_FLAG_NONE)); + EXPECT_EQ(2u, num_bytes); + + // Should no longer have the write threshold signal. + state = MojoHandleSignalsState(); + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, + MojoSystemImplWait(sys0, hp, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, + &state)); + EXPECT_EQ(0u, state.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | + MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, + state.satisfiable_signals); + + // Set the write threshold to 2 (one element). + popts.struct_size = kPoptsSize; + popts.write_threshold_num_bytes = 2u; + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplSetDataPipeProducerOptions(sys0, hp, &popts)); + // It should actually change the options. + memset(&popts, 255, kPoptsSize); + EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplGetDataPipeProducerOptions( + sys0, hp, &popts, kPoptsSize)); + EXPECT_EQ(kPoptsSize, popts.struct_size); + EXPECT_EQ(2u, popts.write_threshold_num_bytes); + + // Should still not have the write threshold signal. + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, + MojoSystemImplWait(sys0, hp, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, + nullptr)); + + // Read an element. + uint16_t read_elem = 0u; + num_bytes = 2u; + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplReadData(sys1, hc, &read_elem, &num_bytes, + MOJO_READ_DATA_FLAG_NONE)); + EXPECT_EQ(2u, num_bytes); + EXPECT_EQ(kTestElem, read_elem); + + // Should get the write threshold signal now. + state = MojoHandleSignalsState(); + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplWait(sys0, hp, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, + 1000, &state)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, + state.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | + MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, + state.satisfiable_signals); + + // Set the write threshold to 4 (two elements). + popts.struct_size = kPoptsSize; + popts.write_threshold_num_bytes = 4u; + EXPECT_EQ(MOJO_RESULT_OK, + MojoSystemImplSetDataPipeProducerOptions(sys0, hp, &popts)); + + // Should again not have the write threshold signal. + EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, + MojoSystemImplWait(sys0, hp, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, + nullptr)); + + // Close the consumer. + EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplClose(sys1, hc)); + + // The write threshold signal should now be unsatisfiable. + state = MojoHandleSignalsState(); + EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, + MojoSystemImplWait(sys0, hp, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, + &state)); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals); + EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals); + + EXPECT_EQ(MOJO_RESULT_OK, MojoSystemImplClose(sys0, hp)); +} TEST(SystemImplTest, DataPipeReadThreshold) { MojoSystemImpl sys0 = MojoSystemImplCreateImpl();