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

namespace Livt.Net.Tests

using Livt.Net

/**
 * Literal expectations computed independently from complete network-order packets.
 */
@Test
component ChecksumApiTest
{
	stream: InternetChecksum

	/**
	 * Owns the accumulator used to supply payload word sums to static checksum calls.
	 */
	new()
	{
		stream = new InternetChecksum()
	}

	/** Checks the full documented non-negative sum range through a scheduled argument. */
	@Test
	fn FoldsNonNegativeIntBoundaries()
	{
		this.CheckFold(0, 0, 65535)
		this.CheckFold(65535, 65535, 0)
		this.CheckFold(65536, 1, 65534)
		this.CheckFold(2147483647, 98302, 32768)
	}

	fn CheckFold(value: int, expectedFold: int, expectedChecksum: int)
	{
		assert ChecksumArithmetic.Fold(value) == expectedFold
		assert ChecksumArithmetic.Finish(value) == expectedChecksum
	}

	/**
	 * Compares the supplied network-order inputs with an independent expected checksum or sum.
	 */
	@Test
	fn ChecksTypicalIpv4Header()
	{
		var length: byte[2] = [0x00, 0xBB]
		var identification: byte[2] = [0x00, 0x01]
		var local: byte[4] = [0x0A, 0x00, 0x00, 0x01]
		var remote: byte[4] = [0x0A, 0x00, 0x00, 0x02]
		assert Ipv4HeaderChecksum.Calculate(NetworkOrder.Word(length[0], length[1]), identification, local, remote, 0x06) == 9786
		assert Ipv4HeaderChecksum.Calculate(NetworkOrder.Word(length[0], length[1]), identification, local, remote, 0x01) == 9791
	}

	/**
	 * Compares the supplied network-order inputs with an independent expected checksum or sum.
	 */
	@Test
	fn InterpretsHighIpv4OctetsAsUnsigned()
	{
		var length: byte[2] = [0x81, 0x23]
		var identification: byte[2] = [0xFE, 0xDC]
		var local: byte[4] = [0xC0, 0xA8, 0xFF, 0x80]
		var remote: byte[4] = [0xFE, 0xDC, 0xBA, 0x98]
		assert Ipv4HeaderChecksum.Calculate(NetworkOrder.Word(length[0], length[1]), identification, local, remote, 0x06) == 16729
		assert Ipv4HeaderChecksum.Calculate(NetworkOrder.Word(length[0], length[1]), identification, local, remote, 0x01) == 16734
	}

	/**
	 * Compares the supplied network-order inputs with an independent expected checksum or sum.
	 */
	@Test
	fn FoldsCarriesAcrossIpv4Words()
	{
		var length: byte[2] = [0xFF, 0xFF]
		var identification: byte[2] = [0xFF, 0xFF]
		var local: byte[4] = [0xFF, 0xFF, 0xFF, 0xFF]
		var remote: byte[4] = [0xFF, 0xFF, 0xFF, 0xFF]
		assert Ipv4HeaderChecksum.Calculate(NetworkOrder.Word(length[0], length[1]), identification, local, remote, 0x06) == 15097
		assert Ipv4HeaderChecksum.Calculate(NetworkOrder.Word(length[0], length[1]), identification, local, remote, 0x01) == 15102
	}

	/**
	 * Compares the supplied network-order inputs with an independent expected checksum or sum.
	 */
	@Test
	fn ChecksTcpHeaderWithoutPayload()
	{
		var local: byte[4] = [0xC0, 0xA8, 0x01, 0x80]
		var remote: byte[4] = [0xFE, 0xDC, 0xBA, 0x98]
		var port: byte[2] = [0x00, 0x50]
		var remotePort: byte[2] = [0xC0, 0x81]
		var sequence: byte[4] = [0x80, 0x12, 0x34, 0xFF]
		var acknowledgment: byte[4] = [0xFE, 0xDC, 0xBA, 0x98]
		var window: byte[2] = [0x81, 0x23]
		stream.Reset()
		var wordSum = stream.GetWordSum()
		assert wordSum == 0
		assert TcpChecksum.CalculatePayloadChecksum(local, remote, port, remotePort, sequence, acknowledgment, 0x12, window, 20, wordSum) == 33720
		assert TcpChecksum.CalculateFixedHeaderChecksum(local, remote, port, remotePort, sequence, acknowledgment, 0x12, window) == 33720
	}

	/**
	 * Compares the supplied network-order inputs with an independent expected checksum or sum.
	 */
	@Test
	fn PadsOddTcpPayloadForChecksum()
	{
		var local: byte[4] = [0xC0, 0xA8, 0x01, 0x80]
		var remote: byte[4] = [0xFE, 0xDC, 0xBA, 0x98]
		var port: byte[2] = [0x00, 0x50]
		var remotePort: byte[2] = [0xC0, 0x81]
		var sequence: byte[4] = [0x80, 0x12, 0x34, 0xFF]
		var acknowledgment: byte[4] = [0xFE, 0xDC, 0xBA, 0x98]
		var window: byte[2] = [0x81, 0x23]
		stream.Reset()
		var payload: byte[3] = [0x80, 0xFF, 0x01]

		for (var i = 0; i < 3; i++) {
			stream.AddByte(payload[i])
		}

		var wordSum = stream.GetWordSum()
		assert wordSum == 33279
		assert TcpChecksum.CalculatePayloadChecksum(local, remote, port, remotePort, sequence, acknowledgment, 0x12, window, 23, wordSum) == 438
	}

	/**
	 * Compares the supplied network-order inputs with an independent expected checksum or sum.
	 */
	@Test
	fn ChecksEvenTcpPayload()
	{
		var local: byte[4] = [0xC0, 0xA8, 0x01, 0x80]
		var remote: byte[4] = [0xFE, 0xDC, 0xBA, 0x98]
		var port: byte[2] = [0x00, 0x50]
		var remotePort: byte[2] = [0xC0, 0x81]
		var sequence: byte[4] = [0x80, 0x12, 0x34, 0xFF]
		var acknowledgment: byte[4] = [0xFE, 0xDC, 0xBA, 0x98]
		var window: byte[2] = [0x81, 0x23]
		stream.Reset()
		var payload: byte[4] = [0xFF, 0xFF, 0xFF, 0xFF]

		for (var i = 0; i < 4; i++) {
			stream.AddByte(payload[i])
		}

		var wordSum = stream.GetWordSum()
		assert wordSum == 131070
		assert TcpChecksum.CalculatePayloadChecksum(local, remote, port, remotePort, sequence, acknowledgment, 0x12, window, 24, wordSum) == 33716
	}

	/**
	 * Compares the supplied network-order inputs with an independent expected checksum or sum.
	 */
	@Test
	fn FoldsCarriesAcrossTcpPayload()
	{
		var local: byte[4] = [0xFF, 0xFF, 0xFF, 0xFF]
		var remote: byte[4] = [0xFF, 0xFF, 0xFF, 0xFF]
		var port: byte[2] = [0xFF, 0xFF]
		var remotePort: byte[2] = [0xFF, 0xFF]
		var sequence: byte[4] = [0xFF, 0xFF, 0xFF, 0xFF]
		var acknowledgment: byte[4] = [0xFF, 0xFF, 0xFF, 0xFF]
		var window: byte[2] = [0xFF, 0xFF]

		// Sum of 65495 bytes of 0xFF, with the final odd byte padded by zero.
		var wordSum = 2146139925
		assert TcpChecksum.CalculatePayloadChecksum(local, remote, port, remotePort, sequence, acknowledgment, 0xFF, window, 65515, wordSum) == 45069
	}

	/**
	 * Compares the supplied network-order inputs with an independent expected checksum or sum.
	 */
	@Test
	fn FoldsNonNegativeIntBoundary()
	{
		assert ChecksumArithmetic.Finish(0) == 65535
		assert ChecksumArithmetic.Finish(65535) == 0
		assert ChecksumArithmetic.Finish(65536) == 65534
		assert ChecksumArithmetic.Finish(2147483647) == 32768
	}
}