Browse Source

+ testsuite cgi testrun comparisons

git-svn-id: trunk@6174 -
fpc 18 years ago
parent
commit
cfe41cf155
1 changed files with 287 additions and 81 deletions
  1. 287 81
      tests/utils/testsuite/utests.pp

+ 287 - 81
tests/utils/testsuite/utests.pp

@@ -14,6 +14,7 @@ Type
     FComboBoxProducer : TComboBoxProducer;
     FComboBoxProducer : TComboBoxProducer;
     FDB : TMySQLDatabase;
     FDB : TMySQLDatabase;
     FRunID,
     FRunID,
+    FCompareRunID,
     FVersion,
     FVersion,
     FCPU,
     FCPU,
     FOS  : String;
     FOS  : String;
@@ -46,8 +47,9 @@ Type
     Function GetVersionName(ID : String) : String;
     Function GetVersionName(ID : String) : String;
     Function InitCGIVars : Integer;
     Function InitCGIVars : Integer;
     Procedure DoRun; override;
     Procedure DoRun; override;
-    Procedure EmitForm;
+    Procedure EmitOverviewForm;
     Procedure ShowRunResults;
     Procedure ShowRunResults;
+    Procedure ShowRunComparison;
     Function ConnectToDB : Boolean;
     Function ConnectToDB : Boolean;
     procedure DisconnectFromDB;
     procedure DisconnectFromDB;
     Procedure EmitTitle(ATitle : String);
     Procedure EmitTitle(ATitle : String);
@@ -71,7 +73,7 @@ Const
 }
 }
 
 
 Const
 Const
-  SDetailsURL = 'testsuite.cgi?TESTACTION=1&TESTRUN=%s';
+  SDetailsURL = 'testsuite.cgi?action=1&run1id=%s';
 
 
 Procedure TTestSuite.DoRun;
 Procedure TTestSuite.DoRun;
 
 
@@ -79,8 +81,12 @@ begin
   Try
   Try
     Try
     Try
       Case InitCGIVars of
       Case InitCGIVars of
-        0 : EmitForm;
-        1 : ShowRunResults;
+        0 : EmitOverviewForm;
+        1 : 
+          if Length(FCompareRunID) = 0 then
+            ShowRunResults
+          else
+            ShowRunComparison;
         2 : CreateRunPie;
         2 : CreateRunPie;
       end;
       end;
     finally
     finally
@@ -102,27 +108,48 @@ begin
   FComboBoxProducer:=TComboBoxProducer.Create(Self);
   FComboBoxProducer:=TComboBoxProducer.Create(Self);
   DateSeparator:='/';
   DateSeparator:='/';
   Result:=0;
   Result:=0;
-  FAction:=StrToIntDef(RequestVariables['TESTACTION'],0);
-  FVersion:=RequestVariables['TESTVERSION'];
-  FOS:=RequestVariables['TESTOS'];
-  FCPU:=RequestVariables['TESTCPU'];
-  S:=RequestVariables['TESTDATE'];
-  FRunID:=RequestVariables['TESTRUN'];
-  FTestLastDays:=StrToIntDef(RequestVariables['TESTLASTDAYS'],31);
-  If (S<>'') then
-    Try
+  S:=RequestVariables['action'];
+  if Length(S) = 0 then
+    S:=RequestVariables['TESTACTION'];
+  FAction:=StrToIntDef(S,0);
+  FVersion:=RequestVariables['version'];
+  if Length(FVersion) = 0 then
+    FVersion:=RequestVariables['TESTVERSION'];
+  FOS:=RequestVariables['os'];
+  if Length(FOS) = 0 then
+    FOS:=RequestVariables['TESTOS'];
+  FCPU:=RequestVariables['cpu'];
+  if Length(FCPU) = 0 then
+    FCPU:=RequestVariables['TESTCPU'];
+  FRunID:=RequestVariables['run1id'];
+  if Length(FRunID) = 0 then
+    FRunID:=RequestVariables['TESTRUN'];
+  S:=RequestVariables['lastdays'];
+  if Length(S) = 0 then
+    S:=RequestVariables['TESTLASTDAYS'];
+  FTestLastDays:=StrToIntDef(S,31);
+  S:=RequestVariables['date'];
+  if Length(S) = 0 then
+    S:=RequestVariables['TESTDATE'];
+  if Length(S) > 0 then
+    try
       FDate:=StrToDate(S);
       FDate:=StrToDate(S);
     except
     except
       FDate:=0;
       FDate:=0;
     end;
     end;
