void testCharges (beast::Journal j) { testcase ("Charge"); TestLogic logic (j); { beast::IP::Endpoint address (beast::IP::Endpoint::from_string ("207.127.82.1")); Consumer c (logic.newInboundEndpoint (address)); Charge fee (1000); j.info << "Charging " << c.to_string() << " " << fee << " per second"; c.charge (fee); for (int i = 0; i < 128; ++i) { j.info << "Time= " << logic.clock().now().time_since_epoch() << ", Balance = " << c.balance(); logic.advance(); } } { beast::IP::Endpoint address (beast::IP::Endpoint::from_string ("207.127.82.2")); Consumer c (logic.newInboundEndpoint (address)); Charge fee (1000); j.info << "Charging " << c.to_string() << " " << fee << " per second"; for (int i = 0; i < 128; ++i) { c.charge (fee); j.info << "Time= " << logic.clock().now().time_since_epoch() << ", Balance = " << c.balance(); logic.advance(); } } pass(); }
void testDrop (beast::Journal j) { testcase ("Warn/drop"); TestLogic logic (j); Charge const fee (dropThreshold + 1); beast::IP::Endpoint const addr ( beast::IP::Endpoint::from_string ("207.127.82.2")); { Consumer c (logic.newInboundEndpoint (addr)); // Create load until we get a warning int n = 10000; while (--n >= 0) { if (n == 0) { fail ("Loop count exceeded without warning"); return; } if (c.charge (fee) == warn) { pass (); break; } ++logic.clock (); } // Create load until we get dropped while (--n >= 0) { if (n == 0) { fail ("Loop count exceeded without dropping"); return; } if (c.charge (fee) == drop) { // Disconnect abusive Consumer expect (c.disconnect ()); break; } ++logic.clock (); } } // Make sure the consumer is on the blacklist for a while. { Consumer c (logic.newInboundEndpoint (addr)); logic.periodicActivity(); if (c.disposition () != drop) { fail ("Dropped consumer not put on blacklist"); return; } } // Makes sure the Consumer is eventually removed from blacklist bool readmitted = false; { // Give Consumer time to become readmitted. Should never // exceed expiration time. std::size_t n (secondsUntilExpiration + 1); while (--n > 0) { ++logic.clock (); logic.periodicActivity(); Consumer c (logic.newInboundEndpoint (addr)); if (c.disposition () != drop) { readmitted = true; break; } } } if (readmitted == false) { fail ("Dropped Consumer left on blacklist too long"); return; } pass(); }
void testDrop (beast::Journal j) { testcase ("Warn/drop"); TestLogic logic (j); Charge const fee (dropThreshold + 1); beast::IP::Endpoint const addr ( beast::IP::Endpoint::from_string ("207.127.82.2")); { Consumer c (logic.newInboundEndpoint (addr)); // Create load until we get a warning for (std::size_t n (maxLoopCount); true; --n) { if (n == 0) { fail ("Loop count exceeded without warning"); return; } if (c.charge (fee) == warn) { pass (); break; } ++logic.clock (); } // Create load until we get dropped for (std::size_t n (maxLoopCount); true; --n) { if (n == 0) { fail ("Loop count exceeded without dropping"); return; } if (c.charge (fee) == drop) { pass (); break; } ++logic.clock (); } } { Consumer c (logic.newInboundEndpoint (addr)); expect (c.disconnect ()); } for (std::size_t n (maxLoopCount); true; --n) { Consumer c (logic.newInboundEndpoint (addr)); if (n == 0) { fail ("Loop count exceeded without expiring black list"); return; } if (c.disposition() != drop) { pass (); break; } } }