test_file_utils umask tests assert against a umask the code never reads (import-time _UMASK), so they only pass on a 0o022 host
Maintainer thường phản hồi trong vòng 1 ngày
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 88/100
Hướng nghiên cứu
Đọc tests/comfy_cli/test_file_utils.py và comfy_cli/file_utils.py ở phần ghi nhận _UMASK. Cập nhật hai bài kiểm tra ghi nguyên tử để kiểm soát giá trị mà phần triển khai đọc, đồng thời bổ sung kiểm thử cho một umask thứ hai, chẳng hạn 0o077. Chạy các bài kiểm tra file-utils tập trung; chúng cần xác minh các chế độ tệp dự kiến mà không thay đổi umask của tiến trình.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
test_atomic_write_text_new_file_uses_umask_default and test_atomic_write_bytes_new_file_uses_umask_default set a umask at runtime and assert the resulting file mode. file_utils captures the umask once at import, so the os.umask(0o022) the tests call has no effect on the code under test. The assertion therefore only holds on a host whose ambient umask already happens to be 0o022, and fails outright on any other.
Observed on a host with umask 0007:
tests/comfy_cli/test_file_utils.py:163: AssertionError
assert 432 == (438 & ~18)
# ^ 0o660, i.e. 0o666 & ~0o007 (the AMBIENT umask)
# ^ 0o644, i.e. 0o666 & ~0o022 (the umask the test set)
Both tests fail the same way; test_atomic_write_bytes_… at :313.
Cause
comfy_cli/file_utils.py:98-105:
# The process umask, captured once at import. os has no getter, so reading it
# ...
# overlapping probes can restore each other's zero and strand the umask at 0.
_UMASK = os.umask(0)
os.umask(_UMASK)
Capturing once is deliberate and the comment gives a good reason for it. The tests simply do not account for it: they manipulate the real process umask, which _atomic_write no longer consults.
So this is a test defect, not a product one. The product behaviour the tests mean to pin — "a new destination gets the umask-derived default, not mkstemp's hardcoded 0600" — is correct and worth keeping pinned; the tests just pin it against the wrong knob.
Suggested fix
Patch the captured value rather than the process umask, so the test controls what the code actually reads:
def test_atomic_write_text_new_file_uses_umask_default(tmp_path, monkeypatch):
monkeypatch.setattr(file_utils, "_UMASK", 0o022)
target = tmp_path / "fresh.json"
atomic_write_text(target, "data")
assert stat.S_IMODE(os.stat(target).st_mode) == (0o666 & ~0o022)
That also removes the os.umask save/restore, which is process-global state the current tests mutate.
A second case worth adding while in there: assert the same for a non-0o022 umask (0o077, so 0o600), which would have caught this — a single hardcoded umask value cannot distinguish "the code honours the umask" from "the host umask matches the literal in the assertion".
Context
Found while verifying that pre-existing failures were unrelated to a converter change. Two other environment-sensitive failures turned up in the same run and are worth separating:
- Five
tests/comfy_cli/command/test_code_search.py::TestCodeSearchCLIcases fail when the suite runs from inside an AI coding tool, becauseCLAUDECODE/AI_AGENTin the environment flipdetect_caller()andcode-searchthen passesagent_origin=True. Fixed in #1072. test_node_deps.py::test_non_pep440_installed_version_is_unknown_not_a_crashreportsmismatchwhere it expectsunknown. Not agent-env related (it fails with those vars unset) and I have not diagnosed it; noting it so it is not assumed covered by the other two.
None of these fail in CI, which is why they have survived: CI's environment happens to satisfy every one of the assumptions.
Task Decomposition
Not decomposed: this is a two-test change in one file (swap os.umask(...) for monkeypatch.setattr(file_utils, "_UMASK", ...), plus one extra parametrised umask value). Stated explicitly per the issue-filing convention.
- Ngôn ngữ chính
- Python
- Star
- 1k
- Fork
- 176
- Merge trung bình
- 1 ngày 11 giờ
- Pull request đã merge (30 ngày)
- 87
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của Comfy-Org/comfy-cli
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
Comfy-Org/comfy-cli#907 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
Comfy-Org/comfy-cli#781 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
`comfy launch --background` fails with FileNotFoundError when comfy-cli is invoked by pathCó thể đã có người làm @RaphaelFakhri đã nhận 42 ngày trước. Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Comfy-Org/comfy-cli#691 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Comfy-Org/comfy-cli#670 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
UI→API conversion sends LOAD_3D viewport_state as "" where the frontend sends the viewport cameraĐang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 53/100
Comfy-Org/comfy-cli#1126 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của Comfy-Org/comfy-cli
Issue tương tự
-
add entry to blockĐang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 65/100
StevenBlack/hosts#3299 ·
-
`garak --report` overwrites the input report when its name has no ".report"Có thể đã có người làm @0z5a đã nhận hôm nay. Đang mởneeds-triage
Độ khó 2/5 Nửa ngày Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 2 ngày
-
plot_graph crashes when a mesh node has no m2m edgeCó thể đã có người làm @tygvi đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
mllam/neural-lam#883 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
future-agi/future-agi#4092 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
transcript analytics: a text whose only protected spans the prose pass redacts is withheld wholeĐang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 82/100
WingedGuardian/GENesis-AGI#4641 ·
Maintainer thường phản hồi trong vòng 1 ngày