-  S:=RequestVariables['TESTFAILEDONLY'];
+  S:=RequestVariables['failedonly'];
+  if Length(S) = 0 then
+    S:=RequestVariables['TESTFAILEDONLY'];
   FOnlyFailed:=(S='1');
   FOnlyFailed:=(S='1');
-  S:=RequestVariables['TESTNOSKIPPED'];
+  S:=RequestVariables['noskipped'];
+  if Length(S) = 0 then
+    S:=RequestVariables['TESTNOSKIPPED'];
   FNoSkipped:=(S='1');
   FNoSkipped:=(S='1');
-  S:=RequestVariables['DEBUGCGI'];
+  FCompareRunID:=RequestVariables['run2id'];
   FRunCount:=StrToIntDef(RequestVariables['PIETOTAL'],0);
   FRunCount:=StrToIntDef(RequestVariables['PIETOTAL'],0);
   FRunSkipCount:=StrToIntDef(RequestVariables['PIESKIPPED'],0);
   FRunSkipCount:=StrToIntDef(RequestVariables['PIESKIPPED'],0);
   FRunFailedCount:=StrToIntDef(RequestVariables['PIEFAILED'],0);
   FRunFailedCount:=StrToIntDef(RequestVariables['PIEFAILED'],0);
+  S:=RequestVariables['DEBUGCGI'];
   FDebug:=(S='1');
   FDebug:=(S='1');
   Result:=FAction;
   Result:=FAction;
 end;
 end;
@@ -209,7 +236,7 @@ begin
   AddResponseLn('<BODY>');
   AddResponseLn('<BODY>');
 end;
 end;
 
 
-Procedure TTestSuite.EmitForm;
+Procedure TTestSuite.EmitOverviewForm;
 
 
 begin
 begin
   ConnectToDB;
   ConnectToDB;
@@ -229,40 +256,40 @@ begin
       CellStart;
       CellStart;
         Write('Operating system:');
         Write('Operating system:');
       CellNext;
       CellNext;
-        ComboBoxFromQuery('TESTOS','SELECT TO_ID,TO_NAME FROM TESTOS ORDER BY TO_NAME',FOS);
+        ComboBoxFromQuery('os','SELECT TO_ID,TO_NAME FROM TESTOS ORDER BY TO_NAME',FOS);
       CellEnd;
       CellEnd;
     RowNext;
     RowNext;
       CellStart;
       CellStart;
         Write('Processor:');
         Write('Processor:');
       CellNext;
       CellNext;
-        ComboBoxFromQuery('TESTCPU','SELECT TC_ID,TC_NAME FROM TESTCPU ORDER BY TC_NAME',FCPU);
+        ComboBoxFromQuery('cpu','SELECT TC_ID,TC_NAME FROM TESTCPU ORDER BY TC_NAME',FCPU);
       CellEnd;
       CellEnd;
     RowNext;
     RowNext;
       CellStart;
       CellStart;
         Write('Version');
         Write('Version');
       CellNext;
       CellNext;
-        ComboBoxFromQuery('TESTVERSION','SELECT TV_ID,TV_VERSION FROM TESTVERSION ORDER BY TV_VERSION DESC',FVERSION);
+        ComboBoxFromQuery('version','SELECT TV_ID,TV_VERSION FROM TESTVERSION ORDER BY TV_VERSION DESC',FVERSION);
       CellEnd;
       CellEnd;
     RowNext;
     RowNext;
       CellStart;
       CellStart;
         Write('Date');
         Write('Date');
       CellNext;
       CellNext;
         If (FDate=0) then
         If (FDate=0) then
