open_toontown_panda3d/tests/dist/test_FreezeTool.py

116 lines
4.1 KiB
Python

from direct.dist.FreezeTool import Freezer, PandaModuleFinder
import pytest
import os
import sys
import subprocess
import platform
def test_Freezer_moduleSuffixes():
freezer = Freezer()
for suffix, mode, type in freezer.mf.suffixes:
if type == 2: # imp.PY_SOURCE
assert mode == 'rb'
def test_Freezer_getModulePath_getModuleStar(tmp_path):
# Package 1 can be imported
package1 = tmp_path / "package1"
package1.mkdir()
(package1 / "submodule1.py").write_text("")
(package1 / "__init__.py").write_text("")
# Package 2 can not be imported
package2 = tmp_path / "package2"
package2.mkdir()
(package2 / "submodule2.py").write_text("")
(package2 / "__init__.py").write_text("raise ImportError\n")
# Module 1 can be imported
(tmp_path / "module1.py").write_text("")
# Module 2 can not be imported
(tmp_path / "module2.py").write_text("raise ImportError\n")
backup = sys.path
try:
# Don't fail if first item on path does not exist
sys.path = [str(tmp_path / "nonexistent"), str(tmp_path)]
freezer = Freezer()
assert freezer.getModulePath("nonexist") == None
assert freezer.getModulePath("package1") == [str(package1)]
assert freezer.getModulePath("package2") == [str(package2)]
assert freezer.getModulePath("package1.submodule1") == None
assert freezer.getModulePath("package1.nonexist") == None
assert freezer.getModulePath("package2.submodule2") == None
assert freezer.getModulePath("package2.nonexist") == None
assert freezer.getModulePath("module1") == None
assert freezer.getModulePath("module2") == None
assert freezer.getModuleStar("nonexist") == None
assert freezer.getModuleStar("package1") == ['submodule1']
assert freezer.getModuleStar("package2") == ['submodule2']
assert freezer.getModuleStar("package1.submodule1") == None
assert freezer.getModuleStar("package1.nonexist") == None
assert freezer.getModuleStar("package2.submodule2") == None
assert freezer.getModuleStar("package2.nonexist") == None
assert freezer.getModuleStar("module1") == None
assert freezer.getModuleStar("module2") == None
finally:
sys.path = backup
@pytest.mark.parametrize("use_console", (False, True))
def test_Freezer_generateRuntimeFromStub(tmp_path, use_console):
try:
# If installed as a wheel
import panda3d_tools
bin_dir = os.path.dirname(panda3d_tools.__file__)
except:
import panda3d
bin_dir = os.path.join(os.path.dirname(os.path.dirname(panda3d.__file__)), 'bin')
if sys.platform == 'win32':
suffix = '.exe'
else:
suffix = ''
if not use_console:
stub_file = os.path.join(bin_dir, 'deploy-stubw' + suffix)
if use_console or not os.path.isfile(stub_file):
stub_file = os.path.join(bin_dir, 'deploy-stub' + suffix)
if not os.path.isfile(stub_file):
pytest.skip("Unable to find deploy-stub executable")
target = str(tmp_path / ('stubtest' + suffix))
freezer = Freezer()
freezer.addModule('site', filename='site.py', text='import sys\nsys.frozen=True')
freezer.addModule('module2', filename='module2.py', text='print("Module imported")')
freezer.addModule('__main__', filename='main.py', text='import module2\nprint("Hello world")')
assert '__main__' in freezer.modules
freezer.done(addStartupModules=True)
assert '__main__' in dict(freezer.getModuleDefs())
freezer.generateRuntimeFromStub(target, open(stub_file, 'rb'), use_console)
if sys.platform == 'darwin' and platform.machine().lower() == 'arm64':
# Not supported; see #1348
return
env = None
if sys.platform == "win32":
env = dict(os.environ)
if not os.environ.get('PATH'):
env['PATH'] = bin_dir
else:
env['PATH'] = bin_dir + os.pathsep + os.environ['PATH']
output = subprocess.check_output(target, env=env)
assert output.replace(b'\r\n', b'\n') == b'Module imported\nHello world\n'