From 96a5637cbb899ffb4764671329df44e04570c6c4 Mon Sep 17 00:00:00 2001
From: Daniel Brown <ddb@star.sr.bham.ac.uk>
Date: Sat, 3 Aug 2013 23:10:41 +0100
Subject: [PATCH] Full run now working. Search for test scripts added and full
 output of test exceptions

---
 pykat/testing/test.py                         | 138 +++++++-------
 pykat/testing/utils.py                        |  25 ++-
 pykat/testing/web/database_indices.py         |  20 ++-
 pykat/testing/web/templates/finesse_test.html |  21 ++-
 .../web/templates/finesse_test_view.html      |  25 ++-
 pykat/testing/web/web_interface.py            | 168 +++++++++++++-----
 6 files changed, 266 insertions(+), 131 deletions(-)

diff --git a/pykat/testing/test.py b/pykat/testing/test.py
index a56f249..25483a7 100644
--- a/pykat/testing/test.py
+++ b/pykat/testing/test.py
@@ -16,29 +16,11 @@ from datetime import datetime
 from pykat.testing import utils
 import sys, traceback
 
-class RunException(Exception):
-	def __init__(self, returncode, args, err, out):
-		self.returncode = returncode
-		self.args = args
-		self.err = err
-		self.out = out
-
 class DiffException(Exception):
 	def __init__(self, msg, outfile):
 		self.msg = msg
 		self.outfile = outfile
 
-def runcmd(args):
-    p = sub.Popen(args, stdout=sub.PIPE, stderr=sub.PIPE)
-    out, err = p.communicate()
-    
-    if p.returncode != 0:
-        print "STDERR: " + err
-        print "STDOUT: " + out
-        raise RunException(p.returncode, args, err, out)
-
-    return [out,err]
-
 class FinesseTestProcess(Thread):
     
     queue_time = None
@@ -58,6 +40,11 @@ class FinesseTestProcess(Thread):
     diffing = False
     kats_to_run = []
     
+    # Define storage structures for generating report later
+    kat_run_exceptions = {}
+    output_differences = {}
+    run_times = {}
+        
     def __init__(self, TEST_DIR, BASE_DIR, test_commit, 
                  run_fast=False, kats=[], test_id="0",
                  git_bin="",emails="", nobuild=True,*args, **kqwargs):
@@ -75,12 +62,14 @@ class FinesseTestProcess(Thread):
         self.emails = ""
         
         if type(nobuild) is str:
+        
             if nobuild.lower() == "true":
                 self.nobuild = True
             elif nobuild.lower() == "false":
                 self.nobuild = False
             else:
                 raise Exception("nobuild is not a boolean value")
+                
         elif type(nobuild) is bool:
             self.nobuild = nobuild
         else:
@@ -149,36 +138,29 @@ class FinesseTestProcess(Thread):
             print "Checking out finesse base..."
             utils.git(["clone","git://gitmaster.atlas.aei.uni-hannover.de/finesse/base.git",BUILD_PATH])
 
-            os.chdir(BUILD_PATH)
             print "Checking out and building develop version of finesse " + self.git_commit
             
             SRC_PATH = os.path.join(BUILD_PATH,"src")
             
             if sys.platform == "win32":
-                runcmd(["bash","./finesse.sh","--checkout"])
+                utils.runcmd(["bash","./finesse.sh","--checkout"],cwd=BUILD_PATH)
                 self.cancelCheck()
                 
-                os.chdir(SRC_PATH)
-                utils.git(["checkout",self.git_commit])
+                utils.git(["checkout",self.git_commit],cwd=SRC_PATH)
                 self.cancelCheck()
                 
-                os.chdir(BUILD_PATH)
-                runcmd(["bash","./finesse.sh","--build"])
+                utils.runcmd(["bash","./finesse.sh","--build"],cwd=BUILD_PATH)
                 self.cancelCheck()
             else:
-                runcmd(["./finesse.sh","--checkout","develop"])
+                utils.runcmd(["./finesse.sh","--checkout","develop"],cwd=BUILD_PATH)
                 self.cancelCheck()
                 
-                os.chdir(SRC_PATH)
-                utils.git(["checkout",self.git_commit])
+                utils.git(["checkout",self.git_commit],cwd=SRC_PATH)
                 self.cancelCheck()
                 
