Files
fixminer_source/python/patch_validate_introClass2.py
2020-04-06 21:30:39 +02:00

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()