-          EmitInput('TESTDATE','')
+          EmitInput('date','')
         else
         else
-          EmitInput('TESTDATE',DateToStr(FDate));
+          EmitInput('date',DateToStr(FDate));
       CellEnd;
       CellEnd;
     RowNext;
     RowNext;
       CellStart;
       CellStart;
         Write('Only failed tests');
         Write('Only failed tests');
       CellNext;
       CellNext;
-        EmitCheckBox('TESTFAILEDONLY','1',FonlyFailed);
+        EmitCheckBox('failedonly','1',FonlyFailed);
       CellEnd;
       CellEnd;
     RowNext;
     RowNext;
       CellStart;
       CellStart;
         Write('No skipped tests');
         Write('No skipped tests');
       CellNext;
       CellNext;
-        EmitCheckBox('TESTNOSKIPPED','1',FNoSkipped);
+        EmitCheckBox('noskipped','1',FNoSkipped);
       CellEnd;
       CellEnd;
     RowEnd;
     RowEnd;
     TableEnd;
     TableEnd;
@@ -309,7 +336,7 @@ Var
 
 
 begin
 begin
   If FDebug then
   If FDebug then
-    Write('Query : '+Qry);
+    Writeln('Query : '+Qry);
   Q:=CreateDataset(Qry);
   Q:=CreateDataset(Qry);
   With Q do
   With Q do
     try
     try
@@ -329,7 +356,7 @@ begin
             Free;
             Free;
           end;
           end;
         If IncludeRecordCount then
         If IncludeRecordCount then
-          Write('Record count: '+IntTostr(Q.RecordCount));
+          Writeln('<p>Record count: ',Q.RecordCount,'</p>');
       Finally
       Finally
         Close;
         Close;
       end;
       end;
@@ -339,22 +366,23 @@ begin
 end;
 end;
 
 
 Procedure TTestSuite.ShowRunOverview;
 Procedure TTestSuite.ShowRunOverview;
-
 Const
 Const
-  SOverview = 'SELECT TU_ID,TU_DATE,TC_NAME,TO_NAME,TV_VERSION,COUNT(TR_ID) as RESULTCOUNT,'+
-              '(TU_SUCCESSFULLYFAILED+TU_SUCCESFULLYCOMPILED+TU_SUCCESSFULLYRUN) AS OK,'+
-              '(TU_FAILEDTOCOMPILE+TU_FAILEDTORUN+TU_FAILEDTOFAIL) as FAILED,'+              
-              '(TU_SUCCESSFULLYFAILED+TU_SUCCESFULLYCOMPILED+TU_SUCCESSFULLYRUN+'+
-                'TU_FAILEDTOCOMPILE+TU_FAILEDTORUN+TU_FAILEDTOFAIL) as TOTAL,'+
-              'TU_SUBMITTER as SUBMITTER, TU_MACHINE as MACHINE, TU_COMMENT as COMMENT'+
-              ' FROM TESTRESULTS,TESTRUN,TESTCPU,TESTOS,TESTVERSION '+
+  SOverview = 'SELECT TU_ID as ID,TU_DATE as Date,TC_NAME as CPU,TO_NAME as OS,'+
+               'TV_VERSION as Version,COUNT(TR_ID) as Count,'+
+               '(TU_SUCCESSFULLYFAILED+TU_SUCCESFULLYCOMPILED+TU_SUCCESSFULLYRUN) AS OK,'+
+               '(TU_FAILEDTOCOMPILE+TU_FAILEDTORUN+TU_FAILEDTOFAIL) as Failed,'+              
+               '(TU_SUCCESSFULLYFAILED+TU_SUCCESFULLYCOMPILED+TU_SUCCESSFULLYRUN+'+
+                'TU_FAILEDTOCOMPILE+TU_FAILEDTORUN+TU_FAILEDTOFAIL) as Total,'+
+               'TU_SUBMITTER as Submitter, TU_MACHINE as Machine, TU_COMMENT as Comment '+
+              'FROM TESTRESULTS,TESTRUN,TESTCPU,TESTOS,TESTVERSION '+
               'WHERE '+
               'WHERE '+