-                os.chdir(BUILD_PATH)
-                runcmd(["./finesse.sh","--build"])
+                utils.runcmd(["./finesse.sh","--build"],cwd=BUILD_PATH)
                 self.cancelCheck()
-                
-            os.chdir(self.BASE_DIR)
-            
+                            
         FINESSE_EXE = os.path.join(self.BASE_DIR,"build","kat" + EXE)
         
         # check if kat runs
@@ -197,33 +179,27 @@ class FinesseTestProcess(Thread):
             
         os.mkdir(OUTPUTS_DIR)
         
-        os.environ["KATINI"] = os.path.join(self.TEST_DIR,"kat.ini")
+        os.environ["KATINI"] = os.path.join(self.TEST_DIR,"kat_test","kat.ini")
         
         self.cancelCheck()
         # Clean up and pull latest test repository
         print "Cleaning test repository..."
-        os.chdir(self.TEST_DIR)
-        utils.git(["clean","-xdf"])
+        utils.git(["clean","-xdf"], cwd=self.TEST_DIR)
         self.cancelCheck()
-        utils.git(["reset","--hard"])
+        utils.git(["reset","--hard"], cwd=self.TEST_DIR)
         self.cancelCheck()
         print "Pulling latest test..."
-        utils.git(["pull"])
+        utils.git(["pull"],cwd=self.TEST_DIR)
         self.cancelCheck()
     
-        # Define storage structures for generating report later
-        kat_run_exceptions = {}
-        output_differences = {}
-        run_times = {}
-
         self.total_kats = 0
         
         # create dictionary structures
         # and count up total number of files to process
         for suite in self.kats_to_run.keys():
-            kat_run_exceptions[suite] = {}
-            output_differences[suite] = {}
-            run_times[suite] = {}
+            self.kat_run_exceptions[suite] = {}
+            self.output_differences[suite] = {}
+            self.run_times[suite] = {}
             
             self.total_kats += len(self.kats_to_run[suite])
         
@@ -235,7 +211,7 @@ class FinesseTestProcess(Thread):
             self.cancelCheck()
             print "Running suite: " + suite + "..."
             kats = self.kats_to_run[suite]
-            os.chdir(os.path.join(self.TEST_DIR,"kat_test",suite))
+            SUITE_PATH = os.path.join(self.TEST_DIR,"kat_test",suite)
 
             SUITE_OUTPUT_DIR = os.path.join(OUTPUTS_DIR,suite)
             os.mkdir(SUITE_OUTPUT_DIR)
@@ -254,21 +230,29 @@ class FinesseTestProcess(Thread):
                 else:
                     try:
                         start = time.time()
-                        out,err = runcmd([FINESSE_EXE, "--noheader", kat])
-                        finish = time.time()-start
-                        run_times[suite][kat] = finish
-                        shutil.move(basename + ".out", SUITE_OUTPUT_DIR)
-                    except RunException as e:
+                        out,err = utils.runcmd([FINESSE_EXE, "--noheader", kat],cwd=SUITE_PATH)
+                        
+                        OUT_FILE = os.path.join(SUITE_PATH,basename + ".out")
+                        shutil.move(OUT_FILE, SUITE_OUTPUT_DIR)
+                    
+                    except utils.RunException as e:
+                    
+                        print "STDERR: " + e.out
+                        print "STDOUT: " + e.err
+                        
                         print "Error running " + kat + ": " + e.err
-                        kat_run_exceptions[suite][kat] = e
+                        self.kat_run_exceptions[suite][kat] = e
+                        # if this happens a difference definitely is found
+                        self.diffFound = True
                     finally:
+                        self.run_times[suite][kat] = time.time()-start
                         self.done_kats += 1
 
         self.cancelCheck()
         
         for suite in self.kats_to_run.keys():
-            if len(kat_run_exceptions[suite].keys()) > 0:
-                print "Could not run the following kats:\n" + "\n".join(kat_run_exceptions.keys()) + " in " + suite
+            if len(self.kat_run_exceptions[suite].keys()) > 0:
+                print "Could not run the following kats:\n" + "\n".join(self.kat_run_exceptions[suite].keys()) + " in " + suite
             else:
                 print "No errors whilst running" + suite
 
@@ -280,9 +264,9 @@ class FinesseTestProcess(Thread):
             print "Diffing suite: " + suite + "..."
 
             outs = []
