chore: add all untracked files from VM — scripts, test-results, LLM batch, docs

This commit is contained in:
“Naeel”
2026-05-04 06:22:16 +04:00
parent d342b649a8
commit b0895ad498
35 changed files with 8681 additions and 0 deletions
+389
View File
@@ -0,0 +1,389 @@
LOG: /home/naeel/terra/fission/scripts/../test-results/2026-05-03_15-32-11.log
>>> Предварительная очистка тест-namespace-ов...
pre_cleanup.sh: тест-namespace-ы не найдены, пропускаем.
╔══════════════════════════════════════╗
║ fission-console — полный тест-сьют ║
╚══════════════════════════════════════╝
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_auth.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_auth.sh run=6f6d96d0
========================================
>>> POST /auth: пустой токен → 400
PASS: POST /auth пустой token → 400 (HTTP 400)
>>> POST /auth: токен < 6 символов → 401
PASS: POST /auth токен 2 символа → 401 (HTTP 401)
PASS: POST /auth токен 5 символов → 401 (HTTP 401)
>>> POST /auth: токен ≥6 символов → 200
PASS: POST /auth валидный токен → 200 (HTTP 200)
PASS: POST /auth namespace=fission-...
PASS: POST /auth ok=true
>>> POST /auth: невалидный JSON → 400
PASS: POST /auth невалидный JSON → 400
>>> POST /auth: GET метод → 405
PASS: GET /auth → 405
>>> X-Auth-Token: отсутствует → 401
PASS: GET /functions без токена → 401 (HTTP 401)
>>> X-Auth-Token: токен < 6 символов → 401
PASS: GET /functions токен 2 символа → 401 (HTTP 401)
PASS: GET /functions токен 5 символов → 401 (HTTP 401)
>>> X-Auth-Token: токен ≥6 символов → 200
PASS: GET /functions валидный X-Auth-Token → 200 (HTTP 200)
>>> Authorization: Bearer → 200
PASS: GET /functions Authorization: Bearer → 200 (HTTP 200)
>>> Namespace детерминирован (одинаковый токен → одинаковый NS)
PASS: Namespace детерминирован: fission-9402f4a2fc84dfab
========================================
ИТОГ: PASS=14 FAIL=0
========================================
 ✓ test_auth.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_functions_crud.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_functions_crud.sh run=ee11e143
========================================
>>> CREATE: базовый nodejs → 201
PASS: CREATE nodejs → 201 (HTTP 201)
PASS: CREATE: name в ответе
PASS: CREATE: route непустой
PASS: CREATE: package непустой
>>> CREATE: дубликат → 409
PASS: CREATE дубликат → 409 (HTTP 409)
>>> CREATE: без name → 400
PASS: CREATE без name → 400 (HTTP 400)
>>> CREATE: без language → 400
PASS: CREATE без language → 400 (HTTP 400)
>>> CREATE: без code → 400
PASS: CREATE без code → 400 (HTTP 400)
>>> CREATE: невалидный язык → 400
PASS: CREATE язык=cobol → 400 (HTTP 400)
>>> CREATE: валидация имени
PASS: CREATE имя с заглавной → 400 (HTTP 400)
PASS: CREATE имя с ведущим дефисом → 400 (HTTP 400)
PASS: CREATE имя с завершающим дефисом → 400 (HTTP 400)
PASS: CREATE имя с пробелом → 400 (HTTP 400)
PASS: CREATE имя 58 символов → 400 (HTTP 400)
PASS: CREATE имя 57 символов → 201 (HTTP 201)
>>> CREATE: код > 1MB → 400 или 413
PASS: CREATE код > 1MB → отклонён (000)
>>> LIST: GET /functions → 200, массив
PASS: LIST GET /functions → 200 (HTTP 200)
PASS: LIST: содержит ≥1 функцию (создали выше)
>>> LIST: новый пользователь → пустой массив
PASS: LIST новый пользователь → 200 (HTTP 200)
PASS: LIST новый пользователь → []
>>> GET: /functions/{name} → 200
PASS: GET /functions/crud-fn-ee11e143 → 200 (HTTP 200)
PASS: GET: name совпадает
PASS: GET: environment непустой (console-nodejs-env)
>>> GET: несуществующая функция → 404
PASS: GET несуществующая → 404 (HTTP 404)
>>> DELETE: /functions/{name} → 200
PASS: DELETE crud-fn → 200 (HTTP 200)
PASS: DELETE: deleted=true
>>> DELETE: повторное удаление → 404
PASS: DELETE повторное → 404 (HTTP 404)
>>> GET: после DELETE → 404
PASS: GET после DELETE → 404 (HTTP 404)
>>> DELETE: несуществующая функция → 404
PASS: DELETE несуществующая → 404 (HTTP 404)
========================================
ИТОГ: PASS=29 FAIL=0
========================================
 ✓ test_functions_crud.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_ttl.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_ttl.sh run=f0ebb7af
========================================
>>> CREATE без TTL → expires_at отсутствует
PASS: CREATE без TTL: expires_at отсутствует
>>> CREATE с TTL=15m → expires_at присутствует
PASS: CREATE TTL=15m: expires_at=2026-05-03T12:48:18Z
PASS: expires_at формат RFC3339
>>> CREATE с TTL=1h → expires_at присутствует
PASS: CREATE TTL=1h: expires_at=2026-05-03T13:33:21Z
>>> CREATE с TTL=2d → expires_at присутствует
PASS: CREATE TTL=2d: expires_at=2026-05-05T12:33:24Z
>>> CREATE TTL невалидный → 400 (без создания объектов)
PASS: TTL='99z' → 400
PASS: TTL='abc' → 400
PASS: TTL='0d' → 400
PASS: TTL='-1h' → 400
>>> LIST: функция с TTL видна в списке
PASS: LIST: видно ≥3 функции (2 с TTL, 1 без)
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_ttl.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_isolation.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_isolation.sh run=5e3d3430
========================================
>>> Alice создаёт функцию
PASS: Alice CREATE alice-fn → 201 (HTTP 201)
>>> Bob GET alice-fn → 404
PASS: Bob GET alice-fn → 404 (HTTP 404)
>>> Bob DELETE alice-fn → 404
PASS: Bob DELETE alice-fn → 404 (HTTP 404)
>>> Bob PUT alice-fn/code → 404
PASS: Bob PUT alice-fn/code → 404 (HTTP 404)
>>> Bob INVOKE alice-fn → 404
PASS: Bob INVOKE alice-fn → 404 (HTTP 404)
>>> Alice GET alice-fn → 200 (не повреждена)
PASS: Alice GET alice-fn → 200 (HTTP 200)
>>> LIST изоляция: Alice и Bob видят только свои функции
PASS: Alice LIST содержит alice-fn
PASS: Alice LIST не содержит bob-fn
PASS: Bob LIST содержит bob-fn
PASS: Bob LIST не содержит alice-fn
>>> Route изоляция: одинаковое имя → разные routes
PASS: Route изоляция: /f99555a1d109/alice-fn ≠ /336aedce32fe/bob-fn
========================================
ИТОГ: PASS=11 FAIL=0
========================================
 ✓ test_isolation.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_update.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_update.sh run=1a3190a9
========================================
>>> CREATE: версия v1
PASS: CREATE v1 → 201 (HTTP 201)
Ждём прогрева...
TRY=1 fn=upd-fn-1a3190a9 status=200 raw=version-one err=
PASS: Invoke v1 → version-one
>>> PUT /code: версия v2
PASS: PUT /code v2 → 200 (HTTP 200)
PASS: PUT /code: updated=true
PASS: PUT /code: новый package=upd-fn-1a3190a9-pkg-mopr5iev
Ждём пока executor подхватит новый код...
TRY=1 fn=upd-fn-1a3190a9 status=200 raw=version-two err=
PASS: Invoke после update → version-two
>>> PUT /code: пустой код → 400
PASS: PUT /code пустой код → 400 (HTTP 400)
PASS: PUT /code пробельный код → 400 (HTTP 400)
>>> PUT /code: несуществующая функция → 404
PASS: PUT /code несуществующая → 404 (HTTP 404)
>>> PUT /code: версия v3 (цепочка)
TRY=1 fn=upd-fn-1a3190a9 status=200 raw=version-three err=
PASS: Invoke после v3 update → version-three
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_update.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_invoke.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_invoke.sh run=da5a7732
========================================
>>> INVOKE несуществующей функции → 404
PASS: INVOKE несуществующей → 404 (HTTP 404)
>>> NodeJS: create + invoke
PASS: NodeJS CREATE → 201 (HTTP 201)
TRY=1 fn=node-fn-da5a7732 status=200 raw=node-invoke-ok err=
PASS: NodeJS invoke → 200, тело содержит node-invoke-ok
PASS: NodeJS второй invoke → 200 (warm)
>>> Python: create + invoke
PASS: Python CREATE → 201 (HTTP 201)
TRY=1 fn=py-fn-da5a7732 status=200 raw=py-invoke-ok err=
PASS: Python invoke → 200, тело содержит py-invoke-ok
>>> Invoke response fields
PASS: invoke.status = 200
PASS: invoke.latency_ms = 8 ms
PASS: invoke.response_raw непустой
========================================
ИТОГ: PASS=9 FAIL=0
========================================
 ✓ test_invoke.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_linters.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=== NODEJS ===
