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

namespace Livt.Net.Tests

using Livt.Net
using Livt.IO

/** Controllable complete-frame IO capability, independent of the Net adapter. */
component EthernetIoReceiveFixture : IEthernetReceiver
{
	failRead: bool
	readError: bool
	storage: TestFrameReceiver<128>

	new()
	{
		this.storage = new TestFrameReceiver<128>()
	}

	public fn Inject(frame: byte[60])
	{
		for (var i = 0; i < 60; i++) {
			assert storage.InjectByte(i, frame[i]) == FrameLinkResult.Success
		}

		assert storage.Publish(true, 60) == FrameLinkResult.Success
	}

	public fn SetReadFailure(value: bool)
	{
		failRead = value
	}

	public fn Fail()
	{
		storage.FailReceive()
	}

	override fn GetReceiveCapacity() int
	{
		return 128
	}

	override fn HasReceiveFrame() bool
	{
		return storage.HasReceiveFrame()
	}

	override fn TryAcquire() EthernetResult
	{
		var r = storage.TryAcquire()

		if (r == FrameLinkResult.Success) { return EthernetResult.Success }

		if (r == FrameLinkResult.Busy) { return EthernetResult.Busy }

		if (r == FrameLinkResult.DeviceFailure) { return EthernetResult.DeviceFailure }

		return EthernetResult.NotReady
	}

	override fn GetReceiveLength() int
	{
		return storage.GetAvailableLength()
	}

	override fn TryRead(index: int, value: out byte) EthernetResult
	{
		value = 0

		if (failRead) {
			readError = true;
			return EthernetResult.DeviceFailure
		}

		var r = storage.TryRead(index, value)

		if (r == PacketDataResult.Success) { return EthernetResult.Success }

		if (r == PacketDataResult.Invalid) { return EthernetResult.Invalid }

		return EthernetResult.NotReady
	}

	override fn TryRelease() EthernetResult
	{
		if (storage.TryRelease() == FrameLinkResult.Success) { return EthernetResult.Success }

		return EthernetResult.Invalid
	}

	override fn HasReceiveError() bool
	{
		return readError || storage.HasReceiveError()
	}

	override fn TryAcknowledgeReceiveError() EthernetResult
	{
		if (readError) {
			readError = false;
			return EthernetResult.Success
		}

		if (storage.TryAcknowledgeReceiveError() == FrameLinkResult.Success) { return EthernetResult.Success }

		return EthernetResult.NotReady
	}

	override fn GetDiscardCount(reason: EthernetReceiveDiscard) uint
	{
		return 0
	}
}