@ -507,36 +507,36 @@ static void test_source_timer(void) {
/* Близкий сосед, цена дополнительных hops и проблем сравниваются в одних единицах, неизвестный RTT не становится нулём. */
static void test_supplier_score ( void ) {
struct stream_receive_info near = { . rtt_ms = 10 , . path_rtt_ms = 80 , . rtt_valid = 1 , . path_rtt_valid = 1 , . path = { . count = 3 } } ;
struct stream_receive_info far = { . rtt_ms = 45 , . path_rtt_ms = 40 , . rtt_valid = 1 , . path_rtt_valid = 1 , . path = { . count = 2 } } ;
struct stream_receive_info near_peer = { . rtt_ms = 10 , . path_rtt_ms = 80 , . rtt_valid = 1 , . path_rtt_valid = 1 , . path = { . count = 3 } } ;
struct stream_receive_info far_peer = { . rtt_ms = 45 , . path_rtt_ms = 40 , . rtt_valid = 1 , . path_rtt_valid = 1 , . path = { . count = 2 } } ;
struct stream_metric_snapshot clean = { . blocks = 100 } , late = { . blocks = 100 , . late_blocks = 2 } ;
CHECK ( stream_supplier_score ( & near , & clean , 1 ) = = 109 & & stream_supplier_score ( & far , & clean , 1 ) = = 136 ) ;
/* Обычная сумма RTT предпочла бы far (85 < 90); удвоенный RTT соседа предпочитает near. */
CHECK ( stream_supplier_score ( & near , & clean , 1 ) < stream_supplier_score ( & far , & clean , 1 ) ) ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) = = 129 ) ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) < stream_supplier_score ( & far , & clean , 1 ) ) ;
CHECK ( stream_supplier_score ( & near_peer , & clean , 1 ) = = 109 & & stream_supplier_score ( & far_pee r , & clean , 1 ) = = 136 ) ;
/* Обычная сумма RTT предпочла бы far_peer (85 < 90); удвоенный RTT соседа предпочитает near_pee r. */
CHECK ( stream_supplier_score ( & near_peer , & clean , 1 ) < stream_supplier_score ( & far_pee r , & clean , 1 ) ) ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) = = 129 ) ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) < stream_supplier_score ( & far_pee r , & clean , 1 ) ) ;
late . late_blocks = 3 ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) > stream_supplier_score ( & far , & clean , 1 ) ) ;
far = near ; far . rtt_ms = 9 ; far . path . count = 4 ;
CHECK ( stream_supplier_score ( & far , & clean , 1 ) = = 110 ) ;
CHECK ( stream_supplier_score ( & near , & clean , 1 ) < stream_supplier_score ( & far , & clean , 1 ) ) ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) > stream_supplier_score ( & far_pee r , & clean , 1 ) ) ;
far_peer = near_peer ; far_pee r . rtt_ms = 9 ; far_pee r . path . count = 4 ;
CHECK ( stream_supplier_score ( & far_peer , & clean , 1 ) = = 110 ) ;
CHECK ( stream_supplier_score ( & near_peer , & clean , 1 ) < stream_supplier_score ( & far_pee r , & clean , 1 ) ) ;
late = ( struct stream_metric_snapshot ) { . blocks = 4 , . late_blocks = 1 , . stops = 7 } ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) = = 369 ) ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) = = 369 ) ;
late . lag_ms = STREAM_LATE_MS ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) = = 369 ) ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) = = 369 ) ;
late . lag_ms + + ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) = = 1109 ) ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) = = 1109 ) ;
late . lag_ms = 0 ; late . stopped = 1 ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) = = 1109 ) ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) = = 1109 ) ;
late . stopped = 0 ; late . late_blocks = late . blocks ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) = = 1109 ) ; /* История остановок не превышает лимит штрафа. */
CHECK ( stream_supplier_score ( & near , & late , 0 ) = = 109 ) ;
near . rtt_valid = 0 ;
CHECK ( stream_supplier_score ( & near , & clean , 1 ) = = UINT64_MAX ) ;
near . rtt_valid = 1 ; near . path_rtt_valid = 0 ;
CHECK ( stream_supplier_score ( & near , & clean , 1 ) = = UINT64_MAX ) ;
near . path_rtt_valid = 1 ; near . rtt_ms = near . path_rtt_ms = UINT32_MAX ;
CHECK ( stream_supplier_score ( & near , & late , 1 ) = = 3 * ( uint64_t ) UINT32_MAX + 1009 ) ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) = = 1109 ) ; /* История остановок не превышает лимит штрафа. */
CHECK ( stream_supplier_score ( & near_peer , & late , 0 ) = = 109 ) ;
near_peer . rtt_valid = 0 ;
CHECK ( stream_supplier_score ( & near_peer , & clean , 1 ) = = UINT64_MAX ) ;
near_peer . rtt_valid = 1 ; near_pee r . path_rtt_valid = 0 ;
CHECK ( stream_supplier_score ( & near_peer , & clean , 1 ) = = UINT64_MAX ) ;
near_peer . path_rtt_valid = 1 ; near_peer . rtt_ms = near_pee r . path_rtt_ms = UINT32_MAX ;
CHECK ( stream_supplier_score ( & near_peer , & late , 1 ) = = 3 * ( uint64_t ) UINT32_MAX + 1009 ) ;
DEBUG_INFO ( DEBUG_CATEGORY_STREAM , " [PASS] supplier score: nearby peer, hop cost, problem tradeoffs, 1000ms cap, unknown and wide RTT " ) ;
}