Set packet type in quic_connection_test according to encryption levels.
Also have some other minor test changes.
gfe-relnote: n/a (test only change)
PiperOrigin-RevId: 238230970
Change-Id: I35cc161dc9e42468c3d87f951c9af9b74ee599fa
diff --git a/quic/core/http/quic_spdy_client_session_test.cc b/quic/core/http/quic_spdy_client_session_test.cc
index 3192d8c..1f5b45d 100644
--- a/quic/core/http/quic_spdy_client_session_test.cc
+++ b/quic/core/http/quic_spdy_client_session_test.cc
@@ -413,6 +413,9 @@
}
TEST_P(QuicSpdyClientSessionTest, GoAwayReceived) {
+ if (connection_->transport_version() == QUIC_VERSION_99) {
+ return;
+ }
CompleteCryptoHandshake();
// After receiving a GoAway, I should no longer be able to create outgoing
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 93ad4eb..b0e173b 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -89,6 +89,21 @@
return QuicUtils::GetHeadersStreamId(version) + n * 2;
}
+QuicLongHeaderType EncryptionlevelToLongHeaderType(EncryptionLevel level) {
+ switch (level) {
+ case ENCRYPTION_NONE:
+ return INITIAL;
+ case ENCRYPTION_ZERO_RTT:
+ return ZERO_RTT_PROTECTED;
+ case ENCRYPTION_FORWARD_SECURE:
+ DCHECK(false);
+ return INVALID_PACKET_TYPE;
+ default:
+ DCHECK(false);
+ return INVALID_PACKET_TYPE;
+ }
+}
+
// TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message.
class TaggingEncrypter : public QuicEncrypter {
public:
@@ -1064,7 +1079,7 @@
bool has_stop_waiting,
EncryptionLevel level) {
std::unique_ptr<QuicPacket> packet(
- ConstructDataPacket(number, has_stop_waiting));
+ ConstructDataPacket(number, has_stop_waiting, level));
char buffer[kMaxPacketSize];
size_t encrypted_length = peer_framer_.EncryptPayload(
level, QuicPacketNumber(number), *packet, buffer, kMaxPacketSize);
@@ -1173,8 +1188,22 @@
}
std::unique_ptr<QuicPacket> ConstructDataPacket(uint64_t number,
- bool has_stop_waiting) {
+ bool has_stop_waiting,
+ EncryptionLevel level) {
QuicPacketHeader header;
+ if (peer_framer_.transport_version() > QUIC_VERSION_43 &&
+ level < ENCRYPTION_FORWARD_SECURE) {
+ // Set long header type accordingly.
+ header.version_flag = true;
+ header.long_packet_type = EncryptionlevelToLongHeaderType(level);
+ if (QuicVersionHasLongHeaderLengths(
+ peer_framer_.version().transport_version)) {
+ header.length_length = VARIABLE_LENGTH_INTEGER_LENGTH_2;
+ if (header.long_packet_type == INITIAL) {
+ header.retry_token_length_length = VARIABLE_LENGTH_INTEGER_LENGTH_1;
+ }
+ }
+ }
// Set connection_id to peer's in memory representation as this data packet
// is created by peer_framer.
header.destination_connection_id = connection_id_;
@@ -1183,6 +1212,14 @@
if (peer_framer_.transport_version() > QUIC_VERSION_43 &&
peer_framer_.perspective() == Perspective::IS_SERVER) {
header.destination_connection_id_included = CONNECTION_ID_ABSENT;
+ if (header.version_flag) {
+ header.source_connection_id = connection_id_;
+ header.source_connection_id_included = CONNECTION_ID_PRESENT;
+ if (GetParam().version.handshake_protocol == PROTOCOL_QUIC_CRYPTO &&
+ header.long_packet_type == ZERO_RTT_PROTECTED) {
+ header.nonce = &diversification_nonce_;
+ }
+ }
}
header.packet_number = QuicPacketNumber(number);
@@ -1351,6 +1388,7 @@
QuicConnectionIdIncluded connection_id_included_;
SimpleSessionNotifier notifier_;
+ DiversificationNonce diversification_nonce_;
};
// Run all end to end tests with all supported versions.
@@ -2396,7 +2434,9 @@
ProcessDataPacket(i);
}
// Send a packet containing stream frame.
- SendStreamDataToPeer(1, "bar", 0, NO_FIN, nullptr);
+ SendStreamDataToPeer(
+ QuicUtils::GetCryptoStreamId(connection_.version().transport_version),
+ "bar", 0, NO_FIN, nullptr);
// Session will not be informed until receiving another 20 packets.
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(19);
@@ -2717,7 +2757,9 @@
EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1);
ProcessDataPacket(1);
QuicPacketNumber last_packet;
- SendStreamDataToPeer(1, "foo", 0, NO_FIN, &last_packet);
+ SendStreamDataToPeer(
+ QuicUtils::GetCryptoStreamId(connection_.version().transport_version),
+ "foo", 0, NO_FIN, &last_packet);
// Verify ack is bundled with outging packet.
EXPECT_FALSE(writer_->ack_frames().empty());
@@ -2731,7 +2773,11 @@
// Process a data packet to cause the visitor's OnCanWrite to be invoked.
EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(1);
- ProcessDataPacket(2);
+ peer_framer_.SetEncrypter(ENCRYPTION_FORWARD_SECURE,
+ QuicMakeUnique<TaggingEncrypter>(0x01));
+ connection_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
+ QuicMakeUnique<StrictTaggingDecrypter>(0x01));
+ ProcessDataPacketAtLevel(2, false, ENCRYPTION_FORWARD_SECURE);
EXPECT_EQ(0u, connection_.NumQueuedPackets());
EXPECT_FALSE(connection_.HasQueuedData());
@@ -3341,8 +3387,8 @@
const uint64_t received_packet_num = 1;
const bool has_stop_waiting = false;
const EncryptionLevel level = ENCRYPTION_NONE;
- std::unique_ptr<QuicPacket> packet(
- ConstructDataPacket(received_packet_num, has_stop_waiting));
+ std::unique_ptr<QuicPacket> packet(ConstructDataPacket(
+ received_packet_num, has_stop_waiting, ENCRYPTION_NONE));
char buffer[kMaxPacketSize];
size_t encrypted_length =
peer_framer_.EncryptPayload(level, QuicPacketNumber(received_packet_num),
@@ -4900,7 +4946,8 @@
TEST_P(QuicConnectionTest, SendScheduler) {
// Test that if we send a packet without delay, it is not queued.
QuicFramerPeer::SetPerspective(&peer_framer_, Perspective::IS_CLIENT);
- std::unique_ptr<QuicPacket> packet = ConstructDataPacket(1, !kHasStopWaiting);
+ std::unique_ptr<QuicPacket> packet =
+ ConstructDataPacket(1, !kHasStopWaiting, ENCRYPTION_NONE);
QuicPacketCreatorPeer::SetPacketNumber(creator_, 1);
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
connection_.SendPacket(ENCRYPTION_NONE, 1, std::move(packet),
@@ -4913,7 +4960,8 @@
// packet at which point self_address_ might be uninitialized.
QuicFramerPeer::SetPerspective(&peer_framer_, Perspective::IS_CLIENT);
EXPECT_CALL(visitor_, OnConnectionClosed(_, _, _)).Times(1);
- std::unique_ptr<QuicPacket> packet = ConstructDataPacket(1, !kHasStopWaiting);
+ std::unique_ptr<QuicPacket> packet =
+ ConstructDataPacket(1, !kHasStopWaiting, ENCRYPTION_NONE);
QuicPacketCreatorPeer::SetPacketNumber(creator_, 1);
writer_->SetShouldWriteFail();
connection_.SendPacket(ENCRYPTION_NONE, 1, std::move(packet),
@@ -4922,7 +4970,8 @@
TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) {
QuicFramerPeer::SetPerspective(&peer_framer_, Perspective::IS_CLIENT);
- std::unique_ptr<QuicPacket> packet = ConstructDataPacket(1, !kHasStopWaiting);
+ std::unique_ptr<QuicPacket> packet =
+ ConstructDataPacket(1, !kHasStopWaiting, ENCRYPTION_NONE);
QuicPacketCreatorPeer::SetPacketNumber(creator_, 1);
BlockOnNextWrite();
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(2u), _, _))
@@ -5076,6 +5125,7 @@
EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
// Simulate delayed ack alarm firing.
+ clock_.AdvanceTime(DefaultDelayedAckTime());
connection_.GetAckAlarm()->Fire();
// Check that ack is sent and that delayed ack alarm is reset.
if (GetParam().no_stop_waiting) {
@@ -5114,6 +5164,7 @@
EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
// Simulate delayed ack alarm firing.
+ clock_.AdvanceTime(DefaultDelayedAckTime());
connection_.GetAckAlarm()->Fire();
// Check that ack is sent and that delayed ack alarm is reset.
if (GetParam().no_stop_waiting) {
@@ -5136,6 +5187,7 @@
EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
// Simulate delayed ack alarm firing.
+ clock_.AdvanceTime(DefaultDelayedAckTime());
connection_.GetAckAlarm()->Fire();
// Check that ack is sent and that delayed ack alarm is reset.
if (GetParam().no_stop_waiting) {
@@ -5249,6 +5301,7 @@
EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
// Simulate delayed ack alarm firing.
+ clock_.AdvanceTime(DefaultDelayedAckTime());
connection_.GetAckAlarm()->Fire();
// Check that ack is sent and that delayed ack alarm is reset.
if (GetParam().no_stop_waiting) {
@@ -5271,6 +5324,7 @@
EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
// Simulate delayed ack alarm firing.
+ clock_.AdvanceTime(DefaultDelayedAckTime());
connection_.GetAckAlarm()->Fire();
// Check that ack is sent and that delayed ack alarm is reset.
if (GetParam().no_stop_waiting) {
@@ -5849,7 +5903,12 @@
TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingPacket) {
EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
- ProcessPacket(1);
+ EXPECT_CALL(visitor_, OnStreamFrame(_));
+ peer_framer_.SetEncrypter(ENCRYPTION_FORWARD_SECURE,
+ QuicMakeUnique<TaggingEncrypter>(0x01));
+ connection_.SetDecrypter(ENCRYPTION_FORWARD_SECURE,
+ QuicMakeUnique<StrictTaggingDecrypter>(0x01));
+ ProcessDataPacketAtLevel(1, false, ENCRYPTION_FORWARD_SECURE);
connection_.SendStreamDataWithString(
GetNthClientInitiatedStreamId(1, connection_.transport_version()), "foo",
0, NO_FIN);
@@ -6034,7 +6093,8 @@
ConnectionCloseBehavior::SILENT_CLOSE);
EXPECT_FALSE(connection_.connected());
EXPECT_FALSE(connection_.CanWriteStreamData());
- std::unique_ptr<QuicPacket> packet = ConstructDataPacket(1, !kHasStopWaiting);
+ std::unique_ptr<QuicPacket> packet =
+ ConstructDataPacket(1, !kHasStopWaiting, ENCRYPTION_NONE);
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, QuicPacketNumber(1), _, _))
.Times(0);
connection_.SendPacket(ENCRYPTION_NONE, 1, std::move(packet),
@@ -7789,7 +7849,8 @@
// Let connection process a Google QUIC packet.
peer_framer_.set_version_for_tests(
ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43));
- std::unique_ptr<QuicPacket> packet(ConstructDataPacket(2, !kHasStopWaiting));
+ std::unique_ptr<QuicPacket> packet(
+ ConstructDataPacket(2, !kHasStopWaiting, ENCRYPTION_NONE));
char buffer[kMaxPacketSize];
size_t encrypted_length = peer_framer_.EncryptPayload(
ENCRYPTION_NONE, QuicPacketNumber(2), *packet, buffer, kMaxPacketSize);
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index a1b294b..915d31b 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -1139,6 +1139,8 @@
.WillOnce(Invoke(
connection_,
&MockQuicConnection::ReallySendConnectivityProbingResponsePacket));
+ QuicConnectionPeer::SetLastHeaderFormat(connection_,
+ IETF_QUIC_SHORT_HEADER_PACKET);
// Need to explicitly do this to emulate the reception of a PathChallenge,
// which stores its payload for use in generating the response.
connection_->OnPathChallengeFrame(
diff --git a/quic/test_tools/quic_connection_peer.cc b/quic/test_tools/quic_connection_peer.cc
index 100fe15..953e495 100644
--- a/quic/test_tools/quic_connection_peer.cc
+++ b/quic/test_tools/quic_connection_peer.cc
@@ -351,5 +351,11 @@
return connection->current_packet_content_;
}
+// static
+void QuicConnectionPeer::SetLastHeaderFormat(QuicConnection* connection,
+ PacketHeaderFormat format) {
+ connection->last_header_.form = format;
+}
+
} // namespace test
} // namespace quic
diff --git a/quic/test_tools/quic_connection_peer.h b/quic/test_tools/quic_connection_peer.h
index b82c1b3..ef7e630 100644
--- a/quic/test_tools/quic_connection_peer.h
+++ b/quic/test_tools/quic_connection_peer.h
@@ -138,6 +138,8 @@
static bool SupportsReleaseTime(QuicConnection* connection);
static QuicConnection::PacketContent GetCurrentPacketContent(
QuicConnection* connection);
+ static void SetLastHeaderFormat(QuicConnection* connection,
+ PacketHeaderFormat format);
};
} // namespace test