1<?php
2/*=========================================================================
3
4  Program:   CDash - Cross-Platform Dashboard System
5  Module:    $Id$
6  Language:  PHP
7  Date:      $Date$
8  Version:   $Revision$
9
10  Copyright (c) 2002 Kitware, Inc.  All rights reserved.
11  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
12
13     This software is distributed WITHOUT ANY WARRANTY; without even
14     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15     PURPOSE.  See the above copyright notices for more information.
16
17=========================================================================*/
18$noforcelogin = 1;
19include("cdash/config.php");
20require_once("cdash/pdo.php");
21include('login.php');
22include_once("cdash/common.php");
23include("cdash/version.php");
24require_once("filterdataFunctions.php");
25include_once("models/build.php");
26
27@$buildid = $_GET["buildid"];
28if ($buildid != NULL)
29  {
30  $buildid = pdo_real_escape_numeric($buildid);
31  }
32@$date = $_GET["date"];
33if ($date != NULL)
34  {
35  $date = htmlspecialchars(pdo_real_escape_string($date));
36  }
37
38// Checks
39if(!isset($buildid) || !is_numeric($buildid))
40  {
41  echo "Not a valid buildid!";
42  return;
43  }
44
45$start = microtime_float();
46$db = pdo_connect("$CDASH_DB_HOST", "$CDASH_DB_LOGIN","$CDASH_DB_PASS");
47pdo_select_db("$CDASH_DB_NAME",$db);
48
49$build_array = pdo_fetch_array(pdo_query("SELECT * FROM build WHERE id='$buildid'"));
50$projectid = $build_array["projectid"];
51if(!isset($projectid) || $projectid==0)
52  {
53  echo "This build doesn't exist. Maybe it has been deleted.";
54  exit();
55  }
56
57checkUserPolicy(@$_SESSION['cdash']['loginid'],$projectid);
58
59$project = pdo_query("SELECT name,showtesttime,testtimemaxstatus,nightlytime,displaylabels FROM project WHERE id='$projectid'");
60if(pdo_num_rows($project)>0)
61  {
62  $project_array = pdo_fetch_array($project);
63  $projectname = $project_array["name"];
64  $projectshowtesttime = $project_array["showtesttime"];
65  $testtimemaxstatus = $project_array["testtimemaxstatus"];
66  }
67
68$siteid = $build_array["siteid"];
69$buildtype = $build_array["type"];
70$buildname = $build_array["name"];
71$starttime = $build_array["starttime"];
72
73$date = get_dashboard_date_from_build_starttime($starttime, $project_array["nightlytime"]);
74
75
76$xml = begin_XML_for_XSLT();
77
78$xml .= "<title>CDash : ".$projectname."</title>";
79
80$xml .= get_cdash_dashboard_xml_by_name($projectname,$date);
81
82// Menu
83$xml .= "<menu>";
84
85$onlypassed = 0;
86$onlyfailed = 0;
87$onlytimestatus = 0;
88$onlynotrun = 0;
89$onlydelta = 0;
90$extraquery = "";
91
92if(isset($_GET["onlypassed"]))
93  {
94  $onlypassed = 1;
95  $extraquery = "&onlypassed";
96  }
97else if(isset($_GET["onlyfailed"]))
98  {
99  $onlyfailed = 1;
100  $extraquery = "&onlyfailed";
101  }
102else if(isset($_GET["onlytimestatus"]))
103  {
104  $onlytimestatus = 1;
105  $extraquery = "&onlytimestatus";
106  }
107else if(isset($_GET["onlynotrun"]))
108  {
109  $onlynotrun = 1;
110  $extraquery = "&onlynotrun";
111  }
112else if(isset($_GET["onlydelta"])) // new test that are showing up for this category
113  {
114  $onlydelta = 1;
115  $extraquery = "&onlydelta";
116  }
117
118
119$nightlytime = get_project_property($projectname,"nightlytime");
120$xml .= add_XML_value("back","index.php?project=".urlencode($projectname)."&date=".get_dashboard_date_from_build_starttime($build_array["starttime"],$nightlytime));
121$previousbuildid = get_previous_buildid($projectid,$siteid,$buildtype,$buildname,$starttime);
122if($previousbuildid>0)
123  {
124  $xml .= add_XML_value("previous","viewTest.php?buildid=".$previousbuildid.$extraquery);
125  }
126else
127  {
128  $xml .= add_XML_value("noprevious","1");
129  }
130$xml .= add_XML_value("current","viewTest.php?buildid=".get_last_buildid($projectid,$siteid,$buildtype,$buildname,$starttime).$extraquery);
131$nextbuildid = get_next_buildid($projectid,$siteid,$buildtype,$buildname,$starttime);
132if($nextbuildid>0)
133  {
134  $xml .= add_XML_value("next","viewTest.php?buildid=".$nextbuildid.$extraquery);
135  }
136else
137  {
138  $xml .= add_XML_value("nonext","1");
139  }
140$xml .= "</menu>";
141
142$site_array = pdo_fetch_array(pdo_query("SELECT name FROM site WHERE id='$siteid'"));
143$xml .= "<build>\n";
144$xml .= add_XML_value("displaylabels",$project_array["displaylabels"]);
145$xml .= add_XML_value("site",$site_array["name"]);
146$xml .= add_XML_value("siteid",$siteid);
147$xml .= add_XML_value("buildname",$build_array["name"]);
148$xml .= add_XML_value("buildid",$build_array["id"]);
149$xml .= add_XML_value("testtime", $build_array["endtime"]);
150
151// Find the OS and compiler information
152$buildinformation = pdo_query("SELECT * FROM buildinformation WHERE buildid='$buildid'");
153if(pdo_num_rows($buildinformation)>0)
154  {
155  $buildinformation_array = pdo_fetch_array($buildinformation);
156  if($buildinformation_array["osname"]!="")
157    {
158    $xml .= add_XML_value("osname",$buildinformation_array["osname"]);
159    }
160  if($buildinformation_array["osplatform"]!="")
161    {
162    $xml .= add_XML_value("osplatform",$buildinformation_array["osplatform"]);
163    }
164  if($buildinformation_array["osrelease"]!="")
165    {
166    $xml .= add_XML_value("osrelease",$buildinformation_array["osrelease"]);
167    }
168  if($buildinformation_array["osversion"]!="")
169    {
170    $xml .= add_XML_value("osversion",$buildinformation_array["osversion"]);
171    }
172  if($buildinformation_array["compilername"]!="")
173    {
174    $xml .= add_XML_value("compilername",$buildinformation_array["compilername"]);
175    }
176  if($buildinformation_array["compilerversion"]!="")
177    {
178    $xml .= add_XML_value("compilerversion",$buildinformation_array["compilerversion"]);
179    }
180  }
181$xml .= "</build>\n";
182$xml .= "<csvlink>".htmlspecialchars($_SERVER["REQUEST_URI"])."&amp;export=csv</csvlink>";
183$xml .= "<project>";
184$xml .= add_XML_value("showtesttime", $projectshowtesttime);
185$xml .= "</project>";
186
187
188$displaydetails = 1;
189$status = '';
190$order = 't.name';
191
192if($onlypassed)
193  {
194  $displaydetails = 0;
195  $status = "AND bt.status='passed'";
196  }
197else if($onlyfailed)
198  {
199  $status = "AND bt.status='failed'";
200  }
201else if($onlynotrun)
202  {
203  $displaydetails = 0;
204  $status = "AND bt.status='notrun'";
205  }
206else if($onlytimestatus)
207  {
208  $status = "AND bt.timestatus>='$testtimemaxstatus'";
209  }
210else
211  {
212  $order = 'bt.status,bt.timestatus DESC,t.name';
213  }
214
215$xml .= add_XML_value("displaydetails", $displaydetails);
216$xml .= add_XML_value("onlypassed", $onlypassed);
217$xml .= add_XML_value("onlyfailed", $onlyfailed);
218$xml .= add_XML_value("onlytimestatus", $onlytimestatus);
219$xml .= add_XML_value("onlynotrun", $onlynotrun);
220
221// Filters:
222//
223$filterdata = get_filterdata_from_request();
224$filter_sql = $filterdata['sql'];
225$limit_sql = '';
226if ($filterdata['limit']>0)
227  {
228  $limit_sql = ' LIMIT '.$filterdata['limit'];
229  }
230$xml .= $filterdata['xml'];
231
232$limitnew = "";
233if($onlydelta)
234  {
235  $limitnew = " AND newstatus=1 ";
236  $onlydelta_extra = " AND build2test.newstatus=1 ";
237  }
238
239$sql = "SELECT bt.status,bt.newstatus,bt.timestatus,t.id,bt.time,t.details,t.name " .
240       "FROM test as t,build2test as bt " .
241       "WHERE bt.buildid='$buildid' AND t.id=bt.testid " . $status . " " .
242       $filter_sql . " " .$limitnew.
243       "ORDER BY t.id" . $limit_sql;
244
245$result = pdo_query($sql);
246
247$numPassed = 0;
248$numFailed = 0;
249$numNotRun = 0;
250$numTimeFailed = 0;
251
252
253$columns = array();
254$getcolumnnumber=pdo_query("SELECT testmeasurement.name, COUNT(DISTINCT test.name) as xxx FROM test
255JOIN testmeasurement ON (test.id = testmeasurement.testid)
256JOIN build2test ON (build2test.testid = test.id)
257JOIN build ON (build.id = build2test.buildid)
258JOIN measurement ON (test.projectid=measurement.projectid AND testmeasurement.name=measurement.name)
259WHERE build.id='$buildid'
260AND measurement.testpage=1
261GROUP by testmeasurement.name
262"); // We need to keep the count of columns for correct column-data assign
263
264while($row=pdo_fetch_array($getcolumnnumber))
265  {
266  $xml .= add_XML_value("columnname",$row["name"])."\n";
267  $columns[]=$row["name"];
268  }
269
270$columncount=pdo_num_rows($getcolumnnumber);
271// If at least one column is selected
272$extras = "";
273if($onlypassed) $extras .= "AND build2test.status='passed'";
274elseif($onlyfailed) $extras .= "AND build2test.status='failed'";
275elseif($onlynotrun) $extras .= "AND build2test.status='notrun'";
276
277$getalltestlistsql="SELECT test.id
278  FROM test
279  JOIN build2test ON (build2test.testid = test.id)
280  JOIN build ON (build.id = build2test.buildid)
281  WHERE build.id='$buildid' $onlydelta_extra
282  $extras
283  ORDER BY test.id
284";
285
286// Allocate empty array for all possible measurements
287$tmpr = array();
288$getalltestlist=pdo_query($getalltestlistsql);
289while($row = pdo_fetch_array($getalltestlist))
290  {
291    for($i=0;$i<$columncount;$i++)
292      {
293      $tmpr[$row['id']][$columns[$i]]="";
294      }
295  }
296
297$etestquery = NULL;
298
299if($columncount>0)
300  {
301  $etestquery=pdo_query("SELECT test.id, test.projectid, build2test.buildid,
302  build2test.status, build2test.timestatus, test.name, testmeasurement.name,
303  testmeasurement.value, build.starttime,
304  build2test.time, measurement.testpage FROM test
305  JOIN testmeasurement ON (test.id = testmeasurement.testid)
306  JOIN build2test ON (build2test.testid = test.id)
307  JOIN build ON (build.id = build2test.buildid)
308  JOIN measurement ON (test.projectid=measurement.projectid AND testmeasurement.name=measurement.name)
309  WHERE build.id= '$buildid'
310  AND measurement.testpage=1 $onlydelta_extra
311  $extras
312  ORDER BY test.id, testmeasurement.name
313  ");
314  }
315
316
317if(@$_GET['export']=="csv") // If user wants to export as CSV file
318  {
319  header("Cache-Control: public");
320  header("Content-Description: File Transfer");
321  header("Content-Disposition: attachment; filename=testExport.csv"); // Prepare some headers to download
322  header("Content-Type: application/octet-stream;");
323  header("Content-Transfer-Encoding: binary");
324  $filecontent = "Name,Time,Details,Status,Time Status"; // Standard columns
325
326  // Store named measurements in an array
327  while($row = pdo_fetch_array($etestquery))
328    {
329    $etest[$row['id']][$row['name']]=$row['value'];
330    }
331
332  for($c=0;$c<count($columns);$c++)
333    {
334    $filecontent .= ",".$columns[$c]; // Add selected columns to the next
335    }
336  $filecontent .= "\n";
337
338  while($row = pdo_fetch_array($result))
339    {
340    $currentStatus = $row["status"];
341    $testName = $row["name"];
342
343    $filecontent .= "$testName,{$row["time"]},{$row["details"]},";
344
345    if($projectshowtesttime)
346      {
347      if($row["timestatus"] < $testtimemaxstatus)
348        {
349        $filecontent.="Passed,";
350        }
351      else
352        {
353        $filecontent.="Failed,";
354        }
355      } // end projectshowtesttime
356
357    switch($currentStatus)
358      {
359      case "passed":
360        $filecontent.="Passed,";
361        break;
362      case "failed":
363        $filecontent.="Failed,";
364        break;
365      case "notrun":
366        $filecontent.="Not Run,";
367        break;
368      }
369    // start writing test results
370    for($t=0;$t<count($columns);$t++) $filecontent .= $etest[$row['id']][$columns[$t]].",";
371    $filecontent .= "\n";
372    }
373  echo ($filecontent); // Start file download
374  die; // to suppress unwanted output
375  }
376$xml .= "<etests>\n"; // Start creating etests for each column with matching buildid, testname and the value.
377$i=0;
378$currentcolumn=-1;
379$prevtestid=0;
380$checkarray = array();
381
382// Overwrite the empty values with the correct ones if exists
383while($etestquery && $row=pdo_fetch_array($etestquery))
384  {
385  $tmpr[$row['id']][$row['name']]=$row['value'];
386  }
387
388// Write everything we have in the array
389foreach ($tmpr as $testid => $testname) {
390    foreach ($testname as $val) {
391        $xml .="<etest>\n";
392        $xml .= add_XML_value("name",key($testname));
393        $xml .= add_XML_value("testid", $testid);
394        $xml .= add_XML_value("value", $val);
395        $xml .= "\n</etest>\n";
396    }
397}
398
399
400$xml .= "</etests>\n";
401
402// Gather test info
403$xml .= "<tests>\n";
404
405// Find the time to run all the tests
406$time_array = pdo_fetch_array(pdo_query("SELECT SUM(time) FROM build2test WHERE buildid='$buildid'"));
407$time = $time_array[0];
408$xml .= add_XML_value("totaltime", time_difference($time,true,'',true));
409
410while($row = pdo_fetch_array($result))
411  {
412  $currentStatus = $row["status"];
413  $previousStatus;
414  $testName = $row["name"];
415
416  $xml .= "<test>\n";
417  $xml .= add_XML_value("name", $testName);
418  if($row["newstatus"])
419    {
420    $xml .= add_XML_value("new","1");
421    }
422  $xml .= add_XML_value("execTimeFull",$row["time"]);
423  $xml .= add_XML_value("execTime",  time_difference($row["time"],true,'',true));
424  $xml .= add_XML_value("details", $row["details"]);
425  $testdate = get_dashboard_date_from_build_starttime($build_array["starttime"],$nightlytime);
426  $summaryLink = "testSummary.php?project=$projectid&name=".urlencode($testName)."&date=$testdate";
427  $xml .= add_XML_value("summaryLink", $summaryLink);
428  $testid = $row["id"];
429  $detailsLink = "testDetails.php?test=$testid&build=$buildid";
430  $xml .= add_XML_value("detailsLink", $detailsLink);
431  $xml .= add_XML_value("id", $testid);
432
433  if($projectshowtesttime)
434    {
435    if($row["timestatus"] < $testtimemaxstatus)
436      {
437      $xml .= add_XML_value("timestatus", "Passed");
438      $xml .= add_XML_value("timestatusclass", "normal");
439      }
440    else
441      {
442      $xml .= add_XML_value("timestatus", "Failed");
443      $xml .= add_XML_value("timestatusclass", "error");
444      }
445    } // end projectshowtesttime
446
447  switch($currentStatus)
448    {
449    case "passed":
450      $xml .= add_XML_value("status", "Passed");
451      $xml .= add_XML_value("statusclass", "normal");
452      $numPassed++;
453      break;
454    case "failed":
455      $xml .= add_XML_value("status", "Failed");
456      $xml .= add_XML_value("statusclass", "error");
457      $numFailed++;
458      break;
459    case "notrun":
460      $xml .= add_XML_value("status", "Not Run");
461      $xml .= add_XML_value("statusclass", "warning");
462      $numNotRun++;
463      break;
464    }
465
466  if($row["timestatus"] >= $testtimemaxstatus)
467    {
468    $numTimeFailed++;
469    }
470
471  $testid = $row['id'];
472
473  $xml .= get_labels_xml_from_query_results(
474    "SELECT text FROM label, label2test WHERE ".
475    "label.id=label2test.labelid AND ".
476    "label2test.testid='$testid' AND ".
477    "label2test.buildid='$buildid' ".
478    "ORDER BY text ASC"
479    );
480
481  $xml .= "</test>\n";
482  }
483$xml .= "</tests>\n";
484$xml .= add_XML_value("numPassed", $numPassed);
485$xml .= add_XML_value("numFailed", $numFailed);
486$xml .= add_XML_value("numNotRun", $numNotRun);
487$xml .= add_XML_value("numTimeFailed", $numTimeFailed);
488
489$end = microtime_float();
490$xml .= "<generationtime>".round($end-$start,3)."</generationtime>";
491$xml .= "<columncount>$columncount</columncount>";
492$xml .= "</cdash>";
493// Now doing the xslt transition
494generate_XSLT($xml,"viewTest");
495?>
496