blob: d51ec69be701e1df61f8c971d721a4c1dd6a3b82 [file] [log] [blame]
// Copyright (c) 2017 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.
#ifndef QUICHE_QUIC_TEST_TOOLS_SIMPLE_DATA_PRODUCER_H_
#define QUICHE_QUIC_TEST_TOOLS_SIMPLE_DATA_PRODUCER_H_
#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
#include "net/third_party/quiche/src/quic/core/quic_stream_frame_data_producer.h"
#include "net/third_party/quiche/src/quic/core/quic_stream_send_buffer.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_containers.h"
namespace quic {
namespace test {
// A simple data producer which copies stream data into a map from stream
// id to send buffer.
class SimpleDataProducer : public QuicStreamFrameDataProducer {
public:
SimpleDataProducer();
~SimpleDataProducer() override;
// Saves data to be provided when WriteStreamData is called. Data of length
// |data_length| is buffered to be provided for stream |id|. Multiple calls to
// SaveStreamData for the same stream ID append to the buffer for that stream.
// The data to be buffered is provided in |iov_count| iovec structs, with
// |iov| pointing to the first, and |iov_offset| indicating how many bytes
// into the iovec structs the data starts.
void SaveStreamData(QuicStreamId id,
const struct iovec* iov,
int iov_count,
size_t iov_offset,
QuicByteCount data_length);
void SaveCryptoData(EncryptionLevel level,
QuicStreamOffset offset,
QuicStringPiece data);
// QuicStreamFrameDataProducer
WriteStreamDataResult WriteStreamData(QuicStreamId id,
QuicStreamOffset offset,
QuicByteCount data_length,
QuicDataWriter* writer) override;
bool WriteCryptoData(EncryptionLevel level,
QuicStreamOffset offset,
QuicByteCount data_length,
QuicDataWriter* writer) override;
// TODO(wub): Allow QuicDefaultHasher to accept a pair. Then remove this.
class PairHash {
public:
template <class T1, class T2>
size_t operator()(const std::pair<T1, T2>& pair) const {
return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
}
};
private:
using SendBufferMap =
QuicUnorderedMap<QuicStreamId, std::unique_ptr<QuicStreamSendBuffer>>;
using CryptoBufferMap =
QuicUnorderedMap<std::pair<EncryptionLevel, QuicStreamOffset>,
QuicStringPiece,
PairHash>;
SimpleBufferAllocator allocator_;
SendBufferMap send_buffer_map_;
// |crypto_buffer_map_| stores data provided by SaveCryptoData to later write
// in WriteCryptoData. The level and data passed into SaveCryptoData are used
// as the key to identify the data when WriteCryptoData is called.
// WriteCryptoData will only succeed if there is data in the map for the
// provided level and offset, and the data in the map matches the data_length
// passed into WriteCryptoData.
//
// Unlike SaveStreamData/WriteStreamData which uses a map of
// QuicStreamSendBuffers (for each stream ID), this map provides data for
// specific offsets. Using a QuicStreamSendBuffer requires that all data
// before an offset exist, whereas this allows providing data that exists at
// arbitrary offsets for testing.
CryptoBufferMap crypto_buffer_map_;
};
} // namespace test
} // namespace quic
#endif // QUICHE_QUIC_TEST_TOOLS_SIMPLE_DATA_PRODUCER_H_