[PASS] N01 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N02 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N03 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) { const x = @@@; };
[PASS] N04 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) {
SyntaxError: Unexpected
[PASS] N05 | nodejs | exp=fail got=False | <code>:1
const x = {a: 1,, b: 2};
^
SyntaxError: Unexpected token ','
at wrapSa
[PASS] N06 | nodejs | exp=fail got=False | <code>:1
function foo( { return 1; }
^
SyntaxError: Unexpected number
at
=== PYTHON ===
[PASS] P01 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P02 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P03 | python | exp=fail got=False | Sorry: IndentationError: expected an indented block after function definition on line 1 (fission-lin
[PASS] P04 | python | exp=fail got=False | File "<code>", line 2
x = @@@
^
SyntaxError: invalid syntax
[PASS] P05 | python | exp=fail got=False | File "<code>", line 1
def main(data)
^
SyntaxError: expected ':'
[PASS] P06 | python | exp=fail got=False | File "<code>", line 2
def main(
^
SyntaxError: '(' was never closed
=== RUBY ===
[PASS] R01 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R02 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R03 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected {, expecting ')' (SyntaxError)
{ status: 200 }
^
[PASS] R04 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected local variable or method, expecting '}' (SyntaxError)
{ s
[PASS] R05 | ruby | exp=fail got=False | ruby: <code>:3: syntax error, unexpected `end', expecting ')' (SyntaxError)
=== PHP ===
[PASS] H01 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H02 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H03 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "return" in <code> on line 4
Errors parsing <code>
[PASS] H04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token ";" in <code> on line 2
Errors parsing <code>
[PASS] H05 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "{", expecting variable in <code> on line 2
Errors
=== GO ===
[PASS] G01 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G02 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G03 | go | exp=fail got=False | code.go:2:15: expected ')', found '{' (and 3 more errors)
[PASS] G04 | go | exp=fail got=False | code.go:4:1: missing import path (and 1 more errors)
[PASS] G05 | go | exp=fail got=False | code.go:3:10: expected operand, found 'ILLEGAL' (and 6 more errors)
=== ГРАНИЧНЫЕ ===
[PASS] E01 | nodejs | exp=fail got=False | Код пустой.
[PASS] E02 | python | exp=fail got=False | File "<code>", line 1
asd @@@
^
SyntaxError: invalid syntax
[PASS] E03 | ruby | exp=fail got=False | ruby: <code>:1: syntax error, unexpected ';', expecting ')' (SyntaxError)
def foo(;;; end
^
[PASS] E04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected end of file in <code> on line 1
Errors parsing <code>
========================
PASS=31 FAIL=0
========================
 ✓ test_linters.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_stress.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_stress.sh run=35f99cc0 users=8 invoke_parallel=8
========================================
>>> [1/3] 8 пользователей создают функции параллельно...
PASS: Параллельный CREATE: все 8 пользователей → 201
>>> [2/3] Изоляция: каждый видит только свою функцию
PASS: Изоляция: все 8 пользователей видят только свои функции
>>> [3/3] 8 параллельных invoke для livetest@test.local
Ждём прогрева 8 функций...
PASS: Параллельный INVOKE (livetest): 8/8 OK
========================================
ИТОГ: PASS=3 FAIL=0
========================================
 ✓ test_stress.sh — PASSED
╔══════════════════════════════════════╗
║ Скриптов: PASS=8 FAIL=0 338s ║
╚══════════════════════════════════════╝
+384
View File
@@ -0,0 +1,384 @@
LOG: /home/naeel/terra/fission/scripts/../test-results/2026-05-03_15-47-34.log
>>> Предварительная очистка тест-namespace-ов...
pre_cleanup.sh: тест-namespace-ы не найдены, пропускаем.
╔══════════════════════════════════════╗
║ fission-console — полный тест-сьют ║
╚══════════════════════════════════════╝
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_auth.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_auth.sh run=ec11c644
========================================
>>> POST /auth: пустой токен → 400
PASS: POST /auth пустой token → 400 (HTTP 400)
>>> POST /auth: токен < 6 символов → 401
PASS: POST /auth токен 2 символа → 401 (HTTP 401)
PASS: POST /auth токен 5 символов → 401 (HTTP 401)
>>> POST /auth: токен ≥6 символов → 200
PASS: POST /auth валидный токен → 200 (HTTP 200)
PASS: POST /auth namespace=fission-...
PASS: POST /auth ok=true
>>> POST /auth: невалидный JSON → 400
PASS: POST /auth невалидный JSON → 400
>>> POST /auth: GET метод → 405
PASS: GET /auth → 405
>>> X-Auth-Token: отсутствует → 401
PASS: GET /functions без токена → 401 (HTTP 401)
>>> X-Auth-Token: токен < 6 символов → 401
PASS: GET /functions токен 2 символа → 401 (HTTP 401)
PASS: GET /functions токен 5 символов → 401 (HTTP 401)
>>> X-Auth-Token: токен ≥6 символов → 200
PASS: GET /functions валидный X-Auth-Token → 200 (HTTP 200)
>>> Authorization: Bearer → 200
PASS: GET /functions Authorization: Bearer → 200 (HTTP 200)
>>> Namespace детерминирован (одинаковый токен → одинаковый NS)
PASS: Namespace детерминирован: fission-b9441cd4ddb76388
========================================
ИТОГ: PASS=14 FAIL=0
========================================
 ✓ test_auth.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_functions_crud.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_functions_crud.sh run=470cbd90
========================================
>>> CREATE: базовый nodejs → 201
PASS: CREATE nodejs → 201 (HTTP 201)
PASS: CREATE: name в ответе
PASS: CREATE: route непустой
PASS: CREATE: package непустой
>>> CREATE: дубликат → 409
PASS: CREATE дубликат → 409 (HTTP 409)
>>> CREATE: без name → 400
PASS: CREATE без name → 400 (HTTP 400)
>>> CREATE: без language → 400
PASS: CREATE без language → 400 (HTTP 400)
>>> CREATE: без code → 400
PASS: CREATE без code → 400 (HTTP 400)
>>> CREATE: невалидный язык → 400
PASS: CREATE язык=cobol → 400 (HTTP 400)
>>> CREATE: валидация имени
PASS: CREATE имя с заглавной → 400 (HTTP 400)
PASS: CREATE имя с ведущим дефисом → 400 (HTTP 400)
PASS: CREATE имя с завершающим дефисом → 400 (HTTP 400)
PASS: CREATE имя с пробелом → 400 (HTTP 400)
PASS: CREATE имя 58 символов → 400 (HTTP 400)
PASS: CREATE имя 57 символов → 201 (HTTP 201)
>>> CREATE: код > 1MB → 400 или 413
PASS: CREATE код > 1MB → отклонён (000)
>>> LIST: GET /functions → 200, массив
PASS: LIST GET /functions → 200 (HTTP 200)
PASS: LIST: содержит ≥1 функцию (создали выше)
>>> LIST: новый пользователь → пустой массив
PASS: LIST новый пользователь → 200 (HTTP 200)
PASS: LIST новый пользователь → []
>>> GET: /functions/{name} → 200
PASS: GET /functions/crud-fn-470cbd90 → 200 (HTTP 200)
PASS: GET: name совпадает
PASS: GET: environment непустой (console-nodejs-env)
>>> GET: несуществующая функция → 404
PASS: GET несуществующая → 404 (HTTP 404)
>>> DELETE: /functions/{name} → 200
PASS: DELETE crud-fn → 200 (HTTP 200)
PASS: DELETE: deleted=true
>>> DELETE: повторное удаление → 404
PASS: DELETE повторное → 404 (HTTP 404)
>>> GET: после DELETE → 404
PASS: GET после DELETE → 404 (HTTP 404)
>>> DELETE: несуществующая функция → 404
PASS: DELETE несуществующая → 404 (HTTP 404)
========================================
ИТОГ: PASS=29 FAIL=0
========================================
 ✓ test_functions_crud.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_ttl.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_ttl.sh run=053caa8e
========================================
>>> CREATE без TTL → expires_at отсутствует
PASS: CREATE без TTL: expires_at отсутствует
>>> CREATE с TTL=15m → expires_at присутствует
PASS: CREATE TTL=15m: expires_at=2026-05-03T13:03:42Z
PASS: expires_at формат RFC3339
>>> CREATE с TTL=1h → expires_at присутствует
PASS: CREATE TTL=1h: expires_at=2026-05-03T13:48:45Z
>>> CREATE с TTL=2d → expires_at присутствует
PASS: CREATE TTL=2d: expires_at=2026-05-05T12:48:48Z
>>> CREATE TTL невалидный → 400 (без создания объектов)
PASS: TTL='99z' → 400
PASS: TTL='abc' → 400
PASS: TTL='0d' → 400
PASS: TTL='-1h' → 400
>>> LIST: функция с TTL видна в списке
PASS: LIST: видно ≥3 функции (2 с TTL, 1 без)
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_ttl.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_isolation.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_isolation.sh run=2f150449
========================================
>>> Alice создаёт функцию
PASS: Alice CREATE alice-fn → 201 (HTTP 201)
>>> Bob GET alice-fn → 404
PASS: Bob GET alice-fn → 404 (HTTP 404)
>>> Bob DELETE alice-fn → 404
PASS: Bob DELETE alice-fn → 404 (HTTP 404)
>>> Bob PUT alice-fn/code → 404
PASS: Bob PUT alice-fn/code → 404 (HTTP 404)
>>> Bob INVOKE alice-fn → 404
PASS: Bob INVOKE alice-fn → 404 (HTTP 404)
>>> Alice GET alice-fn → 200 (не повреждена)
PASS: Alice GET alice-fn → 200 (HTTP 200)
>>> LIST изоляция: Alice и Bob видят только свои функции
PASS: Alice LIST содержит alice-fn
PASS: Alice LIST не содержит bob-fn
PASS: Bob LIST содержит bob-fn
PASS: Bob LIST не содержит alice-fn
>>> Route изоляция: одинаковое имя → разные routes
PASS: Route изоляция: /1fb06339c2b5/alice-fn ≠ /9073d18c6d33/bob-fn
========================================
ИТОГ: PASS=11 FAIL=0
========================================
 ✓ test_isolation.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_update.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_update.sh run=0fcd0348
========================================
>>> CREATE: версия v1
PASS: CREATE v1 → 201 (HTTP 201)
Ждём прогрева...
TRY=1 fn=upd-fn-0fcd0348 status=200 raw=version-one err=
PASS: Invoke v1 → version-one
>>> PUT /code: версия v2
PASS: PUT /code v2 → 200 (HTTP 200)
PASS: PUT /code: updated=true
PASS: PUT /code: новый package=upd-fn-0fcd0348-pkg-moprpbdk
Ждём пока executor подхватит новый код...
TRY=1 fn=upd-fn-0fcd0348 status=200 raw=version-two err=
PASS: Invoke после update → version-two
>>> PUT /code: пустой код → 400
PASS: PUT /code пустой код → 400 (HTTP 400)
PASS: PUT /code пробельный код → 400 (HTTP 400)
>>> PUT /code: несуществующая функция → 404
PASS: PUT /code несуществующая → 404 (HTTP 404)
>>> PUT /code: версия v3 (цепочка)
TRY=1 fn=upd-fn-0fcd0348 status=200 raw=version-three err=
PASS: Invoke после v3 update → version-three
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_update.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_invoke.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_invoke.sh run=f70fc571
========================================
>>> INVOKE несуществующей функции → 404
PASS: INVOKE несуществующей → 404 (HTTP 404)
>>> NodeJS: create + invoke
PASS: NodeJS CREATE → 201 (HTTP 201)
TRY=1 fn=node-fn-f70fc571 status=200 raw=node-invoke-ok err=
PASS: NodeJS invoke → 200, тело содержит node-invoke-ok
PASS: NodeJS второй invoke → 200 (warm)
>>> Python: create + invoke
PASS: Python CREATE → 201 (HTTP 201)
TRY=1 fn=py-fn-f70fc571 status=200 raw=py-invoke-ok err=
PASS: Python invoke → 200, тело содержит py-invoke-ok
>>> Invoke response fields
PASS: invoke.status = 200
PASS: invoke.latency_ms = 9 ms
PASS: invoke.response_raw непустой
========================================
ИТОГ: PASS=9 FAIL=0
========================================
 ✓ test_invoke.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_linters.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=== NODEJS ===
[PASS] N01 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N02 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N03 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) { const x = @@@; };
[PASS] N04 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) {
SyntaxError: Unexpected
[PASS] N05 | nodejs | exp=fail got=False | <code>:1
const x = {a: 1,, b: 2};
^
SyntaxError: Unexpected token ','
at wrapSa
[PASS] N06 | nodejs | exp=fail got=False | <code>:1
function foo( { return 1; }
^
SyntaxError: Unexpected number
at
=== PYTHON ===
[PASS] P01 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P02 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P03 | python | exp=fail got=False | Sorry: IndentationError: expected an indented block after function definition on line 1 (fission-lin
[PASS] P04 | python | exp=fail got=False | File "<code>", line 2
x = @@@
^
SyntaxError: invalid syntax
[PASS] P05 | python | exp=fail got=False | File "<code>", line 1
def main(data)
^
SyntaxError: expected ':'
[PASS] P06 | python | exp=fail got=False | File "<code>", line 2
def main(
^
SyntaxError: '(' was never closed
=== RUBY ===
[PASS] R01 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R02 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R03 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected {, expecting ')' (SyntaxError)
{ status: 200 }
^
[PASS] R04 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected local variable or method, expecting '}' (SyntaxError)
{ s
[PASS] R05 | ruby | exp=fail got=False | ruby: <code>:3: syntax error, unexpected `end', expecting ')' (SyntaxError)
=== PHP ===
[PASS] H01 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H02 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H03 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "return" in <code> on line 4
Errors parsing <code>
[PASS] H04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token ";" in <code> on line 2
Errors parsing <code>
[PASS] H05 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "{", expecting variable in <code> on line 2
Errors
=== GO ===
[PASS] G01 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G02 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G03 | go | exp=fail got=False | code.go:2:15: expected ')', found '{' (and 3 more errors)
[PASS] G04 | go | exp=fail got=False | code.go:4:1: missing import path (and 1 more errors)
[PASS] G05 | go | exp=fail got=False | code.go:3:10: expected operand, found 'ILLEGAL' (and 6 more errors)
=== ГРАНИЧНЫЕ ===
[PASS] E01 | nodejs | exp=fail got=False | Код пустой.
[PASS] E02 | python | exp=fail got=False | File "<code>", line 1
asd @@@
^
SyntaxError: invalid syntax
[PASS] E03 | ruby | exp=fail got=False | ruby: <code>:1: syntax error, unexpected ';', expecting ')' (SyntaxError)
def foo(;;; end
^
[PASS] E04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected end of file in <code> on line 1
Errors parsing <code>
========================
PASS=31 FAIL=0
========================
 ✓ test_linters.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_stress.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_stress.sh run=dc4bc594 users=8 invoke_parallel=8
========================================
>>> [1/3] 8 пользователей создают функции параллельно...
PASS: Параллельный CREATE: все 8 пользователей → 201
>>> [2/3] Изоляция: каждый видит только свою функцию
PASS: Изоляция: все 8 пользователей видят только свои функции
>>> [3/3] 8 параллельных invoke для livetest@test.local
Ждём прогрева 8 функций...
PASS: Параллельный INVOKE (livetest): 7/8 OK
========================================
ИТОГ: PASS=3 FAIL=0
========================================
@@ -0,0 +1,21 @@
LOG: /home/naeel/terra/fission/scripts/../test-results/2026-05-03_16-02-40_remaining.log
========================================
test_stress.sh run=b6d326c7 users=8 invoke_parallel=8
========================================
>>> [1/3] 8 пользователей создают функции параллельно...
PASS: Параллельный CREATE: все 8 пользователей → 201
>>> [2/3] Изоляция: каждый видит только свою функцию
PASS: Изоляция: все 8 пользователей видят только свои функции
>>> [3/3] 8 параллельных invoke для livetest@test.local
Ждём прогрева 8 функций...
PASS: Параллельный INVOKE (livetest): 8/8 OK
========================================
ИТОГ: PASS=3 FAIL=0
========================================
✓ test_stress.sh — PASSED
+379
View File
@@ -0,0 +1,379 @@
LOG: /home/naeel/terra/fission/scripts/../test-results/2026-05-03_15-47-34.log
>>> Предварительная очистка тест-namespace-ов...
pre_cleanup.sh: тест-namespace-ы не найдены, пропускаем.
╔══════════════════════════════════════╗
║ fission-console — полный тест-сьют ║
╚══════════════════════════════════════╝
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_auth.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_auth.sh run=ec11c644
========================================
>>> POST /auth: пустой токен → 400
PASS: POST /auth пустой token → 400 (HTTP 400)
>>> POST /auth: токен < 6 символов → 401
PASS: POST /auth токен 2 символа → 401 (HTTP 401)
PASS: POST /auth токен 5 символов → 401 (HTTP 401)
>>> POST /auth: токен ≥6 символов → 200
PASS: POST /auth валидный токен → 200 (HTTP 200)
PASS: POST /auth namespace=fission-...
PASS: POST /auth ok=true
>>> POST /auth: невалидный JSON → 400
PASS: POST /auth невалидный JSON → 400
>>> POST /auth: GET метод → 405
PASS: GET /auth → 405
>>> X-Auth-Token: отсутствует → 401
PASS: GET /functions без токена → 401 (HTTP 401)
>>> X-Auth-Token: токен < 6 символов → 401
PASS: GET /functions токен 2 символа → 401 (HTTP 401)
PASS: GET /functions токен 5 символов → 401 (HTTP 401)
>>> X-Auth-Token: токен ≥6 символов → 200
PASS: GET /functions валидный X-Auth-Token → 200 (HTTP 200)
>>> Authorization: Bearer → 200
PASS: GET /functions Authorization: Bearer → 200 (HTTP 200)
>>> Namespace детерминирован (одинаковый токен → одинаковый NS)
PASS: Namespace детерминирован: fission-b9441cd4ddb76388
========================================
ИТОГ: PASS=14 FAIL=0
========================================
 ✓ test_auth.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_functions_crud.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_functions_crud.sh run=470cbd90
========================================
>>> CREATE: базовый nodejs → 201
PASS: CREATE nodejs → 201 (HTTP 201)
PASS: CREATE: name в ответе
PASS: CREATE: route непустой
PASS: CREATE: package непустой
>>> CREATE: дубликат → 409
PASS: CREATE дубликат → 409 (HTTP 409)
>>> CREATE: без name → 400
PASS: CREATE без name → 400 (HTTP 400)
>>> CREATE: без language → 400
PASS: CREATE без language → 400 (HTTP 400)
>>> CREATE: без code → 400
PASS: CREATE без code → 400 (HTTP 400)
>>> CREATE: невалидный язык → 400
PASS: CREATE язык=cobol → 400 (HTTP 400)
>>> CREATE: валидация имени
PASS: CREATE имя с заглавной → 400 (HTTP 400)
PASS: CREATE имя с ведущим дефисом → 400 (HTTP 400)
PASS: CREATE имя с завершающим дефисом → 400 (HTTP 400)
PASS: CREATE имя с пробелом → 400 (HTTP 400)
PASS: CREATE имя 58 символов → 400 (HTTP 400)
PASS: CREATE имя 57 символов → 201 (HTTP 201)
>>> CREATE: код > 1MB → 400 или 413
PASS: CREATE код > 1MB → отклонён (000)
>>> LIST: GET /functions → 200, массив
PASS: LIST GET /functions → 200 (HTTP 200)
PASS: LIST: содержит ≥1 функцию (создали выше)
>>> LIST: новый пользователь → пустой массив
PASS: LIST новый пользователь → 200 (HTTP 200)
PASS: LIST новый пользователь → []
>>> GET: /functions/{name} → 200
PASS: GET /functions/crud-fn-470cbd90 → 200 (HTTP 200)
PASS: GET: name совпадает
PASS: GET: environment непустой (console-nodejs-env)
>>> GET: несуществующая функция → 404
PASS: GET несуществующая → 404 (HTTP 404)
>>> DELETE: /functions/{name} → 200
PASS: DELETE crud-fn → 200 (HTTP 200)
PASS: DELETE: deleted=true
>>> DELETE: повторное удаление → 404
PASS: DELETE повторное → 404 (HTTP 404)
>>> GET: после DELETE → 404
PASS: GET после DELETE → 404 (HTTP 404)
>>> DELETE: несуществующая функция → 404
PASS: DELETE несуществующая → 404 (HTTP 404)
========================================
ИТОГ: PASS=29 FAIL=0
========================================
 ✓ test_functions_crud.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_ttl.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_ttl.sh run=053caa8e
========================================
>>> CREATE без TTL → expires_at отсутствует
PASS: CREATE без TTL: expires_at отсутствует
>>> CREATE с TTL=15m → expires_at присутствует
PASS: CREATE TTL=15m: expires_at=2026-05-03T13:03:42Z
PASS: expires_at формат RFC3339
>>> CREATE с TTL=1h → expires_at присутствует
PASS: CREATE TTL=1h: expires_at=2026-05-03T13:48:45Z
>>> CREATE с TTL=2d → expires_at присутствует
PASS: CREATE TTL=2d: expires_at=2026-05-05T12:48:48Z
>>> CREATE TTL невалидный → 400 (без создания объектов)
PASS: TTL='99z' → 400
PASS: TTL='abc' → 400
PASS: TTL='0d' → 400
PASS: TTL='-1h' → 400
>>> LIST: функция с TTL видна в списке
PASS: LIST: видно ≥3 функции (2 с TTL, 1 без)
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_ttl.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_isolation.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_isolation.sh run=2f150449
========================================
>>> Alice создаёт функцию
PASS: Alice CREATE alice-fn → 201 (HTTP 201)
>>> Bob GET alice-fn → 404
PASS: Bob GET alice-fn → 404 (HTTP 404)
>>> Bob DELETE alice-fn → 404
PASS: Bob DELETE alice-fn → 404 (HTTP 404)
>>> Bob PUT alice-fn/code → 404
PASS: Bob PUT alice-fn/code → 404 (HTTP 404)
>>> Bob INVOKE alice-fn → 404
PASS: Bob INVOKE alice-fn → 404 (HTTP 404)
>>> Alice GET alice-fn → 200 (не повреждена)
PASS: Alice GET alice-fn → 200 (HTTP 200)
>>> LIST изоляция: Alice и Bob видят только свои функции
PASS: Alice LIST содержит alice-fn
PASS: Alice LIST не содержит bob-fn
PASS: Bob LIST содержит bob-fn
PASS: Bob LIST не содержит alice-fn
>>> Route изоляция: одинаковое имя → разные routes
PASS: Route изоляция: /1fb06339c2b5/alice-fn ≠ /9073d18c6d33/bob-fn
========================================
ИТОГ: PASS=11 FAIL=0
========================================
 ✓ test_isolation.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_update.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_update.sh run=0fcd0348
========================================
>>> CREATE: версия v1
PASS: CREATE v1 → 201 (HTTP 201)
Ждём прогрева...
TRY=1 fn=upd-fn-0fcd0348 status=200 raw=version-one err=
PASS: Invoke v1 → version-one
>>> PUT /code: версия v2
PASS: PUT /code v2 → 200 (HTTP 200)
PASS: PUT /code: updated=true
PASS: PUT /code: новый package=upd-fn-0fcd0348-pkg-moprpbdk
Ждём пока executor подхватит новый код...
TRY=1 fn=upd-fn-0fcd0348 status=200 raw=version-two err=
PASS: Invoke после update → version-two
>>> PUT /code: пустой код → 400
PASS: PUT /code пустой код → 400 (HTTP 400)
PASS: PUT /code пробельный код → 400 (HTTP 400)
>>> PUT /code: несуществующая функция → 404
PASS: PUT /code несуществующая → 404 (HTTP 404)
>>> PUT /code: версия v3 (цепочка)
TRY=1 fn=upd-fn-0fcd0348 status=200 raw=version-three err=
PASS: Invoke после v3 update → version-three
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_update.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_invoke.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_invoke.sh run=f70fc571
========================================
>>> INVOKE несуществующей функции → 404
PASS: INVOKE несуществующей → 404 (HTTP 404)
>>> NodeJS: create + invoke
PASS: NodeJS CREATE → 201 (HTTP 201)
TRY=1 fn=node-fn-f70fc571 status=200 raw=node-invoke-ok err=
PASS: NodeJS invoke → 200, тело содержит node-invoke-ok
PASS: NodeJS второй invoke → 200 (warm)
>>> Python: create + invoke
PASS: Python CREATE → 201 (HTTP 201)
TRY=1 fn=py-fn-f70fc571 status=200 raw=py-invoke-ok err=
PASS: Python invoke → 200, тело содержит py-invoke-ok
>>> Invoke response fields
PASS: invoke.status = 200
PASS: invoke.latency_ms = 9 ms
PASS: invoke.response_raw непустой
========================================
ИТОГ: PASS=9 FAIL=0
========================================
 ✓ test_invoke.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_linters.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=== NODEJS ===
[PASS] N01 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N02 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N03 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) { const x = @@@; };
[PASS] N04 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) {
SyntaxError: Unexpected
[PASS] N05 | nodejs | exp=fail got=False | <code>:1
const x = {a: 1,, b: 2};
^
SyntaxError: Unexpected token ','
at wrapSa
[PASS] N06 | nodejs | exp=fail got=False | <code>:1
function foo( { return 1; }
^
SyntaxError: Unexpected number
at
=== PYTHON ===
[PASS] P01 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P02 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P03 | python | exp=fail got=False | Sorry: IndentationError: expected an indented block after function definition on line 1 (fission-lin
[PASS] P04 | python | exp=fail got=False | File "<code>", line 2
x = @@@
^
SyntaxError: invalid syntax
[PASS] P05 | python | exp=fail got=False | File "<code>", line 1
def main(data)
^
SyntaxError: expected ':'
[PASS] P06 | python | exp=fail got=False | File "<code>", line 2
def main(
^
SyntaxError: '(' was never closed
=== RUBY ===
[PASS] R01 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R02 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R03 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected {, expecting ')' (SyntaxError)
{ status: 200 }
^
[PASS] R04 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected local variable or method, expecting '}' (SyntaxError)
{ s
[PASS] R05 | ruby | exp=fail got=False | ruby: <code>:3: syntax error, unexpected `end', expecting ')' (SyntaxError)
=== PHP ===
[PASS] H01 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H02 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H03 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "return" in <code> on line 4
Errors parsing <code>
[PASS] H04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token ";" in <code> on line 2
Errors parsing <code>
[PASS] H05 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "{", expecting variable in <code> on line 2
Errors
=== GO ===
[PASS] G01 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G02 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G03 | go | exp=fail got=False | code.go:2:15: expected ')', found '{' (and 3 more errors)
[PASS] G04 | go | exp=fail got=False | code.go:4:1: missing import path (and 1 more errors)
[PASS] G05 | go | exp=fail got=False | code.go:3:10: expected operand, found 'ILLEGAL' (and 6 more errors)
=== ГРАНИЧНЫЕ ===
[PASS] E01 | nodejs | exp=fail got=False | Код пустой.
[PASS] E02 | python | exp=fail got=False | File "<code>", line 1
asd @@@
^
SyntaxError: invalid syntax
[PASS] E03 | ruby | exp=fail got=False | ruby: <code>:1: syntax error, unexpected ';', expecting ')' (SyntaxError)
def foo(;;; end
^
[PASS] E04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected end of file in <code> on line 1
Errors parsing <code>
========================
PASS=31 FAIL=0
========================
 ✓ test_linters.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_stress.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_stress.sh run=dc4bc594 users=8 invoke_parallel=8
========================================
>>> [1/3] 8 пользователей создают функции параллельно...
PASS: Параллельный CREATE: все 8 пользователей → 201
>>> [2/3] Изоляция: каждый видит только свою функцию
PASS: Изоляция: все 8 пользователей видят только свои функции
>>> [3/3] 8 параллельных invoke для livetest@test.local
Ждём прогрева 8 функций...
+566
View File
@@ -0,0 +1,566 @@
LOG: /home/naeel/terra/fission/scripts/../test-results/2026-05-03_17-05-22.log
>>> Предварительная очистка тест-namespace-ов...
pre_cleanup.sh: найдено 2 тест-namespace-ов, удаляем...
namespace "fission-4f75ef1325a69fe9" deleted
namespace "fission-c3511430abe5675b" deleted
pre_cleanup.sh: очистка завершена.
╔══════════════════════════════════════╗
║ fission-console — полный тест-сьют ║
╚══════════════════════════════════════╝
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_auth.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_auth.sh run=d7d6b77e
========================================
>>> POST /auth: пустой токен → 400
PASS: POST /auth пустой token → 400 (HTTP 400)
>>> POST /auth: токен < 6 символов → 401
PASS: POST /auth токен 2 символа → 401 (HTTP 401)
PASS: POST /auth токен 5 символов → 401 (HTTP 401)
>>> POST /auth: токен ≥6 символов → 200
PASS: POST /auth валидный токен → 200 (HTTP 200)
PASS: POST /auth namespace=fission-...
PASS: POST /auth ok=true
>>> POST /auth: невалидный JSON → 400
PASS: POST /auth невалидный JSON → 400
>>> POST /auth: GET метод → 405
PASS: GET /auth → 405
>>> X-Auth-Token: отсутствует → 401
PASS: GET /functions без токена → 401 (HTTP 401)
>>> X-Auth-Token: токен < 6 символов → 401
PASS: GET /functions токен 2 символа → 401 (HTTP 401)
PASS: GET /functions токен 5 символов → 401 (HTTP 401)
>>> X-Auth-Token: токен ≥6 символов → 200
PASS: GET /functions валидный X-Auth-Token → 200 (HTTP 200)
>>> Authorization: Bearer → 200
PASS: GET /functions Authorization: Bearer → 200 (HTTP 200)
>>> Namespace детерминирован (одинаковый токен → одинаковый NS)
PASS: Namespace детерминирован: fission-6dca95c9a39f6956
========================================
ИТОГ: PASS=14 FAIL=0
========================================
 ✓ test_auth.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_functions_crud.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_functions_crud.sh run=01b2c8d4
========================================
>>> CREATE: базовый nodejs → 201
PASS: CREATE nodejs → 201 (HTTP 201)
PASS: CREATE: name в ответе
PASS: CREATE: route непустой
PASS: CREATE: package непустой
>>> CREATE: дубликат → 409
PASS: CREATE дубликат → 409 (HTTP 409)
>>> CREATE: без name → 400
PASS: CREATE без name → 400 (HTTP 400)
>>> CREATE: без language → 400
PASS: CREATE без language → 400 (HTTP 400)
>>> CREATE: без code → 400
PASS: CREATE без code → 400 (HTTP 400)
>>> CREATE: невалидный язык → 400
PASS: CREATE язык=cobol → 400 (HTTP 400)
>>> CREATE: валидация имени
PASS: CREATE имя с заглавной → 400 (HTTP 400)
PASS: CREATE имя с ведущим дефисом → 400 (HTTP 400)
PASS: CREATE имя с завершающим дефисом → 400 (HTTP 400)
PASS: CREATE имя с пробелом → 400 (HTTP 400)
PASS: CREATE имя 58 символов → 400 (HTTP 400)
PASS: CREATE имя 57 символов → 201 (HTTP 201)
>>> CREATE: код > 1MB → 400 или 413
PASS: CREATE код > 1MB → отклонён (000)
>>> LIST: GET /functions → 200, массив
PASS: LIST GET /functions → 200 (HTTP 200)
PASS: LIST: содержит ≥1 функцию (создали выше)
>>> LIST: новый пользователь → пустой массив
PASS: LIST новый пользователь → 200 (HTTP 200)
PASS: LIST новый пользователь → []
>>> GET: /functions/{name} → 200
PASS: GET /functions/t-crud-fn-01b2c8d4 → 200 (HTTP 200)
PASS: GET: name совпадает
PASS: GET: environment непустой (console-nodejs-env)
>>> GET: несуществующая функция → 404
PASS: GET несуществующая → 404 (HTTP 404)
>>> DELETE: /functions/{name} → 200
PASS: DELETE crud-fn → 200 (HTTP 200)
PASS: DELETE: deleted=true
>>> DELETE: повторное удаление → 404
PASS: DELETE повторное → 404 (HTTP 404)
>>> GET: после DELETE → 404
PASS: GET после DELETE → 404 (HTTP 404)
>>> DELETE: несуществующая функция → 404
PASS: DELETE несуществующая → 404 (HTTP 404)
========================================
ИТОГ: PASS=29 FAIL=0
========================================
 ✓ test_functions_crud.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_ttl.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_ttl.sh run=306f2666
========================================
>>> CREATE без TTL → expires_at отсутствует
PASS: CREATE без TTL: expires_at отсутствует
>>> CREATE с TTL=15m → expires_at присутствует
PASS: CREATE TTL=15m: expires_at=2026-05-03T14:21:07Z
PASS: expires_at формат RFC3339
>>> CREATE с TTL=1h → expires_at присутствует
PASS: CREATE TTL=1h: expires_at=2026-05-03T15:06:09Z
>>> CREATE с TTL=2d → expires_at присутствует
PASS: CREATE TTL=2d: expires_at=2026-05-05T14:06:09Z
>>> CREATE TTL невалидный → 400 (без создания объектов)
PASS: TTL='99z' → 400
PASS: TTL='abc' → 400
PASS: TTL='0d' → 400
PASS: TTL='-1h' → 400
>>> LIST: функция с TTL видна в списке
PASS: LIST: видно ≥3 функции (2 с TTL, 1 без)
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_ttl.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_isolation.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_isolation.sh run=e4e19caa
========================================
>>> Alice создаёт функцию
PASS: Alice CREATE t-alice-fn → 201 (HTTP 201)
>>> Bob GET t-alice-fn → 404
PASS: Bob GET t-alice-fn → 404 (HTTP 404)
>>> Bob DELETE t-alice-fn → 404
PASS: Bob DELETE t-alice-fn → 404 (HTTP 404)
>>> Bob PUT t-alice-fn/code → 404
PASS: Bob PUT t-alice-fn/code → 404 (HTTP 404)
>>> Bob INVOKE t-alice-fn → 404
PASS: Bob INVOKE t-alice-fn → 404 (HTTP 404)
>>> Alice GET t-alice-fn → 200 (не повреждена)
PASS: Alice GET t-alice-fn → 200 (HTTP 200)
>>> LIST изоляция: Alice и Bob видят только свои функции
FAIL: Alice LIST не содержит t-alice-fn (count=1)
PASS: Alice LIST не содержит t-bob-fn
FAIL: Bob LIST не содержит t-bob-fn
PASS: Bob LIST не содержит t-alice-fn
>>> Route изоляция: одинаковое имя → разные routes
PASS: Route изоляция: /473720accdd7/t-alice-fn ≠ /dc8693d9dde4/t-bob-fn
========================================
ИТОГ: PASS=9 FAIL=2
========================================
 ✗ test_isolation.sh — FAILED (exit 1)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_update.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_update.sh run=e846253c
========================================
>>> CREATE: версия v1
PASS: CREATE v1 → 201 (HTTP 201)
Ждём прогрева...
TRY=1 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=2 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=3 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=4 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=5 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=6 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=7 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=8 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=9 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=10 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=11 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=12 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
FAIL: Invoke v1 не стабилизировался
>>> PUT /code: версия v2
PASS: PUT /code v2 → 200 (HTTP 200)
PASS: PUT /code: updated=true
PASS: PUT /code: новый package=t-upd-fn-e846253c-pkg-mopuhngw
Ждём пока executor подхватит новый код...
TRY=1 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=2 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=3 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=4 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=5 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=6 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=7 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=8 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=9 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=10 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=11 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=12 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=13 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=14 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=15 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
FAIL: Invoke после update не вернул version-two
>>> PUT /code: пустой код → 400
PASS: PUT /code пустой код → 400 (HTTP 400)
PASS: PUT /code пробельный код → 400 (HTTP 400)
>>> PUT /code: несуществующая функция → 404
PASS: PUT /code несуществующая → 404 (HTTP 404)
>>> PUT /code: версия v3 (цепочка)
TRY=1 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=2 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=3 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=4 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=5 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=6 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=7 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=8 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=9 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=10 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=11 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=12 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=13 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=14 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=15 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
FAIL: Invoke после v3 update не стабилизировался
========================================
ИТОГ: PASS=7 FAIL=3
========================================
 ✗ test_update.sh — FAILED (exit 1)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_invoke.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_invoke.sh run=030b2715
========================================
>>> INVOKE несуществующей функции → 404
PASS: INVOKE несуществующей → 404 (HTTP 404)
>>> NodeJS: create + invoke
PASS: NodeJS CREATE → 201 (HTTP 201)
TRY=1 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=2 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=3 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=4 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=5 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=6 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=7 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=8 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=9 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=10 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=11 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=12 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
FAIL: NodeJS invoke не стабилизировался за 60s
FAIL: NodeJS второй invoke → status=404
>>> Python: create + invoke
PASS: Python CREATE → 201 (HTTP 201)
TRY=1 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=2 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=3 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=4 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=5 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=6 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=7 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=8 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=9 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=10 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=11 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=12 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=13 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=14 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=15 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
FAIL: Python invoke не стабилизировался за 75s
>>> Invoke response fields
FAIL: invoke.status = 404
PASS: invoke.latency_ms = 1 ms
PASS: invoke.response_raw непустой
========================================
ИТОГ: PASS=5 FAIL=4
========================================
 ✗ test_invoke.sh — FAILED (exit 1)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_linters.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=== NODEJS ===
[PASS] N01 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N02 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N03 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) { const x = @@@; };
[PASS] N04 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) {
SyntaxError: Unexpected
[PASS] N05 | nodejs | exp=fail got=False | <code>:1
const x = {a: 1,, b: 2};
^
SyntaxError: Unexpected token ','
at wrapSa
[PASS] N06 | nodejs | exp=fail got=False | <code>:1
function foo( { return 1; }
^
SyntaxError: Unexpected number
at
=== PYTHON ===
[PASS] P01 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P02 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P03 | python | exp=fail got=False | Sorry: IndentationError: expected an indented block after function definition on line 1 (fission-lin
[PASS] P04 | python | exp=fail got=False | File "<code>", line 2
x = @@@
^
SyntaxError: invalid syntax
[PASS] P05 | python | exp=fail got=False | File "<code>", line 1
def main(data)
^
SyntaxError: expected ':'
[PASS] P06 | python | exp=fail got=False | File "<code>", line 2
def main(
^
SyntaxError: '(' was never closed
=== RUBY ===
[PASS] R01 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R02 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R03 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected {, expecting ')' (SyntaxError)
{ status: 200 }
^
[PASS] R04 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected local variable or method, expecting '}' (SyntaxError)
{ s
[PASS] R05 | ruby | exp=fail got=False | ruby: <code>:3: syntax error, unexpected `end', expecting ')' (SyntaxError)
=== PHP ===
[PASS] H01 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H02 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H03 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "return" in <code> on line 4
Errors parsing <code>
[PASS] H04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token ";" in <code> on line 2
Errors parsing <code>
[PASS] H05 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "{", expecting variable in <code> on line 2
Errors
=== GO ===
[PASS] G01 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G02 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G03 | go | exp=fail got=False | code.go:2:15: expected ')', found '{' (and 3 more errors)
[PASS] G04 | go | exp=fail got=False | code.go:4:1: missing import path (and 1 more errors)
[PASS] G05 | go | exp=fail got=False | code.go:3:10: expected operand, found 'ILLEGAL' (and 6 more errors)
=== ГРАНИЧНЫЕ ===
[PASS] E01 | nodejs | exp=fail got=False | Код пустой.
[PASS] E02 | python | exp=fail got=False | File "<code>", line 1
asd @@@
^
SyntaxError: invalid syntax
[PASS] E03 | ruby | exp=fail got=False | ruby: <code>:1: syntax error, unexpected ';', expecting ')' (SyntaxError)
def foo(;;; end
^
[PASS] E04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected end of file in <code> on line 1
Errors parsing <code>
========================
PASS=31 FAIL=0
========================
 ✓ test_linters.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_stress.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_stress.sh run=699cd177 users=8 invoke_parallel=8
========================================
>>> [1/3] 8 пользователей создают функции параллельно...
PASS: Параллельный CREATE: все 8 пользователей → 201
>>> [2/3] Изоляция: каждый видит только свою функцию
PASS: Изоляция: все 8 пользователей видят только свои функции
>>> [3/3] 8 параллельных invoke для livetest@test.local
Ждём прогрева 8 функций...
прогрев функции 1/8: попытка 1/12...
прогрев функции 1/8: попытка 2/12...
прогрев функции 1/8: попытка 3/12...
прогрев функции 1/8: попытка 4/12...
прогрев функции 1/8: попытка 5/12...
прогрев функции 1/8: попытка 6/12...
прогрев функции 1/8: попытка 7/12...
прогрев функции 1/8: попытка 8/12...
прогрев функции 1/8: попытка 9/12...
прогрев функции 1/8: попытка 10/12...
прогрев функции 1/8: попытка 11/12...
прогрев функции 1/8: попытка 12/12...
функция 1/8 — готова
прогрев функции 2/8: попытка 1/12...
прогрев функции 2/8: попытка 2/12...
прогрев функции 2/8: попытка 3/12...
прогрев функции 2/8: попытка 4/12...
прогрев функции 2/8: попытка 5/12...
прогрев функции 2/8: попытка 6/12...
прогрев функции 2/8: попытка 7/12...
прогрев функции 2/8: попытка 8/12...
прогрев функции 2/8: попытка 9/12...
прогрев функции 2/8: попытка 10/12...
прогрев функции 2/8: попытка 11/12...
прогрев функции 2/8: попытка 12/12...
функция 2/8 — готова
прогрев функции 3/8: попытка 1/12...
прогрев функции 3/8: попытка 2/12...
прогрев функции 3/8: попытка 3/12...
прогрев функции 3/8: попытка 4/12...
прогрев функции 3/8: попытка 5/12...
прогрев функции 3/8: попытка 6/12...
прогрев функции 3/8: попытка 7/12...
прогрев функции 3/8: попытка 8/12...
прогрев функции 3/8: попытка 9/12...
прогрев функции 3/8: попытка 10/12...
прогрев функции 3/8: попытка 11/12...
прогрев функции 3/8: попытка 12/12...
функция 3/8 — готова
прогрев функции 4/8: попытка 1/12...
прогрев функции 4/8: попытка 2/12...
прогрев функции 4/8: попытка 3/12...
прогрев функции 4/8: попытка 4/12...
прогрев функции 4/8: попытка 5/12...
прогрев функции 4/8: попытка 6/12...
прогрев функции 4/8: попытка 7/12...
прогрев функции 4/8: попытка 8/12...
прогрев функции 4/8: попытка 9/12...
прогрев функции 4/8: попытка 10/12...
прогрев функции 4/8: попытка 11/12...
прогрев функции 4/8: попытка 12/12...
функция 4/8 — готова
прогрев функции 5/8: попытка 1/12...
прогрев функции 5/8: попытка 2/12...
прогрев функции 5/8: попытка 3/12...
прогрев функции 5/8: попытка 4/12...
прогрев функции 5/8: попытка 5/12...
прогрев функции 5/8: попытка 6/12...
прогрев функции 5/8: попытка 7/12...
прогрев функции 5/8: попытка 8/12...
прогрев функции 5/8: попытка 9/12...
прогрев функции 5/8: попытка 10/12...
прогрев функции 5/8: попытка 11/12...
прогрев функции 5/8: попытка 12/12...
функция 5/8 — готова
прогрев функции 6/8: попытка 1/12...
прогрев функции 6/8: попытка 2/12...
прогрев функции 6/8: попытка 3/12...
прогрев функции 6/8: попытка 4/12...
прогрев функции 6/8: попытка 5/12...
прогрев функции 6/8: попытка 6/12...
прогрев функции 6/8: попытка 7/12...
прогрев функции 6/8: попытка 8/12...
прогрев функции 6/8: попытка 9/12...
прогрев функции 6/8: попытка 10/12...
прогрев функции 6/8: попытка 11/12...
прогрев функции 6/8: попытка 12/12...
функция 6/8 — готова
прогрев функции 7/8: попытка 1/12...
прогрев функции 7/8: попытка 2/12...
прогрев функции 7/8: попытка 3/12...
прогрев функции 7/8: попытка 4/12...
прогрев функции 7/8: попытка 5/12...
прогрев функции 7/8: попытка 6/12...
прогрев функции 7/8: попытка 7/12...
прогрев функции 7/8: попытка 8/12...
прогрев функции 7/8: попытка 9/12...
прогрев функции 7/8: попытка 10/12...
прогрев функции 7/8: попытка 11/12...
прогрев функции 7/8: попытка 12/12...
функция 7/8 — готова
прогрев функции 8/8: попытка 1/12...
прогрев функции 8/8: попытка 2/12...
прогрев функции 8/8: попытка 3/12...
прогрев функции 8/8: попытка 4/12...
прогрев функции 8/8: попытка 5/12...
прогрев функции 8/8: попытка 6/12...
прогрев функции 8/8: попытка 7/12...
прогрев функции 8/8: попытка 8/12...
прогрев функции 8/8: попытка 9/12...
прогрев функции 8/8: попытка 10/12...
прогрев функции 8/8: попытка 11/12...
прогрев функции 8/8: попытка 12/12...
функция 8/8 — готова
FAIL: Параллельный INVOKE (livetest): 8/8 упали
========================================
ИТОГ: PASS=2 FAIL=1
========================================
 ✗ test_stress.sh — FAILED (exit 1)
╔══════════════════════════════════════╗
║ Скриптов: PASS=4 FAIL=4 1020s ║
╚══════════════════════════════════════╝
Упавшие скрипты:
✗ test_isolation.sh
✗ test_update.sh
✗ test_invoke.sh
✗ test_stress.sh
+566
View File
@@ -0,0 +1,566 @@
LOG: /home/naeel/terra/fission/scripts/../test-results/2026-05-03_17-05-22.log
>>> Предварительная очистка тест-namespace-ов...
pre_cleanup.sh: найдено 2 тест-namespace-ов, удаляем...
namespace "fission-4f75ef1325a69fe9" deleted
namespace "fission-c3511430abe5675b" deleted
pre_cleanup.sh: очистка завершена.
╔══════════════════════════════════════╗
║ fission-console — полный тест-сьют ║
╚══════════════════════════════════════╝
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_auth.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_auth.sh run=d7d6b77e
========================================
>>> POST /auth: пустой токен → 400
PASS: POST /auth пустой token → 400 (HTTP 400)
>>> POST /auth: токен < 6 символов → 401
PASS: POST /auth токен 2 символа → 401 (HTTP 401)
PASS: POST /auth токен 5 символов → 401 (HTTP 401)
>>> POST /auth: токен ≥6 символов → 200
PASS: POST /auth валидный токен → 200 (HTTP 200)
PASS: POST /auth namespace=fission-...
PASS: POST /auth ok=true
>>> POST /auth: невалидный JSON → 400
PASS: POST /auth невалидный JSON → 400
>>> POST /auth: GET метод → 405
PASS: GET /auth → 405
>>> X-Auth-Token: отсутствует → 401
PASS: GET /functions без токена → 401 (HTTP 401)
>>> X-Auth-Token: токен < 6 символов → 401
PASS: GET /functions токен 2 символа → 401 (HTTP 401)
PASS: GET /functions токен 5 символов → 401 (HTTP 401)
>>> X-Auth-Token: токен ≥6 символов → 200
PASS: GET /functions валидный X-Auth-Token → 200 (HTTP 200)
>>> Authorization: Bearer → 200
PASS: GET /functions Authorization: Bearer → 200 (HTTP 200)
>>> Namespace детерминирован (одинаковый токен → одинаковый NS)
PASS: Namespace детерминирован: fission-6dca95c9a39f6956
========================================
ИТОГ: PASS=14 FAIL=0
========================================
 ✓ test_auth.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_functions_crud.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_functions_crud.sh run=01b2c8d4
========================================
>>> CREATE: базовый nodejs → 201
PASS: CREATE nodejs → 201 (HTTP 201)
PASS: CREATE: name в ответе
PASS: CREATE: route непустой
PASS: CREATE: package непустой
>>> CREATE: дубликат → 409
PASS: CREATE дубликат → 409 (HTTP 409)
>>> CREATE: без name → 400
PASS: CREATE без name → 400 (HTTP 400)
>>> CREATE: без language → 400
PASS: CREATE без language → 400 (HTTP 400)
>>> CREATE: без code → 400
PASS: CREATE без code → 400 (HTTP 400)
>>> CREATE: невалидный язык → 400
PASS: CREATE язык=cobol → 400 (HTTP 400)
>>> CREATE: валидация имени
PASS: CREATE имя с заглавной → 400 (HTTP 400)
PASS: CREATE имя с ведущим дефисом → 400 (HTTP 400)
PASS: CREATE имя с завершающим дефисом → 400 (HTTP 400)
PASS: CREATE имя с пробелом → 400 (HTTP 400)
PASS: CREATE имя 58 символов → 400 (HTTP 400)
PASS: CREATE имя 57 символов → 201 (HTTP 201)
>>> CREATE: код > 1MB → 400 или 413
PASS: CREATE код > 1MB → отклонён (000)
>>> LIST: GET /functions → 200, массив
PASS: LIST GET /functions → 200 (HTTP 200)
PASS: LIST: содержит ≥1 функцию (создали выше)
>>> LIST: новый пользователь → пустой массив
PASS: LIST новый пользователь → 200 (HTTP 200)
PASS: LIST новый пользователь → []
>>> GET: /functions/{name} → 200
PASS: GET /functions/t-crud-fn-01b2c8d4 → 200 (HTTP 200)
PASS: GET: name совпадает
PASS: GET: environment непустой (console-nodejs-env)
>>> GET: несуществующая функция → 404
PASS: GET несуществующая → 404 (HTTP 404)
>>> DELETE: /functions/{name} → 200
PASS: DELETE crud-fn → 200 (HTTP 200)
PASS: DELETE: deleted=true
>>> DELETE: повторное удаление → 404
PASS: DELETE повторное → 404 (HTTP 404)
>>> GET: после DELETE → 404
PASS: GET после DELETE → 404 (HTTP 404)
>>> DELETE: несуществующая функция → 404
PASS: DELETE несуществующая → 404 (HTTP 404)
========================================
ИТОГ: PASS=29 FAIL=0
========================================
 ✓ test_functions_crud.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_ttl.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_ttl.sh run=306f2666
========================================
>>> CREATE без TTL → expires_at отсутствует
PASS: CREATE без TTL: expires_at отсутствует
>>> CREATE с TTL=15m → expires_at присутствует
PASS: CREATE TTL=15m: expires_at=2026-05-03T14:21:07Z
PASS: expires_at формат RFC3339
>>> CREATE с TTL=1h → expires_at присутствует
PASS: CREATE TTL=1h: expires_at=2026-05-03T15:06:09Z
>>> CREATE с TTL=2d → expires_at присутствует
PASS: CREATE TTL=2d: expires_at=2026-05-05T14:06:09Z
>>> CREATE TTL невалидный → 400 (без создания объектов)
PASS: TTL='99z' → 400
PASS: TTL='abc' → 400
PASS: TTL='0d' → 400
PASS: TTL='-1h' → 400
>>> LIST: функция с TTL видна в списке
PASS: LIST: видно ≥3 функции (2 с TTL, 1 без)
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_ttl.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_isolation.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_isolation.sh run=e4e19caa
========================================
>>> Alice создаёт функцию
PASS: Alice CREATE t-alice-fn → 201 (HTTP 201)
>>> Bob GET t-alice-fn → 404
PASS: Bob GET t-alice-fn → 404 (HTTP 404)
>>> Bob DELETE t-alice-fn → 404
PASS: Bob DELETE t-alice-fn → 404 (HTTP 404)
>>> Bob PUT t-alice-fn/code → 404
PASS: Bob PUT t-alice-fn/code → 404 (HTTP 404)
>>> Bob INVOKE t-alice-fn → 404
PASS: Bob INVOKE t-alice-fn → 404 (HTTP 404)
>>> Alice GET t-alice-fn → 200 (не повреждена)
PASS: Alice GET t-alice-fn → 200 (HTTP 200)
>>> LIST изоляция: Alice и Bob видят только свои функции
FAIL: Alice LIST не содержит t-alice-fn (count=1)
PASS: Alice LIST не содержит t-bob-fn
FAIL: Bob LIST не содержит t-bob-fn
PASS: Bob LIST не содержит t-alice-fn
>>> Route изоляция: одинаковое имя → разные routes
PASS: Route изоляция: /473720accdd7/t-alice-fn ≠ /dc8693d9dde4/t-bob-fn
========================================
ИТОГ: PASS=9 FAIL=2
========================================
 ✗ test_isolation.sh — FAILED (exit 1)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_update.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_update.sh run=e846253c
========================================
>>> CREATE: версия v1
PASS: CREATE v1 → 201 (HTTP 201)
Ждём прогрева...
TRY=1 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=2 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=3 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=4 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=5 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=6 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=7 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=8 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=9 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=10 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=11 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=12 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
FAIL: Invoke v1 не стабилизировался
>>> PUT /code: версия v2
PASS: PUT /code v2 → 200 (HTTP 200)
PASS: PUT /code: updated=true
PASS: PUT /code: новый package=t-upd-fn-e846253c-pkg-mopuhngw
Ждём пока executor подхватит новый код...
TRY=1 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=2 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=3 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=4 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=5 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=6 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=7 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=8 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=9 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=10 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=11 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=12 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=13 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=14 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=15 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
FAIL: Invoke после update не вернул version-two
>>> PUT /code: пустой код → 400
PASS: PUT /code пустой код → 400 (HTTP 400)
PASS: PUT /code пробельный код → 400 (HTTP 400)
>>> PUT /code: несуществующая функция → 404
PASS: PUT /code несуществующая → 404 (HTTP 404)
>>> PUT /code: версия v3 (цепочка)
TRY=1 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=2 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=3 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=4 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=5 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=6 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=7 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=8 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=9 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=10 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=11 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=12 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=13 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=14 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
TRY=15 fn=t-upd-fn-e846253c status=404 raw=404 page not found err=
FAIL: Invoke после v3 update не стабилизировался
========================================
ИТОГ: PASS=7 FAIL=3
========================================
 ✗ test_update.sh — FAILED (exit 1)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_invoke.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_invoke.sh run=030b2715
========================================
>>> INVOKE несуществующей функции → 404
PASS: INVOKE несуществующей → 404 (HTTP 404)
>>> NodeJS: create + invoke
PASS: NodeJS CREATE → 201 (HTTP 201)
TRY=1 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=2 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=3 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=4 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=5 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=6 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=7 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=8 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=9 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=10 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=11 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
TRY=12 fn=t-node-fn-030b2715 status=404 raw=404 page not found err=
FAIL: NodeJS invoke не стабилизировался за 60s
FAIL: NodeJS второй invoke → status=404
>>> Python: create + invoke
PASS: Python CREATE → 201 (HTTP 201)
TRY=1 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=2 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=3 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=4 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=5 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=6 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=7 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=8 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=9 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=10 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=11 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=12 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=13 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=14 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
TRY=15 fn=t-py-fn-030b2715 status=404 raw=404 page not found err=
FAIL: Python invoke не стабилизировался за 75s
>>> Invoke response fields
FAIL: invoke.status = 404
PASS: invoke.latency_ms = 1 ms
PASS: invoke.response_raw непустой
========================================
ИТОГ: PASS=5 FAIL=4
========================================
 ✗ test_invoke.sh — FAILED (exit 1)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_linters.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
=== NODEJS ===
[PASS] N01 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N02 | nodejs | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] N03 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) { const x = @@@; };
[PASS] N04 | nodejs | exp=fail got=False | <code>:1
module.exports = function(ctx) {
SyntaxError: Unexpected
[PASS] N05 | nodejs | exp=fail got=False | <code>:1
const x = {a: 1,, b: 2};
^
SyntaxError: Unexpected token ','
at wrapSa
[PASS] N06 | nodejs | exp=fail got=False | <code>:1
function foo( { return 1; }
^
SyntaxError: Unexpected number
at
=== PYTHON ===
[PASS] P01 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P02 | python | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] P03 | python | exp=fail got=False | Sorry: IndentationError: expected an indented block after function definition on line 1 (fission-lin
[PASS] P04 | python | exp=fail got=False | File "<code>", line 2
x = @@@
^
SyntaxError: invalid syntax
[PASS] P05 | python | exp=fail got=False | File "<code>", line 1
def main(data)
^
SyntaxError: expected ':'
[PASS] P06 | python | exp=fail got=False | File "<code>", line 2
def main(
^
SyntaxError: '(' was never closed
=== RUBY ===
[PASS] R01 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R02 | ruby | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] R03 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected {, expecting ')' (SyntaxError)
{ status: 200 }
^
[PASS] R04 | ruby | exp=fail got=False | ruby: <code>:2: syntax error, unexpected local variable or method, expecting '}' (SyntaxError)
{ s
[PASS] R05 | ruby | exp=fail got=False | ruby: <code>:3: syntax error, unexpected `end', expecting ')' (SyntaxError)
=== PHP ===
[PASS] H01 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H02 | php | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] H03 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "return" in <code> on line 4
Errors parsing <code>
[PASS] H04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token ";" in <code> on line 2
Errors parsing <code>
[PASS] H05 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected token "{", expecting variable in <code> on line 2
Errors
=== GO ===
[PASS] G01 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G02 | go | exp=ok got=True | ✅ Синтаксис корректен.
[PASS] G03 | go | exp=fail got=False | code.go:2:15: expected ')', found '{' (and 3 more errors)
[PASS] G04 | go | exp=fail got=False | code.go:4:1: missing import path (and 1 more errors)
[PASS] G05 | go | exp=fail got=False | code.go:3:10: expected operand, found 'ILLEGAL' (and 6 more errors)
=== ГРАНИЧНЫЕ ===
[PASS] E01 | nodejs | exp=fail got=False | Код пустой.
[PASS] E02 | python | exp=fail got=False | File "<code>", line 1
asd @@@
^
SyntaxError: invalid syntax
[PASS] E03 | ruby | exp=fail got=False | ruby: <code>:1: syntax error, unexpected ';', expecting ')' (SyntaxError)
def foo(;;; end
^
[PASS] E04 | php | exp=fail got=False | PHP Parse error: syntax error, unexpected end of file in <code> on line 1
Errors parsing <code>
========================
PASS=31 FAIL=0
========================
 ✓ test_linters.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_stress.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_stress.sh run=699cd177 users=8 invoke_parallel=8
========================================
>>> [1/3] 8 пользователей создают функции параллельно...
PASS: Параллельный CREATE: все 8 пользователей → 201
>>> [2/3] Изоляция: каждый видит только свою функцию
PASS: Изоляция: все 8 пользователей видят только свои функции
>>> [3/3] 8 параллельных invoke для livetest@test.local
Ждём прогрева 8 функций...
прогрев функции 1/8: попытка 1/12...
прогрев функции 1/8: попытка 2/12...
прогрев функции 1/8: попытка 3/12...
прогрев функции 1/8: попытка 4/12...
прогрев функции 1/8: попытка 5/12...
прогрев функции 1/8: попытка 6/12...
прогрев функции 1/8: попытка 7/12...
прогрев функции 1/8: попытка 8/12...
прогрев функции 1/8: попытка 9/12...
прогрев функции 1/8: попытка 10/12...
прогрев функции 1/8: попытка 11/12...
прогрев функции 1/8: попытка 12/12...
функция 1/8 — готова
прогрев функции 2/8: попытка 1/12...
прогрев функции 2/8: попытка 2/12...
прогрев функции 2/8: попытка 3/12...
прогрев функции 2/8: попытка 4/12...
прогрев функции 2/8: попытка 5/12...
прогрев функции 2/8: попытка 6/12...
прогрев функции 2/8: попытка 7/12...
прогрев функции 2/8: попытка 8/12...
прогрев функции 2/8: попытка 9/12...
прогрев функции 2/8: попытка 10/12...
прогрев функции 2/8: попытка 11/12...
прогрев функции 2/8: попытка 12/12...
функция 2/8 — готова
прогрев функции 3/8: попытка 1/12...
прогрев функции 3/8: попытка 2/12...
прогрев функции 3/8: попытка 3/12...
прогрев функции 3/8: попытка 4/12...
прогрев функции 3/8: попытка 5/12...
прогрев функции 3/8: попытка 6/12...
прогрев функции 3/8: попытка 7/12...
прогрев функции 3/8: попытка 8/12...
прогрев функции 3/8: попытка 9/12...
прогрев функции 3/8: попытка 10/12...
прогрев функции 3/8: попытка 11/12...
прогрев функции 3/8: попытка 12/12...
функция 3/8 — готова
прогрев функции 4/8: попытка 1/12...
прогрев функции 4/8: попытка 2/12...
прогрев функции 4/8: попытка 3/12...
прогрев функции 4/8: попытка 4/12...
прогрев функции 4/8: попытка 5/12...
прогрев функции 4/8: попытка 6/12...
прогрев функции 4/8: попытка 7/12...
прогрев функции 4/8: попытка 8/12...
прогрев функции 4/8: попытка 9/12...
прогрев функции 4/8: попытка 10/12...
прогрев функции 4/8: попытка 11/12...
прогрев функции 4/8: попытка 12/12...
функция 4/8 — готова
прогрев функции 5/8: попытка 1/12...
прогрев функции 5/8: попытка 2/12...
прогрев функции 5/8: попытка 3/12...
прогрев функции 5/8: попытка 4/12...
прогрев функции 5/8: попытка 5/12...
прогрев функции 5/8: попытка 6/12...
прогрев функции 5/8: попытка 7/12...
прогрев функции 5/8: попытка 8/12...
прогрев функции 5/8: попытка 9/12...
прогрев функции 5/8: попытка 10/12...
прогрев функции 5/8: попытка 11/12...
прогрев функции 5/8: попытка 12/12...
функция 5/8 — готова
прогрев функции 6/8: попытка 1/12...
прогрев функции 6/8: попытка 2/12...
прогрев функции 6/8: попытка 3/12...
прогрев функции 6/8: попытка 4/12...
прогрев функции 6/8: попытка 5/12...
прогрев функции 6/8: попытка 6/12...
прогрев функции 6/8: попытка 7/12...
прогрев функции 6/8: попытка 8/12...
прогрев функции 6/8: попытка 9/12...
прогрев функции 6/8: попытка 10/12...
прогрев функции 6/8: попытка 11/12...
прогрев функции 6/8: попытка 12/12...
функция 6/8 — готова
прогрев функции 7/8: попытка 1/12...
прогрев функции 7/8: попытка 2/12...
прогрев функции 7/8: попытка 3/12...
прогрев функции 7/8: попытка 4/12...
прогрев функции 7/8: попытка 5/12...
прогрев функции 7/8: попытка 6/12...
прогрев функции 7/8: попытка 7/12...
прогрев функции 7/8: попытка 8/12...
прогрев функции 7/8: попытка 9/12...
прогрев функции 7/8: попытка 10/12...
прогрев функции 7/8: попытка 11/12...
прогрев функции 7/8: попытка 12/12...
функция 7/8 — готова
прогрев функции 8/8: попытка 1/12...
прогрев функции 8/8: попытка 2/12...
прогрев функции 8/8: попытка 3/12...
прогрев функции 8/8: попытка 4/12...
прогрев функции 8/8: попытка 5/12...
прогрев функции 8/8: попытка 6/12...
прогрев функции 8/8: попытка 7/12...
прогрев функции 8/8: попытка 8/12...
прогрев функции 8/8: попытка 9/12...
прогрев функции 8/8: попытка 10/12...
прогрев функции 8/8: попытка 11/12...
прогрев функции 8/8: попытка 12/12...
функция 8/8 — готова
FAIL: Параллельный INVOKE (livetest): 8/8 упали
========================================
ИТОГ: PASS=2 FAIL=1
========================================
 ✗ test_stress.sh — FAILED (exit 1)
╔══════════════════════════════════════╗
║ Скриптов: PASS=4 FAIL=4 1020s ║
╚══════════════════════════════════════╝
Упавшие скрипты:
✗ test_isolation.sh
✗ test_update.sh
✗ test_invoke.sh
✗ test_stress.sh
+287
View File
@@ -0,0 +1,287 @@
LOG: /home/naeel/terra/fission/scripts/../test-results/2026-05-03_18-08-19.log
>>> Предварительная очистка тест-namespace-ов...
pre_cleanup.sh: найдено 16 тест-namespace-ов, удаляем...
namespace "fission-144f17f38393c868" deleted
namespace "fission-15b9941047ab2ca0" deleted
namespace "fission-436ddc8693d9dde4" deleted
namespace "fission-4374fb3483a0d192" deleted
namespace "fission-45ffb6f300b47b43" deleted
namespace "fission-49fdb3ee07292199" deleted
namespace "fission-4b897bd205a45e43" deleted
namespace "fission-6b5d473720accdd7" deleted
namespace "fission-6dca95c9a39f6956" deleted
namespace "fission-8fade6140d3543be" deleted
namespace "fission-9d30ab49ffc0a54c" deleted
namespace "fission-ab0feb7a9dfb290c" deleted
namespace "fission-b8c041b48a2ff140" deleted
namespace "fission-c3511430abe5675b" deleted
namespace "fission-ca1c1fc777879918" deleted
namespace "fission-e510a990c82f30b2" deleted
pre_cleanup.sh: очистка завершена.
╔══════════════════════════════════════╗
║ fission-console — полный тест-сьют ║
╚══════════════════════════════════════╝
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_auth.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_auth.sh run=c265d58b
========================================
>>> POST /auth: пустой токен → 400
PASS: POST /auth пустой token → 400 (HTTP 400)
>>> POST /auth: токен < 6 символов → 401
PASS: POST /auth токен 2 символа → 401 (HTTP 401)
PASS: POST /auth токен 5 символов → 401 (HTTP 401)
>>> POST /auth: токен ≥6 символов → 200
PASS: POST /auth валидный токен → 200 (HTTP 200)
PASS: POST /auth namespace=fission-...
PASS: POST /auth ok=true
>>> POST /auth: невалидный JSON → 400
PASS: POST /auth невалидный JSON → 400
>>> POST /auth: GET метод → 405
PASS: GET /auth → 405
>>> X-Auth-Token: отсутствует → 401
PASS: GET /functions без токена → 401 (HTTP 401)
>>> X-Auth-Token: токен < 6 символов → 401
PASS: GET /functions токен 2 символа → 401 (HTTP 401)
PASS: GET /functions токен 5 символов → 401 (HTTP 401)
>>> X-Auth-Token: токен ≥6 символов → 200
PASS: GET /functions валидный X-Auth-Token → 200 (HTTP 200)
>>> Authorization: Bearer → 200
PASS: GET /functions Authorization: Bearer → 200 (HTTP 200)
>>> Namespace детерминирован (одинаковый токен → одинаковый NS)
PASS: Namespace детерминирован: fission-4f2623887cc7119c
========================================
ИТОГ: PASS=14 FAIL=0
========================================
 ✓ test_auth.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_functions_crud.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_functions_crud.sh run=0be6b674
========================================
>>> CREATE: базовый nodejs → 201
PASS: CREATE nodejs → 201 (HTTP 201)
PASS: CREATE: name в ответе
PASS: CREATE: route непустой
PASS: CREATE: package непустой
>>> CREATE: дубликат → 409
PASS: CREATE дубликат → 409 (HTTP 409)
>>> CREATE: без name → 400
PASS: CREATE без name → 400 (HTTP 400)
>>> CREATE: без language → 400
PASS: CREATE без language → 400 (HTTP 400)
>>> CREATE: без code → 400
PASS: CREATE без code → 400 (HTTP 400)
>>> CREATE: невалидный язык → 400
PASS: CREATE язык=cobol → 400 (HTTP 400)
>>> CREATE: валидация имени
PASS: CREATE имя с заглавной → 400 (HTTP 400)
PASS: CREATE имя с ведущим дефисом → 400 (HTTP 400)
PASS: CREATE имя с завершающим дефисом → 400 (HTTP 400)
PASS: CREATE имя с пробелом → 400 (HTTP 400)
PASS: CREATE имя 58 символов → 400 (HTTP 400)
PASS: CREATE имя 57 символов → 201 (HTTP 201)
>>> CREATE: код > 1MB → 400 или 413
PASS: CREATE код > 1MB → отклонён (000)
>>> LIST: GET /functions → 200, массив
PASS: LIST GET /functions → 200 (HTTP 200)
PASS: LIST: содержит ≥1 функцию (создали выше)
>>> LIST: новый пользователь → пустой массив
PASS: LIST новый пользователь → 200 (HTTP 200)
PASS: LIST новый пользователь → []
>>> GET: /functions/{name} → 200
PASS: GET /functions/t-crud-fn-0be6b674 → 200 (HTTP 200)
PASS: GET: name совпадает
PASS: GET: environment непустой (console-nodejs-env)
>>> GET: несуществующая функция → 404
PASS: GET несуществующая → 404 (HTTP 404)
>>> DELETE: /functions/{name} → 200
PASS: DELETE crud-fn → 200 (HTTP 200)
PASS: DELETE: deleted=true
>>> DELETE: повторное удаление → 404
PASS: DELETE повторное → 404 (HTTP 404)
>>> GET: после DELETE → 404
PASS: GET после DELETE → 404 (HTTP 404)
>>> DELETE: несуществующая функция → 404
PASS: DELETE несуществующая → 404 (HTTP 404)
========================================
ИТОГ: PASS=29 FAIL=0
========================================
 ✓ test_functions_crud.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_ttl.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_ttl.sh run=954bd7d6
========================================
>>> CREATE без TTL → expires_at отсутствует
PASS: CREATE без TTL: expires_at отсутствует
>>> CREATE с TTL=15m → expires_at присутствует
PASS: CREATE TTL=15m: expires_at=2026-05-03T15:24:08Z
PASS: expires_at формат RFC3339
>>> CREATE с TTL=1h → expires_at присутствует
PASS: CREATE TTL=1h: expires_at=2026-05-03T16:09:09Z
>>> CREATE с TTL=2d → expires_at присутствует
PASS: CREATE TTL=2d: expires_at=2026-05-05T15:09:10Z
>>> CREATE TTL невалидный → 400 (без создания объектов)
PASS: TTL='99z' → 400
PASS: TTL='abc' → 400
PASS: TTL='0d' → 400
PASS: TTL='-1h' → 400
>>> LIST: функция с TTL видна в списке
PASS: LIST: видно ≥3 функции (2 с TTL, 1 без)
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_ttl.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_isolation.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_isolation.sh run=601bf90d
========================================
>>> Alice создаёт функцию
PASS: Alice CREATE t-alice-fn → 201 (HTTP 201)
>>> Bob GET t-alice-fn → 404
PASS: Bob GET t-alice-fn → 404 (HTTP 404)
>>> Bob DELETE t-alice-fn → 404
PASS: Bob DELETE t-alice-fn → 404 (HTTP 404)
>>> Bob PUT t-alice-fn/code → 404
PASS: Bob PUT t-alice-fn/code → 404 (HTTP 404)
>>> Bob INVOKE t-alice-fn → 404
PASS: Bob INVOKE t-alice-fn → 404 (HTTP 404)
>>> Alice GET t-alice-fn → 200 (не повреждена)
PASS: Alice GET t-alice-fn → 200 (HTTP 200)
>>> LIST изоляция: Alice и Bob видят только свои функции
FAIL: Alice LIST не содержит t-alice-fn (count=1)
PASS: Alice LIST не содержит t-bob-fn
FAIL: Bob LIST не содержит t-bob-fn
PASS: Bob LIST не содержит t-alice-fn
>>> Route изоляция: одинаковое имя → разные routes
PASS: Route изоляция: /cb6533e3a6b0/t-alice-fn ≠ /c49acc82f3ed/t-bob-fn
========================================
ИТОГ: PASS=9 FAIL=2
========================================
 ✗ test_isolation.sh — FAILED (exit 1)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_update.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_update.sh run=3adb41f6
========================================
>>> CREATE: версия v1
FAIL: CREATE v1 → 201 — got 502, want 201
Ждём прогрева...
TRY=1 fn=t-upd-fn-3adb41f6 status= raw= err=
TRY=2 fn=t-upd-fn-3adb41f6 status= raw= err=
TRY=3 fn=t-upd-fn-3adb41f6 status= raw= err=
TRY=4 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=5 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=6 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=7 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=8 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=9 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=10 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=11 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=12 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
FAIL: Invoke v1 не стабилизировался
>>> PUT /code: версия v2
FAIL: PUT /code v2 → 200 — got 404, want 200
FAIL: PUT /code: updated=''
FAIL: PUT /code: package пустой
Ждём пока executor подхватит новый код...
TRY=1 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=2 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=3 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=4 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=5 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=6 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=7 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=8 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=9 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=10 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=11 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=12 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=13 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=14 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=15 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
FAIL: Invoke после update не вернул version-two
>>> PUT /code: пустой код → 400
PASS: PUT /code пустой код → 400 (HTTP 400)
PASS: PUT /code пробельный код → 400 (HTTP 400)
>>> PUT /code: несуществующая функция → 404
PASS: PUT /code несуществующая → 404 (HTTP 404)
>>> PUT /code: версия v3 (цепочка)
TRY=1 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=2 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=3 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=4 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=5 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=6 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=7 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=8 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=9 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
TRY=10 fn=t-upd-fn-3adb41f6 status= raw= err=function "t-upd-fn-3adb41f6" not found
+220
View File
@@ -0,0 +1,220 @@
LOG: /home/naeel/terra/fission/scripts/../test-results/2026-05-03_18-25-27.log
>>> Предварительная очистка тест-namespace-ов...
pre_cleanup.sh: тест-namespace-ы не найдены, пропускаем.
╔══════════════════════════════════════╗
║ fission-console — полный тест-сьют ║
╚══════════════════════════════════════╝
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_auth.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_auth.sh run=72c7e028
========================================
>>> POST /auth: пустой токен → 400
PASS: POST /auth пустой token → 400 (HTTP 400)
>>> POST /auth: токен < 6 символов → 401
PASS: POST /auth токен 2 символа → 401 (HTTP 401)
PASS: POST /auth токен 5 символов → 401 (HTTP 401)
>>> POST /auth: токен ≥6 символов → 200
PASS: POST /auth валидный токен → 200 (HTTP 200)
PASS: POST /auth namespace=fission-...
PASS: POST /auth ok=true
>>> POST /auth: невалидный JSON → 400
PASS: POST /auth невалидный JSON → 400
>>> POST /auth: GET метод → 405
PASS: GET /auth → 405
>>> X-Auth-Token: отсутствует → 401
PASS: GET /functions без токена → 401 (HTTP 401)
>>> X-Auth-Token: токен < 6 символов → 401
PASS: GET /functions токен 2 символа → 401 (HTTP 401)
PASS: GET /functions токен 5 символов → 401 (HTTP 401)
>>> X-Auth-Token: токен ≥6 символов → 200
PASS: GET /functions валидный X-Auth-Token → 200 (HTTP 200)
>>> Authorization: Bearer → 200
PASS: GET /functions Authorization: Bearer → 200 (HTTP 200)
>>> Namespace детерминирован (одинаковый токен → одинаковый NS)
PASS: Namespace детерминирован: fission-test-39a887b8346480e2
========================================
ИТОГ: PASS=14 FAIL=0
========================================
 ✓ test_auth.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_functions_crud.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_functions_crud.sh run=20730380
========================================
>>> CREATE: базовый nodejs → 201
PASS: CREATE nodejs → 201 (HTTP 201)
PASS: CREATE: name в ответе
PASS: CREATE: route непустой
PASS: CREATE: package непустой
>>> CREATE: дубликат → 409
PASS: CREATE дубликат → 409 (HTTP 409)
>>> CREATE: без name → 400
PASS: CREATE без name → 400 (HTTP 400)
>>> CREATE: без language → 400
PASS: CREATE без language → 400 (HTTP 400)
>>> CREATE: без code → 400
PASS: CREATE без code → 400 (HTTP 400)
>>> CREATE: невалидный язык → 400
PASS: CREATE язык=cobol → 400 (HTTP 400)
>>> CREATE: валидация имени
PASS: CREATE имя с заглавной → 400 (HTTP 400)
PASS: CREATE имя с ведущим дефисом → 400 (HTTP 400)
PASS: CREATE имя с завершающим дефисом → 400 (HTTP 400)
PASS: CREATE имя с пробелом → 400 (HTTP 400)
PASS: CREATE имя 58 символов → 400 (HTTP 400)
PASS: CREATE имя 57 символов → 201 (HTTP 201)
>>> CREATE: код > 1MB → 400 или 413
PASS: CREATE код > 1MB → отклонён (000)
>>> LIST: GET /functions → 200, массив
PASS: LIST GET /functions → 200 (HTTP 200)
PASS: LIST: содержит ≥1 функцию (создали выше)
>>> LIST: новый пользователь → пустой массив
PASS: LIST новый пользователь → 200 (HTTP 200)
PASS: LIST новый пользователь → []
>>> GET: /functions/{name} → 200
PASS: GET /functions/t-crud-fn-20730380 → 200 (HTTP 200)
PASS: GET: name совпадает
PASS: GET: environment непустой (console-nodejs-env)
>>> GET: несуществующая функция → 404
PASS: GET несуществующая → 404 (HTTP 404)
>>> DELETE: /functions/{name} → 200
PASS: DELETE crud-fn → 200 (HTTP 200)
PASS: DELETE: deleted=true
>>> DELETE: повторное удаление → 404
PASS: DELETE повторное → 404 (HTTP 404)
>>> GET: после DELETE → 404
PASS: GET после DELETE → 404 (HTTP 404)
>>> DELETE: несуществующая функция → 404
PASS: DELETE несуществующая → 404 (HTTP 404)
========================================
ИТОГ: PASS=29 FAIL=0
========================================
 ✓ test_functions_crud.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_ttl.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_ttl.sh run=3526cd93
========================================
>>> CREATE без TTL → expires_at отсутствует
PASS: CREATE без TTL: expires_at отсутствует
>>> CREATE с TTL=15m → expires_at присутствует
PASS: CREATE TTL=15m: expires_at=2026-05-03T15:41:03Z
PASS: expires_at формат RFC3339
>>> CREATE с TTL=1h → expires_at присутствует
PASS: CREATE TTL=1h: expires_at=2026-05-03T16:26:04Z
>>> CREATE с TTL=2d → expires_at присутствует
PASS: CREATE TTL=2d: expires_at=2026-05-05T15:26:05Z
>>> CREATE TTL невалидный → 400 (без создания объектов)
PASS: TTL='99z' → 400
PASS: TTL='abc' → 400
PASS: TTL='0d' → 400
PASS: TTL='-1h' → 400
>>> LIST: функция с TTL видна в списке
PASS: LIST: видно ≥3 функции (2 с TTL, 1 без)
========================================
ИТОГ: PASS=10 FAIL=0
========================================
 ✓ test_ttl.sh — PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_isolation.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_isolation.sh run=e8eadbdb
========================================
>>> Alice создаёт функцию
PASS: Alice CREATE t-alice-fn → 201 (HTTP 201)
>>> Bob GET t-alice-fn → 404
PASS: Bob GET t-alice-fn → 404 (HTTP 404)
>>> Bob DELETE t-alice-fn → 404
PASS: Bob DELETE t-alice-fn → 404 (HTTP 404)
>>> Bob PUT t-alice-fn/code → 404
PASS: Bob PUT t-alice-fn/code → 404 (HTTP 404)
>>> Bob INVOKE t-alice-fn → 404
PASS: Bob INVOKE t-alice-fn → 404 (HTTP 404)
>>> Alice GET t-alice-fn → 200 (не повреждена)
PASS: Alice GET t-alice-fn → 200 (HTTP 200)
>>> LIST изоляция: Alice и Bob видят только свои функции
FAIL: Alice LIST не содержит t-alice-fn (count=1)
PASS: Alice LIST не содержит t-bob-fn
FAIL: Bob LIST не содержит t-bob-fn
PASS: Bob LIST не содержит t-alice-fn
>>> Route изоляция: одинаковое имя → разные routes
PASS: Route изоляция: /50968da3258f/t-alice-fn ≠ /4b3450dbcc1f/t-bob-fn
========================================
ИТОГ: PASS=9 FAIL=2
========================================
 ✗ test_isolation.sh — FAILED (exit 1)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ЗАПУСК: test_update.sh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
========================================
test_update.sh run=93d4e907
========================================
>>> CREATE: версия v1
PASS: CREATE v1 → 201 (HTTP 201)
Ждём прогрева...
TRY=1 fn=t-upd-fn-93d4e907 status=404 raw=404 page not found err=
TRY=2 fn=t-upd-fn-93d4e907 status=404 raw=404 page not found err=
TRY=3 fn=t-upd-fn-93d4e907 status=404 raw=404 page not found err=
TRY=4 fn=t-upd-fn-93d4e907 status=404 raw=404 page not found err=