diff --git a/lib/snmpkit/snmp_lib/mib/compiler.ex b/lib/snmpkit/snmp_lib/mib/compiler.ex index abfbfbea..a12f4f6b 100644 --- a/lib/snmpkit/snmp_lib/mib/compiler.ex +++ b/lib/snmpkit/snmp_lib/mib/compiler.ex @@ -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 -> diff --git a/test/towerops/workers/device_poller_worker_test.exs b/test/towerops/workers/device_poller_worker_test.exs index a2855855..25d86ef2 100644 --- a/test/towerops/workers/device_poller_worker_test.exs +++ b/test/towerops/workers/device_poller_worker_test.exs @@ -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