mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-21 03:55:24 +00:00
LibDNS: Add basic DNS::Resolver
tests
This commit is contained in:
parent
42a18a4a91
commit
0926720c2a
Notes:
github-actions[bot]
2025-02-18 14:47:43 +00:00
Author: https://github.com/devgianlu Commit: https://github.com/LadybirdBrowser/ladybird/commit/0926720c2af Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3611 Reviewed-by: https://github.com/alimpfard ✅
4 changed files with 124 additions and 0 deletions
|
@ -512,6 +512,7 @@ if (BUILD_TESTING)
|
|||
AK
|
||||
LibCrypto
|
||||
LibCompress
|
||||
LibDNS
|
||||
LibGC
|
||||
LibTest
|
||||
LibTextCodec
|
||||
|
|
|
@ -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)
|
||||
|
|
7
Tests/LibDNS/CMakeLists.txt
Normal file
7
Tests/LibDNS/CMakeLists.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
set(TEST_SOURCES
|
||||
TestDNSResolver.cpp
|
||||
)
|
||||
|
||||
foreach(source IN LISTS TEST_SOURCES)
|
||||
serenity_test("${source}" LibDNS LIBS LibDNS LibTLS)
|
||||
endforeach()
|
115
Tests/LibDNS/TestDNSResolver.cpp
Normal file
115
Tests/LibDNS/TestDNSResolver.cpp
Normal 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());
|
||||
}
|
Loading…
Add table
Reference in a new issue