blob: f717087dc76075fb546ee6bea0b550fdee84d9bc [file] [log] [blame]
// Copyright 2025 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 "quiche/quic/core/quic_inlined_string_view.h"
#include <cstddef>
#include <cstdint>
#include <string>
#include "absl/strings/string_view.h"
#include "quiche/common/platform/api/quiche_test.h"
namespace quic {
namespace {
TEST(QuicInlinedStringViewTest, DefaultConstructor) {
QuicInlinedStringView<24> view;
EXPECT_EQ(view.data(), nullptr);
EXPECT_EQ(view.size(), 0);
EXPECT_EQ(view.view(), absl::string_view());
EXPECT_TRUE(view.IsInlined());
QuicInlinedStringView<24> view_from_empty("");
EXPECT_EQ(view_from_empty.data(), nullptr);
EXPECT_EQ(view_from_empty.size(), 0);
EXPECT_EQ(view_from_empty.view(), absl::string_view());
EXPECT_TRUE(view_from_empty.IsInlined());
}
TEST(QuicInlinedStringViewTest, RangeTest) {
constexpr size_t kBufSize = 32;
for (size_t size = 1; size < 1024; ++size) {
std::string example(size, 'a');
QuicInlinedStringView<kBufSize> view(example);
EXPECT_NE(view.data(), nullptr);
EXPECT_EQ(view.size(), size);
EXPECT_EQ(view.view(), example);
EXPECT_EQ(view.IsInlined(), size < kBufSize);
}
}
// Test 16 bytes specifically, since on 64-bit platforms, that is where the size
// byte overlaps with the inlined marker.
TEST(QuicInlinedStringViewTest, RangeTest16) {
constexpr size_t kBufSize = 16;
for (size_t size = 1; size < 1024; ++size) {
std::string example(size, 'a');
QuicInlinedStringView<kBufSize> view(example);
EXPECT_NE(view.data(), nullptr);
EXPECT_EQ(view.size(), size);
EXPECT_EQ(view.view(), example);
EXPECT_EQ(view.IsInlined(), size < kBufSize);
}
}
TEST(QuicInlinedStringViewTest, CopyConstructor) {
QuicInlinedStringView<24> view_inlined("aaa");
ASSERT_TRUE(view_inlined.IsInlined());
QuicInlinedStringView<24> view_inlined_copy = view_inlined;
EXPECT_EQ(view_inlined.view(), view_inlined_copy.view());
EXPECT_NE(reinterpret_cast<uintptr_t>(view_inlined.data()),
reinterpret_cast<uintptr_t>(view_inlined_copy.data()));
QuicInlinedStringView<24> view_external("aaaaaaaaaaaaaaaaaaaaaaaaa");
ASSERT_FALSE(view_external.IsInlined());
QuicInlinedStringView<24> view_external_copy = view_external;
EXPECT_EQ(view_external.view(), view_external_copy.view());
EXPECT_EQ(reinterpret_cast<uintptr_t>(view_external.data()),
reinterpret_cast<uintptr_t>(view_external_copy.data()));
}
TEST(QuicInlinedStringViewTest, IsEmptyAfterClear) {
QuicInlinedStringView<24> view("foo");
view.clear();
ASSERT_TRUE(view.empty());
ASSERT_EQ(view.size(), 0);
ASSERT_TRUE(view.IsInlined());
}
TEST(QuicInlinedStringViewTest,
NonEmptyStringHasDifferentDataPointerWhenInlined) {
absl::string_view view = "foo";
QuicInlinedStringView<24> quic_view(view);
EXPECT_TRUE(quic_view.IsInlined());
EXPECT_NE(view.data(), quic_view.data());
}
TEST(QuicInlinedStringViewTest,
NonEmptyStringHasSameDataPointerWhenNotInlined) {
std::string big_string(300, 'a');
QuicInlinedStringView<24> quic_view(big_string);
EXPECT_FALSE(quic_view.IsInlined());
EXPECT_EQ(quic_view.data(), big_string.data());
}
} // namespace
} // namespace quic