aboutsummaryrefslogtreecommitdiff
path: root/cast/common/public/receiver_info_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cast/common/public/receiver_info_unittest.cc')
-rw-r--r--cast/common/public/receiver_info_unittest.cc183
1 files changed, 183 insertions, 0 deletions
diff --git a/cast/common/public/receiver_info_unittest.cc b/cast/common/public/receiver_info_unittest.cc
new file mode 100644
index 00000000..a7b16e2d
--- /dev/null
+++ b/cast/common/public/receiver_info_unittest.cc
@@ -0,0 +1,183 @@
+// Copyright 2019 The Chromium 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 "cast/common/public/receiver_info.h"
+
+#include <cstdio>
+#include <sstream>
+
+#include "cast/common/public/testing/discovery_utils.h"
+#include "discovery/dnssd/public/dns_sd_instance.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace openscreen {
+namespace cast {
+namespace {
+
+constexpr NetworkInterfaceIndex kNetworkInterface = 0;
+
+}
+
+TEST(ReceiverInfoTests, ConvertValidFromDnsSd) {
+ std::string instance = "InstanceId";
+ discovery::DnsSdTxtRecord txt = CreateValidTxt();
+ discovery::DnsSdInstanceEndpoint record(
+ instance, kCastV2ServiceId, kCastV2DomainId, txt, kNetworkInterface,
+ kEndpointV4, kEndpointV6);
+ ErrorOr<ReceiverInfo> info = DnsSdInstanceEndpointToReceiverInfo(record);
+ ASSERT_TRUE(info.is_value()) << info;
+ EXPECT_EQ(info.value().unique_id, kTestUniqueId);
+ EXPECT_TRUE(info.value().v4_address);
+ EXPECT_EQ(info.value().v4_address, kAddressV4);
+ EXPECT_TRUE(info.value().v6_address);
+ EXPECT_EQ(info.value().v6_address, kAddressV6);
+ EXPECT_EQ(info.value().port, kPort);
+ EXPECT_EQ(info.value().unique_id, kTestUniqueId);
+ EXPECT_EQ(info.value().protocol_version, kTestVersion);
+ EXPECT_EQ(info.value().capabilities, kCapabilitiesParsed);
+ EXPECT_EQ(info.value().status, kStatusParsed);
+ EXPECT_EQ(info.value().model_name, kModelName);
+ EXPECT_EQ(info.value().friendly_name, kFriendlyName);
+
+ record = discovery::DnsSdInstanceEndpoint(instance, kCastV2ServiceId,
+ kCastV2DomainId, txt,
+ kNetworkInterface, kEndpointV4);
+ info = DnsSdInstanceEndpointToReceiverInfo(record);
+ ASSERT_TRUE(info.is_value());
+ EXPECT_EQ(info.value().unique_id, kTestUniqueId);
+ EXPECT_TRUE(info.value().v4_address);
+ EXPECT_EQ(info.value().v4_address, kAddressV4);
+ EXPECT_FALSE(info.value().v6_address);
+ EXPECT_EQ(info.value().unique_id, kTestUniqueId);
+ EXPECT_EQ(info.value().protocol_version, kTestVersion);
+ EXPECT_EQ(info.value().capabilities, kCapabilitiesParsed);
+ EXPECT_EQ(info.value().status, kStatusParsed);
+ EXPECT_EQ(info.value().model_name, kModelName);
+ EXPECT_EQ(info.value().friendly_name, kFriendlyName);
+
+ record = discovery::DnsSdInstanceEndpoint(instance, kCastV2ServiceId,
+ kCastV2DomainId, txt,
+ kNetworkInterface, kEndpointV6);
+ info = DnsSdInstanceEndpointToReceiverInfo(record);
+ ASSERT_TRUE(info.is_value());
+ EXPECT_EQ(info.value().unique_id, kTestUniqueId);
+ EXPECT_FALSE(info.value().v4_address);
+ EXPECT_TRUE(info.value().v6_address);
+ EXPECT_EQ(info.value().v6_address, kAddressV6);
+ EXPECT_EQ(info.value().unique_id, kTestUniqueId);
+ EXPECT_EQ(info.value().protocol_version, kTestVersion);
+ EXPECT_EQ(info.value().capabilities, kCapabilitiesParsed);
+ EXPECT_EQ(info.value().status, kStatusParsed);
+ EXPECT_EQ(info.value().model_name, kModelName);
+ EXPECT_EQ(info.value().friendly_name, kFriendlyName);
+}
+
+TEST(ReceiverInfoTests, ConvertInvalidFromDnsSd) {
+ std::string instance = "InstanceId";
+ discovery::DnsSdTxtRecord txt = CreateValidTxt();
+ txt.ClearValue(kUniqueIdKey);
+ discovery::DnsSdInstanceEndpoint record(
+ instance, kCastV2ServiceId, kCastV2DomainId, txt, kNetworkInterface,
+ kEndpointV4, kEndpointV6);
+ EXPECT_TRUE(DnsSdInstanceEndpointToReceiverInfo(record).is_error());
+
+ txt = CreateValidTxt();
+ txt.ClearValue(kVersionKey);
+ record = discovery::DnsSdInstanceEndpoint(
+ instance, kCastV2ServiceId, kCastV2DomainId, txt, kNetworkInterface,
+ kEndpointV4, kEndpointV6);
+ EXPECT_TRUE(DnsSdInstanceEndpointToReceiverInfo(record).is_error());
+
+ txt = CreateValidTxt();
+ txt.ClearValue(kCapabilitiesKey);
+ record = discovery::DnsSdInstanceEndpoint(
+ instance, kCastV2ServiceId, kCastV2DomainId, txt, kNetworkInterface,
+ kEndpointV4, kEndpointV6);
+ EXPECT_TRUE(DnsSdInstanceEndpointToReceiverInfo(record).is_error());
+
+ txt = CreateValidTxt();
+ txt.ClearValue(kStatusKey);
+ record = discovery::DnsSdInstanceEndpoint(
+ instance, kCastV2ServiceId, kCastV2DomainId, txt, kNetworkInterface,
+ kEndpointV4, kEndpointV6);
+ EXPECT_TRUE(DnsSdInstanceEndpointToReceiverInfo(record).is_error());
+
+ txt = CreateValidTxt();
+ txt.ClearValue(kFriendlyNameKey);
+ record = discovery::DnsSdInstanceEndpoint(
+ instance, kCastV2ServiceId, kCastV2DomainId, txt, kNetworkInterface,
+ kEndpointV4, kEndpointV6);
+ EXPECT_TRUE(DnsSdInstanceEndpointToReceiverInfo(record).is_error());
+
+ txt = CreateValidTxt();
+ txt.ClearValue(kModelNameKey);
+ record = discovery::DnsSdInstanceEndpoint(
+ instance, kCastV2ServiceId, kCastV2DomainId, txt, kNetworkInterface,
+ kEndpointV4, kEndpointV6);
+ // Note: Model name is an optional field.
+ EXPECT_FALSE(DnsSdInstanceEndpointToReceiverInfo(record).is_error());
+}
+
+TEST(ReceiverInfoTests, ConvertValidToDnsSd) {
+ ReceiverInfo info;
+ info.v4_address = kAddressV4;
+ info.v6_address = kAddressV6;
+ info.port = kPort;
+ info.unique_id = kTestUniqueId;
+ info.protocol_version = kTestVersion;
+ info.capabilities = kCapabilitiesParsed;
+ info.status = kStatusParsed;
+ info.model_name = kModelName;
+ info.friendly_name = kFriendlyName;
+ discovery::DnsSdInstance instance = ReceiverInfoToDnsSdInstance(info);
+ CompareTxtString(instance.txt(), kUniqueIdKey, kTestUniqueId);
+ CompareTxtString(instance.txt(), kCapabilitiesKey, kCapabilitiesString);
+ CompareTxtString(instance.txt(), kModelNameKey, kModelName);
+ CompareTxtString(instance.txt(), kFriendlyNameKey, kFriendlyName);
+ CompareTxtInt(instance.txt(), kVersionKey, kTestVersion);
+ CompareTxtInt(instance.txt(), kStatusKey, kStatus);
+}
+
+TEST(ReceiverInfoTests, ParseReceiverInfoFromRealTXT) {
+ constexpr struct {
+ const char* key;
+ const char* value;
+ } kRealTXTForReceiverCastingYoutube[] = {
+ {"bs", "FA99CBBF17D0"},
+ // Note: Includes bits set that are not known:
+ {"ca", "208901"},
+ {"cd", "FED81089FA3FF851CF088AB33AB014C0"},
+ {"fn", u8"⚡ Yurovision® ULTRA™"},
+ {"ic", "/setup/icon.png"},
+ {"id", "4ef522244a5a877f35ddead7d98702e6"},
+ {"md", "Chromecast Ultra"},
+ {"nf", "2"},
+ {"rm", "6342FE65DD269999"},
+ {"rs", "YouTube"},
+ {"st", "1"},
+ {"ve", "05"},
+ };
+
+ discovery::DnsSdTxtRecord txt;
+ for (const auto e : kRealTXTForReceiverCastingYoutube) {
+ ASSERT_TRUE(txt.SetValue(e.key, e.value).ok());
+ }
+ const discovery::DnsSdInstanceEndpoint record(
+ "InstanceId", kCastV2ServiceId, kCastV2DomainId, std::move(txt),
+ kNetworkInterface, kEndpointV4, kEndpointV6);
+
+ const ErrorOr<ReceiverInfo> result =
+ DnsSdInstanceEndpointToReceiverInfo(record);
+ const ReceiverInfo& info = result.value();
+ EXPECT_EQ(info.unique_id, "4ef522244a5a877f35ddead7d98702e6");
+ EXPECT_EQ(info.protocol_version, 5);
+ EXPECT_TRUE(info.capabilities & (kHasVideoOutput | kHasAudioOutput));
+ EXPECT_EQ(info.status, kBusy);
+ EXPECT_EQ(info.model_name, "Chromecast Ultra");
+ EXPECT_EQ(info.friendly_name, u8"⚡ Yurovision® ULTRA™");
+}
+
+} // namespace cast
+} // namespace openscreen