// NodeIlan/NodeMetrik gövde serileştirme: round-trip, güvenlik (dogrulanmis wire'da // taşınmaz), bozuk/kısa gövde reddi, ileri-uyum (sondaki fazla bayt yok sayılır), // defterle uçtan uca (ilanCoz → ilanIsle). #include "fiko/orkestra/node_kayit.hpp" #include "fiko_test.hpp" using namespace fiko::orkestra; namespace { NodeBilgi ornekNode() { NodeBilgi n; n.nodeId = 0xA1B2C3D4E5F60718ull; n.ad = "ATÖLYE-PC"; // UTF-8 metin bozulmamalı n.surum = "0.5.0"; n.etiketler = "gpu,render-farm"; n.runtimeSayisi = 4; n.aktifTask = 2; n.dogrulanmis = true; // wire'a YAZILMAMALI return n; } } // namespace FIKO_TEST(ilan_round_trip) { const std::string govde = nodeproto::ilanSerialize(ornekNode()); NodeBilgi geri; FIKO_KONTROL(nodeproto::ilanCoz(govde, geri)); FIKO_KONTROL(geri.nodeId == 0xA1B2C3D4E5F60718ull); FIKO_KONTROL(geri.ad == "ATÖLYE-PC"); FIKO_KONTROL(geri.surum == "0.5.0"); FIKO_KONTROL(geri.etiketler == "gpu,render-farm"); FIKO_KONTROL(geri.runtimeSayisi == 4); FIKO_KONTROL(geri.aktifTask == 2); } FIKO_TEST(ilan_dogrulanmis_wireda_tasinmaz) { // Uzak node "doğrulanmışım" iddiasıyla GELEMEZ — eşleştirme yerel karar. const std::string govde = nodeproto::ilanSerialize(ornekNode()); NodeBilgi geri; geri.dogrulanmis = true; // çözüm öncesi kirli değer — ilanCoz sıfırlamalı FIKO_KONTROL(nodeproto::ilanCoz(govde, geri)); FIKO_KONTROL(!geri.dogrulanmis); } FIKO_TEST(ilan_bozuk_govde_reddi) { NodeBilgi geri; FIKO_KONTROL(!nodeproto::ilanCoz("", geri)); FIKO_KONTROL(!nodeproto::ilanCoz("kisa", geri)); // Geçerli gövdenin kırpılmışı → false (taşma yok, sessiz çöp yok). const std::string govde = nodeproto::ilanSerialize(ornekNode()); bool hepsiRed = true; for (size_t n = 1; n < 12; ++n) { NodeBilgi g2; if (nodeproto::ilanCoz(govde.substr(0, govde.size() - n), g2)) hepsiRed = false; } FIKO_KONTROL(hepsiRed); // nodeId=0 ilan reddedilir (yerel kısayol adresi kimlik olamaz). NodeBilgi sifir = ornekNode(); sifir.nodeId = 0; NodeBilgi g3; FIKO_KONTROL(!nodeproto::ilanCoz(nodeproto::ilanSerialize(sifir), g3)); } FIKO_TEST(ilan_ileri_uyum_fazla_bayt) { // Gelecek sürüm sona alan ekler — eski çözücü fazla baytı yok sayar. std::string govde = nodeproto::ilanSerialize(ornekNode()); govde += "\x01\x02\x03gelecek-alan"; NodeBilgi geri; FIKO_KONTROL(nodeproto::ilanCoz(govde, geri)); FIKO_KONTROL(geri.nodeId == 0xA1B2C3D4E5F60718ull); FIKO_KONTROL(geri.aktifTask == 2); } FIKO_TEST(metrik_round_trip) { NodeMetrikOzet m; m.cpuYuzde = 37.5f; m.gpuYuzde = 91.25f; m.ramMB = 16384; m.vramMB = 24576; m.diskBosGB = 512; m.agKBps = 1250; const std::string govde = nodeproto::metrikSerialize(77, m); uint64_t id = 0; NodeMetrikOzet geri; FIKO_KONTROL(nodeproto::metrikCoz(govde, id, geri)); FIKO_KONTROL(id == 77); FIKO_KONTROL(geri.cpuYuzde == 37.5f && geri.gpuYuzde == 91.25f); FIKO_KONTROL(geri.ramMB == 16384 && geri.vramMB == 24576); FIKO_KONTROL(geri.diskBosGB == 512 && geri.agKBps == 1250); // Kısa gövde + sıfır kimlik reddi. NodeMetrikOzet bos; uint64_t id2 = 0; FIKO_KONTROL(!nodeproto::metrikCoz(govde.substr(0, 10), id2, bos)); FIKO_KONTROL(!nodeproto::metrikCoz(nodeproto::metrikSerialize(0, m), id2, bos)); } FIKO_TEST(ilan_defterle_uctan_uca) { // Beacon simülasyonu: wire'dan çözülen ilan defteri besler (uzak node akışı). const std::string govde = nodeproto::ilanSerialize(ornekNode()); NodeBilgi ilan; FIKO_KONTROL(nodeproto::ilanCoz(govde, ilan)); NodeKayitDefteri defter; defter.ilanIsle(ilan, 1000); const NodeBilgi* n = defter.bul(ilan.nodeId); FIKO_KONTROL(n && n->ad == "ATÖLYE-PC" && !n->dogrulanmis); FIKO_KONTROL(n->durum == NodeDurum::Online); }