-            os.chdir(os.path.join(OUTPUTS_DIR,suite))
+            SUITE_PATH = os.path.join(OUTPUTS_DIR,suite)
 
-            for files in os.listdir("."):
+            for files in os.listdir(SUITE_PATH):
                 if files.endswith(".out"):
                     outs.append(files)
 
@@ -296,12 +280,13 @@ class FinesseTestProcess(Thread):
                 self.running_kat = out
                 
                 ref_file = os.path.join(REF_DIR,out)
+                out_file = os.path.join(SUITE_PATH,out)
                 
                 if not os.path.exists(ref_file):
                     raise DiffException("Reference file doesn't exist for " + out, out)
                     
                 ref_arr = np.loadtxt(ref_file)
-                out_arr = np.loadtxt(out)
+                out_arr = np.loadtxt(out_file)
 
                 if ref_arr.shape != out_arr.shape:
                     raise DiffException("Reference and output are different shapes", out)
@@ -317,20 +302,28 @@ class FinesseTestProcess(Thread):
                 
                 if diff:
                     self.diffFound = True
+                    
                     # store the rows which are different
                     ix = np.where(rel_diff >= self.diff_rel_eps)[0][0]
-                    output_differences[suite][out] = (ref_arr[ix], out_arr[ix], np.max(rel_diff))
                 
+                    self.output_differences[suite][out] = (ref_arr[ix],
+                                                           out_arr[ix],
+                                                           np.max(rel_diff))
+                else:
+                    max = np.max(rel_diff) 
+                    
+                    self.output_differences[suite][out] = ([],
+                                                           [],
+                                                           max)
                 self.done_kats += 1
                 
-        os.chdir(self.BASE_DIR)
+        REPORT_PATH = os.path.join(self.BASE_DIR,"reports")
         
-        if not os.path.exists("reports"):
-            os.mkdir("reports")
+        if not os.path.exists(REPORT_PATH):
+            os.mkdir(REPORT_PATH)
 
-        os.chdir("reports")
         today = datetime.utcnow()
-        reportname = today.strftime('%d%m%y')
+        reportname = os.path.join(REPORT_PATH,"report.log") #today.strftime('%d%m%y')
         print "Writing report to " + reportname
         
         f = open(reportname,'w')
@@ -348,19 +341,19 @@ class FinesseTestProcess(Thread):
         isError = False
 
         for suite in self.kats_to_run.keys():
-            f.write("\n\n" + str(len(output_differences[suite].keys())) + " differences in suite " + suite)
-            for k in output_differences[suite].keys():
+            f.write("\n\n" + str(len(self.output_differences[suite].keys())) + " differences in suite " + suite)
+            for k in self.output_differences[suite].keys():
                 isError = True
                 f.write(k + ":\n")
-                f.write("     ref: " + str(output_differences[suite][k][0]) + "\n")
-                f.write("     out: " + str(output_differences[suite][k][1]) + "\n")
-                f.write("     Max relative difference: " + str(output_differences[suite][k][2]) + "\n")
+                f.write("     ref: " + str(self.output_differences[suite][k][0]) + "\n")
+                f.write("     out: " + str(self.output_differences[suite][k][1]) + "\n")
+                f.write("     Max relative difference: " + str(self.output_differences[suite][k][2]) + "\n")
 
-            f.write("\n\n" + str(len(output_differences[suite].keys())) + " errors in suite " + suite)
-            for k in kat_run_exceptions[suite].keys():
+            f.write("\n\n" + str(len(self.output_differences[suite].keys())) + " errors in suite " + suite)
+            for k in self.kat_run_exceptions[suite].keys():
                 isError = True
                 f.write(k + ":\n")
-                f.write("err: " + kat_run_exceptions[suite][k].err + "\n")
+                f.write("err: " + self.kat_run_exceptions[suite][k].err + "\n")
 
         f.close()
         
@@ -379,7 +372,6 @@ class FinesseTestProcess(Thread):
         #else:
         #    print "No emails specified"
 
-        return output_differences
             
             
     def run(self):
@@ -396,7 +388,7 @@ class FinesseTestProcess(Thread):
             traceback.print_exception(exc_type, exc_value, exc_traceback,
                                       limit=5, file=sys.stdout)
         finally:
-            finished_test = True
+            self.finished_test = True
         
         
 
