blob: c74130ff595d3bbe99146d51279eabb9b0f9452f [file] [log] [blame]
// 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() {
return &message_tags_;
}
std::vector<std::map<CryptoTag, string> >* message_maps() {
return &message_maps_;
}
private:
std::vector<CryptoTag> message_tags_;
std::vector<std::map<CryptoTag, string> > 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<QuicData> 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