Skip to content

feat: add mock_file_check_guard() for scope-based cleanup#3

Closed
Koan-Bot wants to merge 12 commits intomasterfrom
koan.atoomic/add-mock-file-check-guard
Closed

feat: add mock_file_check_guard() for scope-based cleanup#3
Koan-Bot wants to merge 12 commits intomasterfrom
koan.atoomic/add-mock-file-check-guard

Conversation

@Koan-Bot
Copy link
Copy Markdown
Collaborator

@Koan-Bot Koan-Bot commented Mar 7, 2026

What

Adds mock_file_check_guard($check, \&sub) — like mock_file_check but returns a guard object that auto-unmocks on scope exit.

Why

Tests using mock_file_check must manually call unmock_file_check in cleanup, which is error-prone — especially when tests die. The guard pattern ensures cleanup even on early exit, improving test isolation.

How

  • Inline Overload::FileCheck::Guard package with DESTROY-based cleanup
  • cancel() method to opt out of auto-unmock
  • Guard handles double-destroy safely (no-op on second call)
  • eval in DESTROY to never propagate exceptions

Testing

  • 14 new tests in t/guard.t covering: basic scope cleanup, cancel, double-destroy, die-in-eval, dash-less check names, FALLBACK_TO_REAL_OP
  • Full suite passes (1086 existing + 14 new)

🤖 Generated with Claude Code

Koan-Bot and others added 12 commits February 22, 2026 00:53
_check() stored the file argument in $_last_call_for for -X _ caching.
When the argument was a filehandle reference (not a string path), this
prevented the filehandle from being garbage collected, keeping the
underlying file descriptor open.

This caused "spooky action-at-a-distance" bugs: e.g. a socketpair read
hanging because a dup'd write-end filehandle was kept alive by the
leaked reference, even after leaving scope.

Fix: only cache string filenames in $_last_call_for, not references.

Ref: cpan-authors/Test-MockFile#179

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ef-leak

fix: prevent filehandle reference leak in stat override
Add CLAUDE.md with project guidance for Claude Code sessions.
Exclude CLAUDE.md and local/ directory from Dist::Zilla GatherDir
so they don't end up in the CPAN tarball.
Returns a guard object whose DESTROY calls unmock_file_check,
enabling automatic mock cleanup on scope exit. Improves test
isolation without changing the existing API.

The guard also supports cancel() to keep the mock active beyond
the scope, and handles double-destroy gracefully.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@atoomic
Copy link
Copy Markdown
Owner

atoomic commented Mar 7, 2026

need to resubmit to the parent repo

@atoomic
Copy link
Copy Markdown
Owner

atoomic commented Apr 23, 2026

@Koan-Bot squash

@Koan-Bot
Copy link
Copy Markdown
Collaborator Author

Rebased and recreated as cpan-authors#96, targeting main on the new upstream repo.

@Koan-Bot Koan-Bot closed this Apr 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants