This commit includes several critical fixes and optimizations: ## Production Buffer Overflow Fix - Fixed telemetry_vals data type conversion from strings to integers - Enhanced put_telemetry_fields() with robust type conversion logic - Handles mixed data types (string, integer, float) gracefully - Prevents PacketConsumer GenServer crashes that caused buffer overflow - Processes telemetry from both data_extended and top-level attrs ## Test Suite Performance Optimization - Improved test execution speed by 48% (43.2s → 24.1s) - Increased parallelization: max_cases from 16 to 48 - Optimized database connections and reduced timeouts - Tagged slow tests and exclude them by default for fast development - Fixed device seeding to only run when needed - Enhanced log capture for packet consumer tests ## Code Quality Improvements - Fixed handle_info clause grouping in LeaderElection - Ensures mix compile --warnings-as-errors passes - Added comprehensive telemetry conversion tests - Improved test reliability and reduced flakiness ## Infrastructure Updates - Added migration init container to StatefulSet for automatic schema updates - Disabled AUTO_MIGRATE in main container (handled by init container) - Created .test-commands with helpful test aliases This resolves production stability issues and significantly improves development workflow. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
94 lines
2.5 KiB
Elixir
94 lines
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
|
|
# 12.80 rounds to 13
|
|
assert result.telemetry_vals == [13, 0, 0, 0, 0]
|
|
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
|
|
# Mixed types converted properly
|
|
assert result.telemetry_vals == [180, 38, 0, 88, 165]
|
|
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
|
|
# Floats rounded to integers
|
|
assert result.telemetry_vals == [13, 37, 0, 89, 165]
|
|
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
|
|
# Invalid values become 0
|
|
assert result.telemetry_vals == [0, 0, 0, 13, 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
|