98 lines
2.7 KiB
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]))
|
|
}
|
|
}
|