test: cover introspection_test

This commit is contained in:
dualfroz committed 2026-09-11 17:26:42 +02:00
1 parent 6f47ae847c
commit f5e950deb9
1 file changed
+157
+157
View File
@@ -156,3 +156,160 @@ defmodule Excache.IntrospectionTest do
assert {everything, conn} = Client.command(conn, ["INFO", "everything"]) assert {everything, conn} = Client.command(conn, ["INFO", "everything"])
assert sections(everything) == sections(all) assert sections(everything) == sections(all)
values = fields(all)
assert String.to_integer(values["schedulers"]) == :erlang.system_info(:schedulers)
assert values["used_cpu_total"] =~ ~r/^\d+\.\d\d$/
assert {defaults, _conn} = Client.command(conn, ["INFO", "default"])
assert sections(defaults) == sections(plain)
end
test "several sections can be asked for at once and unknown ones are dropped", %{conn: conn} do
assert {text, conn} = Client.command(conn, ["INFO", "replication", "clients"])
assert sections(text) == ["Replication", "Clients"]
assert {"", conn} = Client.command(conn, ["INFO", "nosuchsection"])
assert {text, _conn} = Client.command(conn, ["INFO", "clients", "nosuchsection"])
assert sections(text) == ["Clients"]
end
test "blocked_clients counts a connection parked in BLPOP", %{conn: conn, port: port} do
assert clientField(conn, "blocked_clients") == 0
waiter = blockingTask(port, ["BLPOP", "parked", "0"])
awaitUntil(fn -> Blocking.waitingCount("parked") == 1 end)
assert clientField(conn, "blocked_clients") == 1
assert {1, conn} = Client.command(conn, ["LPUSH", "parked", "wake"])
assert Task.await(waiter) == ["parked", "wake"]
awaitUntil(fn -> clientField(conn, "blocked_clients") == 0 end)
end
test "pubsub_clients and pubsub_channels follow real subscriptions", %{
conn: conn,
port: port
} do
assert clientField(conn, "pubsub_clients") == 0
listener = Client.connect(port)
assert {["subscribe", "news", 1], _listener} =
Client.command(listener, ["SUBSCRIBE", "news"])
awaitUntil(fn -> clientField(conn, "pubsub_clients") == 1 end)
assert {text, _conn} = Client.command(conn, ["INFO", "stats"])
assert fields(text)["pubsub_channels"] == "1"
assert fields(text)["pubsub_patterns"] == "0"
Client.close(listener)
end
end
describe "CLIENT" do
test "ID hands out a distinct rising number per connection", %{conn: conn, port: port} do
assert {mine, conn} = Client.command(conn, ["CLIENT", "ID"])
assert is_integer(mine) and mine > 0
other = Client.connect(port)
assert {theirs, _other} = Client.command(other, ["CLIENT", "ID"])
assert theirs > mine
assert {^mine, _conn} = Client.command(conn, ["CLIENT", "ID"])
Client.close(other)
end
test "SETNAME and GETNAME round trip and reject illegal names", %{conn: conn} do
assert {"", conn} = Client.command(conn, ["CLIENT", "GETNAME"])
assert {{:simple, "OK"}, conn} = Client.command(conn, ["CLIENT", "SETNAME", "importer"])
assert {"importer", conn} = Client.command(conn, ["CLIENT", "GETNAME"])
assert {{:error, "ERR Client names cannot contain spaces" <> _}, conn} =
Client.command(conn, ["CLIENT", "SETNAME", "two words"])
assert {"importer", conn} = Client.command(conn, ["CLIENT", "GETNAME"])
assert {{:simple, "OK"}, conn} = Client.command(conn, ["CLIENT", "SETNAME", ""])
assert {"", _conn} = Client.command(conn, ["CLIENT", "GETNAME"])
end
test "LIST shows one line per connection with the real address and name", %{
conn: conn,
port: port
} do
assert {mine, conn} = Client.command(conn, ["CLIENT", "ID"])
other = Client.connect(port)
assert {theirs, other} = Client.command(other, ["CLIENT", "ID"])
assert {{:simple, "OK"}, _other} = Client.command(other, ["CLIENT", "SETNAME", "worker"])
assert {text, conn} = Client.command(conn, ["CLIENT", "LIST"])
lines = listLines(text)
assert %{"name" => "worker", "addr" => address} = lines[theirs]
assert address =~ ~r/^127\.0\.0\.1:\d+$/
assert lines[theirs]["laddr"] =~ ~r/^127\.0\.0\.1:#{port}$/
assert lines[mine]["name"] == ""
assert lines[mine]["db"] == "0"
assert String.to_integer(lines[mine]["tot-net-in"]) > 0
assert {filtered, conn} =
Client.command(conn, ["CLIENT", "LIST", "ID", Integer.to_string(theirs)])
assert Map.keys(listLines(filtered)) == [theirs]
assert {{:error, "ERR syntax error"}, _conn} =
Client.command(conn, ["CLIENT", "LIST", "NOPE", "1"])
Client.close(other)
end
test "LIST TYPE separates subscribers from plain connections", %{conn: conn, port: port} do
assert {mine, conn} = Client.command(conn, ["CLIENT", "ID"])
listener = Client.connect(port)
assert {theirs, listener} = Client.command(listener, ["CLIENT", "ID"])
assert {["subscribe", "feed", 1], _listener} =
Client.command(listener, ["SUBSCRIBE", "feed"])
awaitUntil(fn ->
{text, _conn} = Client.command(conn, ["CLIENT", "LIST", "TYPE", "pubsub"])
Map.has_key?(listLines(text), theirs)
end)
assert {text, conn} = Client.command(conn, ["CLIENT", "LIST", "TYPE", "pubsub"])
assert Map.keys(listLines(text)) == [theirs]
assert listLines(text)[theirs]["sub"] == "1"
assert {text, conn} = Client.command(conn, ["CLIENT", "LIST", "TYPE", "normal"])
assert Map.has_key?(listLines(text), mine)
refute Map.has_key?(listLines(text), theirs)
assert {"", conn} = Client.command(conn, ["CLIENT", "LIST", "TYPE", "replica"])
assert {{:error, "ERR syntax error"}, _conn} =
Client.command(conn, ["CLIENT", "LIST", "TYPE", "nonsense"])
Client.close(listener)
end
test "INFO describes the calling connection only", %{conn: conn} do
assert {mine, conn} = Client.command(conn, ["CLIENT", "ID"])
assert {{:simple, "OK"}, conn} = Client.command(conn, ["CLIENT", "SETNAME", "solo"])
assert {text, _conn} = Client.command(conn, ["CLIENT", "INFO"])
assert [{id, fieldMap}] = Map.to_list(listLines(text <> "\n"))
assert id == mine
assert fieldMap["name"] == "solo"
end
test "idle grows while a connection stays quiet and age tracks the connect time", %{
conn: conn,
port: port
} do
quiet = Client.connect(port)
assert {quietId, _quiet} = Client.command(quiet, ["CLIENT", "ID"])
Process.sleep(1_200)