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/ArpPacketParserTest.lvt

namespace Livt.Net.Tests

using Livt.Net

/**
 * Exercises provider-relative parsing, independent expected values and reuse.
 */
@Test
component ArpPacketParserTest
{
	data: ArrayPacketData<128>
	region: PacketRegion<ArrayPacketData<128>>
	parser: ArpPacketParser<PacketRegion<ArrayPacketData<128>>>

	/**
	 * Wires packet storage and a deliberately offset protocol region.
	 */
	new()
	{
		data = new ArrayPacketData<128>()
		region = new PacketRegion<ArrayPacketData<128>>(data)
		parser = new ArpPacketParser<PacketRegion<ArrayPacketData<128>>>(region)
	}

	/**
	 * Replaces a fixture with correct descendant-first invalidation.
	 */
	fn Load(bytes: byte[128], length: int)
	{
		parser.Invalidate()
		region.TryClose()

		if (data.IsReady()) {
			data.TryRelease()
		}
		else {
			data.TryClear()
		}

		for (var i = 0; i < 5; i++) {
			assert data.TryWrite(i, 0xA5) == PacketDataResult.Success
		}

		for (var i = 0; i < length; i++) {
			assert data.TryWrite(5 + i, bytes[i]) == PacketDataResult.Success
		}

		assert data.TryPublish() == PacketDataResult.Success
		assert region.TryOpen(5, length) == PacketDataResult.Success
	}

	/**
	 * DecodesArpAtRegionOriginAndExcludesPadding.
	 */
	@Test
	fn DecodesArpAtRegionOriginAndExcludesPadding()
	{
		var bytes: byte[128]
		bytes[1] = 0x01
		bytes[2] = 0x08
		bytes[4] = 0x06
		bytes[5] = 0x04
		bytes[7] = 0x01
		bytes[8] = 0x82
		bytes[14] = 0xC0
		bytes[24] = 0xFE
		this.Load(bytes, 40)
		assert parser.TryParse() == PacketParseResult.Success
		assert parser.GetOperation() == 1
		var mac = parser.GetSenderMac()
		var sender = parser.GetSenderIpv4()
		var target = parser.GetTargetIpv4()
		assert mac[0] == 0x82
		assert sender[0] == 0xC0
		assert target[0] == 0xFE
		assert parser.GetAvailableLength() == 0
	}

	/**
	 * RejectsUnsupportedArpAndTruncation.
	 */
	@Test
	fn RejectsUnsupportedArpAndTruncation()
	{
		var bytes: byte[128]
		bytes[1] = 0x01
		bytes[2] = 0x08
		bytes[4] = 0x06
		bytes[5] = 0x04
		bytes[7] = 0x01
		this.Load(bytes, 27)
		assert parser.TryParse() == PacketParseResult.Truncated
		bytes[4] = 0x05
		this.Load(bytes, 28)
		assert parser.TryParse() == PacketParseResult.Unsupported
		assert parser.GetOperation() == 0
		bytes[4] = 0x06
		bytes[7] = 0x02
		this.Load(bytes, 28)
		assert parser.TryParse() == PacketParseResult.Success
		assert parser.GetOperation() == 2
		parser.Invalidate()
		var sender = parser.GetSenderIpv4()
		assert sender[0] == 0x00
	}
}