merge python scripts
This commit is contained in:
Executable
+145
@@ -0,0 +1,145 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user