@@ -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
245250TEST_P (FixedProviderTest, get_min_page_size) {
@@ -334,11 +339,105 @@ 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+ void *memory_buffer1 = nullptr ;
348+ void *memory_buffer2 = nullptr ;
349+ memory_buffer1 = malloc (memory_size1);
350+ memory_buffer2 = malloc (memory_size2);
351+ void *ptr1 = nullptr ;
352+ void *ptr2 = nullptr ;
353+ const char *source_str = " Allocated memory!" ;
354+
355+ umf_fixed_memory_provider_params_handle_t params = nullptr ;
356+ umf_result_t umf_result = umfFixedMemoryProviderParamsCreate (
357+ ¶ms, memory_buffer1, memory_size1);
358+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
359+
360+ umf_result = umfMemoryProviderCreate (umfFixedMemoryProviderOps (), params,
361+ &provider1);
362+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
363+
364+ umf_result = umfMemoryProviderAlloc (provider1, alloc_size1, 0 , &ptr1);
365+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
366+ ASSERT_NE (ptr1, nullptr );
367+
368+ // provider1: write to the allocated memory and free it
369+ memset (ptr1, ' \0 ' , alloc_size1);
370+ memcpy (ptr1, (const void *)source_str, sizeof (source_str));
371+ ASSERT_GE ((uintptr_t )ptr1, (uintptr_t )memory_buffer1);
372+ ASSERT_LE ((uintptr_t )ptr1 + alloc_size1,
373+ (uintptr_t )memory_buffer1 + memory_size1);
374+
375+ umf_result = umfMemoryProviderFree (provider1, ptr1, alloc_size1);
376+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
377+
378+ // Reuse the same params for the new provider
379+ umf_result = umfFixedMemoryProviderParamsSetMemory (params, memory_buffer2,
380+ memory_size2);
381+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
382+
383+ umf_result = umfMemoryProviderCreate (umfFixedMemoryProviderOps (), params,
384+ &provider2);
385+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
386+
387+ umf_result = umfMemoryProviderAlloc (provider2, alloc_size2, 0 , &ptr2);
388+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
389+ ASSERT_NE (ptr2, nullptr );
390+
391+ // provider2: write to the allocated memory and free it
392+ memset (ptr2, ' \0 ' , alloc_size2);
393+ memcpy (ptr2, (const void *)source_str, sizeof (source_str));
394+ ASSERT_GE ((uintptr_t )ptr2, (uintptr_t )memory_buffer2);
395+ ASSERT_LE ((uintptr_t )ptr2 + alloc_size2,
396+ (uintptr_t )memory_buffer2 + memory_size2);
397+
398+ umf_result = umfMemoryProviderFree (provider2, ptr2, alloc_size2);
399+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
400+
401+ ASSERT_NE (ptr1, ptr2);
402+ ASSERT_NE (provider1, provider2);
403+
404+ // Cleanup
405+ umfMemoryProviderDestroy (provider1);
406+ umfMemoryProviderDestroy (provider2);
407+
408+ umf_result = umfFixedMemoryProviderParamsDestroy (params);
409+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
410+
411+ free (memory_buffer1);
412+ free (memory_buffer2);
413+ }
414+
415+ TEST_F (test, params_invalid_set_memory) {
416+ constexpr size_t memory_size = 100 ;
417+ char memory_buffer[memory_size];
418+ umf_fixed_memory_provider_params_handle_t valid_params = nullptr ;
419+ umf_result_t umf_result = umfFixedMemoryProviderParamsCreate (
420+ &valid_params, memory_buffer, memory_size);
421+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
422+
423+ umf_result =
424+ umfFixedMemoryProviderParamsSetMemory (NULL , memory_buffer, memory_size);
425+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
426+
427+ umf_result =
428+ umfFixedMemoryProviderParamsSetMemory (valid_params, NULL , memory_size);
429+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
430+
431+ umf_result =
432+ umfFixedMemoryProviderParamsSetMemory (valid_params, memory_buffer, 0 );
433+ ASSERT_EQ (umf_result, UMF_RESULT_ERROR_INVALID_ARGUMENT);
434+
435+ umf_result = umfFixedMemoryProviderParamsDestroy (valid_params);
436+ ASSERT_EQ (umf_result, UMF_RESULT_SUCCESS);
340437}
341438
439+ // Split / merge tests
440+
342441TEST_P (FixedProviderTest, merge) {
343442 umf_result_t umf_result;
344443 void *ptr1 = nullptr ;
0 commit comments