// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/quic/quic_crypto_stream.h" #include #include #include "net/quic/quic_utils.h" #include "net/quic/test_tools/quic_test_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using std::map; using std::string; namespace net { namespace test { namespace { class MockQuicCryptoStream : public QuicCryptoStream { public: explicit MockQuicCryptoStream(QuicSession* session) : QuicCryptoStream(session) { } void OnHandshakeMessage(const CryptoHandshakeMessage& message) { message_tags_.push_back(message.tag); message_maps_.push_back(map()); CryptoTagValueMap::const_iterator it = message.tag_value_map.begin(); while (it != message.tag_value_map.end()) { message_maps_.back()[it->first] = it->second.as_string(); ++it; } } std::vector* message_tags() { return &message_tags_; } std::vector >* message_maps() { return &message_maps_; } private: std::vector message_tags_; std::vector > message_maps_; DISALLOW_COPY_AND_ASSIGN(MockQuicCryptoStream); }; class QuicCryptoStreamTest : public ::testing::Test { public: QuicCryptoStreamTest() : addr_(IPAddressNumber(), 1), connection_(new MockConnection(1, addr_)), session_(connection_, true), stream_(&session_) { message_.tag = kSHLO; message_.tag_value_map[1] = "abc"; message_.tag_value_map[2] = "def"; ConstructHandshakeMessage(); } void ConstructHandshakeMessage() { CryptoFramer framer; message_data_.reset(framer.ConstructHandshakeMessage(message_)); } protected: IPEndPoint addr_; MockConnection* connection_; MockSession session_; MockQuicCryptoStream stream_; CryptoHandshakeMessage message_; scoped_ptr message_data_; private: DISALLOW_COPY_AND_ASSIGN(QuicCryptoStreamTest); }; TEST_F(QuicCryptoStreamTest, NotInitiallyConected) { EXPECT_FALSE(stream_.handshake_complete()); } TEST_F(QuicCryptoStreamTest, OnErrorClosesConnection) { CryptoFramer framer; EXPECT_CALL(session_, ConnectionClose(QUIC_NO_ERROR, false)); stream_.OnError(&framer); } TEST_F(QuicCryptoStreamTest, ProcessData) { EXPECT_EQ(message_data_->length(), stream_.ProcessData(message_data_->data(), message_data_->length())); ASSERT_EQ(1u, stream_.message_tags()->size()); EXPECT_EQ(kSHLO, (*stream_.message_tags())[0]); EXPECT_EQ(2u, (*stream_.message_maps())[0].size()); EXPECT_EQ("abc", (*stream_.message_maps())[0][1]); EXPECT_EQ("def", (*stream_.message_maps())[0][2]); } TEST_F(QuicCryptoStreamTest, ProcessBadData) { string bad(message_data_->data(), message_data_->length()); bad[6] = 0x7F; // out of order tag EXPECT_CALL(*connection_, SendConnectionClose(QUIC_CRYPTO_TAGS_OUT_OF_ORDER)); EXPECT_EQ(0u, stream_.ProcessData(bad.data(), bad.length())); } } // namespace } // namespace test } // namespace net