1028 testcase(
"disputes");
1030 using namespace csf;
1035 Tx
const txTrue{99};
1036 Tx
const txFalse{98};
1037 Tx
const txFollowingTrue{97};
1038 Tx
const txFollowingFalse{96};
1039 int const numPeers = 100;
1044 auto j = logs->journal(
"Test");
1053 Dispute proposingTrue{txTrue.id(),
true, numPeers, journal_};
1054 Dispute proposingFalse{txFalse.id(),
false, numPeers, journal_};
1055 Dispute followingTrue{txFollowingTrue.id(),
true, numPeers, journal_};
1056 Dispute followingFalse{txFollowingFalse.id(),
false, numPeers, journal_};
1057 BEAST_EXPECT(proposingTrue.ID() == 99);
1058 BEAST_EXPECT(proposingFalse.ID() == 98);
1059 BEAST_EXPECT(followingTrue.ID() == 97);
1060 BEAST_EXPECT(followingFalse.ID() == 96);
1063 for (
int i = 0; i < numPeers; ++i)
1065 BEAST_EXPECT(proposingTrue.setVote(PeerID(i), i < 50));
1066 BEAST_EXPECT(proposingFalse.setVote(PeerID(i), i < 50));
1067 BEAST_EXPECT(followingTrue.setVote(PeerID(i), i < 50));
1068 BEAST_EXPECT(followingFalse.setVote(PeerID(i), i < 50));
1071 BEAST_EXPECT(proposingTrue.setVote(PeerID(50),
true));
1072 BEAST_EXPECT(proposingFalse.setVote(PeerID(49),
false));
1073 BEAST_EXPECT(followingTrue.setVote(PeerID(50),
true));
1074 BEAST_EXPECT(followingFalse.setVote(PeerID(49),
false));
1077 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1078 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1079 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1080 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1081 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged, j,
clog));
1082 BEAST_EXPECT(!proposingFalse.stalled(p,
true, peersUnchanged, j,
clog));
1083 BEAST_EXPECT(!followingTrue.stalled(p,
false, peersUnchanged, j,
clog));
1084 BEAST_EXPECT(!followingFalse.stalled(p,
false, peersUnchanged, j,
clog));
1085 BEAST_EXPECT(
clog->str() ==
"");
1088 BEAST_EXPECT(!proposingTrue.updateVote(5,
true, p));
1089 BEAST_EXPECT(!proposingFalse.updateVote(5,
true, p));
1090 BEAST_EXPECT(!followingTrue.updateVote(5,
false, p));
1091 BEAST_EXPECT(!followingFalse.updateVote(5,
false, p));
1093 BEAST_EXPECT(!proposingTrue.updateVote(10,
true, p));
1094 BEAST_EXPECT(!proposingFalse.updateVote(10,
true, p));
1095 BEAST_EXPECT(!followingTrue.updateVote(10,
false, p));
1096 BEAST_EXPECT(!followingFalse.updateVote(10,
false, p));
1099 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged, j,
clog));
1100 BEAST_EXPECT(!proposingFalse.stalled(p,
true, peersUnchanged, j,
clog));
1101 BEAST_EXPECT(!followingTrue.stalled(p,
false, peersUnchanged, j,
clog));
1102 BEAST_EXPECT(!followingFalse.stalled(p,
false, peersUnchanged, j,
clog));
1103 BEAST_EXPECT(
clog->str() ==
"");
1107 BEAST_EXPECT(proposingTrue.updateVote(55,
true, p));
1108 BEAST_EXPECT(!proposingFalse.updateVote(55,
true, p));
1109 BEAST_EXPECT(!followingTrue.updateVote(55,
false, p));
1110 BEAST_EXPECT(!followingFalse.updateVote(55,
false, p));
1112 BEAST_EXPECT(proposingTrue.getOurVote() ==
false);
1113 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1114 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1115 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1117 for (
int i = 0; i < 16; ++i)
1119 auto pTrue = PeerID(numPeers - i - 1);
1120 auto pFalse = PeerID(i);
1121 BEAST_EXPECT(proposingTrue.setVote(pTrue,
true));
1122 BEAST_EXPECT(proposingFalse.setVote(pFalse,
false));
1123 BEAST_EXPECT(followingTrue.setVote(pTrue,
true));
1124 BEAST_EXPECT(followingFalse.setVote(pFalse,
false));
1127 BEAST_EXPECT(proposingTrue.updateVote(60,
true, p));
1128 BEAST_EXPECT(!proposingFalse.updateVote(60,
true, p));
1129 BEAST_EXPECT(!followingTrue.updateVote(60,
false, p));
1130 BEAST_EXPECT(!followingFalse.updateVote(60,
false, p));
1132 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1133 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1134 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1135 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1138 BEAST_EXPECT(proposingTrue.updateVote(86,
true, p));
1139 BEAST_EXPECT(!proposingFalse.updateVote(86,
true, p));
1140 BEAST_EXPECT(!followingTrue.updateVote(86,
false, p));
1141 BEAST_EXPECT(!followingFalse.updateVote(86,
false, p));
1143 BEAST_EXPECT(proposingTrue.getOurVote() ==
false);
1144 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1145 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1146 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1149 for (
int i = 16; i < 21; ++i)
1151 auto pTrue = PeerID(numPeers - i - 1);
1152 auto pFalse = PeerID(i);
1153 BEAST_EXPECT(proposingTrue.setVote(pTrue,
true));
1154 BEAST_EXPECT(proposingFalse.setVote(pFalse,
false));
1155 BEAST_EXPECT(followingTrue.setVote(pTrue,
true));
1156 BEAST_EXPECT(followingFalse.setVote(pFalse,
false));
1160 BEAST_EXPECT(proposingTrue.updateVote(90,
true, p));
1161 BEAST_EXPECT(!proposingFalse.updateVote(90,
true, p));
1162 BEAST_EXPECT(!followingTrue.updateVote(90,
false, p));
1163 BEAST_EXPECT(!followingFalse.updateVote(90,
false, p));
1165 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1166 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1167 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1168 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1171 BEAST_EXPECT(!proposingTrue.updateVote(150,
true, p));
1172 BEAST_EXPECT(!proposingFalse.updateVote(150,
true, p));
1173 BEAST_EXPECT(!followingTrue.updateVote(150,
false, p));
1174 BEAST_EXPECT(!followingFalse.updateVote(150,
false, p));
1176 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1177 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1178 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1179 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1182 BEAST_EXPECT(!proposingTrue.updateVote(190,
true, p));
1183 BEAST_EXPECT(!proposingFalse.updateVote(190,
true, p));
1184 BEAST_EXPECT(!followingTrue.updateVote(190,
false, p));
1185 BEAST_EXPECT(!followingFalse.updateVote(190,
false, p));
1187 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1188 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1189 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1190 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1193 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged, j,
clog));
1194 BEAST_EXPECT(!proposingFalse.stalled(p,
true, peersUnchanged, j,
clog));
1195 BEAST_EXPECT(!followingTrue.stalled(p,
false, peersUnchanged, j,
clog));
1196 BEAST_EXPECT(!followingFalse.stalled(p,
false, peersUnchanged, j,
clog));
1197 BEAST_EXPECT(
clog->str() ==
"");
1200 BEAST_EXPECT(proposingTrue.updateVote(220,
true, p));
1201 BEAST_EXPECT(!proposingFalse.updateVote(220,
true, p));
1202 BEAST_EXPECT(!followingTrue.updateVote(220,
false, p));
1203 BEAST_EXPECT(!followingFalse.updateVote(220,
false, p));
1205 BEAST_EXPECT(proposingTrue.getOurVote() ==
false);
1206 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1207 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1208 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1211 for (
int i = 21; i < 46; ++i)
1213 auto pTrue = PeerID(numPeers - i - 1);
1214 auto pFalse = PeerID(i);
1215 BEAST_EXPECT(proposingTrue.setVote(pTrue,
true));
1216 BEAST_EXPECT(proposingFalse.setVote(pFalse,
false));
1217 BEAST_EXPECT(followingTrue.setVote(pTrue,
true));
1218 BEAST_EXPECT(followingFalse.setVote(pFalse,
false));
1222 BEAST_EXPECT(proposingTrue.updateVote(250,
true, p));
1223 BEAST_EXPECT(!proposingFalse.updateVote(250,
true, p));
1224 BEAST_EXPECT(!followingTrue.updateVote(250,
false, p));
1225 BEAST_EXPECT(!followingFalse.updateVote(250,
false, p));
1227 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1228 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1229 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1230 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1232 for (peersUnchanged = 0; peersUnchanged < 6; ++peersUnchanged)
1234 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged, j,
clog));
1235 BEAST_EXPECT(!proposingFalse.stalled(p,
true, peersUnchanged, j,
clog));
1236 BEAST_EXPECT(!followingTrue.stalled(p,
false, peersUnchanged, j,
clog));
1237 BEAST_EXPECT(!followingFalse.stalled(p,
false, peersUnchanged, j,
clog));
1238 BEAST_EXPECT(
clog->str() ==
"");
1241 auto expectStalled =
1242 [
this, &
clog](
int txid,
bool ourVote,
int ourTime,
int peerTime,
int support,
std::uint32_t line) {
1243 using namespace std::string_literals;
1245 auto const s =
clog->str();
1246 expect(s.find(
"stalled"), s, __FILE__, line);
1247 expect(s.starts_with(
"Transaction "s +
std::to_string(txid)), s, __FILE__, line);
1248 expect(s.find(
"voting "s + (ourVote ?
"YES" :
"NO")) != s.npos, s, __FILE__, line);
1249 expect(s.find(
"for "s +
std::to_string(ourTime) +
" rounds."s) != s.npos, s, __FILE__, line);
1250 expect(s.find(
"votes in "s +
std::to_string(peerTime) +
" rounds.") != s.npos, s, __FILE__, line);
1251 expect(s.ends_with(
"has "s +
std::to_string(support) +
"% support. "s), s, __FILE__, line);
1255 for (
int i = 0; i < 1; ++i)
1257 BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i,
true, p));
1258 BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i,
true, p));
1259 BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i,
false, p));
1260 BEAST_EXPECT(!followingFalse.updateVote(250 + 10 * i,
false, p));
1262 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1263 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1264 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1265 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1268 BEAST_EXPECT(!proposingTrue.stalled(p,
true, 0, j,
clog));
1269 BEAST_EXPECT(
clog->str() ==
"");
1273 BEAST_EXPECT(proposingFalse.stalled(p,
true, 0, j,
clog));
1274 expectStalled(98,
false, 11, 0, 2, __LINE__);
1275 BEAST_EXPECT(followingTrue.stalled(p,
false, 0, j,
clog));
1276 expectStalled(97,
true, 11, 0, 97, __LINE__);
1277 BEAST_EXPECT(followingFalse.stalled(p,
false, 0, j,
clog));
1278 expectStalled(96,
false, 11, 0, 3, __LINE__);
1281 BEAST_EXPECT(!proposingTrue.stalled(p,
true, peersUnchanged, j,
clog));
1282 BEAST_EXPECTS(
clog->str() ==
"",
clog->str());
1286 BEAST_EXPECT(proposingFalse.stalled(p,
true, peersUnchanged, j,
clog));
1287 expectStalled(98,
false, 11, 6, 2, __LINE__);
1288 BEAST_EXPECT(followingTrue.stalled(p,
false, peersUnchanged, j,
clog));
1289 expectStalled(97,
true, 11, 6, 97, __LINE__);
1290 BEAST_EXPECT(followingFalse.stalled(p,
false, peersUnchanged, j,
clog));
1291 expectStalled(96,
false, 11, 6, 3, __LINE__);
1293 for (
int i = 1; i < 3; ++i)
1295 BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i,
true, p));
1296 BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i,
true, p));
1297 BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i,
false, p));
1298 BEAST_EXPECT(!followingFalse.updateVote(250 + 10 * i,
false, p));
1300 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1301 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1302 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1303 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1307 BEAST_EXPECT(!proposingTrue.stalled(p,
true, 0, j,
clog));
1308 BEAST_EXPECTS(
clog->str() ==
"",
clog->str());
1310 BEAST_EXPECT(proposingFalse.stalled(p,
true, 0, j,
clog));
1311 expectStalled(98,
false, 11 + i, 0, 2, __LINE__);
1312 BEAST_EXPECT(followingTrue.stalled(p,
false, 0, j,
clog));
1313 expectStalled(97,
true, 11 + i, 0, 97, __LINE__);
1314 BEAST_EXPECT(followingFalse.stalled(p,
false, 0, j,
clog));
1315 expectStalled(96,
false, 11 + i, 0, 3, __LINE__);
1319 BEAST_EXPECT(proposingTrue.stalled(p,
true, peersUnchanged, j,
clog));
1320 expectStalled(99,
true, 1 + i, 6, 97, __LINE__);
1322 BEAST_EXPECT(proposingFalse.stalled(p,
true, peersUnchanged, j,
clog));
1323 expectStalled(98,
false, 11 + i, 6, 2, __LINE__);
1324 BEAST_EXPECT(followingTrue.stalled(p,
false, peersUnchanged, j,
clog));
1325 expectStalled(97,
true, 11 + i, 6, 97, __LINE__);
1326 BEAST_EXPECT(followingFalse.stalled(p,
false, peersUnchanged, j,
clog));
1327 expectStalled(96,
false, 11 + i, 6, 3, __LINE__);
1329 for (
int i = 3; i < 5; ++i)
1331 BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i,
true, p));
1332 BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i,
true, p));
1333 BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i,
false, p));
1334 BEAST_EXPECT(!followingFalse.updateVote(250 + 10 * i,
false, p));
1336 BEAST_EXPECT(proposingTrue.getOurVote() ==
true);
1337 BEAST_EXPECT(proposingFalse.getOurVote() ==
false);
1338 BEAST_EXPECT(followingTrue.getOurVote() ==
true);
1339 BEAST_EXPECT(followingFalse.getOurVote() ==
false);
1341 BEAST_EXPECT(proposingTrue.stalled(p,
true, 0, j,
clog));
1342 expectStalled(99,
true, 1 + i, 0, 97, __LINE__);
1343 BEAST_EXPECT(proposingFalse.stalled(p,
true, 0, j,
clog));
1344 expectStalled(98,
false, 11 + i, 0, 2, __LINE__);
1345 BEAST_EXPECT(followingTrue.stalled(p,
false, 0, j,
clog));
1346 expectStalled(97,
true, 11 + i, 0, 97, __LINE__);
1347 BEAST_EXPECT(followingFalse.stalled(p,
false, 0, j,
clog));
1348 expectStalled(96,
false, 11 + i, 0, 3, __LINE__);
1350 BEAST_EXPECT(proposingTrue.stalled(p,
true, peersUnchanged, j,
clog));
1351 expectStalled(99,
true, 1 + i, 6, 97, __LINE__);
1352 BEAST_EXPECT(proposingFalse.stalled(p,
true, peersUnchanged, j,
clog));
1353 expectStalled(98,
false, 11 + i, 6, 2, __LINE__);
1354 BEAST_EXPECT(followingTrue.stalled(p,
false, peersUnchanged, j,
clog));
1355 expectStalled(97,
true, 11 + i, 6, 97, __LINE__);
1356 BEAST_EXPECT(followingFalse.stalled(p,
false, peersUnchanged, j,
clog));
1357 expectStalled(96,
false, 11 + i, 6, 3, __LINE__);