peer_external_ack_test.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132
  1. #include <cassert>
  2. #include "../Sunrise/src/server/gameplay/peer/peer_external_ack.h"
  3. namespace peer = sunrise::server::gameplay::peer;
  4. namespace wire = sunrise::middleware::gameplay::peer;
  5. int main() {
  6. sunrise::state::gameplay::PeerLink link{};
  7. link.viewGeneration=7;
  8. peer::DisplacedExternals completed{};
  9. wire::AckState ack{};
  10. // More than four complete packet-ring wraps must remain available even when
  11. // the incoming gameplay payload is unsupported; only header ACKs are needed.
  12. for (unsigned i=0;i<600;++i) {
  13. auto& slot=link.externalContributions[i%128];
  14. assert(!slot.occupied);
  15. slot={};slot.occupied=true;slot.groupSessionId=91;slot.transmissionId=i+1;
  16. slot.packetSequence=i%1024;slot.viewGeneration=7;slot.commonPresent=true;
  17. ack.ringInitialized=true;ack.receiveHead=i%128;
  18. assert(peer::acknowledge_external(link,ack,completed)==1);
  19. assert(!slot.occupied && completed[0].transmissionId==i+1);
  20. assert(completed[0].outcome==wire::AckOutcome::received);
  21. }
  22. assert(link.commonCommitted);
  23. link.commonCommitted=false;
  24. auto& slot=link.externalContributions[0];
  25. slot.occupied=true;slot.packetSequence=5;slot.viewGeneration=6;slot.commonPresent=true;
  26. ack.receiveHead=4;
  27. assert(peer::acknowledge_external(link,ack,completed)==0 && slot.occupied);
  28. ack.receiveHead=5;
  29. assert(peer::acknowledge_external(link,ack,completed)==1 && !slot.occupied);
  30. assert(!link.commonCommitted); // an old view ACK cannot confirm the new common root
  31. assert(peer::acknowledge_external(link,ack,completed)==0); // duplicate ACK
  32. }