blob: 35dae86e907cb1e73edc5ab57506a72285c7ef25 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <gtest/gtest.h>
#include "src/connectivity/network/mdns/service/mdns_names.h"
namespace mdns {
namespace test {
// Tests |LocalHostFullName|.
TEST(MdnsNamesTest, LocalHostFullName) {
EXPECT_EQ("test.host.name.local.", MdnsNames::LocalHostFullName("test.host.name"));
EXPECT_EQ("test-host-name.local.", MdnsNames::LocalHostFullName("test-host-name"));
}
// Tests |LocalServiceFullName|.
TEST(MdnsNamesTest, LocalServiceFullName) {
EXPECT_EQ("_printer._tcp.local.", MdnsNames::LocalServiceFullName("_printer._tcp."));
EXPECT_EQ("_fuchsia._udp.local.", MdnsNames::LocalServiceFullName("_fuchsia._udp."));
}
// Tests |LocalServiceSubtypeFullName|.
TEST(MdnsNamesTest, LocalServiceSubtypeFullName) {
EXPECT_EQ("_color._sub._printer._tcp.local.",
MdnsNames::LocalServiceSubtypeFullName("_printer._tcp.", "_color"));
EXPECT_EQ("_nuc._sub._fuchsia._udp.local.",
MdnsNames::LocalServiceSubtypeFullName("_fuchsia._udp.", "_nuc"));
}
// Tests |LocalInstanceFullName|.
TEST(MdnsNamesTest, LocalInstanceFullName) {
EXPECT_EQ("Acme Splotchamatic._printer._tcp.local.",
MdnsNames::LocalInstanceFullName("Acme Splotchamatic", "_printer._tcp."));
EXPECT_EQ("My Egg Timer._fuchsia._udp.local.",
MdnsNames::LocalInstanceFullName("My Egg Timer", "_fuchsia._udp."));
}
// Tests |ExtractInstanceName|.
TEST(MdnsNamesTest, ExtractInstanceName) {
std::string instance_name;
EXPECT_TRUE(MdnsNames::ExtractInstanceName("Acme Splotchamatic._printer._tcp.local.",
"_printer._tcp.", &instance_name));
EXPECT_EQ("Acme Splotchamatic", instance_name);
EXPECT_TRUE(MdnsNames::ExtractInstanceName("My Egg Timer._fuchsia._udp.local.", "_fuchsia._udp.",
&instance_name));
EXPECT_EQ("My Egg Timer", instance_name);
// Wrong service type.
EXPECT_FALSE(MdnsNames::ExtractInstanceName("Acme Splotchamatic._printer._tcp.local.",
"_fuchsia._udp.", &instance_name));
// No local suffix.
EXPECT_FALSE(MdnsNames::ExtractInstanceName("Acme Splotchamatic._printer._tcp.", "_printer._tcp.",
&instance_name));
// Just a service name.
EXPECT_FALSE(
MdnsNames::ExtractInstanceName("_printer._tcp.local.", "_printer._tcp.", &instance_name));
// Zero-length instance name.
EXPECT_FALSE(
MdnsNames::ExtractInstanceName("._printer._tcp.local.", "_printer._tcp.", &instance_name));
// Instance name almost too long.
EXPECT_TRUE(MdnsNames::ExtractInstanceName(
"012345678901234567890123456789012345678901234567890123456789012._"
"printer._tcp.local.",
"_printer._tcp.", &instance_name));
EXPECT_EQ("012345678901234567890123456789012345678901234567890123456789012", instance_name);
// Instance name too long.
EXPECT_FALSE(MdnsNames::ExtractInstanceName(
"0123456789012345678901234567890123456789012345678901234567890123._"
"printer._tcp.local.",
"_printer._tcp.", &instance_name));
}
// Tests |MatchServiceName|.
TEST(MdnsNamesTest, MatchServiceName) {
std::string subtype;
EXPECT_TRUE(MdnsNames::MatchServiceName("_printer._tcp.local.", "_printer._tcp.", &subtype));
EXPECT_EQ("", subtype);
EXPECT_TRUE(MdnsNames::MatchServiceName("_fuchsia._udp.local.", "_fuchsia._udp.", &subtype));
EXPECT_EQ("", subtype);
EXPECT_TRUE(
MdnsNames::MatchServiceName("_color._sub._printer._tcp.local.", "_printer._tcp.", &subtype));
EXPECT_EQ("_color", subtype);
EXPECT_TRUE(
MdnsNames::MatchServiceName("_nuc._sub._fuchsia._udp.local.", "_fuchsia._udp.", &subtype));
EXPECT_EQ("_nuc", subtype);
// Wrong service type.
EXPECT_FALSE(MdnsNames::MatchServiceName("_printer._tcp.local.", "_fuchsia._udp.", &subtype));
// Wrong service type with subtype.
EXPECT_FALSE(
MdnsNames::MatchServiceName("_color._sub._printer._tcp.local.", "_fuchsia._udp.", &subtype));
// No local suffix.
EXPECT_FALSE(MdnsNames::MatchServiceName("_printer._tcp.", "_printer._tcp.", &subtype));
// No local suffix with subtype.
EXPECT_FALSE(
MdnsNames::MatchServiceName("_color._sub._printer._tcp.", "_printer._tcp.", &subtype));
// Zero-length subtype.
EXPECT_FALSE(
MdnsNames::MatchServiceName("._sub._printer._tcp.local.", "_printer._tcp.", &subtype));
// Missing _sub.
EXPECT_FALSE(
MdnsNames::MatchServiceName("_color._printer._tcp.local.", "_printer._tcp.", &subtype));
// Subtype almost too long.
EXPECT_TRUE(MdnsNames::MatchServiceName(
"012345678901234567890123456789012345678901234567890123456789012._sub._"
"printer._tcp.local.",
"_printer._tcp.", &subtype));
EXPECT_EQ("012345678901234567890123456789012345678901234567890123456789012", subtype);
// Subtype too long.
EXPECT_FALSE(MdnsNames::MatchServiceName(
"0123456789012345678901234567890123456789012345678901234567890123._sub._"
"printer._tcp.local.",
"_printer._tcp.", &subtype));
}
// Tests |IsValidHostName|.
TEST(MdnsNamesTest, IsValidHostName) {
EXPECT_TRUE(MdnsNames::IsValidHostName("gopher"));
EXPECT_TRUE(MdnsNames::IsValidHostName("gopher-cow-alpaca-racoon"));
EXPECT_TRUE(MdnsNames::IsValidHostName("gopher.cow.alpaca.racoon"));
EXPECT_TRUE(MdnsNames::IsValidHostName("g.c.a.r"));
EXPECT_TRUE(MdnsNames::IsValidHostName(
"012345678901234567890123456789012345678901234567890123456789012"));
EXPECT_TRUE(
MdnsNames::IsValidHostName("012345678901234567890123456789012345678901234567890123456789012."
"012345678901234567890123456789012345678901234567890123456789012."
"012345678901234567890123456789012345678901234567890123456789012."
"0123456789012345678901234567890123456789012345678901234"));
// Empty.
EXPECT_FALSE(MdnsNames::IsValidHostName(""));
// Empty labels.
EXPECT_FALSE(MdnsNames::IsValidHostName("."));
// Empty labels.
EXPECT_FALSE(MdnsNames::IsValidHostName(".."));
// Empty label.
EXPECT_FALSE(MdnsNames::IsValidHostName("gopher."));
// Empty label.
EXPECT_FALSE(MdnsNames::IsValidHostName("gopher..cow"));
// Too long.
EXPECT_FALSE(
MdnsNames::IsValidHostName("012345678901234567890123456789012345678901234567890123456789012."
"012345678901234567890123456789012345678901234567890123456789012."
"012345678901234567890123456789012345678901234567890123456789012."
"01234567890123456789012345678901234567890123456789012345"));
// Label too long.
EXPECT_FALSE(MdnsNames::IsValidHostName(
"0123456789012345678901234567890123456789012345678901234567890123"));
}
// Tests |IsValidServiceName|.
TEST(MdnsNamesTest, IsValidServiceName) {
EXPECT_TRUE(MdnsNames::IsValidServiceName("_printer._tcp."));
EXPECT_TRUE(MdnsNames::IsValidServiceName("_printer._udp."));
EXPECT_TRUE(MdnsNames::IsValidServiceName("_._udp."));
EXPECT_TRUE(MdnsNames::IsValidServiceName("_x._udp."));
EXPECT_TRUE(MdnsNames::IsValidServiceName("_012345678901234._tcp."));
// Empty.
EXPECT_FALSE(MdnsNames::IsValidServiceName(""));
// No termination.
EXPECT_FALSE(MdnsNames::IsValidServiceName("_printer._tcp"));
// Invalid transport.
EXPECT_FALSE(MdnsNames::IsValidServiceName("_printer._qfc."));
// Empty label.
EXPECT_FALSE(MdnsNames::IsValidServiceName("._tcp."));
// Label too long.
EXPECT_FALSE(MdnsNames::IsValidServiceName("_0123456789012345._tcp."));
// No leading underscore.
EXPECT_FALSE(MdnsNames::IsValidServiceName("printer._tcp."));
// Too many labels
EXPECT_FALSE(MdnsNames::IsValidServiceName("pretty.printer._tcp."));
}
// Tests |IsValidInstanceName|.
TEST(MdnsNamesTest, IsValidInstanceName) {
EXPECT_TRUE(MdnsNames::IsValidInstanceName("x"));
EXPECT_TRUE(MdnsNames::IsValidInstanceName("x-ray machine"));
EXPECT_TRUE(MdnsNames::IsValidInstanceName(
"012345678901234567890123456789012345678901234567890123456789012"));
// Empty.
EXPECT_FALSE(MdnsNames::IsValidInstanceName(""));
// Just a dot.
EXPECT_FALSE(MdnsNames::IsValidInstanceName("."));
// More than one label.
EXPECT_FALSE(MdnsNames::IsValidInstanceName("gopher.cow"));
// Too long.
EXPECT_FALSE(MdnsNames::IsValidInstanceName(
"0123456789012345678901234567890123456789012345678901234567890123"));
}
// Tests |IsValidSubtypeName|.
TEST(MdnsNamesTest, IsValidSubtypeName) {
EXPECT_TRUE(MdnsNames::IsValidSubtypeName("x"));
EXPECT_TRUE(MdnsNames::IsValidSubtypeName("x-ray machine"));
EXPECT_TRUE(MdnsNames::IsValidSubtypeName(
"012345678901234567890123456789012345678901234567890123456789012"));
// Empty.
EXPECT_FALSE(MdnsNames::IsValidSubtypeName(""));
// Just a dot.
EXPECT_FALSE(MdnsNames::IsValidSubtypeName("."));
// More than one label.
EXPECT_FALSE(MdnsNames::IsValidSubtypeName("gopher.cow"));
// Too long.
EXPECT_FALSE(MdnsNames::IsValidSubtypeName(
"0123456789012345678901234567890123456789012345678901234567890123"));
}
// Tests |IsValidTextString|.
TEST(MdnsNamesTest, IsValidTextString) {
EXPECT_TRUE(MdnsNames::IsValidTextString(""));
EXPECT_TRUE(MdnsNames::IsValidTextString("."));
EXPECT_TRUE(MdnsNames::IsValidTextString("x.y"));
EXPECT_TRUE(MdnsNames::IsValidTextString("x=y"));
EXPECT_TRUE(MdnsNames::IsValidTextString("x"));
EXPECT_TRUE(MdnsNames::IsValidTextString("x-ray machine"));
EXPECT_TRUE(MdnsNames::IsValidTextString(
"012345678901234567890123456789012345678901234567890123456789012345678901"
"234567890123456789012345678901234567890123456789012345678901234567890123"
"456789012345678901234567890123456789012345678901234567890123456789012345"
"678901234567890123456789012345678901234"));
// Too long.
EXPECT_FALSE(MdnsNames::IsValidTextString(
"012345678901234567890123456789012345678901234567890123456789012345678901"
"234567890123456789012345678901234567890123456789012345678901234567890123"
"456789012345678901234567890123456789012345678901234567890123456789012345"
"6789012345678901234567890123456789012345"));
}
} // namespace test
} // namespace mdns