| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | // ArduinoJson - https://arduinojson.org
 | 
					
						
							| 
									
										
										
										
											2024-01-03 08:47:06 +01:00
										 |  |  | // Copyright © 2014-2024, Benoit BLANCHON
 | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | // MIT License
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-17 16:32:39 +02:00
										 |  |  | #include <ArduinoJson.hpp>
 | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | #include <catch.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Allocators.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace ArduinoJson::detail; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  | TEST_CASE("ResourceManager::allocVariant()") { | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  |   SECTION("Returns different pointer") { | 
					
						
							| 
									
										
										
										
											2023-07-17 18:15:13 +02:00
										 |  |  |     ResourceManager resources; | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |     auto s1 = resources.allocVariant(); | 
					
						
							| 
									
										
										
										
											2024-08-25 14:51:59 +02:00
										 |  |  |     REQUIRE(s1.ptr() != nullptr); | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |     auto s2 = resources.allocVariant(); | 
					
						
							| 
									
										
										
										
											2024-08-25 14:51:59 +02:00
										 |  |  |     REQUIRE(s2.ptr() != nullptr); | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-25 14:51:59 +02:00
										 |  |  |     REQUIRE(s1.ptr() != s2.ptr()); | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |   SECTION("Returns the same slot after calling freeVariant()") { | 
					
						
							| 
									
										
										
										
											2023-07-20 17:54:38 +02:00
										 |  |  |     ResourceManager resources; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |     auto s1 = resources.allocVariant(); | 
					
						
							|  |  |  |     auto s2 = resources.allocVariant(); | 
					
						
							|  |  |  |     resources.freeVariant(s1); | 
					
						
							|  |  |  |     resources.freeVariant(s2); | 
					
						
							|  |  |  |     auto s3 = resources.allocVariant(); | 
					
						
							|  |  |  |     auto s4 = resources.allocVariant(); | 
					
						
							|  |  |  |     auto s5 = resources.allocVariant(); | 
					
						
							| 
									
										
										
										
											2023-07-20 17:54:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(s2.id() != s1.id()); | 
					
						
							|  |  |  |     REQUIRE(s3.id() == s2.id()); | 
					
						
							|  |  |  |     REQUIRE(s4.id() == s1.id()); | 
					
						
							|  |  |  |     REQUIRE(s5.id() != s1.id()); | 
					
						
							|  |  |  |     REQUIRE(s5.id() != s2.id()); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  |   SECTION("Returns aligned pointers") { | 
					
						
							| 
									
										
										
										
											2023-07-17 18:15:13 +02:00
										 |  |  |     ResourceManager resources; | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-25 14:51:59 +02:00
										 |  |  |     REQUIRE(isAligned(resources.allocVariant().ptr())); | 
					
						
							|  |  |  |     REQUIRE(isAligned(resources.allocVariant().ptr())); | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |   SECTION("Returns null if pool list allocation fails") { | 
					
						
							| 
									
										
										
										
											2023-07-17 18:15:13 +02:00
										 |  |  |     ResourceManager resources(FailingAllocator::instance()); | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |     auto variant = resources.allocVariant(); | 
					
						
							| 
									
										
										
										
											2023-06-14 11:57:31 +02:00
										 |  |  |     REQUIRE(variant.id() == NULL_SLOT); | 
					
						
							| 
									
										
										
										
											2024-08-25 14:51:59 +02:00
										 |  |  |     REQUIRE(variant.ptr() == nullptr); | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |   SECTION("Returns null if pool allocation fails") { | 
					
						
							| 
									
										
										
										
											2023-07-21 10:38:35 +02:00
										 |  |  |     ResourceManager resources(FailingAllocator::instance()); | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |     resources.allocVariant(); | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |     auto variant = resources.allocVariant(); | 
					
						
							| 
									
										
										
										
											2023-06-14 11:57:31 +02:00
										 |  |  |     REQUIRE(variant.id() == NULL_SLOT); | 
					
						
							| 
									
										
										
										
											2024-08-25 14:51:59 +02:00
										 |  |  |     REQUIRE(variant.ptr() == nullptr); | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-07-20 19:04:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   SECTION("Try overflow pool counter") { | 
					
						
							|  |  |  |     ResourceManager resources; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // this test assumes SlotId is 8-bit; otherwise it consumes a lot of memory
 | 
					
						
							|  |  |  |     // tyhe GitHub Workflow gets killed
 | 
					
						
							|  |  |  |     REQUIRE(NULL_SLOT == 255); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // fill all the pools
 | 
					
						
							|  |  |  |     for (SlotId i = 0; i < NULL_SLOT; i++) { | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |       auto slot = resources.allocVariant(); | 
					
						
							| 
									
										
										
										
											2023-07-20 19:04:40 +02:00
										 |  |  |       REQUIRE(slot.id() == i);  // or != NULL_SLOT
 | 
					
						
							| 
									
										
										
										
											2024-08-25 14:51:59 +02:00
										 |  |  |       REQUIRE(slot.ptr() != nullptr); | 
					
						
							| 
									
										
										
										
											2023-07-20 19:04:40 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(resources.overflowed() == false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // now all allocations should fail
 | 
					
						
							|  |  |  |     for (int i = 0; i < 10; i++) { | 
					
						
							| 
									
										
										
										
											2024-08-24 18:18:28 +02:00
										 |  |  |       auto slot = resources.allocVariant(); | 
					
						
							| 
									
										
										
										
											2023-07-20 19:04:40 +02:00
										 |  |  |       REQUIRE(slot.id() == NULL_SLOT); | 
					
						
							| 
									
										
										
										
											2024-08-25 14:51:59 +02:00
										 |  |  |       REQUIRE(slot.ptr() == nullptr); | 
					
						
							| 
									
										
										
										
											2023-07-20 19:04:40 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(resources.overflowed() == true); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-06-17 16:10:56 +02:00
										 |  |  | } |