Skip to Content

測試

TypeScript / workerd(edge/department-workers/tests/,npm test)

兩個 vitest pool 依序執行:Node pool(tests/*.test.mjs)與 @cloudflare/vitest-pool-workers pool(tests/*.test.ts:dispatcher.test.ts、dispatcher-contract.test.ts、onprem-entry.test.ts)。pool 的 workerd compatibility date 刻意落後生產幾天,須隨 pool 版本前移。CI 會對每個動到 edge/** 的 pull request 執行這個套件的 npm test。

套件證明
dispatcher.test.ts簽章斷言契約,同時經由兩個 dispatcher 入口執行(Cloudflare 入口與地端入口):script 推導、release-generation 注入、呼叫者選 script 不可能、query/body 替換被拒、統一 401、限制 fail-closed、選填的 limits claim(有就套用、沒有就退回 env、合法 claim 優先於不合法變數、公開通道一律用變數)、公開 query 長度上限(剛好等於上限可通過,多一個位元組回 414)、set-cookie 永不外洩
dispatcher-contract.test.ts地端入口與 dispatcher 核心之間的耦合點:Worker not found 前綴 → 404、CPU time limit 與 subrequest limit → 429、傳給查找的每次呼叫 limits、cf-connecting-ip → x-teamsync-client-ip、handleDispatcherRequest 的簽章
onprem-entry.test.ts + onprem-entry-workerd.test.mjs地端入口,分別在 workers pool 與真 workerd 中:每個入口 socket 的健康檢查、對任何它不服務的 script 回 404、部門超出 wall-clock 預算時回 429、client IP 只在 unix socket 上取自 edge host、每次呼叫的子請求預算
runtime-policy.test.mjs生成的 runtime 在真 workerd:控制回執(持久/單次重放/拒絕重綁定/容量)、五種存取模式(含 api_key_and_ip 的 AND)、teamsync_internal 播種(只寫入空的政策儲存;既有列保留)、逐操作存取(先比對操作再准入、操作金鑰與 Worker 層級金鑰隔離、設定依 release generation 帶過去、新 generation 在設定待處理期間 fail-closed)、runtime-config CAS + 每次呼叫快照、僅可寫入的 Worker 機密(僅摘要的回執、有型別的上限錯誤)、退役鎖定、context.teamsync 服務帳號 runtime(登入、到期前更新、撤銷)、跨 release 的儲存隔離
build.test.mjsbuilder:確定性(逐位元組相同輸出)、每個壓縮檔/manifest/lockfile/原始碼圍欄、zod jitless 釘定、輸出 bundle 的動態程式碼拒絕、與 Python 的正規 JSON 一致性
teamsync-worker.test.mjsCLI:委派給權威 builder、確定性 pack、0600 JWT 關卡、僅 HTTPS 後端、dev server 動態 loopback port、本機 dev 機密儲存維持 0700 / 0600、8 MiB 回應圍欄
starter-pack.test.mjsstarter pack:寫出兩次的壓縮檔逐位元組相同,且每個產物 digest 都有記錄
deploy-platform.test.mjs佈建:佔位符/金鑰不符/錯誤子網域 fail-closed、namespace binding 帶任何 outbound 鍵即拒絕(出貨的拓撲中沒有)、namespace 錯誤、缺少 binding 或 settings 格式錯誤的讀回被拒、--check/--dry-run 不變更(不退役、不做 API 變更)、--allow-api-overwrite 只解除 dispatcher 階段的 --strict、原始碼 digest(精確輸入、長度框住)與 --drift(真實行程的 exit 0/10/1、只需 token + account)、階段順序 dispatcher → 舊版 deny Worker 退役(存在 → DELETE ?force=true → 讀回不存在;不存在 → 跳過)→ canary、canary 生命週期含 200 不受限制對外連線的證明、有界的傳播重試與曖昧失敗後的清理、卡住的 Wrangler 被 SIGTERM/SIGKILL
package-boundary.test.mjsnpm 套件恰好出貨 5 個 script + 2 個範本,並排除 deploy-platform.mjs、Wrangler 設定、兩個 dispatcher 入口與測試
template/tests/worker.test.ts, template-javascript/tests/worker.test.js範本內建的開發者測試:五個 handler 對 in-memory 儲存替身

Python 單元/契約套件(tests/,pytest)

test_edge_workers_contract(manifest 驗證)、test_edge_worker_builder(子行程政策、證據重驗)、test_edge_worker_gateway / test_edge_worker_assertions(origin 釘定、header 政策含閘道的 User-Agent/x-client-user-agent 改寫、claim 圍欄、limits claim 的預設/覆寫/不合法設定、8 KiB JWS 邊界 — 340 個 emoji 塞得下、341 個不行)、test_edge_worker_cloudflare(上傳/回讀/429/正規化的 state:"created")、test_edge_worker_artifacts(endpoint 釘定、key 圍欄、no-Tagging)、test_edge_worker_release_generation、test_edge_worker_models(結構不變量,含這些表沒有手寫的 alembic revision)、test_edge_worker_crud、test_edge_worker_outbox(含真實資料庫快照測試與逐環境的回收分區)、test_edge_worker_deploy_task(429 第二次 PUT、Batch 租約回收、GET-only 有圍欄重試、不確定性暫停、release 就緒關卡)、test_edge_worker_artifact_cleanup_task(引用 key 保留)、test_edge_worker_control_audit_task(有界回執重試、明文金鑰拒絕、絕不調解其他環境的稽核)、test_edge_worker_company_admin、test_edge_worker_dependencies(角色圖)、test_edge_worker_api_openapi(路由清單 = 恰好 43 個文件化的成員操作,每個都只有 bearer-JWT 機制、沒有 x-api-key 參數)、test_edge_worker_cloud_drift(雲端管理介面維持釘在儲存的 OpenAPI 快照上)、test_edge_worker_http_e2e(行程內 HTTP:413 先於驗證、raw-path 圍欄、編碼分隔符拒絕)、test_edge_worker_submission_contract、test_edge_worker_packaging(builder 映像契約:digest 釘死的 Node 基底、三個 Dockerfile 逐位元組相同的 builder stage)、test_pubsub_consumer_self_gate。

5.10.11 之後新增功能的套件(依檔名):逐操作存取與金鑰(test_edge_worker_operation_access_backend、test_edge_worker_operation_settings、test_edge_worker_operation_key_request_log)、Worker 機密(test_edge_worker_secrets、test_edge_worker_secret_request_log_app、test_edge_worker_secret_validation_redaction)、test_edge_worker_service_account_bindings、test_edge_worker_starters(starter 目錄與下載路由)、test_edge_worker_version_source_download、退役(test_edge_worker_retirement;test_edge_worker_retirement_runtime:被植入的租戶程式碼不得讓已退役的 Worker 復活;test_edge_worker_audit_race:兩個行程寫入同一個冪等稽核 id),以及地端 provider 與其關卡(test_edge_worker_provider_selection、test_edge_worker_onprem_client、test_edge_worker_maintenance、test_edge_worker_onprem_maintenance,和 tests/scripts/ 下的 test_onprem_edge_workers_setup、test_onprem_edge_workers_compose、test_onprem_edge_workers_backup_restore)。

Host-only E2E harness(tests/e2e/edge_workers/ + scripts/e2e/edge_workers/)

對真實 compose stack 的可拋棄租戶端到端:bootstrap 以真實登入鑄造兩家公司與成員(拒絕在容器內執行;要求動態 loopback 後端 origin);一個契約測試靜態釘住 harness 本身(僅動態 port、digest 釘死的 Qdrant);一個驗證器檢查確定性稽核/outbox 快照並斷言任何 payload 都沒有明文機密;一個清理步驟在單一雜湊租戶前綴下最多刪 50 個 R2 物件。

地端 kit 驗收(scripts/e2e/edge_workers_kit/)

run_tests.py --target <target.json> 對由 JSON target 檔描述的單一 kit 執行 kit 驗收案例。一切都從操作者的主機驅動(經由 harness 開啟並關閉的 port forward 連到 kit 的公開 HTTPS 介面,並以 ssh 觀察箱子上必須看到的東西),租戶以真實登入建立,每次執行都寫出一份經遮罩的 JSON 回執。破壞性案例除非 target 標為可拋棄且 E2E_KIT_DESTRUCTIVE_TARGET 等於 target 名稱,否則拒絕執行;exit 0 代表每個嘗試過的案例都通過(被拒絕與功能不存在的案例本身不算失敗;--require-green 會把任何非通過結果變成非零 exit)。

Staging E2E 套件

對真實環境直接打 API 的套件(E2E_BASE_URL,預設 staging;exit 0 通過/1 失敗/2 模組未部署)。edge_workers_staging 在 fixture Worker 上經閘道發出 3/15/25 個子請求,並以 Python-urllib/3.11 與空的 User-Agent 呼叫;edge_workers_first_deploy 每次執行都建立全新的部門 + 管理者,證明第一次部署只在 Worker 與其存取政策路由都能回應後才回報 completed、起始為 teamsync_internal,且公開 URL 維持 403;edge_workers_control_audit 發出一次真實的存取政策變更,並印出確認「只有寫入環境調解了它」所需的識別碼。每個套件都在 teardown 把 fixture 政策鎖回 teamsync_internal,並證明公開 URL 回 403。

後來功能的套件沿用同樣慣例(真實登入、可拋棄的 e2e-… 部門、在 finally 拆除):edge_workers_operation_access(跨後端升級的逐操作存取:升級前 --phase seed、升級後 --phase verify、--phase cleanup,以及 --phase keyed-openapi)、edge_workers_secrets(僅可寫入的 Worker 機密)、edge_workers_service_accounts 與 edge_workers_sa_binding(服務帳號,以及它們經由 context.teamsync 的綁定與遞送)、edge_workers_source_download(某個修訂版儲存的原始碼壓縮檔)、edge_workers_retirement(被刪除部門的雲端 Worker 永久停止執行)與 edge_workers_orphan_scripts(被硬刪除公司的 Worker 由調解器放上墓碑)。edge_workers_retirement、edge_workers_orphan_scripts 與 edge_workers_source_download 只接受 staging origin;edge_workers_retirement 與 edge_workers_orphan_scripts 通過時 exit 0、失敗時 exit 1。

Cloudflare 真實環境測試

除非 TEAMSYNC_EDGE_WORKER_LIVE_E2E=1 否則跳過,之後還要求 …_LIVE_ALLOW_MUTATION=1 + …_LIVE_DISPOSABLE=1 且僅限 staging(設定的 dispatch namespace 與 dispatcher origin 都必須是 staging 的,否則測試失敗)。它用真範本 + 真 CLI pack 建兩個修訂版、部署 A、等待精確 settings 回讀、經簽章 dispatcher 做 CRUD、對同一 script 部署 B、證明 A 的紀錄存活過 B(跨修訂版 Durable Object 持久性)、證明 A 的 release generation 現在得到 503 release_generation_mismatch、在 B 下刪除(204 → 404),最後移除可拋棄 script。本機的 immutable/mock E2E 只證明契約 + 編排;這條測試才是 provider 證明。完整的 isolate 銷毀/重建在本機 workerd 證明(Cloudflare 不提供強制逐出 API)。

Last updated on