385 lines
16 KiB
Plaintext
385 lines
16 KiB
Plaintext
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
|
||
========================================
|
||
[0;32m ✓ test_auth.sh — PASSED[0m
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ЗАПУСК: 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
|
||
========================================
|
||
[0;32m ✓ test_functions_crud.sh — PASSED[0m
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ЗАПУСК: 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
|
||
========================================
|
||
[0;32m ✓ test_ttl.sh — PASSED[0m
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ЗАПУСК: 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
|
||
========================================
|
||
[0;32m ✓ test_isolation.sh — PASSED[0m
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ЗАПУСК: 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
|
||
========================================
|
||
[0;32m ✓ test_update.sh — PASSED[0m
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ЗАПУСК: 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
|
||
========================================
|
||
[0;32m ✓ test_invoke.sh — PASSED[0m
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ЗАПУСК: 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
|
||
========================
|
||
[0;32m ✓ test_linters.sh — PASSED[0m
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ЗАПУСК: 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
|
||
========================================
|