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/ethernet/EthernetFrameContractTest.lvt

namespace Livt.Net.Tests

using Livt.Net
using Livt.IO
using Livt.Net.Drivers.Ethernet

@Test
component EthernetFrameContractTest
{
	source: PacketMetadataStub
	device: EthernetIoTransmitFixture
	transmitter: EthernetFrameTransmitter<PacketMetadataStub>
	checks: TransmitContractChecks<EthernetFrameTransmitter<PacketMetadataStub>>

	new()
	{
		source = new PacketMetadataStub()
		device = new EthernetIoTransmitFixture()
		transmitter = new EthernetFrameTransmitter<PacketMetadataStub>(device, source)
		checks = new TransmitContractChecks<EthernetFrameTransmitter<PacketMetadataStub>>(transmitter)
	}

	fn Configure(length: int, ready: bool)
	{
		source.Configure(length, 0x0800, 1, ready, -1)
	}

	@Test fn AdmissionBoundsAndCompletionOwnership()
	{
		var outcome = FrameTransmitOutcome.Delivered
		assert transmitter.TryCancel() == FrameLinkResult.Invalid
		assert transmitter.TryAcknowledgeCompletion() == FrameLinkResult.NotReady
		Configure(60, false)
		assert transmitter.TrySubmit() == FrameLinkResult.Invalid
		Configure(0, true)
		assert transmitter.TrySubmit() == FrameLinkResult.Invalid
		Configure(59, true)
		assert transmitter.TrySubmit() == FrameLinkResult.Unsupported
		Configure(129, true)
		assert transmitter.TrySubmit() == FrameLinkResult.Unsupported
		assert device.IsFree()
		assert !transmitter.IsSourceBorrowed()
		Configure(128, true)
		device.SetReady(false)
		assert transmitter.TrySubmit() == FrameLinkResult.NotReady
		assert !transmitter.IsSourceBorrowed()
		device.SetReady(true)
		assert transmitter.TrySubmit() == FrameLinkResult.Accepted
		checks.Pending()
		assert transmitter.TryCancel() == FrameLinkResult.Unsupported
		var attempts = 0

		while (!device.IsCommitted()) {
			attempts++;
			assert attempts < 3000
		}

		assert device.GetCount() == 128
		assert device.Read(127) == 0xA5
		checks.Pending()
		device.Complete(EthernetTransmitOutcome.Sent)
		attempts = 0

		while (transmitter.TryGetCompletion(outcome) != FrameLinkResult.Success) {
			attempts++;
			assert attempts < 3000
		}

		checks.Completed(FrameTransmitOutcome.Delivered)
		assert device.IsFree()
		// Rejected arguments cannot replace a retained result.
		Configure(60, true)
		assert transmitter.TrySubmit() == FrameLinkResult.Accepted
		attempts = 0

		while (!device.IsCommitted()) {
			attempts++;
			assert attempts < 3000
		}

		device.Complete(EthernetTransmitOutcome.LinkLost)
		attempts = 0

		while (transmitter.IsSourceBorrowed()) {
			attempts++;
			assert attempts < 3000
		}

		Configure(0, false)
		assert transmitter.TrySubmit() == FrameLinkResult.Busy
		checks.Completed(FrameTransmitOutcome.DeviceFailure)
	}
}