Project import generated by Copybara.
PiperOrigin-RevId: 237361882
Change-Id: I109a68f44db867b20f8c6a7732b0ce657133e52a
diff --git a/quic/test_tools/fake_proof_source.h b/quic/test_tools/fake_proof_source.h
new file mode 100644
index 0000000..27f63a3
--- /dev/null
+++ b/quic/test_tools/fake_proof_source.h
@@ -0,0 +1,117 @@
+// Copyright (c) 2016 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_FAKE_PROOF_SOURCE_H_
+#define QUICHE_QUIC_TEST_TOOLS_FAKE_PROOF_SOURCE_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "net/third_party/quiche/src/quic/core/crypto/proof_source.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
+
+namespace quic {
+namespace test {
+
+// Implementation of ProofSource which delegates to a ProofSourceForTesting,
+// except that when the async GetProof is called, it captures the call and
+// allows tests to see that a call is pending, which they can then cause to
+// complete at a time of their choosing.
+class FakeProofSource : public ProofSource {
+ public:
+ FakeProofSource();
+ ~FakeProofSource() override;
+
+ // Before this object is "active", all calls to GetProof will be delegated
+ // immediately. Once "active", the async ones will be intercepted. This
+ // distinction is necessary to ensure that GetProof can be called without
+ // interference during test case setup.
+ void Activate();
+
+ // ProofSource interface
+ void GetProof(const QuicSocketAddress& server_address,
+ const QuicString& hostname,
+ const QuicString& server_config,
+ QuicTransportVersion transport_version,
+ QuicStringPiece chlo_hash,
+ std::unique_ptr<ProofSource::Callback> callback) override;
+ QuicReferenceCountedPointer<Chain> GetCertChain(
+ const QuicSocketAddress& server_address,
+ const QuicString& hostname) override;
+ void ComputeTlsSignature(
+ const QuicSocketAddress& server_address,
+ const QuicString& hostname,
+ uint16_t signature_algorithm,
+ QuicStringPiece in,
+ std::unique_ptr<ProofSource::SignatureCallback> callback) override;
+
+ // Get the number of callbacks which are pending
+ int NumPendingCallbacks() const;
+
+ // Invoke a pending callback. The index refers to the position in
+ // pending_ops_ of the callback to be completed.
+ void InvokePendingCallback(int n);
+
+ private:
+ std::unique_ptr<ProofSource> delegate_;
+ bool active_ = false;
+
+ class PendingOp {
+ public:
+ virtual ~PendingOp();
+ virtual void Run() = 0;
+ };
+
+ class GetProofOp : public PendingOp {
+ public:
+ GetProofOp(const QuicSocketAddress& server_addr,
+ QuicString hostname,
+ QuicString server_config,
+ QuicTransportVersion transport_version,
+ QuicString chlo_hash,
+ std::unique_ptr<ProofSource::Callback> callback,
+ ProofSource* delegate);
+ ~GetProofOp() override;
+
+ void Run() override;
+
+ private:
+ QuicSocketAddress server_address_;
+ QuicString hostname_;
+ QuicString server_config_;
+ QuicTransportVersion transport_version_;
+ QuicString chlo_hash_;
+ std::unique_ptr<ProofSource::Callback> callback_;
+ ProofSource* delegate_;
+ };
+
+ class ComputeSignatureOp : public PendingOp {
+ public:
+ ComputeSignatureOp(const QuicSocketAddress& server_address,
+ QuicString hostname,
+ uint16_t sig_alg,
+ QuicStringPiece in,
+ std::unique_ptr<ProofSource::SignatureCallback> callback,
+ ProofSource* delegate);
+ ~ComputeSignatureOp() override;
+
+ void Run() override;
+
+ private:
+ QuicSocketAddress server_address_;
+ QuicString hostname_;
+ uint16_t sig_alg_;
+ QuicString in_;
+ std::unique_ptr<ProofSource::SignatureCallback> callback_;
+ ProofSource* delegate_;
+ };
+
+ std::vector<std::unique_ptr<PendingOp>> pending_ops_;
+};
+
+} // namespace test
+} // namespace quic
+
+#endif // QUICHE_QUIC_TEST_TOOLS_FAKE_PROOF_SOURCE_H_