From 5d82d2445cd0bff84fc4dd6b945165f842e8bcf5 Mon Sep 17 00:00:00 2001 From: Luke Bakken Date: Fri, 5 Sep 2025 11:18:47 -0700 Subject: [PATCH] Additional JSON CLI formatter fix A list of binaries was incorrectly converted by `unicode:characters_to_binary` into one big binary. Add a function head to match this case. Also, add tests for the values that were not correctly formatted prior to #14101 and #14381 --- .../lib/rabbitmq/cli/formatters/json.ex | 5 +++ .../test/json_formatting_test.exs | 40 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/json.ex b/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/json.ex index 6ff21b3b8a22..2bb3d39343ea 100644 --- a/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/json.ex +++ b/deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/json.ex @@ -93,6 +93,11 @@ defmodule RabbitMQ.CLI.Formatters.Json do defp convert_erlang_strings([]), do: [] + defp convert_erlang_strings([b | _rest]=data) when is_binary(b) do + # Assume this is a list of strings already converted + data + end + defp convert_erlang_strings(data) when is_list(data) do try do case :unicode.characters_to_binary(data, :utf8) do diff --git a/deps/rabbitmq_cli/test/json_formatting_test.exs b/deps/rabbitmq_cli/test/json_formatting_test.exs index 4fd8f033c009..012df17d588c 100644 --- a/deps/rabbitmq_cli/test/json_formatting_test.exs +++ b/deps/rabbitmq_cli/test/json_formatting_test.exs @@ -38,6 +38,21 @@ defmodule JSONFormattingTest do assert Map.has_key?(doc, "os") assert Map.has_key?(doc, "pid") assert Map.has_key?(doc, "rabbitmq_version") + assert Map.has_key?(doc, "active_plugins") + assert Map.has_key?(doc, "config_files") + assert Map.has_key?(doc, "log_files") + + active_plugins = doc["active_plugins"] + assert is_list(active_plugins) + assert Enum.all?(active_plugins, &is_binary/1) + + config_files = doc["config_files"] + assert is_list(config_files) + assert Enum.all?(config_files, &is_binary/1) + + log_files = doc["log_files"] + assert is_list(log_files) + assert Enum.all?(log_files, &is_binary/1) assert doc["alarms"] == [] end @@ -55,10 +70,35 @@ defmodule JSONFormattingTest do {:ok, doc} = JSON.decode(output) + assert Map.has_key?(doc, "running_nodes") + running_nodes = doc["running_nodes"] + assert is_list(running_nodes) + assert Enum.all?(running_nodes, &is_binary/1) + assert Enum.member?(doc["disk_nodes"], node) assert Map.has_key?(doc["listeners"], node) assert Map.has_key?(doc["versions"], node) + assert Map.has_key?(doc["versions"], node) assert doc["alarms"] == [] assert doc["partitions"] == %{} end + + test "JSON output of environment" do + set_scope(:ctl) + + node = to_string(get_rabbit_hostname()) + command = ["environment", "-n", node, "--formatter=json"] + + output = + capture_io(:stdio, fn -> + error_check(command, exit_ok()) + end) + + {:ok, doc} = JSON.decode(output) + assert Map.has_key?(doc, "rabbit") + rabbit = doc["rabbit"] + assert Map.has_key?(rabbit, "data_dir") + data_dir = rabbit["data_dir"] + assert is_binary(data_dir) + end end