X-Git-Url: http://plrg.eecs.uci.edu/git/?p=smartthings-infrastructure.git;a=blobdiff_plain;f=ModelCheck.py;h=1a0c940bb66ff273d3fc6300b4914d8879f940c5;hp=c192cfa48ecafe72be736fc997adcd6bb9a33ef1;hb=c97f75cb3ddb7ae3196f38967adaa3439b2315c2;hpb=e900204811d2ccb333815adff6c6ceb19c4af1cc diff --git a/ModelCheck.py b/ModelCheck.py index c192cfa..1a0c940 100644 --- a/ModelCheck.py +++ b/ModelCheck.py @@ -4,6 +4,44 @@ import itertools 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 @@ -17,6 +55,7 @@ jpfLogDir = sys.argv[2] 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 = [] @@ -57,7 +96,8 @@ else: 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 @@ -73,12 +113,34 @@ for item in appPairs: # 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" + error = extractError() logName = item[0] + "--" + item[1] + ".log" - writeLogList.write(logName + "\n") - os.system("cd " + jpfDir + ";./run.sh " + jpfLogDir + logName + " main.jpf") - + 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() + + + + + + + + + + + + + + +