diff options
author | 2020-08-03 14:33:06 +0000 | |
---|---|---|
committer | 2020-08-03 14:33:06 +0000 | |
commit | 061da546b983eb767bad15e67af1174fb0bcf31c (patch) | |
tree | 83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/unittests/Utility/StreamTeeTest.cpp | |
parent | Import LLVM 10.0.0 release including clang, lld and lldb. (diff) | |
download | wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip |
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom
tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/unittests/Utility/StreamTeeTest.cpp')
-rw-r--r-- | gnu/llvm/lldb/unittests/Utility/StreamTeeTest.cpp | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/unittests/Utility/StreamTeeTest.cpp b/gnu/llvm/lldb/unittests/Utility/StreamTeeTest.cpp new file mode 100644 index 00000000000..c55006bfb85 --- /dev/null +++ b/gnu/llvm/lldb/unittests/Utility/StreamTeeTest.cpp @@ -0,0 +1,198 @@ +//===-- StreamTeeTest.cpp ---------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/StreamTee.h" +#include "lldb/Utility/StreamString.h" +#include "gtest/gtest.h" + +using namespace lldb_private; + +TEST(StreamTeeTest, DefaultConstructor) { + // Test the default constructor. + StreamTee tee; + ASSERT_EQ(0U, tee.GetNumStreams()); +} + +TEST(StreamTeeTest, Constructor1Stream) { + // Test the constructor for a single stream. + lldb::StreamSP s1(std::make_shared<StreamString>()); + StreamTee tee(s1); + + ASSERT_EQ(1U, tee.GetNumStreams()); + EXPECT_EQ(s1, tee.GetStreamAtIndex(0U)); +} + +TEST(StreamTeeTest, Constructor2Streams) { + // Test the constructor for two streams. + lldb::StreamSP s1(std::make_shared<StreamString>()); + lldb::StreamSP s2(std::make_shared<StreamString>()); + StreamTee tee(s1, s2); + + ASSERT_EQ(2U, tee.GetNumStreams()); + EXPECT_EQ(s1, tee.GetStreamAtIndex(0U)); + EXPECT_EQ(s2, tee.GetStreamAtIndex(1U)); +} + +TEST(StreamTeeTest, CopyConstructor) { + // Test the copy constructor. + lldb::StreamSP s1(std::make_shared<StreamString>()); + lldb::StreamSP s2(std::make_shared<StreamString>()); + StreamTee tee1(s1, s2); + StreamTee tee2(tee1); + + ASSERT_EQ(2U, tee2.GetNumStreams()); + EXPECT_EQ(s1, tee2.GetStreamAtIndex(0U)); + EXPECT_EQ(s2, tee2.GetStreamAtIndex(1U)); +} + +TEST(StreamTeeTest, Assignment) { + // Test the assignment of StreamTee. + lldb::StreamSP s1(std::make_shared<StreamString>()); + lldb::StreamSP s2(std::make_shared<StreamString>()); + StreamTee tee1(s1, s2); + StreamTee tee2 = tee1; + + ASSERT_EQ(2U, tee2.GetNumStreams()); + EXPECT_EQ(s1, tee2.GetStreamAtIndex(0U)); + EXPECT_EQ(s2, tee2.GetStreamAtIndex(1U)); +} + +TEST(StreamTeeTest, Write) { + // Test that write is sent out to all children. + auto ss1 = new StreamString(); + auto ss2 = new StreamString(); + lldb::StreamSP s1(ss1); + lldb::StreamSP s2(ss2); + StreamTee tee(s1, s2); + + tee << "foo"; + tee.Flush(); + + ASSERT_EQ(2U, tee.GetNumStreams()); + EXPECT_EQ("foo", ss1->GetString().str()); + EXPECT_EQ("foo", ss2->GetString().str()); + + tee << "bar"; + tee.Flush(); + EXPECT_EQ("foobar", ss1->GetString().str()); + EXPECT_EQ("foobar", ss2->GetString().str()); +} + +namespace { + struct FlushTestStream : public Stream { + unsigned m_flush_count = false; + void Flush() override { + ++m_flush_count; + } + size_t WriteImpl(const void *src, size_t src_len) override { + return src_len; + } + }; +} + +TEST(StreamTeeTest, Flush) { + // Check that Flush is distributed to all streams. + auto fs1 = new FlushTestStream(); + auto fs2 = new FlushTestStream(); + lldb::StreamSP s1(fs1); + lldb::StreamSP s2(fs2); + StreamTee tee(s1, s2); + + tee << "foo"; + tee.Flush(); + + ASSERT_EQ(2U, tee.GetNumStreams()); + EXPECT_EQ(1U, fs1->m_flush_count); + EXPECT_EQ(1U, fs2->m_flush_count); + + tee << "bar"; + tee.Flush(); + EXPECT_EQ(2U, fs1->m_flush_count); + EXPECT_EQ(2U, fs2->m_flush_count); +} + +TEST(StreamTeeTest, AppendStream) { + // Append new streams to our StreamTee. + auto ss1 = new StreamString(); + auto ss2 = new StreamString(); + lldb::StreamSP s1(ss1); + lldb::StreamSP s2(ss2); + + StreamTee tee; + + ASSERT_EQ(0U, tee.GetNumStreams()); + + tee.AppendStream(s1); + ASSERT_EQ(1U, tee.GetNumStreams()); + EXPECT_EQ(s1, tee.GetStreamAtIndex(0U)); + + tee.AppendStream(s2); + ASSERT_EQ(2U, tee.GetNumStreams()); + EXPECT_EQ(s1, tee.GetStreamAtIndex(0U)); + EXPECT_EQ(s2, tee.GetStreamAtIndex(1U)); +} + +TEST(StreamTeeTest, GetStreamAtIndexOutOfBounds) { + // The index we check for is not in the bounds of the StreamTee. + lldb::StreamSP s1(std::make_shared<StreamString>()); + StreamTee tee(s1); + + ASSERT_EQ(1U, tee.GetNumStreams()); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1)); +} + +TEST(StreamTeeTest, GetStreamAtIndexOutOfBoundsEmpty) { + // Same as above, but with an empty StreamTee. + StreamTee tee; + ASSERT_EQ(0U, tee.GetNumStreams()); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(0U)); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1U)); +} + +TEST(StreamTeeTest, SetStreamAtIndexOverwrite) { + // We overwrite an existing stream at a given index. + lldb::StreamSP s1(std::make_shared<StreamString>()); + StreamTee tee(s1); + + ASSERT_EQ(1U, tee.GetNumStreams()); + EXPECT_EQ(s1, tee.GetStreamAtIndex(0U)); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1U)); + + lldb::StreamSP s2(std::make_shared<StreamString>()); + tee.SetStreamAtIndex(0U, s2); + EXPECT_EQ(1U, tee.GetNumStreams()); + EXPECT_EQ(s2, tee.GetStreamAtIndex(0U)); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1)); +} + +TEST(StreamTeeTest, SetStreamAtIndexOutOfBounds) { + // We place a new stream out of the bounds of the current StreamTee. + lldb::StreamSP s1(std::make_shared<StreamString>()); + StreamTee tee(s1); + + ASSERT_EQ(1U, tee.GetNumStreams()); + EXPECT_EQ(s1, tee.GetStreamAtIndex(0U)); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1U)); + + // Place a new stream out of bounds of the current array. The StreamTee should + // resize itself until it can contain this index. + lldb::StreamSP s2(std::make_shared<StreamString>()); + tee.SetStreamAtIndex(4U, s2); + // Check that the vector has been resized. + EXPECT_EQ(5U, tee.GetNumStreams()); + // Is our stream at the right place? + EXPECT_EQ(s2, tee.GetStreamAtIndex(4U)); + + // Existing stream should still be there. + EXPECT_EQ(s1, tee.GetStreamAtIndex(0U)); + // Other elements are all invalid StreamSPs. + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1U)); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(2U)); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(3U)); + EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(5U)); +} |