function testBuildModel() { $this->startCodeCoverage(); $build = new Build(); $builderror = new BuildError(); $builderror->Type = 0; $builderror->Text = 'error'; $buildwarning = new BuildError(); $buildwarning->Type = 1; $buildwarning->Text = 'warning'; if ($build->GetName() !== false) { $this->fail("GetName didn't return false for empty build id"); return 1; } if ($build->GetLabels() !== false) { $this->fail("GetLabels didn't return false for empty build id"); return 1; } if ($build->GetGroup() !== false) { $this->fail("GetGroup didn't return false for empty build id"); return 1; } if ($build->GetNumberOfErrors() !== false) { $this->fail("GetNumberOfErrors didn't return false for empty build id"); return 1; } if ($build->GetNumberOfWarnings() !== false) { $this->fail("GetNumberOfWarnings didn't return false for empty build id"); return 1; } if ($build->SetSubProject('1234') !== false) { $this->fail("SetSubProject didn't return false for empty project id"); return 1; } if ($build->GetSubProjectName() !== false) { $this->fail("GetSubProjectName didn't return false for empty build id"); return 1; } if ($build->GetErrorDifferences() !== false) { $this->fail("GetErrorDifferences didn't return false for empty build id"); return 1; } if ($build->ComputeUpdateStatistics() !== false) { $this->fail("ComputeUpdateStatistics didn't return false for empty build id"); return 1; } if ($build->ComputeDifferences() !== false) { $this->fail("ComputeDifferences didn't return false for empty build id"); return 1; } if ($build->ComputeConfigureDifferences() !== false) { $this->fail("ComputeConfigureDifferences didn't return false for empty build id"); return 1; } if ($build->ComputeTestTiming() !== false) { $this->fail("ComputeTestTiming didn't return false for empty build id"); return 1; } if ($build->InsertLabelAssociations() !== false) { $this->fail("InsertLabelAssocations didn't return false for empty build id"); return 1; } if ($build->UpdateEndTime('2010-08-07') !== false) { $this->fail("UpdateEndTime didn't return false for empty build id"); return 1; } if ($build->SaveTotalTestsTime('100') !== false) { $this->fail("SaveTotalTestsTime didn't return false for empty build id"); return 1; } $build->Id = '1'; if ($build->ComputeTestTiming() !== false) { $this->fail("ComputeTestTiming didn't return false for empty project id"); return 1; } if ($build->ComputeUpdateStatistics() !== false) { $this->fail("ComputeUpdateStatistics didn't return false for empty project id"); return 1; } $build->ProjectId = '2'; $build->SiteId = '1'; $build->SetSubProject('8567'); if (strpos(file_get_contents($this->logfilename), "New subproject detected") === false) { $this->fail("'New subproject detected' not found in log after calling SetSubProject for invalid subproject id"); return 1; } if ($build->Exists() == false) { $this->fail("Exists returned false for a valid build id"); return 1; } $build->Id = '98765'; $build->SetStamp('20100610-1901-Experimental'); $build->Type = ''; //force this empty for coverage purposes $build->StartTime = '2009-12-18 14:19:11'; $build->EndTime = '2009-12-18 14:20:23'; $build->SubmitTime = '2012-01-25 16:43:11'; if ($build->Exists() == true) { $this->fail("Exists returned true for an invalid build id"); return 1; } $build->Save(); $build->Append = true; $build->InsertErrors = true; $build->AddError($builderror); $build->AddError($buildwarning); $build->Save(); $this->stopCodeCoverage(); return 0; }
/** Create a new build as a parent of $this and sets $this->ParentId. * Assumes many fields have been set prior to calling this function. **/ public function CreateParentBuild($numErrors, $numWarnings) { if ($numErrors < 0) { $numErrors = 0; } if ($numWarnings < 0) { $numWarnings = 0; } // Check if there's an existing build that should be the parent. // This would be a standalone build (parent=0) with no subproject // that matches our name, site, stamp, and projectid. $query = "SELECT id FROM build\n WHERE parentid = 0 AND name = '{$this->Name}' AND\n siteid = '{$this->SiteId}' AND stamp = '{$this->Stamp}' AND\n projectid = '{$this->ProjectId}'\n "; $result = pdo_query($query); if (pdo_num_rows($result) > 0) { $result_array = pdo_fetch_array($result); $this->SetParentId($result_array['id']); // Mark it as a parent (parentid of -1). pdo_query("UPDATE build SET parentid = -1 WHERE id = {$this->ParentId}"); } else { // Generate a UUID for the parent build. It is distinguished // from its children by the lack of SubProject (final parameter). $uuid = Build::GenerateUuid($this->Stamp, $this->Name, $this->SiteId, $this->ProjectId, ''); // Create the parent build here. Note how parent builds // are indicated by parentid == -1. $query = "INSERT INTO build\n (parentid, siteid, projectid, stamp, name, type, generator,\n starttime, endtime, submittime, builderrors, buildwarnings,\n uuid, changeid)\n VALUES\n ('-1', '{$this->SiteId}', '{$this->ProjectId}', '{$this->Stamp}',\n '{$this->Name}', '{$this->Type}', '{$this->Generator}',\n '{$this->StartTime}', '{$this->EndTime}', '{$this->SubmitTime}',\n {$numErrors}, {$numWarnings}, '{$uuid}', '{$this->PullRequest}')"; if (!pdo_query($query)) { // Check if somebody else beat us to creating this parent build. $existing_id_result = pdo_single_row_query("SELECT id FROM build WHERE uuid = '{$uuid}'"); if ($existing_id_result && array_key_exists('id', $existing_id_result)) { $this->SetParentId($existing_id_result['id']); return false; } else { add_last_sql_error('Build Insert Parent', $this->ProjectId, $this->Id); return false; } } if (!$this->ParentId) { $this->SetParentId(pdo_insert_id('build')); } } // Update the parent's tally of build errors & warnings. $this->UpdateBuild($this->ParentId, $numErrors, $numWarnings); // Give the parent a label for this build's subproject. $label = new Label(); $label->Text = $this->SubProjectName; $parent = new Build(); $parent->Id = $this->ParentId; $parent->AddLabel($label); $parent->InsertLabelAssociations(); // Since we just created a parent we should also update any existing // builds that should be a child of this parent but aren't yet. // This happens when Update.xml is parsed first, because it doesn't // contain info about what subproject it came from. // TODO: maybe we don't need this any more? $query = "UPDATE build SET parentid={$this->ParentId}\n WHERE parentid=0 AND siteid='{$this->SiteId}' AND\n name='{$this->Name}' AND stamp='{$this->Stamp}' AND\n projectid={$this->ProjectId}"; if (!pdo_query($query)) { add_last_sql_error('Build Insert Update Parent', $this->ProjectId, $this->ParentId); } return true; }