You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

137 lines
4.5 KiB

/**
* Integration test for ETCP protocol with packet pool
* Tests: etcp_create, add_socket, packet processing, channel creation
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include "../src/etcp.h"
#include "../src/packet_buffer.h"
#include "../src/packet_pool.h"
static int g_data_ready_called = 0;
static etcp_channel_t* g_last_channel = NULL;
static packet_buffer_t* g_last_packet = NULL;
static void test_data_ready_cb(struct ETCP_CONN* etcp, etcp_channel_t* channel,
packet_buffer_t* pkt, void* user_data) {
(void)etcp;
(void)user_data;
g_data_ready_called++;
g_last_channel = channel;
g_last_packet = pkt;
printf(" Data ready: channel=%p, packet=%p, len=%zu\n",
channel, pkt, packet_data_len(pkt));
}
int main() {
printf("=== ETCP Integration Test ===\n");
// Test 1: Create ETCP instance
printf("Test 1: Creating ETCP instance...");
uint64_t node_id = 0x123456789ABCDEF0;
struct ETCP_CONN* etcp = etcp_create(node_id, 1500);
assert(etcp != NULL);
assert(etcp->node_id == node_id);
printf(" PASS (node_id=0x%llx)\n", (unsigned long long)node_id);
// Test 2: Add socket
printf("Test 2: Adding UDP socket...");
int ret = etcp_add_socket(etcp, "127.0.0.1", 0); // 0 = any port
assert(ret == 0);
assert(etcp->socket_count == 1);
printf(" PASS (socket_count=%d)\n", etcp->socket_count);
// Test 3: Set data ready callback
printf("Test 3: Setting data ready callback...");
etcp_set_data_ready_callback(etcp, test_data_ready_cb, NULL);
assert(etcp->data_ready_cb != NULL);
printf(" PASS\n");
// Test 4: Create a test packet (simulating incoming packet)
printf("Test 4: Processing incoming INIT packet...");
packet_buffer_t* pkt = packet_pool_get(&etcp->packet_pool);
assert(pkt != NULL);
// Fill packet as if it came from socket
pkt->metadata.socket = etcp->sockets[0];
pkt->metadata.timestamp_us = 1000;
pkt->metadata.flags = 0;
pkt->metadata.stage = PACKET_STAGE_RX_SOCKET;
// Set source address
struct sockaddr_in src_addr;
src_addr.sin_family = AF_INET;
src_addr.sin_port = htons(50001);
inet_pton(AF_INET, "127.0.0.1", &src_addr.sin_addr);
memcpy(&pkt->metadata.src_addr, &src_addr, sizeof(src_addr));
// Set packet data (INIT packet)
memcpy(packet_data(pkt), "INIT", 4);
packet_set_data_len(pkt, 4);
g_data_ready_called = 0;
etcp_packet_input(etcp, pkt);
// Check that callback was called and channel was created
assert(g_data_ready_called == 1);
assert(g_last_channel != NULL);
assert(g_last_packet == pkt);
assert(etcp->channel_count == 1);
printf(" PASS (channel_count=%d, callback called)\n", etcp->channel_count);
// Test 5: Get pool statistics
printf("Test 5: Getting pool statistics...");
size_t allocs, reuse, overflow;
packet_pool_get_stats(&etcp->packet_pool, &allocs, &reuse, &overflow);
printf(" PASS (allocs=%zu, reuse=%zu, overflow=%zu)\n", allocs, reuse, overflow);
// Test 6: Send data through channel
printf("Test 6: Sending data through channel...");
const char* test_data = "Hello, ETCP!";
ret = etcp_send(etcp, g_last_channel, (const uint8_t*)test_data, strlen(test_data));
assert(ret == 0);
printf(" PASS\n");
// Test 7: Get ETCP statistics
printf("Test 7: Getting ETCP statistics...");
etcp_get_stats(etcp, &allocs, &reuse, NULL, NULL);
printf(" PASS\n");
// Test 8: Destroy ETCP instance
printf("Test 8: Destroying ETCP instance...");
etcp_destroy(etcp);
printf(" PASS\n");
// Test 9: Test packet buffer operations
printf("Test 9: Testing packet buffer operations...");
packet_buffer_t test_pkt;
packet_init(&test_pkt);
// Test metadata
packet_set_encrypted(&test_pkt, 1);
assert(packet_is_encrypted(&test_pkt) != 0);
packet_set_fragmented(&test_pkt, 1);
assert(packet_is_fragmented(&test_pkt) != 0);
packet_set_stage(&test_pkt, PACKET_STAGE_RX_DECRYPTED);
assert(packet_stage(&test_pkt) == PACKET_STAGE_RX_DECRYPTED);
// Test addresses
memcpy(packet_src_addr(&test_pkt), &src_addr, sizeof(src_addr));
assert(packet_src_port(&test_pkt) == src_addr.sin_port);
printf(" PASS\n");
printf("\n=== All ETCP Integration Tests Passed ===\n");
return 0;
}