Livt packages

Livt.Net

Version 1.4.1

Ethernet, IPv4, TCP, UDP, ARP, TFTP, and Telnet networking components for Livt hardware.

Published files (163)

tests/PacketMetadataTest.lvt

namespace Livt.Net.Tests
using Livt.Net

/**
 * Injects invalid metadata and read failures without allocating oversized frame buffers.
 */
@Test
component PacketMetadataTest
{
	// Owned metadata stub and independently prepared protocol views.
	payload: PacketMetadataStub
	frame: EthernetFrame<PacketMetadataStub>
	ip: Ipv4Packet<PacketMetadataStub>
	echo: IcmpEchoReply<PacketMetadataStub>

	/**
	 * Binds protocol views to the configurable source without preparing any packet.
	 */
	new()
	{
		payload = new PacketMetadataStub()
		frame = new EthernetFrame<PacketMetadataStub>(payload)
		ip = new Ipv4Packet<PacketMetadataStub>(payload)
		echo = new IcmpEchoReply<PacketMetadataStub>(payload)
	}

	/**
	 * Checks metadata bounds and verifies that failed preparation clears earlier readiness.
	 */
	@Test
	fn ChecksLimitsAndFailedReplacement()
	{
		frame.Invalidate()
		ip.Invalidate()
		echo.Invalidate()

		var mac: byte[6] = [0x02, 0x01, 0x02, 0x03, 0x04, 0x05]
		var address: byte[4] = [0x0A, 0x00, 0x00, 0x01]
		var id: byte[2] = [0x00, 0x00]
		var value: byte = 0x00
		payload.Configure(1, 0x88B5, 17, true, -1)
		assert frame.TryPrepare(mac, mac) == PacketDataResult.Success
		assert frame.GetAvailableLength() == 60
		assert frame.TryRead(12, value) == PacketDataResult.Success
		assert value == 0x88
		assert frame.TryRead(13, value) == PacketDataResult.Success
		assert value == 0xB5
		assert frame.TryRead(14, value) == PacketDataResult.Success
		assert value == 0xA5
		assert ip.TryPrepare(address, address, id) == PacketDataResult.Success
		assert ip.GetAvailableLength() == 21
		assert ip.TryRead(9, value) == PacketDataResult.Success
		assert value == 0x11
		frame.Invalidate()
		ip.Invalidate()
		payload.Configure(0, 0x0800, 1, false, -1)
		assert frame.TryPrepare(mac, mac) == PacketDataResult.NotReady
		assert ip.TryPrepare(address, address, id) == PacketDataResult.NotReady
		payload.Configure(0, 0x0800, 1, true, -1)
		assert frame.TryPrepare(mac, mac) == PacketDataResult.Invalid
		assert ip.TryPrepare(address, address, id) == PacketDataResult.Invalid
		payload.Configure(-1, 0x0800, 1, true, -1)
		assert frame.TryPrepare(mac, mac) == PacketDataResult.Invalid
		assert ip.TryPrepare(address, address, id) == PacketDataResult.Invalid
		payload.Configure(1501, 0x0800, 1, true, -1)
		assert frame.TryPrepare(mac, mac) == PacketDataResult.Invalid
		payload.Configure(1, 1535, 1, true, -1)
		assert frame.TryPrepare(mac, mac) == PacketDataResult.Invalid
		payload.Configure(1, 65536, 1, true, -1)
		assert frame.TryPrepare(mac, mac) == PacketDataResult.Invalid
		payload.Configure(65516, 0x0800, 1, true, -1)
		assert ip.TryPrepare(address, address, id) == PacketDataResult.Invalid
		payload.Configure(1, 0x0800, -1, true, -1)
		assert ip.TryPrepare(address, address, id) == PacketDataResult.Invalid
		payload.Configure(1, 0x0800, 256, true, -1)
		assert ip.TryPrepare(address, address, id) == PacketDataResult.Invalid
		assert ip.GetAvailableLength() == 0
		assert frame.TryRead(0, value) == PacketDataResult.NotReady
		payload.Configure(65515, 0x0800, 1, true, -1)
		assert ip.TryPrepare(address, address, id) == PacketDataResult.Success
		assert ip.GetAvailableLength() == 65535
		assert ip.TryRead(2, value) == PacketDataResult.Success
		assert value == 0xFF
		assert ip.TryRead(3, value) == PacketDataResult.Success
		assert value == 0xFF

		// Replacement failure clears previously prepared metadata.
		payload.Configure(1, 0x0800, 256, true, -1)
		assert ip.TryPrepare(address, address, id) == PacketDataResult.Invalid
		assert ip.IsReady() == false
		assert ip.TryRead(0, value) == PacketDataResult.NotReady
	}

	/**
	 * Injects a payload read failure and oversized metadata; neither may publish an echo reply.
	 */
	@Test
	fn PropagatesReadFailureAndRejectsOversizedEcho()
	{
		frame.Invalidate()
		ip.Invalidate()
		echo.Invalidate()

		var id: byte[2] = [0x80, 0xFF]
		var value: byte = 0x00
		payload.Configure(3, 0x0800, 1, true, -1)
		assert echo.TryPrepare(id, id) == PacketDataResult.Success
		echo.Invalidate()
		payload.Configure(3, 0x0800, 1, true, 1)
		assert echo.TryPrepare(id, id) == PacketDataResult.Invalid
		assert echo.IsReady() == false
		assert echo.GetAvailableLength() == 0
		assert echo.TryRead(0, value) == PacketDataResult.NotReady
		payload.Configure(65508, 0x0800, 1, true, -1)
		assert echo.TryPrepare(id, id) == PacketDataResult.Invalid
		payload.Configure(-1, 0x0800, 1, true, -1)
		assert echo.TryPrepare(id, id) == PacketDataResult.Invalid
	}
}