// Copyright 2015 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 NET_QUIC_MOCK_QUIC_DATA_H_
#define NET_QUIC_MOCK_QUIC_DATA_H_

#include "net/socket/socket_test_util.h"
#include "net/third_party/quic/core/quic_packets.h"

namespace net {
namespace test {

// Helper class to encapsulate MockReads and MockWrites for QUIC.
// Simplify ownership issues and the interaction with the MockSocketFactory.
class MockQuicData {
 public:
  MockQuicData();
  ~MockQuicData();

  // Makes the Connect() call return |rv| either
  // synchronusly or asynchronously based on |mode|.
  void AddConnect(IoMode mode, int rv);

  // Adds a read at the next sequence number which will read |packet|
  // synchronously or asynchronously based on |mode|.
  void AddRead(IoMode mode, std::unique_ptr<quic::QuicEncryptedPacket> packet);

  // Adds a read at the next sequence number which will return |rv| either
  // synchronously or asynchronously based on |mode|.
  void AddRead(IoMode mode, int rv);

  // Adds a write at the next sequence number which will write |packet|
  // synchronously or asynchronously based on |mode|.
  void AddWrite(IoMode mode, std::unique_ptr<quic::QuicEncryptedPacket> packet);

  // Adds a write at the next sequence number which will return |rv| either
  // synchronously or asynchronously based on |mode|.
  void AddWrite(IoMode mode, int rv);

  // Adds the reads and writes to |factory|.
  void AddSocketDataToFactory(MockClientSocketFactory* factory);

  // Returns true if all reads have been consumed.
  bool AllReadDataConsumed();

  // Returns true if all writes have been consumed.
  bool AllWriteDataConsumed();

  // Resumes I/O after it is paused.
  void Resume();

  // Creates a new SequencedSocketData owned by this instance of MockQuicData.
  // Returns a pointer to the newly created SequencedSocketData.
  SequencedSocketData* InitializeAndGetSequencedSocketData();

  SequencedSocketData* GetSequencedSocketData();

 private:
  std::vector<std::unique_ptr<quic::QuicEncryptedPacket>> packets_;
  std::unique_ptr<MockConnect> connect_;
  std::vector<MockWrite> writes_;
  std::vector<MockRead> reads_;
  size_t sequence_number_;
  std::unique_ptr<SequencedSocketData> socket_data_;
};

}  // namespace test
}  // namespace net

#endif  // NET_QUIC_MOCK_QUIC_DATA_H_
