@@ -1136,6 +1136,10 @@ class Consensus_test : public beast::unit_test::suite
1136
1136
ConsensusParms p;
1137
1137
std::size_t peersUnchanged = 0 ;
1138
1138
1139
+ auto logs = std::make_unique<Logs>(beast::severities::kError );
1140
+ auto j = logs->journal (" Test" );
1141
+ auto clog = std::make_unique<std::stringstream>();
1142
+
1139
1143
// Three cases:
1140
1144
// 1 proposing, initial vote yes
1141
1145
// 2 proposing, initial vote no
@@ -1172,10 +1176,15 @@ class Consensus_test : public beast::unit_test::suite
1172
1176
BEAST_EXPECT (proposingFalse.getOurVote () == false );
1173
1177
BEAST_EXPECT (followingTrue.getOurVote () == true );
1174
1178
BEAST_EXPECT (followingFalse.getOurVote () == false );
1175
- BEAST_EXPECT (!proposingTrue.stalled (p, true , peersUnchanged));
1176
- BEAST_EXPECT (!proposingFalse.stalled (p, true , peersUnchanged));
1177
- BEAST_EXPECT (!followingTrue.stalled (p, false , peersUnchanged));
1178
- BEAST_EXPECT (!followingFalse.stalled (p, false , peersUnchanged));
1179
+ BEAST_EXPECT (
1180
+ !proposingTrue.stalled (p, true , peersUnchanged, j, clog));
1181
+ BEAST_EXPECT (
1182
+ !proposingFalse.stalled (p, true , peersUnchanged, j, clog));
1183
+ BEAST_EXPECT (
1184
+ !followingTrue.stalled (p, false , peersUnchanged, j, clog));
1185
+ BEAST_EXPECT (
1186
+ !followingFalse.stalled (p, false , peersUnchanged, j, clog));
1187
+ BEAST_EXPECT (clog->str () == " " );
1179
1188
1180
1189
// I'm in the majority, my vote should not change
1181
1190
BEAST_EXPECT (!proposingTrue.updateVote (5 , true , p));
@@ -1189,10 +1198,15 @@ class Consensus_test : public beast::unit_test::suite
1189
1198
BEAST_EXPECT (!followingFalse.updateVote (10 , false , p));
1190
1199
1191
1200
peersUnchanged = 2 ;
1192
- BEAST_EXPECT (!proposingTrue.stalled (p, true , peersUnchanged));
1193
- BEAST_EXPECT (!proposingFalse.stalled (p, true , peersUnchanged));
1194
- BEAST_EXPECT (!followingTrue.stalled (p, false , peersUnchanged));
1195
- BEAST_EXPECT (!followingFalse.stalled (p, false , peersUnchanged));
1201
+ BEAST_EXPECT (
1202
+ !proposingTrue.stalled (p, true , peersUnchanged, j, clog));
1203
+ BEAST_EXPECT (
1204
+ !proposingFalse.stalled (p, true , peersUnchanged, j, clog));
1205
+ BEAST_EXPECT (
1206
+ !followingTrue.stalled (p, false , peersUnchanged, j, clog));
1207
+ BEAST_EXPECT (
1208
+ !followingFalse.stalled (p, false , peersUnchanged, j, clog));
1209
+ BEAST_EXPECT (clog->str () == " " );
1196
1210
1197
1211
// Right now, the vote is 51%. The requirement is about to jump to
1198
1212
// 65%
@@ -1282,10 +1296,15 @@ class Consensus_test : public beast::unit_test::suite
1282
1296
BEAST_EXPECT (followingFalse.getOurVote () == false );
1283
1297
1284
1298
peersUnchanged = 3 ;
1285
- BEAST_EXPECT (!proposingTrue.stalled (p, true , peersUnchanged));
1286
- BEAST_EXPECT (!proposingFalse.stalled (p, true , peersUnchanged));
1287
- BEAST_EXPECT (!followingTrue.stalled (p, false , peersUnchanged));
1288
- BEAST_EXPECT (!followingFalse.stalled (p, false , peersUnchanged));
1299
+ BEAST_EXPECT (
1300
+ !proposingTrue.stalled (p, true , peersUnchanged, j, clog));
1301
+ BEAST_EXPECT (
1302
+ !proposingFalse.stalled (p, true , peersUnchanged, j, clog));
1303
+ BEAST_EXPECT (
1304
+ !followingTrue.stalled (p, false , peersUnchanged, j, clog));
1305
+ BEAST_EXPECT (
1306
+ !followingFalse.stalled (p, false , peersUnchanged, j, clog));
1307
+ BEAST_EXPECT (clog->str () == " " );
1289
1308
1290
1309
// Threshold jumps to 95%
1291
1310
BEAST_EXPECT (proposingTrue.updateVote (220 , true , p));
@@ -1322,12 +1341,60 @@ class Consensus_test : public beast::unit_test::suite
1322
1341
1323
1342
for (peersUnchanged = 0 ; peersUnchanged < 6 ; ++peersUnchanged)
1324
1343
{
1325
- BEAST_EXPECT (!proposingTrue.stalled (p, true , peersUnchanged));
1326
- BEAST_EXPECT (!proposingFalse.stalled (p, true , peersUnchanged));
1327
- BEAST_EXPECT (!followingTrue.stalled (p, false , peersUnchanged));
1328
- BEAST_EXPECT (!followingFalse.stalled (p, false , peersUnchanged));
1344
+ BEAST_EXPECT (
1345
+ !proposingTrue.stalled (p, true , peersUnchanged, j, clog));
1346
+ BEAST_EXPECT (
1347
+ !proposingFalse.stalled (p, true , peersUnchanged, j, clog));
1348
+ BEAST_EXPECT (
1349
+ !followingTrue.stalled (p, false , peersUnchanged, j, clog));
1350
+ BEAST_EXPECT (
1351
+ !followingFalse.stalled (p, false , peersUnchanged, j, clog));
1352
+ BEAST_EXPECT (clog->str () == " " );
1329
1353
}
1330
1354
1355
+ auto expectStalled = [this , &clog](
1356
+ int txid,
1357
+ bool ourVote,
1358
+ int ourTime,
1359
+ int peerTime,
1360
+ int support,
1361
+ std::uint32_t line) {
1362
+ using namespace std ::string_literals;
1363
+
1364
+ auto const s = clog->str ();
1365
+ expect (s.find (" stalled" ), s, __FILE__, line);
1366
+ expect (
1367
+ s.starts_with (" Transaction " s + std::to_string (txid)),
1368
+ s,
1369
+ __FILE__,
1370
+ line);
1371
+ expect (
1372
+ s.find (" voting " s + (ourVote ? " YES" : " NO" )) != s.npos ,
1373
+ s,
1374
+ __FILE__,
1375
+ line);
1376
+ expect (
1377
+ s.find (" for " s + std::to_string (ourTime) + " rounds." s) !=
1378
+ s.npos ,
1379
+ s,
1380
+ __FILE__,
1381
+ line);
1382
+ expect (
1383
+ s.find (
1384
+ " votes in " s + std::to_string (peerTime) + " rounds." ) !=
1385
+ s.npos ,
1386
+ s,
1387
+ __FILE__,
1388
+ line);
1389
+ expect (
1390
+ s.ends_with (
1391
+ " has " s + std::to_string (support) + " % support. " s),
1392
+ s,
1393
+ __FILE__,
1394
+ line);
1395
+ clog = std::make_unique<std::stringstream>();
1396
+ };
1397
+
1331
1398
for (int i = 0 ; i < 1 ; ++i)
1332
1399
{
1333
1400
BEAST_EXPECT (!proposingTrue.updateVote (250 + 10 * i, true , p));
@@ -1342,22 +1409,34 @@ class Consensus_test : public beast::unit_test::suite
1342
1409
BEAST_EXPECT (followingFalse.getOurVote () == false );
1343
1410
1344
1411
// true vote has changed recently, so not stalled
1345
- BEAST_EXPECT (!proposingTrue.stalled (p, true , 0 ));
1412
+ BEAST_EXPECT (!proposingTrue.stalled (p, true , 0 , j, clog));
1413
+ BEAST_EXPECT (clog->str () == " " );
1346
1414
// remaining votes have been unchanged in so long that we only
1347
1415
// need to hit the second round at 95% to be stalled, regardless
1348
1416
// of peers
1349
- BEAST_EXPECT (proposingFalse.stalled (p, true , 0 ));
1350
- BEAST_EXPECT (followingTrue.stalled (p, false , 0 ));
1351
- BEAST_EXPECT (followingFalse.stalled (p, false , 0 ));
1417
+ BEAST_EXPECT (proposingFalse.stalled (p, true , 0 , j, clog));
1418
+ expectStalled (98 , false , 11 , 0 , 2 , __LINE__);
1419
+ BEAST_EXPECT (followingTrue.stalled (p, false , 0 , j, clog));
1420
+ expectStalled (97 , true , 11 , 0 , 97 , __LINE__);
1421
+ BEAST_EXPECT (followingFalse.stalled (p, false , 0 , j, clog));
1422
+ expectStalled (96 , false , 11 , 0 , 3 , __LINE__);
1352
1423
1353
1424
// true vote has changed recently, so not stalled
1354
- BEAST_EXPECT (!proposingTrue.stalled (p, true , peersUnchanged));
1425
+ BEAST_EXPECT (
1426
+ !proposingTrue.stalled (p, true , peersUnchanged, j, clog));
1427
+ BEAST_EXPECTS (clog->str () == " " , clog->str ());
1355
1428
// remaining votes have been unchanged in so long that we only
1356
1429
// need to hit the second round at 95% to be stalled, regardless
1357
1430
// of peers
1358
- BEAST_EXPECT (proposingFalse.stalled (p, true , peersUnchanged));
1359
- BEAST_EXPECT (followingTrue.stalled (p, false , peersUnchanged));
1360
- BEAST_EXPECT (followingFalse.stalled (p, false , peersUnchanged));
1431
+ BEAST_EXPECT (
1432
+ proposingFalse.stalled (p, true , peersUnchanged, j, clog));
1433
+ expectStalled (98 , false , 11 , 6 , 2 , __LINE__);
1434
+ BEAST_EXPECT (
1435
+ followingTrue.stalled (p, false , peersUnchanged, j, clog));
1436
+ expectStalled (97 , true , 11 , 6 , 97 , __LINE__);
1437
+ BEAST_EXPECT (
1438
+ followingFalse.stalled (p, false , peersUnchanged, j, clog));
1439
+ expectStalled (96 , false , 11 , 6 , 3 , __LINE__);
1361
1440
}
1362
1441
for (int i = 1 ; i < 3 ; ++i)
1363
1442
{
@@ -1374,19 +1453,31 @@ class Consensus_test : public beast::unit_test::suite
1374
1453
1375
1454
// true vote changed 2 rounds ago, and peers are changing, so
1376
1455
// not stalled
1377
- BEAST_EXPECT (!proposingTrue.stalled (p, true , 0 ));
1456
+ BEAST_EXPECT (!proposingTrue.stalled (p, true , 0 , j, clog));
1457
+ BEAST_EXPECTS (clog->str () == " " , clog->str ());
1378
1458
// still stalled
1379
- BEAST_EXPECT (proposingFalse.stalled (p, true , 0 ));
1380
- BEAST_EXPECT (followingTrue.stalled (p, false , 0 ));
1381
- BEAST_EXPECT (followingFalse.stalled (p, false , 0 ));
1459
+ BEAST_EXPECT (proposingFalse.stalled (p, true , 0 , j, clog));
1460
+ expectStalled (98 , false , 11 + i, 0 , 2 , __LINE__);
1461
+ BEAST_EXPECT (followingTrue.stalled (p, false , 0 , j, clog));
1462
+ expectStalled (97 , true , 11 + i, 0 , 97 , __LINE__);
1463
+ BEAST_EXPECT (followingFalse.stalled (p, false , 0 , j, clog));
1464
+ expectStalled (96 , false , 11 + i, 0 , 3 , __LINE__);
1382
1465
1383
1466
// true vote changed 2 rounds ago, and peers are NOT changing,
1384
1467
// so stalled
1385
- BEAST_EXPECT (proposingTrue.stalled (p, true , peersUnchanged));
1468
+ BEAST_EXPECT (
1469
+ proposingTrue.stalled (p, true , peersUnchanged, j, clog));
1470
+ expectStalled (99 , true , 1 + i, 6 , 97 , __LINE__);
1386
1471
// still stalled
1387
- BEAST_EXPECT (proposingFalse.stalled (p, true , peersUnchanged));
1388
- BEAST_EXPECT (followingTrue.stalled (p, false , peersUnchanged));
1389
- BEAST_EXPECT (followingFalse.stalled (p, false , peersUnchanged));
1472
+ BEAST_EXPECT (
1473
+ proposingFalse.stalled (p, true , peersUnchanged, j, clog));
1474
+ expectStalled (98 , false , 11 + i, 6 , 2 , __LINE__);
1475
+ BEAST_EXPECT (
1476
+ followingTrue.stalled (p, false , peersUnchanged, j, clog));
1477
+ expectStalled (97 , true , 11 + i, 6 , 97 , __LINE__);
1478
+ BEAST_EXPECT (
1479
+ followingFalse.stalled (p, false , peersUnchanged, j, clog));
1480
+ expectStalled (96 , false , 11 + i, 6 , 3 , __LINE__);
1390
1481
}
1391
1482
for (int i = 3 ; i < 5 ; ++i)
1392
1483
{
@@ -1401,15 +1492,27 @@ class Consensus_test : public beast::unit_test::suite
1401
1492
BEAST_EXPECT (followingTrue.getOurVote () == true );
1402
1493
BEAST_EXPECT (followingFalse.getOurVote () == false );
1403
1494
1404
- BEAST_EXPECT (proposingTrue.stalled (p, true , 0 ));
1405
- BEAST_EXPECT (proposingFalse.stalled (p, true , 0 ));
1406
- BEAST_EXPECT (followingTrue.stalled (p, false , 0 ));
1407
- BEAST_EXPECT (followingFalse.stalled (p, false , 0 ));
1495
+ BEAST_EXPECT (proposingTrue.stalled (p, true , 0 , j, clog));
1496
+ expectStalled (99 , true , 1 + i, 0 , 97 , __LINE__);
1497
+ BEAST_EXPECT (proposingFalse.stalled (p, true , 0 , j, clog));
1498
+ expectStalled (98 , false , 11 + i, 0 , 2 , __LINE__);
1499
+ BEAST_EXPECT (followingTrue.stalled (p, false , 0 , j, clog));
1500
+ expectStalled (97 , true , 11 + i, 0 , 97 , __LINE__);
1501
+ BEAST_EXPECT (followingFalse.stalled (p, false , 0 , j, clog));
1502
+ expectStalled (96 , false , 11 + i, 0 , 3 , __LINE__);
1408
1503
1409
- BEAST_EXPECT (proposingTrue.stalled (p, true , peersUnchanged));
1410
- BEAST_EXPECT (proposingFalse.stalled (p, true , peersUnchanged));
1411
- BEAST_EXPECT (followingTrue.stalled (p, false , peersUnchanged));
1412
- BEAST_EXPECT (followingFalse.stalled (p, false , peersUnchanged));
1504
+ BEAST_EXPECT (
1505
+ proposingTrue.stalled (p, true , peersUnchanged, j, clog));
1506
+ expectStalled (99 , true , 1 + i, 6 , 97 , __LINE__);
1507
+ BEAST_EXPECT (
1508
+ proposingFalse.stalled (p, true , peersUnchanged, j, clog));
1509
+ expectStalled (98 , false , 11 + i, 6 , 2 , __LINE__);
1510
+ BEAST_EXPECT (
1511
+ followingTrue.stalled (p, false , peersUnchanged, j, clog));
1512
+ expectStalled (97 , true , 11 + i, 6 , 97 , __LINE__);
1513
+ BEAST_EXPECT (
1514
+ followingFalse.stalled (p, false , peersUnchanged, j, clog));
1515
+ expectStalled (96 , false , 11 + i, 6 , 3 , __LINE__);
1413
1516
}
1414
1517
}
1415
1518
}
0 commit comments