roost/birdwhisperer/birdwhispererer_test.go

98 lines
2.7 KiB
Go

package birdwhisperer
import (
"testing"
)
func TestPruningChunkRecord(t *testing.T) {
bw := NewBirdWhisperer()
incompleteMessageNotExpired := ReconstructedMessage{
ReceivedTime: 195_000, // "Just started"
CompletedTime: 0,
NumChunks: 2,
ReceivedChunks: 1,
}
incompleteMessageExpired := ReconstructedMessage{
ReceivedTime: 100, // Started a long time ago
CompletedTime: 0,
NumChunks: 2,
ReceivedChunks: 1,
}
completeMessageNotExpired := ReconstructedMessage{
ReceivedTime: 100,
CompletedTime: 199_000, // "Just finished"
NumChunks: 2,
ReceivedChunks: 2,
}
completeMessageExpired := ReconstructedMessage{
ReceivedTime: 100,
CompletedTime: 10_000, // Finished a long time ago
NumChunks: 2,
ReceivedChunks: 2,
}
bw.ChunkRecord[0] = incompleteMessageNotExpired
bw.ChunkRecord[1] = incompleteMessageExpired
bw.ChunkRecord[2] = completeMessageNotExpired
bw.ChunkRecord[3] = completeMessageExpired
bw.PruneChunkRecord(200_000)
if _, exists := bw.ChunkRecord[0]; !exists {
t.Errorf("Pruned an incomplete message that hasn't expired yet")
}
if _, exists := bw.ChunkRecord[1]; exists {
t.Errorf("Didn't prune an incomplete message that expired")
}
if _, exists := bw.ChunkRecord[2]; !exists {
t.Errorf("Pruned an complete message that hasn't expired yet")
}
if _, exists := bw.ChunkRecord[3]; exists {
t.Errorf("Didn't prune an incomplete message that expired")
}
}
func TestChunkMessageSingleChunk(t *testing.T) {
messageId := uint16(123)
message := make([]byte, CHUNK_MAX_LENGTH-1)
chunks := ChunkMessage(message, messageId)
if len(chunks) != 1 {
t.Errorf("A message that should be 1 chunk is actually %d chunks", len(chunks))
}
}
func TestChunkMessageMultipleChunks(t *testing.T) {
messageId := uint16(123)
message := make([]byte, CHUNK_MAX_LENGTH*2)
chunks := ChunkMessage(message, messageId)
if len(chunks) != 2 {
t.Errorf("A message that should be 2 chunks is actually %d chunks", len(chunks))
}
}
func TestChunkMessageMultipleChunksAndSome(t *testing.T) {
messageId := uint16(123)
extraDataLen := 1
message := make([]byte, CHUNK_MAX_LENGTH*2+extraDataLen)
chunks := ChunkMessage(message, messageId)
if len(chunks) != 3 {
t.Errorf("A message that should be 3 chunks is actually %d chunks", len(chunks))
}
const expectedChunkLength = CHUNK_MAX_LENGTH + CHUNK_V1_HEADER_LENGTH
if len(chunks[0]) != expectedChunkLength {
t.Errorf("Chunk 0 should be %d, is %d", expectedChunkLength, len(chunks[0]))
}
if len(chunks[1]) != expectedChunkLength {
t.Errorf("Chunk 1 should be %d, is %d", expectedChunkLength, len(chunks[1]))
}
if len(chunks[2]) != extraDataLen+CHUNK_V1_HEADER_LENGTH {
t.Errorf("Chunk 2 should be %d, is %d", extraDataLen+CHUNK_V1_HEADER_LENGTH, len(chunks[2]))
}
}