-
Notifications
You must be signed in to change notification settings - Fork 30
/
Defects4J.py
111 lines (98 loc) · 4.19 KB
/
Defects4J.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import os
from os.path import join
from typing import Dict
from typing import List
from typing import Optional
from app.core.task.typing.DirectoryInfo import DirectoryInfo
from app.drivers.benchmarks.AbstractBenchmark import AbstractBenchmark
class Defects4J(AbstractBenchmark):
log_instrument_path = None
def __init__(self) -> None:
self.name = os.path.basename(__file__)[:-3].lower()
super(Defects4J, self).__init__()
def setup_container(
self, bug_index: int, image_name: str, cpu: List[str], gpu: List[str]
) -> Optional[str]:
"""
Setup the container for the experiment by constructing volumes,
which point to certain folders in the project
"""
container_id = super(Defects4J, self).setup_container(
bug_index, image_name, cpu, gpu
)
parent_dirs = join(*self.dir_setup.split("/")[:-2])
mkdir_cmd = "mkdir -p {}".format(parent_dirs)
self.run_command(container_id, mkdir_cmd, "/dev/null", "/")
return container_id
def deploy(self, bug_index: int, container_id: Optional[str]) -> bool:
self.emit_normal("downloading experiment subject")
experiment_item = self.experiment_subjects[bug_index - 1]
bug_id = str(experiment_item[self.key_bug_id]).split("-")[-1]
custom_env = {"JAVA_TOOL_OPTIONS": "-Dfile.encoding=UTF8"}
command_str = "defects4j checkout -p {} -v {}b -w {}".format(
experiment_item[self.key_subject],
bug_id,
join(self.dir_expr, "src"),
)
status = self.run_command(
container_id, command_str, self.log_deploy_path, env=custom_env
)
self.run_command(
container_id,
"defects4j export -p cp.test -o classpath_data",
self.log_deploy_path,
join(self.dir_expr, "src"),
custom_env,
)
for dependency in self.read_file(
container_id, join(self.dir_expr, "src", "classpath_data")
)[0].split(":"):
if dependency.startswith("/defects4j"):
source = dependency
destination = "{}/deps/{}".format(
self.dir_expr, dependency.split("/defects4j/framework/projects/")[1]
)
self.run_command(
container_id,
"mkdir -p {}".format(os.path.dirname(destination)),
log_file_path=self.log_deploy_path,
)
self.run_command(
container_id,
"cp {} {}".format(source, destination),
log_file_path=self.log_deploy_path,
)
return status == 0
def config(self, bug_index: int, container_id: Optional[str]) -> bool:
self.emit_normal("configuring experiment subject")
return True
def build(self, bug_index: int, container_id: Optional[str]) -> bool:
self.emit_normal("building experiment subject")
custom_env = {"JAVA_TOOL_OPTIONS": "-Dfile.encoding=UTF8"}
command_str = "defects4j compile"
status = self.run_command(
container_id,
command_str,
self.log_build_path,
join(self.dir_expr, "src"),
custom_env,
)
return status == 0
def test(self, bug_index: int, container_id: Optional[str]) -> bool:
self.emit_normal("testing experiment subject")
command_str = "defects4j test"
status = self.run_command(
container_id, command_str, self.log_deploy_path, join(self.dir_expr, "src")
)
return status == 0
def clean(self, exp_dir_path: str, container_id: Optional[str]) -> None:
self.emit_normal("removing experiment subject")
command_str = "rm -rf " + exp_dir_path
self.run_command(container_id, command_str)
return
def save_artifacts(
self, dir_info: DirectoryInfo, container_id: Optional[str]
) -> None:
self.list_artifact_dirs = [] # path should be relative to experiment directory
self.list_artifact_files = [] # path should be relative to experiment directory
super(Defects4J, self).save_artifacts(dir_info, container_id)