Opened 5 months ago
Closed 5 months ago
#36479 closed Cleanup/optimization (fixed)
Failing test for black formatter missing install simulation
| Reported by: | Roelzkie | Owned by: | Roelzkie |
|---|---|---|---|
| Component: | Core (Management commands) | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Roelzkie, Mike Edmunds | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
The test on test.user_commands.tests.UtilsTests.test_run_formatters_handles_oserror_for_black_path attempts to assert a `FileNotFoundError` when simulating a missing black formatter installation.
./runtests.py user_commands.tests.UtilsTests.test_run_formatters_handles_oserror_for_black_path
However, it fails on the darwin platform, at least on MacOS v14.7.2 (Sonoma) M1 machine. I tested on a Linux platform, and the test passed.
The root issue is due to the subprocess.run command, which yields different OSError results on different OS's when the test reaches the `subprocess.run(["nonexistent", "--fast", "--")`].
For darwin (at least on MacOS v14.7.2 - M1), it yields a NotADirectoryError / OSError(20, "Not a directory") which fails the test.
For linux, it yields a FileNotFoundError / OSError(2, "File not found") which passes the test.
Ideally, this test should be able to handle it regardless of the machine platform.
See failed test full stacktrace: https://dpaste.org/pY48h (link will expire, see result below instead).
FAIL: test_run_formatters_handles_oserror_for_black_path (user_commands.tests.UtilsTests.test_run_formatters_handles_oserror_for_black_path) [FileNotFoundError]
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/unittest/case.py", line 58, in testPartExecutor
yield
File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/unittest/case.py", line 556, in subTest
yield
File "/Users/user1/projects/django/tests/user_commands/tests.py", line 584, in test_run_formatters_handles_oserror_for_black_path
self.assertIn(exception.__qualname__, parsed_error)
^^^^^^^
File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/unittest/case.py", line 1174, in assertIn
self.fail(self._formatMessage(msg, standardMsg))
^^^^^^^^^^^
File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/unittest/case.py", line 732, in fail
raise self.failureException(msg)
^^^^^^^^^^^^^^^
AssertionError: 'FileNotFoundError' not found in 'Formatters failed to launch:Traceback (most recent call last):
File "/Users/user1/projects/django/django/core/management/utils.py", line 175, in run_formatters
subprocess.run(
~~~~~~~~~~~~~~^
[black_path, "--fast", "--", *written_files],
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
capture_output=True,
^^^^^^^^^^^^^^^^^^^^
)
^
File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/subprocess.py", line 556, in run
with Popen(*popenargs, **kwargs) as process:
~~~~~^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/subprocess.py", line 1038, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pass_fds, cwd, env,
^^^^^^^^^^^^^^^^^^^
...<5 lines>...
gid, gids, uid, umask,
^^^^^^^^^^^^^^^^^^^^^^
start_new_session, process_group)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/subprocess.py", line 1974, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
NotADirectoryError: [Errno 20] Not a directory: \'nonexistent\''
----------------------------------------------------------------------
Update: Please see https://github.com/django/django/pull/19591
Change History (12)
comment:1 by , 5 months ago
| Description: | modified (diff) |
|---|---|
| Needs tests: | set |
comment:2 by , 5 months ago
| Has patch: | set |
|---|
follow-up: 5 comment:3 by , 5 months ago
| Cc: | added |
|---|
comment:4 by , 5 months ago
| Description: | modified (diff) |
|---|
follow-up: 6 comment:5 by , 5 months ago
Replying to Sarah Boyce:
Mike would you be able to confirm this and that the PR fixes the issue? (See from #36162 you might have a similar setup)
I'm not able to reproduce the issue as reported. (But I'm on macOS 15.5 not 14.7. I'm not sure why that would make a difference. Looks like we're both on Python 3.13.2.)
% python ./runtests.py user_commands.tests.UtilsTests.test_run_formatters_handles_oserror_for_black_path Testing against Django installed in '~/dev/django/django' with up to 8 processes Found 1 test(s). System check identified no issues (0 silenced). . ---------------------------------------------------------------------- Ran 1 test in 0.009s OK % sw_vers ProductName: macOS ProductVersion: 15.5 BuildVersion: 24F74 % uname -mrsv Darwin 24.5.0 Darwin Kernel Version 24.5.0: Tue Apr 22 19:48:46 PDT 2025; root:xnu-11417.121.6~2/RELEASE_ARM64_T8103 arm64 % python --version Python 3.13.2 % git rev-parse --short=7 HEAD 23529b6
comment:6 by , 5 months ago
Replying to Mike Edmunds:
Replying to Sarah Boyce:
Mike would you be able to confirm this and that the PR fixes the issue? (See from #36162 you might have a similar setup)
I'm not able to reproduce the issue as reported. (But I'm on macOS 15.5 not 14.7. I'm not sure why that would make a difference. Looks like we're both on Python 3.13.2.)
% python ./runtests.py user_commands.tests.UtilsTests.test_run_formatters_handles_oserror_for_black_path Testing against Django installed in '~/dev/django/django' with up to 8 processes Found 1 test(s). System check identified no issues (0 silenced). . ---------------------------------------------------------------------- Ran 1 test in 0.009s OK % sw_vers ProductName: macOS ProductVersion: 15.5 BuildVersion: 24F74 % uname -mrsv Darwin 24.5.0 Darwin Kernel Version 24.5.0: Tue Apr 22 19:48:46 PDT 2025; root:xnu-11417.121.6~2/RELEASE_ARM64_T8103 arm64 % python --version Python 3.13.2 % git rev-parse --short=7 HEAD 23529b6
Thank you for checking. I'm not sure why it would break. I pulled again from the latest main branch just to be sure, but the test still failed. I also followed your commands to show more information.
$ python ./runtests.py user_commands.tests.UtilsTests.test_run_formatters_handles_oserror_for_black_path Testing against Django installed in '/Users/user1/django/django' with up to 8 processes Found 1 test(s). System check identified no issues (0 silenced). F ====================================================================== FAIL: test_run_formatters_handles_oserror_for_black_path (user_commands.tests.UtilsTests.test_run_formatters_handles_oserror_for_black_path) [FileNotFoundError] ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/user1/django/tests/user_commands/tests.py", line 584, in test_run_formatters_handles_oserror_for_black_path self.assertIn(exception.__qualname__, parsed_error) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AssertionError: 'FileNotFoundError' not found in 'Formatters failed to launch:Traceback (most recent call last):\n File "/Users/user1/django/django/core/management/utils.py", line 175, in run_formatters\n subprocess.run(\n ~~~~~~~~~~~~~~^\n [black_path, "--fast", "--", *written_files],\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n capture_output=True,\n ^^^^^^^^^^^^^^^^^^^^\n )\n ^\n File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/subprocess.py", line 569, in run\n with Popen(*popenargs, **kwargs) as process:\n ~~~~~^^^^^^^^^^^^^^^^^^^^^^\n File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/subprocess.py", line 1051, in __init__\n self._execute_child(args, executable, preexec_fn, close_fds,\n ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n pass_fds, cwd, env,\n ^^^^^^^^^^^^^^^^^^^\n ...<5 lines>...\n gid, gids, uid, umask,\n ^^^^^^^^^^^^^^^^^^^^^^\n start_new_session, process_group)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File "/Users/user1/.pyenv/versions/3.13.2/lib/python3.13/subprocess.py", line 1987, in _execute_child\n raise child_exception_type(errno_num, err_msg, err_filename)\nNotADirectoryError: [Errno 20] Not a directory: \'nonexistent\'\n' ---------------------------------------------------------------------- Ran 1 test in 0.008s FAILED (failures=1) $ sw_vers ProductName: macOS ProductVersion: 14.7.2 BuildVersion: 23H311 $ uname -mrsv Darwin 23.6.0 Darwin Kernel Version 23.6.0: Fri Nov 15 15:13:56 PST 2024; root:xnu-10063.141.1.702.7~1/RELEASE_ARM64_T8103 arm64 $ python --version Python 3.13.2 $ git rev-parse --short=7 HEAD 23529b6
follow-up: 9 comment:7 by , 5 months ago
| Component: | Uncategorized → Core (Management commands) |
|---|---|
| Easy pickings: | unset |
| Triage Stage: | Unreviewed → Accepted |
| Type: | Bug → Cleanup/optimization |
Accepting based on the conversations in the ticket and the PR.
Roelzkie, Mike, Jacob: are either of you using a VM to run the tests? Or all you all running "native" macos? (if that makes sense)
comment:8 by , 5 months ago
| Needs tests: | unset |
|---|
comment:9 by , 5 months ago
Replying to Natalia Bidart:
Accepting based on the conversations in the ticket and the PR.
Roelzkie, Mike, Jacob: are either of you using a VM to run the tests? Or all you all running "native" macos? (if that makes sense)
I'm running the test on a native macOS in my case.
comment:11 by , 5 months ago
| Triage Stage: | Accepted → Ready for checkin |
|---|
Mike would you be able to confirm this and that the PR fixes the issue? (See from #36162 you might have a similar setup)