diff --git a/pykat/testing/utils.py b/pykat/testing/utils.py
index cf48ad8..0e68a7f 100644
--- a/pykat/testing/utils.py
+++ b/pykat/testing/utils.py
@@ -15,8 +15,8 @@ class RunException(Exception):
 		self.err = err
 		self.out = out
 
-def runcmd(args):
-    p = sub.Popen(args, stdout=sub.PIPE, stderr=sub.PIPE)
+def runcmd(args, cwd="."):
+    p = sub.Popen(args, stdout=sub.PIPE, stderr=sub.PIPE, cwd=cwd)
     out, err = p.communicate()
     
     if p.returncode != 0:
@@ -26,24 +26,23 @@ def runcmd(args):
 
     return [out,err]
     
-def git(args, git_bin=GIT_BIN):
+def git(args, git_bin=GIT_BIN, cwd="."):
     cmd = ""
+
+    if type(args) is not list:
+        if type(args) is not str:
+            print type(args)
+            raise Exception("arg for utils.git must be a list or string")
     
     if type(args) is str:
-	args = args.split(" ")
-    elif type(args) is not list:
-	raise Exception("arg for utils.git must be a list or string")
- 
+        args = args.split(" ")
+    
     args.insert(0, git_bin)
-
-    print "GIT CMD: " + " ".join(args), os.getcwd()
     
-    p = sub.Popen(args, stdout=sub.PIPE, stderr=sub.PIPE)
+    p = sub.Popen(args, stdout=sub.PIPE, stderr=sub.PIPE, cwd=cwd)
     out, err = p.communicate()
         
-    if p.returncode != 0:
-        print "STDERR: " + err
-        print "STDOUT: " + err
+    if p.poll() != 0:
         raise RunException(p.poll(), args, err, out)
 
     return [out, err]
diff --git a/pykat/testing/web/database_indices.py b/pykat/testing/web/database_indices.py
index 8cb506f..e0320e9 100644
--- a/pykat/testing/web/database_indices.py
+++ b/pykat/testing/web/database_indices.py
@@ -32,4 +32,22 @@ class SrcCommitIndex(HashIndex):
             return None
         
     def make_key(self, key):
-        return key
\ No newline at end of file
+        return key
+        
+        
+class KatTestIndex(HashIndex):
+
+    def __init__(self, *args, **kwargs):
+        kwargs['key_format'] = '32s'
+        super(KatTestIndex, self).__init__(*args, **kwargs)
+
+    def make_key_value(self, data):
+        if data['t'] == 'kattest':
+            key = str(data['suite']) + str(data['kat'])
+            return md5(key).digest(), None
+        else:
+            return None
+
+    def make_key(self, key):
+        return md5(key).digest()
+        
\ No newline at end of file
diff --git a/pykat/testing/web/templates/finesse_test.html b/pykat/testing/web/templates/finesse_test.html
index b766a42..b975e29 100644
--- a/pykat/testing/web/templates/finesse_test.html
+++ b/pykat/testing/web/templates/finesse_test.html
@@ -82,6 +82,7 @@
                     <div>
                         <div style="width: 100px;">Files available</div>
                         <select id="rightValues" size="12" multiple>
+                        <input type="text" id="txtKatSearch" />
                         </select>
                     </div>
                 </section>
@@ -108,10 +109,24 @@
                 window.setInterval(function(){                
                     updateQueuedTests();
                     updateProgress();
-                }, 1000);
+                }, 5000);
                                 
             });
             
