#include #include #include #include #include "cmCTestResourceAllocator.h" #include "cmCTestResourceSpec.h" #include "cmJSONState.h" static const cmCTestResourceSpec spec{ { { /* clang-format off */ { "gpus", { { "0", 4 }, { "1", 8 }, { "2", 0 }, { "3", 8 } }, }, /* clang-format on */ } }, cmJSONState() }; static 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; } static 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; } static 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; } static 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; }