-              ' (TC_ID=TU_CPU_FK) AND '+
-              ' (TO_ID=TU_OS_FK) AND '+
-              ' (TV_ID=TU_VERSION_FK) AND '+
-              ' (TR_TESTRUN_FK=TU_ID) '+
-              ' %s '+
-              ' GROUP BY TU_ID ';
+               '(TC_ID=TU_CPU_FK) AND '+
+               '(TO_ID=TU_OS_FK) AND '+
+               '(TV_ID=TU_VERSION_FK) AND '+
+               '(TR_TESTRUN_FK=TU_ID) '+
+               '%s '+
+              'GROUP BY TU_ID '+
+              'ORDER BY TU_ID DESC LIMIT 50';
 
 
 
 
 Var
 Var
@@ -370,19 +398,17 @@ begin
    if (FOS<>'') and (GetOSName(FOS)<>'All') then
    if (FOS<>'') and (GetOSName(FOS)<>'All') then
      S:=S+' AND (TU_OS_FK='+FOS+')';
      S:=S+' AND (TU_OS_FK='+FOS+')';
    If (Round(FDate)<>0) then
    If (Round(FDate)<>0) then
-     S:=S+' AND (TU_DATE>="'+FormatDateTime('YYYY/MM/DD',FDate)+'")'
-   else
-     S:=S+' AND (TU_DATE>="'+FormatDateTime('YYYY/MM/DD',Date-FTESTLASTDAYS)+'")';
+     S:=S+' AND (TU_DATE="'+FormatDateTime('YYYY/MM/DD',FDate)+'")';
    If FOnlyFailed then
    If FOnlyFailed then
      S:=S+' AND (TR_OK="-")';
      S:=S+' AND (TR_OK="-")';
    A:=SDetailsURL;
    A:=SDetailsURL;
    If FOnlyFailed then
    If FOnlyFailed then
-     A:=A+'&TESTFAILEDONLY=1';
+     A:=A+'&failedonly=1';
    If FNoSkipped then
    If FNoSkipped then
-     A:=A+'&TESTNOSKIPPED=1';
+     A:=A+'&noskipped=1';
   Qry:=Format(SOverview,[S]);
   Qry:=Format(SOverview,[S]);
   If FDebug then
   If FDebug then
-    Write('Query : '+Qry);
+    Writeln('Query : '+Qry);
   Q:=CreateDataset(Qry);
   Q:=CreateDataset(Qry);
   With Q do
   With Q do
     try
     try
@@ -393,13 +419,13 @@ begin
             Border:=True;
             Border:=True;
             OnGetRowAttributes:=@GetOverViewRowAttr;
             OnGetRowAttributes:=@GetOverViewRowAttr;
             CreateColumns(Nil);
             CreateColumns(Nil);
-            TableColumns.ColumnByName('TU_ID').ActionURL:=A;
-            TableColumns.ColumnByNAme('FAILED').OnGetCellContents:=@FormatFailedOverview;
+            TableColumns.ColumnByName('ID').ActionURL:=A;
+            TableColumns.ColumnByNAme('Failed').OnGetCellContents:=@FormatFailedOverview;
             CreateTable(Response);
             CreateTable(Response);
           Finally
           Finally
             Free;
             Free;
           end;
           end;
-        Write('Record count: '+IntTostr(Q.RecordCount));
+        Writeln('<p>Record count: ',Q.RecordCount,'</p>');
       Finally
       Finally
         Close;
         Close;
       end;
       end;
