#include "fiko/cekirdek/lisans.hpp" #include "fiko_test.hpp" using namespace fiko; namespace { MenuOge oge(const char* grup, const char* ad) { return MenuOge{grup, ad, "", 0, [](Cekirdek&) {}}; } } FIKO_TEST(lisans_serbest_hepsi_izinli_ve_sayar) { Cekirdek c; LisansSistemi lis; lis.bagla(c); // Serbest kip: her komut çalışır + sayılır (takip). FIKO_KONTROL(c.komutCalistir(oge("Geometri", "Kutu"))); FIKO_KONTROL(c.komutCalistir(oge("Geometri", "Kutu"))); FIKO_KONTROL(c.komutCalistir(oge("Boolean", "Birleştir"))); FIKO_KONTROL(lis.kullanim("Kutu") == 2); FIKO_KONTROL(lis.kullanim("Birleştir") == 1); FIKO_KONTROL(lis.toplamKomut() == 3); } FIKO_TEST(lisans_kisitli_yalniz_izinli_grup) { Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.kipAyarla(LisansSistemi::Kip::Kisitli); lis.grupIzinVer("Geometri"); // yalnız Geometri lisanslı // İzinli grup → çalışır + sayılır. FIKO_KONTROL(c.komutCalistir(oge("Geometri", "Kutu"))); // İzinsiz grup → gate engeller (çalışmaz, sayılmaz). FIKO_KONTROL(!c.komutCalistir(oge("Pro", "Gelişmiş"))); FIKO_KONTROL(lis.kullanim("Kutu") == 1); FIKO_KONTROL(lis.kullanim("Gelişmiş") == 0); // reddedildi → sayılmadı FIKO_KONTROL(lis.toplamKomut() == 1); } FIKO_TEST(lisans_kullanim_serialize_roundtrip) { // Kümülatif kullanım kalıcılığı: serialize → yükle → sayaçlar korunur (oturumlar arası). Cekirdek c; LisansSistemi lis; lis.bagla(c); c.komutCalistir(oge("Geometri", "Kutu")); c.komutCalistir(oge("Geometri", "Kutu")); c.komutCalistir(oge("Boolean", "Birleştir")); const std::string m = lis.kullanimSerialize(); LisansSistemi lis2; lis2.kullanimYukle(m); FIKO_KONTROL(lis2.kullanim("Kutu") == 2); FIKO_KONTROL(lis2.kullanim("Birleştir") == 1); FIKO_KONTROL(lis2.toplamKomut() == 3); } FIKO_TEST(lisans_izin_kaldir_ve_sifirla) { Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.kipAyarla(LisansSistemi::Kip::Kisitli); lis.grupIzinVer("Geometri"); FIKO_KONTROL(c.komutCalistir(oge("Geometri", "Kutu"))); lis.grupIzinKaldir("Geometri"); // lisans iptal FIKO_KONTROL(!c.komutCalistir(oge("Geometri", "Kutu"))); // artık engelli lis.kullanimSifirla(); FIKO_KONTROL(lis.toplamKomut() == 0 && lis.kullanim("Kutu") == 0); } // ---- Platform servisleri Dalga 1 — granüler gate testleri ---- FIKO_TEST(lisans_feature_gate) { Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.featureIzinVer("part.pad"); // yalnız bu feature lisanslı MenuOge padli = oge("Part", "Pad"); padli.lisansEtiketi = "part.pad"; MenuOge holeli = oge("Part", "Hole"); holeli.lisansEtiketi = "part.hole"; FIKO_KONTROL(c.komutCalistir(padli)); // izinli feature → çalışır FIKO_KONTROL(!c.komutCalistir(holeli)); // izinsiz feature → red // Etiketsiz komut → feature gate atlanır (grup davranışına düşer, Serbest → izin). FIKO_KONTROL(c.komutCalistir(oge("Part", "Kutu"))); FIKO_KONTROL(lis.redSayaci(LisansSistemi::RedSebep::Feature) == 1); } FIKO_TEST(lisans_workbench_gate) { Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.workbenchIzinVer("part"); // yalnız part workbench lisanslı MenuOge pw = oge("Geo", "A"); pw.workbench = "part"; MenuOge cw = oge("Geo", "B"); cw.workbench = "cam"; FIKO_KONTROL(c.komutCalistir(pw)); // izinli workbench FIKO_KONTROL(!c.komutCalistir(cw)); // izinsiz workbench → red FIKO_KONTROL(c.komutCalistir(oge("Geo", "C"))); // workbench boş = global serbest FIKO_KONTROL(lis.redSayaci(LisansSistemi::RedSebep::Workbench) == 1); } FIKO_TEST(lisans_kota_gate) { Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.kotaAyarla("Part/Pad", 2); // kota KİMLİK bazlı (kimliksiz komut → "Grup/Ad") MenuOge p = oge("Part", "Pad"); FIKO_KONTROL(c.komutCalistir(p)); // kullanım 0<2 → çalışır (→1) FIKO_KONTROL(c.komutCalistir(p)); // kullanım 1<2 → çalışır (→2) FIKO_KONTROL(!c.komutCalistir(p)); // kullanım 2>=2 → kota red FIKO_KONTROL(lis.kullanim("Pad") == 2); FIKO_KONTROL(lis.redSayaci(LisansSistemi::RedSebep::Kota) == 1); } FIKO_TEST(lisans_expiry_gate) { Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.gecerlilikAyarla(1000); // unix 1000'de biter lis.suanAyarla(500); // süre içinde FIKO_KONTROL(c.komutCalistir(oge("A", "B"))); lis.suanAyarla(2000); // süre doldu FIKO_KONTROL(!c.komutCalistir(oge("A", "B"))); FIKO_KONTROL(lis.redSayaci(LisansSistemi::RedSebep::Expiry) == 1); } FIKO_TEST(lisans_node_lock_gate) { Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.makineHashAyarla("AAA", "BBB"); // lisans hash ≠ yerel → uyuşmaz FIKO_KONTROL(!c.komutCalistir(oge("A", "B"))); lis.makineHashAyarla("AAA", "AAA"); // uyuşur FIKO_KONTROL(c.komutCalistir(oge("A", "B"))); FIKO_KONTROL(lis.redSayaci(LisansSistemi::RedSebep::NodeLock) == 1); } FIKO_TEST(lisans_red_olayi_ve_telemetri) { Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.kipAyarla(LisansSistemi::Kip::Kisitli); // whitelist boş → tümü red int redOlay = 0; u32 sonSebep = 0; c.olaylar().abone([&](const LisansReddedildi& o) { ++redOlay; sonSebep = o.sebep; }); FIKO_KONTROL(!c.komutCalistir(oge("X", "Y"))); FIKO_KONTROL(redOlay == 1); // gate red → LisansReddedildi yayınlandı FIKO_KONTROL(sonSebep == static_cast(LisansSistemi::RedSebep::Grup)); FIKO_KONTROL(lis.toplamRed() == 1); FIKO_KONTROL(lis.redSayaci(LisansSistemi::RedSebep::Grup) == 1); } FIKO_TEST(lisans_izinli_yan_etkisiz_sorgu) { // izinli() UI/makro sorgusu için yan-etkisiz (sayaç artırmaz, olay yayınlamaz). Cekirdek c; LisansSistemi lis; lis.bagla(c); lis.kipAyarla(LisansSistemi::Kip::Kisitli); MenuOge o = oge("X", "Y"); FIKO_KONTROL(!lis.izinli(o)); FIKO_KONTROL(!lis.izinli(o)); FIKO_KONTROL(lis.toplamRed() == 0); // sorgu telemetri kirletmez }