fp-lab4/test/zone/zone_server_test.exs
2026-01-13 18:26:26 +03:00

95 lines
2.8 KiB
Elixir

defmodule Exdns.ZoneServerTest do
use ExUnit.Case, async: false
alias Exdns.DnsPacket.{ResourceRecord, RRData.Types}
alias Exdns.ZoneServer
setup do
unless Process.whereis(ZoneServer) do
start_supervised!({ZoneServer, []})
end
tmp_dir = Path.join(System.tmp_dir!(), "exdns_zones_#{System.unique_integer([:positive])}")
Application.put_env(:exdns, :zones_dir, tmp_dir)
on_exit(fn -> File.rm_rf(tmp_dir) end)
:ok
end
test "put adds SOA and NS and increments serial" do
name = ["example", "com"]
assert :ok = ZoneServer.put(name, [])
assert {:ok, records} = ZoneServer.get(name)
soa = Enum.find(records, fn rr -> match?(%{rdata: %Types.SOA{}}, rr) end)
ns = Enum.find(records, fn rr -> match?(%{rdata: %Types.NS{}}, rr) end)
assert %Types.SOA{serial: serial1} = soa.rdata
assert %Types.NS{} = ns.rdata
assert :ok = ZoneServer.put(name, [])
assert {:ok, records} = ZoneServer.get(name)
soa2 = Enum.find(records, fn rr -> match?(%{rdata: %Types.SOA{}}, rr) end)
assert %Types.SOA{serial: serial2} = soa2.rdata
assert serial2 > serial1
ZoneServer.delete(name)
end
test "list and delete work" do
name = ["example", "com"]
assert :ok = ZoneServer.put(name, [])
assert name in ZoneServer.list()
assert :ok = ZoneServer.delete(name)
assert :error = ZoneServer.get(name)
end
test "create_zone and update_records enforce existence" do
name = ["example", "com"]
assert {:error, :not_found} = ZoneServer.update_records(name, [])
assert :ok = ZoneServer.create_zone(name, [])
assert {:error, :already_exists} = ZoneServer.create_zone(name, [])
assert :ok = ZoneServer.update_records(name, [])
ZoneServer.delete(name)
end
test "delete_records removes entries and keeps SOA and NS" do
name = ["example", "com"]
record = %ResourceRecord{
name: name,
type: :a,
class: 1,
ttl: 60,
rdata: %Types.A{address: {1, 2, 3, 4}}
}
assert :ok = ZoneServer.create_zone(name, [record])
assert :ok = ZoneServer.delete_records(name, [record])
assert {:ok, records} = ZoneServer.get(name)
refute Enum.any?(records, fn rr -> rr.rdata == record.rdata end)
assert Enum.any?(records, fn rr -> match?(%{rdata: %Types.SOA{}}, rr) end)
assert Enum.any?(records, fn rr -> match?(%{rdata: %Types.NS{}}, rr) end)
ZoneServer.delete(name)
end
test "wildcard lookup returns records for subdomain" do
name = ["example", "com"]
target = ["www", "example", "com"]
record = %ResourceRecord{
name: ["*" | name],
type: :a,
class: 1,
ttl: 0,
rdata: %Types.A{address: {10, 0, 0, 1}}
}
assert :ok = ZoneServer.create_zone(name, [record])
assert {:ok, _} = ZoneServer.get(target)
ZoneServer.delete(name)
end
end