import sys
import os
+# Helper methods
+# Check the result in the log and print a summary
+def checkResult(logDirName):
+ extractResult = open(logDirName, "r")
+ result = "other errors--PLEASE CHECK!"
+
+ for line in extractResult:
+ if "no errors detected" in line:
+ result = "no conflict"
+ break
+ elif "java.lang.RuntimeException: Conflict between apps App1 and App2:" in line:
+ result = "conflict"
+ break
+ elif "Direct-Direct Interaction detected:" in line:
+ result = "direct-direct"
+ break
+
+ return result
+
+# Extract the error from specific error logs
+def extractError():
+ err = ""
+ if os.path.exists("appCreationError.log"):
+ extractError = open("appCreationError.log", "r")
+ for line in extractError:
+ err = err + line
+ extractError.close()
+ os.system("rm appCreationError.log")
+ return err
+
+# Write error log to the log directory
+# In this case we skip running JPF
+# e.g., in the case of having a direct-direct interaction pair
+def writeErrorLog(jpfLogDir, logName, error):
+ writeError = open(jpfLogDir + logName, "w+")
+ writeError.write(error)
+ writeError.close()
+
# Input parameters:
# - JPF directory
# - JPF logs directory
appDir = sys.argv[3]
firstList = sys.argv[4]
+
# PART 1: Generate the permutations of app pairs
print "PHASE 1: Extracting the app pairs from the app lists ...\n"
appList1 = []
# Extract the first list
extractAppList = open(firstList, "r")
for app in extractAppList:
- appList1.append(app.strip())
+ if '#' not in app:
+ appList1.append(app.strip())
extractAppList.close()
# Try to create pairs
appPairs = []
+useSecondList = False
# Extract the second list if provided (this is for combinations between two lists)
if (len(sys.argv) == 6):
secondList = sys.argv[5]
extractAppList = open(secondList, "r")
for app in extractAppList:
- appList2.append(app.strip())
+ if '#' not in app:
+ appList2.append(app.strip())
extractAppList.close()
+ useSecondList = True
# Just copy the first list to the second list
else:
appList2 = appList1
-# Generate the permutations of pairs
-for i in range(len(appList1)):
- for j in range(i + 1, len(appList2)):
- appPairs.append((appList1[i], appList2[j]))
+if useSecondList is False:
+ # Generate the permutations of pairs
+ for i in range(len(appList1)):
+ for j in range(i + 1, len(appList2)):
+ appPairs.append((appList1[i], appList2[j]))
+else:
+ # Generate pairs from 2 lists
+ for i in range(len(appList1)):
+ for j in range(len(appList2)):
+ # Skip if both are the same
+ if appList1[i] == appList2[j]:
+ continue
+ appPairs.append((appList1[i], appList2[j]))
+
# PART 2:
print "PHASE 2: Running JPF ...\n"
+# List down all the log file names
+writeLogList = open(jpfLogDir + "logList", "w+")
for item in appPairs:
- # Copy apps into Extractor/App1 and Extractor/App2
+
+ # Copy apps into Extractor/App1 and Extractor/App2
+ print "==> First app: %s" % item[0]
+ print "==> Second app: %s" % item[1]
os.system("cp " + appDir + item[0] + " Extractor/App1/App1.groovy")
os.system("cp " + appDir + item[1] + " Extractor/App2/App2.groovy")
# Run Runner.py to extract things and create main.groovy, then compile it
print "==> Compiling the apps ...\n"
os.system("make Runner")
- os.system("make main")
-
- # Call JPF
- print "==> Calling JPF and generate logs ...\n"
- os.system("cd " + jpfDir + ";./run.sh " + jpfLogDir + item[0] + "--" + item[1] + ".log" + " main.jpf")
+ error = extractError()
+ logName = item[0] + "--" + item[1] + ".log"
+ if error == "":
+ # Compile
+ os.system("make main")
+ # Call JPF
+ print "==> Calling JPF and generate logs ...\n"
+ os.system("cd " + jpfDir + ";./run.sh " + jpfLogDir + logName + " main.jpf")
+ else:
+ # This is for specific error, e.g., direct-direct interaction that we need to skip
+ writeErrorLog(jpfLogDir, logName, error)
+
+ result = checkResult(jpfLogDir + logName)
+ writeLogList.write(logName + "\t\t" + result + "\n")
+
+writeLogList.close()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+