@@ -432,8 +458,8 @@ end;
 
 
 Function TTestSuite.ShowRunData : Boolean;
 Function TTestSuite.ShowRunData : Boolean;
 
 
-COnst
-  SGetRunData = 'SELECT TU_ID,TU_DATE,TC_NAME,TO_NAME,TV_VERSION '+
+Const
+  SGetRunData = 'SELECT TU_ID,TU_DATE,TC_NAME,TO_NAME,TU_COMMENT,TV_VERSION '+
                 ' FROM TESTRUN,TESTCPU,TESTOS,TESTVERSION '+
                 ' FROM TESTRUN,TESTCPU,TESTOS,TESTVERSION '+
                 'WHERE '+
                 'WHERE '+
                 ' (TC_ID=TU_CPU_FK) AND '+
                 ' (TC_ID=TU_CPU_FK) AND '+
@@ -443,51 +469,115 @@ COnst
 
 
 
 
 Var
 Var
-  Q : TmYSQLDataset;
-
+  Q1,Q2 : TmYSQLDataset;
+  F : TField;
+  Date1, Date2: TDateTime;
 begin
 begin
   Result:=(FRunID<>'');
   Result:=(FRunID<>'');
   If Result then
   If Result then
     begin
     begin
-    Q:=CreateDataset(Format(SGetRunData,[FRunID]));
+    Q1:=CreateDataset(Format(SGetRunData,[FRunID]));
+    if Length(FCompareRunID) > 0 then
+      Q2:=CreateDataset(Format(SGetRunData,[FCompareRunID]))
+    else
+      Q2:=nil;
     Try
     Try
-      Q.Open;
-      Result:=Not (Q.EOF and Q.BOF);
+      Q1.Open;
+      if Q2 <> nil then
+        Q2.Open;
+      Result:=Not (Q1.EOF and Q1.BOF);
       If Result then
       If Result then
         With FHTMLWriter do
         With FHTMLWriter do
           begin
           begin
-          TableStart(2,true);
+          FormStart('testsuite.cgi','get');
+          EmitHiddenVar('action', '1');
+          TableStart(3,true);
           RowStart;
           RowStart;
+            CellStart;
+              Write('Run ID:');
+            CellNext;
+              EmitInput('run1id',FRunID);
+            CellNext;
+              EmitInput('run2id',FCompareRunID);
+            CellEnd;
+          RowNext;
             CellStart;
             CellStart;
               Write('Operating system:');
               Write('Operating system:');
             CellNext;
             CellNext;
-              Write(Q.FieldByName('TO_NAME').AsString);
+              Write(Q1.FieldByName('TO_NAME').AsString);
+            CellNext;
+              if Q2 <> nil then
+                Write(Q2.FieldByName('TO_NAME').AsString);
             CellEnd;
             CellEnd;
           RowNext;
           RowNext;
             CellStart;
             CellStart;
               Write('Processor:');
               Write('Processor:');
             CellNext;
             CellNext;
-              Write(Q.FieldByName('TC_NAME').AsString);
+              Write(Q1.FieldByName('TC_NAME').AsString);
+            CellNext;
+              if Q2 <> nil then
+                Write(Q2.FieldByName('TC_NAME').AsString);
             CellEnd;
             CellEnd;
           RowNext;
           RowNext;
             CellStart;
             CellStart;
-              Write('Version');
+              Write('Version:');
+            CellNext;
+              Write(Q1.FieldByNAme('TV_VERSION').AsString);
             CellNext;
             CellNext;
-              Write(Q.FieldByNAme('TV_VERSION').AsString);
+              if Q2 <> nil then
+                Write(Q2.FieldByNAme('TV_VERSION').AsString);
             CellEnd;
             CellEnd;
           RowNext;
           RowNext;
             CellStart;
             CellStart;
-              Write('Date');
+              Write('Comment:');
             CellNext;
             CellNext;
