#include "fiko/istakip/istemci.hpp" #include "fiko_test.hpp" using namespace fiko::istakip; static IsKayit kayit(uint64_t kimlik, uint64_t surum, const char* tur = "teklif") { IsKayit k; k.kimlik = kimlik; k.surum = surum; k.tur = tur; return k; } FIKO_TEST(istemci_snapshot_ve_delta) { IsIstemci ist(500); ist.snapshotUygula({kayit(1, 1), kayit(2, 2)}, 2, 0); FIKO_KONTROL(ist.sonSurum() == 2 && ist.bul(1) && ist.bul(2)); ist.deltaUygula(kayit(3, 3), 999, 1); FIKO_KONTROL(ist.sonSurum() == 3 && ist.bul(3)); ist.deltaUygula(kayit(3, 3), 999, 1); // çift teslim → yok say FIKO_KONTROL(ist.sonSurum() == 3); FIKO_KONTROL(ist.turListe("teklif").size() == 3); } FIKO_TEST(istemci_silinen_listeden_duser) { IsIstemci ist(500); ist.snapshotUygula({kayit(1, 1), kayit(2, 2)}, 2, 0); auto sil = kayit(1, 3); sil.silindi = true; ist.deltaUygula(sil, 999, 2); FIKO_KONTROL(ist.turListe("teklif").size() == 1); FIKO_KONTROL(ist.bul(1) && ist.bul(1)->silindi); // tombstone önbellekte kalır } FIKO_TEST(istemci_bekleyen_kuyruk_delta_ile_duser) { IsIstemci ist(500); const uint64_t s1 = ist.yazKuyrukla(kayit(0, 0)); const uint64_t s2 = ist.yazKuyrukla(kayit(0, 0)); FIKO_KONTROL(s1 == 1 && s2 == 2 && ist.bekleyenler().size() == 2); ist.deltaUygula(kayit(7, 1), 500, s1); // kendi yazmamızın deltası FIKO_KONTROL(ist.bekleyenler().size() == 1 && ist.bekleyenler().front().sira == s2); ist.deltaUygula(kayit(8, 2), 999, 5); // başkasının deltası bekleyene dokunmaz FIKO_KONTROL(ist.bekleyenler().size() == 1); } FIKO_TEST(istemci_snapshot_islenen_sira_bekleyeni_temizler) { IsIstemci ist(500); ist.yazKuyrukla(kayit(0, 0)); ist.yazKuyrukla(kayit(0, 0)); // Kral kopmadan önce 1. yazmayı işlemişti; snapshot islenenSira=1 döner. ist.snapshotUygula({kayit(7, 1)}, 1, 1); FIKO_KONTROL(ist.bekleyenler().size() == 1 && ist.bekleyenler().front().sira == 2); ist.onayUygula(2); // "tekrar" onayı kalanını düşürür FIKO_KONTROL(ist.bekleyenler().empty()); }