Browse Source

test suite: prune `sys.path`, set `PYTHONPATH` to overlay root

- when running scripts under the exec wrapper, ensure that directories in
  `sys.path` contain no potentially importable names not present in the
  production environment
The MMGen Project 1 year ago
parent
commit
f720b8e48e
4 changed files with 17 additions and 9 deletions
  1. 1 1
      mmgen/data/version
  2. 8 4
      scripts/exec_wrapper.py
  3. 2 2
      test/include/test_init.py
  4. 6 2
      test/test.py

+ 1 - 1
mmgen/data/version

@@ -1 +1 @@
-14.0.dev3
+14.0.dev4

+ 8 - 4
scripts/exec_wrapper.py

@@ -13,8 +13,12 @@ def exec_wrapper_get_colors():
 
 
 def exec_wrapper_init():
 def exec_wrapper_init():
 
 
-	if exec_wrapper_os.path.dirname(exec_wrapper_sys.argv[1]) == 'test': # scripts in ./test do overlay setup themselves
-		exec_wrapper_sys.path[0] = 'test'
+	if exec_wrapper_os.path.dirname(exec_wrapper_sys.argv[1]) == 'test':
+		'support running of test scripts under wrapper'
+		cwd = exec_wrapper_os.getcwd() # assume we’re in repo root
+		exec_wrapper_sys.path[1] = cwd
+		from test.overlay import get_overlay_tree_dir
+		exec_wrapper_sys.path[0] = get_overlay_tree_dir(cwd)
 	else:
 	else:
 		exec_wrapper_sys.path.pop(0)
 		exec_wrapper_sys.path.pop(0)
 
 
@@ -111,12 +115,12 @@ import sys as exec_wrapper_sys
 import os as exec_wrapper_os
 import os as exec_wrapper_os
 import time as exec_wrapper_time
 import time as exec_wrapper_time
 
 
-exec_wrapper_init() # sets sys.path[0], runs overlay_setup()
+exec_wrapper_init() # sets sys.path[0] to overlay root
 
 
 if exec_wrapper_os.getenv('MMGEN_TRACEMALLOC'):
 if exec_wrapper_os.getenv('MMGEN_TRACEMALLOC'):
 	exec_wrapper_tracemalloc_setup()
 	exec_wrapper_tracemalloc_setup()
 
 
-# import mmgen mods only after overlay setup!
+# import mmgen mods only after sys.path[0] is set to overlay root!
 from mmgen.devinit import init_dev as exec_wrapper_init_dev
 from mmgen.devinit import init_dev as exec_wrapper_init_dev
 exec_wrapper_init_dev()
 exec_wrapper_init_dev()
 
 

+ 2 - 2
test/include/test_init.py

@@ -19,8 +19,8 @@ os.chdir(repo_root)
 sys.path[0] = repo_root
 sys.path[0] = repo_root
 
 
 from test.overlay import overlay_setup
 from test.overlay import overlay_setup
-overlay_setup(repo_root)
-os.environ['PYTHONPATH'] = repo_root
+overlay_root = overlay_setup(repo_root)
+os.environ['PYTHONPATH'] = overlay_root
 
 
 if 'TMUX' in os.environ:
 if 'TMUX' in os.environ:
 	del os.environ['TMUX']
 	del os.environ['TMUX']

+ 6 - 2
test/test.py

@@ -85,8 +85,12 @@ if sys.argv[-1] == 'clean':
 	print(f'Removed {os.path.relpath(overlay_tree_dir)!r}')
 	print(f'Removed {os.path.relpath(overlay_tree_dir)!r}')
 else:
 else:
 	# overlay must be set up before importing mmgen mods!
 	# overlay must be set up before importing mmgen mods!
-	import include.test_init
-	repo_root = include.test_init.repo_root
+	try:
+		import include.test_init
+		repo_root = include.test_init.repo_root
+	except ModuleNotFoundError: # allow running under exec_wrapper
+		import test.include.test_init
+		repo_root = test.include.test_init.repo_root
 
 
 from mmgen.common import *
 from mmgen.common import *