@@ -102,17 +102,52 @@ int mock_write_callback(esp_transport_handle_t transport, const char *request_se
102
102
return len;
103
103
}
104
104
105
- // Callback function for mock_read
105
+ // Callbacks for mocked poll_reed and read functions
106
+ int mock_poll_read_callback (esp_transport_handle_t t, int timeout_ms, int num_call)
107
+ {
108
+ if (num_call) {
109
+ return 0 ;
110
+ }
111
+ return 1 ;
112
+ }
113
+
106
114
int mock_valid_read_callback (esp_transport_handle_t transport, char *buffer, int len, int timeout_ms, int num_call)
107
115
{
116
+ if (num_call) {
117
+ return 0 ;
118
+ }
108
119
std::string websocket_response = make_response ();
109
120
std::memcpy (buffer, websocket_response.data (), websocket_response.size ());
110
121
return websocket_response.size ();
111
122
}
112
123
124
+ // Callback function for mock_read
125
+ int mock_valid_read_fragmented_callback (esp_transport_handle_t t, char *buffer, int len, int timeout_ms, int num_call)
126
+ {
127
+ static int offset = 0 ;
128
+ std::string websocket_response = make_response ();
129
+ if (buffer == nullptr ) {
130
+ return offset == websocket_response.size () ? 0 : 1 ;
131
+ }
132
+ int read_size = 1 ;
133
+ if (offset == websocket_response.size ()) {
134
+ return 0 ;
135
+ }
136
+ std::memcpy (buffer, websocket_response.data () + offset, read_size);
137
+ offset += read_size;
138
+ return read_size;
139
+ }
140
+
141
+ int mock_valid_poll_read_fragmented_callback (esp_transport_handle_t t, int timeout_ms, int num_call)
142
+ {
143
+ return mock_valid_read_fragmented_callback (t, nullptr , 0 , 0 , 0 );
144
+ }
145
+
113
146
}
114
147
115
- void test_ws_connect (bool expect_valid_connection, CMOCK_mock_read_CALLBACK read_callback) {
148
+ void test_ws_connect (bool expect_valid_connection,
149
+ CMOCK_mock_read_CALLBACK read_callback,
150
+ CMOCK_mock_poll_read_CALLBACK poll_read_callback=mock_poll_read_callback) {
116
151
constexpr static auto timeout = 50 ;
117
152
constexpr static auto port = 8080 ;
118
153
constexpr static auto host = " localhost" ;
@@ -128,15 +163,15 @@ void test_ws_connect(bool expect_valid_connection, CMOCK_mock_read_CALLBACK read
128
163
129
164
SECTION (" Successful connection and read data" ) {
130
165
fmt::print (" Attempting to connect to WebSocket\n " );
131
- esp_crypto_sha1_ExpectAnyArgsAndReturn (0 );
166
+ esp_crypto_sha1_ExpectAnyArgsAndReturn (0 );
132
167
esp_crypto_base64_encode_ExpectAnyArgsAndReturn (0 );
133
168
134
169
// Set the callback function for mock_write
135
170
mock_write_Stub (mock_write_callback);
136
171
mock_connect_ExpectAndReturn (parent_handle.get (), host, port, timeout, ESP_OK);
137
172
// Set the callback function for mock_read
138
173
mock_read_Stub (read_callback);
139
- mock_poll_read_ExpectAnyArgsAndReturn ( 1 );
174
+ mock_poll_read_Stub (poll_read_callback );
140
175
esp_crypto_base64_encode_ExpectAnyArgsAndReturn (0 );
141
176
mock_destroy_ExpectAnyArgsAndReturn (ESP_OK);
142
177
@@ -150,7 +185,11 @@ void test_ws_connect(bool expect_valid_connection, CMOCK_mock_read_CALLBACK read
150
185
REQUIRE (esp_transport_connect (websocket_transport.get (), host, port, timeout) == 0 );
151
186
152
187
char buffer[WS_BUFFER_SIZE];
153
- int read_len = esp_transport_read (websocket_transport.get (), buffer, WS_BUFFER_SIZE, timeout);
188
+ int read_len = 0 ;
189
+ int partial_read;
190
+ while ((partial_read = esp_transport_read (websocket_transport.get (), &buffer[read_len], WS_BUFFER_SIZE - read_len, timeout)) > 0 ) {
191
+ read_len+= partial_read;
192
+ }
154
193
fmt::print (" Read result: {}\n " , read_len);
155
194
REQUIRE (read_len > 0 ); // Ensure data is read
156
195
@@ -166,6 +205,12 @@ TEST_CASE("WebSocket Transport Connection", "[websocket_transport]")
166
205
test_ws_connect (true , mock_valid_read_callback);
167
206
}
168
207
208
+ // Happy flow with fragmented reads byte by byte
209
+ TEST_CASE (" ws connect and reads by fragments" , " [websocket_transport]" )
210
+ {
211
+ test_ws_connect (true , mock_valid_read_fragmented_callback, mock_valid_poll_read_fragmented_callback);
212
+ }
213
+
169
214
// Some corner cases where we expect the ws connection to fail
170
215
171
216
TEST_CASE (" ws connect fails (0 len response)" , " [websocket_transport]" )
0 commit comments