1117 SCOPED_TRACE(
"disputes");
1119 using namespace csf;
1122 using Dispute = CsfDisputedTx;
1124 Tx
const txTrue{99};
1125 Tx
const txFalse{98};
1126 Tx
const txFollowingTrue{97};
1127 Tx
const txFollowingFalse{96};
1128 int const numPeers = 100;
1140 Dispute proposingTrue = makeDisputedTx(txTrue,
true, numPeers);
1141 Dispute proposingFalse = makeDisputedTx(txFalse,
false, numPeers);
1142 Dispute followingTrue = makeDisputedTx(txFollowingTrue,
true, numPeers);
1143 Dispute followingFalse = makeDisputedTx(txFollowingFalse,
false, numPeers);
1144 EXPECT_TRUE(proposingTrue.id() == 99);
1145 EXPECT_TRUE(proposingFalse.id() == 98);
1146 EXPECT_TRUE(followingTrue.id() == 97);
1147 EXPECT_TRUE(followingFalse.id() == 96);
1150 for (
int i = 0; i < numPeers; ++i)
1152 EXPECT_TRUE(proposingTrue.setVote(PeerID(i), i < 50));
1153 EXPECT_TRUE(proposingFalse.setVote(PeerID(i), i < 50));
1154 EXPECT_TRUE(followingTrue.setVote(PeerID(i), i < 50));
1155 EXPECT_TRUE(followingFalse.setVote(PeerID(i), i < 50));
1158 EXPECT_TRUE(proposingTrue.setVote(PeerID(50),
true));
1159 EXPECT_TRUE(proposingFalse.setVote(PeerID(49),
false));
1160 EXPECT_TRUE(followingTrue.setVote(PeerID(50),
true));
1161 EXPECT_TRUE(followingFalse.setVote(PeerID(49),
false));
1164 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1165 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1166 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1167 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1168 EXPECT_TRUE(!isStalled(proposingTrue, p,
true, peersUnchanged,
clog));
1169 EXPECT_TRUE(!isStalled(proposingFalse, p,
true, peersUnchanged,
clog));
1170 EXPECT_TRUE(!isStalled(followingTrue, p,
false, peersUnchanged,
clog));
1171 EXPECT_TRUE(!isStalled(followingFalse, p,
false, peersUnchanged,
clog));
1172 EXPECT_TRUE(
clog->str().empty());
1175 EXPECT_TRUE(!proposingTrue.updateVote(5,
true, p));
1176 EXPECT_TRUE(!proposingFalse.updateVote(5,
true, p));
1177 EXPECT_TRUE(!followingTrue.updateVote(5,
false, p));
1178 EXPECT_TRUE(!followingFalse.updateVote(5,
false, p));
1180 EXPECT_TRUE(!proposingTrue.updateVote(10,
true, p));
1181 EXPECT_TRUE(!proposingFalse.updateVote(10,
true, p));
1182 EXPECT_TRUE(!followingTrue.updateVote(10,
false, p));
1183 EXPECT_TRUE(!followingFalse.updateVote(10,
false, p));
1186 EXPECT_TRUE(!isStalled(proposingTrue, p,
true, peersUnchanged,
clog));
1187 EXPECT_TRUE(!isStalled(proposingFalse, p,
true, peersUnchanged,
clog));
1188 EXPECT_TRUE(!isStalled(followingTrue, p,
false, peersUnchanged,
clog));
1189 EXPECT_TRUE(!isStalled(followingFalse, p,
false, peersUnchanged,
clog));
1190 EXPECT_TRUE(
clog->str().empty());
1194 EXPECT_TRUE(proposingTrue.updateVote(55,
true, p));
1195 EXPECT_TRUE(!proposingFalse.updateVote(55,
true, p));
1196 EXPECT_TRUE(!followingTrue.updateVote(55,
false, p));
1197 EXPECT_TRUE(!followingFalse.updateVote(55,
false, p));
1199 EXPECT_TRUE(proposingTrue.getOurVote() ==
false);
1200 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1201 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1202 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1204 for (
int i = 0; i < 16; ++i)
1206 auto pTrue = PeerID(numPeers - i - 1);
1207 auto pFalse = PeerID(i);
1208 EXPECT_TRUE(proposingTrue.setVote(pTrue,
true));
1209 EXPECT_TRUE(proposingFalse.setVote(pFalse,
false));
1210 EXPECT_TRUE(followingTrue.setVote(pTrue,
true));
1211 EXPECT_TRUE(followingFalse.setVote(pFalse,
false));
1214 EXPECT_TRUE(proposingTrue.updateVote(60,
true, p));
1215 EXPECT_TRUE(!proposingFalse.updateVote(60,
true, p));
1216 EXPECT_TRUE(!followingTrue.updateVote(60,
false, p));
1217 EXPECT_TRUE(!followingFalse.updateVote(60,
false, p));
1219 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1220 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1221 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1222 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1225 EXPECT_TRUE(proposingTrue.updateVote(86,
true, p));
1226 EXPECT_TRUE(!proposingFalse.updateVote(86,
true, p));
1227 EXPECT_TRUE(!followingTrue.updateVote(86,
false, p));
1228 EXPECT_TRUE(!followingFalse.updateVote(86,
false, p));
1230 EXPECT_TRUE(proposingTrue.getOurVote() ==
false);
1231 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1232 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1233 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1236 for (
int i = 16; i < 21; ++i)
1238 auto pTrue = PeerID(numPeers - i - 1);
1239 auto pFalse = PeerID(i);
1240 EXPECT_TRUE(proposingTrue.setVote(pTrue,
true));
1241 EXPECT_TRUE(proposingFalse.setVote(pFalse,
false));
1242 EXPECT_TRUE(followingTrue.setVote(pTrue,
true));
1243 EXPECT_TRUE(followingFalse.setVote(pFalse,
false));
1247 EXPECT_TRUE(proposingTrue.updateVote(90,
true, p));
1248 EXPECT_TRUE(!proposingFalse.updateVote(90,
true, p));
1249 EXPECT_TRUE(!followingTrue.updateVote(90,
false, p));
1250 EXPECT_TRUE(!followingFalse.updateVote(90,
false, p));
1252 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1253 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1254 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1255 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1258 EXPECT_TRUE(!proposingTrue.updateVote(150,
true, p));
1259 EXPECT_TRUE(!proposingFalse.updateVote(150,
true, p));
1260 EXPECT_TRUE(!followingTrue.updateVote(150,
false, p));
1261 EXPECT_TRUE(!followingFalse.updateVote(150,
false, p));
1263 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1264 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1265 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1266 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1269 EXPECT_TRUE(!proposingTrue.updateVote(190,
true, p));
1270 EXPECT_TRUE(!proposingFalse.updateVote(190,
true, p));
1271 EXPECT_TRUE(!followingTrue.updateVote(190,
false, p));
1272 EXPECT_TRUE(!followingFalse.updateVote(190,
false, p));
1274 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1275 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1276 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1277 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1280 EXPECT_TRUE(!isStalled(proposingTrue, p,
true, peersUnchanged,
clog));
1281 EXPECT_TRUE(!isStalled(proposingFalse, p,
true, peersUnchanged,
clog));
1282 EXPECT_TRUE(!isStalled(followingTrue, p,
false, peersUnchanged,
clog));
1283 EXPECT_TRUE(!isStalled(followingFalse, p,
false, peersUnchanged,
clog));
1284 EXPECT_TRUE(
clog->str().empty());
1287 EXPECT_TRUE(proposingTrue.updateVote(220,
true, p));
1288 EXPECT_TRUE(!proposingFalse.updateVote(220,
true, p));
1289 EXPECT_TRUE(!followingTrue.updateVote(220,
false, p));
1290 EXPECT_TRUE(!followingFalse.updateVote(220,
false, p));
1292 EXPECT_TRUE(proposingTrue.getOurVote() ==
false);
1293 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1294 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1295 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1298 for (
int i = 21; i < 46; ++i)
1300 auto pTrue = PeerID(numPeers - i - 1);
1301 auto pFalse = PeerID(i);
1302 EXPECT_TRUE(proposingTrue.setVote(pTrue,
true));
1303 EXPECT_TRUE(proposingFalse.setVote(pFalse,
false));
1304 EXPECT_TRUE(followingTrue.setVote(pTrue,
true));
1305 EXPECT_TRUE(followingFalse.setVote(pFalse,
false));
1309 EXPECT_TRUE(proposingTrue.updateVote(250,
true, p));
1310 EXPECT_TRUE(!proposingFalse.updateVote(250,
true, p));
1311 EXPECT_TRUE(!followingTrue.updateVote(250,
false, p));
1312 EXPECT_TRUE(!followingFalse.updateVote(250,
false, p));
1314 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1315 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1316 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1317 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1319 for (peersUnchanged = 0; peersUnchanged < 6; ++peersUnchanged)
1321 EXPECT_TRUE(!isStalled(proposingTrue, p,
true, peersUnchanged,
clog));
1322 EXPECT_TRUE(!isStalled(proposingFalse, p,
true, peersUnchanged,
clog));
1323 EXPECT_TRUE(!isStalled(followingTrue, p,
false, peersUnchanged,
clog));
1324 EXPECT_TRUE(!isStalled(followingFalse, p,
false, peersUnchanged,
clog));
1325 EXPECT_TRUE(
clog->str().empty());
1328 auto expectStalled = [&
clog](
1335 using namespace std::string_literals;
1337 auto const s =
clog->str();
1338 SCOPED_TRACE(::testing::Message() << __FILE__ <<
":" << line);
1339 EXPECT_NE(s.find(
"stalled"), s.npos) << s;
1340 EXPECT_TRUE(s.starts_with(
"Transaction "s +
std::to_string(txid))) << s;
1341 EXPECT_NE(s.find(
"voting "s + (ourVote ?
"YES" :
"NO")), s.npos) << s;
1342 EXPECT_NE(s.find(
"for "s +
std::to_string(ourTime) +
" rounds."s), s.npos) << s;
1343 EXPECT_NE(s.find(
"votes in "s +
std::to_string(peerTime) +
" rounds."), s.npos) << s;
1344 EXPECT_TRUE(s.ends_with(
"has "s +
std::to_string(support) +
"% support. "s)) << s;
1348 for (
int i = 0; i < 1; ++i)
1350 EXPECT_TRUE(!proposingTrue.updateVote(250 + (10 * i),
true, p));
1351 EXPECT_TRUE(!proposingFalse.updateVote(250 + (10 * i),
true, p));
1352 EXPECT_TRUE(!followingTrue.updateVote(250 + (10 * i),
false, p));
1353 EXPECT_TRUE(!followingFalse.updateVote(250 + (10 * i),
false, p));
1355 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1356 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1357 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1358 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1361 EXPECT_TRUE(!isStalled(proposingTrue, p,
true, 0,
clog));
1362 EXPECT_TRUE(
clog->str().empty());
1366 EXPECT_TRUE(isStalled(proposingFalse, p,
true, 0,
clog));
1367 expectStalled(98,
false, 11, 0, 2, __LINE__);
1368 EXPECT_TRUE(isStalled(followingTrue, p,
false, 0,
clog));
1369 expectStalled(97,
true, 11, 0, 97, __LINE__);
1370 EXPECT_TRUE(isStalled(followingFalse, p,
false, 0,
clog));
1371 expectStalled(96,
false, 11, 0, 3, __LINE__);
1374 EXPECT_TRUE(!isStalled(proposingTrue, p,
true, peersUnchanged,
clog));
1375 EXPECT_TRUE(
clog->str().empty()) <<
clog->str();
1379 EXPECT_TRUE(isStalled(proposingFalse, p,
true, peersUnchanged,
clog));
1380 expectStalled(98,
false, 11, 6, 2, __LINE__);
1381 EXPECT_TRUE(isStalled(followingTrue, p,
false, peersUnchanged,
clog));
1382 expectStalled(97,
true, 11, 6, 97, __LINE__);
1383 EXPECT_TRUE(isStalled(followingFalse, p,
false, peersUnchanged,
clog));
1384 expectStalled(96,
false, 11, 6, 3, __LINE__);
1386 for (
int i = 1; i < 3; ++i)
1388 EXPECT_TRUE(!proposingTrue.updateVote(250 + (10 * i),
true, p));
1389 EXPECT_TRUE(!proposingFalse.updateVote(250 + (10 * i),
true, p));
1390 EXPECT_TRUE(!followingTrue.updateVote(250 + (10 * i),
false, p));
1391 EXPECT_TRUE(!followingFalse.updateVote(250 + (10 * i),
false, p));
1393 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1394 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1395 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1396 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1400 EXPECT_TRUE(!isStalled(proposingTrue, p,
true, 0,
clog));
1401 EXPECT_TRUE(
clog->str().empty()) <<
clog->str();
1403 EXPECT_TRUE(isStalled(proposingFalse, p,
true, 0,
clog));
1404 expectStalled(98,
false, 11 + i, 0, 2, __LINE__);
1405 EXPECT_TRUE(isStalled(followingTrue, p,
false, 0,
clog));
1406 expectStalled(97,
true, 11 + i, 0, 97, __LINE__);
1407 EXPECT_TRUE(isStalled(followingFalse, p,
false, 0,
clog));
1408 expectStalled(96,
false, 11 + i, 0, 3, __LINE__);
1412 EXPECT_TRUE(isStalled(proposingTrue, p,
true, peersUnchanged,
clog));
1413 expectStalled(99,
true, 1 + i, 6, 97, __LINE__);
1415 EXPECT_TRUE(isStalled(proposingFalse, p,
true, peersUnchanged,
clog));
1416 expectStalled(98,
false, 11 + i, 6, 2, __LINE__);
1417 EXPECT_TRUE(isStalled(followingTrue, p,
false, peersUnchanged,
clog));
1418 expectStalled(97,
true, 11 + i, 6, 97, __LINE__);
1419 EXPECT_TRUE(isStalled(followingFalse, p,
false, peersUnchanged,
clog));
1420 expectStalled(96,
false, 11 + i, 6, 3, __LINE__);
1422 for (
int i = 3; i < 5; ++i)
1424 EXPECT_TRUE(!proposingTrue.updateVote(250 + (10 * i),
true, p));
1425 EXPECT_TRUE(!proposingFalse.updateVote(250 + (10 * i),
true, p));
1426 EXPECT_TRUE(!followingTrue.updateVote(250 + (10 * i),
false, p));
1427 EXPECT_TRUE(!followingFalse.updateVote(250 + (10 * i),
false, p));
1429 EXPECT_TRUE(proposingTrue.getOurVote() ==
true);
1430 EXPECT_TRUE(proposingFalse.getOurVote() ==
false);
1431 EXPECT_TRUE(followingTrue.getOurVote() ==
true);
1432 EXPECT_TRUE(followingFalse.getOurVote() ==
false);
1434 EXPECT_TRUE(isStalled(proposingTrue, p,
true, 0,
clog));
1435 expectStalled(99,
true, 1 + i, 0, 97, __LINE__);
1436 EXPECT_TRUE(isStalled(proposingFalse, p,
true, 0,
clog));
1437 expectStalled(98,
false, 11 + i, 0, 2, __LINE__);
1438 EXPECT_TRUE(isStalled(followingTrue, p,
false, 0,
clog));
1439 expectStalled(97,
true, 11 + i, 0, 97, __LINE__);
1440 EXPECT_TRUE(isStalled(followingFalse, p,
false, 0,
clog));
1441 expectStalled(96,
false, 11 + i, 0, 3, __LINE__);
1443 EXPECT_TRUE(isStalled(proposingTrue, p,
true, peersUnchanged,
clog));
1444 expectStalled(99,
true, 1 + i, 6, 97, __LINE__);
1445 EXPECT_TRUE(isStalled(proposingFalse, p,
true, peersUnchanged,
clog));
1446 expectStalled(98,
false, 11 + i, 6, 2, __LINE__);
1447 EXPECT_TRUE(isStalled(followingTrue, p,
false, peersUnchanged,
clog));
1448 expectStalled(97,
true, 11 + i, 6, 97, __LINE__);
1449 EXPECT_TRUE(isStalled(followingFalse, p,
false, peersUnchanged,
clog));
1450 expectStalled(96,
false, 11 + i, 6, 3, __LINE__);