Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1831)

Unified Diff: net/quic/quic_client_session_test.cc

Issue 11633030: Send the ClientHello handshake message. Fix a bug in (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698