// İş Takip TCP sürücüleri loopback: gerçek soketler üstünde kral + istemci // kanal takımı uçtan uca (snapshot → yaz → delta → kopma → yeniden bağlanma). // Non-blocking uçlar kısa poll ile beklenir (loopback anlık; 500 ms üst sınır). #include #include "fiko/istakip/kanal.hpp" #include "fiko_test.hpp" #include "istakip_ag.hpp" using namespace fiko; using namespace fiko::istakip; FIKO_TEST(istakip_adres_coz) { std::string ip; uint16_t port = 0; FIKO_KONTROL(istakipAdresCoz("192.168.1.5:47820", ip, port, 1) && ip == "192.168.1.5" && port == 47820); FIKO_KONTROL(istakipAdresCoz("10.0.0.9", ip, port, 47820) && port == 47820); FIKO_KONTROL(!istakipAdresCoz("", ip, port, 1)); FIKO_KONTROL(!istakipAdresCoz("host:", ip, port, 1)); FIKO_KONTROL(!istakipAdresCoz(":99", ip, port, 1)); FIKO_KONTROL(!istakipAdresCoz("host:99999", ip, port, 1)); FIKO_KONTROL(!istakipAdresCoz("host:0", ip, port, 1)); } namespace { // Her iki ucu simdiMs ilerleterek nabızla; kosul sağlanana dek (üst sınırlı). template bool nabizBekle(IstakipTasimaKral& kral, IstakipTasimaIstemci& ist, uint64_t& simdiMs, F kosul) { for (int i = 0; i < 100; ++i) { kral.tik(); ist.tik(simdiMs += 10); if (kosul()) return true; Sleep(5); } return false; } } // namespace FIKO_TEST(istakip_tcp_uctan_uca) { // Kral tarafı: gerçek dinleyici + merkez. IstakipTasimaKral kralTasima; FIKO_KONTROL(kralTasima.ac(48221, 1u << 20, 8)); DepoBellek depo; IsMerkez merkez(depo); IsKralKanal kralKanal(merkez, kralTasima, 2); // parçalı snapshot da sahada test edilsin kralTasima.kopmaAyarla([&](const orkestra::NodeAdres& a) { kralKanal.istemciDustu(a); }); // İstemci tarafı. IstakipTasimaIstemci istTasima; IsIstemci ist(777); IsIstemciKanal istKanal(ist, istTasima, orkestra::NodeAdres{0, 0}); istTasima.baglandiAyarla([&] { istKanal.baglan(); }); istTasima.koptuAyarla([&] { istKanal.koptu(); }); istTasima.hedefAyarla("127.0.0.1", 48221, 1u << 20); uint64_t simdiMs = 100000; FIKO_KONTROL(nabizBekle(kralTasima, istTasima, simdiMs, [&] { return istKanal.bagli(); })); // Yazma → kral uygular → delta geri gelir. IsKayit t; t.tur = "siparis"; t.alanlar = {{"ad", "atolye-1"}}; istKanal.yaz(t); FIKO_KONTROL(nabizBekle(kralTasima, istTasima, simdiMs, [&] { return ist.bul(1) && ist.bekleyenler().empty(); })); FIKO_KONTROL(merkez.sonSurum() == 1 && kralKanal.uygulananYazma() == 1); // Parçalı snapshot sahada: 5 kayıt daha → kopan istemci dönünce hepsini toplar. for (int i = 0; i < 5; ++i) istKanal.yaz(t); FIKO_KONTROL(nabizBekle(kralTasima, istTasima, simdiMs, [&] { return merkez.sonSurum() == 6; })); istTasima.kapat(); istKanal.koptu(); kralTasima.tik(); // kopma tespiti → kanal düşer FIKO_KONTROL(nabizBekle(kralTasima, istTasima, simdiMs, [&] { return kralTasima.baglantiSayisi() == 0; })); // Çevrimdışı yazma + yeniden bağlanma (backoff'u aşacak kadar simdiMs ilerlet). istKanal.yaz(t); simdiMs += 10000; FIKO_KONTROL(nabizBekle(kralTasima, istTasima, simdiMs, [&] { return istKanal.bagli() && ist.bekleyenler().empty(); })); FIKO_KONTROL(merkez.sonSurum() == 7 && ist.sonSurum() == 7); FIKO_KONTROL(ist.turListe("siparis").size() == 7); kralTasima.kapat(); } FIKO_TEST(istakip_tcp_baglanti_tavani) { IstakipTasimaKral kral; FIKO_KONTROL(kral.ac(48222, 1u << 16, 1)); // tavan: 1 bağlantı TcpBaglantiWin b1, b2; FIKO_KONTROL(b1.baglan("127.0.0.1", 48222)); FIKO_KONTROL(b2.baglan("127.0.0.1", 48222)); for (int i = 0; i < 50 && kral.reddedilenBaglanti() == 0; ++i) { kral.tik(); Sleep(10); } FIKO_KONTROL(kral.baglantiSayisi() == 1 && kral.reddedilenBaglanti() == 1); kral.kapat(); }