From b6f34b9cb36113e5ca614cf3d3b6721370c1190d Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Thu, 23 Apr 2026 18:20:31 -0500 Subject: [PATCH] test: PacketConsumer batch sizing branches --- test/aprsme/packet_consumer_test.exs | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/test/aprsme/packet_consumer_test.exs b/test/aprsme/packet_consumer_test.exs index 7ba94fb..da39d10 100644 --- a/test/aprsme/packet_consumer_test.exs +++ b/test/aprsme/packet_consumer_test.exs @@ -40,6 +40,67 @@ defmodule Aprsme.PacketConsumerTest do end end + describe "handle_events/3 batch sizing" do + test "partial batch just accumulates and re-schedules" do + {:consumer, state, _} = PacketConsumer.init(subscribe_to: []) + Process.cancel_timer(state.timer) + state = %{state | timer: nil, batch_size: 100, max_batch_size: 1000} + + events = [%{sender: "BATCH-1", raw_packet: "x", received_at: DateTime.utc_now()}] + + assert {:noreply, [], new_state} = PacketConsumer.handle_events(events, nil, state) + assert new_state.batch_length == 1 + assert length(new_state.batch) == 1 + end + + test "full batch is processed (flushes state)" do + {:consumer, state, _} = PacketConsumer.init(subscribe_to: []) + Process.cancel_timer(state.timer) + + # batch_size=1 so a single event triggers full-batch handling. + state = %{state | timer: nil, batch_size: 1, max_batch_size: 1000} + + events = [ + %{ + sender: "FULL-1", + base_callsign: "FULL", + ssid: "1", + raw_packet: "FULL-1>APRS:>", + received_at: DateTime.utc_now() + } + ] + + assert {:noreply, [], new_state} = PacketConsumer.handle_events(events, nil, state) + assert new_state.batch_length == 0 + assert new_state.batch == [] + Process.cancel_timer(new_state.timer) + end + + test "oversized batch processes up to max and carries remainder" do + {:consumer, state, _} = PacketConsumer.init(subscribe_to: []) + Process.cancel_timer(state.timer) + + # batch_size=100, max_batch_size=2, so a 3-event burst is "oversized". + state = %{state | timer: nil, batch_size: 100, max_batch_size: 2} + + events = + for i <- 1..3 do + %{ + sender: "OS-#{i}", + base_callsign: "OS", + ssid: to_string(i), + raw_packet: "OS-#{i}>APRS:>", + received_at: DateTime.utc_now() + } + end + + assert {:noreply, [], new_state} = PacketConsumer.handle_events(events, nil, state) + # Carryover holds the remaining 1 packet past the max. + assert new_state.batch_length == 1 + Process.cancel_timer(new_state.timer) + end + end + describe "handle_info(:process_batch, state)" do test "empty batch just restarts the timer" do {:consumer, state, _} = PacketConsumer.init(subscribe_to: [])