-              Write(Q.FieldByNAme('TU_DATE').AsString);
+              Write(Q1.FieldByName('TU_COMMENT').AsString);
+            CellNext;
+              if Q2 <> nil then
+                Write(Q2.FieldByName('TU_COMMENT').AsString);
+            CellEnd;
+          RowNext;
+            CellStart;
+              Write('Date:');
+            CellNext;
+              F := Q1.FieldByName('TU_DATE');
+              Date1 := F.AsDateTime;
+              Write(F.AsString);
+            CellNext;
+              if Q2 <> nil then
+                begin
+                F := Q2.FieldByName('TU_DATE');
+                Date2 := F.AsDateTime;
+                Write(F.AsString);
+                end;
             CellEnd;
             CellEnd;
           RowEnd;
           RowEnd;
           TableEnd;
           TableEnd;
+          ParagraphStart;
+          EmitCheckBox('noskipped','1',FNoSkipped);
+          Write(' No skipped tests');
+          ParagraphEnd;
           ParaGraphStart;
           ParaGraphStart;
+          EmitSubmitButton('','Show/Compare');
+          EmitResetButton('','Reset form');
+          ParagraphEnd;
+          FormEnd;
+          { give warning if dates reversed }
+          if (Q2 <> nil) and (Date1 > Date2) then
+            begin
+            ParagraphStart;
+            Write('Warning: testruns are not compared in chronological order.');
+            ParagraphEnd;
+            end;
           end;
           end;
     Finally
     Finally
-      Q.Close;
-      Q.Free;
+      Q1.Close;
+      Q1.Free;
+      if Q2 <> nil then
+        begin
+        Q2.Close;
+        Q2.Free;
+        end;
     end;
     end;
     end;
     end;
 end;
 end;
@@ -534,17 +624,19 @@ begin
         end;
         end;
       HeaderEnd(2);
       HeaderEnd(2);
       ParaGraphStart;
       ParaGraphStart;
-      S:='SELECT T_NAME as Test,T_FULLNAME as FileName ,TR_SKIP as Skipped,TR_OK as OK FROM ';
-      S:=S+' TESTRESULTS,TESTS WHERE ';
-      S:=S+' (TR_TEST_FK=T_ID) ';
-      S:=S+'  AND (TR_TESTRUN_FK='+FRunID+') ';
+      S:='SELECT T_NAME as Test,T_FULLNAME as Filename,TR_SKIP as Skipped,TR_OK as OK'
+        +' FROM TESTRESULTS,TESTS'
+        +' WHERE (TR_TEST_FK=T_ID) AND (TR_TESTRUN_FK='+FRunID+') ';
       If FOnlyFailed then
       If FOnlyFailed then
         S:=S+' AND (TR_OK="-")';
         S:=S+' AND (TR_OK="-")';
       If FNoSkipped then
       If FNoSkipped then
         S:=S+' AND (TR_SKIP="-")';
         S:=S+' AND (TR_SKIP="-")';
       Qry:=S;
       Qry:=S;
       If FDebug then
       If FDebug then
-        Write('Query : '+Qry);
+        begin
+        Writeln('Query : '+Qry);
+        Flush(stdout);
+      end;
       FRunCount:=0;
       FRunCount:=0;
       FRunSkipCount:=0;
       FRunSkipCount:=0;
       FRunFailedCount:=0;  
       FRunFailedCount:=0;  
@@ -556,7 +648,7 @@ begin
             With CreateTableProducer(Q) do
             With CreateTableProducer(Q) do
               Try
               Try
                 Border:=True;
                 Border:=True;
-                FL:='Test,FileName';
+                FL:='Test,Filename';
                 If Not FNoSkipped then
                 If Not FNoSkipped then
                   FL:=FL+',Skipped';
                   FL:=FL+',Skipped';
                 If Not FOnlyFailed then
                 If Not FOnlyFailed then
@@ -568,7 +660,104 @@ begin
               Finally
               Finally
                 Free;
                 Free;
               end;
               end;
