Implement first few tests and fix issues with tested files

This commit is contained in:
Sijmen 2021-01-12 16:56:02 +01:00
parent 81ea9e27ca
commit a102c4d984
Signed by: vijfhoek
GPG key ID: DAF7821E067D9C48
11 changed files with 1939 additions and 26 deletions

3
.gitignore vendored
View file

@ -6,4 +6,5 @@
*.lst
*.map
*.swp
test
kernel

View file

@ -28,7 +28,7 @@ uspi/libuspi.a:
$(MAKE) -C uspi
clean:
$(Q)$(RM) $(OBJS) $(TARGET).elf $(TARGET).map $(TARGET).lst $(TARGET).img
$(Q)$(RM) $(OBJS) $(DEPENDS) $(TARGET).elf $(TARGET).map $(TARGET).lst $(TARGET).img
$(MAKE) -C uspi clean
include Makefile.rules

View file

@ -28,11 +28,11 @@ namespace Net::Arp
Packet();
Packet(const uint16_t operation);
constexpr size_t SerializedLength() const
constexpr static size_t SerializedLength()
{
return sizeof(hardwareType) + sizeof(protocolType) + sizeof(hardwareAddressLength) +
sizeof(protocolAddressLength) + sizeof(operation) + senderMac.size() +
sizeof(senderIp) + targetMac.size() + sizeof(targetIp);
sizeof(protocolAddressLength) + sizeof(operation) + sizeof(senderMac) +
sizeof(senderIp) + sizeof(targetMac) + sizeof(targetIp);
}
size_t Serialize(uint8_t* buffer, const size_t bufferSize);

View file

@ -29,14 +29,14 @@ namespace Net::Icmp
buffer[i++] = static_cast<uint8_t>(type);
buffer[i++] = code;
buffer[i++] = 0;
buffer[i++] = 0 >> 8;
buffer[i++] = 0;
std::memcpy(buffer + i, data, dataSize);
i += dataSize;
uint16_t checksum = Utils::InternetChecksum(buffer, i);
buffer[2] = checksum;
buffer[3] = checksum >> 8;
buffer[2] = checksum >> 8;
buffer[3] = checksum;
return i;
}

View file

@ -56,7 +56,7 @@ namespace Net::Ipv4
// Zero the checksum before calculating it
buffer[i++] = 0;
buffer[i++] = 0 >> 8;
buffer[i++] = 0;
buffer[i++] = sourceIp >> 24;
buffer[i++] = sourceIp >> 16;
@ -68,8 +68,8 @@ namespace Net::Ipv4
buffer[i++] = destinationIp;
uint16_t checksum = Net::Utils::InternetChecksum(buffer, i);
buffer[10] = checksum;
buffer[11] = checksum >> 8;
buffer[10] = checksum >> 8;
buffer[11] = checksum;
return i;
}

View file

@ -68,24 +68,19 @@ namespace Net::Utils
uint16_t InternetChecksum(const void* data, size_t size)
{
if (size == 0)
return ~0;
auto u8data = static_cast<const uint8_t*>(data);
uint32_t sum = 0;
while (size > 1)
{
sum += *(uint16_t*)data;
data = (uint16_t*)data + 1;
for (size_t i = 0; i < size - 1; i += 2)
sum += u8data[i] << 8 | u8data[i + 1];
size -= 2;
}
if (size % 2 == 1)
sum += u8data[size - 1] << 8;
if (size > 0)
{
sum += *(uint16_t*)data;
}
while (sum >> 16)
{
sum = (sum & 0xFFFF) + (sum >> 16);
}
sum = (sum >> 16) + (sum & 0xFFFF);
return ~sum;
}

34
tests/Makefile Normal file
View file

