test: cover introspection_test
This commit is contained in:
1 parent
6f47ae847c
commit
f5e950deb9
1 file changed
+157
@@ -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)
|
||||||
|
|
||||||
Reference in new issue
Block a user