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