message: Send Initial after PTO and Retry
  This test ensures that the client properly resets its PTO timer when
  receiving a Retry.
diff: @@ -411,6 +411,37 @@ fn retry_bad_token() {
  assert!(dgram.is_none());
  }
  +// This is really a client test, but we need a server with Retry to test it.
  +// In this test, the client sends Initial on PTO. The Retry should cause
  +// all loss recovery timers to be reset, but we had a bug where the PTO timer
  +// was not properly reset. This tests that the client generates a new Initial
  +// in response to receiving a Retry, even after it sends the Initial on PTO.
  +#[test]
  +fn retry_after_pto() {
  + let mut client = default_client();
  + let mut server = default_server();
  + server.set_retry_required(true);
  + let mut now = now();
  +
  + let ci = client.process(None, now).dgram();
  + assert!(ci.is_some()); // sit on this for a bit.RefCell
  +
  + // Let PTO fire on the client and then let it exhaust its PTO packets.
  + now += Duration::from_secs(1);
  + let pto1 = client.process(None, now).dgram();
  + assert!(pto1.unwrap().len() >= 1200);
  + let pto2 = client.process(None, now).dgram();
  + assert!(pto2.unwrap().len() >= 1200);
  + let cb = client.process(None, now).callback();
  + assert_ne!(cb, Duration::new(0, 0));
  +
  + let retry = server.process(ci, now).dgram();
  + assertions::assert_retry(&retry.as_ref().unwrap());
  +
  + let ci2 = client.process(retry, now).dgram();
  + assert!(ci2.unwrap().len() >= 1200);
  +}
  +
  // Generate an AEAD and header protection object for a client Initial.
  fn client_initial_aead_and_hp(dcid: &[u8]) -> (Aead, HpKey) {
  const INITIAL_SALT: &[u8] = &[
  