Index: net/quic/test_tools/quic_test_utils.cc |
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a4c71bd0acf1d15c1f4cf5978b0aeb9849026de3 |
--- /dev/null |
+++ b/net/quic/test_tools/quic_test_utils.cc |
@@ -0,0 +1,140 @@ |
+// 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/test_tools/quic_test_utils.h" |
+#include "net/quic/crypto/crypto_framer.h" |
+ |
+using std::max; |
+using std::min; |
+using std::string; |
+ |
+namespace net { |
+namespace test { |
+ |
+MockFramerVisitor::MockFramerVisitor() { |
+ // By default, we want to accept packets. |
+ ON_CALL(*this, OnPacketHeader(testing::_)) |
+ .WillByDefault(testing::Return(true)); |
+} |
+ |
+MockFramerVisitor::~MockFramerVisitor() {} |
+ |
+bool NoOpFramerVisitor::OnPacketHeader(const QuicPacketHeader& header) { |
+ return true; |
+} |
+ |
+namespace { |
+ |
+string HexDumpWithMarks(const char* data, int length, |
+ const bool* marks, int mark_length) { |
+ static const char kHexChars[] = "0123456789abcdef"; |
+ static const int kColumns = 4; |
+ |
+ const int kSizeLimit = 1024; |
+ if (length > kSizeLimit || mark_length > kSizeLimit) { |
+ LOG(ERROR) << "Only dumping first " << kSizeLimit << " bytes."; |
+ length = min(length, kSizeLimit); |
+ mark_length = min(mark_length, kSizeLimit); |
+ } |
+ |
+ string hex; |
+ for (const char* row = data; length > 0; |
+ row += kColumns, length -= kColumns) { |
+ for (const char *p = row; p < row + 4; ++p) { |
+ if (p < row + length) { |
+ const bool mark = |
+ (marks && (p - data) < mark_length && marks[p - data]); |
+ hex += mark ? '*' : ' '; |
+ hex += kHexChars[(*p & 0xf0) >> 4]; |
+ hex += kHexChars[*p & 0x0f]; |
+ hex += mark ? '*' : ' '; |
+ } else { |
+ hex += " "; |
+ } |
+ } |
+ hex = hex + " "; |
+ |
+ for (const char *p = row; p < row + 4 && p < row + length; ++p) |
+ hex += (*p >= 0x20 && *p <= 0x7f) ? (*p) : '.'; |
+ |
+ hex = hex + '\n'; |
+ } |
+ return hex; |
+} |
+ |
+} // namespace |
+ |
+void CompareCharArraysWithHexError( |
+ const string& description, |
+ const char* actual, |
+ const int actual_len, |
+ const char* expected, |
+ const int expected_len) { |
+ const int min_len = min(actual_len, expected_len); |
+ const int max_len = max(actual_len, expected_len); |
+ scoped_array<bool> marks(new bool[max_len]); |
+ bool identical = (actual_len == expected_len); |
+ for (int i = 0; i < min_len; ++i) { |
+ if (actual[i] != expected[i]) { |
+ marks[i] = true; |
+ identical = false; |
+ } else { |
+ marks[i] = false; |
+ } |
+ } |
+ for (int i = min_len; i < max_len; ++i) { |
+ marks[i] = true; |
+ } |
+ if (identical) return; |
+ ADD_FAILURE() |
+ << "Description:\n" |
+ << description |
+ << "\n\nExpected:\n" |
+ << HexDumpWithMarks(expected, expected_len, marks.get(), max_len) |
+ << "\nActual:\n" |
+ << HexDumpWithMarks(actual, actual_len, marks.get(), max_len); |
+} |
+ |
+void CompareQuicDataWithHexError( |
+ const string& description, |
+ QuicData* actual, |
+ QuicData* expected) { |
+ CompareCharArraysWithHexError( |
+ description, |
+ actual->data(), actual->length(), |
+ expected->data(), expected->length()); |
+} |
+ |
+QuicPacket* ConstructHandshakePacket(QuicGuid guid, CryptoTag tag) { |
+ CryptoHandshakeMessage message; |
+ message.tag = tag; |
+ CryptoFramer crypto_framer; |
+ QuicData* data; |
+ crypto_framer.ConstructHandshakeMessage(message, &data); |
+ QuicFramer quic_framer(QuicDecrypter::Create(kNULL), |
+ QuicEncrypter::Create(kNULL)); |
+ |
+ QuicPacketHeader header; |
+ header.guid = guid; |
+ header.retransmission_count = 0; |
+ header.packet_sequence_number = 1; |
+ header.transmission_time = 0; |
+ header.flags = PACKET_FLAGS_NONE; |
+ header.fec_group = 0; |
+ |
+ QuicStreamFragment stream_fragment(kCryptoStreamId, false, 0, |
+ data->AsStringPiece()); |
+ |
+ QuicFragment fragment(&stream_fragment); |
+ QuicFragments fragments; |
+ fragments.push_back(fragment); |
+ QuicPacket* packet; |
+ quic_framer.ConstructFragementDataPacket(header, fragments, &packet); |
+ delete data; |
+ return packet; |
+} |
+ |
+} // namespace test |
+ |
+} // namespace net |