No public description

PiperOrigin-RevId: 981880016
diff --git a/quiche/http2/core/spdy_frame_builder.h b/quiche/http2/core/spdy_frame_builder.h
index 5628753..ee879a4 100644
--- a/quiche/http2/core/spdy_frame_builder.h
+++ b/quiche/http2/core/spdy_frame_builder.h
@@ -135,335 +135,6 @@
   size_t offset_;    // Position at which the latest frame begins.
 };
 
-// Packs the exclusive dependency bit (bit 31) and the 31-bit parent stream ID
-// into a single 32-bit unsigned integer in network wire format for PRIORITY and
-// HEADERS frames.
-inline uint32_t PackStreamDependencyValues(bool exclusive,
-                                           SpdyStreamId parent_stream_id) {
-  uint32_t parent = parent_stream_id & 0x7fffffff;
-  uint32_t e_bit = exclusive ? 0x80000000 : 0;
-  return parent | e_bit;
-}
-
-inline bool SerializeDataFrame(const DataFrame& frame,
-                               SpdyFrameBuilder& builder) {
-  uint8_t flags = frame.flags;
-  if (frame.fin()) {
-    flags |= DATA_FLAG_FIN;
-  }
-  if (frame.padded()) {
-    flags |= DATA_FLAG_PADDED;
-  }
-  size_t payload_len = frame.data.size() +
-                       (frame.padded() ? (1 + frame.padding_payload_len) : 0);
-  if (!builder.BeginNewFrame(SpdyFrameType::DATA, flags, frame.stream_id,
-                             payload_len)) {
-    return false;
-  }
-  if (frame.padded()) {
-    if (!builder.WriteUInt8(frame.padding_payload_len)) {
-      return false;
-    }
-  }
-  if (!builder.WriteBytes(frame.data.data(), frame.data.size())) {
-    return false;
-  }
-  if (frame.padded() && frame.padding_payload_len > 0) {
-    std::string padding(frame.padding_payload_len, 0);
-    if (!builder.WriteBytes(padding.data(), padding.length())) {
-      return false;
-    }
-  }
-  return true;
-}
-
-inline bool SerializeHeadersFrame(const HeadersFrame& frame,
-                                  SpdyFrameBuilder& builder) {
-  uint8_t flags = frame.flags;
-  if (frame.fin()) {
-    flags |= CONTROL_FLAG_FIN;
-  }
-  if (frame.end_headers()) {
-    flags |= HEADERS_FLAG_END_HEADERS;
-  }
-  if (frame.padded()) {
-    flags |= HEADERS_FLAG_PADDED;
-  }
-  if (frame.has_priority) {
-    flags |= HEADERS_FLAG_PRIORITY;
-  }
-  size_t payload_len = frame.hpack_block.size() +
-                       (frame.padded() ? (1 + frame.padding_payload_len) : 0) +
-                       (frame.has_priority ? 5 : 0);
-  if (!builder.BeginNewFrame(SpdyFrameType::HEADERS, flags, frame.stream_id,
-                             payload_len)) {
-    return false;
-  }
-  if (frame.padded()) {
-    if (!builder.WriteUInt8(frame.padding_payload_len)) {
-      return false;
-    }
-  }
-  if (frame.has_priority) {
-    int weight = ClampHttp2Weight(frame.priority.weight);
-    if (!builder.WriteUInt32(PackStreamDependencyValues(
-            frame.priority.exclusive, frame.priority.parent_stream_id))) {
-      return false;
-    }
-    if (!builder.WriteUInt8(static_cast<uint8_t>(weight - 1))) {
-      return false;
-    }
-  }
-  if (!builder.WriteBytes(frame.hpack_block.data(), frame.hpack_block.size())) {
-    return false;
-  }
-  if (frame.padded() && frame.padding_payload_len > 0) {
-    std::string padding(frame.padding_payload_len, 0);
-    if (!builder.WriteBytes(padding.data(), padding.length())) {
-      return false;
-    }
-  }
-  return true;
-}
-
-inline bool SerializePriorityFrame(const PriorityFrame& frame,
-                                   SpdyFrameBuilder& builder) {
-  if (!builder.BeginNewFrame(SpdyFrameType::PRIORITY, 0, frame.stream_id, 5)) {
-    return false;
-  }
-  int weight = ClampHttp2Weight(frame.priority.weight);
-  if (!builder.WriteUInt32(PackStreamDependencyValues(
-          frame.priority.exclusive, frame.priority.parent_stream_id))) {
-    return false;
-  }
-  return builder.WriteUInt8(static_cast<uint8_t>(weight - 1));
-}
-
-inline bool SerializeRstStreamFrame(const RstStreamFrame& frame,
-                                    SpdyFrameBuilder& builder) {
-  if (!builder.BeginNewFrame(SpdyFrameType::RST_STREAM, 0, frame.stream_id,
-                             4)) {
-    return false;
-  }
-  return builder.WriteUInt32(static_cast<uint32_t>(frame.error_code));
-}
-
-inline bool SerializeSettingsFrame(const SettingsFrame& frame,
-                                   SpdyFrameBuilder& builder) {
-  uint8_t flags = frame.is_ack ? SETTINGS_FLAG_ACK : 0;
-  size_t payload_len =
-      frame.is_ack ? 0 : (frame.values.size() * kSettingsOneSettingSize);
-  if (!builder.BeginNewFrame(SpdyFrameType::SETTINGS, flags, 0, payload_len)) {
-    return false;
-  }
-  if (!frame.is_ack) {
-    for (const auto& param : frame.values) {
-      if (!builder.WriteUInt16(param.id) || !builder.WriteUInt32(param.value)) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-inline bool SerializePushPromiseFrame(const PushPromiseFrame& frame,
-                                      SpdyFrameBuilder& builder) {
-  uint8_t flags = frame.flags;
-  if (frame.end_headers()) {
-    flags |= PUSH_PROMISE_FLAG_END_PUSH_PROMISE;
-  }
-  if (frame.padded()) {
-    flags |= PUSH_PROMISE_FLAG_PADDED;
-  }
-  size_t payload_len = 4 + frame.hpack_block.size() +
-                       (frame.padded() ? (1 + frame.padding_payload_len) : 0);
-  if (!builder.BeginNewFrame(SpdyFrameType::PUSH_PROMISE, flags,
-                             frame.stream_id, payload_len)) {
-    return false;
-  }
-  if (frame.padded()) {
-    if (!builder.WriteUInt8(frame.padding_payload_len)) {
-      return false;
-    }
-  }
-  if (!builder.WriteUInt32(frame.promised_stream_id & 0x7fffffff)) {
-    return false;
-  }
-  if (!builder.WriteBytes(frame.hpack_block.data(), frame.hpack_block.size())) {
-    return false;
-  }
-  if (frame.padded() && frame.padding_payload_len > 0) {
-    std::string padding(frame.padding_payload_len, 0);
-    if (!builder.WriteBytes(padding.data(), padding.length())) {
-      return false;
-    }
-  }
-  return true;
-}
-
-inline bool SerializePingFrame(const PingFrame& frame,
-                               SpdyFrameBuilder& builder) {
-  uint8_t flags = frame.is_ack ? PING_FLAG_ACK : 0;
-  if (!builder.BeginNewFrame(SpdyFrameType::PING, flags, 0, 8)) {
-    return false;
-  }
-  return builder.WriteUInt64(frame.opaque_data);
-}
-
-inline bool SerializeGoAwayFrame(const GoAwayFrame& frame,
-                                 SpdyFrameBuilder& builder) {
-  size_t payload_len = 8 + frame.debug_data.size();
-  if (!builder.BeginNewFrame(SpdyFrameType::GOAWAY, 0, 0, payload_len)) {
-    return false;
-  }
-  if (!builder.WriteUInt32(frame.last_good_stream_id & 0x7fffffff)) {
-    return false;
-  }
-  if (!builder.WriteUInt32(static_cast<uint32_t>(frame.error_code))) {
-    return false;
-  }
-  if (!frame.debug_data.empty()) {
-    if (!builder.WriteBytes(frame.debug_data.data(), frame.debug_data.size())) {
-      return false;
-    }
-  }
-  return true;
-}
-
-inline bool SerializeWindowUpdateFrame(const WindowUpdateFrame& frame,
-                                       SpdyFrameBuilder& builder) {
-  if (!builder.BeginNewFrame(SpdyFrameType::WINDOW_UPDATE, 0, frame.stream_id,
-                             4)) {
-    return false;
-  }
-  return builder.WriteUInt32(frame.delta & 0x7fffffff);
-}
-
-inline bool SerializeContinuationFrame(const ContinuationFrame& frame,
-                                       SpdyFrameBuilder& builder) {
-  uint8_t flags = frame.flags;
-  if (frame.end_headers()) {
-    flags |= HEADERS_FLAG_END_HEADERS;
-  }
-  if (!builder.BeginNewFrame(SpdyFrameType::CONTINUATION, flags,
-                             frame.stream_id, frame.hpack_block.size())) {
-    return false;
-  }
-  return builder.WriteBytes(frame.hpack_block.data(), frame.hpack_block.size());
-}
-
-inline bool SerializeAltSvcFrame(const AltSvcFrame& frame,
-                                 SpdyFrameBuilder& builder) {
-  size_t payload_len = 2 + frame.origin.size() + frame.value.size();
-  if (!builder.BeginNewFrame(SpdyFrameType::ALTSVC, 0, frame.stream_id,
-                             payload_len)) {
-    return false;
-  }
-  if (!builder.WriteUInt16(frame.origin.size())) {
-    return false;
-  }
-  if (!builder.WriteBytes(frame.origin.data(), frame.origin.size())) {
-    return false;
-  }
-  return builder.WriteBytes(frame.value.data(), frame.value.size());
-}
-
-inline bool SerializePriorityUpdateFrame(const PriorityUpdateFrame& frame,
-                                         SpdyFrameBuilder& builder) {
-  size_t payload_len = 4 + frame.priority_field_value.size();
-  if (!builder.BeginNewFrame(SpdyFrameType::PRIORITY_UPDATE, 0, 0,
-                             payload_len)) {
-    return false;
-  }
-  if (!builder.WriteUInt32(frame.prioritized_stream_id & 0x7fffffff)) {
-    return false;
-  }
-  return builder.WriteBytes(frame.priority_field_value.data(),
-                            frame.priority_field_value.size());
-}
-
-inline bool SerializeAcceptChFrame(const AcceptChFrame& frame,
-                                   SpdyFrameBuilder& builder) {
-  size_t payload_len = 0;
-  for (size_t i = 0; i < frame.num_entries && i < frame.entries.size(); ++i) {
-    payload_len +=
-        4 + frame.entries[i].origin.size() + frame.entries[i].value.size();
-  }
-  if (!builder.BeginNewFrame(SpdyFrameType::ACCEPT_CH, 0, 0, payload_len)) {
-    return false;
-  }
-  for (size_t i = 0; i < frame.num_entries && i < frame.entries.size(); ++i) {
-    if (!builder.WriteUInt16(frame.entries[i].origin.size()) ||
-        !builder.WriteBytes(frame.entries[i].origin.data(),
-                            frame.entries[i].origin.size()) ||
-        !builder.WriteUInt16(frame.entries[i].value.size()) ||
-        !builder.WriteBytes(frame.entries[i].value.data(),
-                            frame.entries[i].value.size())) {
-      return false;
-    }
-  }
-  return true;
-}
-
-inline bool SerializeUnknownFrame(const UnknownFrame& frame,
-                                  SpdyFrameBuilder& builder) {
-  // Handles other unknown frame types, where the payload is opaque.
-  if (!builder.BeginNewUncheckedFrame(frame.type, frame.flags, frame.stream_id,
-                                      frame.payload.size())) {
-    return false;
-  }
-  return builder.WriteBytes(frame.payload.data(), frame.payload.size());
-}
-
-// Serializes a strongly-typed HTTP/2 frame representation directly into the
-// provided `SpdyFrameBuilder`.
-//
-// This generic template writes HTTP/2 wire-format frames (RFC 9113) without
-// allocating intermediate heap objects. Returns true on success, or false if
-// the buffer cannot accommodate the frame or serialization fails.
-template <Http2FrameConcept T>
-bool SerializeFrame(const T& frame, SpdyFrameBuilder& builder) {
-  if constexpr (std::is_same_v<T, DataFrame>) {
-    return SerializeDataFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, HeadersFrame>) {
-    return SerializeHeadersFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, PriorityFrame>) {
-    return SerializePriorityFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, RstStreamFrame>) {
-    return SerializeRstStreamFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, SettingsFrame>) {
-    return SerializeSettingsFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, PushPromiseFrame>) {
-    return SerializePushPromiseFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, PingFrame>) {
-    return SerializePingFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, GoAwayFrame>) {
-    return SerializeGoAwayFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, WindowUpdateFrame>) {
-    return SerializeWindowUpdateFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, ContinuationFrame>) {
-    return SerializeContinuationFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, AltSvcFrame>) {
-    return SerializeAltSvcFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, PriorityUpdateFrame>) {
-    return SerializePriorityUpdateFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, AcceptChFrame>) {
-    return SerializeAcceptChFrame(frame, builder);
-  } else if constexpr (std::is_same_v<T, UnknownFrame>) {
-    return SerializeUnknownFrame(frame, builder);
-  }
-  return false;
-}
-
-// Serializes a unified `SpdyFrame` variant (containing any standard-layout
-// HTTP/2 frame type) into the provided `SpdyFrameBuilder` using `std::visit`.
-// Returns true on success, or false if serialization fails.
-inline bool SerializeSpdyFrame(const SpdyFrame& frame,
-                               SpdyFrameBuilder& builder) {
-  return std::visit(
-      [&builder](const auto& f) { return SerializeFrame(f, builder); }, frame);
-}
-
 }  // namespace spdy
 
 #endif  // QUICHE_HTTP2_CORE_SPDY_FRAME_BUILDER_H_
diff --git a/quiche/http2/core/spdy_framer.cc b/quiche/http2/core/spdy_framer.cc
index 699eb96..9f400c4 100644
--- a/quiche/http2/core/spdy_framer.cc
+++ b/quiche/http2/core/spdy_framer.cc
@@ -27,6 +27,17 @@
 
 namespace {
 
+// Pack parent stream ID and exclusive flag into the format used by HTTP/2
+// headers and priority frames.
+uint32_t PackStreamDependencyValues(bool exclusive,
+                                    SpdyStreamId parent_stream_id) {
+  // Make sure the highest-order bit in the parent stream id is zeroed out.
+  uint32_t parent = parent_stream_id & 0x7fffffff;
+  // Set the one-bit exclusivity flag.
+  uint32_t e_bit = exclusive ? 0x80000000 : 0;
+  return parent | e_bit;
+}
+
 // Used to indicate no flags in a HTTP2 flags field.
 const uint8_t kNoFlags = 0;
 
diff --git a/quiche/http2/core/spdy_protocol.h b/quiche/http2/core/spdy_protocol.h
index 8ee1af2..a5ec174 100644
--- a/quiche/http2/core/spdy_protocol.h
+++ b/quiche/http2/core/spdy_protocol.h
@@ -9,8 +9,6 @@
 #ifndef QUICHE_HTTP2_CORE_SPDY_PROTOCOL_H_
 #define QUICHE_HTTP2_CORE_SPDY_PROTOCOL_H_
 
-#include <array>
-#include <concepts>
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
@@ -19,12 +17,10 @@
 #include <memory>
 #include <optional>
 #include <string>
-#include <type_traits>
 #include <utility>
 #include <variant>
 #include <vector>
 
-#include "absl/container/inlined_vector.h"
 #include "absl/strings/string_view.h"
 #include "quiche/http2/core/spdy_alt_svc_wire_format.h"
 #include "quiche/http2/core/spdy_bitmasks.h"
@@ -451,367 +447,6 @@
 
 typedef StreamPrecedence<SpdyStreamId> SpdyStreamPrecedence;
 
-// =============================================================================
-// Value-Semantic POD Frame Structs
-// =============================================================================
-
-// Contains the fields specific to any priority-conveying frames.
-struct QUICHE_EXPORT PriorityFields {
-  SpdyStreamId parent_stream_id = 0;
-  uint16_t weight = kHttp2DefaultStreamWeight;
-  bool exclusive = false;
-  constexpr bool operator==(const PriorityFields&) const = default;
-};
-
-// A container for a single SETTINGS field.
-struct QUICHE_EXPORT SettingParameter {
-  SpdySettingsId id = 0;
-  uint32_t value = 0;
-  constexpr bool operator==(const SettingParameter&) const = default;
-};
-
-// A container for a single ACCEPT_CH entry.
-struct QUICHE_EXPORT AcceptChEntryView {
-  absl::string_view origin;
-  absl::string_view value;
-  constexpr bool operator==(const AcceptChEntryView&) const = default;
-};
-
-struct QUICHE_EXPORT DataFrame {
-  SpdyStreamId stream_id = 0;
-  uint8_t flags = 0;
-  uint8_t padding_payload_len = 0;
-  absl::string_view data;
-
-  constexpr bool HasFin() const { return (flags & DATA_FLAG_FIN) != 0; }
-  ABSL_DEPRECATED("Use HasFin() instead.") constexpr bool fin() const {
-    return HasFin();
-  }
-  constexpr bool IsPadded() const {
-    return (flags & DATA_FLAG_PADDED) != 0 || padding_payload_len > 0;
-  }
-  ABSL_DEPRECATED("Use IsPadded() instead.") constexpr bool padded() const {
-    return IsPadded();
-  }
-  constexpr bool operator==(const DataFrame&) const = default;
-};
-static_assert(sizeof(DataFrame) == (sizeof(void*) == 8 ? 24 : 16));
-
-struct QUICHE_EXPORT HeadersFrame {
-  SpdyStreamId stream_id = 0;
-  uint8_t flags = 0;
-  uint8_t padding_payload_len = 0;
-  bool has_priority = false;
-  PriorityFields priority{};
-  absl::string_view hpack_block;
-
-  constexpr bool HasFin() const { return (flags & CONTROL_FLAG_FIN) != 0; }
-  ABSL_DEPRECATED("Use HasFin() instead.") constexpr bool fin() const {
-    return HasFin();
-  }
-  constexpr bool HasEndHeaders() const {
-    return (flags & HEADERS_FLAG_END_HEADERS) != 0;
-  }
-  ABSL_DEPRECATED("Use HasEndHeaders() instead.")
-  constexpr bool end_headers() const { return HasEndHeaders(); }
-  constexpr bool IsPadded() const {
-    return (flags & HEADERS_FLAG_PADDED) != 0 || padding_payload_len > 0;
-  }
-  ABSL_DEPRECATED("Use IsPadded() instead.") constexpr bool padded() const {
-    return IsPadded();
-  }
-  constexpr bool operator==(const HeadersFrame&) const = default;
-};
-static_assert(sizeof(HeadersFrame) == (sizeof(void*) == 8 ? 32 : 24));
-
-struct QUICHE_EXPORT PriorityFrame {
-  SpdyStreamId stream_id = 0;
-  PriorityFields priority{};
-  constexpr bool operator==(const PriorityFrame&) const = default;
-};
-static_assert(sizeof(PriorityFrame) == 12);
-
-struct QUICHE_EXPORT RstStreamFrame {
-  SpdyStreamId stream_id = 0;
-  SpdyErrorCode error_code = ERROR_CODE_NO_ERROR;
-  constexpr bool operator==(const RstStreamFrame&) const = default;
-};
-static_assert(sizeof(RstStreamFrame) == 8);
-
-struct QUICHE_EXPORT SettingsFrame {
-  static constexpr size_t kMaxInlineSettings = 5;
-  bool is_ack = false;
-  absl::InlinedVector<SettingParameter, kMaxInlineSettings> values;
-  bool operator==(const SettingsFrame&) const = default;
-};
-static_assert(sizeof(SettingsFrame) == (sizeof(void*) == 8 ? 56 : 48));
-
-struct QUICHE_EXPORT PushPromiseFrame {
-  SpdyStreamId stream_id = 0;
-  SpdyStreamId promised_stream_id = 0;
-  uint8_t flags = 0;
-  uint8_t padding_payload_len = 0;
-  absl::string_view hpack_block;
-
-  constexpr bool HasEndHeaders() const {
-    return (flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE) != 0;
-  }
-  ABSL_DEPRECATED("Use HasEndHeaders() instead.")
-  constexpr bool end_headers() const { return HasEndHeaders(); }
-  constexpr bool IsPadded() const {
-    return (flags & PUSH_PROMISE_FLAG_PADDED) != 0 || padding_payload_len > 0;
-  }
-  ABSL_DEPRECATED("Use IsPadded() instead.") constexpr bool padded() const {
-    return IsPadded();
-  }
-  constexpr bool operator==(const PushPromiseFrame&) const = default;
-};
-static_assert(sizeof(PushPromiseFrame) == (sizeof(void*) == 8 ? 32 : 20));
-
-struct QUICHE_EXPORT PingFrame {
-  uint64_t opaque_data = 0;
-  bool is_ack = false;
-  constexpr bool operator==(const PingFrame&) const = default;
-};
-static_assert(sizeof(PingFrame) == 16);
-
-struct QUICHE_EXPORT GoAwayFrame {
-  SpdyStreamId last_good_stream_id = 0;
-  SpdyErrorCode error_code = ERROR_CODE_NO_ERROR;
-  absl::string_view debug_data;
-  constexpr bool operator==(const GoAwayFrame&) const = default;
-};
-static_assert(sizeof(GoAwayFrame) == (sizeof(void*) == 8 ? 24 : 16));
-
-struct QUICHE_EXPORT WindowUpdateFrame {
-  SpdyStreamId stream_id = 0;
-  uint32_t delta = 0;
-  constexpr bool operator==(const WindowUpdateFrame&) const = default;
-};
-static_assert(sizeof(WindowUpdateFrame) == 8);
-
-struct QUICHE_EXPORT ContinuationFrame {
-  SpdyStreamId stream_id = 0;
-  uint8_t flags = 0;
-  absl::string_view hpack_block;
-
-  constexpr bool HasEndHeaders() const {
-    return (flags & HEADERS_FLAG_END_HEADERS) != 0;
-  }
-  ABSL_DEPRECATED("Use HasEndHeaders() instead.")
-  constexpr bool end_headers() const { return HasEndHeaders(); }
-  constexpr bool operator==(const ContinuationFrame&) const = default;
-};
-static_assert(sizeof(ContinuationFrame) == (sizeof(void*) == 8 ? 24 : 16));
-
-struct QUICHE_EXPORT AltSvcFrame {
-  SpdyStreamId stream_id = 0;
-  absl::string_view origin;
-  absl::string_view value;
-  constexpr bool operator==(const AltSvcFrame&) const = default;
-};
-static_assert(sizeof(AltSvcFrame) == (sizeof(void*) == 8 ? 40 : 20));
-
-struct QUICHE_EXPORT PriorityUpdateFrame {
-  SpdyStreamId prioritized_stream_id = 0;
-  absl::string_view priority_field_value;
-  constexpr bool operator==(const PriorityUpdateFrame&) const = default;
-};
-static_assert(sizeof(PriorityUpdateFrame) == (sizeof(void*) == 8 ? 24 : 12));
-
-struct QUICHE_EXPORT AcceptChFrame {
-  static constexpr size_t kMaxInlineEntries = 1;
-  uint8_t num_entries = 0;
-  std::array<AcceptChEntryView, kMaxInlineEntries> entries{};
-  constexpr bool operator==(const AcceptChFrame&) const = default;
-};
-static_assert(sizeof(AcceptChFrame) == (sizeof(void*) == 8 ? 40 : 20));
-
-struct QUICHE_EXPORT UnknownFrame {
-  SpdyStreamId stream_id = 0;
-  uint8_t type = 0;
-  uint8_t flags = 0;
-  absl::string_view payload;
-  constexpr bool operator==(const UnknownFrame&) const = default;
-};
-static_assert(sizeof(UnknownFrame) == (sizeof(void*) == 8 ? 24 : 16));
-
-// Compile-Time Type Traits
-template <typename T>
-struct FrameTraits;
-
-#define REGISTER_FRAME_TRAITS(Type, EnumVal, HasStreamId, HasFin, HasPadding, \
-                              IsFixed, FixedSize, ConsumesFC)                 \
-  template <>                                                                 \
-  struct FrameTraits<Type> {                                                  \
-    static constexpr SpdyFrameType frame_type = EnumVal;                      \
-    static constexpr bool has_stream_id = HasStreamId;                        \
-    static constexpr bool has_fin = HasFin;                                   \
-    static constexpr bool has_padding = HasPadding;                           \
-    static constexpr bool is_fixed_size = IsFixed;                            \
-    static constexpr size_t fixed_payload_size = FixedSize;                   \
-    static constexpr bool consumes_flow_control = ConsumesFC;                 \
-  };
-
-REGISTER_FRAME_TRAITS(DataFrame, SpdyFrameType::DATA, true, true, true, false,
-                      0, true)
-REGISTER_FRAME_TRAITS(HeadersFrame, SpdyFrameType::HEADERS, true, true, true,
-                      false, 0, false)
-REGISTER_FRAME_TRAITS(PriorityFrame, SpdyFrameType::PRIORITY, true, false,
-                      false, true, 5, false)
-REGISTER_FRAME_TRAITS(RstStreamFrame, SpdyFrameType::RST_STREAM, true, false,
-                      false, true, 4, false)
-REGISTER_FRAME_TRAITS(SettingsFrame, SpdyFrameType::SETTINGS, false, false,
-                      false, false, 0, false)
-REGISTER_FRAME_TRAITS(PushPromiseFrame, SpdyFrameType::PUSH_PROMISE, true,
-                      false, true, false, 0, false)
-REGISTER_FRAME_TRAITS(PingFrame, SpdyFrameType::PING, false, false, false, true,
-                      8, false)
-REGISTER_FRAME_TRAITS(GoAwayFrame, SpdyFrameType::GOAWAY, false, false, false,
-                      false, 0, false)
-REGISTER_FRAME_TRAITS(WindowUpdateFrame, SpdyFrameType::WINDOW_UPDATE, true,
-                      false, false, true, 4, false)
-REGISTER_FRAME_TRAITS(ContinuationFrame, SpdyFrameType::CONTINUATION, true,
-                      false, false, false, 0, false)
-REGISTER_FRAME_TRAITS(AltSvcFrame, SpdyFrameType::ALTSVC, true, false, false,
-                      false, 0, false)
-REGISTER_FRAME_TRAITS(PriorityUpdateFrame, SpdyFrameType::PRIORITY_UPDATE,
-                      false, false, false, false, 0, false)
-REGISTER_FRAME_TRAITS(AcceptChFrame, SpdyFrameType::ACCEPT_CH, false, false,
-                      false, false, 0, false)
-REGISTER_FRAME_TRAITS(UnknownFrame, SpdyFrameType::DATA, true, false, false,
-                      false, 0, false)
-
-#undef REGISTER_FRAME_TRAITS
-
-template <typename T>
-inline constexpr SpdyFrameType frame_type_v = FrameTraits<T>::frame_type;
-
-template <typename T>
-inline constexpr bool is_fixed_size_v = FrameTraits<T>::is_fixed_size;
-
-template <typename T>
-inline constexpr bool has_stream_id_v = FrameTraits<T>::has_stream_id;
-
-template <typename T>
-inline constexpr bool has_fin_v = FrameTraits<T>::has_fin;
-
-template <typename T>
-inline constexpr bool has_padding_v = FrameTraits<T>::has_padding;
-
-template <typename T>
-inline constexpr bool consumes_flow_control_v =
-    FrameTraits<T>::consumes_flow_control;
-
-template <typename T>
-concept Http2FrameConcept = requires {
-  { FrameTraits<T>::frame_type } -> std::convertible_to<SpdyFrameType>;
-  { FrameTraits<T>::is_fixed_size } -> std::convertible_to<bool>;
-  { FrameTraits<T>::has_stream_id } -> std::convertible_to<bool>;
-  { FrameTraits<T>::has_fin } -> std::convertible_to<bool>;
-  { FrameTraits<T>::has_padding } -> std::convertible_to<bool>;
-  { FrameTraits<T>::consumes_flow_control } -> std::convertible_to<bool>;
-};
-
-// Generic Size Calculation
-template <Http2FrameConcept T>
-constexpr size_t FrameSize(const T& frame) {
-  if constexpr (is_fixed_size_v<T>) {
-    return kFrameHeaderSize + FrameTraits<T>::fixed_payload_size;
-  } else if constexpr (std::is_same_v<T, DataFrame>) {
-    return kDataFrameMinimumSize + frame.data.size() +
-           (frame.padded() ? (1 + frame.padding_payload_len) : 0);
-  } else if constexpr (std::is_same_v<T, HeadersFrame>) {
-    size_t size = kHeadersFrameMinimumSize + frame.hpack_block.size();
-    if (frame.padded()) {
-      size += 1 + frame.padding_payload_len;
-    }
-    if (frame.has_priority) {
-      size += 5;
-    }
-    return size;
-  } else if constexpr (std::is_same_v<T, SettingsFrame>) {
-    if (frame.is_ack) {
-      return kSettingsFrameMinimumSize;
-    }
-    return kSettingsFrameMinimumSize +
-           (frame.values.size() * kSettingsOneSettingSize);
-  } else if constexpr (std::is_same_v<T, PushPromiseFrame>) {
-    size_t size = kPushPromiseFrameMinimumSize + frame.hpack_block.size();
-    if (frame.padded()) {
-      size += 1 + frame.padding_payload_len;
-    }
-    return size;
-  } else if constexpr (std::is_same_v<T, GoAwayFrame>) {
-    return kGoawayFrameMinimumSize + frame.debug_data.size();
-  } else if constexpr (std::is_same_v<T, ContinuationFrame>) {
-    return kContinuationFrameMinimumSize + frame.hpack_block.size();
-  } else if constexpr (std::is_same_v<T, AltSvcFrame>) {
-    return kGetAltSvcFrameMinimumSize + frame.origin.size() +
-           frame.value.size();
-  } else if constexpr (std::is_same_v<T, PriorityUpdateFrame>) {
-    return kPriorityUpdateFrameMinimumSize + frame.priority_field_value.size();
-  } else if constexpr (std::is_same_v<T, AcceptChFrame>) {
-    size_t total_size = kAcceptChFrameMinimumSize;
-    for (size_t i = 0; i < frame.num_entries && i < frame.entries.size(); ++i) {
-      total_size += frame.entries[i].origin.size() +
-                    frame.entries[i].value.size() +
-                    kAcceptChFramePerEntryOverhead;
-    }
-    return total_size;
-  } else if constexpr (std::is_same_v<T, UnknownFrame>) {
-    return kFrameHeaderSize + frame.payload.size();
-  } else {
-    return kFrameHeaderSize;
-  }
-}
-
-// Forward declares SpdyFrameBuilder for SerializeFrame.
-class SpdyFrameBuilder;
-
-template <Http2FrameConcept T>
-bool SerializeFrame(const T& frame, SpdyFrameBuilder& builder);
-
-// Unified variant.
-using SpdyFrame =
-    std::variant<DataFrame, HeadersFrame, PriorityFrame, RstStreamFrame,
-                 SettingsFrame, PushPromiseFrame, PingFrame, GoAwayFrame,
-                 WindowUpdateFrame, ContinuationFrame, AltSvcFrame,
-                 PriorityUpdateFrame, AcceptChFrame, UnknownFrame>;
-
-static_assert(sizeof(SpdyFrame) <= 64,
-              "SpdyFrame must fit within a 64-byte cache line");
-
-inline SpdyStreamId GetFrameStreamId(const SpdyFrame& frame) {
-  return std::visit(
-      [](const auto& f) -> SpdyStreamId {
-        using T = std::decay_t<decltype(f)>;
-        if constexpr (has_stream_id_v<T>) {
-          return f.stream_id;
-        }
-        return 0;
-      },
-      frame);
-}
-
-inline SpdyFrameType GetFrameType(const SpdyFrame& frame) {
-  return std::visit(
-      [](const auto& f) -> SpdyFrameType {
-        using T = std::decay_t<decltype(f)>;
-        if constexpr (std::is_same_v<T, UnknownFrame>) {
-          return static_cast<SpdyFrameType>(f.type);
-        }
-        return frame_type_v<T>;
-      },
-      frame);
-}
-
-inline size_t GetFrameSize(const SpdyFrame& frame) {
-  return std::visit([](const auto& f) { return FrameSize(f); }, frame);
-}
-
-bool SerializeSpdyFrame(const SpdyFrame& frame, SpdyFrameBuilder& builder);
-
 class SpdyFrameVisitor;
 
 // Intermediate representation for HTTP2 frames.
diff --git a/quiche/http2/core/spdy_protocol_test.cc b/quiche/http2/core/spdy_protocol_test.cc
index 82100e3..1adef29 100644
--- a/quiche/http2/core/spdy_protocol_test.cc
+++ b/quiche/http2/core/spdy_protocol_test.cc
@@ -6,12 +6,9 @@
 
 #include <iostream>
 #include <string>
-#include <type_traits>
 #include <utility>
 
 #include "absl/strings/string_view.h"
-#include "quiche/http2/core/spdy_frame_builder.h"
-#include "quiche/http2/core/spdy_framer.h"
 #include "quiche/common/platform/api/quiche_expect_bug.h"
 #include "quiche/common/platform/api/quiche_test.h"
 
@@ -285,408 +282,5 @@
   EXPECT_EQ(frame.end(), frame.data() + frame.size());
 }
 
-// =============================================================================
-// Modern HTTP/2 Frame Representations Tests
-// =============================================================================
-
-TEST(ModernFrameTest, StandardLayoutAndTriviallyCopyable) {
-  static_assert(std::is_standard_layout_v<PriorityFields>);
-  static_assert(std::is_trivially_copyable_v<PriorityFields>);
-
-  static_assert(std::is_standard_layout_v<SettingParameter>);
-  static_assert(std::is_trivially_copyable_v<SettingParameter>);
-
-  static_assert(std::is_standard_layout_v<AcceptChEntryView>);
-  static_assert(std::is_trivially_copyable_v<AcceptChEntryView>);
-
-  static_assert(std::is_standard_layout_v<DataFrame>);
-  static_assert(std::is_trivially_copyable_v<DataFrame>);
-
-  static_assert(std::is_standard_layout_v<HeadersFrame>);
-  static_assert(std::is_trivially_copyable_v<HeadersFrame>);
-
-  static_assert(std::is_standard_layout_v<PriorityFrame>);
-  static_assert(std::is_trivially_copyable_v<PriorityFrame>);
-
-  static_assert(std::is_standard_layout_v<RstStreamFrame>);
-  static_assert(std::is_trivially_copyable_v<RstStreamFrame>);
-
-  static_assert(std::is_standard_layout_v<SettingsFrame>);
-
-  static_assert(std::is_standard_layout_v<PushPromiseFrame>);
-  static_assert(std::is_trivially_copyable_v<PushPromiseFrame>);
-
-  static_assert(std::is_standard_layout_v<PingFrame>);
-  static_assert(std::is_trivially_copyable_v<PingFrame>);
-
-  static_assert(std::is_standard_layout_v<GoAwayFrame>);
-  static_assert(std::is_trivially_copyable_v<GoAwayFrame>);
-
-  static_assert(std::is_standard_layout_v<WindowUpdateFrame>);
-  static_assert(std::is_trivially_copyable_v<WindowUpdateFrame>);
-
-  static_assert(std::is_standard_layout_v<ContinuationFrame>);
-  static_assert(std::is_trivially_copyable_v<ContinuationFrame>);
-
-  static_assert(std::is_standard_layout_v<AltSvcFrame>);
-  static_assert(std::is_trivially_copyable_v<AltSvcFrame>);
-
-  static_assert(std::is_standard_layout_v<PriorityUpdateFrame>);
-  static_assert(std::is_trivially_copyable_v<PriorityUpdateFrame>);
-
-  static_assert(std::is_standard_layout_v<AcceptChFrame>);
-  static_assert(std::is_trivially_copyable_v<AcceptChFrame>);
-
-  static_assert(std::is_standard_layout_v<UnknownFrame>);
-  static_assert(std::is_trivially_copyable_v<UnknownFrame>);
-
-  static_assert(sizeof(SpdyFrame) <= 64,
-                "SpdyFrame must fit in a 64-byte cache line");
-}
-
-TEST(ModernFrameTest, Http2FrameConcept) {
-  static_assert(Http2FrameConcept<DataFrame>);
-  static_assert(Http2FrameConcept<HeadersFrame>);
-  static_assert(Http2FrameConcept<PriorityFrame>);
-  static_assert(Http2FrameConcept<RstStreamFrame>);
-  static_assert(Http2FrameConcept<SettingsFrame>);
-  static_assert(Http2FrameConcept<PushPromiseFrame>);
-  static_assert(Http2FrameConcept<PingFrame>);
-  static_assert(Http2FrameConcept<GoAwayFrame>);
-  static_assert(Http2FrameConcept<WindowUpdateFrame>);
-  static_assert(Http2FrameConcept<ContinuationFrame>);
-  static_assert(Http2FrameConcept<AltSvcFrame>);
-  static_assert(Http2FrameConcept<PriorityUpdateFrame>);
-  static_assert(Http2FrameConcept<AcceptChFrame>);
-  static_assert(Http2FrameConcept<UnknownFrame>);
-
-  // Non-frame types should not satisfy the concept.
-  static_assert(!Http2FrameConcept<int>);
-  static_assert(!Http2FrameConcept<std::string>);
-  static_assert(!Http2FrameConcept<PriorityFields>);
-  static_assert(!Http2FrameConcept<SpdyDataIR>);
-}
-
-TEST(ModernFrameTest, FrameTraits) {
-  EXPECT_EQ(SpdyFrameType::DATA, frame_type_v<DataFrame>);
-  EXPECT_EQ(SpdyFrameType::HEADERS, frame_type_v<HeadersFrame>);
-  EXPECT_EQ(SpdyFrameType::PRIORITY, frame_type_v<PriorityFrame>);
-  EXPECT_EQ(SpdyFrameType::RST_STREAM, frame_type_v<RstStreamFrame>);
-  EXPECT_EQ(SpdyFrameType::SETTINGS, frame_type_v<SettingsFrame>);
-  EXPECT_EQ(SpdyFrameType::PUSH_PROMISE, frame_type_v<PushPromiseFrame>);
-  EXPECT_EQ(SpdyFrameType::PING, frame_type_v<PingFrame>);
-  EXPECT_EQ(SpdyFrameType::GOAWAY, frame_type_v<GoAwayFrame>);
-  EXPECT_EQ(SpdyFrameType::WINDOW_UPDATE, frame_type_v<WindowUpdateFrame>);
-  EXPECT_EQ(SpdyFrameType::CONTINUATION, frame_type_v<ContinuationFrame>);
-  EXPECT_EQ(SpdyFrameType::ALTSVC, frame_type_v<AltSvcFrame>);
-  EXPECT_EQ(SpdyFrameType::PRIORITY_UPDATE, frame_type_v<PriorityUpdateFrame>);
-  EXPECT_EQ(SpdyFrameType::ACCEPT_CH, frame_type_v<AcceptChFrame>);
-
-  // Fixed size checks
-  EXPECT_TRUE(is_fixed_size_v<PriorityFrame>);
-  EXPECT_TRUE(is_fixed_size_v<RstStreamFrame>);
-  EXPECT_TRUE(is_fixed_size_v<PingFrame>);
-  EXPECT_TRUE(is_fixed_size_v<WindowUpdateFrame>);
-  EXPECT_FALSE(is_fixed_size_v<DataFrame>);
-  EXPECT_FALSE(is_fixed_size_v<HeadersFrame>);
-  EXPECT_FALSE(is_fixed_size_v<SettingsFrame>);
-
-  // Stream ID presence
-  EXPECT_TRUE(has_stream_id_v<DataFrame>);
-  EXPECT_TRUE(has_stream_id_v<HeadersFrame>);
-  EXPECT_TRUE(has_stream_id_v<PriorityFrame>);
-  EXPECT_TRUE(has_stream_id_v<RstStreamFrame>);
-  EXPECT_TRUE(has_stream_id_v<PushPromiseFrame>);
-  EXPECT_TRUE(has_stream_id_v<WindowUpdateFrame>);
-  EXPECT_FALSE(has_stream_id_v<SettingsFrame>);
-  EXPECT_FALSE(has_stream_id_v<PingFrame>);
-  EXPECT_FALSE(has_stream_id_v<GoAwayFrame>);
-
-  // Fin flag presence
-  EXPECT_TRUE(has_fin_v<DataFrame>);
-  EXPECT_TRUE(has_fin_v<HeadersFrame>);
-  EXPECT_FALSE(has_fin_v<RstStreamFrame>);
-  EXPECT_FALSE(has_fin_v<SettingsFrame>);
-
-  // Padding presence
-  EXPECT_TRUE(has_padding_v<DataFrame>);
-  EXPECT_TRUE(has_padding_v<HeadersFrame>);
-  EXPECT_TRUE(has_padding_v<PushPromiseFrame>);
-  EXPECT_FALSE(has_padding_v<PingFrame>);
-
-  // Flow control consumption
-  EXPECT_TRUE(consumes_flow_control_v<DataFrame>);
-  EXPECT_FALSE(consumes_flow_control_v<HeadersFrame>);
-  EXPECT_FALSE(consumes_flow_control_v<SettingsFrame>);
-}
-
-TEST(ModernFrameTest, FrameSizeCalculation) {
-  DataFrame data{.stream_id = 1, .data = "hello"};
-  EXPECT_EQ(14u, FrameSize(data));
-  data.flags = DATA_FLAG_PADDED;
-  data.padding_payload_len = 3;
-  EXPECT_EQ(18u, FrameSize(data));
-
-  HeadersFrame headers{.stream_id = 1, .hpack_block = "0123456789"};
-  EXPECT_EQ(19u, FrameSize(headers));
-  headers.has_priority = true;
-  EXPECT_EQ(24u, FrameSize(headers));
-
-  PriorityFrame priority{.stream_id = 1};
-  EXPECT_EQ(14u, FrameSize(priority));
-
-  RstStreamFrame rst{.stream_id = 1};
-  EXPECT_EQ(13u, FrameSize(rst));
-
-  SettingsFrame settings_ack{.is_ack = true, .values = {}};
-  EXPECT_EQ(9u, FrameSize(settings_ack));
-  SettingsFrame settings_data{
-      .is_ack = false,
-      .values = {{SETTINGS_HEADER_TABLE_SIZE, 4096},
-                 {SETTINGS_MAX_CONCURRENT_STREAMS, 100}}};
-  EXPECT_EQ(21u, FrameSize(settings_data));
-
-  PushPromiseFrame push{
-      .stream_id = 1, .promised_stream_id = 2, .hpack_block = "12345678"};
-  EXPECT_EQ(21u, FrameSize(push));
-
-  PingFrame ping{};
-  EXPECT_EQ(17u, FrameSize(ping));
-
-  GoAwayFrame goaway{.debug_data = "abcd"};
-  EXPECT_EQ(21u, FrameSize(goaway));
-
-  WindowUpdateFrame win{.stream_id = 1, .delta = 100};
-  EXPECT_EQ(13u, FrameSize(win));
-
-  ContinuationFrame cont{.stream_id = 1, .hpack_block = "abcdef"};
-  EXPECT_EQ(15u, FrameSize(cont));
-
-  AltSvcFrame altsvc{.stream_id = 1, .origin = "foo", .value = "h2=\":443\""};
-  EXPECT_EQ(9u + 2u + 3u + 9u, FrameSize(altsvc));
-
-  PriorityUpdateFrame prio_up{.prioritized_stream_id = 3,
-                              .priority_field_value = "u=3,i"};
-  EXPECT_EQ(9u + 4u + 5u, FrameSize(prio_up));
-
-  AcceptChFrame accept_ch{.num_entries = 1,
-                          .entries = {{{.origin = "foo", .value = "bar"}}}};
-  EXPECT_EQ(9u + 4u + 3u + 3u, FrameSize(accept_ch));
-
-  UnknownFrame unknown{.type = 0x99, .payload = "payload"};
-  EXPECT_EQ(16u, FrameSize(unknown));
-}
-
-TEST(ModernFrameTest, SerializeDataFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  DataFrame df{.stream_id = 3, .flags = DATA_FLAG_FIN, .data = "hello world"};
-  SpdyFrameBuilder builder(FrameSize(df));
-  EXPECT_TRUE(SerializeFrame(df, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyDataIR data_ir(3, "hello world");
-  data_ir.set_fin(true);
-  SpdySerializedFrame expected = framer.SerializeData(data_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializePriorityFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  PriorityFrame pf{
-      .stream_id = 5,
-      .priority = {.parent_stream_id = 1, .weight = 32, .exclusive = true}};
-  SpdyFrameBuilder builder(FrameSize(pf));
-  EXPECT_TRUE(SerializeFrame(pf, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyPriorityIR prio_ir(5, 1, 32, true);
-  SpdySerializedFrame expected = framer.SerializePriority(prio_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializeRstStreamFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  // 3. RST_STREAM frame
-  RstStreamFrame rf{.stream_id = 7, .error_code = ERROR_CODE_CANCEL};
-  SpdyFrameBuilder builder(FrameSize(rf));
-  EXPECT_TRUE(SerializeFrame(rf, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyRstStreamIR rst_ir(7, ERROR_CODE_CANCEL);
-  SpdySerializedFrame expected = framer.SerializeRstStream(rst_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializeSettingsFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  // SETTINGS ack.
-  {
-    SettingsFrame sf_ack{.is_ack = true, .values = {}};
-    SpdyFrameBuilder builder(FrameSize(sf_ack));
-    EXPECT_TRUE(SerializeFrame(sf_ack, builder));
-    SpdySerializedFrame serialized = builder.take();
-
-    SpdySettingsIR settings_ack_ir;
-    settings_ack_ir.set_is_ack(true);
-    SpdySerializedFrame expected = framer.SerializeSettings(settings_ack_ir);
-
-    EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-  }
-  // SETTINGS with values.
-  {
-    SettingsFrame sf_vals{.is_ack = false,
-                          .values = {{SETTINGS_HEADER_TABLE_SIZE, 4096},
-                                     {SETTINGS_MAX_CONCURRENT_STREAMS, 100}}};
-    SpdyFrameBuilder builder(FrameSize(sf_vals));
-    EXPECT_TRUE(SerializeFrame(sf_vals, builder));
-    SpdySerializedFrame serialized = builder.take();
-
-    SpdySettingsIR settings_ir;
-    settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 4096);
-    settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 100);
-    SpdySerializedFrame expected = framer.SerializeSettings(settings_ir);
-
-    EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-  }
-}
-
-TEST(ModernFrameTest, SerializePingFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  PingFrame ping{.opaque_data = 0x0102030405060708ULL, .is_ack = true};
-  SpdyFrameBuilder builder(FrameSize(ping));
-  EXPECT_TRUE(SerializeFrame(ping, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyPingIR ping_ir(0x0102030405060708ULL);
-  ping_ir.set_is_ack(true);
-  SpdySerializedFrame expected = framer.SerializePing(ping_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializeGoAwayFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  GoAwayFrame goaway{.last_good_stream_id = 9,
-                     .error_code = ERROR_CODE_PROTOCOL_ERROR,
-                     .debug_data = "protocol error occurred"};
-  SpdyFrameBuilder builder(FrameSize(goaway));
-  EXPECT_TRUE(SerializeFrame(goaway, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyGoAwayIR goaway_ir(9, ERROR_CODE_PROTOCOL_ERROR,
-                         "protocol error occurred");
-  SpdySerializedFrame expected = framer.SerializeGoAway(goaway_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializeWindowUpdateFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  WindowUpdateFrame win{.stream_id = 11, .delta = 65535};
-  SpdyFrameBuilder builder(FrameSize(win));
-  EXPECT_TRUE(SerializeFrame(win, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyWindowUpdateIR win_ir(11, 65535);
-  SpdySerializedFrame expected = framer.SerializeWindowUpdate(win_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializeContinuationFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  ContinuationFrame cont{.stream_id = 13,
-                         .flags = HEADERS_FLAG_END_HEADERS,
-                         .hpack_block = "continuation_block"};
-  SpdyFrameBuilder builder(FrameSize(cont));
-  EXPECT_TRUE(SerializeFrame(cont, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyContinuationIR cont_ir(13);
-  cont_ir.set_end_headers(true);
-  cont_ir.take_encoding("continuation_block");
-  SpdySerializedFrame expected = framer.SerializeContinuation(cont_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializePriorityUpdateFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  PriorityUpdateFrame prio_up{.prioritized_stream_id = 5,
-                              .priority_field_value = "u=1,i"};
-  SpdyFrameBuilder builder(FrameSize(prio_up));
-  EXPECT_TRUE(SerializeFrame(prio_up, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyPriorityUpdateIR prio_up_ir(0, 5, "u=1,i");
-  SpdySerializedFrame expected = framer.SerializePriorityUpdate(prio_up_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializeAcceptChFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  AcceptChFrame accept_ch{
-      .num_entries = 1,
-      .entries = {{{.origin = "example.com", .value = "sec-ch-ua"}}}};
-  SpdyFrameBuilder builder(FrameSize(accept_ch));
-  EXPECT_TRUE(SerializeFrame(accept_ch, builder));
-  SpdySerializedFrame serialized = builder.take();
-
-  SpdyAcceptChIR accept_ch_ir({{"example.com", "sec-ch-ua"}});
-  SpdySerializedFrame expected = framer.SerializeAcceptCh(accept_ch_ir);
-
-  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-}
-
-TEST(ModernFrameTest, SerializeUnknownFrame) {
-  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-
-  // 11. UNKNOWN frame
-  {
-    UnknownFrame unknown{.stream_id = 1,
-                         .type = 0xfe,
-                         .flags = 0x05,
-                         .payload = "custom_payload"};
-    SpdyFrameBuilder builder(FrameSize(unknown));
-    EXPECT_TRUE(SerializeFrame(unknown, builder));
-    SpdySerializedFrame serialized = builder.take();
-
-    SpdyUnknownIR unknown_ir(1, 0xfe, 0x05, "custom_payload");
-    SpdySerializedFrame expected = framer.SerializeUnknown(unknown_ir);
-
-    EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
-  }
-}
-
-TEST(ModernFrameTest, SpdyFrameVariant) {
-  SpdyFrame frame = DataFrame{.stream_id = 42, .data = "payload"};
-  EXPECT_EQ(42u, GetFrameStreamId(frame));
-  EXPECT_EQ(SpdyFrameType::DATA, GetFrameType(frame));
-  EXPECT_EQ(16u, GetFrameSize(frame));
-
-  frame = PingFrame{.opaque_data = 123};
-  EXPECT_EQ(0u, GetFrameStreamId(frame));
-  EXPECT_EQ(SpdyFrameType::PING, GetFrameType(frame));
-  EXPECT_EQ(17u, GetFrameSize(frame));
-
-  SpdyFrameBuilder builder(GetFrameSize(frame));
-  EXPECT_TRUE(SerializeSpdyFrame(frame, builder));
-  EXPECT_EQ(17u, builder.length());
-}
-
 }  // namespace test
 }  // namespace spdy