xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 #include "quiche/http2/adapter/event_forwarder.h"
2 
3 #include <string>
4 
5 #include "absl/strings/string_view.h"
6 #include "quiche/http2/adapter/http2_protocol.h"
7 #include "quiche/common/platform/api/quiche_test.h"
8 #include "quiche/spdy/core/spdy_protocol.h"
9 #include "quiche/spdy/test_tools/mock_spdy_framer_visitor.h"
10 
11 namespace http2 {
12 namespace adapter {
13 namespace test {
14 namespace {
15 
16 constexpr absl::string_view some_data = "Here is some data for events";
17 constexpr spdy::SpdyStreamId stream_id = 1;
18 constexpr spdy::SpdyErrorCode error_code =
19     spdy::SpdyErrorCode::ERROR_CODE_ENHANCE_YOUR_CALM;
20 constexpr size_t length = 42;
21 
TEST(EventForwarderTest,ForwardsEventsWithTruePredicate)22 TEST(EventForwarderTest, ForwardsEventsWithTruePredicate) {
23   spdy::test::MockSpdyFramerVisitor receiver;
24   receiver.DelegateHeaderHandling();
25   EventForwarder event_forwarder([]() { return true; }, receiver);
26 
27   EXPECT_CALL(
28       receiver,
29       OnError(Http2DecoderAdapter::SpdyFramerError::SPDY_STOP_PROCESSING,
30               std::string(some_data)));
31   event_forwarder.OnError(
32       Http2DecoderAdapter::SpdyFramerError::SPDY_STOP_PROCESSING,
33       std::string(some_data));
34 
35   EXPECT_CALL(receiver,
36               OnCommonHeader(stream_id, length, /*type=*/0x0, END_STREAM_FLAG));
37   event_forwarder.OnCommonHeader(stream_id, length, /*type=*/0x0,
38                                  END_STREAM_FLAG);
39 
40   EXPECT_CALL(receiver, OnDataFrameHeader(stream_id, length, /*fin=*/true));
41   event_forwarder.OnDataFrameHeader(stream_id, length, /*fin=*/true);
42 
43   EXPECT_CALL(receiver,
44               OnStreamFrameData(stream_id, some_data.data(), some_data.size()));
45   event_forwarder.OnStreamFrameData(stream_id, some_data.data(),
46                                     some_data.size());
47 
48   EXPECT_CALL(receiver, OnStreamEnd(stream_id));
49   event_forwarder.OnStreamEnd(stream_id);
50 
51   EXPECT_CALL(receiver, OnStreamPadLength(stream_id, length));
52   event_forwarder.OnStreamPadLength(stream_id, length);
53 
54   EXPECT_CALL(receiver, OnStreamPadding(stream_id, length));
55   event_forwarder.OnStreamPadding(stream_id, length);
56 
57   EXPECT_CALL(receiver, OnHeaderFrameStart(stream_id));
58   spdy::SpdyHeadersHandlerInterface* handler =
59       event_forwarder.OnHeaderFrameStart(stream_id);
60   EXPECT_EQ(handler, receiver.ReturnTestHeadersHandler(stream_id));
61 
62   EXPECT_CALL(receiver, OnHeaderFrameEnd(stream_id));
63   event_forwarder.OnHeaderFrameEnd(stream_id);
64 
65   EXPECT_CALL(receiver, OnRstStream(stream_id, error_code));
66   event_forwarder.OnRstStream(stream_id, error_code);
67 
68   EXPECT_CALL(receiver, OnSettings());
69   event_forwarder.OnSettings();
70 
71   EXPECT_CALL(
72       receiver,
73       OnSetting(spdy::SpdyKnownSettingsId::SETTINGS_MAX_CONCURRENT_STREAMS,
74                 100));
75   event_forwarder.OnSetting(
76       spdy::SpdyKnownSettingsId::SETTINGS_MAX_CONCURRENT_STREAMS, 100);
77 
78   EXPECT_CALL(receiver, OnSettingsEnd());
79   event_forwarder.OnSettingsEnd();
80 
81   EXPECT_CALL(receiver, OnSettingsAck());
82   event_forwarder.OnSettingsAck();
83 
84   EXPECT_CALL(receiver, OnPing(/*unique_id=*/42, /*is_ack=*/false));
85   event_forwarder.OnPing(/*unique_id=*/42, /*is_ack=*/false);
86 
87   EXPECT_CALL(receiver, OnGoAway(stream_id, error_code));
88   event_forwarder.OnGoAway(stream_id, error_code);
89 
90   EXPECT_CALL(receiver, OnGoAwayFrameData(some_data.data(), some_data.size()));
91   event_forwarder.OnGoAwayFrameData(some_data.data(), some_data.size());
92 
93   EXPECT_CALL(receiver,
94               OnHeaders(stream_id, /*payload_length=*/1234,
95                         /*has_priority=*/false, /*weight=*/42, stream_id + 2,
96                         /*exclusive=*/false, /*fin=*/true, /*end=*/true));
97   event_forwarder.OnHeaders(stream_id, /*payload_length=*/1234,
98                             /*has_priority=*/false, /*weight=*/42,
99                             stream_id + 2, /*exclusive=*/false, /*fin=*/true,
100                             /*end=*/true);
101 
102   EXPECT_CALL(receiver, OnWindowUpdate(stream_id, /*delta_window_size=*/42));
103   event_forwarder.OnWindowUpdate(stream_id, /*delta_window_size=*/42);
104 
105   EXPECT_CALL(receiver, OnPushPromise(stream_id, stream_id + 1, /*end=*/true));
106   event_forwarder.OnPushPromise(stream_id, stream_id + 1, /*end=*/true);
107 
108   EXPECT_CALL(receiver,
109               OnContinuation(stream_id, /*payload_length=*/42, /*end=*/true));
110   event_forwarder.OnContinuation(stream_id, /*payload_length=*/42,
111                                  /*end=*/true);
112 
113   const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
114   EXPECT_CALL(receiver, OnAltSvc(stream_id, some_data, altsvc_vector));
115   event_forwarder.OnAltSvc(stream_id, some_data, altsvc_vector);
116 
117   EXPECT_CALL(receiver, OnPriority(stream_id, stream_id + 2, /*weight=*/42,
118                                    /*exclusive=*/false));
119   event_forwarder.OnPriority(stream_id, stream_id + 2, /*weight=*/42,
120                              /*exclusive=*/false);
121 
122   EXPECT_CALL(receiver, OnPriorityUpdate(stream_id, some_data));
123   event_forwarder.OnPriorityUpdate(stream_id, some_data);
124 
125   EXPECT_CALL(receiver, OnUnknownFrame(stream_id, /*frame_type=*/0x4D));
126   event_forwarder.OnUnknownFrame(stream_id, /*frame_type=*/0x4D);
127 
128   EXPECT_CALL(receiver, OnUnknownFrameStart(stream_id, /*length=*/42,
129                                             /*type=*/0x4D, /*flags=*/0x0));
130   event_forwarder.OnUnknownFrameStart(stream_id, /*length=*/42, /*type=*/0x4D,
131                                       /*flags=*/0x0);
132 }
133 
TEST(EventForwarderTest,DoesNotForwardEventsWithFalsePredicate)134 TEST(EventForwarderTest, DoesNotForwardEventsWithFalsePredicate) {
135   spdy::test::MockSpdyFramerVisitor receiver;
136   receiver.DelegateHeaderHandling();
137   EventForwarder event_forwarder([]() { return false; }, receiver);
138 
139   EXPECT_CALL(receiver, OnError).Times(0);
140   event_forwarder.OnError(
141       Http2DecoderAdapter::SpdyFramerError::SPDY_STOP_PROCESSING,
142       std::string(some_data));
143 
144   EXPECT_CALL(receiver, OnCommonHeader).Times(0);
145   event_forwarder.OnCommonHeader(stream_id, length, /*type=*/0x0,
146                                  END_STREAM_FLAG);
147 
148   EXPECT_CALL(receiver, OnDataFrameHeader).Times(0);
149   event_forwarder.OnDataFrameHeader(stream_id, length, /*fin=*/true);
150 
151   EXPECT_CALL(receiver, OnStreamFrameData).Times(0);
152   event_forwarder.OnStreamFrameData(stream_id, some_data.data(),
153                                     some_data.size());
154 
155   EXPECT_CALL(receiver, OnStreamEnd).Times(0);
156   event_forwarder.OnStreamEnd(stream_id);
157 
158   EXPECT_CALL(receiver, OnStreamPadLength).Times(0);
159   event_forwarder.OnStreamPadLength(stream_id, length);
160 
161   EXPECT_CALL(receiver, OnStreamPadding).Times(0);
162   event_forwarder.OnStreamPadding(stream_id, length);
163 
164   EXPECT_CALL(receiver, OnHeaderFrameStart(stream_id));
165   spdy::SpdyHeadersHandlerInterface* handler =
166       event_forwarder.OnHeaderFrameStart(stream_id);
167   EXPECT_EQ(handler, receiver.ReturnTestHeadersHandler(stream_id));
168 
169   EXPECT_CALL(receiver, OnHeaderFrameEnd).Times(0);
170   event_forwarder.OnHeaderFrameEnd(stream_id);
171 
172   EXPECT_CALL(receiver, OnRstStream).Times(0);
173   event_forwarder.OnRstStream(stream_id, error_code);
174 
175   EXPECT_CALL(receiver, OnSettings).Times(0);
176   event_forwarder.OnSettings();
177 
178   EXPECT_CALL(receiver, OnSetting).Times(0);
179   event_forwarder.OnSetting(
180       spdy::SpdyKnownSettingsId::SETTINGS_MAX_CONCURRENT_STREAMS, 100);
181 
182   EXPECT_CALL(receiver, OnSettingsEnd).Times(0);
183   event_forwarder.OnSettingsEnd();
184 
185   EXPECT_CALL(receiver, OnSettingsAck).Times(0);
186   event_forwarder.OnSettingsAck();
187 
188   EXPECT_CALL(receiver, OnPing).Times(0);
189   event_forwarder.OnPing(/*unique_id=*/42, /*is_ack=*/false);
190 
191   EXPECT_CALL(receiver, OnGoAway).Times(0);
192   event_forwarder.OnGoAway(stream_id, error_code);
193 
194   EXPECT_CALL(receiver, OnGoAwayFrameData).Times(0);
195   event_forwarder.OnGoAwayFrameData(some_data.data(), some_data.size());
196 
197   EXPECT_CALL(receiver, OnHeaders).Times(0);
198   event_forwarder.OnHeaders(stream_id, /*payload_length=*/1234,
199                             /*has_priority=*/false, /*weight=*/42,
200                             stream_id + 2, /*exclusive=*/false, /*fin=*/true,
201                             /*end=*/true);
202 
203   EXPECT_CALL(receiver, OnWindowUpdate).Times(0);
204   event_forwarder.OnWindowUpdate(stream_id, /*delta_window_size=*/42);
205 
206   EXPECT_CALL(receiver, OnPushPromise).Times(0);
207   event_forwarder.OnPushPromise(stream_id, stream_id + 1, /*end=*/true);
208 
209   EXPECT_CALL(receiver, OnContinuation).Times(0);
210   event_forwarder.OnContinuation(stream_id, /*payload_length=*/42,
211                                  /*end=*/true);
212 
213   EXPECT_CALL(receiver, OnAltSvc).Times(0);
214   const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector;
215   event_forwarder.OnAltSvc(stream_id, some_data, altsvc_vector);
216 
217   EXPECT_CALL(receiver, OnPriority).Times(0);
218   event_forwarder.OnPriority(stream_id, stream_id + 2, /*weight=*/42,
219                              /*exclusive=*/false);
220 
221   EXPECT_CALL(receiver, OnPriorityUpdate).Times(0);
222   event_forwarder.OnPriorityUpdate(stream_id, some_data);
223 
224   EXPECT_CALL(receiver, OnUnknownFrame).Times(0);
225   event_forwarder.OnUnknownFrame(stream_id, /*frame_type=*/0x4D);
226 
227   EXPECT_CALL(receiver, OnUnknownFrameStart).Times(0);
228   event_forwarder.OnUnknownFrameStart(stream_id, /*length=*/42, /*type=*/0x4D,
229                                       /*flags=*/0x0);
230 }
231 
232 }  // namespace
233 }  // namespace test
234 }  // namespace adapter
235 }  // namespace http2
236