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 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