146 lines
5.9 KiB
Python
Executable File
146 lines
5.9 KiB
Python
Executable File
import bugzoo
|
|
from bugzoo import server, Container
|
|
from common.commons import *
|
|
|
|
from common.commons import shellGitCheckout
|
|
DATA_PATH = os.environ["DATA_PATH"]
|
|
introClassFile = join(DATA_PATH,'introClassData.txt')
|
|
|
|
def patch_validate():
|
|
with bugzoo.server.ephemeral(port=8081,verbose=True,timeout_connection=3000) as client:
|
|
# url = "http://127.0.0.1:6060"
|
|
# client = bugzoo.Client(url)
|
|
# bug = client.bugs['introclass:checksum:08c7ea:006']
|
|
bugList = []
|
|
with open(introClassFile,'r') as file:
|
|
for line in file.readlines():
|
|
bugList.append(line.strip())
|
|
|
|
for i in range(0,len(bugList)):
|
|
try:
|
|
bugName = bugList[i]
|
|
# if bugName != 'introclass:digits:070455:000':
|
|
# continue
|
|
print("bugName: {}".format(bugName),end=' ')
|
|
bug = client.bugs[bugName]
|
|
if client.bugs.is_installed(bug):
|
|
# print("the image is installed! :-)")
|
|
pass
|
|
else:
|
|
client.bugs.build(bug)
|
|
# client.bugs.download(bug)
|
|
# print("the image is not installed :'(")
|
|
|
|
# print("creating container...")
|
|
container = client.containers.provision(bug)
|
|
# print("container is ready")
|
|
|
|
print("First_test:",end=' ')
|
|
pre_test_outcomes = {}
|
|
pre_failure_cases, pre_failure, total, pre_test_outcomes = test_all(bug, container, client)
|
|
print("@fail:{}@total:{}".format(pre_failure, total),end=' ')
|
|
print("@pre_failure_cases:{}".format(pre_failure_cases),end=' ')
|
|
|
|
# print("patching...")
|
|
path = os.path.abspath('data') + '/introclass_patched/' + bugName
|
|
patch_path = path + '/patches'
|
|
avaliable_patch = os.path.abspath('data') + '/introclass2/' + bugName + '/' + 'patches'
|
|
patch_names = os.listdir(patch_path)
|
|
for patch_name in patch_names:
|
|
# if patch_name not in os.listdir(avaliable_patch):
|
|
# continue
|
|
patch = patch_path + '/' + patch_name
|
|
patch_result = patched_application(path, bug.name, patch, client, container)
|
|
if patch_result == -1 or patch_result.code != 0:
|
|
print("@{}@".format('False'), end='')
|
|
print("{}".format('F'), end=' ')
|
|
continue
|
|
print("@{}@".format('True'), end='')
|
|
|
|
print("Second_test:",end=' ')
|
|
post_test_outcomes = {}
|
|
post_failure_cases, post_failure, total, post_test_outcomes = test_all(bug, container, client)
|
|
print("{}".format(post_failure), end=' ')
|
|
if post_failure == 0:
|
|
print("fix {} by {}".format(bugName, patch_name))
|
|
# print("@fail:{}@total:{}".format(post_failure, total),end=' ')
|
|
# print("@post_failure_cases:{}".format(post_failure_cases))
|
|
|
|
cmd = 'docker rm -fv {}'.format(container.id)
|
|
output, e = shellGitCheckout(cmd)
|
|
print(" ")
|
|
except:
|
|
print(" ")
|
|
continue
|
|
pass
|
|
|
|
from bugzoo import Patch, Client
|
|
|
|
def test_all(bug, container, client):
|
|
test_outcomes = {} # type: Dict[TestCase, TestOutcome]
|
|
failure_cases = []
|
|
failure = 0
|
|
total = len(bug.tests._tests)
|
|
for test in bug.tests:
|
|
test_outcomes[test] = client.containers.test(container, test)
|
|
# if test.expected_outcome != test_outcomes[test].passed:
|
|
if test_outcomes[test].passed != True:
|
|
failure += 1
|
|
failure_cases.append(test.command)
|
|
break
|
|
return failure_cases, failure, total, test_outcomes
|
|
|
|
def patch_application(path, bugName, patch, client: Client, container: Container):
|
|
buggroup = bugName.split(":")[1]
|
|
# path = join(BUGDIR,bug)
|
|
program = path + '/' + buggroup + '.c'
|
|
fixedFile = path + '/oracle.c'
|
|
patchPath = patch
|
|
with open(patch, 'r+', encoding='utf-8') as file:
|
|
result = ''
|
|
for line in file:
|
|
if line.startswith('---'):
|
|
# result += '--- ' + program + '\n'
|
|
result += '--- ' + buggroup + '.c' + '\n'
|
|
elif line.startswith('+++'):
|
|
# result += '+++ ' + fixedFile + '\n'
|
|
result += '+++ ' + 'oracle.c' + '\n'
|
|
else:
|
|
result += line
|
|
with open(patch, 'w', encoding='utf-8') as file:
|
|
file.writelines(result)
|
|
|
|
cmd = 'rm ' + fixedFile
|
|
output, e = shellGitCheckout(cmd)
|
|
|
|
cmd = 'patch --ignore-whitespace -p0 < ' + '\"' + patchPath + '\"'
|
|
# cmd = 'patch -p0 < ' + '\"' + patchPath + '\"'
|
|
output, e = shellGitCheckout(cmd)
|
|
|
|
if os.path.exists(fixedFile):
|
|
cmd = 'docker cp ' + fixedFile + ' ' + container.id + ':/experiment/'
|
|
output, e = shellGitCheckout(cmd)
|
|
|
|
cmd = 'rm .genprog_test_cache.json & gcc -o {} {}.c'.format(buggroup, 'oracle')
|
|
output = client.containers.exec(container=container, command=cmd, context='/experiment/')
|
|
return output
|
|
else:
|
|
return -1
|
|
|
|
def patched_application(path, bugName, patched, client: Client, container: Container):
|
|
buggroup = bugName.split(":")[1]
|
|
# path = join(BUGDIR,bug)
|
|
program = path + '/' + buggroup + '.c'
|
|
fixedFile = patched.split('/')[-1]
|
|
|
|
cmd = 'docker cp ' + patched + ' ' + container.id + ':/experiment/'
|
|
output, e = shellGitCheckout(cmd)
|
|
|
|
cmd = 'rm .genprog_test_cache.json & mv {} {}.c & gcc -o {} {}'.format(fixedFile,fixedFile, buggroup, fixedFile+'.c')
|
|
output = client.containers.exec(container=container, command=cmd, context='/experiment/')
|
|
return output
|
|
|
|
|
|
if __name__ == "__main__":
|
|
patch_validate()
|