diff --git a/test_common/harness/errorHelpers.cpp b/test_common/harness/errorHelpers.cpp index 8f3c1883..da1660f1 100644 --- a/test_common/harness/errorHelpers.cpp +++ b/test_common/harness/errorHelpers.cpp @@ -68,6 +68,7 @@ const char *IGetErrorString(int clErrorCode) case CL_INVALID_SAMPLER: return "CL_INVALID_SAMPLER"; case CL_INVALID_BINARY: return "CL_INVALID_BINARY"; case CL_INVALID_BUILD_OPTIONS: return "CL_INVALID_BUILD_OPTIONS"; + case CL_INVALID_PLATFORM: return "CL_INVALID_PLATFORM"; case CL_INVALID_PROGRAM: return "CL_INVALID_PROGRAM"; case CL_INVALID_PROGRAM_EXECUTABLE: return "CL_INVALID_PROGRAM_EXECUTABLE"; diff --git a/test_common/harness/testHarness.cpp b/test_common/harness/testHarness.cpp index 48dd4829..6b4c7201 100644 --- a/test_common/harness/testHarness.cpp +++ b/test_common/harness/testHarness.cpp @@ -1161,6 +1161,15 @@ test_status check_spirv_compilation_readiness(cl_device_id device) return TEST_PASS; } +cl_platform_id getPlatformFromDevice(cl_device_id deviceID) +{ + cl_platform_id platform = nullptr; + cl_int err = clGetDeviceInfo(deviceID, CL_DEVICE_PLATFORM, sizeof(platform), + &platform, nullptr); + ASSERT_SUCCESS(err, "clGetDeviceInfo"); + return platform; +} + void PrintArch(void) { vlog("sizeof( void*) = %ld\n", sizeof(void *)); diff --git a/test_common/harness/testHarness.h b/test_common/harness/testHarness.h index 331555b2..d6054de9 100644 --- a/test_common/harness/testHarness.h +++ b/test_common/harness/testHarness.h @@ -178,6 +178,8 @@ extern int gHasLong; // This is set to 1 if the device suppots long and ulong // types in OpenCL C. extern bool gCoreILProgram; +extern cl_platform_id getPlatformFromDevice(cl_device_id deviceID); + #if !defined(__APPLE__) void memset_pattern4(void *, const void *, size_t); #endif diff --git a/test_conformance/api/CMakeLists.txt b/test_conformance/api/CMakeLists.txt index 66efcc7b..20cb9b82 100644 --- a/test_conformance/api/CMakeLists.txt +++ b/test_conformance/api/CMakeLists.txt @@ -2,6 +2,7 @@ set(MODULE_NAME API) set(${MODULE_NAME}_SOURCES main.cpp + negative_platform.cpp test_api_consistency.cpp test_bool.cpp test_retain.cpp diff --git a/test_conformance/api/main.cpp b/test_conformance/api/main.cpp index 10e2b57e..16ca81c4 100644 --- a/test_conformance/api/main.cpp +++ b/test_conformance/api/main.cpp @@ -146,6 +146,8 @@ test_definition test_list[] = { ADD_TEST_VERSION(consistency_3d_image_writes, Version(3, 0)), ADD_TEST(min_image_formats), + ADD_TEST(negative_get_platform_info), + ADD_TEST(negative_get_platform_ids), }; const int test_num = ARRAY_SIZE(test_list); diff --git a/test_conformance/api/negative_platform.cpp b/test_conformance/api/negative_platform.cpp new file mode 100644 index 00000000..d41b35fe --- /dev/null +++ b/test_conformance/api/negative_platform.cpp @@ -0,0 +1,82 @@ +// +// Copyright (c) 2021 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "testBase.h" + +int test_negative_get_platform_ids(cl_device_id deviceID, cl_context context, + cl_command_queue queue, int num_elements) +{ + cl_platform_id platform; + cl_int err = clGetPlatformIDs(0, &platform, nullptr); + test_failure_error_ret( + err, CL_INVALID_VALUE, + "clGetPlatformIDs should return CL_INVALID_VALUE when: \"num_entries " + "is equal to zero and platforms is not NULL\"", + TEST_FAIL); + + err = clGetPlatformIDs(1, nullptr, nullptr); + test_failure_error_ret( + err, CL_INVALID_VALUE, + "clGetPlatformIDs should return CL_INVALID_VALUE when: \"both " + "num_platforms and platforms are NULL\"", + TEST_FAIL); + + return TEST_PASS; +} + +int test_negative_get_platform_info(cl_device_id deviceID, cl_context context, + cl_command_queue queue, int num_elements) +{ + cl_platform_id platform = getPlatformFromDevice(deviceID); + + cl_int err = clGetPlatformInfo(nullptr, CL_PLATFORM_VERSION, sizeof(char*), + nullptr, nullptr); + test_failure_error_ret( + err, CL_INVALID_PLATFORM, + "clGetPlatformInfo should return CL_INVALID_PLATFORM when: \"platform " + "is not a valid platform\" using a nullptr", + TEST_FAIL); + + err = + clGetPlatformInfo(reinterpret_cast(deviceID), + CL_PLATFORM_VERSION, sizeof(char*), nullptr, nullptr); + test_failure_error_ret( + err, CL_INVALID_PLATFORM, + "clGetPlatformInfo should return CL_INVALID_PLATFORM when: \"platform " + "is not a valid platform\" using a valid object which is NOT a " + "platform", + TEST_FAIL); + + constexpr cl_platform_info INVALID_PARAM_VALUE = 0; + err = clGetPlatformInfo(platform, INVALID_PARAM_VALUE, 0, nullptr, nullptr); + test_failure_error_ret( + err, CL_INVALID_VALUE, + "clGetPlatformInfo should return CL_INVALID_VALUE when: \"param_name " + "is not one of the supported values\"", + TEST_FAIL); + + char* version; + err = + clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, &version, nullptr); + test_failure_error_ret( + err, CL_INVALID_VALUE, + "clGetPlatformInfo should return CL_INVALID_VALUE when: \"size in " + "bytes specified by param_value_size is < size of return type and " + "param_value is not a NULL value\"", + TEST_FAIL); + + return TEST_PASS; +} diff --git a/test_conformance/api/procs.h b/test_conformance/api/procs.h index 0dcc9a69..af373e43 100644 --- a/test_conformance/api/procs.h +++ b/test_conformance/api/procs.h @@ -195,3 +195,11 @@ extern int test_consistency_3d_image_writes(cl_device_id deviceID, extern int test_min_image_formats(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements); +extern int test_negative_get_platform_info(cl_device_id deviceID, + cl_context context, + cl_command_queue queue, + int num_elements); +extern int test_negative_get_platform_ids(cl_device_id deviceID, + cl_context context, + cl_command_queue queue, + int num_elements);