EXSWCPHIPT-134 - Negative tests for hipMalloc3DArray and hipArray3DCreate (#2784)

Cette révision appartient à :
Finlay
2022-07-13 06:16:26 +01:00
révisé par GitHub
Parent eb7422c19f
révision c856cfee36
5 fichiers modifiés avec 413 ajouts et 123 suppressions
+156 -1
Voir le fichier
@@ -17,8 +17,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include <limits>
#include "DriverContext.hh"
#include "hipArrayCommon.hh"
#include "hip_test_common.hh"
namespace {
void checkArrayIsExpected(const hiparray array, const HIP_ARRAY3D_DESCRIPTOR& expected_desc) {
@@ -38,6 +40,11 @@ void checkArrayIsExpected(const hiparray array, const HIP_ARRAY3D_DESCRIPTOR& ex
REQUIRE(queried_desc.Flags == expected_desc.Flags);
#endif
}
void testInvalidDescription(HIP_ARRAY3D_DESCRIPTOR desc) {
hiparray array;
HIP_CHECK_ERROR(hipArray3DCreate(&array, &desc), hipErrorInvalidValue);
}
} // namespace
TEMPLATE_TEST_CASE("Unit_hipArray3DCreate_happy", "", char, uchar2, uint2, int4, short4, float,
@@ -45,7 +52,6 @@ TEMPLATE_TEST_CASE("Unit_hipArray3DCreate_happy", "", char, uchar2, uint2, int4,
using vec_info = vector_info<TestType>;
DriverContext ctx;
hiparray array;
HIP_ARRAY3D_DESCRIPTOR desc{};
desc.Format = vec_info::format;
desc.NumChannels = vec_info::size;
@@ -70,6 +76,7 @@ TEMPLATE_TEST_CASE("Unit_hipArray3DCreate_happy", "", char, uchar2, uint2, int4,
CAPTURE(desc.Width, desc.Height, desc.Depth);
hiparray array;
HIP_CHECK(hipArray3DCreate(&array, &desc));
checkArrayIsExpected(array, desc);
HIP_CHECK(hipArrayDestroy(array));
@@ -164,3 +171,151 @@ TEMPLATE_TEST_CASE("Unit_hipArray3DCreate_MaxTexture", "", int, uint4, short, us
HIP_CHECK_ERROR(hipArray3DCreate(&array, &desc), hipErrorInvalidValue);
}
}
#if HT_NVIDIA
constexpr std::array<unsigned int, 9> validFlags{
0,
hipArraySurfaceLoadStore,
hipArrayLayered,
hipArrayLayered | hipArraySurfaceLoadStore,
hipArrayCubemap,
hipArrayCubemap | hipArrayLayered,
hipArrayCubemap | hipArraySurfaceLoadStore,
hipArrayCubemap | hipArrayLayered | hipArraySurfaceLoadStore,
hipArrayTextureGather};
#else
constexpr std::array<unsigned int, 5> validFlags{
0, hipArrayCubemap, hipArrayCubemap | hipArrayLayered,
hipArrayCubemap | hipArraySurfaceLoadStore,
hipArrayCubemap | hipArrayLayered | hipArraySurfaceLoadStore};
#endif
constexpr HIP_ARRAY3D_DESCRIPTOR defaultDescriptor(unsigned int flags, size_t size) {
HIP_ARRAY3D_DESCRIPTOR desc{};
desc.Format = HIP_AD_FORMAT_FLOAT;
desc.NumChannels = 4;
desc.Flags = flags;
desc.Width = size;
desc.Height = size;
desc.Depth = size;
#if HT_NVIDIA
if (flags == CUDA_ARRAY3D_TEXTURE_GATHER) {
desc.Depth = 0;
}
#endif
return desc;
}
// Providing the array pointer as nullptr should return an error
TEST_CASE("Unit_hipArray3DCreate_Negative_NullArrayPtr") {
auto desc = defaultDescriptor(0, 64);
DriverContext ctx;
HIP_CHECK_ERROR(hipArray3DCreate(nullptr, &desc), hipErrorInvalidValue);
}
// Providing the description pointer as nullptr should return an error
TEST_CASE("Unit_hipArray3DCreate_Negative_NullDescPtr") {
#if HT_AMD
HipTest::HIP_SKIP_TEST("EXSWCPHIPT-130");
return;
#endif
DriverContext ctx;
hiparray array;
HIP_CHECK_ERROR(hipArray3DCreate(&array, nullptr), hipErrorInvalidValue);
}
// Zero width arrays are not allowed
TEST_CASE("Unit_hipArray3DCreate_Negative_ZeroWidth") {
DriverContext ctx;
unsigned int flags = GENERATE(from_range(std::begin(validFlags), std::end(validFlags)));
auto desc = defaultDescriptor(flags, 6);
desc.Width = 0;
CAPTURE(desc.Flags);
testInvalidDescription(desc);
}
// Zero height arrays are only allowed for 1D arrays and layered arrays
TEST_CASE("Unit_hipArray3DCreate_Negative_ZeroHeight") {
DriverContext ctx;
unsigned int flags = GENERATE(from_range(std::begin(validFlags), std::end(validFlags)));
auto desc = defaultDescriptor(flags, 6);
#if HT_NVIDIA
std::array<unsigned int, 2> exceptions{CUDA_ARRAY3D_LAYERED,
CUDA_ARRAY3D_LAYERED | CUDA_ARRAY3D_SURFACE_LDST};
#else
std::array<unsigned int, 0> exceptions{};
#endif
desc.Height = 0;
if (std::find(std::begin(exceptions), std::end(exceptions), desc.Flags) == std::end(exceptions)) {
// flag is not in list of exceptions
testInvalidDescription(desc);
}
}
// Arrays must be created with a valid data format
TEST_CASE("Unit_hipArray3DCreate_Negative_InvalidFormat") {
DriverContext ctx;
unsigned int flags = GENERATE(from_range(std::begin(validFlags), std::end(validFlags)));
auto desc = defaultDescriptor(flags, 6);
desc.Format = static_cast<hipArray_Format>(0xDEADBEEF);
REQUIRE(std::find(std::begin(driverFormats), std::end(driverFormats), desc.Format) ==
std::end(driverFormats));
testInvalidDescription(desc);
}
// An array must have either 1,2, or 4 channels
TEST_CASE("Unit_hipArray3DCreate_Negative_NumChannels") {
DriverContext ctx;
unsigned int flags = GENERATE(from_range(std::begin(validFlags), std::end(validFlags)));
auto desc = defaultDescriptor(flags, 6);
desc.NumChannels = GENERATE(0, 3, 5);
testInvalidDescription(desc);
}
// Using invalid flags should result in an error
TEST_CASE("Unit_hipArray3DCreate_Negative_InvalidFlags") {
DriverContext ctx;
// FIXME: use the same flags for both tests when the values exist for hip
#if HT_NVIDIA
unsigned int flags =
GENERATE(0xDEADBEEF, CUDA_ARRAY3D_TEXTURE_GATHER | CUDA_ARRAY3D_SURFACE_LDST,
CUDA_ARRAY3D_TEXTURE_GATHER | CUDA_ARRAY3D_CUBEMAP,
CUDA_ARRAY3D_TEXTURE_GATHER | CUDA_ARRAY3D_SURFACE_LDST | CUDA_ARRAY3D_CUBEMAP);
#else
unsigned int flags = 0xDEADBEEF;
#endif
CAPTURE(flags);
auto desc = defaultDescriptor(flags, 6);
REQUIRE(std::find(std::begin(validFlags), std::end(validFlags), desc.Flags) ==
std::end(validFlags));
testInvalidDescription(desc);
}
// hipArray3DCreate should handle the max numeric value gracefully.
TEST_CASE("Unit_hipArray3DCreate_Negative_NumericLimit") {
DriverContext ctx;
unsigned int flags = GENERATE(from_range(std::begin(validFlags), std::end(validFlags)));
auto desc = defaultDescriptor(flags, std::numeric_limits<size_t>::max());
testInvalidDescription(desc);
}