@ -676,6 +676,76 @@ TEST_F(levin_notify, local_without_padding)
}
}
TEST_F ( levin_notify , forward_without_padding )
{
cryptonote : : levin : : notify notifier = make_notifier ( 0 , true , false ) ;
for ( unsigned count = 0 ; count < 10 ; + + count )
add_connection ( count % 2 = = 0 ) ;
{
const auto status = notifier . get_status ( ) ;
EXPECT_FALSE ( status . has_noise ) ;
EXPECT_FALSE ( status . connections_filled ) ;
}
notifier . new_out_connection ( ) ;
io_service_ . poll ( ) ;
std : : vector < cryptonote : : blobdata > txs ( 2 ) ;
txs [ 0 ] . resize ( 100 , ' f ' ) ;
txs [ 1 ] . resize ( 200 , ' e ' ) ;
std : : vector < cryptonote : : blobdata > sorted_txs = txs ;
std : : sort ( sorted_txs . begin ( ) , sorted_txs . end ( ) ) ;
ASSERT_EQ ( 10u , contexts_ . size ( ) ) ;
bool has_stemmed = false ;
bool has_fluffed = false ;
while ( ! has_stemmed | | ! has_fluffed )
{
auto context = contexts_ . begin ( ) ;
EXPECT_TRUE ( notifier . send_txs ( txs , context - > get_id ( ) , events_ , cryptonote : : relay_method : : forward ) ) ;
io_service_ . reset ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
const bool is_stem = events_ . has_stem_txes ( ) ;
EXPECT_EQ ( txs , events_ . take_relayed ( is_stem ? cryptonote : : relay_method : : stem : cryptonote : : relay_method : : fluff ) ) ;
if ( ! is_stem )
{
notifier . run_fluff ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
}
std : : size_t send_count = 0 ;
EXPECT_EQ ( 0u , context - > process_send_queue ( ) ) ;
for ( + + context ; context ! = contexts_ . end ( ) ; + + context )
{
const std : : size_t sent = context - > process_send_queue ( ) ;
if ( sent & & is_stem )
EXPECT_EQ ( 1u , ( context - contexts_ . begin ( ) ) % 2 ) ;
send_count + = sent ;
}
EXPECT_EQ ( is_stem ? 1u : 9u , send_count ) ;
ASSERT_EQ ( is_stem ? 1u : 9u , receiver_ . notified_size ( ) ) ;
for ( unsigned count = 0 ; count < ( is_stem ? 1u : 9u ) ; + + count )
{
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
if ( is_stem )
EXPECT_EQ ( txs , notification . txs ) ;
else
EXPECT_EQ ( sorted_txs , notification . txs ) ;
EXPECT_TRUE ( notification . _ . empty ( ) ) ;
EXPECT_EQ ( ! is_stem , notification . dandelionpp_fluff ) ;
}
has_stemmed | = is_stem ;
has_fluffed | = ! is_stem ;
notifier . run_epoch ( ) ;
}
}
TEST_F ( levin_notify , block_without_padding )
{
cryptonote : : levin : : notify notifier = make_notifier ( 0 , true , false ) ;
@ -914,6 +984,73 @@ TEST_F(levin_notify, local_with_padding)
}
}
TEST_F ( levin_notify , forward_with_padding )
{
cryptonote : : levin : : notify notifier = make_notifier ( 0 , true , true ) ;
for ( unsigned count = 0 ; count < 10 ; + + count )
add_connection ( count % 2 = = 0 ) ;
{
const auto status = notifier . get_status ( ) ;
EXPECT_FALSE ( status . has_noise ) ;
EXPECT_FALSE ( status . connections_filled ) ;
}
notifier . new_out_connection ( ) ;
io_service_ . poll ( ) ;
std : : vector < cryptonote : : blobdata > txs ( 2 ) ;
txs [ 0 ] . resize ( 100 , ' e ' ) ;
txs [ 1 ] . resize ( 200 , ' f ' ) ;
ASSERT_EQ ( 10u , contexts_ . size ( ) ) ;
bool has_stemmed = false ;
bool has_fluffed = false ;
while ( ! has_stemmed | | ! has_fluffed )
{
auto context = contexts_ . begin ( ) ;
EXPECT_TRUE ( notifier . send_txs ( txs , context - > get_id ( ) , events_ , cryptonote : : relay_method : : forward ) ) ;
io_service_ . reset ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
const bool is_stem = events_ . has_stem_txes ( ) ;
EXPECT_EQ ( txs , events_ . take_relayed ( is_stem ? cryptonote : : relay_method : : stem : cryptonote : : relay_method : : fluff ) ) ;
if ( ! is_stem )
{
notifier . run_fluff ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
}
std : : size_t send_count = 0 ;
EXPECT_EQ ( 0u , context - > process_send_queue ( ) ) ;
for ( + + context ; context ! = contexts_ . end ( ) ; + + context )
{
const std : : size_t sent = context - > process_send_queue ( ) ;
if ( sent & & is_stem )
{
EXPECT_EQ ( 1u , ( context - contexts_ . begin ( ) ) % 2 ) ;
EXPECT_FALSE ( context - > is_incoming ( ) ) ;
}
send_count + = sent ;
}
EXPECT_EQ ( is_stem ? 1u : 9u , send_count ) ;
ASSERT_EQ ( is_stem ? 1u : 9u , receiver_ . notified_size ( ) ) ;
for ( unsigned count = 0 ; count < ( is_stem ? 1u : 9u ) ; + + count )
{
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_FALSE ( notification . _ . empty ( ) ) ;
EXPECT_EQ ( ! is_stem , notification . dandelionpp_fluff ) ;
}
has_stemmed | = is_stem ;
has_fluffed | = ! is_stem ;
notifier . run_epoch ( ) ;
}
}
TEST_F ( levin_notify , block_with_padding )
{
cryptonote : : levin : : notify notifier = make_notifier ( 0 , true , true ) ;
@ -1017,7 +1154,7 @@ TEST_F(levin_notify, private_fluff_without_padding)
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_TRUE ( notification . _ . empty ( ) ) ;
EXPECT_ FALS E( notification . dandelionpp_fluff ) ;
EXPECT_ TRU E( notification . dandelionpp_fluff ) ;
}
}
}
@ -1053,7 +1190,7 @@ TEST_F(levin_notify, private_stem_without_padding)
io_service_ . reset ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
EXPECT_EQ ( txs , events_ . take_relayed ( cryptonote : : relay_method : : fluff ) ) ;
EXPECT_EQ ( txs , events_ . take_relayed ( cryptonote : : relay_method : : stem ) ) ;
EXPECT_EQ ( 0u , context - > process_send_queue ( ) ) ;
for ( + + context ; context ! = contexts_ . end ( ) ; + + context )
@ -1068,7 +1205,7 @@ TEST_F(levin_notify, private_stem_without_padding)
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_TRUE ( notification . _ . empty ( ) ) ;
EXPECT_ FALS E( notification . dandelionpp_fluff ) ;
EXPECT_ TRU E( notification . dandelionpp_fluff ) ;
}
}
}
@ -1119,7 +1256,58 @@ TEST_F(levin_notify, private_local_without_padding)
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_TRUE ( notification . _ . empty ( ) ) ;
EXPECT_FALSE ( notification . dandelionpp_fluff ) ;
EXPECT_TRUE ( notification . dandelionpp_fluff ) ;
}
}
}
TEST_F ( levin_notify , private_forward_without_padding )
{
// private mode always uses fluff but marked as stem
cryptonote : : levin : : notify notifier = make_notifier ( 0 , false , false ) ;
for ( unsigned count = 0 ; count < 10 ; + + count )
add_connection ( count % 2 = = 0 ) ;
{
const auto status = notifier . get_status ( ) ;
EXPECT_FALSE ( status . has_noise ) ;
EXPECT_FALSE ( status . connections_filled ) ;
}
notifier . new_out_connection ( ) ;
io_service_ . poll ( ) ;
std : : vector < cryptonote : : blobdata > txs ( 2 ) ;
txs [ 0 ] . resize ( 100 , ' e ' ) ;
txs [ 1 ] . resize ( 200 , ' f ' ) ;
ASSERT_EQ ( 10u , contexts_ . size ( ) ) ;
{
auto context = contexts_ . begin ( ) ;
EXPECT_TRUE ( notifier . send_txs ( txs , context - > get_id ( ) , events_ , cryptonote : : relay_method : : forward ) ) ;
io_service_ . reset ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
notifier . run_fluff ( ) ;
io_service_ . reset ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
EXPECT_EQ ( txs , events_ . take_relayed ( cryptonote : : relay_method : : forward ) ) ;
EXPECT_EQ ( 0u , context - > process_send_queue ( ) ) ;
for ( + + context ; context ! = contexts_ . end ( ) ; + + context )
{
const bool is_incoming = ( ( context - contexts_ . begin ( ) ) % 2 = = 0 ) ;
EXPECT_EQ ( is_incoming ? 0u : 1u , context - > process_send_queue ( ) ) ;
}
ASSERT_EQ ( 5u , receiver_ . notified_size ( ) ) ;
for ( unsigned count = 0 ; count < 5 ; + + count )
{
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_TRUE ( notification . _ . empty ( ) ) ;
EXPECT_TRUE ( notification . dandelionpp_fluff ) ;
}
}
}
@ -1229,7 +1417,7 @@ TEST_F(levin_notify, private_fluff_with_padding)
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_FALSE ( notification . _ . empty ( ) ) ;
EXPECT_ FALS E( notification . dandelionpp_fluff ) ;
EXPECT_ TRU E( notification . dandelionpp_fluff ) ;
}
}
}
@ -1264,7 +1452,7 @@ TEST_F(levin_notify, private_stem_with_padding)
io_service_ . reset ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
EXPECT_EQ ( txs , events_ . take_relayed ( cryptonote : : relay_method : : fluff ) ) ;
EXPECT_EQ ( txs , events_ . take_relayed ( cryptonote : : relay_method : : stem ) ) ;
EXPECT_EQ ( 0u , context - > process_send_queue ( ) ) ;
for ( + + context ; context ! = contexts_ . end ( ) ; + + context )
@ -1279,7 +1467,7 @@ TEST_F(levin_notify, private_stem_with_padding)
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_FALSE ( notification . _ . empty ( ) ) ;
EXPECT_ FALS E( notification . dandelionpp_fluff ) ;
EXPECT_ TRU E( notification . dandelionpp_fluff ) ;
}
}
}
@ -1329,7 +1517,57 @@ TEST_F(levin_notify, private_local_with_padding)
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_FALSE ( notification . _ . empty ( ) ) ;
EXPECT_FALSE ( notification . dandelionpp_fluff ) ;
EXPECT_TRUE ( notification . dandelionpp_fluff ) ;
}
}
}
TEST_F ( levin_notify , private_forward_with_padding )
{
cryptonote : : levin : : notify notifier = make_notifier ( 0 , false , true ) ;
for ( unsigned count = 0 ; count < 10 ; + + count )
add_connection ( count % 2 = = 0 ) ;
{
const auto status = notifier . get_status ( ) ;
EXPECT_FALSE ( status . has_noise ) ;
EXPECT_FALSE ( status . connections_filled ) ;
}
notifier . new_out_connection ( ) ;
io_service_ . poll ( ) ;
std : : vector < cryptonote : : blobdata > txs ( 2 ) ;
txs [ 0 ] . resize ( 100 , ' e ' ) ;
txs [ 1 ] . resize ( 200 , ' f ' ) ;
ASSERT_EQ ( 10u , contexts_ . size ( ) ) ;
{
auto context = contexts_ . begin ( ) ;
EXPECT_TRUE ( notifier . send_txs ( txs , context - > get_id ( ) , events_ , cryptonote : : relay_method : : forward ) ) ;
io_service_ . reset ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
notifier . run_fluff ( ) ;
io_service_ . reset ( ) ;
ASSERT_LT ( 0u , io_service_ . poll ( ) ) ;
EXPECT_EQ ( txs , events_ . take_relayed ( cryptonote : : relay_method : : forward ) ) ;
EXPECT_EQ ( 0u , context - > process_send_queue ( ) ) ;
for ( + + context ; context ! = contexts_ . end ( ) ; + + context )
{
const bool is_incoming = ( ( context - contexts_ . begin ( ) ) % 2 = = 0 ) ;
EXPECT_EQ ( is_incoming ? 0u : 1u , context - > process_send_queue ( ) ) ;
}
ASSERT_EQ ( 5u , receiver_ . notified_size ( ) ) ;
for ( unsigned count = 0 ; count < 5 ; + + count )
{
auto notification = receiver_ . get_notification < cryptonote : : NOTIFY_NEW_TRANSACTIONS > ( ) . second ;
EXPECT_EQ ( txs , notification . txs ) ;
EXPECT_FALSE ( notification . _ . empty ( ) ) ;
EXPECT_TRUE ( notification . dandelionpp_fluff ) ;
}
}
}