+            $('#txtKatSearch').change(function(){
+                term = $('#txtKatSearch').val();
+                
+                term.trim();
+                
+                match = $("#rightValues span > option");
+                match.unwrap();
+                    
+                if(term.length > 0){
+                    match = $("#rightValues :not(:contains('" + term + "'))");
+                    match.wrap("<span></span>");
+                }
+            });
+            
             $("#btnLeft").click(function () {
                 var selectedItem = $("#rightValues option:selected");
                 $("#leftValues").append(selectedItem);
@@ -305,6 +320,8 @@
                 opts = $('#leftValues option');
                 kats = {};
                 
+                $('#btnStartTest').attr('disabled',true)
+                
                 for(var i=0; i<opts.length; i++){
                     suite = opts[i].text.split(" - ")[0]
                     
@@ -326,9 +343,11 @@
                   success: function (data) {
                     updateQueuedTests();
                     updateProgress();
+                    $('#btnStartTest').attr('disabled',false)
                   },
                   error: function(jqXHR, textStatus, err){
                     console.log('error: ' + err);
+                    $('#btnStartTest').attr('disabled',false)
                   },
                   dataType: "json"
                 });
diff --git a/pykat/testing/web/templates/finesse_test_view.html b/pykat/testing/web/templates/finesse_test_view.html
index fad5571..f15f08b 100644
--- a/pykat/testing/web/templates/finesse_test_view.html
+++ b/pykat/testing/web/templates/finesse_test_view.html
@@ -9,12 +9,31 @@
         <div>
             <h1>FINESSE Test {{ view_test_id }} View</h1>
             
-            <a href="/finesse/view/{{view_test_id}}/build.log">build.log</a> | <a href="/finesse/view/{{view_test_id}}/make.log">make.log</a>
+            <a href="/finesse/view/{{view_test_id}}/build.log">build.log</a> | <a href="/finesse/view/{{view_test_id}}/make.log">make.log</a>| <a href="/finesse/view/{{view_test_id}}/report.log">report.log</a>
             
             <h3>Test Exceptions:</h3>
-            <pre>{{ excp_message}}</pre>
-            <pre>{{ excp_traceback}}</pre>
+            <pre>{{ excp_message }}</pre>
+            <pre>{{ excp_traceback }}</pre>
             
+            <h3>Kat result summary</h3>
+            
+            <h4>Results</h4>
+            {% for suite in kats.keys() %}
+            <ul>
+                <li>{{ suite }}</li>
+                <ul>
+                    {% for item in kats[suite] %}
+                    <li>{{item[0]}} - Max rel diff = {{item[1]}}</li>
+                    {% if item[2][0] != "" %}
+                    <ul>
+                        <li>stdout: <pre>{{item[2][0]}}</pre></li>
+                        <li>stderr: <pre>{{item[2][1]}}</pre></li>
+                    </ul>
+                    {% endif %}
+                    {% endfor %}
+                </ul>
+            </ul>
+            {% endfor %}
         </div>
     </body>
 </html>
\ No newline at end of file
diff --git a/pykat/testing/web/web_interface.py b/pykat/testing/web/web_interface.py
index 9c9db71..9229c33 100644
--- a/pykat/testing/web/web_interface.py
+++ b/pykat/testing/web/web_interface.py
@@ -12,11 +12,11 @@ from pykat.testing import utils
 from pykat.testing import test as finesse_test
 import shutil
 from pykat.testing.web import app
-
+from hashlib import md5
 from CodernityDB.database_thread_safe import ThreadSafeDatabase
 from CodernityDB.database import RecordNotFound
 
-from pykat.testing.web.database_indices import TestIDIndex, SrcCommitIndex
+from pykat.testing.web.database_indices import TestIDIndex, SrcCommitIndex, KatTestIndex
 
 import os, sys, traceback
 
@@ -53,12 +53,14 @@ else:
     db.create()
     db.add_index(TestIDIndex(db.path, 'testid'))
     db.add_index(SrcCommitIndex(db.path, 'srccommit'))
-    
+    db.add_index(KatTestIndex(db.path, 'kattest'))
 
+        
 SRC_GIT_PATH = os.path.join(app.instance_path, "finesse_src",".git")
 
 # get HEAD commit to set as starting point for commit checker
-latest_commit_id_tested = utils.git('--git-dir {0} log -1 --pretty=format:"%H"'.format(SRC_GIT_PATH))[0].split("\n")[0]
+latest_data = utils.git(['--git-dir',SRC_GIT_PATH,"log","-1",'--pretty=format:"%H"'])
+latest_commit_id_tested = latest_data[0].split("\n")[0].rstrip('"').lstrip("\\")
 
 print "loading web interface"
 
@@ -109,32 +111,89 @@ class FinesseProcessWatcher(Thread):
         
         print "Watcher is continuing"
         
-        doc = db.get('testid', self.process_to_watch.test_id,with_doc=True)["doc"]
-        doc["cancelled"] = self.process_to_watch.cancelling
-        doc["error"] = self.process_to_watch.errorOccurred
-        doc["startTime"] = str(start)
-        doc["endTime"] = str(datetime.now())
-        doc["testRun"] = self.process_to_watch.finished_test
-        doc["diffFound"] = self.process_to_watch.diffFound
-        
-        db.update(doc)
-        
         try:
-            # once done check if any other tests need to be ran
-            schedule_lock.acquire()
-        
-            if len(scheduled_tests) > 0:
-                print "Watcher starting next test"
-                current_test = scheduled_tests.pop(0)
-                watcher = FinesseProcessWatcher()
-                watcher.setProcessToWatch(current_test)
-                watcher.start()
-            else:
-                print "Watcher found no more tests to run"
-                current_test = None
-                watcher = None
+            testdoc = db.get('testid',
+                         self.process_to_watch.test_id,
+                         with_doc=True)["doc"]
+                                 
+            testdoc["cancelled"]    = self.process_to_watch.cancelling
+            testdoc["error"]        = self.process_to_watch.errorOccurred
+            testdoc["startTime"]    = str(start)
+            testdoc["endTime"]      = str(datetime.now())
+            testdoc["testFinished"] = self.process_to_watch.finished_test
+            testdoc["diffFound"]    = self.process_to_watch.diffFound
+                                 
+            kats_run = list()
+            
+            print "Storing kat run time data..."
+            
+            if self.process_to_watch is not None:
+                for suite in self.process_to_watch.run_times.keys():
+                    print suite
+                    for kat in self.process_to_watch.run_times[suite].keys(): 
+                        key = md5(str(suite) + str(kat)).digest() 
+                        out = kat[:-4] + ".out"
+                        
+                        if out in self.process_to_watch.output_differences[suite]:
+                            max_diff = self.process_to_watch.output_differences[suite][out][2]
+                        else:
+                            max_diff = float('NaN')
+                            
+                        if kat in self.process_to_watch.kat_run_exceptions[suite]:
+                            err = self.process_to_watch.kat_run_exceptions[suite][kat];
+                            runexception = (str(err.err), str(err.out));
+                        else:
+                            runexception = ("","")
+                            
+                        kats_run.append(dict(suite = suite, 
+                                             kat = kat,
+                                             max_diff = float(max_diff),
+                                             runexception = runexception))     
+                                            
+                        try:
+                            doc = db.get('kattest', key, with_doc=True)["doc"]
+                            doc["test_id"].append(self.process_to_watch.test_id)
+                            doc["commit"].append(self.process_to_watch.get_version())
+                            doc["timing"].append(self.process_to_watch.run_times[suite][kat])
+                            db.update(doc)
+                            
+                        except RecordNotFound:
+                            doc = dict(t="kattest",test_id=[],commit=[],timing=[],suite=suite,kat=kat)
+
+                            doc["test_id"].append(self.process_to_watch.test_id)
+                            doc["commit"].append(self.process_to_watch.get_version())
+                            doc["timing"].append(self.process_to_watch.run_times[suite][kat])
+                            db.insert(doc)
+                    
+            #finally update with details on the kat files ran
+            testdoc["kats_run"] = kats_run
+            db.update(testdoc)
+        except RecordNotFound:
+            print "Could not find database records for test id " + str(self.process_to_watch.test_id)
+            pass
+        except:
+            exc_type, exc_value, exc_traceback = sys.exc_info()
+           
+            print "*** Exception for test_id = " + str(self.process_to_watch.test_id)
+            traceback.print_exception(exc_type, exc_value, exc_traceback,
+                                      limit=5, file=sys.stdout)
         finally:
-            schedule_lock.release()
+            try:
+                # once done check if any other tests need to be ran
+                schedule_lock.acquire()
+            
+                if len(scheduled_tests) > 0:
+                    print "Watcher starting next test"
+                    current_test = scheduled_tests.pop(0)
+                    watcher = FinesseProcessWatcher()
+                    watcher.setProcessToWatch(current_test)
+                    watcher.start()
+                else:
+                    print "Watcher found no more tests to run"
+                    current_test = None
+                    watcher = None
+            finally:
+                schedule_lock.release()
                 
 
 @app.route('/finesse/cancel_test_<id>', methods=["POST"])
@@ -169,6 +228,15 @@ def finesse_cancel_test(id):
                 print "Cancelled queued test"
                 scheduled_tests[remove].cancelling = True
                 scheduled_tests.pop(remove)
+                
+                try:
+                    #need to update in database for queued test
+                    doc = db.get("testid",id,with_doc=True)["doc"]
+                    doc["cancelled"] = true
+                    db.update(doc)
+                except RecordNotFound:
+                    pass
+                    
                 return str(id)
             
             print "Nothing cancelled"
@@ -260,7 +328,7 @@ def __finesse_start_test(git_commit, kats):
                        cancelled=test.cancelling,
                        error=test.errorOccurred,
                        diffFound=test.diffFound,
-                       testRun=test.finished_test))
+                       testFinished=test.finished_test))
                        
         __run_new(test)
     finally:
