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

namespace Livt.Net.Tests

using Livt.Net

/**
 * Exercises provider-relative parsing, independent expected values and reuse.
 */
@Test
component EthernetFrameParserTest
{
	data: ArrayPacketData<128>
	region: PacketRegion<ArrayPacketData<128>>
	parser: EthernetFrameParser<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 EthernetFrameParser<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 < 3; i++) {
			assert data.TryWrite(i, 0xA5) == PacketDataResult.Success
		}

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

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

	/**
	 * ReadsEthernetMetadataAndBoundsPayload.
	 */
	@Test
	fn ReadsEthernetMetadataAndBoundsPayload()
	{
		var bytes: byte[128]
		bytes[0] = 0xFF
		bytes[6] = 0x82
		bytes[12] = 0x08
		bytes[13] = 0x00
		bytes[14] = 0xAB
		this.Load(bytes, 15)
		assert parser.TryParse() == PacketParseResult.HeaderOnly
		assert parser.GetEtherType() == 2048
		var mac = parser.GetSourceMac()
		assert mac[0] == 0x82
		var destination = parser.GetDestinationMac()
		assert destination[0] == 0xFF
		assert parser.GetAvailableLength() == 1
		var value: byte = 0x00
		assert parser.TryRead(0, value) == PacketDataResult.Success
		assert value == 0xAB
		assert parser.TryRead(1, value) == PacketDataResult.Invalid
	}

	/**
	 * RejectsTruncationAndIeeeLengthWithoutStaleMetadata.
	 */
	@Test
	fn RejectsTruncationAndIeeeLengthWithoutStaleMetadata()
	{
		var bytes: byte[128]
		bytes[12] = 0x08
		bytes[13] = 0x06
		this.Load(bytes, 14)
		assert parser.TryParse() == PacketParseResult.HeaderOnly
		assert parser.GetEtherType() == 2054
		this.Load(bytes, 13)
		assert parser.TryParse() == PacketParseResult.Truncated
		assert parser.GetEtherType() == 0
		bytes[12] = 0x00
		this.Load(bytes, 14)
		assert parser.TryParse() == PacketParseResult.Unsupported
		assert !parser.IsReady()
		parser.Invalidate()
		assert parser.GetStatus() == PacketParseResult.NotReady
	}
}