/** * Test for packet pool and packet buffer * Tests allocation, reuse, overflow and basic operations */ #include #include #include #include #include #include "../src/packet_pool.h" #include "../src/packet_buffer.h" int main() { printf("=== Packet Pool Test ===\n"); // Test 1: Initialize packet pool printf("Test 1: Initializing packet pool..."); packet_pool_t pool; packet_pool_init(&pool); printf(" PASS\n"); // Test 2: Get statistics (should show some pre-allocated packets) printf("Test 2: Getting initial statistics..."); size_t allocs, reuse, overflow; packet_pool_get_stats(&pool, &allocs, &reuse, &overflow); printf(" PASS (pre-alloc done)\n"); // Test 3: Allocate packet from pool printf("Test 3: Allocating packet from pool..."); packet_buffer_t* pkt1 = packet_pool_get(&pool); assert(pkt1 != NULL); assert(packet_data_len(pkt1) == 0); printf(" PASS\n"); // Test 4: Set and get data printf("Test 4: Setting packet data..."); const char* test_data = "Test packet data"; size_t test_len = strlen(test_data); memcpy(packet_data(pkt1), test_data, test_len); packet_set_data_len(pkt1, test_len); assert(packet_data_len(pkt1) == test_len); assert(memcmp(packet_data(pkt1), test_data, test_len) == 0); printf(" PASS\n"); // Test 5: Test metadata printf("Test 5: Testing packet metadata..."); packet_set_encrypted(pkt1, 1); assert(packet_is_encrypted(pkt1) == 1); packet_set_encrypted(pkt1, 0); assert(packet_is_encrypted(pkt1) == 0); packet_set_fragmented(pkt1, 1); int frag = packet_is_fragmented(pkt1); if (frag == 0) { printf(" FAIL: expected non-zero, got %d\n", frag); return 1; } assert(frag != 0); printf(" PASS\n"); packet_set_stage(pkt1, PACKET_STAGE_RX_DECRYPTED); assert(packet_stage(pkt1) == PACKET_STAGE_RX_DECRYPTED); printf(" PASS\n"); // Test 6: Return packet to pool printf("Test 6: Returning packet to pool..."); packet_pool_put(&pool, pkt1); printf(" PASS\n"); // Test 7: Get another packet (should reuse the returned one) printf("Test 7: Checking packet reuse..."); packet_buffer_t* pkt2 = packet_pool_get(&pool); assert(pkt2 != NULL); packet_pool_get_stats(&pool, &allocs, &reuse, &overflow); assert(reuse > 0); // Should have reused some packets printf(" PASS (reuse detected)\n"); // Test 8: Allocate many packets to test overflow printf("Test 8: Testing pool overflow..."); packet_buffer_t* overflow_packets[PACKET_POOL_SIZE * 2]; int overflow_count = 0; // Allocate more than pool size for (int i = 0; i < PACKET_POOL_SIZE * 2; i++) { overflow_packets[i] = packet_pool_get(&pool); if (overflow_packets[i] != NULL) { overflow_count++; } } // Return all packets for (int i = 0; i < overflow_count; i++) { packet_pool_put(&pool, overflow_packets[i]); } packet_pool_get_stats(&pool, &allocs, &reuse, &overflow); printf(" PASS (allocated %d packets, %zu overflows)\n", overflow_count, overflow); // Test 9: Test address metadata printf("Test 9: Testing address metadata..."); packet_buffer_t* pkt3 = packet_pool_get(&pool); struct sockaddr_in test_addr; test_addr.sin_family = AF_INET; test_addr.sin_port = htons(12345); inet_pton(AF_INET, "192.168.1.1", &test_addr.sin_addr); memcpy(packet_src_addr(pkt3), &test_addr, sizeof(test_addr)); assert(packet_src_port(pkt3) == htons(12345)); packet_pool_put(&pool, pkt3); printf(" PASS\n"); // Test 10: Destroy pool printf("Test 10: Destroying packet pool..."); packet_pool_destroy(&pool); printf(" PASS\n"); // Test 11: Test packet size constants printf("Test 11: Checking packet size constants..."); assert(PACKET_TOTAL_SIZE == 1600); assert(PACKET_DATA_SIZE == 1536); assert(PACKET_METADATA_SIZE == 64); printf(" PASS (metadata=%d, data=%d, total=%d)\n", PACKET_METADATA_SIZE, PACKET_DATA_SIZE, PACKET_TOTAL_SIZE); printf("\n=== All Packet Pool Tests Passed ===\n"); return 0; }