aprs.me/test/aprsme/packet_test.exs
Graham McIntire 6bfea84b88
fix: Convert telemetry_vals strings to integers to prevent buffer overflow
Fixes production crashes where PacketConsumer GenServers were failing due to
attempting to insert string arrays like ['12.80', '0.00', ...] into an
integer array database field. This was causing buffer overflow as crashed
consumers couldn't process packets.

Changes:
- Enhanced put_telemetry_fields() to convert string/float telemetry values to integers
- Added robust handling for mixed data types (string, integer, float)
- Added graceful fallback for invalid values (converts to 0)
- Process telemetry from both data_extended and top-level attrs
- Added comprehensive tests for all conversion scenarios

This resolves the GenServer crashes and prevents packet processing buffer issues.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-01 17:47:31 -05:00

89 lines
No EOL
2.5 KiB
Elixir

defmodule Aprsme.PacketTest do
use Aprsme.DataCase, async: true
alias Aprsme.Packet
describe "extract_additional_data/2 with telemetry data" do
test "converts string telemetry_vals to integers" do
raw_packet = "W5ISP>APRS,TCPIP*:T#005,12.80,0.00,0.00,0.00,0.00,00000000"
attrs = %{
sender: "W5ISP",
data_type: "telemetry",
telemetry: %{
seq: "005",
vals: ["12.80", "0.00", "0.00", "0.00", "0.00"],
bits: "00000000"
}
}
result = Packet.extract_additional_data(attrs, raw_packet)
assert result.telemetry_seq == 5
assert result.telemetry_vals == [13, 0, 0, 0, 0] # 12.80 rounds to 13
assert result.telemetry_bits == "00000000"
end
test "handles mixed integer and string telemetry_vals" do
attrs = %{
sender: "TEST",
data_type: "telemetry",
telemetry: %{
seq: 10,
vals: [180, "37.50", "0.00", 88, "164.75"],
bits: "10101010"
}
}
result = Packet.extract_additional_data(attrs, "test_packet")
assert result.telemetry_seq == 10
assert result.telemetry_vals == [180, 38, 0, 88, 165] # Mixed types converted properly
assert result.telemetry_bits == "10101010"
end
test "handles float telemetry_vals" do
attrs = %{
sender: "TEST",
data_type: "telemetry",
telemetry: %{
seq: "001",
vals: [12.8, 37.2, 0.1, 88.9, 164.5]
}
}
result = Packet.extract_additional_data(attrs, "test_packet")
assert result.telemetry_seq == 1
assert result.telemetry_vals == [13, 37, 0, 89, 165] # Floats rounded to integers
end
test "handles invalid telemetry_vals gracefully" do
attrs = %{
sender: "TEST",
data_type: "telemetry",
telemetry: %{
seq: "002",
vals: ["invalid", nil, "", "12.5", :atom]
}
}
result = Packet.extract_additional_data(attrs, "test_packet")
assert result.telemetry_seq == 2
assert result.telemetry_vals == [0, 0, 0, 13, 0] # Invalid values become 0
end
test "handles missing telemetry data" do
attrs = %{
sender: "TEST",
data_type: "position"
}
result = Packet.extract_additional_data(attrs, "test_packet")
assert Map.get(result, :telemetry_seq) == nil
assert Map.get(result, :telemetry_vals) == nil
assert Map.get(result, :telemetry_bits) == nil
end
end
end