@@ -295,7 +363,11 @@ def finesse_get_test_progress():
             percent_done = current_test.percent_done()
             status = current_test.get_progress()
             version = current_test.get_version()
-            return jsonify(cancelling=cancelling, running=True, id=test_id, percent=percent_done, status=status, version=version)    
+            
+            return jsonify(cancelling=cancelling,
+                           running=True, id=test_id,
+                           percent=percent_done, status=status,
+                           version=version)    
             
     finally:
         schedule_lock.release()
@@ -322,14 +394,13 @@ def finesse_get_branches():
 def finesse_get_log(count,branch):
     os.chdir(os.path.join(app.instance_path,"finesse_src"))
         
-    print "!!!!", count, branch
     try:
-        [out,err] = utils.git("checkout " + branch)
-        [out,err] = utils.git("pull")
+        [out,err] = utils.git(["checkout", branch])
+        [out,err] = utils.git(["pull"])
     except Exception as ex:
         print "git pull error : " + str(ex)
     
-    [out,err] = utils.git("log --max-count={0} --pretty=oneline".format(count))
+    [out,err] = utils.git(["log","--max-count={0}".format(count),"--pretty=oneline"])
     
     log_entries = out.split("\n")
     
@@ -348,7 +419,6 @@ def finesse_get_log(count,branch):
             
             log2send.append({'commit':vals[0], 'message':message})
             
