Testy integracyjne
Testy integracyjne weryfikują zachowanie systemu jako całości - uruchamiają rzeczywiste binaria (xretractor, xqry, xtrdb) i porównują ich wyjście z wzorcami lub sprawdzają konkretne właściwości plików wynikowych. Testy jednostkowe używają frameworka GTest do sprawdzania klas i funkcji bibliotek rdb i retractor (np. payload, descriptor, crsMath, compiler). Zależnie od badanego kontraktu również tworzą pliki, procesy potomne i obiekty IPC; sam podział na testy jednostkowe i integracyjne nie wyznacza zakresu używanych zasobów.
Przy budowaniu GCC w konfiguracji Release z aktywnym IPO (RDB_USE_IPO=ON, RDB_BENCH_PROBE=OFF i pozytywny wynik kontroli obsługi IPO) biblioteki zawierają zarówno kod maszynowy, jak i reprezentację do LTO (-ffat-lto-objects). Testy jednostkowe są linkowane z -fno-lto i wykonują zwykły kod maszynowy tych bibliotek; nie sprawdzają wyniku optymalizacji podczas linkowania. Wydawane programy zachowują LTO, więc kod po tej optymalizacji jest sprawdzany przez testy integracyjne uruchamiające te programy. Rozdzielenie ustalają główny CMakeLists.txt i test/UnitTest/CMakeLists.txt przez RDB_UT_WITHOUT_IPO. Nie zmienia ono konfiguracji Debug, a dla kompilatorów innych niż GCC pozostaje dotychczasowe ustawienie IPO testów jednostkowych.
W katalogu build/Debug/ polecenie ninja test uruchamia zwykły zestaw bez etykiety valgrind, a przy domyślnym RDB_WITH_API=OFF także bez api. Samo ctest wybiera wszystkie zarejestrowane grupy, w tym Valgrind i API. ninja test-valgrind wybiera etykietę valgrind, a ninja test-api buduje i uruchamia klientów monitorujących. Pojedynczy test można wybrać przez ctest -R '^nazwa$' -V; CTest dobiera także wymagane oprawy (FIXTURES_REQUIRED). Przed przebiegiem należy odbudować badane cele, sprawdzić katalog źródłowy zapisany w CMakeCache.txt, komendę z ctest -N -V i efektywny PATH. Wybrane programy oraz kopie skryptów i danych w drzewie budowy muszą być zgodne bajtowo z właśnie zbudowanymi celami i bieżącymi źródłami. Szczegóły zawiera test/CLAUDE.md w repozytorium kodu.
Wszystkie scenariusze znajdują się w jednym katalogu test/IntegrationTest. CMake przydziela większości katalogów jedną z szesnastu przestrzeni RDB_NAMESPACE oraz odpowiadającą jej blokadę zasobu. Rozdziela to magistralę, nazwę instancji, obiekty IPC i plik dziennika bez zmiany zapytań ani wzorców. Testy jednego katalogu pozostają wzajemnie wykluczone, ale różne katalogi mogą uruchamiać serwery równolegle. RUN_SERIAL zachowują scenariusze badające produkcyjną tożsamość globalną, współpracę wielu serwerów oraz sprzątanie pozostałości (leftover_sweep), które mogłoby zostać wykonane przez równoległą instancję przed sprawdzeniem asercji.
Blokada RESOURCE_LOCK wyklucza także katalogi, które otrzymały ten sam slot puli; nie ustala jednak kolejności wykonania. Testy jednostkowe mają oddzielne oprawy przygotowania dla zwykłego przebiegu i Valgrinda. Przy pełnym ctest przygotowanie wariantu Valgrinda czeka na zwykły test, aby nie skasować jego metadanych. Przestrzenie nazw pozwalają na równoległość wewnątrz jednego przebiegu CTest; nie izolują dwóch niezależnych przebiegów, które mogą użyć tych samych slotów i instalacji. Na jednej maszynie należy prowadzić tylko jeden przebieg budowania, instalacji lub testów naraz.
Pula ogranicza liczbę przestrzeni, lecz nie rezerwuje pamięci współdzielonej. W obecnym układzie jeden serwer z własną magistralą zajmuje około 5,1 MiB w /dev/shm (magistrala, kolejka poleceń i segment odpowiedzi); 16 takich serwerów może potrzebować około 83 MiB, poza obiektami testów jednostkowych. Kontener z limitem 64 MiB nie mieści pełnej puli. Przy błędach shared memory too small lub No space left on device trzeba zwiększyć dostępną pamięć współdzieloną albo zmniejszyć równoległość; samo rozdzielenie nazw nie rozwiązuje braku pojemności.
Skrypty korzystają z portable.sh, m.in. do pomiaru rozmiaru plików, limitów czasu i odczytu wartości binarnych. file_size zwraca 0 także dla nieistniejącego pliku, więc równość rozmiarów nie dowodzi istnienia ani zgodności danych. Oczekiwane artefakty wymagają kontroli obecności i treści, np. przez cmp lub niezależną wyrocznię. Analogicznie kontrola stanu IPC musi dotyczyć własnej przestrzeni testu: zmiany obiektów sąsiada nie świadczą o braku izolacji. Test Python api/python/tests/test_isolation.py porównuje stan swojej przestrzeni przed kompilacją, po wykonaniu, zamknięciu i wyjściu procesu, także po SIGKILL, przy działającym serwerze referencyjnym.
Poniższe tabele opisują zamiar każdego scenariusza. Nie są inwentarzem wykonywalnym: jeden katalog rejestruje zwykle kilka wpisów ctest (warianty -run, -compile, -vg, warianty nazwane), a lista rośnie z każdym wydaniem. Aktualny stan zwraca ctest -N w katalogu build/Debug.
Po scaleniu drzew wszystkie testy integracyjne mają prefiks it_; dawny prefiks pt_ nie opisuje już osobnej klasy. Testy skryptowe używają st_, a testy klientów monitorujących etykiety api. Osadzany binding Pythona ma osobną etykietę python: przy RDB_PYTHON=ON wpis python_stage odświeża pakiet, a python_binding uruchamia pytest w zwykłym ninja test. Nie należą one do ninja test-valgrind. Dwa strażniki nadrzędne - harness_guard-selftest i harness_command_integrity - sprawdzają, że wrapper rzeczywiście uruchomił polecenie pod testem i nie zamaskował jego kodu wyjścia.
Opisy Valgrinda dotyczą standardowego przebiegu na Linuksie. Rozwojowy port Apple uruchamia testy bez tego opakowania i wymaga osobnego budowania z sanitizerami; nazwa -vg nie potwierdza kontroli pamięci. Zakres testów i jawnego test-api opisuje środowisko rozwojowe Apple. Testy jednostkowe test_busFallback.cpp sprawdzają także utrzymanie zamka przez zatrzymanego żywego właściciela i odzyskanie po jego śmierci.
Scenariusze wykonawcze i usługowe
| Nazwa testu | Opis |
|---|---|
Data | Wspólny zestaw danych i zapytań dla scenariuszy przekrojowych: waterfall (przebieg pełnego planu przez -m 10 i posprzątanie artefaktów), workflow (zapytanie referencyjne, porównanie dwóch strumieni wynikowych) oraz all-operators (ten sam przebieg dla zapytania używającego kompletu operatorów algebry). Patrz: Przetwarzanie i dystrybucja danych. |
ipc_identity_lock | Zajęta tożsamość IPC odrzuca start przed zmianą magazynu; dwa serwery z tą samą jawną nazwą nie mogą przejąć wspólnego IPC mimo różnych TMPDIR i przestrzeni magistrali. Pierwszy serwer nadal odpowiada. Blokadę zajmuje protokołem silnika (stillLinked z ponowieniami), bo gołe open() + flock() przegrywało z zamiatarką sąsiedniego testu. Każda nieudana kontrola zrzuca stan w chwili awarii - zawartość /dev/shm z i-węzłami, blokady z właścicielami z /proc/locks, tablicę procesów i ogon logu silnika - dlatego test biegnie równolegle, bez RUN_SERIAL. |
leftover_sweep | Sprzątanie po zwykłym wyjściu, restarcie po SIGKILL, wyjściu innej instancji i jawnym --cleanup. Sprawdza zachowanie zasobów żywego serwera. Działa szeregowo, aby równoległy proces nie usunął badanych pozostałości. |
agse1 | Operator okna @(krok, szerokość) - krok liczony w płaskich elementach źródła; dodatnia szerokość @(1,4) układa okno od najnowszego elementu, a ujemna @(1,-4) odwraca jego kolejność. Patrz: Ruchome okno danych AGSE. |
agse_array | AGSE nad liczbowym polem tablicowym i równoważnym schematem skalarnym: każdy płaski element musi wejść do okna w tej samej kolejności. Patrz: Operatory agregujące, Przebiegi kompilacji. |
agse_volatile | Okno AGSE nad strumieniem VOLATILE (bufor MEMORY) musi widzieć cały zakres okna. Przy zbyt małej pojemności bufor kołowy nadpisuje najstarsze pole i okno czyta w jego miejsce rekord najnowszy. Patrz: Klauzula VOLATILE, Ruchome okno danych AGSE. |
array_derived | Równoważność liczbowego T[N] i jawnych pól skalarnych przez kopię, przesunięcie, AGSE, redukcję SUMC, przeplot oraz mieszany przeplot; obejmuje też mapowanie NULL. Patrz: Operatory agregujące, Przebiegi kompilacji. |
client_tty_keystroke_immunity | Bajt oczekujący na pseudoterminalu nie może skrócić odbioru xqry --elimitqry N; klient ma odebrać cały budżet rekordów i dopiero potem wykonać połączone --kill. |
config_storage_validation | Twarde odrzucenie niepoprawnego storage.dir w pliku TOML: wariant nonexistent (katalog nie istnieje) i unwritable (brak prawa zapisu). W obu program kończy się kodem niezerowym i komunikatem Configuration error: storage.dir …. Wariant config-errors sprawdza wykrytą warstwę z błędną składnią TOML i ze względnym paths.lock_dir w xretractor, xqry i xtrdb (kod niezerowy, nazwa pliku i przyczyna na stderr), brak pliku jako kontrolę dodatnią, jawne --config oraz działanie --help mimo uszkodzonej konfiguracji. Patrz: Opcje wywołania - xretractor, Plik konfiguracyjny. |
deinterleave_roundtrip | Bitowa weryfikacja tożsamości okrężnej przeplot–rozplot: a2 i b2 odtwarzają składowe dokładnie, od rekordu zerowego, bez rekordu-zastępnika. Wzorce wyprowadzone z definicji formalnych, nie z wyjścia silnika. Patrz: Ogony, początki logiczne i obserwowalność operatorów. |
device_timeout | Odczyt źródła DEVICE bez blokowania, z FIFO jako kontrolowanym źródłem: jawna klauzula TIMEOUT w wydruku -c, ostrzeżenie o terminie dłuższym od szybkości, odmowa TIMEOUT przy przestarzałym FILE i ujemnego [sources] timeout_s; pierwszeństwo terminu (RQL, konfiguracja, 0, tryb -f); te same bajty jako BINFILE i jako DEVICE dają te same wyniki za operatorami wielotaktowymi; FIFO bez pisarza bez zawieszenia, z rekordami NULL; --until-eof kończy się na odejściu pisarza bez rekordu NULL zza końca; xqry odpowiada w trakcie czekania na źródło; TIMEOUT przechodzi przez import ad hoc i --reset. Wariant -vg- pod Valgrindem. Patrz: Polecenie DECLARE. |
ecg_qrs | Pełne wykonanie przykładowego potoku EKG w zwartej postaci: okna bezpośrednio w FROM, rozwinięcie [_] według ich szerokości i reduktory funkcyjne. Test kontroluje origin= i tail= w planie oraz 4830 rekordów deterministycznej treści czterech strumieni pośrednich i końcowych. Patrz: Wizualizacja EKG MIT-BIH, Przetwarzanie symbolu _, Ogony, początki logiczne i obserwowalność operatorów. |
agse2 | Kombinacje okna @(n,m) na strumieniu 3-polowym, wyrównanie i rate-conversion przy proporcjach 1:1, 1:2, 2:3, 2:4. Patrz: Ruchome okno danych AGSE. |
agse3 | Operator @(n,m) gdy output rate jest niższy niż input rate (source rate 0.1) - okna @(3,2), @(3,3), @(3,-3). Patrz: Ruchome okno danych AGSE. |
consistency | Spójność odczytu: dwa strumienie czytają to samo źródło; ich różnica musi być stale równa 100. Patrz: Przepływ danych i sterowania. |
fatal_exit_path | Błąd krytyczny podczas startu i w wątku komunikacyjnym kończy proces statusem 1, usuwa IPC oraz blokadę usługi i nie przechodzi w SIGSEGV ani SIGABRT. Patrz: Przepływ danych i sterowania. |
fncall_runtime_case | Wykonanie funkcji matematycznych zapisanych formami dopuszczonymi przez gramatykę, w tym Sqrt, Ceil i Floor; test sprawdza wartości w runtime, nie tylko poprawną kompilację. Patrz: Wyrażenia pól i funkcje skalarne. |
index_wildcard_mixed | Rozwinięcie [_] jako jednej pozycji mieszanej listy SELECT: zachowanie kolejności pól przed i po rozwinięciu, dwa niezależne rozwinięcia oraz zgodność układu payloadu z ręcznym wzorcem. |
adhoc_parse_error | Błędna składnia, kilka instrukcji, literał poza zakresem, zerowy interwał i inne niepoprawne wartości są odrzucane z powodem bez zatrzymania serwera ani zmiany planu. Dotyczy to także deklaracji LET i odwołań ?NAZWA, których kanał ad hoc nie przyjmuje. |
adhoc_rule | Dołączenie RULE ... DO DUMP w locie, granica dostępnej historii oraz odrzucenie DO SYSTEM i zbyt głębokiego zakresu dla magazynu MEMORY. |
issue202_hash_shift_e2e | Wykonawcza weryfikacja tożsamości (A>2)#(B>1) = (A#B)>3 dla ΔA=0,1 i ΔB=0,2: niezależne źródła tekstowe, identyczność fizycznych strumieni matched i CC oraz porównanie z sekwencją wyliczoną z formuły przeplotu. Patrz: Substraty. |
issue113_meta_internal | Struktura pliku sidecar .meta: rozmiar nagłówka (8 B), rozmiar wpisu (18 B), interwał próbkowania, bitsety null dla rekordów z null i bez. Patrz: Format zapisu danych - Pliki. |
issue113_meta_xtrdb | Weryfikacja przez xtrdb że po uruchomieniu xretractor+xqry plik .meta powstaje i jest raportowany poprawnie (meta: temp/str_null.meta). Patrz: Format zapisu danych - Analiza artefaktów. |
issue113_null_skip | Flaga -n w xqry - wiersze w całości null są pomijane; bez flagi wszystkie wiersze (łącznie z all-null) muszą być obecne. Patrz: Opcje wywołania - xqry. |
issue113_null_xqry | Null przesyłane przez IPC: wartości null z pliku źródłowego wyświetlane jako null w wyjściu xqry. Patrz: Opcje wywołania - xqry. |
issue121_isnull | Funkcja isnull(field) - zwraca 1 gdy pole jest null, 0 gdy nie jest. Patrz: Wyrażenia pól i funkcje skalarne. |
issue121_null_propagation | Propagacja wartości null przez SELECT do strumienia wynikowego. Patrz: Polecenie SELECT. |
issue128_numeric_to_string | Konwersja INTEGER/FLOAT do STRING funkcją to_string() z deklaracją szerokości pola; weryfikacja deskryptora wynikowego. Patrz: Wyrażenia pól i funkcje skalarne. |
issue128_string_to_numeric | Konwersja STRING do typów numerycznych: to_integer(), to_float(), to_double(); propagacja null przez konwersję. Patrz: Wyrażenia pól i funkcje skalarne. |
issue167_dedup_cascaded | Kaskadowe wchłanianie substratów przez deduplicateSubstrats() - wieloetapowe przepisywanie tokenów PUSH_ID. Patrz: Substraty. |
issue167_dedup_field_names | Deduplikacja substratów bez porównania nazw pól schematu - scalanie gdy typy pól są równoważne, niezależnie od nazw. Patrz: Substraty. |
issue167_dedup_nonzero_offset | Aktualizacja PUSH_ID w lSchema konsumenta przy niezerowym offsecie wchłanianego substratu; pokrycie ścieżki w compiler.cpp. Patrz: Substraty. |
issue167_dedup_positive | Podstawowy przypadek deduplikacji: substrat scalany z nazwanym strumieniem o równoważnym programie i typach pól. Patrz: Substraty. |
issue167_triarg | Wieloargumentowe wyrażenia strumieniowe: s1+s2+s3, (s1#s2)#s3, s1+(s2#s3), s1+s2+s3+s4; substraty pamięciowe i dyskowe. Patrz: Substraty, Sekwencjonowanie operacji. |
issue217_client_diag_stderr | Diagnostyka xqry musi trafiać na stderr, a nie na stdout. Wywołanie przy braku serwera kończy się kodem niezerowym i niepustym stderr - bez tego przekierowanie >/dev/null 2>err czyniło każdą awarię klienta niewidoczną. Patrz: Opcje wywołania - xqry. |
issue227_join_alignment | Rozdzielenie początku logicznego od ogona. Wariant run sprawdza wypisywane przez kompilator origin= i tail= oraz treść złączenia okna z jego źródłem; wariant adhoc-origin - że zapytanie dołożone w locie zaczyna od slotu, w którym zobaczył je runtime. Wartości oczekiwane wyprowadzone z definicji operatorów. Patrz: Ogony, początki logiczne i obserwowalność operatorów, Zapytania Ad hoc. |
issue42_rule | Polecenie RULE - warunkowe akcje DUMP i SYSTEM wyzwalane na wartościach strumienia; uruchamia xretractor i odczytuje wynik przez xtrdb. Osobny wpis -dump rozkłada pliki temp/str1_*_dump*.tmp na wartości INTEGER i porównuje je ze wzorcem - przypina stan faktyczny, razem z wiodącymi zerami, które DO DUMP -5 zapisuje nad strumieniem młodszym niż sześć rekordów. Patrz: Polecenie RULE. |
k19_boundaries | Granice obserwowalności operatorów: okno do przodu i wstecz, różnica o interwale równym i dwukrotnym, redukcja .sumc. Rozróżnia prawdziwy NULL wewnątrz pełnego okna od wewnętrznego rekordu all-null zwracanego jako bezpiecznik przy odczycie poza historią. Patrz: Ogony, początki logiczne i obserwowalność operatorów. |
k24_capacity | Głębokość historii dla operatorów czytających w przód. Różnice o ilorazie całkowitym ≥ 3 dawały wcześniej strumień poprawnej długości złożony wyłącznie z rekordów all-NULL (cichy defekt), a łańcuch okna, przesunięcia i przeplotu kończył się przerwaniem procesu w storage::revRead. Patrz: Przebiegi kompilacji. |
k24h10_exact_tails | Granice emisji dla różnicy oraz obu rozplotów, także nad źródłami o niezerowym ogonie. Liczba i treść rekordów chronią dokładne reguły fazowe przed przedwczesną lub opóźnioną emisją. Patrz: Ogony, początki logiczne i obserwowalność operatorów. |
let_constants | Stałe LET i odwołania ?NAZWA we wszystkich kontekstach liczbowych. Para planów „literały / LET” daje bajtowo równe wydruki xretractor -c (tekst, CSV, DOT) oraz bajtowo równe pliki strumieni, deskryptory i zrzuty DUMP po przebiegu na tych samych danych. Patrz: Polecenie LET. |
let_typed | Jawny typ stałej LET (#547). Stała DOUBLE nad polem DOUBLE obok stałej 0.1 bez adnotacji (FLOAT) - różnica widoczna w osobnym polu; stała RATIONAL w wyrażeniu nad polem INTEGER daje pole RATIONAL; stała UINT 3000000000 w RULE ... WHEN nad polem UINT, z licznikiem VAR trafień. Wartości i typy pól z .desc wobec wyroczni oracle.py. Patrz: Polecenie LET. |
var_read | VAR bez SET jest równoważna LET w wyrażeniach skalarnych; typy, programy i wyniki pozostają zgodne. |
var_set | Histereza, licznik, EMA i przeskalowane uc10/uc11/uc12/uc14 porównywane z niezależną wyrocznią Pythona od początku przebiegu; zapis od następnego slotu, konflikty według kolejności reguł, NULL i dwa identyczne przebiegi offline. |
var_reset | Utrata stanu zatrzasku po ponownym wczytaniu planu i powrót dopiero po nowym przekroczeniu progu. |
var_adhoc | Odczyt VAR i dołączanie DO SET w locie, pierwszeństwo późniejszej reguły, odmowy bez zmiany stanu oraz reset bez przecieku nazw i wartości. |
var_xqry | xqry –vars przed pierwszym slotem i po SET; INTEGER, FLOAT, RATIONAL, NULL, YAML, odmowa JSONL oraz puste listy dla planu bez VAR i instancji bez planu. |
var_typed | Jawny typ VAR: licznik UINT zerowany literałem, akumulator DOUBLE nad polem DOUBLE i próg RATIONAL przywracany literałem 0.1 (dokładnie 1/10), porównane z wyrocznią Pythona; dwa przebiegi bajtowo równe i typy z adnotacji w xqry –vars. |
noclock_offline | Równoważność artefaktów i logicznej osi czasu między wykonaniem taktowanym a --no-clock, razem z odrzuceniem połączenia --no-clock --realtime. Patrz: Opcje wywołania - xretractor. |
multiserver_named | Dwie nazwane instancje, rozłączne blokady i IPC, wszystkie formy --name, automatyczne nazwy oraz niezależne zatrzymanie. |
multiserver_no_clobber | Przegrany start tej samej instancji nie kasuje artefaktów właściciela i raportuje jego PID. |
multiserver_routing | Automatyczny routing strumieni, ad hoc i RULE, odmowa przekroczenia granicy serwerów, lista magistrali oraz oczekiwanie na właściwą instancję. |
multiserver_uniqueness | Atomowa unikalność nazw strumieni, plików magazynu i licznika rotacji przy starcie, ad hoc, dostarczaniu do usługi i konkurencyjnych uruchomieniach. |
null_divide_by_zero | Dzielenie przez zero jest wartością pochłaniającą: strumień oddaje NULL i pracuje dalej. Istotą testu jest rekord następujący po dzieleniu - gdyby brak wyniku był obsługiwany wyjątkiem, nigdy by nie powstał. Patrz: Wyrażenia pól i funkcje skalarne. |
issue56_timeshift | Operator filtra > na połączonych strumieniach - do wynikowego strumienia trafiają tylko rekordy spełniające warunek. Patrz: Polecenie SELECT - Sekwencjonowanie. |
issue61_tmpmem | Substrat pamięciowy SUBSTRAT 'memory' - dane pośrednie przechowywane w RAM zamiast na dysku. Patrz: Typy STORAGE. |
issue6_adhoc | Tryb zapytania ad-hoc: xqry -a 'SELECT ...' - definicja i wykonanie zapytania w locie bez pliku .rql. Patrz: Zapytania Ad hoc. |
operations | Operator # (HASH merge) dwóch strumieni o różnych rate - weryfikacja stosunku liczby rekordów w wyjściu. Patrz: Sekwencjonowanie operacji przeplotu. |
optimizer_ablation | Wariantowe budowanie z wyłączanymi regułami optymalizatora. build-info sprawdza tożsamość zgłaszanej konfiguracji binarki, plan - kształt planu, a pozostałe warianty (semantic, factor-*, dedup-*) porównują wynik wykonania między konfiguracjami. Każda dopuszczalna konfiguracja optymalizatora musi zachować obserwowalny wynik. Patrz: Budowanie produkcyjne i warianty diagnostyczne. |
packaging | Kontrola dokładnej zawartości pakietu DEB (jeśli dostępne jest dpkg-deb): trzy binaria, jednostka systemd, licencja, domyślny TOML i przykłady konfiguracji. Osobno kontroluje portable TGZ: trzy binaria, licencję i domyślny TOML, ze ścieżkami względnymi i bez usługi. Pakiet źródłowy jest wyłączony i nie jest badany. Patrz: Budowanie produkcyjne i warianty diagnostyczne. |
r1_identity_nulls | Tożsamość R1 dla planu przepisanego, nieprzepisanej lewej strony i jawnej prawej strony: równość origin=, payloadu oraz mapy NULL w .meta. Strona nieprzepisana ma ogon ściśle większy - R1 zachowuje ciąg rekordów, nie opóźnienie - więc jej porównanie obejmuje wspólny prefiks. Przypadek ΔA/ΔB=3/2 chroni maksimum fazowe własnego ogona #. Patrz: Substraty. |
replay_stability | Powtórzenie tego samego planu na tych samych danych musi wytworzyć identyczny zestaw niepustych artefaktów: payloady, deskryptory, mapy NULL i pliki cienia; z metadanych pomijany jest wyłącznie 8-bajtowy nagłówek zarezerwowany. Patrz: Odtwarzanie strumienia, Format zapisu danych. |
rotation_test | Mechanizm rotacji plików binarnych strumieni (ROTATION) - liczba plików po dwóch cyklach xretractor -m 2. Patrz: Mechanizm rotacji. |
select_cse_commutative_add | Współdzielenie równoważnych obliczeń SELECT dla a+b i b+a: jeden STREAM_SELECT_*, zachowanie osobnych publicznych artefaktów i deskryptorów, identyczność danych oraz metadanych NULL. Test chroni też SELECT *, kolejność projekcji i kontrprzykład ze zmianą grupowania trzech źródeł. Patrz: Substraty. |
service_delivery | Przekazanie zestawu do działającej usługi: właściwy wybór celu, zapis planu startowego, odmowa przy kolizji z inną instancją oraz uruchomienie osobnej instancji po podaniu --name lub --autoname. |
service_idle | Tryb usługowy i bezczynny: start bez pliku .rql przechodzi czysto, a dziennik trafia na stderr w formacie sd-daemon (prefiks priorytetu, bez znacznika czasu). Dwa warianty włączenia - flagą --service i zmienną XRETRACTOR_SERVICE. Patrz: Perspektywa ogólna, Opcje wywołania - xretractor. |
service_reset | Dwufazowe zastąpienie pełnego planu, zachowanie starego planu po odmowie, przejście do i ze stanu bezczynnego oraz zapis planu startowego usługi. Obejmuje też granicę DO SYSTEM: plan z taką regułą jest odrzucany w całości, odmowa nazywa regułę i powód, reguła się nie wykonuje, a stary plan liczy dalej - i ten sam plan wchodzi, wraz z działającą regułą, gdy konfiguracja unrestricted.toml ustawia service.unrestricted = true. |
service_reset_double | Dwie kolejne wymiany planu tej samej instancji i poprawne odtworzenie zasobów kolejnej epoki. |
service_reset_race | Konkurencyjne resetowanie i polecenia klienta nie widzą częściowo rozebranego ani częściowo aktywnego planu. |
show_handler_failure | Awaria serwerowej obsługi subskrypcji show dociera do klienta jako bezpośrednia przyczyna odmowy, zamiast ujawnić się dopiero jako timeout oczekiwania na kolejkę odpowiedzi. |
simple | Dymny test arytmetyki na połączonych strumieniach (core0 rate 0.1 + core1 rate 0.2) z odczytem przez xtrdb. Patrz: Polecenie SELECT. |
simple_max | Zgodna wstecz, wygaszana notacja .max - wartość maksymalna i złączenie z oryginalnym strumieniem. Patrz: Operatory agregujące. |
slot_schedule | Harmonogram slotów względem stałej kotwicy, mierzony po chwilach pojawiania się rekordów w magazynie: praca slotu krótsza od okresu (czekanie na pusty DEVICE i reguła DO SYSTEM) nie powoduje narastania opóźnienia, także z --realtime; po pojedynczym przestoju zaległe sloty idą bez snu, wykonanie wraca na pierwotną siatkę, a artefakty BINFILE i DEVICE są bajtowo równe przebiegowi --no-clock; nowa epoka po --reset ma własną kotwicę; import ad hoc nowej szybkości nie przesuwa osi; SIGTERM w trakcie snu kończy przebieg od razu, bez slotu przed terminem. Wariant -vg- pod Valgrindem (dryf i nadrabianie, okres 1/4 s). Patrz: Algorytm przeglądu drzewa zapytań. |
source_kinds | Rodzaj źródła ze słowa kluczowego, nie ze ścieżki: BINFILE 'ascii.txt' czyta surowe bajty, TEXTFILE 'values.dat' parsuje tekst z tokenem NULL, DEVICE na FIFO o nazwie .txt czyta surowe bajty, a bajt zero nie jest NULL. Odmowy rodzaju pliku (FIFO bez pisarza, urządzenie znakowe, zwykły plik dla DEVICE) z kodem 71 i bez zawieszenia. Forma przestarzała FILE daje bez --verbose wyjście identyczne z jawnymi słowami, a z --verbose jedno ostrzeżenie na deklarację - także przy imporcie ad hoc. Deskryptor źródła: dawny TYPE DEVICE pliku binarnego zastępowany, zmiana rodzaju albo ścieżki odrzucana. Wariant -vg- pod Valgrindem. Patrz: Polecenie DECLARE. |
stream_generator | Generator SELECT ... STREAM cell[N]: wykonanie rodziny odpowiada ręcznie rozpisanym strumieniom, instancje mają nazwy cell$0…cell$(N-1), a sprzątanie usuwa artefakty całej rodziny. Patrz: Polecenie SELECT - Generatory strumieni. |
string_field_passthrough | Tekst bez cudzysłowów ze źródła TEXTSOURCE, wyrównanie sąsiednich pól, przycięcie do STRING[N], propagacja typu i rzeczywista wartość Length. Patrz: Wyrażenia pól i funkcje skalarne, Przebiegi kompilacji. |
tty_keystroke_immunity | Bajt oczekujący na pseudoterminalu nie może skrócić wykonania xretractor --llimitqry N; przebieg pod TTY ma wytworzyć tyle samo danych co przebieg bez terminala. |
untileof_stop | --until-eof odpowiada ręcznie ograniczonemu źródłu ONESHOT, nie zawija pliku i przy wielu źródłach zatrzymuje się na pierwszym wyczerpanym. Wariant it_untileof_stop-missing-sources (#488) sprawdza TEXTFILE, BINFILE i DEVICE: brak pliku lub katalogu nadrzędnego, składnik ścieżki niebędący katalogiem, zerwane dowiązanie oraz brak uprawnień (dla konta bez uprawnień roota). Z -u i w przebiegu ograniczonym -m wymaga zakończenia kodem EIO w limicie 5 s, komunikatu z przyczyną, niezmienionych poprzednich wyników i braku serii ostrzeżeń odczytu. Sprawdza też -c bez dostępnego źródła oraz zniknięcie wejścia po kontroli wstępnej, przed budową modelu: kod EIO bez zapisanych rekordów wyniku. Patrz: Opcje wywołania - xretractor. |
wide_from_names | Szeroka klauzula FROM po przekroczeniu progu 200 bajtów używa stabilnej skróconej nazwy substratu, nie przekracza NAME_MAX, zachowuje deduplikację i wykonuje redukcję SUMC nad oknem poprawnie. Patrz: Substraty. |
window_aggregate | Agregaty MIN/MAX/AVG/SUMC(wyrażenie : W) po historii rekordów: wartości, typy, brzegi, tablice, wyrażenia, wspólne grupy, NULL, null2zero i propagacja schematu przez kopię. Patrz: Operatory agregujące. |
xqry_array_row | Pełna serializacja liczbowego pola tablicowego przez xqry: wszystkie elementy i ich kolejność w formatach raw, Graphite oraz InfluxDB, bez ograniczenia liczby wartości do liczby wpisów deskryptora. Patrz: Opcje wywołania - xqry, API monitorowania strumieni. |
xqry_elem_limit | Parametr -m N w xqry - limit liczby odebranych rekordów do dokładnie N, niezależnie od długości źródła. Patrz: Opcje wywołania - xqry. |
xqrywait_gate | Bramka --xqrywait nie gubi pierwszego polecenia, nie zeruje budżetu --llimitqry i daje się przerwać sygnałem przed nadejściem klienta. |
Nowsze scenariusze regresyjne
| Nazwa testu | Opis |
|---|---|
adhoc_register_rollback | Wymuszony błąd statusowy i osobny wariant -throw z wyjątkiem po imporcie przywracają plan i roszczenia magistrali; klient otrzymuje przyczynę, serwer nadal liczy, a ponowione zapytanie daje dane. |
hash_string | Przeplot pól STRING o różnych szerokościach i pól INTEGER/DOUBLE, w obu kolejnościach źródeł oraz przez ad hoc. Wariant -adhoc-zero-step dołącza źródło przed krokiem zerowym przez bramkę -x i sprawdza inicjalizację jego bazy logicznej. |
expr_corpus | Plany wyrażeń, w tym typy mieszane, napisy i granice przepełnienia, sprawdzają wartości i typy wobec wzorców oraz niezależnej wyroczni. Wyrocznia czyta także binarne FLOAT/DOUBLE i zawartość zrzutów DUMP; own_rules obejmuje prawdziwe i fałszywe warunki reguł, precyzję liczb rzeczywistych oraz granice UINT. |
ipc_client_killed_reading | Śmierć klienta podczas odczytu odpowiedzi nie blokuje kolejnych komend. |
issue252_missing_stream | Żądanie nieznanego strumienia zwraca odmowę, a serwer nadal emituje rekordy. |
rule_string_compare | Porównania napisów oraz warunek z samym napisem w RULE WHEN uruchamiają reguły we właściwych slotach. |
xtrdb_engine_guard | xtrdb odmawia przy żywej instancji nazwanej, także z własnym paths.lock_dir, lecz dopuszcza porzucony plik blokady. FIFO w katalogu blokad nie zawiesza narzędzia. Nieczytelny plik powoduje odmowę cannot verify bez zmiany magazynu; ten przypadek jest jawnie pomijany dla roota. |
xtrdb_lost_lock | xtrdb odmawia przy żywym silniku, którego plik blokady skasowano lub podmieniono, i pisze ponownie po jego zatrzymaniu (#573). |
expr_result_types | Typy i rozmiary pól wynikowych, wartości ułamkowe, NULL oraz kopiowanie schematu przez SELECT *. |
field_ref_outside_from | Odrzucenie odwołania do pola strumienia spoza FROM i poprawność odwołania przez pole strumienia wynikowego. |
reducer_field_ref | Odrzucenie nazwy reduktora jako pola w SELECT oraz odczyt wyniku przez zmaterializowany strumień. |
reducer_float_max_avg_count | MAX nad ujemnymi FLOAT i DOUBLE oraz AVG nad rekordami o 256 i 257 polach. |
self_ref_field_shape | Typ pola wskazanego własną nazwą strumienia pochodzi z odpowiedniego slotu rekordu FROM. |
self_ref_simplify_synth | Typy slotów wejściowych okna i reduktora chronią obliczenia FLOAT przed błędnym uproszczeniem stałych. |
self_ref_simplify_type | Odwołanie własną nazwą w wyrażeniu podlegającym uproszczeniu używa typu slotu FROM, a nie typu pola wyjściowego. |
silent_arith_overflow | Przepełnienie arytmetyki INTEGER i RATIONAL w wyrażeniach i reduktorach daje NULL zamiast zawiniętej liczby. |
synth_node_output_shape | Typy pól wyjściowych po oknie, redukcji i złączeniu odpowiadają rzeczywistym slotom wejściowym. |
xqrywait_first_row | Pierwszy rekord nie ginie między otwarciem bramki --xqrywait a utworzeniem kolejki subskrypcji xqry. |
Scenariusze kompilacyjne i offline
Poniższe katalogi rejestrują przede wszystkim warianty kompilacji, prezentacji planu albo operacji na artefaktach. Część z nich jest ta sama co w tabeli wykonawczej, ponieważ jeden CMakeLists.txt może rejestrować kilka niezależnych wpisów CTest.
| Nazwa testu | Opis |
|---|---|
Data | Kompilacyjna strona wspólnego zestawu Data (pliki dzielone z wariantem sekwencyjnym): on-query - kompilacja zapytania referencyjnego, presenter - prezentacja planu po tej kompilacji, banned-artifacts - strażnik sprawdzający, że w katalogu instalacyjnym nie powstał artefakt o zakazanej nazwie kolidującej z narzędziami systemowymi. Patrz: Kompilacja i budowa planu. |
dsp | Regresja kompilacyjna dla zwartego potoku filtra FIR: okno source@(1,25) bezpośrednio w FROM, 25-elementowe rozwinięcie source[_] * filter[_], redukcja SUMC(accRow) oraz złączenie sygnału i wyjścia. Patrz: Implementacja filtru sygnałowego, Przetwarzanie symbolu _. |
issue113_meta | Operacje xtrdb po dwóch append - lista rekordów i hexdump pliku binarnego porównywane ze wzorcem. Patrz: Format zapisu danych - Analiza artefaktów. |
issue113_meta_autocreate | Automatyczne tworzenie pliku sidecar .meta po pierwszym append; rozmiar >16 B; xtrdb raportuje poprawną ścieżkę. Patrz: Format zapisu danych - Pliki. |
issue113_null_txtsrc | Komendy rread/getpos w xtrdb na strumieniu TEXTSOURCE zawierającym null. Patrz: Format zapisu danych - Analiza artefaktów. |
issue153_storagemap_meta_cases | Mapa składowania xtrdb -s dla pliku zwykłego i retractordb-style: znaczniki slotów, lista segmentów, pliki rotowane, referencje .meta/.shadow. Patrz: Narzędzie inspekcji xtrdb -s. |
issue202_hash_shift_factorization | Algebraiczna optymalizacja (A>i)#(B>k) do (A#B)>(i+k) dla i·ΔA=k·ΔB oraz ochrona przypadku niedopasowanego. Patrz: Substraty. |
issue31_doc | Generowanie grafów DOT/SVG przez xretractor -c -d ... dla przykładów dokumentacyjnych na trzech poziomach szczegółowości. Patrz: Debugowanie kompilacji. |
issue42_rule | Kompilacja składni RULE - tylko etap -c, bez uruchamiania serwera. Patrz: Polecenie RULE. |
issue56_timeshift | Kompilacja operatora filtra > - tylko etap -c. Patrz: Polecenie SELECT - Sekwencjonowanie. |
issue61_tmpmem | Kompilacja zapytania z SUBSTRAT 'memory' - tylko etap -c. Patrz: Typy STORAGE. |
issue95_loopInCompile | Wykrywanie cykli w grafie zapytań przez kompilator - oczekiwany błąd “Circular dependency” i niezerowy kod wyjścia. Patrz: Wykrywanie pętli w kompilacji. |
issue96_no_substrat_reduction | Strumienie zdefiniowane przez użytkownika o identycznej strukturze NIE są scalane; scalaniu podlegają tylko automatyczne substraty. Patrz: Substraty. |
issue96_substrat_reference | Wygenerowany substrat współdzielony przez dwa strumienie użytkownika - poprawne referencje w drzewie zależności. Patrz: Substraty. |
Pattern1 | Kompilacja operatora # (HASH-merge), selekcji pól z przesunięciem i łączenia strumieni +. Patrz: Sekwencjonowanie operacji przeplotu i sumowania. |
Pattern2 | Kompilacja zapytań na strumieniach BYTE z /dev/urandom: SELECT, arytmetyka, łączenie strumieni. Patrz: Polecenie SELECT. |
Pattern3 | Kompilacja SELECT * (unfold) z deklaracją pliku wyjściowego i retencją. Patrz: Rozwijanie symbolu *. |
Pattern5 | Operacje xtrdb na rekordzie wielotypowym (STRING, INTEGER, BYTE, FLOAT): append, read, list/rlist, input, write. Patrz: Analiza artefaktów. |
Pattern6 | Kompilacja operatora okna @(n,m) do przodu @(1,10) i wstecz @(1,-10) + valgrind bez wycieków. Patrz: Ruchome okno danych AGSE. |
Pattern7 | Kompilacja z identycznymi nazwami pól w wielu strumieniach (issue #17) - poprawna identyfikacja pola przez indeks strumienia. Patrz: Polecenie DECLARE, Aliasowanie. |
retention | Operacje xtrdb na pliku z parametrem RETENTION: open, purge, append, list, write dla konkretnego rekordu. Patrz: Format zapisu danych - Mechanizm rotacji. |
simple | Kompilacja podstawowego zapytania arytmetycznego + graf DOT + valgrind; korzysta z danych IntegrationTest/simple. Patrz: Polecenie SELECT. |
simple_max | Kompilacja zapytania z .max + graf DOT + valgrind; korzysta z danych IntegrationTest/simple_max. Patrz: Operatory agregujące. |
subquery | Kompilacja zagnieżdżonych podzapytań: (a#b)>1 (hash-merge wewnątrz filtru) i (a>1)#b (filtr wewnątrz hash-merge). Patrz: Budowa drzewa zależności. |
txtsrc | Operacje xtrdb descc/rread/printt na strumieniu TEXTSOURCE (plik tekstowy jako źródło danych). Patrz: Format zapisu danych. |