/* * Copyright 2023 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "rtc_base/async_dns_resolver.h" #include #include "api/test/rtc_error_matchers.h" #include "api/units/time_delta.h" #include "rtc_base/logging.h" #include "rtc_base/net_helpers.h" #include "rtc_base/socket_address.h" #include "rtc_base/thread.h" #include "test/gmock.h" #include "test/gtest.h" #include "test/run_loop.h" #include "test/wait_until.h" namespace webrtc { namespace { using ::testing::IsTrue; const webrtc::TimeDelta kDefaultTimeout = webrtc::TimeDelta::Millis(1000); const int kPortNumber = 3027; TEST(AsyncDnsResolver, ConstructorWorks) { AsyncDnsResolver resolver; } TEST(AsyncDnsResolver, ResolvingLocalhostWorks) { test::RunLoop loop; // Ensure that posting back to main thread works AsyncDnsResolver resolver; rtc::SocketAddress address("localhost", kPortNumber); // Port number does not matter rtc::SocketAddress resolved_address; bool done = false; resolver.Start(address, [&done] { done = true; }); ASSERT_THAT( WaitUntil([&] { return done; }, IsTrue(), {.timeout = kDefaultTimeout}), IsRtcOk()); EXPECT_EQ(resolver.result().GetError(), 0); if (resolver.result().GetResolvedAddress(AF_INET, &resolved_address)) { EXPECT_EQ(resolved_address, rtc::SocketAddress("127.0.0.1", kPortNumber)); } else { RTC_LOG(LS_INFO) << "Resolution gave no address, skipping test"; } } TEST(AsyncDnsResolver, ResolveAfterDeleteDoesNotReturn) { test::RunLoop loop; std::unique_ptr resolver = std::make_unique(); rtc::SocketAddress address("localhost", kPortNumber); // Port number does not matter rtc::SocketAddress resolved_address; bool done = false; resolver->Start(address, [&done] { done = true; }); resolver.reset(); // Deletes resolver. rtc::Thread::Current()->SleepMs(1); // Allows callback to execute EXPECT_FALSE(done); // Expect no result. } } // namespace } // namespace webrtc