mirror of
https://github.com/esphome/esphome.git
synced 2026-10-02 01:10:22 +00:00
[socket] Add an IPv4 lookup next to set_sockaddr (#19909)
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: J. Nick Koston <nick@koston.org> Co-authored-by: J. Nick Koston <nick@home-assistant.io>
This commit is contained in:
co-authored by
pre-commit-ci-lite[bot]
J. Nick Koston
J. Nick Koston
parent
54f6fb0eb2
commit
eb423be9d2
@@ -0,0 +1,71 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "esphome/components/socket/ipv4_resolve.h"
|
||||
|
||||
#ifdef USE_HOST
|
||||
|
||||
namespace esphome::socket::testing {
|
||||
|
||||
TEST(Ipv4Resolve, LiteralIsReadyWithoutDns) {
|
||||
Ipv4Resolve lookup;
|
||||
lookup.start("192.168.1.1", 1, "test");
|
||||
EXPECT_TRUE(lookup.ready());
|
||||
|
||||
struct sockaddr_storage addr {};
|
||||
socklen_t len = lookup.to_sockaddr(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 6053);
|
||||
ASSERT_EQ(len, sizeof(sockaddr_in));
|
||||
auto *in = reinterpret_cast<sockaddr_in *>(&addr);
|
||||
EXPECT_EQ(in->sin_family, AF_INET);
|
||||
EXPECT_EQ(ntohs(in->sin_port), 6053);
|
||||
EXPECT_EQ(in->sin_addr.s_addr, htonl(0xC0A80101));
|
||||
}
|
||||
|
||||
TEST(Ipv4Resolve, ForgetDropsTheLiteral) {
|
||||
Ipv4Resolve lookup;
|
||||
lookup.start("10.0.0.5", 80, "test");
|
||||
ASSERT_TRUE(lookup.ready());
|
||||
lookup.forget();
|
||||
EXPECT_FALSE(lookup.ready());
|
||||
|
||||
struct sockaddr_storage addr {};
|
||||
EXPECT_EQ(lookup.to_sockaddr(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 80), 0u);
|
||||
}
|
||||
|
||||
TEST(Ipv4Resolve, Ipv6LiteralIsRejected) {
|
||||
Ipv4Resolve lookup;
|
||||
lookup.start("::1", 443, "test");
|
||||
EXPECT_FALSE(lookup.ready());
|
||||
EXPECT_TRUE(lookup.consume_failure());
|
||||
}
|
||||
|
||||
TEST(Ipv4Resolve, ShortBufferWritesNothing) {
|
||||
Ipv4Resolve lookup;
|
||||
lookup.start("192.0.2.10", 502, "test");
|
||||
ASSERT_TRUE(lookup.ready());
|
||||
struct sockaddr_in addr {};
|
||||
EXPECT_EQ(lookup.to_sockaddr(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr) - 1, 502), 0u);
|
||||
}
|
||||
|
||||
TEST(Ipv4Resolve, RetryAfterFailureKeepsTheAddress) {
|
||||
Ipv4Resolve lookup;
|
||||
lookup.start("::1", 443, "test");
|
||||
EXPECT_FALSE(lookup.ready());
|
||||
lookup.start("192.168.1.1", 1, "test");
|
||||
EXPECT_TRUE(lookup.ready());
|
||||
EXPECT_FALSE(lookup.consume_failure());
|
||||
EXPECT_TRUE(lookup.ready());
|
||||
}
|
||||
|
||||
TEST(Ipv4Resolve, ForgetDropsAStaleFailure) {
|
||||
Ipv4Resolve lookup;
|
||||
lookup.start("::1", 443, "test");
|
||||
lookup.forget();
|
||||
EXPECT_FALSE(lookup.consume_failure());
|
||||
EXPECT_FALSE(lookup.ready());
|
||||
}
|
||||
|
||||
} // namespace esphome::socket::testing
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user