Skip to content

Commit fcc4389

Browse files
authored
Merge pull request #77 from shwinshaker/add-unique-cache
Specify a unique cache directory before each code execution
2 parents 4381f0a + 23d4390 commit fcc4389

File tree

1 file changed

+62
-47
lines changed

1 file changed

+62
-47
lines changed

bigcodebench/gen/util/__init__.py

+62-47
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import sys
44
import types
55
import unittest
6+
import tempfile
67
import multiprocessing
78
from multiprocessing import Array, Value, Manager
89
from bigcodebench.eval.utils import (
@@ -17,55 +18,69 @@
1718

1819
def trusted_exec(code, test_code, task_id, max_as_limit, max_data_limit, max_stack_limit, times):
1920
"""Execute trusted code in place."""
21+
# Specify a unique cache dir by modifying XDG_CONFIG_HOME
22+
old_xdg = os.environ.get("XDG_CONFIG_HOME")
23+
temp_xdg = tempfile.mkdtemp(prefix="xdg_config_")
24+
os.environ["XDG_CONFIG_HOME"] = temp_xdg
2025

21-
with create_tempdir():
22-
import os
23-
import shutil
24-
import builtins
25-
26-
rmtree = shutil.rmtree
27-
rmdir = os.rmdir
28-
chdir = os.chdir
29-
module_name = "__test__"
30-
new_module = types.ModuleType(module_name)
31-
reliability_guard(max_as_limit, max_data_limit, max_stack_limit)
32-
# Set necessary attributes for the module
33-
new_module.__dict__.update({
34-
'__builtins__': builtins,
35-
'__file__': f"{module_name}.py",
36-
'__package__': None,
37-
'__doc__': None,
38-
'sys': sys,
39-
'os': os,
40-
'environ': os.environ,
41-
})
42-
43-
# Combine the user code and the test code
44-
full_code = code + "\n" + test_code
45-
46-
# Compile and execute the combined code within the new module
47-
exec(compile(full_code, f"{module_name}.py", 'exec'),
48-
new_module.__dict__)
49-
sys.modules[module_name] = new_module
50-
TestCases = getattr(new_module, 'TestCases')
51-
loader = unittest.TestLoader()
52-
suite = loader.loadTestsFromTestCase(TestCases)
53-
test_result = unittest.TestResult()
54-
start = time.time()
55-
with safe_environment(), swallow_io(), time_limit(seconds=TIMEOUT_LIMIT):
56-
suite.run(test_result)
57-
58-
errors = test_result.failures + test_result.errors
59-
if len(errors) > 0:
60-
print(errors)
61-
times.value = -1
26+
try:
27+
with create_tempdir():
28+
import shutil
29+
import builtins
30+
31+
rmtree = shutil.rmtree
32+
rmdir = os.rmdir
33+
chdir = os.chdir
34+
module_name = "__test__"
35+
new_module = types.ModuleType(module_name)
36+
37+
reliability_guard(max_as_limit, max_data_limit, max_stack_limit)
38+
39+
# Set necessary attributes for the module
40+
new_module.__dict__.update({
41+
'__builtins__': builtins,
42+
'__file__': f"{module_name}.py",
43+
'__package__': None,
44+
'__doc__': None,
45+
'sys': sys,
46+
'os': os,
47+
'environ': os.environ,
48+
})
49+
50+
# Combine the user code and the test code
51+
full_code = code + "\n" + test_code
52+
53+
# Compile and execute the combined code within the new module
54+
exec(compile(full_code, f"{module_name}.py", 'exec'),
55+
new_module.__dict__)
56+
sys.modules[module_name] = new_module
57+
TestCases = getattr(new_module, 'TestCases')
58+
loader = unittest.TestLoader()
59+
suite = loader.loadTestsFromTestCase(TestCases)
60+
test_result = unittest.TestResult()
61+
start = time.time()
62+
with safe_environment(), swallow_io(), time_limit(seconds=TIMEOUT_LIMIT):
63+
suite.run(test_result)
64+
65+
errors = test_result.failures + test_result.errors
66+
if len(errors) > 0:
67+
print(errors)
68+
times.value = -1
69+
else:
70+
times.value = time.time() - start
71+
72+
# Needed for cleaning up.
73+
shutil.rmtree = rmtree
74+
os.rmdir = rmdir
75+
os.chdir = chdir
76+
77+
finally:
78+
# Restore the original environment variable
79+
if old_xdg is None:
80+
os.environ.pop("XDG_CONFIG_HOME", None)
6281
else:
63-
times.value = time.time() - start
64-
65-
# Needed for cleaning up.
66-
shutil.rmtree = rmtree
67-
os.rmdir = rmdir
68-
os.chdir = chdir
82+
os.environ["XDG_CONFIG_HOME"] = old_xdg
83+
shutil.rmtree(temp_xdg, ignore_errors=True)
6984

7085

7186
def trusted_check_exec(code, inputs):

0 commit comments

Comments
 (0)