@ -0,0 +1,34 @@
SRCDIR = ../src
TESTDIR = .
SRCOBJS := net-utils.o net-arp.o net-ethernet.o
TESTOBJS := tests.o
OBJS := $(addprefix $(TESTDIR)/, $(TESTOBJS)) $(addprefix $(SRCDIR)/, $(SRCOBJS))
INCLUDE = -I../uspi/include/ -I..
CC := clang
CXX := clang++
AFLAGS += $(ARCH)
CFLAGS += $(ARCH) $(INCLUDE) -MMD -MP -Wall -Wno-psabi -fsigned-char -fno-builtin -g -DNDEBUG
CXXFLAGS := $(CFLAGS) $(CXXFLAGS) -std=c++11
CFLAGS += -fno-delete-null-pointer-checks -fdata-sections -ffunction-sections -u _printf_float -std=gnu99
TARGET ?= test
DEPENDS := $(patsubst %.o,%.d,$(OBJS))
-include $(DEPENDS)
.PHONY: all
all: $(TARGET)
./$(TARGET)
$(TARGET): $(OBJS)
@echo "$(OBJS)"
@echo " LINK $@"
$(Q)$(CXX) $(CFLAGS) -o $(TARGET) $(OBJS)
clean:
$(Q)$(RM) $(SRCDIR)/*.o $(TESTDIR)/*.o $(SRCDIR)/*.d $(TESTDIR)/*.d $(TARGET) kernel

1794
tests/acutest.h Normal file

File diff suppressed because it is too large Load diff

23
tests/net-arp.h Normal file
View file

@ -0,0 +1,23 @@
void TestNetArpPacket()
{
using namespace Net::Arp;
constexpr auto size = Packet::SerializedLength();
auto packet = Packet(ARP_OPERATION_REQUEST);
uint8_t buffer[size];
packet.Serialize(buffer, sizeof(buffer));
Packet deserialized;
deserialized.Deserialize(buffer, sizeof(buffer));
TEST_CHECK(packet.hardwareType == deserialized.hardwareType);
TEST_CHECK(packet.protocolType == deserialized.protocolType);
TEST_CHECK(packet.hardwareAddressLength == deserialized.hardwareAddressLength);
TEST_CHECK(packet.protocolAddressLength == deserialized.protocolAddressLength);
TEST_CHECK(packet.operation == deserialized.operation);
TEST_CHECK(packet.senderMac == deserialized.senderMac);
TEST_CHECK(packet.senderIp == deserialized.senderIp);
TEST_CHECK(packet.targetMac == deserialized.targetMac);
TEST_CHECK(packet.targetIp == deserialized.targetIp);
}

42
tests/net-utils.h Normal file
View file

@ -0,0 +1,42 @@
void TestNetUtilsInternetChecksum()
{
{
const char buffer[] = {1, 2, 3, 4, 5, 6, 7, 8};
uint16_t checksum = Net::Utils::InternetChecksum(buffer, sizeof(buffer));
TEST_CHECK(checksum == 61419);
}
{
const char buffer[] = {1, 2, 3, 4, 5, 6, 7};
uint16_t checksum = Net::Utils::InternetChecksum(buffer, sizeof(buffer));
TEST_CHECK(checksum == 61427);
}
{
const char buffer[] = {};
uint16_t checksum = Net::Utils::InternetChecksum(buffer, sizeof(buffer));
TEST_CHECK(checksum == 65535);
}
}
void TestNetUtilsCrc32()
{
{
const uint8_t buffer[] = {1, 2, 3, 4, 5, 6, 7, 8};
uint32_t checksum = Net::Utils::Crc32(buffer, sizeof(buffer));
TEST_CHECK(checksum == 1070237893);
}
{
const uint8_t buffer[] = {};
uint32_t checksum = Net::Utils::Crc32(buffer, sizeof(buffer));
TEST_CHECK(checksum == 0);
}
}
void TestNetUtilsGetMacAddress()
{
auto mac = Net::Utils::GetMacAddress();
auto expected = Net::Utils::MacAddress{0x00, 0x10, 0x20, 0x30, 0x40, 0x50};
TEST_CHECK(mac == expected);
}

24
tests/tests.cpp Normal file
View file

@ -0,0 +1,24 @@
#include "acutest.h"
#include <cstring>
#include <src/net-arp.h>
extern "C" void USPiSendFrame(const void* pBuffer, unsigned nLength) {}
extern "C" void USPiGetMACAddress(unsigned char Buffer[6])
{
for (size_t i = 0; i < 6; i++)
{
Buffer[i] = i << 4;
}
}
#include "net-arp.h"
#include "net-utils.h"
TEST_LIST = {
{"Net::Utils::InternetChecksum", TestNetUtilsInternetChecksum},
{"Net::Utils::Crc32", TestNetUtilsCrc32},
{"Net::Utils::GetMacAddress", TestNetUtilsGetMacAddress},
{"Net::Arp::Packet", TestNetArpPacket},
{nullptr, nullptr},
};