Move QuicIetfTransportErrorCodes, QuicErrorCodeToIetfMapping,
and QuicErrorCodeToTransportErrorCode from quic_types to quic_error_codes, next
to closely related QuicHttp3ErrorCode.
gfe-relnote: Refactor, no functional change, not protected.
PiperOrigin-RevId: 305731890
Change-Id: Ibded7eedf8fb05b3fedbe13083715a7c9aded038
diff --git a/quic/core/quic_error_codes_test.cc b/quic/core/quic_error_codes_test.cc
index f9928bd..de3ebcb 100644
--- a/quic/core/quic_error_codes_test.cc
+++ b/quic/core/quic_error_codes_test.cc
@@ -4,6 +4,9 @@
#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
+#include <cstdint>
+
+#include "third_party/boringssl/src/include/openssl/ssl.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
namespace quic {
@@ -21,6 +24,76 @@
EXPECT_STREQ("QUIC_NO_ERROR", QuicErrorCodeToString(QUIC_NO_ERROR));
}
+TEST_F(QuicErrorCodesTest, QuicIetfTransportErrorCodeString) {
+ EXPECT_EQ("Private(65280)",
+ QuicIetfTransportErrorCodeString(
+ static_cast<quic::QuicIetfTransportErrorCodes>(0xff00u)));
+
+ EXPECT_EQ("CRYPTO_ERROR(missing extension)",
+ QuicIetfTransportErrorCodeString(
+ static_cast<quic::QuicIetfTransportErrorCodes>(
+ CRYPTO_ERROR_FIRST + SSL_AD_MISSING_EXTENSION)));
+
+ EXPECT_EQ("NO_IETF_QUIC_ERROR",
+ QuicIetfTransportErrorCodeString(NO_IETF_QUIC_ERROR));
+ EXPECT_EQ("INTERNAL_ERROR", QuicIetfTransportErrorCodeString(INTERNAL_ERROR));
+ EXPECT_EQ("SERVER_BUSY_ERROR",
+ QuicIetfTransportErrorCodeString(SERVER_BUSY_ERROR));
+ EXPECT_EQ("FLOW_CONTROL_ERROR",
+ QuicIetfTransportErrorCodeString(FLOW_CONTROL_ERROR));
+ EXPECT_EQ("STREAM_LIMIT_ERROR",
+ QuicIetfTransportErrorCodeString(STREAM_LIMIT_ERROR));
+ EXPECT_EQ("STREAM_STATE_ERROR",
+ QuicIetfTransportErrorCodeString(STREAM_STATE_ERROR));
+ EXPECT_EQ("FINAL_SIZE_ERROR",
+ QuicIetfTransportErrorCodeString(FINAL_SIZE_ERROR));
+ EXPECT_EQ("FRAME_ENCODING_ERROR",
+ QuicIetfTransportErrorCodeString(FRAME_ENCODING_ERROR));
+ EXPECT_EQ("TRANSPORT_PARAMETER_ERROR",
+ QuicIetfTransportErrorCodeString(TRANSPORT_PARAMETER_ERROR));
+ EXPECT_EQ("CONNECTION_ID_LIMIT_ERROR",
+ QuicIetfTransportErrorCodeString(CONNECTION_ID_LIMIT_ERROR));
+ EXPECT_EQ("PROTOCOL_VIOLATION",
+ QuicIetfTransportErrorCodeString(PROTOCOL_VIOLATION));
+ EXPECT_EQ("INVALID_TOKEN", QuicIetfTransportErrorCodeString(INVALID_TOKEN));
+ EXPECT_EQ("CRYPTO_BUFFER_EXCEEDED",
+ QuicIetfTransportErrorCodeString(CRYPTO_BUFFER_EXCEEDED));
+
+ EXPECT_EQ("Unknown(1024)",
+ QuicIetfTransportErrorCodeString(
+ static_cast<quic::QuicIetfTransportErrorCodes>(0x400)));
+}
+
+TEST_F(QuicErrorCodesTest, QuicErrorCodeToTransportErrorCode) {
+ for (int internal_error_code = 0; internal_error_code < QUIC_LAST_ERROR;
+ ++internal_error_code) {
+ std::string internal_error_code_string =
+ QuicErrorCodeToString(static_cast<QuicErrorCode>(internal_error_code));
+ if (internal_error_code_string == "INVALID_ERROR_CODE") {
+ // Not a valid QuicErrorCode.
+ continue;
+ }
+ QuicErrorCodeToIetfMapping ietf_error_code =
+ QuicErrorCodeToTransportErrorCode(
+ static_cast<QuicErrorCode>(internal_error_code));
+ if (ietf_error_code.is_transport_close_) {
+ QuicIetfTransportErrorCodes transport_error_code =
+ ietf_error_code.transport_error_code_;
+ bool is_valid_transport_error_code = transport_error_code <= 0x0d;
+ EXPECT_TRUE(is_valid_transport_error_code) << internal_error_code_string;
+ } else {
+ // Non-transport errors are application errors, either HTTP/3 or QPACK.
+ uint64_t application_error_code = ietf_error_code.application_error_code_;
+ bool is_valid_http3_error_code =
+ application_error_code >= 0x100 && application_error_code <= 0x110;
+ bool is_valid_qpack_error_code =
+ application_error_code >= 0x200 && application_error_code <= 0x202;
+ EXPECT_TRUE(is_valid_http3_error_code || is_valid_qpack_error_code)
+ << internal_error_code_string;
+ }
+ }
+}
+
} // namespace
} // namespace test
} // namespace quic