Chromium Code Reviews| Index: net/quic/quic_client_session_test.cc |
| =================================================================== |
| --- net/quic/quic_client_session_test.cc (revision 173961) |
| +++ net/quic/quic_client_session_test.cc (working copy) |
| @@ -11,12 +11,74 @@ |
| #include "net/quic/crypto/crypto_protocol.h" |
| #include "net/quic/test_tools/quic_test_utils.h" |
| +using base::StringPiece; |
| +using std::vector; |
| using testing::_; |
| namespace net { |
| namespace test { |
| namespace { |
| +class TestEncrypter : public QuicEncrypter { |
| + public: |
| + virtual QuicData* Encrypt(StringPiece associated_data, |
| + StringPiece plaintext) { |
| + return new QuicData(plaintext.data(), plaintext.length()); |
| + } |
| + virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) { |
| + return ciphertext_size; |
| + } |
| + virtual size_t GetCiphertextSize(size_t plaintext_size) { |
| + return plaintext_size; |
| + } |
| +}; |
| + |
| +class TestDecrypter : public QuicDecrypter { |
| + public: |
| + virtual QuicData* Decrypt(StringPiece associated_data, |
| + StringPiece ciphertext) { |
| + return new QuicData(ciphertext.data(), ciphertext.length()); |
| + } |
| +}; |
| + |
| +class TestQuicVisitor : public NoOpFramerVisitor { |
| + public: |
| + TestQuicVisitor() {} |
| + |
| + // NoOpFramerVisitor |
| + virtual void OnStreamFrame(const QuicStreamFrame& frame) { |
| + frame_ = frame; |
| + } |
| + |
| + QuicStreamFrame* frame() { return &frame_; } |
| + |
| + private: |
| + QuicStreamFrame frame_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(TestQuicVisitor); |
| +}; |
| + |
| +class TestCryptoVisitor : public CryptoFramerVisitorInterface { |
| + public: |
| + TestCryptoVisitor() |
| + : error_count_(0) { |
| + } |
| + |
| + virtual void OnError(CryptoFramer* framer) { |
| + DLOG(ERROR) << "CryptoFramer Error: " << framer->error(); |
| + ++error_count_; |
| + } |
| + |
| + virtual void OnHandshakeMessage(const CryptoHandshakeMessage& message) { |
| + messages_.push_back(message); |
| + } |
| + |
| + // Counters from the visitor callbacks. |
| + int error_count_; |
| + |
| + vector<CryptoHandshakeMessage> messages_; |
| +}; |
| + |
| class QuicClientSessionTest : public ::testing::Test { |
| protected: |
| QuicClientSessionTest() |
| @@ -25,7 +87,9 @@ |
| session_(connection_, NULL, NULL) { |
| } |
| - protected: |
| + // Checks whether |packet| is the default ClientHello packet. |
| + void CheckClientHelloPacket(QuicPacket* packet); |
| + |
| QuicGuid guid_; |
| PacketSavingConnection* connection_; |
| QuicClientSession session_; |
| @@ -33,11 +97,81 @@ |
| TestCompletionCallback callback_; |
| }; |
| +void QuicClientSessionTest::CheckClientHelloPacket(QuicPacket* packet) { |
| + QuicFramer quic_framer(new TestDecrypter, new TestEncrypter); |
| + TestQuicVisitor quic_visitor; |
| + quic_framer.set_visitor(&quic_visitor); |
| + QuicEncryptedPacket encrypted(packet->data(), packet->length()); |
| + ASSERT_TRUE(quic_framer.ProcessPacket(IPEndPoint(), IPEndPoint(), |
| + encrypted)); |
| + EXPECT_EQ(kCryptoStreamId, quic_visitor.frame()->stream_id); |
| + EXPECT_FALSE(quic_visitor.frame()->fin); |
| + EXPECT_EQ(0u, quic_visitor.frame()->offset); |
| + |
| + // Check quic_visitor.frame()->data. |
| + test::TestCryptoVisitor crypto_visitor; |
| + CryptoFramer crypto_framer; |
| + crypto_framer.set_visitor(&crypto_visitor); |
| + ASSERT_TRUE(crypto_framer.ProcessInput(quic_visitor.frame()->data)); |
| + ASSERT_EQ(0u, crypto_framer.InputBytesRemaining()); |
| + ASSERT_EQ(1u, crypto_visitor.messages_.size()); |
| + EXPECT_EQ(kCHLO, crypto_visitor.messages_[0].tag); |
| + |
| + CryptoTagValueMap& tag_value_map = |
| + crypto_visitor.messages_[0].tag_value_map; |
| + ASSERT_EQ(7u, tag_value_map.size()); |
| + |
| + // kNONC |
| + // TODO(wtc): check the nonce. |
| + ASSERT_EQ(32u, tag_value_map[kNONC].size()); |
| + |
| + // kAEAD |
| + ASSERT_EQ(8u, tag_value_map[kAEAD].size()); |
| + CryptoTag cipher[2]; |
| + memcpy(&cipher[0], &tag_value_map[kAEAD][0], 4); |
| + memcpy(&cipher[1], &tag_value_map[kAEAD][4], 4); |
| + EXPECT_EQ(kAESG, cipher[0]); |
| + EXPECT_EQ(kAESH, cipher[1]); |
| + |
| + // kICSL |
| + ASSERT_EQ(4u, tag_value_map[kICSL].size()); |
| + uint32 idle_lifetime; |
| + memcpy(&idle_lifetime, tag_value_map[kICSL].data(), 4); |
| + EXPECT_EQ(300u, idle_lifetime); |
| + |
| + // kKATO |
| + ASSERT_EQ(4u, tag_value_map[kKATO].size()); |
| + uint32 keepalive_timeout; |
| + memcpy(&keepalive_timeout, tag_value_map[kKATO].data(), 4); |
| + EXPECT_EQ(0u, keepalive_timeout); |
| + |
| + // kVERS |
| + ASSERT_EQ(2u, tag_value_map[kVERS].size()); |
| + uint16 version; |
| + memcpy(&version, tag_value_map[kVERS].data(), 2); |
| + EXPECT_EQ(0u, version); |
| + |
| + // kKEXS |
| + ASSERT_EQ(8u, tag_value_map[kKEXS].size()); |
| + CryptoTag key_exchange[2]; |
| + memcpy(&key_exchange[0], &tag_value_map[kKEXS][0], 4); |
| + memcpy(&key_exchange[1], &tag_value_map[kKEXS][4], 4); |
| + EXPECT_EQ(kC255, key_exchange[0]); |
| + EXPECT_EQ(kP256, key_exchange[1]); |
| + |
| + // kCGST |
| + ASSERT_EQ(8u, tag_value_map[kCGST].size()); |
| + CryptoTag congestion[2]; |
| + memcpy(&congestion[0], &tag_value_map[kCGST][0], 4); |
| + memcpy(&congestion[1], &tag_value_map[kCGST][4], 4); |
| + EXPECT_EQ(kQBIC, congestion[0]); |
| + EXPECT_EQ(kINAR, congestion[1]); |
| +} |
| + |
| TEST_F(QuicClientSessionTest, CryptoConnectSendsCorrectData) { |
| EXPECT_EQ(ERR_IO_PENDING, session_.CryptoConnect(callback_.callback())); |
| ASSERT_EQ(1u, connection_->packets_.size()); |
| - scoped_ptr<QuicPacket> chlo(ConstructHandshakePacket(guid_, kCHLO)); |
| - CompareQuicDataWithHexError("CHLO", connection_->packets_[0], chlo.get()); |
| + CheckClientHelloPacket(connection_->packets_[0]); |
| } |
| TEST_F(QuicClientSessionTest, CryptoConnectSendsCompletesAfterSHLO) { |
| @@ -52,6 +186,9 @@ |
| TEST_F(QuicClientSessionTest, MaxNumConnections) { |
| // Initialize crypto before the client session will create a stream. |
| ASSERT_EQ(ERR_IO_PENDING, session_.CryptoConnect(callback_.callback())); |
| + ASSERT_EQ(1u, connection_->packets_.size()); |
| + CheckClientHelloPacket(connection_->packets_[0]); |
|
wtc
2012/12/20 00:33:08
Note that I copied these two lines to this test. N
Ryan Hamilton
2012/12/20 18:51:06
My vote goes for not duplicating the earlier test,
|
| + // Simulate the server crypto handshake. |
| CryptoHandshakeMessage server_message; |
| server_message.tag = kSHLO; |
| session_.GetCryptoStream()->OnHandshakeMessage(server_message); |