-            Write('Record count: '+IntTostr(Q.RecordCount));
+            Writeln('<p>Record count: ',Q.RecordCount,'</p>');
+          Finally
+            Close;
+          end;
+        finally
+          Free;
+        end;
+      If Not (FRunCount=0) and not (FNoSkipped or FOnlyFailed) then
+        begin
+        ParaGraphStart;
+        TagStart('IMG',Format('Src="testsuite.cgi?action=2&pietotal=%d&piefailed=%d&pieskipped=%d"',[FRunCount,FRunFailedCount,FRunSkipCount]));
+        end;
+      end
+    else
+      Write('No data for test run with ID: '+FRunID);
+    end;
+end;
+
+Procedure TTestSuite.ShowRunComparison;
+
+Var
+  S : String;
+  Qry : String;
+  Q : TMySQLDataset;
+  FL : String;
+  
+begin
+  ConnectToDB;
+  ContentType:='text/html';
+  EmitContentType;
+  EmitTitle(Title+' : Compare 2 runs');
+  With FHTMLWriter do
+    begin
+    HeaderStart(1);
+    Write('Test suite results for run '+FRunID+' vs. '+FCompareRunID);
+    HeaderEnd(1);
+    HeaderStart(2);
+    Write('Test run data: ');
+    HeaderEnd(2);
+    If ShowRunData then
+      begin
+      HeaderStart(2);
+      Write('Detailed test run results:');
+
+      FL:='';
+      If FOnlyFailed or FNoSkipped then
+        begin
+        FL:='';
+        If FOnlyFailed then
+          FL:='failed';
+        if FNoSkipped then
+          begin
+          If (FL<>'') then
+            FL:=FL+',';
+          FL:=FL+'not skipped';
+          end;
+        Write(' (only '+FL+' tests are shown)');
+        end;
+      HeaderEnd(2);
+      ParaGraphStart;
+      S:='SELECT T_NAME as Test,T_FULLNAME as FileName,tr1.TR_SKIP as Run1_Skipped,'
+         +'tr2.TR_SKIP as Run2_Skipped,tr1.TR_OK as Run1_OK,tr2.TR_OK as Run2_OK '
+        +'FROM TESTS,(select * from TESTRESULTS where TR_TESTRUN_FK='+FCompareRunID+') as tr2 '
+         +'LEFT JOIN (select * from TESTRESULTS where TR_TESTRUN_FK='+FRunID+') as tr1 '
+         +'USING (TR_TEST_FK) '
+        +'WHERE ((tr1.TR_SKIP IS NULL) or (%s(tr1.TR_OK<>tr2.TR_OK))) and (T_ID=tr2.TR_TEST_FK);';
+      If FNoSkipped then
+        Qry:='(tr1.TR_SKIP<>"+") and (tr2.TR_SKIP<>"+") and'
+      else
+        Qry:='';
+      Qry:=Format(S,[Qry]);
+      If FDebug then
+        begin
+        Writeln('Query: '+Qry);
+        Flush(stdout);
+        end;
+      FRunCount:=0;
+      FRunSkipCount:=0;
+      FRunFailedCount:=0;  
+      Q:=CreateDataset(Qry);
+      With Q do
+        try
+          Open;
+          Try
+            With CreateTableProducer(Q) do
+              Try
+                Border:=True;
+                FL:='Test,FileName,Run1_OK,Run2_OK';
+                If Not FNoSkipped then
+                  FL:=FL+',Run1_Skipped,Run2_Skipped';
+                CreateColumns(FL);
+                OnGetRowAttributes:=@GetRunRowAttr;
+                //(TableColumns.Items[0] as TTableColumn).ActionURL:=ALink;
+                CreateTable(Response);
+              Finally
+                Free;
+              end;
+            Writeln('<p>Record count: ',Q.RecordCount,'</p>');
           Finally
           Finally
             Close;
             Close;
           end;
           end;
