// 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 "discovery/dnssd/public/dns_sd_txt_record.h" #include "gmock/gmock.h" #include "gtest/gtest.h" namespace openscreen { namespace discovery { namespace dnssd { TEST(TxtRecordTest, TestCaseInsensitivity) { DnsSdTxtRecord txt; std::vector data{'a', 'b', 'c'}; EXPECT_TRUE(txt.SetValue("key", data).ok()); EXPECT_TRUE(txt.GetValue("KEY").is_value()); EXPECT_TRUE(txt.SetFlag("KEY2", true).ok()); ASSERT_TRUE(txt.GetFlag("key2").is_value()); EXPECT_TRUE(txt.GetFlag("key2").value()); } TEST(TxtRecordTest, TestEmptyValue) { DnsSdTxtRecord txt; EXPECT_TRUE(txt.SetValue("key", std::vector{}).ok()); ASSERT_TRUE(txt.GetValue("key").is_value()); EXPECT_EQ(txt.GetValue("key").value().get().size(), size_t{0}); EXPECT_TRUE(txt.SetValue("key2", "").ok()); ASSERT_TRUE(txt.GetValue("key2").is_value()); EXPECT_EQ(txt.GetValue("key2").value().get().size(), size_t{0}); } TEST(TxtRecordTest, TestSetAndGetValue) { DnsSdTxtRecord txt; std::vector data{'a', 'b', 'c'}; EXPECT_TRUE(txt.SetValue("key", data).ok()); ASSERT_TRUE(txt.GetValue("key").is_value()); const std::vector& value = txt.GetValue("key").value(); ASSERT_EQ(value.size(), size_t{3}); EXPECT_EQ(value[0], 'a'); EXPECT_EQ(value[1], 'b'); EXPECT_EQ(value[2], 'c'); std::vector data2{'a', 'b'}; EXPECT_TRUE(txt.SetValue("key", data2).ok()); ASSERT_TRUE(txt.GetValue("key").is_value()); const std::vector& value2 = txt.GetValue("key").value(); EXPECT_EQ(value2.size(), size_t{2}); EXPECT_EQ(value2[0], 'a'); EXPECT_EQ(value2[1], 'b'); EXPECT_TRUE(txt.SetValue("key", "abc").ok()); ASSERT_TRUE(txt.GetValue("key").is_value()); const std::vector& value3 = txt.GetValue("key").value(); ASSERT_EQ(value.size(), size_t{3}); EXPECT_EQ(value3[0], 'a'); EXPECT_EQ(value3[1], 'b'); EXPECT_EQ(value3[2], 'c'); EXPECT_TRUE(txt.SetValue("key", "ab").ok()); ASSERT_TRUE(txt.GetValue("key").is_value()); const std::vector& value4 = txt.GetValue("key").value(); EXPECT_EQ(value4.size(), size_t{2}); EXPECT_EQ(value4[0], 'a'); EXPECT_EQ(value4[1], 'b'); } TEST(TxtRecordTest, TestClearValue) { DnsSdTxtRecord txt; std::vector data{'a', 'b', 'c'}; EXPECT_TRUE(txt.SetValue("key", data).ok()); txt.ClearValue("key"); EXPECT_FALSE(txt.GetValue("key").is_value()); } TEST(TxtRecordTest, TestSetAndGetFlag) { DnsSdTxtRecord txt; EXPECT_TRUE(txt.SetFlag("key", true).ok()); ASSERT_TRUE(txt.GetFlag("key").is_value()); EXPECT_TRUE(txt.GetFlag("key").value()); EXPECT_TRUE(txt.SetFlag("key", false).ok()); ASSERT_TRUE(txt.GetFlag("key").is_value()); EXPECT_FALSE(txt.GetFlag("key").value()); } TEST(TxtRecordTest, TestClearFlag) { DnsSdTxtRecord txt; EXPECT_TRUE(txt.SetFlag("key", true).ok()); txt.ClearFlag("key"); ASSERT_TRUE(txt.GetFlag("key").is_value()); EXPECT_FALSE(txt.GetFlag("key").value()); } TEST(TxtRecordTest, TestGettingWrongRecordTypeFails) { DnsSdTxtRecord txt; std::vector data{'a', 'b', 'c'}; EXPECT_TRUE(txt.SetValue("key", data).ok()); EXPECT_TRUE(txt.SetFlag("key2", true).ok()); EXPECT_FALSE(txt.GetValue("key2").is_value()); } TEST(TxtRecordTest, TestClearWrongRecordTypeFails) { DnsSdTxtRecord txt; std::vector data{'a', 'b', 'c'}; EXPECT_TRUE(txt.SetValue("key", data).ok()); EXPECT_TRUE(txt.SetFlag("key2", true).ok()); } TEST(TxtRecordTest, TestGetDataWorks) { DnsSdTxtRecord txt; std::vector data{'a', 'b', 'c'}; EXPECT_TRUE(txt.SetValue("key", data).ok()); EXPECT_TRUE(txt.SetFlag("bool", true).ok()); std::vector> results = txt.GetData(); ASSERT_EQ(results.size(), size_t{2}); bool seen_flag = false; bool seen_kv_pair = false; for (const std::vector& entry : results) { std::string flag = "bool"; std::string kv_pair = "key=abc"; for (size_t i = 0; i < flag.size(); i++) { if (entry[i] != flag[i]) { break; } if (i == flag.size() - 1) { seen_flag = true; } } for (size_t i = 0; i < kv_pair.size(); i++) { if (entry[i] != kv_pair[i]) { break; } if (i == kv_pair.size() - 1) { seen_kv_pair = true; } } } EXPECT_TRUE(seen_flag); EXPECT_TRUE(seen_kv_pair); } } // namespace dnssd } // namespace discovery } // namespace openscreen