forked from python/cpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bpo-28494: Test existing zipfile working behavior. (pythonGH-15853)
Add unittests for executables with a zipfile appended to test_zipfile, as zipfile.is_zipfile and zipfile.ZipFile work properly on these today.
- Loading branch information
Showing
6 changed files
with
101 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
# Test data for `test_zipfile` | ||
|
||
The test executables in this directory are created manually from header.sh and | ||
the `testdata_module_inside_zip.py` file. You must have infozip's zip utility | ||
installed (`apt install zip` on Debian). | ||
|
||
## Purpose | ||
|
||
These are used to test executable files with an appended zipfile, in a scenario | ||
where the executable is _not_ a Python interpreter itself so our automatic | ||
zipimport machinery (that'd look for `__main__.py`) is not being used. | ||
|
||
## Updating the test executables | ||
|
||
If you update header.sh or the testdata_module_inside_zip.py file, rerun the | ||
commands below. These are expected to be rarely changed, if ever. | ||
|
||
### Standard old format (2.0) zip file | ||
|
||
``` | ||
zip -0 zip2.zip testdata_module_inside_zip.py | ||
cat header.sh zip2.zip >exe_with_zip | ||
rm zip2.zip | ||
``` | ||
|
||
### Modern format (4.5) zip64 file | ||
|
||
Redirecting from stdin forces infozip's zip tool to create a zip64. | ||
|
||
``` | ||
zip -0 <testdata_module_inside_zip.py >zip64.zip | ||
cat header.sh zip64.zip >exe_with_z64 | ||
rm zip64.zip | ||
``` | ||
|
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#!/bin/bash | ||
INTERPRETER_UNDER_TEST="$1" | ||
if [[ ! -x "${INTERPRETER_UNDER_TEST}" ]]; then | ||
echo "Interpreter must be the command line argument." | ||
exit 4 | ||
fi | ||
EXECUTABLE="$0" exec "${INTERPRETER_UNDER_TEST}" -E - <<END_OF_PYTHON | ||
import os | ||
import zipfile | ||
namespace = {} | ||
filename = os.environ['EXECUTABLE'] | ||
print(f'Opening {filename} as a zipfile.') | ||
with zipfile.ZipFile(filename, mode='r') as exe_zip: | ||
for file_info in exe_zip.infolist(): | ||
data = exe_zip.read(file_info) | ||
exec(data, namespace, namespace) | ||
break # Only use the first file in the archive. | ||
print('Favorite number in executable:', namespace["FAVORITE_NUMBER"]) | ||
### Archive contents will be appended after this file. ### | ||
END_OF_PYTHON |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# Test data file to be stored within a zip file. | ||
FAVORITE_NUMBER = 5 |