More unit tests
This commit is contained in:
parent
653ff61ca3
commit
1829548cd5
1 changed files with 107 additions and 3 deletions
110
test/unit/unit.c
110
test/unit/unit.c
|
@ -582,6 +582,104 @@ START_TEST(test_arp_lookup_failure) {
|
|||
END_TEST
|
||||
|
||||
|
||||
// Test for `transport_checksum` calculation
|
||||
START_TEST(test_transport_checksum) {
|
||||
union transport_pseudo_header ph;
|
||||
struct ipstack_tcp_seg tcp_data;
|
||||
memset(&ph, 0, sizeof(ph));
|
||||
memset(&tcp_data, 0, sizeof(tcp_data));
|
||||
|
||||
// Set up pseudo-header values for test
|
||||
ph.ph.src = 0xc0a80101; // 192.168.1.1
|
||||
ph.ph.dst = 0xc0a80102; // 192.168.1.2
|
||||
ph.ph.proto = IPPROTO_TCP;
|
||||
ph.ph.len = ee16(20); // TCP header length (without options)
|
||||
|
||||
// Test with a simple TCP header with src/dst ports and no data
|
||||
tcp_data.src_port = ee16(12345);
|
||||
tcp_data.dst_port = ee16(80);
|
||||
tcp_data.seq = ee32(1);
|
||||
tcp_data.ack = ee32(0);
|
||||
tcp_data.hlen = 5; // offset=5 (20 bytes)
|
||||
tcp_data.flags = 0x02; // SYN
|
||||
tcp_data.win = ee16(65535);
|
||||
|
||||
uint16_t checksum = transport_checksum(&ph, &tcp_data.src_port);
|
||||
ck_assert_msg(checksum != 0, "Transport checksum should not be zero");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
// Test for `iphdr_set_checksum` calculation
|
||||
START_TEST(test_iphdr_set_checksum) {
|
||||
struct ipstack_ip_packet ip;
|
||||
memset(&ip, 0, sizeof(ip));
|
||||
|
||||
ip.ver_ihl = 0x45;
|
||||
ip.tos = 0;
|
||||
ip.len = ee16(20);
|
||||
ip.id = ee16(1);
|
||||
ip.flags_fo = 0;
|
||||
ip.ttl = 64;
|
||||
ip.proto = IPPROTO_TCP;
|
||||
ip.src = ee32(0xc0a80101); // 192.168.1.1
|
||||
ip.dst = ee32(0xc0a80102); // 192.168.1.2
|
||||
|
||||
iphdr_set_checksum(&ip);
|
||||
ck_assert_msg(ip.csum != 0, "IP header checksum should not be zero");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
// Test for `eth_output_add_header` to add Ethernet headers
|
||||
START_TEST(test_eth_output_add_header) {
|
||||
struct ipstack_eth_frame eth_frame;
|
||||
struct ipstack S;
|
||||
memset(&S, 0, sizeof(S));
|
||||
memset(ð_frame, 0, sizeof(eth_frame));
|
||||
|
||||
uint8_t test_mac[6] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
|
||||
memcpy(S.ll_dev.mac, test_mac, 6);
|
||||
|
||||
eth_output_add_header(&S, NULL, ð_frame, ETH_TYPE_IP);
|
||||
|
||||
ck_assert_mem_eq(eth_frame.dst, "\xff\xff\xff\xff\xff\xff", 6); // Broadcast
|
||||
ck_assert_mem_eq(eth_frame.src, test_mac, 6);
|
||||
ck_assert_uint_eq(eth_frame.type, ee16(ETH_TYPE_IP));
|
||||
}
|
||||
END_TEST
|
||||
|
||||
// Test for `ip_output_add_header` to set up IP headers and calculate checksums
|
||||
START_TEST(test_ip_output_add_header) {
|
||||
struct tsocket t;
|
||||
struct ipstack_ip_packet ip;
|
||||
struct ipstack S;
|
||||
memset(&t, 0, sizeof(t));
|
||||
memset(&ip, 0, sizeof(ip));
|
||||
memset(&S, 0, sizeof(S));
|
||||
|
||||
// Setup socket and IP stack parameters
|
||||
t.local_ip = 0xc0a80101; // 192.168.1.1
|
||||
t.remote_ip = 0xc0a80102; // 192.168.1.2
|
||||
t.S = &S;
|
||||
|
||||
// Run the function for a TCP packet
|
||||
int result = ip_output_add_header(&t, &ip, IPPROTO_TCP, 40);
|
||||
ck_assert_int_eq(result, 0);
|
||||
|
||||
// Validate IP header fields
|
||||
ck_assert_uint_eq(ip.ver_ihl, 0x45);
|
||||
ck_assert_uint_eq(ip.ttl, 64);
|
||||
ck_assert_uint_eq(ip.proto, IPPROTO_TCP);
|
||||
ck_assert_uint_eq(ip.src, ee32(t.local_ip));
|
||||
ck_assert_uint_eq(ip.dst, ee32(t.remote_ip));
|
||||
ck_assert_msg(ip.csum != 0, "IP header checksum should not be zero");
|
||||
|
||||
// Check the pseudo-header checksum calculation for TCP segment
|
||||
struct ipstack_tcp_seg *tcp = (struct ipstack_tcp_seg *)&ip;
|
||||
ck_assert_msg(tcp->csum != 0, "TCP checksum should not be zero");
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
||||
|
||||
Suite *femto_suite(void)
|
||||
{
|
||||
|
@ -662,9 +760,15 @@ Suite *femto_suite(void)
|
|||
suite_add_tcase(s, tc_proto);
|
||||
tcase_add_test(tc_proto, test_arp_lookup_failure);
|
||||
suite_add_tcase(s, tc_proto);
|
||||
|
||||
|
||||
|
||||
|
||||
tcase_add_test(tc_utils, test_transport_checksum);
|
||||
suite_add_tcase(s, tc_proto);
|
||||
tcase_add_test(tc_utils, test_iphdr_set_checksum);
|
||||
suite_add_tcase(s, tc_proto);
|
||||
tcase_add_test(tc_utils, test_eth_output_add_header);
|
||||
suite_add_tcase(s, tc_proto);
|
||||
tcase_add_test(tc_utils, test_ip_output_add_header);
|
||||
suite_add_tcase(s, tc_proto);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue