
# Tesztelés és a git Oracle

A Pitmaster a kanonikus `git` binárist tekinti orákulumának: ha a `git` elfogadja, amit a Pitmaster ír, és a Pitmaster beolvassa, amit a `git` ír, akkor a viselkedés helyes. A tesztinfrastruktúra a Pitmaster tárolóban található. A Composer csomag csak `src/` és `bin/pitmaster` fájlokat tartalmaz, ezért az alábbiak futtatásához klónozd a tárolót az `composer install` után.

## Tesztcsomagok

| Parancs | Mit futtat | Szükséges a `git` |
|---------|--------------|-------------|
| `composer test:unit` | PHPUnit `unit` tesztcsomag: elszigetelt komponens-tesztek | Nem |
| `composer test:integration` | PHPUnit `integration` tesztcsomag: Pitmaster és `git` ugyanazokon a tárolókon dolgozik | Igen |
| `composer test:oracle` | `bin/test-regression`: minden oracle-forgatókönyv | Igen |
| `composer test` | PHPUnit (mindkét tesztcsomag), valamint az oracle-regresszió | Igen |
| `./bin/verify-all` | `composer verify`: támogatási bizonyítékok, upstream eltérések, bizonyító artefaktum, mutációs próba, `composer audit`, PHPStan, kódolási szabványok és `composer test` | Igen |

A CI több PHP-verzión futtatja az egységteszteket, továbbá az integrációs teszteket, az oracle-regressziót (`PITMASTER_TEST_JOBS=4`), valamint a támogatási bizonyítékok és az upstream eltérések ellenőrzését.

## Oracle-forgatókönyvek

Minden forgatókönyv egy könyvtár az `scenarios/<category>/` alatt (összesen 761, ebből 156 a Pitmaster számára készült, 605 pedig más Git implementációkból származik):

```
scenarios/diff/diff-add-lines/
  scenario.json   # commands and expectations
  setup.sh        # builds the starting repository
  oracle/         # outputs captured from git
```

A `scenario.json` megadja a futtatandó parancsot a `git` használatával és a vele egyenértékű Pitmaster paranccsal, valamint azt is, minek kell egyeznie:

```json
{
    "name": "diff-add-lines",
    "category": "diff",
    "operations": ["diff"],
    "oracle_commands": { "diff": "git -c color.ui=never diff" },
    "actual_commands": { "diff": "php \"{{ROOT}}/bin/pitmaster\" diff | perl -pe 's/\\e\\[[0-9;]*m//g'" },
    "expectations": { "exact_match": ["diff"], "fsck_clean": true }
}
```

A futtatás másolatot készít a `setup.sh` által felépített tárolóról, az oracle-t és a Pitmaster parancsokat külön másolatokon futtatja, majd összehasonlítja a kimeneteket, objektumokat, hivatkozásokat és naplót. Az `fsck_clean` azt is megköveteli, hogy a `git fsck` elfogadja a Pitmaster által írt tárolót. Az oracle kimenetét a rendszer az `git` alapján rögzíti, ha hiányzik vagy frissíteni kell; egyébként a tárolóban lévő `oracle/` fájlokat használja.

Egy forgatókönyv pontosan azokat az eseteket fedi le, amelyeket a beállítása létrehoz. A diff-forgatókönyvek például módosított fájlokat hasonlítanak össze, ezért a [Diff](https://pitmaster.inline0.dev/hu/docs/operations/diff) oldalon felsorolt, új, törölt és bináris fájlokkal kapcsolatos diff-kimeneti eltéréseket nem észlelik.

### Forgatókönyvek használata

```bash
./bin/test-scenario <name>                 # oracle, actual, compare for one scenario
./bin/test-regression                      # all scenarios
./bin/test-regression --jobs 4             # in parallel (or PITMASTER_TEST_JOBS=4)
./bin/test-regression --category diff      # one category
./bin/test-regression --fast               # pass/fail only, no reports

./bin/oracle <name>                        # capture git output for a scenario
./bin/oracle --refresh <name>              # re-capture, for example after a git upgrade
./bin/actual <name>                        # run Pitmaster and capture its output
./bin/compare <name>                       # compare oracle and actual output
```

Több git-verzió ellenőrzéséhez sorold fel őket a `PITMASTER_TEST_GIT_BINARIES` fájlban, majd futtasd a füsttesztet:

```bash
PITMASTER_TEST_GIT_BINARIES=/path/to/git-2.45:/path/to/git-2.46 \
  vendor/bin/phpunit --filter MultiGitVersionSmokeTest
```

## Upstream tesztkészletek

Az `scenarios/upstream/` alatti forgatókönyvek más implementációk tesztcsomagjaiból származnak: a git saját tesztcsomagjából (412), az isomorphic-gitből (71), a libgit2-ből (63), a go-gitből (46), az JGit-ből (7) és a dulwichből (6). A szükséges tesztfa-fájlok az `fixtures/upstream/` alatt találhatók a tárolóban, ezért a teljes tesztkészlet friss klónozás után is futtatható hálózati hozzáférés és helyi gépre mutató útvonalak nélkül. A beállító szkriptek az `PITMASTER_ROOT` környezeti változóval találják meg őket.

A `composer verify:drift` (`bin/audit-upstream-drift`) ellenőrzi, hogy minden tárolóban lévő upstream esethez tartozik-e forgatókönyv.

## Támogatási mátrix

A tárolóban lévő `SUPPORT_MATRIX.md` felsorolja az összes hatókörbe tartozó git-funkciót és az állapotát:

| Állapot | Jelentés |
|--------|---------|
| `DONE` | Megvalósítva, és a megadott kompatibilitási körön belül oracle-lel ellenőrizve |
| `PART` | Részben megvalósítva |
| `TODO` | Hatókörön belül van, de még nincs megvalósítva |
| `DEFER` | Egyelőre nincs tervben |
| `N/A` | Hatókörön kívül van |

A fájlt a `bin/support-matrix` állítja elő a `config/support-matrix.json` alapján. A `config/support-evidence.json` minden `DONE` és `PART` sort konkrét tesztekhez és oracle-forgatókönyvekhez kapcsol, a `composer verify:evidence` pedig hibát jelez, ha egy sorhoz nincs bizonyíték. A CI újragenerálja a mátrixot, és hibát jelez, ha az eltér a tárolóban lévő fájltól.

Egy `DONE` sor azt jelenti, hogy a hozzá rögzített forgatókönyvek eredménye megegyezik a git-ével. Az ezeken kívüli viselkedés továbbra is eltérhet; az ismert eltéréseket a [hibakövető](https://github.com/inline0/pitmaster/issues) tartja nyilván.

## Teljesítménymérések

A teljesítménnyel kapcsolatos munkához a `bench/` alatti tesztkeret használható:

```bash
composer bench -- --suite=smoke --runs=1 --warmups=0   # quick check
composer bench:baseline                                # full report
composer bench:compare -- <before.json> <after.json>   # compare two reports
composer bench:verify -- <report.json> bench/reports/smoke-thresholds.json
```

A CI a füstteszt jelentését a tárolóban rögzített küszöbértékekkel veti össze.
