Next Previous Contents

6. A Test Suite

A CVS fán belül lakik a tesztrendszer: amit nyújtani tud, az nagyobb biztonság arra vonatkozóan, hogy a változtatásaid nem rontottak el semmit. Triviális tesztek legalább annyira fotosak, mint a trükkösek: az egyszerû tesztek leegyszerûsítik az összetetteket (legalábbis biztos lehetsz benne, hogy az egyszerûbb dolgok mûködnek, mielõtt belekezdesz az összetettekbe).

A tesztek egyszerûek: csak shell-scriptek a testsuite/ könyvtárban, amiknek sikeresen le kell futniuk. A scriptek ABC-sorrendben futnak, így a `01test' a `02test' elõtt hajtódik végre. Jelenleg 5 könyvtár van:

00netfilter/

Általános Netfilter tesztek

01iptables/

iptables tesztek

02conntrack/

connection tracking tesztek

03NAT/

NAT tesztek

04ipchains-compat/

ipchains/ipfwadm kompatibilitási tesztek

A testsuite/ könyvtárban található a `test.sh'. Ez elkészít két dummy interface-t (tap0 és tap1), felkapcsolja a forwardingot, s kitölt minden netfilter modult. Ezután végighalad a fenti könyvtárakon, s elindítja a test.sh scriptjeiket, egészen addig, míg az egyik hibát nem jelez. Két argumentuma van: `-v'-re kiírja az összes tesztet végrehajtáskor, míg egy teszt nevének megadásával addig kihagy minden tesztet, míg meg nem találja a megadottat.

6.1 Tesztek írása

Készíts egy új file-t a megfelelõ könyvtárban: próbáld meg beszámozni a tesztedet, hogy a helyes idõben fusson le. Pl: az ICMP válasz teszteléséhez (02conntrack/02reply.sh) meg kell gyõzõdnünk a kérés helyes kezelésérõl (02conntrack/01simple.sh).

Jobb sok kis tesztet készíteni, ahol mindegyik lefed egy adott területet, mert segíti a probléma helyének pontos meghatározását.

Ha hibát észlelsz, egyszerûen lépj ki `exit 1'-el, ami hibajelzést generál; ha valami, amit vizsgálsz hibát kell hogy jelezzen, akkor célszerû egy egyedi üzenet megjelenítése. A teszted `exit 0'-val lépjen ki, ha minden sikeres volt. Minden parancs sikerességét ellenõrizni kell, akár a `set -e' használatával, akár egy `|| exit 1' kiegészítéssel minden parancs után.

A segédfunkciók (`load_module' és `remove_module') használhatók a modulok kezelésére: sose támaszkodj az automatikus betöltésre, kivéve, ha valójában azt szeretnéd tesztelni.

6.2 Változók és a környezet

Két játék interface-ed van: tap0 és tap1. A címük a $TAP0 és $TAP1 válozóban található. Mindkettõ netmaskja 255.255.255.0; a hálózati címük a $TAP0NET-ben és a $TAP1NET-ben található.

Van egy üres ideiglenes file-od a $TMPFILE-ban. Ez törlésre kerül a teszted végén.

A tesztjeid a testduite/ könyvtárból fognak futni. Ezentúl ha programokat szeretnél használni, akkor azokat a `../userspace' path-stringgel használd.

A scipted bõvebb információt is megjeleníthet, ha a $VERBOSE be van állítva (a felhasználó megadta a `-v' kapcsolót).

6.3 Hasznos eszközök

Számos hasznos segédprogramot találsz a "tools" könyvtárban: mindegyik nem-nulla visszatérési értékkel jelzi, ha valamilyen problémája akadt.

gen_ip

IP csomagokat tudsz a segítségével elõállítani, amelyek a kimeneten fognak megjelenni. A csomagokat bele tudod küldeni a tap0 és tap1 eszközökbe egyszerû kimenet-átirányítással a /dev/tap0 ill. /dev/tap1-re (ezeket a testsuite elsõ futáskor létrehozza, ha nem léteztek korábban).

gen_ip egy nagyon egyszerû program, ami igen kényes a paraméter-sorrendjére. Elõször az általános opciók jönnek:

FRAG=offset,length

Elkészíti a csomagot, és darabokra tördeli a megadott hosszal és eltolással.

MF

