Frobozz

Bir süredir, elimdeki bazı C tabanlı yazılım projelerinde kullanabileceğim ve öğrencilere de önerebileceğim basit bir Birim Test kitaplığı arıyordum. Birim Test konusunu (ve daha genel düzeyde XP'yi) önemsiyorum; disiplinle icra edilen her işi önemsediğim gibi. Nedense bu disiplin ve hackerlık sözcükleri kulağa çok da uyumlu gelen bir terkip oluşturmuyor. Eğer bu uyumsuzluğu gidermek hacker sözcüğünü lugatten silmemi gerektirseydi bu durumu sanıyorum ben de Thomas Dickey gibi gerekçelendirirdim… ve evet Linus Torvalds'ın bu tip konulardaki olumsuz etkisinden haberdarım :-)

Önce hazır Debian paketleri sonra da Google üzerinde yaptığım aramalarda check dışında tatminkâr birşey bulamadım; tâ ki en cutest olanıyla karşılaşıncaya kadar… Doğrusu check‘in de hakkını vermek lâzım, autoconf araçlarıyla uyumlu çalışıyor. Fakat ben biraz daha basit birşeyler peşindeydim. Aslında basitlik sözü beklentimi tam ifade etmiyor. Tekerleği yeniden icat için önemli bir gerekçem olmadığı sürece kullanmaktan kaçınmadığım Glib'le tümleşik bir birim test kitaplığı hemen tercih edebileceğim bir şey olurdu ve bunu yaparken kitaplığın karmaşıklığına değil karmaşıklığı Glib içinde nasıl gizlediğine bakardım. Ama böyle bir kitaplık yok (ben bulamadım en azından). Bu durumda Glib dışına çıkıyorum; bulacağım kitaplığın Glib'in rengi içinde kaybolacak kadar basit olmasını istememin nedeni bu.

Sadece GNOME için değil genel amaçlı bir kitaplık olmak iddiasındaki Glib'de eksikliğini hissettiğim birkaç şeyden biri bu birim test, bir diğeri de “komut satırı ayrıştırıcısı”. GNOME uygulamaları yaygın şekilde popt'u kullanıyor. Eminim ki bana malum olmayan çeşitli gerekçeleri vardır, fakat neden argp değil? Madem Glib dışında bir çözüm aranacak ve komut satırı bir GUI programı için çok da kritik bir alan değil, bağımlılıkları azaltmak adına argp daha uygun olmaz mıydı? Komut satırı ayrıştırıcısının Glib içinde olmaması benim de zor yoldan öğrendiğim bir yerelleştirme kusuruna yol açıyor. Glib üzerinden g_print ailesi ile görüntülenen yerelleştirilmiş iletilerin doğru şekilde görüntülenmesi için bind_textdomain_codeset(PACKAGE, "UTF-8") gibi reçetelendirilmiş bir çağrı gerekiyor. Sorun şu ki, bu çağrıyı argp'nin faaliyetlerinden önce yaparsanız komut satırı iletileri Türkçe olarak doğru basılmıyor. Eğer komut satırı ayrıştırıcısı Glib'e tümleşik, yani ileti trafiği için aynı alt yapıyı kullanıyor olsaydı böyle bir sorun da olmayacaktı. popt'un bu meseleyi erkanına uygun şekilde çözdüğünü de sanmıyorum, fakat aşağı yukarı her GNOME uygulamasında gördüğüm şu libpopt bağımlılığından dolayı hazzetmediğim bu kitaplığı da denemek istemiyorum.

Birim test meselesi… CuTest basit iki dosyadan oluşuyor: CuTest.c ve CuTest.h. CuTest'i kullanan bir gerçek hayat örneği aradım ve izini APR'de buldum, üstelik tam da benim arzuladığım bazı zenginleştirmelerle. Apache geliştiricileri de basitliğinden dolayı CuTest'i kullanmış. Glib'e alternatif olarak öne sürülebilecek genel amaçlı bir C kitaplığı önermem gerekseydi bu basitçe APR olurdu. Bellek havuzu ve kanallama (threading) özellikleri harika. Apache grubunun yazılım misyonuna da uyuyor, yani taşınabilirliği üst seviyede. Pratik sonuçları itibarıyla bir karşılaştırma yapmam mümkün değil, ama taşınabilirliği Glib'den daha iyi olmalı. APR, Glib bağlamında önemli pratik sonuçlara yol açacak bir farklılık var mamafih. APR, özgür fakat GPL uyumlu olmayan Apache lisansıyla geliyor. Yani projenizde GPL bir bileşen varsa APR'den mahrum kalacaksınız; ufak tefek kod parçaları için benim de sığındığım fair use hali veya kişisel kullanım dışında tabii.

CuTest'i APR'deki değiştirilmiş haliyle alarak autoconfiscate etmeye çalıştım. Amacım make check ile icra edilen check hedefini gerçeklemekti. Bu tip muhayyer makamlarda kullandığım bir isimlendirmeyle frobozz dizininde başlayan denemeler olumlu sonuçlar verince bu test sürecini daha da otomatize etmek için birkaç betik yazarak tests/Makefile.am'e ekledim. Fakat automake'in keder verici kısıtlarından dolayı normalde sıradan bir Makefile'da çalışan birçok numara automake'de çalışmıyor (ör. *_SOURCES değişkenlerinde dosyaları açık halde vermek gerekiyor, joker karakterler sapıtıyor vb.). Kod üreten betikleri oldum olası sevmemişimdir. Doğru çözüm CuTest'de yani kitaplık düzeyinde değişiklikler yapmaktı ki şu anda kaçındığım bir şey bu. Bu yüzden autoconfiscate sürecini basit tuttum. Böylesi anlaşılırlık adına daha iyi oldu.