@ -48,6 +48,22 @@ static void reset_counters(void) {
g_last_fin_tc = NULL ;
g_last_fin_tc = NULL ;
}
}
static int push_write ( struct tcp_conn * tc , const uint8_t * data , size_t len ) {
size_t offset = 0 ;
while ( offset < len ) {
size_t chunk = len - offset ;
if ( chunk > tc - > write_chunk_size ) chunk = tc - > write_chunk_size ;
struct ll_entry * e = queue_entry_new_from_pool ( tc - > entry_pool ) ;
uint8_t * buf = memory_pool_alloc ( tc - > data_pool ) ;
if ( ! e | | ! buf ) { if ( e ) queue_entry_free ( e ) ; if ( buf ) memory_pool_free ( tc - > data_pool , buf ) ; return - 1 ; }
memcpy ( buf , data + offset , chunk ) ;
e - > dgram = buf ; e - > len = ( uint16_t ) chunk ;
queue_data_put ( tc - > write_queue , e ) ;
offset + = chunk ;
}
return 0 ;
}
static void test_basic_send_recv ( void ) {
static void test_basic_send_recv ( void ) {
TEST_START ( " Basic send and recv via tcp_conn " ) ;
TEST_START ( " Basic send and recv via tcp_conn " ) ;
@ -65,8 +81,8 @@ static void test_basic_send_recv(void) {
// Отправляем данные через tcp_conn
// Отправляем данные через tcp_conn
uint8_t send_buf [ 3000 ] ;
uint8_t send_buf [ 3000 ] ;
memset ( send_buf , ' A ' , sizeof ( send_buf ) ) ;
memset ( send_buf , ' A ' , sizeof ( send_buf ) ) ;
int ret = tcp_conn_ push_write( tc , send_buf , sizeof ( send_buf ) ) ;
int ret = push_write ( tc , send_buf , sizeof ( send_buf ) ) ;
ASSERT_EQ ( ret , 0 , " tcp_conn_ push_write first call failed" ) ;
ASSERT_EQ ( ret , 0 , " push_write first call failed " ) ;
uasync_poll ( ua , 1 ) ; // write_cb должен отправить
uasync_poll ( ua , 1 ) ; // write_cb должен отправить
// Читаем с другой стороны
// Читаем с другой стороны
@ -126,8 +142,8 @@ static void test_partial_write(void) {
ASSERT_TRUE ( big_buf ! = NULL , " malloc failed " ) ;
ASSERT_TRUE ( big_buf ! = NULL , " malloc failed " ) ;
memset ( big_buf , ' X ' , 200000 ) ;
memset ( big_buf , ' X ' , 200000 ) ;
int ret = tcp_conn_ push_write( tc , big_buf , 200000 ) ;
int ret = push_write ( tc , big_buf , 200000 ) ;
ASSERT_EQ ( ret , 0 , " tcp_conn_ push_write large failed" ) ;
ASSERT_EQ ( ret , 0 , " push_write large failed " ) ;
uasync_poll ( ua , 1 ) ; // write_cb отправляет что может
uasync_poll ( ua , 1 ) ; // write_cb отправляет что может
// Дрейним sv[1] и проверяем что все данные приходят
// Дрейним sv[1] и проверяем что все данные приходят