Provide a default implementation of QuicClock and QuicConnectionHelperInterface.

PiperOrigin-RevId: 456835160
diff --git a/build/source_list.bzl b/build/source_list.bzl
index 4d1ff62..4f58c6a 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -287,6 +287,8 @@
     "quic/core/quic_data_reader.h",
     "quic/core/quic_data_writer.h",
     "quic/core/quic_datagram_queue.h",
+    "quic/core/quic_default_clock.h",
+    "quic/core/quic_default_connection_helper.h",
     "quic/core/quic_dispatcher.h",
     "quic/core/quic_error_codes.h",
     "quic/core/quic_flags_list.h",
@@ -613,6 +615,7 @@
     "quic/core/quic_data_reader.cc",
     "quic/core/quic_data_writer.cc",
     "quic/core/quic_datagram_queue.cc",
+    "quic/core/quic_default_clock.cc",
     "quic/core/quic_dispatcher.cc",
     "quic/core/quic_error_codes.cc",
     "quic/core/quic_flow_controller.cc",
diff --git a/build/source_list.gni b/build/source_list.gni
index 8658d49..5cf7491 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -287,6 +287,8 @@
     "src/quiche/quic/core/quic_data_reader.h",
     "src/quiche/quic/core/quic_data_writer.h",
     "src/quiche/quic/core/quic_datagram_queue.h",
+    "src/quiche/quic/core/quic_default_clock.h",
+    "src/quiche/quic/core/quic_default_connection_helper.h",
     "src/quiche/quic/core/quic_dispatcher.h",
     "src/quiche/quic/core/quic_error_codes.h",
     "src/quiche/quic/core/quic_flags_list.h",
@@ -613,6 +615,7 @@
     "src/quiche/quic/core/quic_data_reader.cc",
     "src/quiche/quic/core/quic_data_writer.cc",
     "src/quiche/quic/core/quic_datagram_queue.cc",
+    "src/quiche/quic/core/quic_default_clock.cc",
     "src/quiche/quic/core/quic_dispatcher.cc",
     "src/quiche/quic/core/quic_error_codes.cc",
     "src/quiche/quic/core/quic_flow_controller.cc",
diff --git a/build/source_list.json b/build/source_list.json
index cca88cb..0334858 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -286,6 +286,8 @@
     "quiche/quic/core/quic_data_reader.h",
     "quiche/quic/core/quic_data_writer.h",
     "quiche/quic/core/quic_datagram_queue.h",
+    "quiche/quic/core/quic_default_clock.h",
+    "quiche/quic/core/quic_default_connection_helper.h",
     "quiche/quic/core/quic_dispatcher.h",
     "quiche/quic/core/quic_error_codes.h",
     "quiche/quic/core/quic_flags_list.h",
@@ -612,6 +614,7 @@
     "quiche/quic/core/quic_data_reader.cc",
     "quiche/quic/core/quic_data_writer.cc",
     "quiche/quic/core/quic_datagram_queue.cc",
+    "quiche/quic/core/quic_default_clock.cc",
     "quiche/quic/core/quic_dispatcher.cc",
     "quiche/quic/core/quic_error_codes.cc",
     "quiche/quic/core/quic_flow_controller.cc",
