// TasimaSahte + SahteAg: senkron teslim, yayın, kopma, wire turu (serialize // round-trip gerçek kodlamadan geçer — protokol hatası burada yakalanır). #include "fiko/orkestra/tasima.hpp" #include "fiko_test.hpp" using namespace fiko; using namespace fiko::orkestra; FIKO_TEST(tasima_teslim_ve_wire_turu) { SahteAg ag; TasimaSahte a(ag, 1), b(ag, 2); SurecCerceve alinan; NodeAdres kaynak; int sayac = 0; b.aliciAyarla([&](const NodeAdres& k, const SurecCerceve& c) { kaynak = k; alinan = c; ++sayac; }); SurecCerceve c; c.tip = SurecMesajTip::NodeIlan; c.kaynakPid = 111; c.korelasyon = 0xABCDEF0102030405ull; c.govde = "merhaba\tdünya"; // tab içeriği wire'da bozulmamalı (binary çerçeve) FIKO_KONTROL(a.gonder(NodeAdres{2, 0}, c)); FIKO_KONTROL(sayac == 1); FIKO_KONTROL(kaynak.nodeId == 1); FIKO_KONTROL(kaynak.pid == 111); FIKO_KONTROL(alinan.tip == SurecMesajTip::NodeIlan); FIKO_KONTROL(alinan.korelasyon == 0xABCDEF0102030405ull); FIKO_KONTROL(alinan.govde == "merhaba\tdünya"); } FIKO_TEST(tasima_bilinmeyen_hedef_false) { SahteAg ag; TasimaSahte a(ag, 1); SurecCerceve c; FIKO_KONTROL(!a.gonder(NodeAdres{99, 0}, c)); } FIKO_TEST(tasima_yayin_kaynak_haric) { SahteAg ag; TasimaSahte a(ag, 1), b(ag, 2), d(ag, 3); int bSayac = 0, dSayac = 0, aSayac = 0; a.aliciAyarla([&](const NodeAdres&, const SurecCerceve&) { ++aSayac; }); b.aliciAyarla([&](const NodeAdres&, const SurecCerceve&) { ++bSayac; }); d.aliciAyarla([&](const NodeAdres&, const SurecCerceve&) { ++dSayac; }); SurecCerceve c; c.tip = SurecMesajTip::Broadcast; FIKO_KONTROL(a.gonder(NodeAdres{0, 0}, c)); // nodeId 0 + pid 0 = yayın FIKO_KONTROL(aSayac == 0); FIKO_KONTROL(bSayac == 1); FIKO_KONTROL(dSayac == 1); } FIKO_TEST(tasima_kopma_simulasyonu) { SahteAg ag; TasimaSahte a(ag, 1), b(ag, 2); int sayac = 0; b.aliciAyarla([&](const NodeAdres&, const SurecCerceve&) { ++sayac; }); SurecCerceve c; ag.kopar(2); FIKO_KONTROL(!a.gonder(NodeAdres{2, 0}, c)); FIKO_KONTROL(sayac == 0); ag.bagla(2); FIKO_KONTROL(a.gonder(NodeAdres{2, 0}, c)); FIKO_KONTROL(sayac == 1); } FIKO_TEST(tasima_uc_yikiminda_kayit_silinir) { SahteAg ag; TasimaSahte a(ag, 1); SurecCerceve c; { TasimaSahte b(ag, 2); b.aliciAyarla([](const NodeAdres&, const SurecCerceve&) {}); FIKO_KONTROL(a.gonder(NodeAdres{2, 0}, c)); } FIKO_KONTROL(!a.gonder(NodeAdres{2, 0}, c)); // b yıkıldı → hedef yok } FIKO_TEST(protokol_yeni_tipler_round_trip) { const SurecMesajTip tipler[] = {SurecMesajTip::NodeIlan, SurecMesajTip::NodeMetrik, SurecMesajTip::TaskAta, SurecMesajTip::TaskDurumu, SurecMesajTip::TaskIptal, SurecMesajTip::DosyaParca, SurecMesajTip::EslesmeIste, SurecMesajTip::EslesmeOnay}; for (SurecMesajTip t : tipler) { SurecCerceve c; c.tip = t; c.kaynakPid = 7; c.hedefPid = 9; c.govde = std::string("\x00\x01\x02", 3); // binary gövde bozulmamalı const std::string wire = surecproto::cerceveSerialize(c); SurecCerceve geri; FIKO_KONTROL(surecproto::cerceveDeserialize(wire.data(), wire.size(), geri)); FIKO_KONTROL(geri.tip == t); FIKO_KONTROL(geri.govde.size() == 3); } } FIKO_TEST(protokol_eski_metin_geri_uyum) { const char* eski = "komut\tPad"; SurecCerceve c; FIKO_KONTROL(surecproto::cerceveDeserialize(eski, 9, c)); FIKO_KONTROL(c.tip == SurecMesajTip::Komut); FIKO_KONTROL(c.govde == "Pad"); }