mirror of
https://github.com/vicliu624/trail-mate.git
synced 2026-11-11 14:47:39 +00:00
77 lines
3.5 KiB
C++
77 lines
3.5 KiB
C++
#include "track_sharing/request_retry_window.h"
|
|
#include <cassert>
|
|
#include <cstring>
|
|
struct Receiver
|
|
{
|
|
bool waiting = false;
|
|
unsigned cancelled = 0;
|
|
bool pending() const { return waiting; }
|
|
void cancelPending()
|
|
{
|
|
waiting = false;
|
|
++cancelled;
|
|
}
|
|
};
|
|
int main()
|
|
{
|
|
using namespace track_sharing;
|
|
RequestRetryWindow window;
|
|
Receiver receiver;
|
|
uint8_t request[16];
|
|
std::memset(request, 3, 16);
|
|
assert(window.poll(receiver, 0) == ExchangePoll::Invalid);
|
|
assert(!window.begin({request, 16}, 100, 0, 3, 2));
|
|
assert(!window.begin({request, 16}, 100, 10, 0, 2));
|
|
assert(!window.begin({request, 16}, 100, 10, 3, 0));
|
|
assert(window.begin({request, 16}, 100, 10, 3, 2));
|
|
request[0] = 9;
|
|
assert(window.request().data[0] == 3);
|
|
assert(!window.begin({request, 16}, 100, 10, 3, 2));
|
|
assert(!window.sent(true, 100));
|
|
assert(window.poll(receiver, 99) == ExchangePoll::Invalid);
|
|
assert(window.poll(receiver, 100) == ExchangePoll::Ready);
|
|
receiver.waiting = true;
|
|
assert(window.sent(true, 100));
|
|
assert(window.poll(receiver, 109) == ExchangePoll::Waiting && !receiver.cancelled);
|
|
assert(window.poll(receiver, 110) == ExchangePoll::Waiting && !receiver.waiting && receiver.cancelled == 1);
|
|
assert(window.poll(receiver, 112) == ExchangePoll::Waiting);
|
|
assert(window.poll(receiver, 113) == ExchangePoll::Ready && window.request().data[0] == 3);
|
|
receiver.waiting = true;
|
|
assert(window.sent(true, 113));
|
|
assert(window.poll(receiver, 123) == ExchangePoll::Exhausted && !receiver.waiting && receiver.cancelled == 2);
|
|
assert(!window.sent(true, 124));
|
|
assert(window.resume(124) && window.attempts() == 0 && window.request().data[0] == 3);
|
|
assert(window.poll(receiver, 124) == ExchangePoll::Ready);
|
|
assert(window.sent(false, 124));
|
|
assert(window.poll(receiver, 126) == ExchangePoll::Waiting);
|
|
assert(window.poll(receiver, 127) == ExchangePoll::Ready);
|
|
receiver.waiting = true;
|
|
assert(window.sent(true, 127));
|
|
window.pause(receiver);
|
|
assert(!receiver.waiting && window.poll(receiver, 150) == ExchangePoll::Paused);
|
|
assert(!window.resume(149));
|
|
assert(window.resume(151) && window.poll(receiver, 151) == ExchangePoll::Ready);
|
|
receiver.waiting = true;
|
|
assert(window.sent(true, 151));
|
|
receiver.waiting = false; // Verified receipt has been durably consumed.
|
|
assert(window.poll(receiver, 152) == ExchangePoll::Completed && !window.request().size);
|
|
assert(window.poll(receiver, 153) == ExchangePoll::Invalid);
|
|
assert(window.begin({request, 16}, 154, 10, 3, 2));
|
|
assert(window.request().data[0] == 9 && !window.attempts());
|
|
assert(window.poll(receiver, 154) == ExchangePoll::Ready);
|
|
receiver.waiting = true;
|
|
assert(window.sent(true, 154));
|
|
receiver.waiting = false;
|
|
window.pause(receiver);
|
|
assert(!window.request().size && window.poll(receiver, 155) == ExchangePoll::Invalid);
|
|
assert(window.begin({request, 16}, 200, 10, 3, 3) && window.poll(receiver, 200) == ExchangePoll::Ready);
|
|
receiver.waiting = true;
|
|
assert(window.sent(true, 200));
|
|
assert(window.dispatchRejected(receiver, 200) && !receiver.waiting && window.attempts() == 1 && window.request().data[0] == 9);
|
|
assert(window.poll(receiver, 202) == ExchangePoll::Waiting && window.poll(receiver, 203) == ExchangePoll::Ready);
|
|
receiver.waiting = true;
|
|
assert(window.sent(true, 203));
|
|
receiver.waiting = false;
|
|
assert(window.dispatchRejected(receiver, 203) && !window.request().size);
|
|
}
|