1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/quic/quic_crypto_stream.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "net/quic/crypto/crypto_handshake.h"
12 #include "net/quic/crypto/crypto_protocol.h"
13 #include "net/quic/test_tools/crypto_test_utils.h"
14 #include "net/quic/test_tools/quic_test_utils.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
25 class MockQuicCryptoStream
: public QuicCryptoStream
{
27 explicit MockQuicCryptoStream(QuicSession
* session
)
28 : QuicCryptoStream(session
) {
31 virtual void OnHandshakeMessage(
32 const CryptoHandshakeMessage
& message
) OVERRIDE
{
33 messages_
.push_back(message
);
36 vector
<CryptoHandshakeMessage
>* messages() {
41 vector
<CryptoHandshakeMessage
> messages_
;
43 DISALLOW_COPY_AND_ASSIGN(MockQuicCryptoStream
);
46 class QuicCryptoStreamTest
: public ::testing::Test
{
48 QuicCryptoStreamTest()
49 : addr_(IPAddressNumber(), 1),
50 connection_(new MockConnection(1, addr_
, false)),
51 session_(connection_
, true),
53 message_
.set_tag(kSHLO
);
54 message_
.SetStringPiece(1, "abc");
55 message_
.SetStringPiece(2, "def");
56 ConstructHandshakeMessage();
59 void ConstructHandshakeMessage() {
61 message_data_
.reset(framer
.ConstructHandshakeMessage(message_
));
66 MockConnection
* connection_
;
68 MockQuicCryptoStream stream_
;
69 CryptoHandshakeMessage message_
;
70 scoped_ptr
<QuicData
> message_data_
;
73 DISALLOW_COPY_AND_ASSIGN(QuicCryptoStreamTest
);
76 TEST_F(QuicCryptoStreamTest
, NotInitiallyConected
) {
77 EXPECT_FALSE(stream_
.encryption_established());
78 EXPECT_FALSE(stream_
.handshake_confirmed());
81 TEST_F(QuicCryptoStreamTest
, ProcessData
) {
82 EXPECT_EQ(message_data_
->length(),
83 stream_
.ProcessData(message_data_
->data(),
84 message_data_
->length()));
85 ASSERT_EQ(1u, stream_
.messages()->size());
86 const CryptoHandshakeMessage
& message
= (*stream_
.messages())[0];
87 EXPECT_EQ(kSHLO
, message
.tag());
88 EXPECT_EQ(2u, message
.tag_value_map().size());
89 EXPECT_EQ("abc", CryptoTestUtils::GetValueForTag(message
, 1));
90 EXPECT_EQ("def", CryptoTestUtils::GetValueForTag(message
, 2));
93 TEST_F(QuicCryptoStreamTest
, ProcessBadData
) {
94 string
bad(message_data_
->data(), message_data_
->length());
95 const int kFirstTagIndex
= sizeof(uint32
) + // message tag
96 sizeof(uint16
) + // number of tag-value pairs
97 sizeof(uint16
); // padding
98 EXPECT_EQ(1, bad
[kFirstTagIndex
]);
99 bad
[kFirstTagIndex
] = 0x7F; // out of order tag
101 EXPECT_CALL(*connection_
,
102 SendConnectionClose(QUIC_CRYPTO_TAGS_OUT_OF_ORDER
));
103 EXPECT_EQ(0u, stream_
.ProcessData(bad
.data(), bad
.length()));