Skip to content

Commit 888be54

Browse files
Add tests for umfFixedMemoryProviderParamsSetMemory
Fixes: #1333
1 parent 6676f1a commit 888be54

File tree

3 files changed

+99
-3
lines changed

3 files changed

+99
-3
lines changed

src/libumf.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ EXPORTS
133133
umfFixedMemoryProviderOps
134134
umfFixedMemoryProviderParamsCreate
135135
umfFixedMemoryProviderParamsDestroy
136+
umfFixedMemoryProviderParamsSetMemory
136137
umfLevelZeroMemoryProviderParamsSetFreePolicy
137138
umfLevelZeroMemoryProviderParamsSetDeviceOrdinal
138139
; Added in UMF_0.12

src/libumf.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ UMF_0.11 {
131131
umfFixedMemoryProviderOps;
132132
umfFixedMemoryProviderParamsCreate;
133133
umfFixedMemoryProviderParamsDestroy;
134+
umfFixedMemoryProviderParamsSetMemory;
134135
umfLevelZeroMemoryProviderParamsSetFreePolicy;
135136
umfLevelZeroMemoryProviderParamsSetDeviceOrdinal;
136137
} UMF_0.10;

test/provider_fixed_memory.cpp

Lines changed: 97 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ TEST_P(FixedProviderTest, alloc_page64_align_one_half_pages_WRONG_ALIGNMENT_2) {
240240
UMF_RESULT_ERROR_INVALID_ALIGNMENT, 0);
241241
}
242242

243+
TEST_P(FixedProviderTest, alloc_size_exceeds_buffer) {
244+
size_t size = memory_size + page_size;
245+
test_alloc_failure(size, 0, UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY, 0);
246+
}
247+
243248
// Other positive tests
244249

245250
TEST_P(FixedProviderTest, get_min_page_size) {
@@ -334,11 +339,100 @@ TEST_F(test, create_with_zero_size) {
334339
ASSERT_EQ(wrong_params, nullptr);
335340
}
336341

337-
TEST_P(FixedProviderTest, alloc_size_exceeds_buffer) {
338-
size_t size = memory_size + page_size;
339-
test_alloc_failure(size, 0, UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY, 0);
342+
TEST_F(test, params_several_set_memory) {
343+
umf_memory_provider_handle_t provider1 = nullptr, provider2 = nullptr;
344+
size_t memory_size1 = FIXED_BUFFER_SIZE,
345+
memory_size2 = FIXED_BUFFER_SIZE * 10;
346+
size_t alloc_size1 = memory_size1 / 2, alloc_size2 = memory_size2 / 2;
347+
char memory_buffer1[memory_size1];
348+
char memory_buffer2[memory_size2];
349+
void *ptr1 = nullptr;
350+
void *ptr2 = nullptr;
351+
const char *source_str = "Allocated memory!";
352+
353+
umf_fixed_memory_provider_params_handle_t params = nullptr;
354+
umf_result_t umf_result = umfFixedMemoryProviderParamsCreate(
355+
&params, memory_buffer1, memory_size1);
356+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
357+
358+
umf_result = umfMemoryProviderCreate(umfFixedMemoryProviderOps(), params,
359+
&provider1);
360+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
361+
362+
umf_result = umfMemoryProviderAlloc(provider1, alloc_size1, 0, &ptr1);
363+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
364+
ASSERT_NE(ptr1, nullptr);
365+
366+
// provider1: write to the allocated memory and free it
367+
memset(ptr1, '\0', alloc_size1);
368+
memcpy(ptr1, (const void *)source_str, alloc_size1);
369+
ASSERT_GE((uintptr_t)ptr1, (uintptr_t)memory_buffer1);
370+
ASSERT_LE((uintptr_t)ptr1 + alloc_size1,
371+
(uintptr_t)memory_buffer1 + memory_size1);
372+
373+
umf_result = umfMemoryProviderFree(provider1, ptr1, alloc_size1);
374+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
375+
376+
// Reuse the same params for the new provider
377+
umf_result = umfFixedMemoryProviderParamsSetMemory(params, memory_buffer2,
378+
memory_size2);
379+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
380+
381+
umf_result = umfMemoryProviderCreate(umfFixedMemoryProviderOps(), params,
382+
&provider2);
383+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
384+
385+
umf_result = umfMemoryProviderAlloc(provider2, alloc_size2, 0, &ptr2);
386+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
387+
ASSERT_NE(ptr2, nullptr);
388+
389+
// provider2: write to the allocated memory and free it
390+
memset(ptr2, '\0', alloc_size2);
391+
memcpy(ptr2, (const void *)source_str, alloc_size2);
392+
ASSERT_GE((uintptr_t)ptr2, (uintptr_t)memory_buffer2);
393+
ASSERT_LE((uintptr_t)ptr2 + alloc_size2,
394+
(uintptr_t)memory_buffer2 + memory_size2);
395+
396+
umf_result = umfMemoryProviderFree(provider2, ptr2, alloc_size2);
397+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
398+
399+
ASSERT_NE(ptr1, ptr2);
400+
ASSERT_NE(provider1, provider2);
401+
402+
// Cleanup
403+
umfMemoryProviderDestroy(provider1);
404+
umfMemoryProviderDestroy(provider2);
405+
406+
umf_result = umfFixedMemoryProviderParamsDestroy(params);
407+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
340408
}
341409

410+
TEST_F(test, params_invalid_set_memory) {
411+
constexpr size_t memory_size = 100;
412+
char memory_buffer[memory_size];
413+
umf_fixed_memory_provider_params_handle_t valid_params = nullptr;
414+
umf_result_t umf_result = umfFixedMemoryProviderParamsCreate(
415+
&valid_params, memory_buffer, memory_size);
416+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
417+
418+
umf_result =
419+
umfFixedMemoryProviderParamsSetMemory(NULL, memory_buffer, memory_size);
420+
ASSERT_EQ(umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
421+
422+
umf_result =
423+
umfFixedMemoryProviderParamsSetMemory(valid_params, NULL, memory_size);
424+
ASSERT_EQ(umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
425+
426+
umf_result =
427+
umfFixedMemoryProviderParamsSetMemory(valid_params, memory_buffer, 0);
428+
ASSERT_EQ(umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
429+
430+
umf_result = umfFixedMemoryProviderParamsDestroy(valid_params);
431+
ASSERT_EQ(umf_result, UMF_RESULT_SUCCESS);
432+
}
433+
434+
// Split / merge tests
435+
342436
TEST_P(FixedProviderTest, merge) {
343437
umf_result_t umf_result;
344438
void *ptr1 = nullptr;

0 commit comments

Comments
 (0)