// TCP sürücüleri loopback smoke: dinle → bağlan → kabul → çerçeve gönder → // AkisCozucu ile çöz. Non-blocking accept/recv sınırlı kısa poll ile beklenir // (loopback'te anlıktır; 500 ms üst sınır — asılı kalmaz). #include #include "fiko/orkestra/akis.hpp" #include "fiko_test.hpp" #include "orkestra_tcp_win.hpp" using namespace fiko; using namespace fiko::orkestra; FIKO_TEST(tcp_loopback_cerceve_kanali) { TcpDinleyiciWin dinleyici; FIKO_KONTROL(dinleyici.ac(48211)); // Aynı portu ikinci dinleyici AÇAMAZ (REUSEADDR yok — makinede tek ajan). TcpDinleyiciWin ikinci; FIKO_KONTROL(!ikinci.ac(48211)); TcpBaglantiWin istemci; FIKO_KONTROL(istemci.baglan("127.0.0.1", 48211)); uintptr_t kabul = 0; for (int i = 0; i < 50 && !kabul; ++i) { kabul = dinleyici.kabulEt(); if (!kabul) Sleep(10); } FIKO_KONTROL(kabul != 0); TcpBaglantiWin sunucuUcu(kabul); FIKO_KONTROL(sunucuUcu.acikMi()); // İstemci → sunucu: iki çerçeve tek yazımda (akış birleştirmesi çözülür). SurecCerceve c1, c2; c1.tip = SurecMesajTip::EslesmeIste; c1.govde = "kod:123456"; c2.tip = SurecMesajTip::NodeIlan; c2.korelasyon = 7; FIKO_KONTROL(istemci.gonder(surecproto::cerceveSerialize(c1) + surecproto::cerceveSerialize(c2))); AkisCozucu cozucu; std::vector gelen; for (int i = 0; i < 50 && gelen.size() < 2; ++i) { std::string veri; const int n = sunucuUcu.al(veri); FIKO_KONTROL(n >= 0); // kanal kapanmadı if (n > 0) FIKO_KONTROL(cozucu.besle(veri.data(), veri.size(), gelen)); else Sleep(10); } FIKO_KONTROL(gelen.size() == 2); FIKO_KONTROL(gelen[0].tip == SurecMesajTip::EslesmeIste && gelen[0].govde == "kod:123456"); FIKO_KONTROL(gelen[1].korelasyon == 7); // İstemci kapanınca sunucu ucu -1 görür (kanal düşürme sinyali). istemci.kapat(); int sonuc = 0; for (int i = 0; i < 50 && sonuc == 0; ++i) { std::string veri; sonuc = sunucuUcu.al(veri); if (sonuc == 0) Sleep(10); } FIKO_KONTROL(sonuc == -1); } FIKO_TEST(tcp_kapaliyken_guvenli) { TcpBaglantiWin b; std::string veri; FIKO_KONTROL(!b.gonder("x")); FIKO_KONTROL(b.al(veri) == -1); FIKO_KONTROL(!b.baglan("127.0.0.1", 1)); // kimse dinlemiyor → false, çökme yok TcpDinleyiciWin d; FIKO_KONTROL(d.kabulEt() == 0); d.kapat(); d.kapat(); }