blob: f3239ca3d001105989d8f3aefadeed29dd07dd49 [file] [log] [blame]
// 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<uint8_t> 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<uint8_t>{}).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<uint8_t> data{'a', 'b', 'c'};
EXPECT_TRUE(txt.SetValue("key", data).ok());
ASSERT_TRUE(txt.GetValue("key").is_value());
const std::vector<uint8_t>& 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<uint8_t> data2{'a', 'b'};
EXPECT_TRUE(txt.SetValue("key", data2).ok());
ASSERT_TRUE(txt.GetValue("key").is_value());
const std::vector<uint8_t>& 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<uint8_t>& 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<uint8_t>& 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<uint8_t> 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<uint8_t> 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<uint8_t> 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<uint8_t> data{'a', 'b', 'c'};
EXPECT_TRUE(txt.SetValue("key", data).ok());
EXPECT_TRUE(txt.SetFlag("bool", true).ok());
std::vector<std::vector<uint8_t>> results = txt.GetData();
ASSERT_EQ(results.size(), size_t{2});
bool seen_flag = false;
bool seen_kv_pair = false;
for (const std::vector<uint8_t>& 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