Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/test/integration/autonomous_upstream.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include "test/integration/fake_upstream.h"
4
5
namespace Envoy {
6
7
class AutonomousUpstream;
8
9
// A stream which automatically responds when the downstream request is
10
// completely read. By default the response is 200: OK with 10 bytes of
11
// payload. This behavior can be overridden with custom request headers defined below.
12
class AutonomousStream : public FakeStream {
13
public:
14
  // The number of response bytes to send. Payload is randomized.
15
  static const char RESPONSE_SIZE_BYTES[];
16
  // The number of data blocks send.
17
  static const char RESPONSE_DATA_BLOCKS[];
18
  // If set to an integer, the AutonomousStream will expect the response body to
19
  // be this large.
20
  static const char EXPECT_REQUEST_SIZE_BYTES[];
21
  // If set, the stream will reset when the request is complete, rather than
22
  // sending a response.
23
  static const char RESET_AFTER_REQUEST[];
24
  // Prevents upstream from sending trailers.
25
  static const char NO_TRAILERS[];
26
  // Prevents upstream from finishing response.
27
  static const char NO_END_STREAM[];
28
  // Closes the underlying connection after a given response is sent.
29
  static const char CLOSE_AFTER_RESPONSE[];
30
31
  AutonomousStream(FakeHttpConnection& parent, Http::ResponseEncoder& encoder,
32
                   AutonomousUpstream& upstream, bool allow_incomplete_streams);
33
  ~AutonomousStream() override;
34
35
  void setEndStream(bool set) ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock_) override;
36
37
private:
38
  AutonomousUpstream& upstream_;
39
  void sendResponse() ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock_);
40
  const bool allow_incomplete_streams_{false};
41
  std::unique_ptr<Http::MetadataMapVector> pre_response_headers_metadata_;
42
};
43
44
// An upstream which creates AutonomousStreams for new incoming streams.
45
class AutonomousHttpConnection : public FakeHttpConnection {
46
public:
47
  AutonomousHttpConnection(AutonomousUpstream& autonomous_upstream,
48
                           SharedConnectionWrapper& shared_connection, Http::CodecType type,
49
                           uint32_t max_request_headers_kb, uint32_t max_request_headers_count,
50
                           AutonomousUpstream& upstream);
51
52
  Http::RequestDecoder& newStream(Http::ResponseEncoder& response_encoder, bool) override;
53
54
private:
55
  AutonomousUpstream& upstream_;
56
  std::vector<FakeStreamPtr> streams_;
57
};
58
59
using AutonomousHttpConnectionPtr = std::unique_ptr<AutonomousHttpConnection>;
60
61
// An upstream which creates AutonomousHttpConnection for new incoming connections.
62
class AutonomousUpstream : public FakeUpstream {
63
public:
64
  AutonomousUpstream(Network::DownstreamTransportSocketFactoryPtr&& transport_socket_factory,
65
                     const Network::Address::InstanceConstSharedPtr& address,
66
                     const FakeUpstreamConfig& config, bool allow_incomplete_streams)
67
      : FakeUpstream(std::move(transport_socket_factory), address, config),
68
        allow_incomplete_streams_(allow_incomplete_streams),
69
        response_trailers_(std::make_unique<Http::TestResponseTrailerMapImpl>()),
70
        response_headers_(std::make_unique<Http::TestResponseHeaderMapImpl>(
71
591
            Http::TestResponseHeaderMapImpl({{":status", "200"}}))) {}
72
73
  AutonomousUpstream(Network::DownstreamTransportSocketFactoryPtr&& transport_socket_factory,
74
                     uint32_t port, Network::Address::IpVersion version,
75
                     const FakeUpstreamConfig& config, bool allow_incomplete_streams)
76
      : FakeUpstream(std::move(transport_socket_factory), port, version, config),
77
        allow_incomplete_streams_(allow_incomplete_streams),
78
        response_trailers_(std::make_unique<Http::TestResponseTrailerMapImpl>()),
79
        response_headers_(std::make_unique<Http::TestResponseHeaderMapImpl>(
80
0
            Http::TestResponseHeaderMapImpl({{":status", "200"}}))) {}
81
82
  ~AutonomousUpstream() override;
83
  bool
84
  createNetworkFilterChain(Network::Connection& connection,
85
                           const Filter::NetworkFilterFactoriesList& filter_factories) override;
86
  bool createListenerFilterChain(Network::ListenerFilterManager& listener) override;
87
  void createUdpListenerFilterChain(Network::UdpListenerFilterManager& listener,
88
                                    Network::UdpReadFilterCallbacks& callbacks) override;
89
  bool createQuicListenerFilterChain(Network::QuicListenerFilterManager& listener) override;
90
  AssertionResult closeConnection(uint32_t index,
91
                                  std::chrono::milliseconds timeout = TestUtility::DefaultTimeout);
92
93
  void setLastRequestHeaders(const Http::HeaderMap& headers);
94
  std::unique_ptr<Http::TestRequestHeaderMapImpl> lastRequestHeaders();
95
  void setResponseTrailers(std::unique_ptr<Http::TestResponseTrailerMapImpl>&& response_trailers);
96
  void setResponseBody(std::string body);
97
  void setResponseHeaders(std::unique_ptr<Http::TestResponseHeaderMapImpl>&& response_headers);
98
  void setPreResponseHeadersMetadata(std::unique_ptr<Http::MetadataMapVector>&& metadata);
99
  Http::TestResponseTrailerMapImpl responseTrailers();
100
  absl::optional<std::string> responseBody();
101
  Http::TestResponseHeaderMapImpl responseHeaders();
102
  std::unique_ptr<Http::MetadataMapVector> preResponseHeadersMetadata();
103
  const bool allow_incomplete_streams_{false};
104
105
private:
106
  Thread::MutexBasicLockable headers_lock_;
107
  std::unique_ptr<Http::TestRequestHeaderMapImpl> last_request_headers_;
108
  std::unique_ptr<Http::TestResponseTrailerMapImpl> response_trailers_;
109
  absl::optional<std::string> response_body_;
110
  std::unique_ptr<Http::TestResponseHeaderMapImpl> response_headers_;
111
  std::unique_ptr<Http::MetadataMapVector> pre_response_headers_metadata_;
112
  std::vector<AutonomousHttpConnectionPtr> http_connections_;
113
  std::vector<SharedConnectionWrapperPtr> shared_connections_;
114
};
115
116
} // namespace Envoy