From 4837d42ba1b54ecbb98e7137a8b9c55c5346bc01 Mon Sep 17 00:00:00 2001 From: Naeel Date: Mon, 20 Apr 2026 04:54:56 +0300 Subject: [PATCH] =?UTF-8?q?test:=20add=20block=20AE=20=E2=80=94=20Go=20lan?= =?UTF-8?q?guage=20invoke=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_v2.sh | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/tests_v2.sh b/tests_v2.sh index 3fd7d46..a9d817c 100644 --- a/tests_v2.sh +++ b/tests_v2.sh @@ -678,6 +678,123 @@ Z_VICTIM_LIST=$(curl -s ${BASE}/functions -H "X-Test-Sub: ${VICTIM_USER}" \ | python3 -c "import sys,json; fns=json.load(sys.stdin); print(sum(1 for f in fns if f['metadata']['name']=='secret-fn'))" 2>/dev/null) [ "${Z_VICTIM_LIST:-0}" -eq 1 ] && pass "Cross-user: функция жертвы цела после атаки" || fail "Cross-user: функция жертвы исчезла!" +# ────────────────────────────────────────────── +echo "" +echo ">>> БЛОК AA: PHP — создание и вызов" + +# Все три блока (AA/AB/AC) используют ОДИН namespace, чтобы избежать повторных executor rollouts. +# Первая функция (PHP) вызывает addNSToFission → executor rollout (~60s). +# Ruby и Perl создаются в том же namespace → rollout не нужен → пулы стартуют сразу. +LANG_NS="lang-multi-${RUN_ID}@test.local" + +PHP_CODE=$(python3 -c "import json; print(json.dumps('getBody()->write(\"php-ok\");\n}'))") +R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \ + -H "X-Test-Sub: ${LANG_NS}" -H "Content-Type: application/json" \ + -d "{\"name\":\"php-fn\",\"language\":\"php\",\"code\":${PHP_CODE},\"ttl\":\"10m\"}") +CODE=$(echo "$R" | tail -1) +check_http "$CODE" "201" "PHP: create → 201" + +# Ждём пока poolmgr поднимет pod для нового env (retry до 200s). +# После executor rollout (~60s) + startup pod (~30s) = ~90s до первого invoke. +STATUS=""; RAW="" +for _try in $(seq 1 20); do + sleep 10 + INV=$(curl -s -X POST ${BASE}/functions/php-fn/invoke \ + -H "X-Test-Sub: ${LANG_NS}") + STATUS=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null) + RAW=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_raw','?'))" 2>/dev/null) + [ "$STATUS" = "200" ] && break +done +[ "$STATUS" = "200" ] && pass "PHP: invoke → 200" || fail "PHP: invoke → got $STATUS (body: $RAW)" +echo "$RAW" | grep -q "php-ok" && pass "PHP: тело содержит php-ok" || fail "PHP: тело не содержит php-ok (got: $RAW)" + +# ────────────────────────────────────────────── +echo "" +echo ">>> БЛОК AB: Ruby — создание и вызов" + +RUBY_CODE=$(python3 -c "import json; print(json.dumps('def handler\n \"ruby-ok\"\nend'))") +R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \ + -H "X-Test-Sub: ${LANG_NS}" -H "Content-Type: application/json" \ + -d "{\"name\":\"ruby-fn\",\"language\":\"ruby\",\"code\":${RUBY_CODE},\"ttl\":\"10m\"}") +CODE=$(echo "$R" | tail -1) +check_http "$CODE" "201" "Ruby: create → 201" + +# Ждём пока poolmgr поднимет pod (retry до 200s). +# Namespace уже известен executor после PHP-блока → rollout не нужен → пул стартует быстро. +STATUS=""; RAW="" +for _try in $(seq 1 20); do + sleep 10 + INV=$(curl -s -X POST ${BASE}/functions/ruby-fn/invoke \ + -H "X-Test-Sub: ${LANG_NS}") + STATUS=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null) + RAW=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_raw','?'))" 2>/dev/null) + [ "$STATUS" = "200" ] && break +done +[ "$STATUS" = "200" ] && pass "Ruby: invoke → 200" || fail "Ruby: invoke → got $STATUS (body: $RAW)" +echo "$RAW" | grep -q "ruby-ok" && pass "Ruby: тело содержит ruby-ok" || fail "Ruby: тело не содержит ruby-ok (got: $RAW)" + +# ────────────────────────────────────────────── +echo "" +echo ">>> БЛОК AC: Perl — создание и вызов" + +PERL_CODE=$(python3 -c "import json; print(json.dumps('sub {\n return \"perl-ok\";\n}'))") +R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \ + -H "X-Test-Sub: ${LANG_NS}" -H "Content-Type: application/json" \ + -d "{\"name\":\"perl-fn\",\"language\":\"perl\",\"code\":${PERL_CODE},\"ttl\":\"10m\"}") +CODE=$(echo "$R" | tail -1) +check_http "$CODE" "201" "Perl: create → 201" + +# Ждём пока poolmgr поднимет pod (retry до 200s). +# Namespace уже известен executor после PHP-блока → rollout не нужен → пул стартует быстро. +STATUS=""; RAW="" +for _try in $(seq 1 20); do + sleep 10 + INV=$(curl -s -X POST ${BASE}/functions/perl-fn/invoke \ + -H "X-Test-Sub: ${LANG_NS}") + STATUS=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null) + RAW=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_raw','?'))" 2>/dev/null) + [ "$STATUS" = "200" ] && break +done +[ "$STATUS" = "200" ] && pass "Perl: invoke → 200" || fail "Perl: invoke → got $STATUS (body: $RAW)" +echo "$RAW" | grep -q "perl-ok" && pass "Perl: тело содержит perl-ok" || fail "Perl: тело не содержит perl-ok (got: $RAW)" + +# ────────────────────────────────────────────── +echo "" +echo ">>> БЛОК AD: Невалидный язык → 400" + +R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \ + -H "X-Test-Sub: lang-inv-${RUN_ID}@test.local" -H "Content-Type: application/json" \ + -d '{"name":"bad-lang-fn","language":"cobol","code":"x"}') +CODE=$(echo "$R" | tail -1) +check_http "$CODE" "400" "Невалидный язык cobol → 400" + +# ────────────────────────────────────────────── +echo "" +echo ">>> БЛОК AE: Go — создание и вызов" + +# Go использует newdeploy executor + buildermgr (~60-90s на сборку). +# Используем отдельный namespace чтобы не ждать executor rollout. +GO_NS="go-${RUN_ID}@test.local" +GO_CODE=$(python3 -c "import json; print(json.dumps('package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n)\n\nfunc Handler(w http.ResponseWriter, r *http.Request) {\n\tfmt.Fprintf(w, \"go-ok\")\n}'))") +R=$(curl -s -w "\n%{http_code}" -X POST ${BASE}/functions \ + -H "X-Test-Sub: ${GO_NS}" -H "Content-Type: application/json" \ + -d "{\"name\":\"go-fn\",\"language\":\"go\",\"code\":${GO_CODE},\"ttl\":\"10m\"}") +CODE=$(echo "$R" | tail -1) +check_http "$CODE" "201" "Go: create → 201" + +# Retry до 240s (24 итерации × 10s): ждём сборку + запуск newdeploy pod. +STATUS=""; RAW="" +for _try in $(seq 1 24); do + sleep 10 + INV=$(curl -s -X POST ${BASE}/functions/go-fn/invoke \ + -H "X-Test-Sub: ${GO_NS}") + STATUS=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','?'))" 2>/dev/null) + RAW=$(echo "$INV" | python3 -c "import sys,json; print(json.load(sys.stdin).get('response_raw','?'))" 2>/dev/null) + [ "$STATUS" = "200" ] && break +done +[ "$STATUS" = "200" ] && pass "Go: invoke → 200" || fail "Go: invoke → got $STATUS (body: $RAW)" +echo "$RAW" | grep -q "go-ok" && pass "Go: тело содержит go-ok" || fail "Go: тело не содержит go-ok (got: $RAW)" + # ────────────────────────────────────────────── echo "" echo "========================================"