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"])."&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