Beállítja a `More Fragments' bitet a csomagban.

MAC=xx:xx:xx:xx:xx:xx

Beállítja a forrás MAC címet a csomagban.

TOS=tos

Beállítja a TOS mezõt (0-255).

Ezután jönnek a kötelezõ paraméterek:

source ip

Forrás IP cím.

dest ip

Cél IP cím.

length

Teljes hossz, a fejlécet beleszámolva.

protocol

A protokoll sorszáma, pl. 17 = UDP.

Az ezután következõ paraméterek protokoll-függõek: az UDP(17)-hez a forrás és a cél portszám; az ICMP(1)-hez a típus és a kód: ha a típus 0 vagy 8 (ping-válasz, vagy ping), akkor két további argumentumot vár (az ID és a sequence mezõk). A TCP-hez a forrás és célport, és a flagek ("SYN", "SYN/ACK", "ACK", "RST" vagy "FIN"). Itt lehetõség van három további argumentumra is: "OPT=" - vesszõvel elválasztott opció-felsorolás, "SYN=" egy sequence number-rel, valamint "ACK=" szintén egy sequence number-rel. Végül egy opcionális argumentum, a "DATA" jelzi a csomag tartalmát, amit a standard inputról tölt fel.

rcv_ip

Az IP csomagokat tudod vele ellenõrizni. Amennyire csak lehetséges, megpróbálja visszaállítani a gen_ip parancssorát (a fragmentek a kivételek).

Nagyon hasznos a csomagok feldolgozásában. Két kötelezõ argumentuma van:

wait time

A maximális idõ másodpercben, amíg a csomag megérkezésére vár a tandard input-ján.

iterations

Az értelmezendõ csomagok száma.

Egy opcionális argumentuma van: a "DATA". Ennek hatására kinyomtatja a csomag tartalmát a kimenetére a fejléc után.

Egy általános felhasználási mód:

# Set up job control, so we can use & in shell scripts.
set -m

# Wait two seconds for one packet from tap0
../tools/rcv_ip 2 1 < /dev/tap0 > $TMPFILE &

# Make sure that rcv_ip has started running.
sleep 1

# Send a ping packet
../tools/gen_ip $TAP1NET.2 $TAP0NET.2 100 1 8 0 55 57 > /dev/tap1 || exit 1

# Wait for rcv_ip,
if wait %../tools/rcv_ip; then :
else
    echo rcv_ip failed:
    cat $TMPFILE
    exit 1
fi

gen_err

Egy csomagot vár (pl. a gen_ip-tól) a bemenetén, s ICMP error üzenetre fordítja.

Három argumentuma van: a forrás IP cím, típus és kód. A cél IP cím a csomag forráscíme lesz.

local_ip

A bemenetén érkezõ csomagot elküldi a rendszerbe egy raw-socketen keresztül. Ez biztosítja a helyileg generált csomagot a tesztekhez (elválasztva a hálózati meghajtókba küldött csomagoktól, amik távolról érkezõnek látszanak).

6.4 Tanácsok

Minden tool feltételezi, hogy mindet meg tud csinálni egy írással vagy olvasással: ez igaz az ethertap device-okra, de nem biztos, hogy igaz ha valami trükköset csinálsz a pipe-okkal.

dd-t lehet használni a csomagok darabolására: dd-nek van egy obs (kimeneti blokkméret) opciója, ami lehetõvé teszi a csomagok egy íráson keresztül való megjelenítését.

Elõször a sikerességre tesztelj: pl. teszteld azt, hogy a csomag sikeresen lockolásra került. Elsõ teszt legyen az, hogy a csomag normálisan áthaladt, s utána teszteld csak a blokkolást. Különben egy nem kívánt hiba megállíthatja a csomagokat...

Próbálj meg precíz teszteket írni, s ne véletlen dolgokkal tesztelj, s figyeld, mi lesz belõle. Ha egy pontos teszt hibát jelez, akkor a hiba helye használható információt adhat. Viszont ha egy véletlen teszt hibázik, akkor nem lehet vele mit kezdeni.

Ha egy teszt üzenet nélkül jelez hibát, használhatod a '-x' opciót a legelsõ sorban (pl: `#! /bin/sh -x'), hogy lásd, hogy melyik programok futnak.

Ha a teszt véletlenszerûen áll meg, ellenõrizd a külsõ behatásokat (próbáld meg leállítani a külsõ interface-eidet). Például Andrew Tridgell-el közös hálózaton ülve felfigyeltem, hogy Windows broadcast-el gyötörték a gépemet.


Next Previous Contents