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

namespace Livt.Net.Tests

using Livt.Net

/**
 * Exercises provider-relative parsing, independent expected values and reuse.
 */
@Test
component TcpConnectionRecognizerTest
{
	// Shared request parsers; source remains owned by this fixture.
	ethernet: EthernetFrameParser<PacketRegion<ArrayPacketData<128>>>
	ipv4: Ipv4PacketParser<EthernetFrameParser<PacketRegion<ArrayPacketData<128>>>>

	data: ArrayPacketData<128>
	region: PacketRegion<ArrayPacketData<128>>
	parser: TcpConnectionRecognizer<PacketRegion<ArrayPacketData<128>>>

	/**
	 * Wires packet storage and a deliberately offset protocol region.
	 */
	new()
	{
		data = new ArrayPacketData<128>()
		region = new PacketRegion<ArrayPacketData<128>>(data)
		this.ethernet = new EthernetFrameParser<PacketRegion<ArrayPacketData<128>>>(region)
		this.ipv4 = new Ipv4PacketParser<EthernetFrameParser<PacketRegion<ArrayPacketData<128>>>>(this.ethernet)
		parser = new TcpConnectionRecognizer<PacketRegion<ArrayPacketData<128>>>(this.ethernet, this.ipv4)
	}

	/**
	 * 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 < 1; i++) {
			assert data.TryWrite(i, 0xA5) == PacketDataResult.Success
		}

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

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

	/**
	 * SeparatesEndpointAcceptanceFromSupportedHeaders.
	 */
	@Test
	fn SeparatesEndpointAcceptanceFromSupportedHeaders()
	{
		var bytes: byte[128]
		var ip: byte[4] = [0x0A, 0x00, 0x00, 0x01]
		bytes[12] = 0x08
		bytes[14] = 0x45
		bytes[17] = 0x28
		bytes[23] = 0x06
		bytes[30] = 0x0A
		bytes[33] = 0x01
		bytes[37] = 0x50
		bytes[46] = 0x50
		bytes[47] = 0x02
		this.Load(bytes, 60)
		assert parser.TryParse() == PacketParseResult.Success
		assert parser.IsSynRequest(ip, 80)
		assert !parser.IsSynRequest(ip, 81)
		assert !parser.IsAckOnlyPacket(ip, 80)
		bytes[47] = 0x10
		this.Load(bytes, 60)
		assert parser.TryParse() == PacketParseResult.Success
		assert parser.IsAckOnlyPacket(ip, 80)
		bytes[47] = 0x18
		bytes[17] = 0x80
		this.Load(bytes, 60)
		assert parser.TryParse() == PacketParseResult.HeaderOnly
		assert parser.IsPshAckPacket(ip, 80)
		assert parser.GetAvailableLength() == 6
		assert parser.GetDeclaredPayloadLength() == 88
	}

	/**
	 * AcceptsSynOptionsButRejectsTruncatedOptionExtent.
	 */
	@Test
	fn AcceptsSynOptionsButRejectsTruncatedOptionExtent()
	{
		var bytes: byte[128]
		var ip: byte[4] = [0x0A, 0x00, 0x00, 0x01]
		bytes[12] = 0x08
		bytes[14] = 0x45
		bytes[17] = 0x28
		bytes[23] = 0x06
		bytes[30] = 0x0A
		bytes[33] = 0x01
		bytes[37] = 0x50
		bytes[46] = 0x50
		bytes[47] = 0x02
		bytes[17] = 0x2C
		bytes[46] = 0x60
		this.Load(bytes, 58)
		assert parser.TryParse() == PacketParseResult.Success
		assert parser.IsSynRequest(ip, 80)
		this.Load(bytes, 57)
		assert parser.TryParse() == PacketParseResult.Truncated
		assert !parser.IsSynRequest(ip, 80)
		bytes[23] = 0x01
		this.Load(bytes, 58)
		assert parser.TryParse() == PacketParseResult.Unsupported
		assert !parser.IsReady()
	}
}