/* * Copyright (c) 2017 - 2018, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ #include "runtime/api/cl_types.h" #include "runtime/helpers/base_object.h" #include "runtime/helpers/error_mappers.h" #include "runtime/helpers/ptr_math.h" #include "runtime/helpers/validators.h" #include "runtime/platform/platform.h" #include "unit_tests/mocks/mock_context.h" #include "unit_tests/mocks/mock_buffer.h" #include "gtest/gtest.h" using namespace OCLRT; template struct ValidatorFixture : public ::testing::Test { }; TYPED_TEST_CASE_P(ValidatorFixture); TYPED_TEST_P(ValidatorFixture, nullPtr) { TypeParam object = nullptr; cl_int rv = NullObjectErrorMapper::retVal; EXPECT_EQ(rv, validateObjects(object)); } TYPED_TEST_P(ValidatorFixture, randomMemory) { // 6*uint64_t to satisfy memory requirements // we need 2 before object (dispatchTable) // and 4 of object (magic) uint64_t randomMemory[6] = { 0xdeadbeef, }; TypeParam object = (TypeParam)(randomMemory + 2); cl_int rv = InvalidObjectErrorMapper::retVal; EXPECT_EQ(rv, validateObjects(object)); } REGISTER_TYPED_TEST_CASE_P( ValidatorFixture, nullPtr, randomMemory); // Define new command types to run the parameterized tests typedef ::testing::Types< cl_command_queue, device_queue, // internal type cl_context, cl_device_id, cl_event, cl_kernel, cl_mem, cl_platform_id, cl_program, uint64_t /*cl_queue_properties*/ *, cl_sampler> ValidatorParams; INSTANTIATE_TYPED_TEST_CASE_P(Validator, ValidatorFixture, ValidatorParams); TEST(GenericValidator, nullCTXTnullCQ) { cl_context context = nullptr; cl_command_queue command_queue = nullptr; EXPECT_EQ(CL_INVALID_CONTEXT, validateObjects(context, command_queue)); } TEST(UserPointer, ExpectNonNullUserPtr) { void *ptr = nullptr; EXPECT_EQ(CL_INVALID_VALUE, validateObjects(ptr)); } TEST(UserPointer, DontValidateUserPointersForValidity) { void *ptr = ptrGarbage; EXPECT_EQ(CL_SUCCESS, validateObjects(ptr)); } TEST(EventWaitList, zeroCount_nonNullPointer) { cl_event eventList = (cl_event)ptrGarbage; EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, validateObjects(EventWaitList(0, &eventList))); } TEST(EventWaitList, zeroCount_nullPointer) { EXPECT_EQ(CL_SUCCESS, validateObjects(EventWaitList(0, nullptr))); } TEST(EventWaitList, nonZeroCount_nullPointer) { EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, validateObjects(EventWaitList(1, nullptr))); } TEST(EventWaitList, nonZeroCount_noNullPointer) { cl_event eventList = (cl_event)ptrGarbage; EXPECT_EQ(CL_INVALID_EVENT_WAIT_LIST, validateObjects(EventWaitList(1, &eventList))); } TEST(DeviceList, zeroCount_nonNullPointer) { cl_device_id devList = (cl_device_id)ptrGarbage; EXPECT_EQ(CL_INVALID_VALUE, validateObjects(DeviceList(0, &devList))); } TEST(DeviceList, zeroCount_nullPointer) { EXPECT_EQ(CL_SUCCESS, validateObjects(DeviceList(0, nullptr))); } TEST(DeviceList, nonZeroCount_nullPointer) { EXPECT_EQ(CL_INVALID_VALUE, validateObjects(DeviceList(1, nullptr))); } TEST(DeviceList, nonZeroCount_noNullPointer) { cl_device_id devList = (cl_device_id)ptrGarbage; EXPECT_EQ(CL_INVALID_DEVICE, validateObjects(DeviceList(1, &devList))); } TEST(MemObjList, zeroCount_nonNullPointer) { cl_mem memList = static_cast(ptrGarbage); EXPECT_EQ(CL_INVALID_VALUE, validateObjects(MemObjList(0, &memList))); } TEST(MemObjList, zeroCount_nullPointer) { EXPECT_EQ(CL_SUCCESS, validateObjects(MemObjList(0, nullptr))); } TEST(MemObjList, nonZeroCount_nullPointer) { EXPECT_EQ(CL_INVALID_VALUE, validateObjects(MemObjList(1, nullptr))); } TEST(MemObjList, nonZeroCount_noNullPointer) { cl_mem memList = static_cast(ptrGarbage); EXPECT_EQ(CL_INVALID_MEM_OBJECT, validateObjects(MemObjList(1, &memList))); } TEST(MemObjList, nonZeroCount_validPointer) { std::unique_ptr buffer(new MockBuffer()); cl_mem memList = static_cast(buffer.get()); EXPECT_EQ(CL_SUCCESS, validateObjects(MemObjList(1, &memList))); } TEST(NonZeroBufferSizeValidator, zero) { auto bsv = (NonZeroBufferSize)0; EXPECT_EQ(CL_INVALID_BUFFER_SIZE, validateObjects(bsv)); } TEST(NonZeroBufferSizeValidator, nonZero) { auto bsv = (NonZeroBufferSize)~0; EXPECT_EQ(CL_SUCCESS, validateObjects(bsv)); } TEST(Platform, givenNullPlatformThenReturnInvalidPlatform) { cl_platform_id platform = nullptr; EXPECT_EQ(CL_INVALID_PLATFORM, validateObjects(platform)); } TEST(Platform, givenPlatformThenReturnSUCCESS) { Platform platform; cl_platform_id clPlatformId = &platform; EXPECT_EQ(CL_SUCCESS, validateObjects(clPlatformId)); } typedef ::testing::TestWithParam PatternSizeValid; TEST_P(PatternSizeValid, valid) { auto psv = (PatternSize)GetParam(); EXPECT_EQ(CL_SUCCESS, validateObjects(psv)); } INSTANTIATE_TEST_CASE_P(PatternSize, PatternSizeValid, ::testing::Values(1, 2, 4, 8, 16, 32, 64, 128)); typedef ::testing::TestWithParam PatternSizeInvalid; TEST_P(PatternSizeInvalid, invalid) { auto psv = (PatternSize)GetParam(); EXPECT_EQ(CL_INVALID_VALUE, validateObjects(psv)); } INSTANTIATE_TEST_CASE_P(PatternSize, PatternSizeInvalid, ::testing::Values(0, 3, 5, 256, 512, 1024)); TEST(WithCastToInternal, nullpointer) { Context *pContext = nullptr; cl_context context = nullptr; auto ret = WithCastToInternal(context, &pContext); EXPECT_EQ(ret, nullptr); } TEST(WithCastToInternal, nonnullpointer) { Context *pContext = nullptr; auto temp = std::unique_ptr(new MockContext()); cl_context context = temp.get(); auto ret = WithCastToInternal(context, &pContext); EXPECT_NE(ret, nullptr); } TEST(validateYuvOperation, GivenValidateYuvOperationWhenValidOriginAndRegionThenReturnSuccess) { size_t origin[3] = {8, 0, 0}; size_t region[3] = {8, 0, 0}; auto ret = validateYuvOperation(origin, region); EXPECT_EQ(CL_SUCCESS, ret); } TEST(validateYuvOperation, GivenValidateYuvOperationWhenInvalidOriginThenReturnFailure) { size_t origin[3] = {1, 0, 0}; size_t region[3] = {8, 0, 0}; auto ret = validateYuvOperation(origin, region); EXPECT_EQ(CL_INVALID_VALUE, ret); } TEST(validateYuvOperation, GivenValidateYuvOperationWhenInvalidRegionThenReturnFailure) { size_t origin[3] = {8, 0, 0}; size_t region[3] = {1, 0, 0}; auto ret = validateYuvOperation(origin, region); EXPECT_EQ(CL_INVALID_VALUE, ret); } TEST(validateYuvOperation, GivenValidateYuvOperationWhenNullOriginThenReturnFailure) { size_t *origin = nullptr; size_t region[3] = {1, 0, 0}; auto ret = validateYuvOperation(origin, region); EXPECT_EQ(CL_INVALID_VALUE, ret); } TEST(validateYuvOperation, GivenValidateYuvOperationWhenNullRegionThenReturnFailure) { size_t origin[3] = {8, 0, 0}; size_t *region = nullptr; auto ret = validateYuvOperation(origin, region); EXPECT_EQ(CL_INVALID_VALUE, ret); } TEST(areNotNullptr, WhenGivenAllNonNullParamsTheReturnsTrue) { int a = 0; int b = 0; int c = 0; EXPECT_TRUE(areNotNullptr(&a)); EXPECT_TRUE(areNotNullptr(&a, &b)); EXPECT_TRUE(areNotNullptr(&a, &b, &c)); } TEST(areNotNullptr, WhenGivenAllNullParamsTheReturnsFalse) { int *a = nullptr; int *b = nullptr; int *c = nullptr; EXPECT_FALSE(areNotNullptr(a)); EXPECT_FALSE(areNotNullptr(a, b)); EXPECT_FALSE(areNotNullptr(a, b, c)); } TEST(areNotNullptr, WhenGivenNullParameterAmongNonNullParamsTheReturnsFalse) { int *a = nullptr; int b = 0; int c = 0; EXPECT_FALSE(areNotNullptr(a)); EXPECT_FALSE(areNotNullptr(a, &b)); EXPECT_FALSE(areNotNullptr(&b, a)); EXPECT_FALSE(areNotNullptr(a, &b, &c)); EXPECT_FALSE(areNotNullptr(&b, a, &c)); }