gfe-relnote: Add a quic::test::ServerThread::WaitUntil method and use it in quic end_to_end_test. Test only.
This is another attempt to deflake BadPacketHeaderFlags.
PiperOrigin-RevId: 293642314
Change-Id: I1809b8b56c50df7ef2de60d73ac30e9a4e8b35df
diff --git a/quic/test_tools/server_thread.cc b/quic/test_tools/server_thread.cc
index da412dd..fa7e822 100644
--- a/quic/test_tools/server_thread.cc
+++ b/quic/test_tools/server_thread.cc
@@ -15,6 +15,7 @@
ServerThread::ServerThread(QuicServer* server, const QuicSocketAddress& address)
: QuicThread("server_thread"),
server_(server),
+ clock_(server->epoll_server()),
address_(address),
port_(0),
initialized_(false) {}
@@ -68,6 +69,24 @@
confirmed_.WaitForNotification();
}
+bool ServerThread::WaitUntil(std::function<bool()> termination_predicate,
+ QuicTime::Delta timeout) {
+ const QuicTime deadline = clock_.Now() + timeout;
+ while (clock_.Now() < deadline) {
+ QuicNotification done_checking;
+ bool should_terminate = false;
+ Schedule([&] {
+ should_terminate = termination_predicate();
+ done_checking.Notify();
+ });
+ done_checking.WaitForNotification();
+ if (should_terminate) {
+ return true;
+ }
+ }
+ return false;
+}
+
void ServerThread::Pause() {
DCHECK(!pause_.HasBeenNotified());
pause_.Notify();
diff --git a/quic/test_tools/server_thread.h b/quic/test_tools/server_thread.h
index d430297..eb47496 100644
--- a/quic/test_tools/server_thread.h
+++ b/quic/test_tools/server_thread.h
@@ -39,6 +39,13 @@
// Waits for the handshake to be confirmed for the first session created.
void WaitForCryptoHandshakeConfirmed();
+ // Wait until |termination_predicate| returns true in server thread, or
+ // reached |timeout|. Must be called from an external thread.
+ // Return whether the function returned after |termination_predicate| become
+ // true.
+ bool WaitUntil(std::function<bool()> termination_predicate,
+ QuicTime::Delta timeout);
+
// Pauses execution of the server until Resume() is called. May only be
// called once.
void Pause();
@@ -71,6 +78,7 @@
QuicNotification quit_; // Notified when the server should quit.
std::unique_ptr<QuicServer> server_;
+ QuicEpollClock clock_;
QuicSocketAddress address_;
mutable QuicMutex port_lock_;
int port_ QUIC_GUARDED_BY(port_lock_);