@@ -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,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+ ¶ms, 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+
342436TEST_P (FixedProviderTest, merge) {
343437 umf_result_t umf_result;
344438 void *ptr1 = nullptr ;
0 commit comments