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

Side by Side Diff: mojo/edk/system/message_pipe_dispatcher_unittest.cc

Issue 2075353002: Plumb the handle signals state out of Waiter::Wait(). (Closed) Base URL: https://github.com/domokit/mojo.git@work795_wait_set_4.3-x-work794_wait_set_4.2
Patch Set: Created 4 years, 6 months 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
OLDNEW
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 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a 5 // NOTE(vtl): Some of these tests are inherently flaky (e.g., if run on a
6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to 6 // heavily-loaded system). Sorry. |test::EpsilonTimeout()| may be increased to
7 // increase tolerance and reduce observed flakiness (though doing so reduces the 7 // increase tolerance and reduce observed flakiness (though doing so reduces the
8 // meaningfulness of the test). 8 // meaningfulness of the test).
9 9
10 #include "mojo/edk/system/message_pipe_dispatcher.h" 10 #include "mojo/edk/system/message_pipe_dispatcher.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 // Add a readable waiter to |d0|, then make it readable (by writing to 74 // Add a readable waiter to |d0|, then make it readable (by writing to
75 // |d1|), then wait. 75 // |d1|), then wait.
76 w.Init(); 76 w.Init();
77 ASSERT_EQ(MOJO_RESULT_OK, 77 ASSERT_EQ(MOJO_RESULT_OK,
78 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); 78 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr));
79 buffer[0] = 123456789; 79 buffer[0] = 123456789;
80 EXPECT_EQ(MOJO_RESULT_OK, 80 EXPECT_EQ(MOJO_RESULT_OK,
81 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize, 81 d1->WriteMessage(UserPointer<const void>(buffer), kBufferSize,
82 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 82 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
83 stopwatch.Start(); 83 stopwatch.Start();
84 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 84 EXPECT_EQ(MOJO_RESULT_OK,
85 w.Wait(MOJO_DEADLINE_INDEFINITE, &context, nullptr));
85 EXPECT_EQ(1u, context); 86 EXPECT_EQ(1u, context);
86 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 87 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
87 hss = HandleSignalsState(); 88 hss = HandleSignalsState();
88 d0->RemoveAwakable(&w, &hss); 89 d0->RemoveAwakable(&w, &hss);
89 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 90 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
90 hss.satisfied_signals); 91 hss.satisfied_signals);
91 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 92 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
92 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 93 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
93 hss.satisfiable_signals); 94 hss.satisfiable_signals);
94 95
(...skipping 17 matching lines...) Expand all
112 MakeUserPointer(&buffer_size), 0, nullptr, 113 MakeUserPointer(&buffer_size), 0, nullptr,
113 MOJO_READ_MESSAGE_FLAG_NONE)); 114 MOJO_READ_MESSAGE_FLAG_NONE));
114 EXPECT_EQ(kBufferSize, buffer_size); 115 EXPECT_EQ(kBufferSize, buffer_size);
115 EXPECT_EQ(123456789, buffer[0]); 116 EXPECT_EQ(123456789, buffer[0]);
116 117
117 // Wait for zero time for readability on |d0| (will time out). 118 // Wait for zero time for readability on |d0| (will time out).
118 w.Init(); 119 w.Init();
119 ASSERT_EQ(MOJO_RESULT_OK, 120 ASSERT_EQ(MOJO_RESULT_OK,
120 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); 121 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr));
121 stopwatch.Start(); 122 stopwatch.Start();
122 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); 123 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr, nullptr));
123 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout()); 124 EXPECT_LT(stopwatch.Elapsed(), test::EpsilonTimeout());
124 hss = HandleSignalsState(); 125 hss = HandleSignalsState();
125 d0->RemoveAwakable(&w, &hss); 126 d0->RemoveAwakable(&w, &hss);
126 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 127 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
127 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 128 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
128 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 129 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
129 hss.satisfiable_signals); 130 hss.satisfiable_signals);
130 131
131 // Wait for non-zero, finite time for readability on |d0| (will time out). 132 // Wait for non-zero, finite time for readability on |d0| (will time out).
132 w.Init(); 133 w.Init();
133 ASSERT_EQ(MOJO_RESULT_OK, 134 ASSERT_EQ(MOJO_RESULT_OK,
134 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr)); 135 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 3, nullptr));
135 stopwatch.Start(); 136 stopwatch.Start();
136 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 137 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
137 w.Wait(2 * test::EpsilonTimeout(), nullptr)); 138 w.Wait(2 * test::EpsilonTimeout(), nullptr, nullptr));
138 MojoDeadline elapsed = stopwatch.Elapsed(); 139 MojoDeadline elapsed = stopwatch.Elapsed();
139 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout()); 140 EXPECT_GT(elapsed, (2 - 1) * test::EpsilonTimeout());
140 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout()); 141 EXPECT_LT(elapsed, (2 + 1) * test::EpsilonTimeout());
141 hss = HandleSignalsState(); 142 hss = HandleSignalsState();
142 d0->RemoveAwakable(&w, &hss); 143 d0->RemoveAwakable(&w, &hss);
143 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 144 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
144 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | 145 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
145 MOJO_HANDLE_SIGNAL_PEER_CLOSED, 146 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
146 hss.satisfiable_signals); 147 hss.satisfiable_signals);
147 148
148 // Check the peer closed signal. 149 // Check the peer closed signal.
149 w.Init(); 150 w.Init();
150 ASSERT_EQ(MOJO_RESULT_OK, 151 ASSERT_EQ(MOJO_RESULT_OK,
151 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr)); 152 d0->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12, nullptr));
152 153
153 // Close the peer. 154 // Close the peer.
154 EXPECT_EQ(MOJO_RESULT_OK, d1->Close()); 155 EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
155 156
156 // It should be signaled. 157 // It should be signaled.
157 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(test::TinyTimeout(), &context)); 158 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(test::TinyTimeout(), &context, nullptr));
158 EXPECT_EQ(12u, context); 159 EXPECT_EQ(12u, context);
159 hss = HandleSignalsState(); 160 hss = HandleSignalsState();
160 d0->RemoveAwakable(&w, &hss); 161 d0->RemoveAwakable(&w, &hss);
161 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 162 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
162 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 163 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
163 164
164 EXPECT_EQ(MOJO_RESULT_OK, d0->Close()); 165 EXPECT_EQ(MOJO_RESULT_OK, d0->Close());
165 } 166 }
166 } 167 }
167 168
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 // Wait for it to be readable. 600 // Wait for it to be readable.
600 w.Init(); 601 w.Init();
601 hss = HandleSignalsState(); 602 hss = HandleSignalsState();
602 result = read_dispatcher_->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, 603 result = read_dispatcher_->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0,
603 &hss); 604 &hss);
604 EXPECT_TRUE(result == MOJO_RESULT_OK || 605 EXPECT_TRUE(result == MOJO_RESULT_OK ||
605 result == MOJO_RESULT_ALREADY_EXISTS) 606 result == MOJO_RESULT_ALREADY_EXISTS)
606 << "result: " << result; 607 << "result: " << result;
607 if (result == MOJO_RESULT_OK) { 608 if (result == MOJO_RESULT_OK) {
608 // Actually need to wait. 609 // Actually need to wait.
609 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); 610 EXPECT_EQ(MOJO_RESULT_OK,
611 w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr, nullptr));
610 read_dispatcher_->RemoveAwakable(&w, &hss); 612 read_dispatcher_->RemoveAwakable(&w, &hss);
611 } 613 }
612 // We may not actually be readable, since we're racing with other threads. 614 // We may not actually be readable, since we're racing with other threads.
613 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 615 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
614 616
615 // Now, try to do the read. 617 // Now, try to do the read.
616 // Clear the buffer so that we can check the result. 618 // Clear the buffer so that we can check the result.
617 memset(buffer, 0, sizeof(buffer)); 619 memset(buffer, 0, sizeof(buffer));
618 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); 620 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
619 result = read_dispatcher_->ReadMessage( 621 result = read_dispatcher_->ReadMessage(
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 EXPECT_EQ(total_messages_written, total_messages_read); 724 EXPECT_EQ(total_messages_written, total_messages_read);
723 EXPECT_EQ(total_bytes_written, total_bytes_read); 725 EXPECT_EQ(total_bytes_written, total_bytes_read);
724 726
725 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close()); 727 EXPECT_EQ(MOJO_RESULT_OK, d_write->Close());
726 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close()); 728 EXPECT_EQ(MOJO_RESULT_OK, d_read->Close());
727 } 729 }
728 730
729 } // namespace 731 } // namespace
730 } // namespace system 732 } // namespace system
731 } // namespace mojo 733 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698