// Copyright (c) 2013 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/mock_crypto_client_stream_factory.h"

#include "base/lazy_instance.h"
#include "net/quic/quic_chromium_client_session.h"
#include "net/third_party/quic/core/quic_crypto_client_stream.h"

using std::string;

namespace net {

MockCryptoClientStreamFactory::~MockCryptoClientStreamFactory() {}

MockCryptoClientStreamFactory::MockCryptoClientStreamFactory()
    : handshake_mode_(MockCryptoClientStream::CONFIRM_HANDSHAKE),
      last_stream_(nullptr),
      config_(new quic::QuicConfig()),
      use_mock_crypter_(false) {}

void MockCryptoClientStreamFactory::SetConfig(const quic::QuicConfig& config) {
  config_.reset(new quic::QuicConfig(config));
}

quic::QuicCryptoClientStream*
MockCryptoClientStreamFactory::CreateQuicCryptoClientStream(
    const quic::QuicServerId& server_id,
    QuicChromiumClientSession* session,
    std::unique_ptr<quic::ProofVerifyContext> /*proof_verify_context*/,
    quic::QuicCryptoClientConfig* crypto_config) {
  const ProofVerifyDetailsChromium* proof_verify_details = nullptr;
  if (!proof_verify_details_queue_.empty()) {
    proof_verify_details = proof_verify_details_queue_.front();
    proof_verify_details_queue_.pop();
  }
  last_stream_ = new MockCryptoClientStream(
      server_id, session, nullptr, *(config_.get()), crypto_config,
      handshake_mode_, proof_verify_details, use_mock_crypter_);
  return last_stream_;
}

}  // namespace net
