CTest: Provide more detailed information on resource allocation error

This commit is contained in:
Kyle Edwards 2020-02-24 11:41:06 -05:00
parent f0df3ed5b9
commit a5be3916ee
6 changed files with 72 additions and 4 deletions

View File

@ -197,7 +197,39 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test)
this->LockResources(test);
if (!this->ResourceAllocationErrors[test].empty()) {
testRun->StartFailure("Insufficient resources", "Failed to start");
std::ostringstream e;
e << "Insufficient resources for test " << this->Properties[test]->Name
<< ":\n\n";
for (auto const& it : this->ResourceAllocationErrors[test]) {
switch (it.second) {
case ResourceAllocationError::NoResourceType:
e << " Test requested resources of type '" << it.first
<< "' which does not exist\n";
break;
case ResourceAllocationError::InsufficientResources:
e << " Test requested resources of type '" << it.first
<< "' in the following amounts:\n";
for (auto const& group : this->Properties[test]->ResourceGroups) {
for (auto const& requirement : group) {
if (requirement.ResourceType == it.first) {
e << " " << requirement.SlotsNeeded
<< (requirement.SlotsNeeded == 1 ? " slot\n" : " slots\n");
}
}
}
e << " but only the following units were available:\n";
for (auto const& res :
this->ResourceAllocator.GetResources().at(it.first)) {
e << " '" << res.first << "': " << res.second.Total
<< (res.second.Total == 1 ? " slot\n" : " slots\n");
}
break;
}
e << "\n";
}
e << "Resource spec file:\n\n " << this->TestHandler->ResourceSpecFile;
testRun->StartFailure(e.str(), "Insufficient resources");
this->FinishTestProcess(testRun, false);
return false;
}

View File

@ -548,6 +548,7 @@ bool cmCTestTestHandler::ProcessOptions()
val = this->GetOption("ResourceSpecFile");
if (val) {
this->UseResourceSpec = true;
this->ResourceSpecFile = val;
auto result = this->ResourceSpec.ReadFromJSONFile(val);
if (result != cmCTestResourceSpec::ReadFileResult::READ_OK) {
cmCTestLog(this->CTest, ERROR_MESSAGE,

View File

@ -338,6 +338,7 @@ private:
bool UseResourceSpec;
cmCTestResourceSpec ResourceSpec;
std::string ResourceSpecFile;
void GenerateRegressionImages(cmXMLWriter& xml, const std::string& dart);
cmsys::RegularExpression DartStuff1;

View File

@ -1,4 +1,14 @@
^Insufficient resources
^Insufficient resources for test Test1:
Test requested resources of type 'fluxcapacitors' in the following amounts:
200 slots
but only the following units were available:
'outatime': 121 slots
Resource spec file:
[^
]*/Tests/RunCMake/CTestResourceAllocation/resspec.json
CMake Error at [^
]*/Tests/RunCMake/CTestResourceAllocation/notenough1-ctest-s-res/test\.cmake:[0-9]+ \(message\):
Tests did not pass$

View File

@ -1,4 +1,11 @@
^Insufficient resources
^Insufficient resources for test Test1:
Test requested resources of type 'terminators' which does not exist
Resource spec file:
[^
]*/Tests/RunCMake/CTestResourceAllocation/resspec.json
CMake Error at [^
]*/Tests/RunCMake/CTestResourceAllocation/notenough2-ctest-s-res/test\.cmake:[0-9]+ \(message\):
Tests did not pass$

View File

@ -1,4 +1,21 @@
^Insufficient resources
^Insufficient resources for test Test1:
Test requested resources of type 'widgets' in the following amounts:
12 slots
but only the following units were available:
'0': 4 slots
'1': 2 slots
'2': 4 slots
'3': 8 slots
'4': 1 slot
'5': 1 slot
'6': 1 slot
'7': 1 slot
Resource spec file:
[^
]*/Tests/RunCMake/CTestResourceAllocation/resspec.json
CMake Error at [^
]*/Tests/RunCMake/CTestResourceAllocation/notenough3-ctest-s-res/test\.cmake:[0-9]+ \(message\):
Tests did not pass$