LibDNS: Add basic DNS::Resolver tests

This commit is contained in:
devgianlu 2025-02-18 13:05:42 +01:00 committed by Ali Mohammad Pur
parent 42a18a4a91
commit 0926720c2a
Notes: github-actions[bot] 2025-02-18 14:47:43 +00:00
4 changed files with 124 additions and 0 deletions

View file

@ -512,6 +512,7 @@ if (BUILD_TESTING)
AK
LibCrypto
LibCompress
LibDNS
LibGC
LibTest
LibTextCodec

View file

@ -2,6 +2,7 @@ add_subdirectory(AK)
add_subdirectory(LibCompress)
add_subdirectory(LibCore)
add_subdirectory(LibDiff)
add_subdirectory(LibDNS)
add_subdirectory(LibGfx)
add_subdirectory(LibJS)
add_subdirectory(LibRegex)

View file

@ -0,0 +1,7 @@
set(TEST_SOURCES
TestDNSResolver.cpp
)
foreach(source IN LISTS TEST_SOURCES)
serenity_test("${source}" LibDNS LIBS LibDNS LibTLS)
endforeach()

View file

@ -0,0 +1,115 @@
/*
* Copyright (c) 2025, Altomani Gianluca <altomanigianluca@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibCore/Socket.h>
#include <LibDNS/Resolver.h>
#include <LibFileSystem/FileSystem.h>
#include <LibTLS/TLSv12.h>
#include <LibTest/TestCase.h>
TEST_CASE(test_udp)
{
Core::EventLoop loop;
DNS::Resolver resolver {
[&] -> ErrorOr<DNS::Resolver::SocketResult> {
Core::SocketAddress addr = { IPv4Address::from_string("1.1.1.1"sv).value(), static_cast<u16>(53) };
return DNS::Resolver::SocketResult {
MUST(Core::BufferedSocket<Core::UDPSocket>::create(MUST(Core::UDPSocket::connect(addr)))),
DNS::Resolver::ConnectionMode::UDP,
};
}
};
MUST(resolver.when_socket_ready()->await());
resolver.lookup("google.com", DNS::Messages::Class::IN, { DNS::Messages::ResourceType::A, DNS::Messages::ResourceType::AAAA })
->when_resolved([&](auto& result) {
EXPECT(!result->records().is_empty());
loop.quit(0);
})
.when_rejected([&](auto& error) {
outln("Failed to resolve: {}", error);
loop.quit(1);
});
EXPECT_EQ(0, loop.exec());
}
TEST_CASE(test_tcp)
{
Core::EventLoop loop;
DNS::Resolver resolver {
[&] -> ErrorOr<DNS::Resolver::SocketResult> {
Core::SocketAddress addr = { IPv4Address::from_string("1.1.1.1"sv).value(), static_cast<u16>(53) };
return DNS::Resolver::SocketResult {
MUST(Core::BufferedSocket<Core::TCPSocket>::create(MUST(Core::TCPSocket::connect(addr)))),
DNS::Resolver::ConnectionMode::TCP,
};
}
};
MUST(resolver.when_socket_ready()->await());
resolver.lookup("google.com", DNS::Messages::Class::IN, { DNS::Messages::ResourceType::A, DNS::Messages::ResourceType::AAAA })
->when_resolved([&](auto& result) {
EXPECT(!result->records().is_empty());
loop.quit(0);
})
.when_rejected([&](auto& error) {
outln("Failed to resolve: {}", error);
loop.quit(1);
});
EXPECT_EQ(0, loop.exec());
}
static StringView ca_certs_file = "./cacert.pem"sv;
static Optional<ByteString> locate_ca_certs_file()
{
if (FileSystem::exists(ca_certs_file)) {
return ca_certs_file;
}
auto on_target_path = ByteString("/etc/cacert.pem");
if (FileSystem::exists(on_target_path)) {
return on_target_path;
}
return {};
}
TEST_CASE(test_tls)
{
Core::EventLoop loop;
DNS::Resolver resolver {
[&] -> ErrorOr<DNS::Resolver::SocketResult> {
Core::SocketAddress addr = { IPv4Address::from_string("1.1.1.1"sv).value(), static_cast<u16>(853) };
TLS::Options options;
options.set_root_certificates_path(locate_ca_certs_file());
return DNS::Resolver::SocketResult {
MaybeOwned<Core::Socket>(TRY(TLS::TLSv12::connect(addr, "1.1.1.1", move(options)))),
DNS::Resolver::ConnectionMode::TCP,
};
}
};
MUST(resolver.when_socket_ready()->await());
resolver.lookup("google.com", DNS::Messages::Class::IN, { DNS::Messages::ResourceType::A, DNS::Messages::ResourceType::AAAA })
->when_resolved([&](auto& result) {
EXPECT(!result->records().is_empty());
loop.quit(0);
})
.when_rejected([&](auto& error) {
outln("Failed to resolve: {}", error);
loop.quit(1);
});
EXPECT_EQ(0, loop.exec());
}