-    
     return jsonify(logs=log2send)
       
 @app.route('/finesse/get_<count>_prev_tests', methods=["POST"])
@@ -393,7 +463,7 @@ def finesse_get_prev_tests(count):
                 status = "Cancelled"
             elif "diffFound" in i and i["diffFound"] == True:
                 status = "ERRORS"
-            elif "testRun" in i and i["testRun"] == False:
+            elif "testFinished" in i and i["testFinished"] == False:
                 status = "Not started"
             else:
                 status = "OK"
@@ -432,6 +502,13 @@ def finesse_view_make(view_test_id, log):
         elif log == "make":
             log = os.path.join(TEST_PATH, "build", "make.log")
             
+            if not os.path.exists(log):
+                log_string = "No file found"
+            else:
+                log_string = open(log).read()
+        elif log == "report":
+            log = os.path.join(TEST_PATH, "report", "report.log")
+            
             if not os.path.exists(log):
                 log_string = "No file found"
             else:
@@ -457,6 +534,15 @@ def finesse_view(view_test_id):
     doc = db.get('testid',view_test_id,with_doc=True)
     
     doc = doc["doc"]
+    kats = {}
+    
+    for run in doc["kats_run"]:
+        suite = run["suite"]
+        if not suite in kats:
+            kats[suite] = []
+            
+        kats[suite].append((run["kat"], run["max_diff"], run["runexception"]))
+        
     
     if "error" in doc and doc["error"] is not None:
         traceback = doc["error"]["traceback"]
@@ -466,9 +552,11 @@ def finesse_view(view_test_id):
         message = "No test exceptions thrown"
     
     return render_template("finesse_test_view.html",
-                            view_test_id = str(view_test_id),
-                            excp_traceback=traceback,
-                            excp_message=message)
+                           view_test_id = str(view_test_id),
+                           excp_traceback=traceback,
+                           excp_message=message,
+                           kats = kats)
+                           
     #except RecordNotFound:
     #    pass
     
@@ -511,7 +599,7 @@ def setInterval(interval):
 @setInterval(600)
 def checkLatestCommits():
     global latest_commit_id_tested
-    out = utils.git(["--git-dir",SRC_GIT_PATH,"log",latest_commit_id_tested + "..HEAD",'--pretty=format:"%H"'])
+    out = utils.git(["--git-dir",SRC_GIT_PATH,"log", latest_commit_id_tested[:8] + "..HEAD",'--pretty=format:"%H"'])
     
     print "Checking latest commits..."
     commits_not_tested = []
-- 
GitLab