@@ -578,7 +767,7 @@ begin
       If Not (FRunCount=0) and not (FNoSkipped or FOnlyFailed) then
       If Not (FRunCount=0) and not (FNoSkipped or FOnlyFailed) then
         begin
         begin
         ParaGraphStart;
         ParaGraphStart;
-        TagStart('IMG',Format('Src="testsuite.cgi?TESTACTION=2&PIETOTAL=%d&PIEFAILED=%d&PIESKIPPED=%d"',[FRunCount,FRunFailedCount,FRunSkipCount]));
+        TagStart('IMG',Format('Src="testsuite.cgi?action=2&pietotal=%d&piefailed=%d&pieskipped=%d"',[FRunCount,FRunFailedCount,FRunSkipCount]));
         end;
         end;
       end
       end
     else
     else
@@ -591,7 +780,7 @@ procedure TTestSuite.GetRunRowAttr(Sender: TObject; var BGColor: String;
   
   
 Var
 Var
   P : TTableProducer;
   P : TTableProducer;
-  
+  SkipField, Run1Field, Run2Field : TField;
 begin
 begin
   P:=(Sender as TTAbleProducer);
   P:=(Sender as TTAbleProducer);
   Inc(FRunCount);
   Inc(FRunCount);
@@ -600,19 +789,36 @@ begin
     If (P.CurrentRow Mod 2)=0 then
     If (P.CurrentRow Mod 2)=0 then
       BGColor:='#EEEEEE'
       BGColor:='#EEEEEE'
     end
     end
-  else
-    If P.Dataset.FieldByName('Skipped').AsString='+' then
+  else 
+    begin
+    SkipField := P.Dataset.FindField('Skipped');
+    if SkipField = nil then
+      SkipField := P.Dataset.FindField('Run2_Skipped');
+    Run1Field := P.Dataset.FindField('OK');
+    if Run1Field = nil then
+      Run1Field := P.Dataset.FindField('Run1_OK');
+    Run2Field := P.Dataset.FindField('OK');
+    if Run2Field = nil then
+      Run2Field := P.Dataset.FindField('Run2_OK');
+    If (not FNoSkipped) and (SkipField.AsString='+') then
       begin
       begin
       Inc(FRunSkipCount);
       Inc(FRunSkipCount);
       BGColor:='yellow';    // Yellow
       BGColor:='yellow';    // Yellow
       end
       end
-    else If P.Dataset.FieldByName('OK').AsString='+' then
-      BGColor:='#98FB98'    // pale Green
+    else If Run2Field.AsString='+' then
+      if Run1Field.AsString='' then
+        BGColor:='#68DFB8'
+      else
+        BGColor:='#98FB98'    // pale Green
     else
     else
       begin
       begin
       Inc(FRunFailedCount);
       Inc(FRunFailedCount);
-      BGColor:='#FF82AB';   // Light red
+      if Run1Field.AsString='' then
+        BGColor:='#FF225B'
+      else
+        BGColor:='#FF82AB';   // Light red
       end;
       end;
+    end;
 end;
 end;
 
 
 procedure TTestSuite.FormatFailedOverview(Sender: TObject; var CellData: String);
 procedure TTestSuite.FormatFailedOverview(Sender: TObject; var CellData: String);
@@ -623,8 +829,8 @@ Var
 
 
 begin
 begin
   P:=(Sender as TTableProducer);
   P:=(Sender as TTableProducer);
-  S:=Format(SDetailsURL,[P.DataSet.FieldByName('TU_ID').AsString]);
-  S:=S+'&TESTFAILEDONLY=1&TESTNOSKIPPED=1';
+  S:=Format(SDetailsURL,[P.DataSet.FieldByName('ID').AsString]);
+  S:=S+'&failedonly=1&noksipped=1';
   CellData:=Format('<A HREF="%s">%s</A>',[S,CellData]);
   CellData:=Format('<A HREF="%s">%s</A>',[S,CellData]);
 end;
 end;