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/services/NetworkPolicyTest.lvt

namespace Livt.Net.Tests

using Livt.Net

/**
 * Exercises successive protocol requests and held response ownership through a test link.
 */
@Test
component NetworkPolicyTest
{
	// Shared request parsers; source remains owned by this fixture.
	ethernet: EthernetFrameParser<TestFrameReceiver<128>>
	ipv4: Ipv4PacketParser<EthernetFrameParser<TestFrameReceiver<128>>>

	receiver: TestFrameReceiver<128>
	policy: TrustedPeer
	arp: ArpService<TestFrameReceiver<128>, TrustedPeer>
	icmp: IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>
	service: ServiceChain<ArpService<TestFrameReceiver<128>, TrustedPeer>, IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>>
	transmitter: TestFrameTransmitter<ServiceChain<ArpService<TestFrameReceiver<128>, TrustedPeer>, IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>>>
	endpoint: FrameService<TestFrameReceiver<128>, ServiceChain<ArpService<TestFrameReceiver<128>, TrustedPeer>, IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>>, TestFrameTransmitter<ServiceChain<ArpService<TestFrameReceiver<128>, TrustedPeer>, IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>>>>

	/**
	 * Builds the fixed link, common service and lifecycle coordinator.
	 */
	new()
	{
		this.receiver = new TestFrameReceiver<128>()
		var mac: byte[6] = [0x00,0x00,0x5E,0x00,0xFA,0xCE]
		var ip: byte[4] = [10,0,0,1]
		this.policy = new TrustedPeer()
		this.ethernet = new EthernetFrameParser<TestFrameReceiver<128>>(this.receiver)
		this.ipv4 = new Ipv4PacketParser<EthernetFrameParser<TestFrameReceiver<128>>>(this.ethernet)
		this.arp = new ArpService<TestFrameReceiver<128>, TrustedPeer>(this.receiver, this.ethernet, this.policy, mac, ip)
		this.icmp = new IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>(this.receiver, this.ethernet, this.ipv4, this.policy, mac, ip)
		this.service = new ServiceChain<ArpService<TestFrameReceiver<128>, TrustedPeer>, IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>>(this.arp, this.icmp)
		this.transmitter = new TestFrameTransmitter<ServiceChain<ArpService<TestFrameReceiver<128>, TrustedPeer>, IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>>>(this.service)
		this.endpoint = new FrameService<TestFrameReceiver<128>, ServiceChain<ArpService<TestFrameReceiver<128>, TrustedPeer>, IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>>, TestFrameTransmitter<ServiceChain<ArpService<TestFrameReceiver<128>, TrustedPeer>, IcmpEchoService<TestFrameReceiver<128>, TrustedPeer>>>>(this.receiver, this.service, this.transmitter)
	}

	/**
	 * Publishes a fresh initialized frame independently of response storage.
	 */
	fn Inject(frame: byte[60])
	{
		for (var i = 0; i < 60; i++) {
			assert this.receiver.InjectByte(i, frame[i]) == FrameLinkResult.Success
		}

		assert this.receiver.Publish(false, 0) == FrameLinkResult.Success
	}

	/**
	 * Checks every emitted byte and retained completion, then permits the next request.
	 */
	fn Complete(expected: byte[60])
	{
		for (var i = 0; i <= 60; i++) {
			this.transmitter.Advance()
		}

		assert this.endpoint.Poll() == FrameServiceProgress.Completed
		assert !this.service.IsReady()
		assert !this.transmitter.IsSourceBorrowed()
		var value: byte = 0xEE

		for (var i = 0; i < 60; i++) {
			assert this.transmitter.TryReadCaptured(i, value) == PacketDataResult.Success
			assert value == expected[i]
		}

		var outcome = FrameTransmitOutcome.DeviceFailure
		assert this.endpoint.TryGetCompletion(outcome) == FrameLinkResult.Success
		assert outcome == FrameTransmitOutcome.Delivered
		assert this.endpoint.Poll() == FrameServiceProgress.Completed
		assert this.endpoint.TryGetCompletion(outcome) == FrameLinkResult.Success
		assert outcome == FrameTransmitOutcome.Delivered
		assert this.endpoint.TryAcknowledgeCompletion() == FrameLinkResult.Success
		assert this.endpoint.TryGetCompletion(outcome) == FrameLinkResult.NotReady
	}

	/**
	 * Checks policy substitution without changing ARP/ICMP encoding or device code.
	 */
	@Test
	fn RejectsUntrustedPeersAndComposesBothAcceptedProtocols()
	{
		var denied: byte[60] = ServicePackets.ARP
		denied[6] = 0x03
		this.Inject(denied)
		assert this.endpoint.Poll() == FrameServiceProgress.Ignored
		assert !this.service.IsReady()
		this.Inject(ServicePackets.ARP)
		assert this.endpoint.Poll() == FrameServiceProgress.Pending
		assert this.endpoint.Poll() == FrameServiceProgress.Pending
		this.Complete(ServicePackets.ARP_REPLY)
		denied = ServicePackets.ICMP
		denied[6] = 0x03
		this.Inject(denied)
		assert this.endpoint.Poll() == FrameServiceProgress.Ignored
		this.Inject(ServicePackets.ICMP)
		assert this.endpoint.Poll() == FrameServiceProgress.Pending
		assert this.endpoint.Poll() == FrameServiceProgress.Pending
		this.Complete(ServicePackets.ICMP_REPLY)
	}
}