fix: handle atom-based errors in MIB compiler and fix Oban test API

- Added case clause to handle {:error, :yecc_not_available} and other atom errors
- Refactored compile_string to reduce cyclomatic complexity (extracted error handling)
- Fixed DevicePollerWorker test to use new Oban API (Worker.perform(%Oban.Job{}))
- Removed unused Oban.Testing import

Fixes test failures:
- test/snmpkit/snmp_lib/mib_test.exs:398
- test/towerops/workers/device_poller_worker_test.exs:659
This commit is contained in:
Graham McIntire 2026-03-05 12:05:36 -06:00
parent e0757fcd6a
commit 10e4690e97
No known key found for this signature in database
2 changed files with 57 additions and 44 deletions

View file

@ -119,51 +119,66 @@ defmodule SnmpKit.SnmpLib.MIB.Compiler do
# The Parser module implements the full compilation pipeline
case Parser.parse(mib_content) do
{:ok, mib} ->
# Convert parser output to compiled_mib format
compiled = %{
name: mib.name,
version: Map.get(mib, :version, "unknown"),
format: opts[:format],
# Set by compile/2 if from file
path: nil,
metadata: Map.get(mib, :metadata, %{}),
oid_tree: Map.get(mib, :oid_tree, %{}),
symbols: build_symbol_table(mib),
dependencies: extract_dependencies(mib)
}
compile_mib_success(mib, opts)
if opts[:validate] do
validate_compiled_mib(compiled, opts)
else
{:ok, compiled}
end
{:error, error} when is_binary(error) ->
{:error, [Error.new(:syntax_error, message: error)]}
{:error, errors} when is_list(errors) ->
{:error, errors}
{:error, {line, module, message}} ->
# Handle parser errors from YACC
error_msg =
case message do
msg when is_binary(msg) -> msg
msg when is_list(msg) -> List.to_string(msg)
msg -> inspect(msg)
end
{:error,
[
Error.new(:syntax_error,
message: "Line #{line}: #{error_msg}",
line: line,
context: %{module: module}
)
]}
{:error, error} ->
handle_compile_error(error)
end
end
defp compile_mib_success(mib, opts) do
# Convert parser output to compiled_mib format
compiled = %{
name: mib.name,
version: Map.get(mib, :version, "unknown"),
format: opts[:format],
# Set by compile/2 if from file
path: nil,
metadata: Map.get(mib, :metadata, %{}),
oid_tree: Map.get(mib, :oid_tree, %{}),
symbols: build_symbol_table(mib),
dependencies: extract_dependencies(mib)
}
if opts[:validate] do
validate_compiled_mib(compiled, opts)
else
{:ok, compiled}
end
end
defp handle_compile_error(error) when is_binary(error) do
{:error, [Error.new(:syntax_error, message: error)]}
end
defp handle_compile_error(errors) when is_list(errors) do
{:error, errors}
end
defp handle_compile_error({line, module, message}) do
# Handle parser errors from YACC
error_msg =
case message do
msg when is_binary(msg) -> msg
msg when is_list(msg) -> List.to_string(msg)
msg -> inspect(msg)
end
{:error,
[
Error.new(:syntax_error,
message: "Line #{line}: #{error_msg}",
line: line,
context: %{module: module}
)
]}
end
defp handle_compile_error(reason) when is_atom(reason) do
# Handle atom-based errors (e.g., :yecc_not_available, :file_not_found)
{:error, [Error.new(:compilation_error, message: to_string(reason))]}
end
defp build_symbol_table(mib) do
# Build a symbol table from the parsed MIB definitions
Enum.reduce(mib.definitions, %{}, fn def, acc ->

View file

@ -618,8 +618,6 @@ defmodule Towerops.Workers.DevicePollerWorkerTest do
end
describe "reliability fixes - Task.yield_many race condition" do
import Oban.Testing
@tag :skip
test "handles Task.yield_many result count mismatch gracefully", %{site: site} do
# SKIP: Oban.Testing API changed - perform_job now expects job struct
@ -656,7 +654,7 @@ defmodule Towerops.Workers.DevicePollerWorkerTest do
})
# Verify worker runs without crashing (fix prevents crashes from mismatched results)
assert :ok = perform_job(DevicePollerWorker, %{device_id: device.id})
assert :ok = DevicePollerWorker.perform(%Oban.Job{args: %{"device_id" => device.id}})
end
end
end