@ -680,6 +680,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 ) ;
@ -918,6 +988,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 ) ;
@ -1021,7 +1158,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 ) ;
}
}
}
@ -1057,7 +1194,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 )
@ -1072,7 +1209,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 ) ;
}
}
}
@ -1123,7 +1260,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 ) ;
}
}
}
@ -1233,7 +1421,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 ) ;
}
}
}
@ -1268,7 +1456,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 )
@ -1283,7 +1471,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 ) ;
}
}
}
@ -1333,7 +1521,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 ) ;
}
}
}