Add negative overflow check to `QuicTimeDelta::TryFromMilliseconds`

This follows up on cl/810503972, which recently added the method. I realized that the definition, which only checked for positive overflow, was incomplete because the input is a signed type.

PiperOrigin-RevId: 810983573
diff --git a/quiche/quic/core/quic_time.h b/quiche/quic/core/quic_time.h
index 990b90c..db913d5 100644
--- a/quiche/quic/core/quic_time.h
+++ b/quiche/quic/core/quic_time.h
@@ -57,7 +57,8 @@
   // the conversion would overflow.
   static constexpr std::optional<QuicTimeDelta> TryFromMilliseconds(
       int64_t ms) {
-    if (ms > std::numeric_limits<int64_t>::max() / 1000) {
+    if (ms > std::numeric_limits<int64_t>::max() / 1000 ||
+        ms < std::numeric_limits<int64_t>::min() / 1000) {
       return std::nullopt;
     }
     return QuicTimeDelta(ms * 1000);
diff --git a/quiche/quic/core/quic_time_test.cc b/quiche/quic/core/quic_time_test.cc
index 0f6d7d6..6877603 100644
--- a/quiche/quic/core/quic_time_test.cc
+++ b/quiche/quic/core/quic_time_test.cc
@@ -51,12 +51,12 @@
 }
 
 TEST_F(QuicTimeDeltaTest, TryFromMilliseconds) {
-  static constexpr int64_t kMaxNumMilliseconds{
-      std::numeric_limits<int64_t>::max() / 1000};
-
   EXPECT_EQ(QuicTime::Delta::TryFromMilliseconds(0), QuicTime::Delta::Zero());
   EXPECT_EQ(QuicTime::Delta::TryFromMilliseconds(2000),
             QuicTime::Delta::FromMicroseconds(2000 * 1000));
+
+  static constexpr int64_t kMaxNumMilliseconds{
+      std::numeric_limits<int64_t>::max() / 1000};
   EXPECT_THAT(
       QuicTime::Delta::TryFromMilliseconds(kMaxNumMilliseconds),
       Optional(AllOf(Property(&QuicTime::Delta::ToMicroseconds,
@@ -67,6 +67,19 @@
   // Internal conversion to microseconds would overflow `int64_t`.
   EXPECT_EQ(QuicTime::Delta::TryFromMilliseconds(kMaxNumMilliseconds + 1),
             std::nullopt);
+
+  static constexpr int64_t kMinNumMilliseconds{
+      std::numeric_limits<int64_t>::min() / 1000};
+  EXPECT_THAT(
+      QuicTime::Delta::TryFromMilliseconds(kMinNumMilliseconds),
+      Optional(AllOf(Property(&QuicTime::Delta::ToMicroseconds,
+                              kMinNumMilliseconds * 1000),
+                     // `QuicTimeDelta::TryFromMilliseconds()` will never return
+                     // an infinite duration.
+                     Property(&QuicTime::Delta::IsInfinite, IsFalse()))));
+  // Internal conversion to microseconds would overflow `int64_t`.
+  EXPECT_EQ(QuicTime::Delta::TryFromMilliseconds(kMinNumMilliseconds - 1),
+            std::nullopt);
 }
 
 TEST_F(QuicTimeDeltaTest, Add) {