Index: net/quic/quic_crypto_stream_test.cc |
diff --git a/net/quic/quic_crypto_stream_test.cc b/net/quic/quic_crypto_stream_test.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5aee0e46cff69b6162a96a956a63ee52b6442d3e |
--- /dev/null |
+++ b/net/quic/quic_crypto_stream_test.cc |
@@ -0,0 +1,100 @@ |
+// 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 <map> |
+#include <string> |
+ |
+#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<CryptoTag, string>()); |
+ 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<CryptoTag> message_tags_; |
+ std::vector<map<CryptoTag, string> > message_maps_; |
+}; |
+ |
+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_)); |
+ } |
+ |
+ IPEndPoint addr_; |
+ MockConnection* connection_; |
+ MockSession session_; |
+ MockQuicCryptoStream stream_; |
+ CryptoHandshakeMessage message_; |
+ scoped_ptr<QuicData> message_data_; |
+}; |
+ |
+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 |