From c544cb66984f16cc63ebace16ccd911adc550b9d Mon Sep 17 00:00:00 2001 From: Craig Scott Date: Tue, 5 Nov 2019 17:27:58 +1100 Subject: CTest: Rename hardware -> resources for source code --- Source/CMakeLists.txt | 4 +- Source/CTest/cmCTestBinPacker.cxx | 132 +++---- Source/CTest/cmCTestBinPacker.h | 10 +- Source/CTest/cmCTestHardwareAllocator.cxx | 86 ----- Source/CTest/cmCTestHardwareAllocator.h | 39 -- Source/CTest/cmCTestHardwareSpec.cxx | 133 ------- Source/CTest/cmCTestHardwareSpec.h | 40 -- Source/CTest/cmCTestMultiProcessHandler.cxx | 70 ++-- Source/CTest/cmCTestMultiProcessHandler.h | 28 +- Source/CTest/cmCTestResourceAllocator.cxx | 86 +++++ Source/CTest/cmCTestResourceAllocator.h | 39 ++ Source/CTest/cmCTestResourceSpec.cxx | 133 +++++++ Source/CTest/cmCTestResourceSpec.h | 40 ++ Source/CTest/cmCTestRunTest.cxx | 10 +- Source/CTest/cmCTestRunTest.h | 21 +- Source/CTest/cmCTestTestCommand.cxx | 6 +- Source/CTest/cmCTestTestCommand.h | 2 +- Source/CTest/cmCTestTestHandler.cxx | 12 +- Source/CTest/cmCTestTestHandler.h | 6 +- Tests/CMakeLib/CMakeLists.txt | 6 +- Tests/CMakeLib/testCTestBinPacker.cxx | 18 +- Tests/CMakeLib/testCTestHardwareAllocator.cxx | 426 --------------------- Tests/CMakeLib/testCTestHardwareSpec.cxx | 84 ---- .../CMakeLib/testCTestHardwareSpec_data/spec1.json | 23 -- .../testCTestHardwareSpec_data/spec10.json | 11 - .../testCTestHardwareSpec_data/spec11.json | 12 - .../testCTestHardwareSpec_data/spec12.json | 1 - .../testCTestHardwareSpec_data/spec13.json | 1 - .../testCTestHardwareSpec_data/spec14.json | 8 - .../testCTestHardwareSpec_data/spec15.json | 8 - .../testCTestHardwareSpec_data/spec16.json | 8 - .../testCTestHardwareSpec_data/spec17.json | 11 - .../testCTestHardwareSpec_data/spec18.json | 11 - .../CMakeLib/testCTestHardwareSpec_data/spec2.json | 4 - .../CMakeLib/testCTestHardwareSpec_data/spec3.json | 8 - .../CMakeLib/testCTestHardwareSpec_data/spec4.json | 4 - .../CMakeLib/testCTestHardwareSpec_data/spec5.json | 2 - .../CMakeLib/testCTestHardwareSpec_data/spec6.json | 5 - .../CMakeLib/testCTestHardwareSpec_data/spec7.json | 8 - .../CMakeLib/testCTestHardwareSpec_data/spec8.json | 9 - .../CMakeLib/testCTestHardwareSpec_data/spec9.json | 10 - Tests/CMakeLib/testCTestResourceAllocator.cxx | 426 +++++++++++++++++++++ Tests/CMakeLib/testCTestResourceSpec.cxx | 84 ++++ .../CMakeLib/testCTestResourceSpec_data/spec1.json | 23 ++ .../testCTestResourceSpec_data/spec10.json | 11 + .../testCTestResourceSpec_data/spec11.json | 12 + .../testCTestResourceSpec_data/spec12.json | 1 + .../testCTestResourceSpec_data/spec13.json | 1 + .../testCTestResourceSpec_data/spec14.json | 8 + .../testCTestResourceSpec_data/spec15.json | 8 + .../testCTestResourceSpec_data/spec16.json | 8 + .../testCTestResourceSpec_data/spec17.json | 11 + .../testCTestResourceSpec_data/spec18.json | 11 + .../CMakeLib/testCTestResourceSpec_data/spec2.json | 4 + .../CMakeLib/testCTestResourceSpec_data/spec3.json | 8 + .../CMakeLib/testCTestResourceSpec_data/spec4.json | 4 + .../CMakeLib/testCTestResourceSpec_data/spec5.json | 2 + .../CMakeLib/testCTestResourceSpec_data/spec6.json | 5 + .../CMakeLib/testCTestResourceSpec_data/spec7.json | 8 + .../CMakeLib/testCTestResourceSpec_data/spec8.json | 9 + .../CMakeLib/testCTestResourceSpec_data/spec9.json | 10 + .../RunCMake/CTestHardwareAllocation/cthwalloc.cxx | 34 +- 62 files changed, 1134 insertions(+), 1129 deletions(-) delete mode 100644 Source/CTest/cmCTestHardwareAllocator.cxx delete mode 100644 Source/CTest/cmCTestHardwareAllocator.h delete mode 100644 Source/CTest/cmCTestHardwareSpec.cxx delete mode 100644 Source/CTest/cmCTestHardwareSpec.h create mode 100644 Source/CTest/cmCTestResourceAllocator.cxx create mode 100644 Source/CTest/cmCTestResourceAllocator.h create mode 100644 Source/CTest/cmCTestResourceSpec.cxx create mode 100644 Source/CTest/cmCTestResourceSpec.h delete mode 100644 Tests/CMakeLib/testCTestHardwareAllocator.cxx delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec.cxx delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec1.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec10.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec11.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec12.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec13.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec14.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec15.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec16.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec17.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec18.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec2.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec3.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec4.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec5.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec6.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec7.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec8.json delete mode 100644 Tests/CMakeLib/testCTestHardwareSpec_data/spec9.json create mode 100644 Tests/CMakeLib/testCTestResourceAllocator.cxx create mode 100644 Tests/CMakeLib/testCTestResourceSpec.cxx create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec1.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec10.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec11.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec12.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec13.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec14.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec15.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec16.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec17.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec18.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec2.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec3.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec4.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec5.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec6.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec7.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec8.json create mode 100644 Tests/CMakeLib/testCTestResourceSpec_data/spec9.json diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 0ae3d2a..b5099b7 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -919,8 +919,8 @@ set(CTEST_SRCS cmCTest.cxx CTest/cmCTestEmptyBinaryDirectoryCommand.cxx CTest/cmCTestGenericHandler.cxx CTest/cmCTestHandlerCommand.cxx - CTest/cmCTestHardwareAllocator.cxx - CTest/cmCTestHardwareSpec.cxx + CTest/cmCTestResourceAllocator.cxx + CTest/cmCTestResourceSpec.cxx CTest/cmCTestLaunch.cxx CTest/cmCTestMemCheckCommand.cxx CTest/cmCTestMemCheckHandler.cxx diff --git a/Source/CTest/cmCTestBinPacker.cxx b/Source/CTest/cmCTestBinPacker.cxx index e9e3bee..e21b14d 100644 --- a/Source/CTest/cmCTestBinPacker.cxx +++ b/Source/CTest/cmCTestBinPacker.cxx @@ -23,7 +23,7 @@ namespace { /* * The following algorithm is used to do two things: * - * 1) Determine if a test's hardware requirements can fit within the hardware + * 1) Determine if a test's resource requirements can fit within the resources * present on the system, and * 2) Do the actual allocation * @@ -34,46 +34,46 @@ namespace { * more combinations can be tried. */ template -static bool AllocateCTestHardware( - const std::map& hardware, - const std::vector& hardwareSorted, std::size_t currentIndex, +static bool AllocateCTestResources( + const std::map& resources, + const std::vector& resourcesSorted, std::size_t currentIndex, std::vector& allocations) { // Iterate through all large enough resources until we find a solution - std::size_t hardwareIndex = 0; - while (hardwareIndex < hardwareSorted.size()) { - auto const& resource = hardware.at(hardwareSorted[hardwareIndex]); + std::size_t resourceIndex = 0; + while (resourceIndex < resourcesSorted.size()) { + auto const& resource = resources.at(resourcesSorted[resourceIndex]); if (resource.Free() >= static_cast(allocations[currentIndex]->SlotsNeeded)) { // Preemptively allocate the resource - allocations[currentIndex]->Id = hardwareSorted[hardwareIndex]; + allocations[currentIndex]->Id = resourcesSorted[resourceIndex]; if (currentIndex + 1 >= allocations.size()) { // We have a solution return true; } // Move the resource up the list until it is sorted again - auto hardware2 = hardware; - auto hardwareSorted2 = hardwareSorted; - hardware2[hardwareSorted2[hardwareIndex]].Locked += + auto resources2 = resources; + auto resourcesSorted2 = resourcesSorted; + resources2[resourcesSorted2[resourceIndex]].Locked += allocations[currentIndex]->SlotsNeeded; - AllocationStrategy::IncrementalSort(hardware2, hardwareSorted2, - hardwareIndex); + AllocationStrategy::IncrementalSort(resources2, resourcesSorted2, + resourceIndex); // Recurse one level deeper - if (AllocateCTestHardware( - hardware2, hardwareSorted2, currentIndex + 1, allocations)) { + if (AllocateCTestResources( + resources2, resourcesSorted2, currentIndex + 1, allocations)) { return true; } } // No solution found here, deallocate the resource and try the next one allocations[currentIndex]->Id.clear(); - auto freeSlots = hardware.at(hardwareSorted.at(hardwareIndex)).Free(); + auto freeSlots = resources.at(resourcesSorted.at(resourceIndex)).Free(); do { - ++hardwareIndex; - } while (hardwareIndex < hardwareSorted.size() && - hardware.at(hardwareSorted.at(hardwareIndex)).Free() == + ++resourceIndex; + } while (resourceIndex < resourcesSorted.size() && + resources.at(resourcesSorted.at(resourceIndex)).Free() == freeSlots); } @@ -82,8 +82,8 @@ static bool AllocateCTestHardware( } template -static bool AllocateCTestHardware( - const std::map& hardware, +static bool AllocateCTestResources( + const std::map& resources, std::vector& allocations) { // Sort the resource requirements in descending order by slots needed @@ -99,103 +99,105 @@ static bool AllocateCTestHardware( }); // Sort the resources according to sort strategy - std::vector hardwareSorted; - hardwareSorted.reserve(hardware.size()); - for (auto const& hw : hardware) { - hardwareSorted.push_back(hw.first); + std::vector resourcesSorted; + resourcesSorted.reserve(resources.size()); + for (auto const& res : resources) { + resourcesSorted.push_back(res.first); } - AllocationStrategy::InitialSort(hardware, hardwareSorted); + AllocationStrategy::InitialSort(resources, resourcesSorted); // Do the actual allocation - return AllocateCTestHardware( - hardware, hardwareSorted, std::size_t(0), allocationsPtr); + return AllocateCTestResources( + resources, resourcesSorted, std::size_t(0), allocationsPtr); } class RoundRobinAllocationStrategy { public: static void InitialSort( - const std::map& hardware, - std::vector& hardwareSorted); + const std::map& resources, + std::vector& resourcesSorted); static void IncrementalSort( - const std::map& hardware, - std::vector& hardwareSorted, std::size_t lastAllocatedIndex); + const std::map& resources, + std::vector& resourcesSorted, std::size_t lastAllocatedIndex); }; void RoundRobinAllocationStrategy::InitialSort( - const std::map& hardware, - std::vector& hardwareSorted) + const std::map& resources, + std::vector& resourcesSorted) { std::stable_sort( - hardwareSorted.rbegin(), hardwareSorted.rend(), - [&hardware](const std::string& id1, const std::string& id2) { - return hardware.at(id1).Free() < hardware.at(id2).Free(); + resourcesSorted.rbegin(), resourcesSorted.rend(), + [&resources](const std::string& id1, const std::string& id2) { + return resources.at(id1).Free() < resources.at(id2).Free(); }); } void RoundRobinAllocationStrategy::IncrementalSort( - const std::map& hardware, - std::vector& hardwareSorted, std::size_t lastAllocatedIndex) + const std::map& resources, + std::vector& resourcesSorted, std::size_t lastAllocatedIndex) { - auto tmp = hardwareSorted[lastAllocatedIndex]; + auto tmp = resourcesSorted[lastAllocatedIndex]; std::size_t i = lastAllocatedIndex; - while (i < hardwareSorted.size() - 1 && - hardware.at(hardwareSorted[i + 1]).Free() > hardware.at(tmp).Free()) { - hardwareSorted[i] = hardwareSorted[i + 1]; + while (i < resourcesSorted.size() - 1 && + resources.at(resourcesSorted[i + 1]).Free() > + resources.at(tmp).Free()) { + resourcesSorted[i] = resourcesSorted[i + 1]; ++i; } - hardwareSorted[i] = tmp; + resourcesSorted[i] = tmp; } class BlockAllocationStrategy { public: static void InitialSort( - const std::map& hardware, - std::vector& hardwareSorted); + const std::map& resources, + std::vector& resourcesSorted); static void IncrementalSort( - const std::map& hardware, - std::vector& hardwareSorted, std::size_t lastAllocatedIndex); + const std::map& resources, + std::vector& resourcesSorted, std::size_t lastAllocatedIndex); }; void BlockAllocationStrategy::InitialSort( - const std::map& hardware, - std::vector& hardwareSorted) + const std::map& resources, + std::vector& resourcesSorted) { std::stable_sort( - hardwareSorted.rbegin(), hardwareSorted.rend(), - [&hardware](const std::string& id1, const std::string& id2) { - return hardware.at(id1).Free() < hardware.at(id2).Free(); + resourcesSorted.rbegin(), resourcesSorted.rend(), + [&resources](const std::string& id1, const std::string& id2) { + return resources.at(id1).Free() < resources.at(id2).Free(); }); } void BlockAllocationStrategy::IncrementalSort( - const std::map&, - std::vector& hardwareSorted, std::size_t lastAllocatedIndex) + const std::map&, + std::vector& resourcesSorted, std::size_t lastAllocatedIndex) { - auto tmp = hardwareSorted[lastAllocatedIndex]; + auto tmp = resourcesSorted[lastAllocatedIndex]; std::size_t i = lastAllocatedIndex; while (i > 0) { - hardwareSorted[i] = hardwareSorted[i - 1]; + resourcesSorted[i] = resourcesSorted[i - 1]; --i; } - hardwareSorted[i] = tmp; + resourcesSorted[i] = tmp; } } -bool cmAllocateCTestHardwareRoundRobin( - const std::map& hardware, +bool cmAllocateCTestResourcesRoundRobin( + const std::map& resources, std::vector& allocations) { - return AllocateCTestHardware(hardware, - allocations); + return AllocateCTestResources(resources, + allocations); } -bool cmAllocateCTestHardwareBlock( - const std::map& hardware, +bool cmAllocateCTestResourcesBlock( + const std::map& resources, std::vector& allocations) { - return AllocateCTestHardware(hardware, allocations); + return AllocateCTestResources(resources, + allocations); } diff --git a/Source/CTest/cmCTestBinPacker.h b/Source/CTest/cmCTestBinPacker.h index 54f03d7..ff02b85 100644 --- a/Source/CTest/cmCTestBinPacker.h +++ b/Source/CTest/cmCTestBinPacker.h @@ -8,7 +8,7 @@ #include #include -#include "cmCTestHardwareAllocator.h" +#include "cmCTestResourceAllocator.h" struct cmCTestBinPackerAllocation { @@ -20,12 +20,12 @@ struct cmCTestBinPackerAllocation bool operator!=(const cmCTestBinPackerAllocation& other) const; }; -bool cmAllocateCTestHardwareRoundRobin( - const std::map& hardware, +bool cmAllocateCTestResourcesRoundRobin( + const std::map& resources, std::vector& allocations); -bool cmAllocateCTestHardwareBlock( - const std::map& hardware, +bool cmAllocateCTestResourcesBlock( + const std::map& resources, std::vector& allocations); #endif diff --git a/Source/CTest/cmCTestHardwareAllocator.cxx b/Source/CTest/cmCTestHardwareAllocator.cxx deleted file mode 100644 index 2d1833d..0000000 --- a/Source/CTest/cmCTestHardwareAllocator.cxx +++ /dev/null @@ -1,86 +0,0 @@ -/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying - file Copyright.txt or https://cmake.org/licensing for details. */ - -#include "cmCTestHardwareAllocator.h" - -#include -#include - -#include "cmCTestHardwareSpec.h" - -void cmCTestHardwareAllocator::InitializeFromHardwareSpec( - const cmCTestHardwareSpec& spec) -{ - this->Resources.clear(); - - for (auto const& it : spec.LocalSocket.Resources) { - auto& res = this->Resources[it.first]; - for (auto const& specRes : it.second) { - res[specRes.Id].Total = specRes.Capacity; - res[specRes.Id].Locked = 0; - } - } -} - -const std::map>& -cmCTestHardwareAllocator::GetResources() const -{ - return this->Resources; -} - -bool cmCTestHardwareAllocator::AllocateResource(const std::string& name, - const std::string& id, - unsigned int slots) -{ - auto it = this->Resources.find(name); - if (it == this->Resources.end()) { - return false; - } - - auto resIt = it->second.find(id); - if (resIt == it->second.end()) { - return false; - } - - if (resIt->second.Total < resIt->second.Locked + slots) { - return false; - } - - resIt->second.Locked += slots; - return true; -} - -bool cmCTestHardwareAllocator::DeallocateResource(const std::string& name, - const std::string& id, - unsigned int slots) -{ - auto it = this->Resources.find(name); - if (it == this->Resources.end()) { - return false; - } - - auto resIt = it->second.find(id); - if (resIt == it->second.end()) { - return false; - } - - if (resIt->second.Locked < slots) { - return false; - } - - resIt->second.Locked -= slots; - return true; -} - -bool cmCTestHardwareAllocator::Resource::operator==( - const Resource& other) const -{ - return this->Total == other.Total && this->Locked == other.Locked; -} - -bool cmCTestHardwareAllocator::Resource::operator!=( - const Resource& other) const -{ - return !(*this == other); -} diff --git a/Source/CTest/cmCTestHardwareAllocator.h b/Source/CTest/cmCTestHardwareAllocator.h deleted file mode 100644 index 441f84d..0000000 --- a/Source/CTest/cmCTestHardwareAllocator.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying - file Copyright.txt or https://cmake.org/licensing for details. */ -#ifndef cmCTestHardwareAllocator_h -#define cmCTestHardwareAllocator_h - -#include -#include - -class cmCTestHardwareSpec; - -class cmCTestHardwareAllocator -{ -public: - struct Resource - { - unsigned int Total; - unsigned int Locked; - - unsigned int Free() const { return this->Total - this->Locked; } - - bool operator==(const Resource& other) const; - bool operator!=(const Resource& other) const; - }; - - void InitializeFromHardwareSpec(const cmCTestHardwareSpec& spec); - - const std::map>& GetResources() - const; - - bool AllocateResource(const std::string& name, const std::string& id, - unsigned int slots); - bool DeallocateResource(const std::string& name, const std::string& id, - unsigned int slots); - -private: - std::map> Resources; -}; - -#endif diff --git a/Source/CTest/cmCTestHardwareSpec.cxx b/Source/CTest/cmCTestHardwareSpec.cxx deleted file mode 100644 index 137398a..0000000 --- a/Source/CTest/cmCTestHardwareSpec.cxx +++ /dev/null @@ -1,133 +0,0 @@ -/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying - file Copyright.txt or https://cmake.org/licensing for details. */ -#include "cmCTestHardwareSpec.h" - -#include -#include -#include -#include - -#include "cmsys/FStream.hxx" -#include "cmsys/RegularExpression.hxx" - -#include "cm_jsoncpp_reader.h" -#include "cm_jsoncpp_value.h" - -static const cmsys::RegularExpression IdentifierRegex{ "^[a-z_][a-z0-9_]*$" }; -static const cmsys::RegularExpression IdRegex{ "^[a-z0-9_]+$" }; - -bool cmCTestHardwareSpec::ReadFromJSONFile(const std::string& filename) -{ - cmsys::ifstream fin(filename.c_str()); - if (!fin) { - return false; - } - - Json::Value root; - Json::CharReaderBuilder builder; - if (!Json::parseFromStream(builder, fin, &root, nullptr)) { - return false; - } - - if (!root.isObject()) { - return false; - } - - auto const& local = root["local"]; - if (!local.isArray()) { - return false; - } - if (local.size() > 1) { - return false; - } - - if (local.empty()) { - this->LocalSocket.Resources.clear(); - return true; - } - - auto const& localSocket = local[0]; - if (!localSocket.isObject()) { - return false; - } - std::map> resources; - cmsys::RegularExpressionMatch match; - for (auto const& key : localSocket.getMemberNames()) { - if (IdentifierRegex.find(key.c_str(), match)) { - auto const& value = localSocket[key]; - auto& r = resources[key]; - if (value.isArray()) { - for (auto const& item : value) { - if (item.isObject()) { - cmCTestHardwareSpec::Resource resource; - - if (!item.isMember("id")) { - return false; - } - auto const& id = item["id"]; - if (!id.isString()) { - return false; - } - resource.Id = id.asString(); - if (!IdRegex.find(resource.Id.c_str(), match)) { - return false; - } - - if (item.isMember("slots")) { - auto const& capacity = item["slots"]; - if (!capacity.isConvertibleTo(Json::uintValue)) { - return false; - } - resource.Capacity = capacity.asUInt(); - } else { - resource.Capacity = 1; - } - - r.push_back(resource); - } else { - return false; - } - } - } else { - return false; - } - } - } - - this->LocalSocket.Resources = std::move(resources); - return true; -} - -bool cmCTestHardwareSpec::operator==(const cmCTestHardwareSpec& other) const -{ - return this->LocalSocket == other.LocalSocket; -} - -bool cmCTestHardwareSpec::operator!=(const cmCTestHardwareSpec& other) const -{ - return !(*this == other); -} - -bool cmCTestHardwareSpec::Socket::operator==( - const cmCTestHardwareSpec::Socket& other) const -{ - return this->Resources == other.Resources; -} - -bool cmCTestHardwareSpec::Socket::operator!=( - const cmCTestHardwareSpec::Socket& other) const -{ - return !(*this == other); -} - -bool cmCTestHardwareSpec::Resource::operator==( - const cmCTestHardwareSpec::Resource& other) const -{ - return this->Id == other.Id && this->Capacity == other.Capacity; -} - -bool cmCTestHardwareSpec::Resource::operator!=( - const cmCTestHardwareSpec::Resource& other) const -{ - return !(*this == other); -} diff --git a/Source/CTest/cmCTestHardwareSpec.h b/Source/CTest/cmCTestHardwareSpec.h deleted file mode 100644 index a0b4cae..0000000 --- a/Source/CTest/cmCTestHardwareSpec.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying - file Copyright.txt or https://cmake.org/licensing for details. */ -#ifndef cmCTestHardwareSpec_h -#define cmCTestHardwareSpec_h - -#include -#include -#include - -class cmCTestHardwareSpec -{ -public: - class Resource - { - public: - std::string Id; - unsigned int Capacity; - - bool operator==(const Resource& other) const; - bool operator!=(const Resource& other) const; - }; - - class Socket - { - public: - std::map> Resources; - - bool operator==(const Socket& other) const; - bool operator!=(const Socket& other) const; - }; - - Socket LocalSocket; - - bool ReadFromJSONFile(const std::string& filename); - - bool operator==(const cmCTestHardwareSpec& other) const; - bool operator!=(const cmCTestHardwareSpec& other) const; -}; - -#endif diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx index df36aa2..02d396e 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.cxx +++ b/Source/CTest/cmCTestMultiProcessHandler.cxx @@ -140,7 +140,7 @@ void cmCTestMultiProcessHandler::RunTests() assert(this->Completed == this->Total); assert(this->Tests.empty()); } - assert(this->AllHardwareAvailable()); + assert(this->AllResourcesAvailable()); this->MarkFinished(); this->UpdateCostData(); @@ -177,9 +177,9 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test) } testRun->SetIndex(test); testRun->SetTestProperties(this->Properties[test]); - if (this->TestHandler->UseHardwareSpec) { - testRun->SetUseAllocatedHardware(true); - testRun->SetAllocatedHardware(this->AllocatedHardware[test]); + if (this->TestHandler->UseResourceSpec) { + testRun->SetUseAllocatedResources(true); + testRun->SetAllocatedResources(this->AllocatedResources[test]); } // Find any failed dependencies for this test. We assume the more common @@ -194,7 +194,7 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test) // working directory because FinishTestProcess() will try to unlock them this->LockResources(test); - if (!this->TestsHaveSufficientHardware[test]) { + if (!this->TestsHaveSufficientResources[test]) { testRun->StartFailure("Insufficient resources"); this->FinishTestProcess(testRun, false); return false; @@ -218,26 +218,26 @@ bool cmCTestMultiProcessHandler::StartTestProcess(int test) return false; } -bool cmCTestMultiProcessHandler::AllocateHardware(int index) +bool cmCTestMultiProcessHandler::AllocateResources(int index) { - if (!this->TestHandler->UseHardwareSpec) { + if (!this->TestHandler->UseResourceSpec) { return true; } std::map> allocations; - if (!this->TryAllocateHardware(index, allocations)) { + if (!this->TryAllocateResources(index, allocations)) { return false; } - auto& allocatedHardware = this->AllocatedHardware[index]; - allocatedHardware.resize(this->Properties[index]->ResourceGroups.size()); + auto& allocatedResources = this->AllocatedResources[index]; + allocatedResources.resize(this->Properties[index]->ResourceGroups.size()); for (auto const& it : allocations) { for (auto const& alloc : it.second) { - bool result = this->HardwareAllocator.AllocateResource( + bool result = this->ResourceAllocator.AllocateResource( it.first, alloc.Id, alloc.SlotsNeeded); (void)result; assert(result); - allocatedHardware[alloc.ProcessIndex][it.first].push_back( + allocatedResources[alloc.ProcessIndex][it.first].push_back( { alloc.Id, static_cast(alloc.SlotsNeeded) }); } } @@ -245,7 +245,7 @@ bool cmCTestMultiProcessHandler::AllocateHardware(int index) return true; } -bool cmCTestMultiProcessHandler::TryAllocateHardware( +bool cmCTestMultiProcessHandler::TryAllocateResources( int index, std::map>& allocations) { @@ -262,13 +262,13 @@ bool cmCTestMultiProcessHandler::TryAllocateHardware( ++processIndex; } - auto const& availableHardware = this->HardwareAllocator.GetResources(); + auto const& availableResources = this->ResourceAllocator.GetResources(); for (auto& it : allocations) { - if (!availableHardware.count(it.first)) { + if (!availableResources.count(it.first)) { return false; } - if (!cmAllocateCTestHardwareRoundRobin(availableHardware.at(it.first), - it.second)) { + if (!cmAllocateCTestResourcesRoundRobin(availableResources.at(it.first), + it.second)) { return false; } } @@ -276,19 +276,19 @@ bool cmCTestMultiProcessHandler::TryAllocateHardware( return true; } -void cmCTestMultiProcessHandler::DeallocateHardware(int index) +void cmCTestMultiProcessHandler::DeallocateResources(int index) { - if (!this->TestHandler->UseHardwareSpec) { + if (!this->TestHandler->UseResourceSpec) { return; } { - auto& allocatedHardware = this->AllocatedHardware[index]; - for (auto const& processAlloc : allocatedHardware) { + auto& allocatedResources = this->AllocatedResources[index]; + for (auto const& processAlloc : allocatedResources) { for (auto const& it : processAlloc) { auto resourceType = it.first; for (auto const& it2 : it.second) { - bool success = this->HardwareAllocator.DeallocateResource( + bool success = this->ResourceAllocator.DeallocateResource( resourceType, it2.Id, it2.Slots); (void)success; assert(success); @@ -296,12 +296,12 @@ void cmCTestMultiProcessHandler::DeallocateHardware(int index) } } } - this->AllocatedHardware.erase(index); + this->AllocatedResources.erase(index); } -bool cmCTestMultiProcessHandler::AllHardwareAvailable() +bool cmCTestMultiProcessHandler::AllResourcesAvailable() { - for (auto const& it : this->HardwareAllocator.GetResources()) { + for (auto const& it : this->ResourceAllocator.GetResources()) { for (auto const& it2 : it.second) { if (it2.second.Locked != 0) { return false; @@ -312,13 +312,13 @@ bool cmCTestMultiProcessHandler::AllHardwareAvailable() return true; } -void cmCTestMultiProcessHandler::CheckHardwareAvailable() +void cmCTestMultiProcessHandler::CheckResourcesAvailable() { for (auto test : this->SortedTests) { std::map> allocations; - this->TestsHaveSufficientHardware[test] = - !this->TestHandler->UseHardwareSpec || - this->TryAllocateHardware(test, allocations); + this->TestsHaveSufficientResources[test] = + !this->TestHandler->UseResourceSpec || + this->TryAllocateResources(test, allocations); } } @@ -404,10 +404,10 @@ bool cmCTestMultiProcessHandler::StartTest(int test) } } - // Allocate hardware - if (this->TestsHaveSufficientHardware[test] && - !this->AllocateHardware(test)) { - this->DeallocateHardware(test); + // Allocate resources + if (this->TestsHaveSufficientResources[test] && + !this->AllocateResources(test)) { + this->DeallocateResources(test); return false; } @@ -417,7 +417,7 @@ bool cmCTestMultiProcessHandler::StartTest(int test) } // This test was not able to start because it is waiting // on depends to run - this->DeallocateHardware(test); + this->DeallocateResources(test); return false; } @@ -602,7 +602,7 @@ void cmCTestMultiProcessHandler::FinishTestProcess(cmCTestRunTest* runner, this->TestFinishMap[test] = true; this->TestRunningMap[test] = false; this->WriteCheckpoint(test); - this->DeallocateHardware(test); + this->DeallocateResources(test); this->UnlockResources(test); this->RunningCount -= GetProcessorsUsed(test); diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h index f0ffdbb..1db4bfd 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.h +++ b/Source/CTest/cmCTestMultiProcessHandler.h @@ -14,13 +14,13 @@ #include "cm_uv.h" -#include "cmCTestHardwareAllocator.h" +#include "cmCTestResourceAllocator.h" #include "cmCTestTestHandler.h" #include "cmUVHandlePtr.h" class cmCTest; struct cmCTestBinPackerAllocation; -class cmCTestHardwareSpec; +class cmCTestResourceSpec; class cmCTestRunTest; /** \class cmCTestMultiProcessHandler @@ -47,7 +47,7 @@ public: : public std::map { }; - struct HardwareAllocation + struct ResourceAllocation { std::string Id; unsigned int Slots; @@ -87,12 +87,12 @@ public: void SetQuiet(bool b) { this->Quiet = b; } - void InitHardwareAllocator(const cmCTestHardwareSpec& spec) + void InitResourceAllocator(const cmCTestResourceSpec& spec) { - this->HardwareAllocator.InitializeFromHardwareSpec(spec); + this->ResourceAllocator.InitializeFromResourceSpec(spec); } - void CheckHardwareAvailable(); + void CheckResourcesAvailable(); protected: // Start the next test or tests as many as are allowed by @@ -137,13 +137,13 @@ protected: void LockResources(int index); void UnlockResources(int index); - bool AllocateHardware(int index); - bool TryAllocateHardware( + bool AllocateResources(int index); + bool TryAllocateResources( int index, std::map>& allocations); - void DeallocateHardware(int index); - bool AllHardwareAvailable(); + void DeallocateResources(int index); + bool AllResourcesAvailable(); // map from test number to set of depend tests TestMap Tests; @@ -166,10 +166,10 @@ protected: std::vector LastTestsFailed; std::set LockedResources; std::map>>> - AllocatedHardware; - std::map TestsHaveSufficientHardware; - cmCTestHardwareAllocator HardwareAllocator; + std::vector>>> + AllocatedResources; + std::map TestsHaveSufficientResources; + cmCTestResourceAllocator ResourceAllocator; std::vector* TestResults; size_t ParallelLevel; // max number of process that can be run at once unsigned long TestLoad; diff --git a/Source/CTest/cmCTestResourceAllocator.cxx b/Source/CTest/cmCTestResourceAllocator.cxx new file mode 100644 index 0000000..9d468a7 --- /dev/null +++ b/Source/CTest/cmCTestResourceAllocator.cxx @@ -0,0 +1,86 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ + +#include "cmCTestResourceAllocator.h" + +#include +#include + +#include "cmCTestResourceSpec.h" + +void cmCTestResourceAllocator::InitializeFromResourceSpec( + const cmCTestResourceSpec& spec) +{ + this->Resources.clear(); + + for (auto const& it : spec.LocalSocket.Resources) { + auto& res = this->Resources[it.first]; + for (auto const& specRes : it.second) { + res[specRes.Id].Total = specRes.Capacity; + res[specRes.Id].Locked = 0; + } + } +} + +const std::map>& +cmCTestResourceAllocator::GetResources() const +{ + return this->Resources; +} + +bool cmCTestResourceAllocator::AllocateResource(const std::string& name, + const std::string& id, + unsigned int slots) +{ + auto it = this->Resources.find(name); + if (it == this->Resources.end()) { + return false; + } + + auto resIt = it->second.find(id); + if (resIt == it->second.end()) { + return false; + } + + if (resIt->second.Total < resIt->second.Locked + slots) { + return false; + } + + resIt->second.Locked += slots; + return true; +} + +bool cmCTestResourceAllocator::DeallocateResource(const std::string& name, + const std::string& id, + unsigned int slots) +{ + auto it = this->Resources.find(name); + if (it == this->Resources.end()) { + return false; + } + + auto resIt = it->second.find(id); + if (resIt == it->second.end()) { + return false; + } + + if (resIt->second.Locked < slots) { + return false; + } + + resIt->second.Locked -= slots; + return true; +} + +bool cmCTestResourceAllocator::Resource::operator==( + const Resource& other) const +{ + return this->Total == other.Total && this->Locked == other.Locked; +} + +bool cmCTestResourceAllocator::Resource::operator!=( + const Resource& other) const +{ + return !(*this == other); +} diff --git a/Source/CTest/cmCTestResourceAllocator.h b/Source/CTest/cmCTestResourceAllocator.h new file mode 100644 index 0000000..9f0b9c9 --- /dev/null +++ b/Source/CTest/cmCTestResourceAllocator.h @@ -0,0 +1,39 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmCTestResourceAllocator_h +#define cmCTestResourceAllocator_h + +#include +#include + +class cmCTestResourceSpec; + +class cmCTestResourceAllocator +{ +public: + struct Resource + { + unsigned int Total; + unsigned int Locked; + + unsigned int Free() const { return this->Total - this->Locked; } + + bool operator==(const Resource& other) const; + bool operator!=(const Resource& other) const; + }; + + void InitializeFromResourceSpec(const cmCTestResourceSpec& spec); + + const std::map>& GetResources() + const; + + bool AllocateResource(const std::string& name, const std::string& id, + unsigned int slots); + bool DeallocateResource(const std::string& name, const std::string& id, + unsigned int slots); + +private: + std::map> Resources; +}; + +#endif diff --git a/Source/CTest/cmCTestResourceSpec.cxx b/Source/CTest/cmCTestResourceSpec.cxx new file mode 100644 index 0000000..b4a2b30 --- /dev/null +++ b/Source/CTest/cmCTestResourceSpec.cxx @@ -0,0 +1,133 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#include "cmCTestResourceSpec.h" + +#include +#include +#include +#include + +#include "cmsys/FStream.hxx" +#include "cmsys/RegularExpression.hxx" + +#include "cm_jsoncpp_reader.h" +#include "cm_jsoncpp_value.h" + +static const cmsys::RegularExpression IdentifierRegex{ "^[a-z_][a-z0-9_]*$" }; +static const cmsys::RegularExpression IdRegex{ "^[a-z0-9_]+$" }; + +bool cmCTestResourceSpec::ReadFromJSONFile(const std::string& filename) +{ + cmsys::ifstream fin(filename.c_str()); + if (!fin) { + return false; + } + + Json::Value root; + Json::CharReaderBuilder builder; + if (!Json::parseFromStream(builder, fin, &root, nullptr)) { + return false; + } + + if (!root.isObject()) { + return false; + } + + auto const& local = root["local"]; + if (!local.isArray()) { + return false; + } + if (local.size() > 1) { + return false; + } + + if (local.empty()) { + this->LocalSocket.Resources.clear(); + return true; + } + + auto const& localSocket = local[0]; + if (!localSocket.isObject()) { + return false; + } + std::map> resources; + cmsys::RegularExpressionMatch match; + for (auto const& key : localSocket.getMemberNames()) { + if (IdentifierRegex.find(key.c_str(), match)) { + auto const& value = localSocket[key]; + auto& r = resources[key]; + if (value.isArray()) { + for (auto const& item : value) { + if (item.isObject()) { + cmCTestResourceSpec::Resource resource; + + if (!item.isMember("id")) { + return false; + } + auto const& id = item["id"]; + if (!id.isString()) { + return false; + } + resource.Id = id.asString(); + if (!IdRegex.find(resource.Id.c_str(), match)) { + return false; + } + + if (item.isMember("slots")) { + auto const& capacity = item["slots"]; + if (!capacity.isConvertibleTo(Json::uintValue)) { + return false; + } + resource.Capacity = capacity.asUInt(); + } else { + resource.Capacity = 1; + } + + r.push_back(resource); + } else { + return false; + } + } + } else { + return false; + } + } + } + + this->LocalSocket.Resources = std::move(resources); + return true; +} + +bool cmCTestResourceSpec::operator==(const cmCTestResourceSpec& other) const +{ + return this->LocalSocket == other.LocalSocket; +} + +bool cmCTestResourceSpec::operator!=(const cmCTestResourceSpec& other) const +{ + return !(*this == other); +} + +bool cmCTestResourceSpec::Socket::operator==( + const cmCTestResourceSpec::Socket& other) const +{ + return this->Resources == other.Resources; +} + +bool cmCTestResourceSpec::Socket::operator!=( + const cmCTestResourceSpec::Socket& other) const +{ + return !(*this == other); +} + +bool cmCTestResourceSpec::Resource::operator==( + const cmCTestResourceSpec::Resource& other) const +{ + return this->Id == other.Id && this->Capacity == other.Capacity; +} + +bool cmCTestResourceSpec::Resource::operator!=( + const cmCTestResourceSpec::Resource& other) const +{ + return !(*this == other); +} diff --git a/Source/CTest/cmCTestResourceSpec.h b/Source/CTest/cmCTestResourceSpec.h new file mode 100644 index 0000000..4646db8 --- /dev/null +++ b/Source/CTest/cmCTestResourceSpec.h @@ -0,0 +1,40 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmCTestResourceSpec_h +#define cmCTestResourceSpec_h + +#include +#include +#include + +class cmCTestResourceSpec +{ +public: + class Resource + { + public: + std::string Id; + unsigned int Capacity; + + bool operator==(const Resource& other) const; + bool operator!=(const Resource& other) const; + }; + + class Socket + { + public: + std::map> Resources; + + bool operator==(const Socket& other) const; + bool operator!=(const Socket& other) const; + }; + + Socket LocalSocket; + + bool ReadFromJSONFile(const std::string& filename); + + bool operator==(const cmCTestResourceSpec& other) const; + bool operator!=(const cmCTestResourceSpec& other) const; +}; + +#endif diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx index 91eeb71..3091050 100644 --- a/Source/CTest/cmCTestRunTest.cxx +++ b/Source/CTest/cmCTestRunTest.cxx @@ -690,8 +690,8 @@ bool cmCTestRunTest::ForkProcess(cmDuration testTimeOut, bool explicitTimeout, cmSystemTools::AppendEnv(*environment); } - if (this->UseAllocatedHardware) { - this->SetupHardwareEnvironment(); + if (this->UseAllocatedResources) { + this->SetupResourcesEnvironment(); } else { cmSystemTools::UnsetEnv("CTEST_RESOURCE_GROUP_COUNT"); } @@ -700,14 +700,14 @@ bool cmCTestRunTest::ForkProcess(cmDuration testTimeOut, bool explicitTimeout, affinity); } -void cmCTestRunTest::SetupHardwareEnvironment() +void cmCTestRunTest::SetupResourcesEnvironment() { std::string processCount = "CTEST_RESOURCE_GROUP_COUNT="; - processCount += std::to_string(this->AllocatedHardware.size()); + processCount += std::to_string(this->AllocatedResources.size()); cmSystemTools::PutEnv(processCount); std::size_t i = 0; - for (auto const& process : this->AllocatedHardware) { + for (auto const& process : this->AllocatedResources) { std::string prefix = "CTEST_RESOURCE_GROUP_"; prefix += std::to_string(i); std::string resourceList = prefix + '='; diff --git a/Source/CTest/cmCTestRunTest.h b/Source/CTest/cmCTestRunTest.h index 085a6b8..f781c7a 100644 --- a/Source/CTest/cmCTestRunTest.h +++ b/Source/CTest/cmCTestRunTest.h @@ -84,14 +84,17 @@ public: bool TimedOutForStopTime() const { return this->TimeoutIsForStopTime; } - void SetUseAllocatedHardware(bool use) { this->UseAllocatedHardware = use; } - void SetAllocatedHardware( + void SetUseAllocatedResources(bool use) + { + this->UseAllocatedResources = use; + } + void SetAllocatedResources( const std::vector< std::map>>& - hardware) + std::vector>>& + resources) { - this->AllocatedHardware = hardware; + this->AllocatedResources = resources; } private: @@ -105,7 +108,7 @@ private: // Run post processing of the process output for MemCheck void MemCheckPostProcess(); - void SetupHardwareEnvironment(); + void SetupResourcesEnvironment(); // Returns "completed/total Test #Index: " std::string GetTestPrefix(size_t completed, size_t total) const; @@ -125,10 +128,10 @@ private: std::string StartTime; std::string ActualCommand; std::vector Arguments; - bool UseAllocatedHardware = false; + bool UseAllocatedResources = false; std::vector>> - AllocatedHardware; + std::string, std::vector>> + AllocatedResources; bool RunUntilFail; int NumberOfRunsLeft; bool RunAgain; diff --git a/Source/CTest/cmCTestTestCommand.cxx b/Source/CTest/cmCTestTestCommand.cxx index f17ed86..9784214 100644 --- a/Source/CTest/cmCTestTestCommand.cxx +++ b/Source/CTest/cmCTestTestCommand.cxx @@ -32,7 +32,7 @@ void cmCTestTestCommand::BindArguments() this->Bind("SCHEDULE_RANDOM"_s, this->ScheduleRandom); this->Bind("STOP_TIME"_s, this->StopTime); this->Bind("TEST_LOAD"_s, this->TestLoad); - this->Bind("RESOURCE_SPEC_FILE"_s, this->HardwareSpecFile); + this->Bind("RESOURCE_SPEC_FILE"_s, this->ResourceSpecFile); } cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler() @@ -88,8 +88,8 @@ cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler() if (!this->ScheduleRandom.empty()) { handler->SetOption("ScheduleRandom", this->ScheduleRandom.c_str()); } - if (!this->HardwareSpecFile.empty()) { - handler->SetOption("ResourceSpecFile", this->HardwareSpecFile.c_str()); + if (!this->ResourceSpecFile.empty()) { + handler->SetOption("ResourceSpecFile", this->ResourceSpecFile.c_str()); } if (!this->StopTime.empty()) { this->CTest->SetStopTime(this->StopTime); diff --git a/Source/CTest/cmCTestTestCommand.h b/Source/CTest/cmCTestTestCommand.h index dc15279..4019694 100644 --- a/Source/CTest/cmCTestTestCommand.h +++ b/Source/CTest/cmCTestTestCommand.h @@ -58,7 +58,7 @@ protected: std::string ScheduleRandom; std::string StopTime; std::string TestLoad; - std::string HardwareSpecFile; + std::string ResourceSpecFile; }; #endif diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx index 2220074..8e3ac22 100644 --- a/Source/CTest/cmCTestTestHandler.cxx +++ b/Source/CTest/cmCTestTestHandler.cxx @@ -289,7 +289,7 @@ cmCTestTestHandler::cmCTestTestHandler() this->UseIncludeRegExpFlag = false; this->UseExcludeRegExpFlag = false; this->UseExcludeRegExpFirst = false; - this->UseHardwareSpec = false; + this->UseResourceSpec = false; this->CustomMaximumPassedTestOutputSize = 1 * 1024; this->CustomMaximumFailedTestOutputSize = 300 * 1024; @@ -512,8 +512,8 @@ bool cmCTestTestHandler::ProcessOptions() val = this->GetOption("ResourceSpecFile"); if (val) { - this->UseHardwareSpec = true; - if (!this->HardwareSpec.ReadFromJSONFile(val)) { + this->UseResourceSpec = true; + if (!this->ResourceSpec.ReadFromJSONFile(val)) { cmCTestLog(this->CTest, ERROR_MESSAGE, "Could not read resource spec file: " << val << std::endl); return false; @@ -1237,8 +1237,8 @@ void cmCTestTestHandler::ProcessDirectory(std::vector& passed, } else { parallel->SetTestLoad(this->CTest->GetTestLoad()); } - if (this->UseHardwareSpec) { - parallel->InitHardwareAllocator(this->HardwareSpec); + if (this->UseResourceSpec) { + parallel->InitResourceAllocator(this->ResourceSpec); } *this->LogFile @@ -1283,7 +1283,7 @@ void cmCTestTestHandler::ProcessDirectory(std::vector& passed, parallel->SetPassFailVectors(&passed, &failed); this->TestResults.clear(); parallel->SetTestResults(&this->TestResults); - parallel->CheckHardwareAvailable(); + parallel->CheckResourcesAvailable(); if (this->CTest->ShouldPrintLabels()) { parallel->PrintLabels(); diff --git a/Source/CTest/cmCTestTestHandler.h b/Source/CTest/cmCTestTestHandler.h index e2fde42..eab75d0 100644 --- a/Source/CTest/cmCTestTestHandler.h +++ b/Source/CTest/cmCTestTestHandler.h @@ -19,7 +19,7 @@ #include "cmsys/RegularExpression.hxx" #include "cmCTestGenericHandler.h" -#include "cmCTestHardwareSpec.h" +#include "cmCTestResourceSpec.h" #include "cmDuration.h" #include "cmListFileCache.h" @@ -336,8 +336,8 @@ private: cmsys::RegularExpression IncludeTestsRegularExpression; cmsys::RegularExpression ExcludeTestsRegularExpression; - bool UseHardwareSpec; - cmCTestHardwareSpec HardwareSpec; + bool UseResourceSpec; + cmCTestResourceSpec ResourceSpec; void GenerateRegressionImages(cmXMLWriter& xml, const std::string& dart); cmsys::RegularExpression DartStuff1; diff --git a/Tests/CMakeLib/CMakeLists.txt b/Tests/CMakeLib/CMakeLists.txt index 8e11fdf..840afc1 100644 --- a/Tests/CMakeLib/CMakeLists.txt +++ b/Tests/CMakeLib/CMakeLists.txt @@ -8,8 +8,8 @@ include_directories( set(CMakeLib_TESTS testArgumentParser.cxx testCTestBinPacker.cxx - testCTestHardwareAllocator.cxx - testCTestHardwareSpec.cxx + testCTestResourceAllocator.cxx + testCTestResourceSpec.cxx testCTestResourceGroups.cxx testGeneratedFileStream.cxx testRST.cxx @@ -32,7 +32,7 @@ add_executable(testUVProcessChainHelper testUVProcessChainHelper.cxx) set(testRST_ARGS ${CMAKE_CURRENT_SOURCE_DIR}) set(testUVProcessChain_ARGS $) set(testUVStreambuf_ARGS $) -set(testCTestHardwareSpec_ARGS ${CMAKE_CURRENT_SOURCE_DIR}) +set(testCTestResourceSpec_ARGS ${CMAKE_CURRENT_SOURCE_DIR}) if(WIN32) list(APPEND CMakeLib_TESTS diff --git a/Tests/CMakeLib/testCTestBinPacker.cxx b/Tests/CMakeLib/testCTestBinPacker.cxx index 62ea55b..6f09af2 100644 --- a/Tests/CMakeLib/testCTestBinPacker.cxx +++ b/Tests/CMakeLib/testCTestBinPacker.cxx @@ -5,12 +5,12 @@ #include #include "cmCTestBinPacker.h" -#include "cmCTestHardwareAllocator.h" +#include "cmCTestResourceAllocator.h" struct ExpectedPackResult { std::vector SlotsNeeded; - std::map Hardware; + std::map Resources; bool ExpectedReturnValue; std::vector ExpectedRoundRobinAllocations; std::vector ExpectedBlockAllocations; @@ -233,18 +233,18 @@ bool TestExpectedPackResult(const ExpectedPackResult& expected) roundRobinAllocations.push_back({ index++, n, "" }); } - bool roundRobinResult = cmAllocateCTestHardwareRoundRobin( - expected.Hardware, roundRobinAllocations); + bool roundRobinResult = cmAllocateCTestResourcesRoundRobin( + expected.Resources, roundRobinAllocations); if (roundRobinResult != expected.ExpectedReturnValue) { std::cout - << "cmAllocateCTestHardwareRoundRobin did not return expected value" + << "cmAllocateCTestResourcesRoundRobin did not return expected value" << std::endl; return false; } if (roundRobinResult && roundRobinAllocations != expected.ExpectedRoundRobinAllocations) { - std::cout << "cmAllocateCTestHardwareRoundRobin did not return expected " + std::cout << "cmAllocateCTestResourcesRoundRobin did not return expected " "allocations" << std::endl; return false; @@ -258,15 +258,15 @@ bool TestExpectedPackResult(const ExpectedPackResult& expected) } bool blockResult = - cmAllocateCTestHardwareBlock(expected.Hardware, blockAllocations); + cmAllocateCTestResourcesBlock(expected.Resources, blockAllocations); if (blockResult != expected.ExpectedReturnValue) { - std::cout << "cmAllocateCTestHardwareBlock did not return expected value" + std::cout << "cmAllocateCTestResourcesBlock did not return expected value" << std::endl; return false; } if (blockResult && blockAllocations != expected.ExpectedBlockAllocations) { - std::cout << "cmAllocateCTestHardwareBlock did not return expected" + std::cout << "cmAllocateCTestResourcesBlock did not return expected" " allocations" << std::endl; return false; diff --git a/Tests/CMakeLib/testCTestHardwareAllocator.cxx b/Tests/CMakeLib/testCTestHardwareAllocator.cxx deleted file mode 100644 index 6f05d03..0000000 --- a/Tests/CMakeLib/testCTestHardwareAllocator.cxx +++ /dev/null @@ -1,426 +0,0 @@ -#include -#include -#include -#include - -#include "cmCTestHardwareAllocator.h" -#include "cmCTestHardwareSpec.h" - -static const cmCTestHardwareSpec spec{ { { - /* clang-format off */ - { "gpus", { { "0", 4 }, { "1", 8 }, { "2", 0 }, { "3", 8 } } }, - /* clang-format on */ -} } }; - -bool testInitializeFromHardwareSpec() -{ - bool retval = true; - - cmCTestHardwareAllocator allocator; - allocator.InitializeFromHardwareSpec(spec); - - static const std::map< - std::string, std::map> - expected{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 0 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.GetResources() != expected) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - return retval; -} - -bool testAllocateResource() -{ - bool retval = true; - - cmCTestHardwareAllocator allocator; - allocator.InitializeFromHardwareSpec(spec); - - static const std::map< - std::string, std::map> - expected1{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 2 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (!allocator.AllocateResource("gpus", "0", 2)) { - std::cout - << "AllocateResource(\"gpus\", \"0\", 2) returned false, should be " - "true\n"; - retval = false; - } - if (allocator.GetResources() != expected1) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected2{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 4 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (!allocator.AllocateResource("gpus", "0", 2)) { - std::cout - << "AllocateResource(\"gpus\", \"0\", 2) returned false, should be " - "true\n"; - retval = false; - } - if (allocator.GetResources() != expected2) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected3{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 4 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.AllocateResource("gpus", "0", 1)) { - std::cout - << "AllocateResource(\"gpus\", \"0\", 1) returned true, should be " - "false\n"; - retval = false; - } - if (allocator.GetResources() != expected3) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected4{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 4 } }, - { "1", { 8, 7 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (!allocator.AllocateResource("gpus", "1", 7)) { - std::cout - << "AllocateResource(\"gpus\", \"1\", 7) returned false, should be " - "true\n"; - retval = false; - } - if (allocator.AllocateResource("gpus", "1", 2)) { - std::cout - << "AllocateResource(\"gpus\", \"1\", 2) returned true, should be " - "false\n"; - retval = false; - } - if (allocator.GetResources() != expected4) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected5{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 4 } }, - { "1", { 8, 7 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.AllocateResource("gpus", "2", 1)) { - std::cout - << "AllocateResource(\"gpus\", \"2\", 1) returned true, should be " - "false\n"; - retval = false; - } - if (allocator.GetResources() != expected5) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected6{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 4 } }, - { "1", { 8, 7 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.AllocateResource("gpus", "4", 1)) { - std::cout - << "AllocateResource(\"gpus\", \"4\", 1) returned true, should be " - "false\n"; - retval = false; - } - if (allocator.GetResources() != expected6) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected7{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 4 } }, - { "1", { 8, 7 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.AllocateResource("threads", "0", 1)) { - std::cout - << "AllocateResource(\"threads\", \"0\", 1) returned true, should be" - " false\n"; - retval = false; - } - if (allocator.GetResources() != expected7) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - return retval; -} - -bool testDeallocateResource() -{ - bool retval = true; - - cmCTestHardwareAllocator allocator; - allocator.InitializeFromHardwareSpec(spec); - - static const std::map< - std::string, std::map> - expected1{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 1 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (!allocator.AllocateResource("gpus", "0", 2)) { - std::cout - << "AllocateResource(\"gpus\", \"0\", 2) returned false, should be " - "true\n"; - retval = false; - } - if (!allocator.DeallocateResource("gpus", "0", 1)) { - std::cout - << "DeallocateResource(\"gpus\", \"0\", 1) returned false, should be" - " true\n"; - retval = false; - } - if (allocator.GetResources() != expected1) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected2{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 1 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.DeallocateResource("gpus", "0", 2)) { - std::cout - << "DeallocateResource(\"gpus\", \"0\", 2) returned true, should be" - " false\n"; - retval = false; - } - if (allocator.GetResources() != expected2) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected3{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 0 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (!allocator.DeallocateResource("gpus", "0", 1)) { - std::cout - << "DeallocateResource(\"gpus\", \"0\", 1) returned false, should be" - " true\n"; - retval = false; - } - if (allocator.GetResources() != expected3) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected4{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 0 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.DeallocateResource("gpus", "0", 1)) { - std::cout - << "DeallocateResource(\"gpus\", \"0\", 1) returned true, should be" - " false\n"; - retval = false; - } - if (allocator.GetResources() != expected4) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected5{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 0 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.DeallocateResource("gpus", "4", 1)) { - std::cout - << "DeallocateResource(\"gpus\", \"4\", 1) returned true, should be" - " false\n"; - retval = false; - } - if (allocator.GetResources() != expected5) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - static const std::map< - std::string, std::map> - expected6{ - /* clang-format off */ - { "gpus", { - { "0", { 4, 0 } }, - { "1", { 8, 0 } }, - { "2", { 0, 0 } }, - { "3", { 8, 0 } }, - } }, - /* clang-format on */ - }; - if (allocator.DeallocateResource("threads", "0", 1)) { - std::cout - << "DeallocateResource(\"threads\", \"0\", 1) returned true, should be" - " false\n"; - retval = false; - } - if (allocator.GetResources() != expected6) { - std::cout << "GetResources() did not return expected value\n"; - retval = false; - } - - return retval; -} - -bool testResourceFree() -{ - bool retval = true; - - const cmCTestHardwareAllocator::Resource r1{ 5, 0 }; - if (r1.Free() != 5) { - std::cout << "cmCTestHardwareAllocator::Resource::Free() did not return " - "expected value for { 5, 0 }\n"; - retval = false; - } - - const cmCTestHardwareAllocator::Resource r2{ 3, 2 }; - if (r2.Free() != 1) { - std::cout << "cmCTestHardwareAllocator::Resource::Free() did not return " - "expected value for { 3, 2 }\n"; - retval = false; - } - - const cmCTestHardwareAllocator::Resource r3{ 4, 4 }; - if (r3.Free() != 0) { - std::cout << "cmCTestHardwareAllocator::Resource::Free() did not return " - "expected value for { 4, 4 }\n"; - retval = false; - } - - return retval; -} - -int testCTestHardwareAllocator(int, char** const) -{ - int retval = 0; - - if (!testInitializeFromHardwareSpec()) { - std::cout << "in testInitializeFromHardwareSpec()\n"; - retval = -1; - } - - if (!testAllocateResource()) { - std::cout << "in testAllocateResource()\n"; - retval = -1; - } - - if (!testDeallocateResource()) { - std::cout << "in testDeallocateResource()\n"; - retval = -1; - } - - if (!testResourceFree()) { - std::cout << "in testResourceFree()\n"; - retval = -1; - } - - return retval; -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec.cxx b/Tests/CMakeLib/testCTestHardwareSpec.cxx deleted file mode 100644 index 3e3eccc..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec.cxx +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include -#include - -#include "cmCTestHardwareSpec.h" - -struct ExpectedSpec -{ - std::string Path; - bool ParseResult; - cmCTestHardwareSpec Expected; -}; - -static const std::vector expectedHardwareSpecs = { - /* clang-format off */ - {"spec1.json", true, {{{ - {"gpus", { - {"2", 4}, - {"e", 1}, - }}, - {"threads", { - }}, - }}}}, - {"spec2.json", true, {{{ - }}}}, - {"spec3.json", false, {{{}}}}, - {"spec4.json", false, {{{}}}}, - {"spec5.json", false, {{{}}}}, - {"spec6.json", false, {{{}}}}, - {"spec7.json", false, {{{}}}}, - {"spec8.json", false, {{{}}}}, - {"spec9.json", false, {{{}}}}, - {"spec10.json", false, {{{}}}}, - {"spec11.json", false, {{{}}}}, - {"spec12.json", false, {{{}}}}, - {"spec13.json", false, {{{}}}}, - {"spec14.json", true, {{{}}}}, - {"spec15.json", true, {{{}}}}, - {"spec16.json", true, {{{}}}}, - {"spec17.json", false, {{{}}}}, - {"spec18.json", false, {{{}}}}, - {"noexist.json", false, {{{}}}}, - /* clang-format on */ -}; - -static bool testSpec(const std::string& path, bool expectedResult, - const cmCTestHardwareSpec& expected) -{ - cmCTestHardwareSpec actual; - bool result = actual.ReadFromJSONFile(path); - if (result != expectedResult) { - std::cout << "ReadFromJSONFile(\"" << path << "\") returned " << result - << ", should be " << expectedResult << std::endl; - return false; - } - - if (result && actual != expected) { - std::cout << "ReadFromJSONFile(\"" << path - << "\") did not give expected spec" << std::endl; - return false; - } - - return true; -} - -int testCTestHardwareSpec(int argc, char** const argv) -{ - if (argc < 2) { - std::cout << "Invalid arguments.\n"; - return -1; - } - - int retval = 0; - for (auto const& spec : expectedHardwareSpecs) { - std::string path = argv[1]; - path += "/testCTestHardwareSpec_data/"; - path += spec.Path; - if (!testSpec(path, spec.ParseResult, spec.Expected)) { - retval = -1; - } - } - - return retval; -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec1.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec1.json deleted file mode 100644 index ee3d0ce..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec1.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "local": [ - { - "gpus": [ - { - "id": "2", - "slots": 4 - }, - { - "id": "e" - } - ], - ".reserved": [ - { - "id": "a", - "slots": 3 - } - ], - "threads": [ - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec10.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec10.json deleted file mode 100644 index 22105d7..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec10.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "local": [ - { - "gpus": [ - { - "id": 4 - } - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec11.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec11.json deleted file mode 100644 index 1e37ef5..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec11.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "local": [ - { - "gpus": [ - { - "id": "4", - "slots": "giraffe" - } - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec12.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec12.json deleted file mode 100644 index fe51488..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec12.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec13.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec13.json deleted file mode 100644 index 6b7a9f4..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec13.json +++ /dev/null @@ -1 +0,0 @@ -not json diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec14.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec14.json deleted file mode 100644 index ce708c7..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec14.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "local": [ - { - "0": [ - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec15.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec15.json deleted file mode 100644 index 78b6990..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec15.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "local": [ - { - "-": [ - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec16.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec16.json deleted file mode 100644 index 95c7d26..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec16.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "local": [ - { - "A": [ - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec17.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec17.json deleted file mode 100644 index 1b6ab4b..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec17.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "local": [ - { - "gpus": [ - { - "id": "A" - } - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec18.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec18.json deleted file mode 100644 index 1a17df7..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec18.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "local": [ - { - "gpus": [ - { - "id": "-" - } - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec2.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec2.json deleted file mode 100644 index 6175b1a..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec2.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "local": [ - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec3.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec3.json deleted file mode 100644 index 82453ec..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "local": [ - { - }, - { - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec4.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec4.json deleted file mode 100644 index 05e73d7..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec4.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "local": { - } -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec5.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec5.json deleted file mode 100644 index 2c63c08..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec5.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec6.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec6.json deleted file mode 100644 index 93c790d..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec6.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "local": [ - [] - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec7.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec7.json deleted file mode 100644 index 28b6a4f..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec7.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "local": [ - { - "gpus": { - } - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec8.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec8.json deleted file mode 100644 index 79bd224..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec8.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "local": [ - { - "gpus": [ - [] - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestHardwareSpec_data/spec9.json b/Tests/CMakeLib/testCTestHardwareSpec_data/spec9.json deleted file mode 100644 index 6bb1def..0000000 --- a/Tests/CMakeLib/testCTestHardwareSpec_data/spec9.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "local": [ - { - "gpus": [ - { - } - ] - } - ] -} diff --git a/Tests/CMakeLib/testCTestResourceAllocator.cxx b/Tests/CMakeLib/testCTestResourceAllocator.cxx new file mode 100644 index 0000000..33d6b91 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceAllocator.cxx @@ -0,0 +1,426 @@ +#include +#include +#include +#include + +#include "cmCTestResourceAllocator.h" +#include "cmCTestResourceSpec.h" + +static const cmCTestResourceSpec spec{ { { + /* clang-format off */ + { "gpus", { { "0", 4 }, { "1", 8 }, { "2", 0 }, { "3", 8 } } }, + /* clang-format on */ +} } }; + +bool testInitializeFromResourceSpec() +{ + bool retval = true; + + cmCTestResourceAllocator allocator; + allocator.InitializeFromResourceSpec(spec); + + static const std::map< + std::string, std::map> + expected{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 0 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.GetResources() != expected) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + return retval; +} + +bool testAllocateResource() +{ + bool retval = true; + + cmCTestResourceAllocator allocator; + allocator.InitializeFromResourceSpec(spec); + + static const std::map< + std::string, std::map> + expected1{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 2 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (!allocator.AllocateResource("gpus", "0", 2)) { + std::cout + << "AllocateResource(\"gpus\", \"0\", 2) returned false, should be " + "true\n"; + retval = false; + } + if (allocator.GetResources() != expected1) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected2{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 4 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (!allocator.AllocateResource("gpus", "0", 2)) { + std::cout + << "AllocateResource(\"gpus\", \"0\", 2) returned false, should be " + "true\n"; + retval = false; + } + if (allocator.GetResources() != expected2) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected3{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 4 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.AllocateResource("gpus", "0", 1)) { + std::cout + << "AllocateResource(\"gpus\", \"0\", 1) returned true, should be " + "false\n"; + retval = false; + } + if (allocator.GetResources() != expected3) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected4{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 4 } }, + { "1", { 8, 7 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (!allocator.AllocateResource("gpus", "1", 7)) { + std::cout + << "AllocateResource(\"gpus\", \"1\", 7) returned false, should be " + "true\n"; + retval = false; + } + if (allocator.AllocateResource("gpus", "1", 2)) { + std::cout + << "AllocateResource(\"gpus\", \"1\", 2) returned true, should be " + "false\n"; + retval = false; + } + if (allocator.GetResources() != expected4) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected5{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 4 } }, + { "1", { 8, 7 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.AllocateResource("gpus", "2", 1)) { + std::cout + << "AllocateResource(\"gpus\", \"2\", 1) returned true, should be " + "false\n"; + retval = false; + } + if (allocator.GetResources() != expected5) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected6{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 4 } }, + { "1", { 8, 7 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.AllocateResource("gpus", "4", 1)) { + std::cout + << "AllocateResource(\"gpus\", \"4\", 1) returned true, should be " + "false\n"; + retval = false; + } + if (allocator.GetResources() != expected6) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected7{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 4 } }, + { "1", { 8, 7 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.AllocateResource("threads", "0", 1)) { + std::cout + << "AllocateResource(\"threads\", \"0\", 1) returned true, should be" + " false\n"; + retval = false; + } + if (allocator.GetResources() != expected7) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + return retval; +} + +bool testDeallocateResource() +{ + bool retval = true; + + cmCTestResourceAllocator allocator; + allocator.InitializeFromResourceSpec(spec); + + static const std::map< + std::string, std::map> + expected1{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 1 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (!allocator.AllocateResource("gpus", "0", 2)) { + std::cout + << "AllocateResource(\"gpus\", \"0\", 2) returned false, should be " + "true\n"; + retval = false; + } + if (!allocator.DeallocateResource("gpus", "0", 1)) { + std::cout + << "DeallocateResource(\"gpus\", \"0\", 1) returned false, should be" + " true\n"; + retval = false; + } + if (allocator.GetResources() != expected1) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected2{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 1 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.DeallocateResource("gpus", "0", 2)) { + std::cout + << "DeallocateResource(\"gpus\", \"0\", 2) returned true, should be" + " false\n"; + retval = false; + } + if (allocator.GetResources() != expected2) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected3{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 0 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (!allocator.DeallocateResource("gpus", "0", 1)) { + std::cout + << "DeallocateResource(\"gpus\", \"0\", 1) returned false, should be" + " true\n"; + retval = false; + } + if (allocator.GetResources() != expected3) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected4{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 0 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.DeallocateResource("gpus", "0", 1)) { + std::cout + << "DeallocateResource(\"gpus\", \"0\", 1) returned true, should be" + " false\n"; + retval = false; + } + if (allocator.GetResources() != expected4) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected5{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 0 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.DeallocateResource("gpus", "4", 1)) { + std::cout + << "DeallocateResource(\"gpus\", \"4\", 1) returned true, should be" + " false\n"; + retval = false; + } + if (allocator.GetResources() != expected5) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + static const std::map< + std::string, std::map> + expected6{ + /* clang-format off */ + { "gpus", { + { "0", { 4, 0 } }, + { "1", { 8, 0 } }, + { "2", { 0, 0 } }, + { "3", { 8, 0 } }, + } }, + /* clang-format on */ + }; + if (allocator.DeallocateResource("threads", "0", 1)) { + std::cout + << "DeallocateResource(\"threads\", \"0\", 1) returned true, should be" + " false\n"; + retval = false; + } + if (allocator.GetResources() != expected6) { + std::cout << "GetResources() did not return expected value\n"; + retval = false; + } + + return retval; +} + +bool testResourceFree() +{ + bool retval = true; + + const cmCTestResourceAllocator::Resource r1{ 5, 0 }; + if (r1.Free() != 5) { + std::cout << "cmCTestResourceAllocator::Resource::Free() did not return " + "expected value for { 5, 0 }\n"; + retval = false; + } + + const cmCTestResourceAllocator::Resource r2{ 3, 2 }; + if (r2.Free() != 1) { + std::cout << "cmCTestResourceAllocator::Resource::Free() did not return " + "expected value for { 3, 2 }\n"; + retval = false; + } + + const cmCTestResourceAllocator::Resource r3{ 4, 4 }; + if (r3.Free() != 0) { + std::cout << "cmCTestResourceAllocator::Resource::Free() did not return " + "expected value for { 4, 4 }\n"; + retval = false; + } + + return retval; +} + +int testCTestResourceAllocator(int, char** const) +{ + int retval = 0; + + if (!testInitializeFromResourceSpec()) { + std::cout << "in testInitializeFromResourceSpec()\n"; + retval = -1; + } + + if (!testAllocateResource()) { + std::cout << "in testAllocateResource()\n"; + retval = -1; + } + + if (!testDeallocateResource()) { + std::cout << "in testDeallocateResource()\n"; + retval = -1; + } + + if (!testResourceFree()) { + std::cout << "in testResourceFree()\n"; + retval = -1; + } + + return retval; +} diff --git a/Tests/CMakeLib/testCTestResourceSpec.cxx b/Tests/CMakeLib/testCTestResourceSpec.cxx new file mode 100644 index 0000000..e4bc770 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec.cxx @@ -0,0 +1,84 @@ +#include +#include +#include + +#include "cmCTestResourceSpec.h" + +struct ExpectedSpec +{ + std::string Path; + bool ParseResult; + cmCTestResourceSpec Expected; +}; + +static const std::vector expectedResourceSpecs = { + /* clang-format off */ + {"spec1.json", true, {{{ + {"gpus", { + {"2", 4}, + {"e", 1}, + }}, + {"threads", { + }}, + }}}}, + {"spec2.json", true, {{{ + }}}}, + {"spec3.json", false, {{{}}}}, + {"spec4.json", false, {{{}}}}, + {"spec5.json", false, {{{}}}}, + {"spec6.json", false, {{{}}}}, + {"spec7.json", false, {{{}}}}, + {"spec8.json", false, {{{}}}}, + {"spec9.json", false, {{{}}}}, + {"spec10.json", false, {{{}}}}, + {"spec11.json", false, {{{}}}}, + {"spec12.json", false, {{{}}}}, + {"spec13.json", false, {{{}}}}, + {"spec14.json", true, {{{}}}}, + {"spec15.json", true, {{{}}}}, + {"spec16.json", true, {{{}}}}, + {"spec17.json", false, {{{}}}}, + {"spec18.json", false, {{{}}}}, + {"noexist.json", false, {{{}}}}, + /* clang-format on */ +}; + +static bool testSpec(const std::string& path, bool expectedResult, + const cmCTestResourceSpec& expected) +{ + cmCTestResourceSpec actual; + bool result = actual.ReadFromJSONFile(path); + if (result != expectedResult) { + std::cout << "ReadFromJSONFile(\"" << path << "\") returned " << result + << ", should be " << expectedResult << std::endl; + return false; + } + + if (result && actual != expected) { + std::cout << "ReadFromJSONFile(\"" << path + << "\") did not give expected spec" << std::endl; + return false; + } + + return true; +} + +int testCTestResourceSpec(int argc, char** const argv) +{ + if (argc < 2) { + std::cout << "Invalid arguments.\n"; + return -1; + } + + int retval = 0; + for (auto const& spec : expectedResourceSpecs) { + std::string path = argv[1]; + path += "/testCTestResourceSpec_data/"; + path += spec.Path; + if (!testSpec(path, spec.ParseResult, spec.Expected)) { + retval = -1; + } + } + + return retval; +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec1.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec1.json new file mode 100644 index 0000000..ee3d0ce --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec1.json @@ -0,0 +1,23 @@ +{ + "local": [ + { + "gpus": [ + { + "id": "2", + "slots": 4 + }, + { + "id": "e" + } + ], + ".reserved": [ + { + "id": "a", + "slots": 3 + } + ], + "threads": [ + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec10.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec10.json new file mode 100644 index 0000000..22105d7 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec10.json @@ -0,0 +1,11 @@ +{ + "local": [ + { + "gpus": [ + { + "id": 4 + } + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec11.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec11.json new file mode 100644 index 0000000..1e37ef5 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec11.json @@ -0,0 +1,12 @@ +{ + "local": [ + { + "gpus": [ + { + "id": "4", + "slots": "giraffe" + } + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec12.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec12.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec12.json @@ -0,0 +1 @@ +[] diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec13.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec13.json new file mode 100644 index 0000000..6b7a9f4 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec13.json @@ -0,0 +1 @@ +not json diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec14.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec14.json new file mode 100644 index 0000000..ce708c7 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec14.json @@ -0,0 +1,8 @@ +{ + "local": [ + { + "0": [ + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec15.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec15.json new file mode 100644 index 0000000..78b6990 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec15.json @@ -0,0 +1,8 @@ +{ + "local": [ + { + "-": [ + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec16.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec16.json new file mode 100644 index 0000000..95c7d26 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec16.json @@ -0,0 +1,8 @@ +{ + "local": [ + { + "A": [ + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec17.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec17.json new file mode 100644 index 0000000..1b6ab4b --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec17.json @@ -0,0 +1,11 @@ +{ + "local": [ + { + "gpus": [ + { + "id": "A" + } + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec18.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec18.json new file mode 100644 index 0000000..1a17df7 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec18.json @@ -0,0 +1,11 @@ +{ + "local": [ + { + "gpus": [ + { + "id": "-" + } + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec2.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec2.json new file mode 100644 index 0000000..6175b1a --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec2.json @@ -0,0 +1,4 @@ +{ + "local": [ + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec3.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec3.json new file mode 100644 index 0000000..82453ec --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec3.json @@ -0,0 +1,8 @@ +{ + "local": [ + { + }, + { + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec4.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec4.json new file mode 100644 index 0000000..05e73d7 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec4.json @@ -0,0 +1,4 @@ +{ + "local": { + } +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec5.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec5.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec5.json @@ -0,0 +1,2 @@ +{ +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec6.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec6.json new file mode 100644 index 0000000..93c790d --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec6.json @@ -0,0 +1,5 @@ +{ + "local": [ + [] + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec7.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec7.json new file mode 100644 index 0000000..28b6a4f --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec7.json @@ -0,0 +1,8 @@ +{ + "local": [ + { + "gpus": { + } + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec8.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec8.json new file mode 100644 index 0000000..79bd224 --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec8.json @@ -0,0 +1,9 @@ +{ + "local": [ + { + "gpus": [ + [] + ] + } + ] +} diff --git a/Tests/CMakeLib/testCTestResourceSpec_data/spec9.json b/Tests/CMakeLib/testCTestResourceSpec_data/spec9.json new file mode 100644 index 0000000..6bb1def --- /dev/null +++ b/Tests/CMakeLib/testCTestResourceSpec_data/spec9.json @@ -0,0 +1,10 @@ +{ + "local": [ + { + "gpus": [ + { + } + ] + } + ] +} diff --git a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc.cxx b/Tests/RunCMake/CTestHardwareAllocation/cthwalloc.cxx index 1a61e6f..27644af 100644 --- a/Tests/RunCMake/CTestHardwareAllocation/cthwalloc.cxx +++ b/Tests/RunCMake/CTestHardwareAllocation/cthwalloc.cxx @@ -13,9 +13,9 @@ #include "cmsys/Encoding.hxx" #include "cmsys/FStream.hxx" -#include "cmCTestHardwareAllocator.h" -#include "cmCTestHardwareSpec.h" #include "cmCTestMultiProcessHandler.h" +#include "cmCTestResourceAllocator.h" +#include "cmCTestResourceSpec.h" #include "cmCTestTestHandler.h" #include "cmFileLock.h" #include "cmFileLockResult.h" @@ -23,7 +23,7 @@ #include "cmSystemTools.h" /* - * This helper program is used to verify that the CTest hardware allocation + * This helper program is used to verify that the CTest resource allocation * feature is working correctly. It consists of two stages: * * 1) write - This stage receives the RESOURCE_GROUPS property of the test and @@ -31,7 +31,7 @@ * environment variables. If it received all of the resources it expected, * then it writes this information to a log file, which will be read in * the verify stage. - * 2) verify - This stage compares the log file with the hardware spec file to + * 2) verify - This stage compares the log file with the resource spec file to * make sure that no resources were over-subscribed, deallocated without * being allocated, or allocated without being deallocated. */ @@ -68,8 +68,8 @@ static int doWrite(int argc, char const* const* argv) std::string testName = argv[3]; unsigned int sleepTime = std::atoi(argv[4]); std::vector>> - hardware; + std::string, std::vector>> + resources; if (argc == 6) { // Parse RESOURCE_GROUPS property std::string resourceGroupsProperty = argv[5]; @@ -146,8 +146,8 @@ static int doWrite(int argc, char const* const* argv) // Verify that we got what we asked for and write it to the log prefix += '_'; std::map> - hwEntry; + std::vector> + resEntry; for (auto const& type : actualResources) { auto it = resourceGroup.begin(); @@ -194,7 +194,7 @@ static int doWrite(int argc, char const* const* argv) fout << "alloc " << type << " " << id << " " << amount << std::endl; - hwEntry[type].push_back({ id, amount }); + resEntry[type].push_back({ id, amount }); } bool ended = false; @@ -212,7 +212,7 @@ static int doWrite(int argc, char const* const* argv) return 1; } } - hardware.push_back(hwEntry); + resources.push_back(resEntry); ++i; } catch (...) { @@ -249,7 +249,7 @@ static int doWrite(int argc, char const* const* argv) return 1; } cmsys::ofstream fout(logFile.c_str(), std::ios::app); - for (auto const& group : hardware) { + for (auto const& group : resources) { for (auto const& it : group) { for (auto const& it2 : it.second) { fout << "dealloc " << it.first << " " << it2.Id << " " << it2.Slots @@ -276,7 +276,7 @@ static int doVerify(int argc, char const* const* argv) return usageVerify(argv[0]); } std::string logFile = argv[2]; - std::string hwFile = argv[3]; + std::string resFile = argv[3]; std::string testNames; if (argc == 5) { testNames = argv[4]; @@ -284,14 +284,14 @@ static int doVerify(int argc, char const* const* argv) auto testNameList = cmExpandedList(testNames, false); std::set testNameSet(testNameList.begin(), testNameList.end()); - cmCTestHardwareSpec spec; - if (!spec.ReadFromJSONFile(hwFile)) { - std::cout << "Could not read resource spec " << hwFile << std::endl; + cmCTestResourceSpec spec; + if (!spec.ReadFromJSONFile(resFile)) { + std::cout << "Could not read resource spec " << resFile << std::endl; return 1; } - cmCTestHardwareAllocator allocator; - allocator.InitializeFromHardwareSpec(spec); + cmCTestResourceAllocator allocator; + allocator.InitializeFromResourceSpec(spec); cmsys::ifstream fin(logFile.c_str(), std::ios::in); if (!fin) { -- cgit v0.12