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

namespace Livt.Net.Tests

using Livt.Net

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

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

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

	/**
	 * DecodesPortsSequenceAndFlagsAtArbitraryOffset.
	 */
	@Test
	fn DecodesPortsSequenceAndFlagsAtArbitraryOffset()
	{
		var bytes: byte[128]
		bytes[0] = 0xFE
		bytes[1] = 0xDC
		bytes[3] = 0x50
		bytes[4] = 0xFF
		bytes[5] = 0xFF
		bytes[6] = 0xFF
		bytes[7] = 0xFE
		bytes[8] = 0x80
		bytes[12] = 0x50
		bytes[13] = 0x18
		bytes[20] = 0x47
		this.Load(bytes, 21)
		assert parser.TryParse() == PacketParseResult.Success
		assert parser.GetSourcePort() == 65244
		assert parser.GetDestinationPort() == 80
		assert parser.GetSequenceNumber() == (4294967294 as uint)
		assert parser.GetAcknowledgmentNumber() == (2147483648 as uint)
		assert parser.GetFlags() == 0x18
		assert parser.GetHeaderLength() == 20
		var value: byte = 0x00
		assert parser.TryRead(0, value) == PacketDataResult.Success
		assert value == 0x47
		assert parser.TryRead(1, value) == PacketDataResult.Invalid
	}

	/**
	 * ChecksOptionExtentAndRejectsInvalidDataOffset.
	 */
	@Test
	fn ChecksOptionExtentAndRejectsInvalidDataOffset()
	{
		var bytes: byte[128]
		bytes[0] = 0xFE
		bytes[1] = 0xDC
		bytes[3] = 0x50
		bytes[4] = 0xFF
		bytes[5] = 0xFF
		bytes[6] = 0xFF
		bytes[7] = 0xFE
		bytes[8] = 0x80
		bytes[12] = 0x50
		bytes[13] = 0x18
		bytes[12] = 0x60
		bytes[24] = 0xAC
		this.Load(bytes, 25)
		assert parser.TryParse() == PacketParseResult.Success
		assert parser.GetHeaderLength() == 24
		assert parser.GetAvailableLength() == 1
		var value: byte = 0x00
		assert parser.TryRead(0, value) == PacketDataResult.Success
		assert value == 0xAC
		this.Load(bytes, 23)
		assert parser.TryParse() == PacketParseResult.Truncated
		assert parser.GetSourcePort() == 0
		bytes[12] = 0x40
		this.Load(bytes, 20)
		assert parser.TryParse() == PacketParseResult.Invalid
		bytes[12] = 0x51
		this.Load(bytes, 20)
		assert parser.TryParse() == PacketParseResult.Unsupported
	}
}