Coverage Report

Created: 2024-09-19 09:45

/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
  // If set, the stream will reset when the response headers are sent.
25
  static const char RESET_AFTER_RESPONSE_HEADERS[];
26
  // If set, the stream will reset after the first data chunk. Note by default
27
  // there is only one data chunk.
28
  static const char RESET_AFTER_RESPONSE_DATA[];
29
  // Prevents upstream from sending trailers.
30
  static const char NO_TRAILERS[];
31
  // Prevents upstream from finishing response.
32
  static const char NO_END_STREAM[];
33
  // Closes the underlying connection after a given response is sent.
34
  static const char CLOSE_AFTER_RESPONSE[];
35
  // Send the response after the request headers are received.
36
  static const char RESPOND_AFTER_REQUEST_HEADERS[];
37
38
  AutonomousStream(FakeHttpConnection& parent, Http::ResponseEncoder& encoder,
39
                   AutonomousUpstream& upstream, bool allow_incomplete_streams);
40
  ~AutonomousStream() override;
41
42
  void setEndStream(bool set) ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock_) override;
43
  void decodeHeaders(Http::RequestHeaderMapSharedPtr&& headers, bool end_stream) override;
44
45
private:
46
  AutonomousUpstream& upstream_;
47
  void sendResponse() ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock_);
48
  const bool allow_incomplete_streams_{false};
49
  std::unique_ptr<Http::MetadataMapVector> pre_response_headers_metadata_;
50
};
51
52
// An upstream which creates AutonomousStreams for new incoming streams.
53
class AutonomousHttpConnection : public FakeHttpConnection {
54
public:
55
  AutonomousHttpConnection(AutonomousUpstream& autonomous_upstream,
56
                           SharedConnectionWrapper& shared_connection, Http::CodecType type,
57
                           uint32_t max_request_headers_kb, uint32_t max_request_headers_count,
58
                           AutonomousUpstream& upstream);
59
60
  Http::RequestDecoder& newStream(Http::ResponseEncoder& response_encoder, bool) override;
61
62
private:
63
  AutonomousUpstream& upstream_;
64
  std::vector<FakeStreamPtr> streams_;
65
};
66
67
using AutonomousHttpConnectionPtr = std::unique_ptr<AutonomousHttpConnection>;
68
69
// An upstream which creates AutonomousHttpConnection for new incoming connections.
70
class AutonomousUpstream : public FakeUpstream {
71
public:
72
  AutonomousUpstream(Network::DownstreamTransportSocketFactoryPtr&& transport_socket_factory,
73
                     const Network::Address::InstanceConstSharedPtr& address,
74
                     const FakeUpstreamConfig& config, bool allow_incomplete_streams)
75
      : FakeUpstream(std::move(transport_socket_factory), address, config),
76
        allow_incomplete_streams_(allow_incomplete_streams),
77
        response_trailers_(std::make_unique<Http::TestResponseTrailerMapImpl>()),
78
        response_headers_(std::make_unique<Http::TestResponseHeaderMapImpl>(
79
403
            Http::TestResponseHeaderMapImpl({{":status", "200"}}))) {}
80
81
  AutonomousUpstream(Network::DownstreamTransportSocketFactoryPtr&& transport_socket_factory,
82
                     uint32_t port, Network::Address::IpVersion version,
83
                     const FakeUpstreamConfig& config, bool allow_incomplete_streams)
84
      : FakeUpstream(std::move(transport_socket_factory), port, version, config),
85
        allow_incomplete_streams_(allow_incomplete_streams),
86
        response_trailers_(std::make_unique<Http::TestResponseTrailerMapImpl>()),
87
        response_headers_(std::make_unique<Http::TestResponseHeaderMapImpl>(
88
0
            Http::TestResponseHeaderMapImpl({{":status", "200"}}))) {}
89
90
  ~AutonomousUpstream() override;
91
  bool
92
  createNetworkFilterChain(Network::Connection& connection,
93
                           const Filter::NetworkFilterFactoriesList& filter_factories) override;
94
  bool createListenerFilterChain(Network::ListenerFilterManager& listener) override;
95
  void createUdpListenerFilterChain(Network::UdpListenerFilterManager& listener,
96
                                    Network::UdpReadFilterCallbacks& callbacks) override;
97
  bool createQuicListenerFilterChain(Network::QuicListenerFilterManager& listener) override;
98
  AssertionResult closeConnection(uint32_t index,
99
                                  std::chrono::milliseconds timeout = TestUtility::DefaultTimeout);
100
101
  void setLastRequestHeaders(const Http::HeaderMap& headers);
102
  std::unique_ptr<Http::TestRequestHeaderMapImpl> lastRequestHeaders();
103
  void setResponseTrailers(std::unique_ptr<Http::TestResponseTrailerMapImpl>&& response_trailers);
104
  void setResponseBody(std::string body);
105
  void setResponseHeaders(std::unique_ptr<Http::TestResponseHeaderMapImpl>&& response_headers);
106
  void setPreResponseHeadersMetadata(std::unique_ptr<Http::MetadataMapVector>&& metadata);
107
  Http::TestResponseTrailerMapImpl responseTrailers();
108
  absl::optional<std::string> responseBody();
109
  Http::TestResponseHeaderMapImpl responseHeaders();
110
  std::unique_ptr<Http::MetadataMapVector> preResponseHeadersMetadata();
111
  const bool allow_incomplete_streams_{false};
112
113
private:
114
  Thread::MutexBasicLockable headers_lock_;
115
  std::unique_ptr<Http::TestRequestHeaderMapImpl> last_request_headers_;
116
  std::unique_ptr<Http::TestResponseTrailerMapImpl> response_trailers_;
117
  absl::optional<std::string> response_body_;
118
  std::unique_ptr<Http::TestResponseHeaderMapImpl> response_headers_;
119
  std::unique_ptr<Http::MetadataMapVector> pre_response_headers_metadata_;
120
  std::vector<AutonomousHttpConnectionPtr> http_connections_;
121
  std::vector<SharedConnectionWrapperPtr> shared_connections_;
122
};
123
124
} // namespace Envoy