95 lines
2.8 KiB
Elixir
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
|