diff --git a/quiche/quic/core/quic_default_clock.cc b/quiche/quic/core/quic_default_clock.cc
new file mode 100644
index 0000000..1418efb
--- /dev/null
+++ b/quiche/quic/core/quic_default_clock.cc
@@ -0,0 +1,31 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "quiche/quic/core/quic_default_clock.h"
+
+#include "absl/time/clock.h"
+
+namespace quic {
+
+QuicDefaultClock* QuicDefaultClock::Get() {
+  static QuicDefaultClock* clock = new QuicDefaultClock();
+  return clock;
+}
+
+QuicTime QuicDefaultClock::ApproximateNow() const { return Now(); }
+
+QuicTime QuicDefaultClock::Now() const {
+  return CreateTimeFromMicroseconds(absl::GetCurrentTimeNanos() / 1000);
+}
+
+QuicWallTime QuicDefaultClock::WallNow() const {
+  return QuicWallTime::FromUNIXMicroseconds(absl::GetCurrentTimeNanos() / 1000);
+}
+
+QuicTime QuicDefaultClock::ConvertWallTimeToQuicTime(
+    const QuicWallTime& walltime) const {
+  return CreateTimeFromMicroseconds(walltime.ToUNIXMicroseconds());
+}
+
+}  // namespace quic
diff --git a/quiche/quic/core/quic_default_clock.h b/quiche/quic/core/quic_default_clock.h
new file mode 100644
index 0000000..96fec75
--- /dev/null
+++ b/quiche/quic/core/quic_default_clock.h
@@ -0,0 +1,34 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef QUICHE_QUIC_CORE_QUIC_DEFAULT_CLOCK_H_
+#define QUICHE_QUIC_CORE_QUIC_DEFAULT_CLOCK_H_
+
+#include "quiche/quic/core/quic_clock.h"
+#include "quiche/quic/core/quic_time.h"
+#include "quiche/quic/platform/api/quic_export.h"
+
+namespace quic {
+
+// A QuicClock based on Abseil time API.  Thread-safe.
+class QUIC_EXPORT_PRIVATE QuicDefaultClock : public QuicClock {
+ public:
+  // Provides a single default stateless instance of QuicDefaultClock.
+  static QuicDefaultClock* Get();
+
+  explicit QuicDefaultClock() = default;
+  QuicDefaultClock(const QuicDefaultClock&) = delete;
+  QuicDefaultClock& operator=(const QuicDefaultClock&) = delete;
+
+  // QuicClock implementation.
+  QuicTime ApproximateNow() const override;
+  QuicTime Now() const override;
+  QuicWallTime WallNow() const override;
+  QuicTime ConvertWallTimeToQuicTime(
+      const QuicWallTime& walltime) const override;
+};
+
+}  // namespace quic
+
+#endif  // QUICHE_QUIC_CORE_QUIC_DEFAULT_CLOCK_H_
diff --git a/quiche/quic/core/quic_default_connection_helper.h b/quiche/quic/core/quic_default_connection_helper.h
new file mode 100644
index 0000000..3a10b43
--- /dev/null
+++ b/quiche/quic/core/quic_default_connection_helper.h
@@ -0,0 +1,49 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef QUICHE_QUIC_CORE_QUIC_DEFAULT_CONNECTION_HELPER_H_
+#define QUICHE_QUIC_CORE_QUIC_DEFAULT_CONNECTION_HELPER_H_
+
+#include "quiche/quic/core/crypto/quic_random.h"
+#include "quiche/quic/core/quic_connection.h"
+#include "quiche/quic/core/quic_default_clock.h"
+#include "quiche/common/simple_buffer_allocator.h"
+
+namespace quic {
+
+// A default implementation of QuicConnectionHelperInterface.  Thread-safe.
+class QUIC_EXPORT_PRIVATE QuicDefaultConnectionHelper
+    : public QuicConnectionHelperInterface {
+ public:
+  static QuicDefaultConnectionHelper* Get() {
+    static QuicDefaultConnectionHelper* helper =
+        new QuicDefaultConnectionHelper();
+    return helper;
+  }
+
+  // Creates a helper that uses the default allocator.
+  QuicDefaultConnectionHelper() : QuicDefaultConnectionHelper(nullptr) {}
+  // If |allocator| is nullptr, the default one is used.
+  QuicDefaultConnectionHelper(
+      std::unique_ptr<quiche::QuicheBufferAllocator> allocator)
+      : allocator_(std::move(allocator)) {}
+
+  QuicDefaultConnectionHelper(const QuicDefaultConnectionHelper&) = delete;
+  QuicDefaultConnectionHelper& operator=(const QuicDefaultConnectionHelper&) =
+      delete;
+
+  const QuicClock* GetClock() const override { return QuicDefaultClock::Get(); }
+  QuicRandom* GetRandomGenerator() override {
+    return QuicRandom::GetInstance();
+  }
+  quiche::QuicheBufferAllocator* GetStreamSendBufferAllocator() override {
+    return allocator_ ? allocator_.get() : quiche::SimpleBufferAllocator::Get();
+  }
+
+ private:
+  std::unique_ptr<quiche::QuicheBufferAllocator> allocator_;
+};
+}  // namespace quic
+
+#endif  // QUICHE_QUIC_CORE_QUIC_DEFAULT_CONNECTION_HELPER_H_