blob: 150a8a5b120610b72fb12aeec1d76b24d55555b4 [file] [log] [blame]
Raphael Isemann6188a422018-07-24 00:01:32 +00001//===-- StreamTeeTest.cpp ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Utility/StreamTee.h"
11#include "lldb/Utility/StreamString.h"
12#include "gtest/gtest.h"
13
14using namespace lldb_private;
15
16TEST(StreamTeeTest, DefaultConstructor) {
17 // Test the default constructor.
18 StreamTee tee;
19 ASSERT_EQ(0U, tee.GetNumStreams());
20}
21
22TEST(StreamTeeTest, Constructor1Stream) {
23 // Test the constructor for a single stream.
24 lldb::StreamSP s1(std::make_shared<StreamString>());
25 StreamTee tee(s1);
26
27 ASSERT_EQ(1U, tee.GetNumStreams());
28 EXPECT_EQ(s1, tee.GetStreamAtIndex(0U));
29}
30
31TEST(StreamTeeTest, Constructor2Streams) {
32 // Test the constructor for two streams.
33 lldb::StreamSP s1(std::make_shared<StreamString>());
34 lldb::StreamSP s2(std::make_shared<StreamString>());
35 StreamTee tee(s1, s2);
36
37 ASSERT_EQ(2U, tee.GetNumStreams());
38 EXPECT_EQ(s1, tee.GetStreamAtIndex(0U));
39 EXPECT_EQ(s2, tee.GetStreamAtIndex(1U));
40}
41
42TEST(StreamTeeTest, CopyConstructor) {
43 // Test the copy constructor.
44 lldb::StreamSP s1(std::make_shared<StreamString>());
45 lldb::StreamSP s2(std::make_shared<StreamString>());
46 StreamTee tee1(s1, s2);
47 StreamTee tee2(tee1);
48
49 ASSERT_EQ(2U, tee2.GetNumStreams());
50 EXPECT_EQ(s1, tee2.GetStreamAtIndex(0U));
51 EXPECT_EQ(s2, tee2.GetStreamAtIndex(1U));
52}
53
54TEST(StreamTeeTest, Assignment) {
55 // Test the assignment of StreamTee.
56 lldb::StreamSP s1(std::make_shared<StreamString>());
57 lldb::StreamSP s2(std::make_shared<StreamString>());
58 StreamTee tee1(s1, s2);
59 StreamTee tee2 = tee1;
60
61 ASSERT_EQ(2U, tee2.GetNumStreams());
62 EXPECT_EQ(s1, tee2.GetStreamAtIndex(0U));
63 EXPECT_EQ(s2, tee2.GetStreamAtIndex(1U));
64}
65
66TEST(StreamTeeTest, Write) {
67 // Test that write is sent out to all children.
68 auto ss1 = new StreamString();
69 auto ss2 = new StreamString();
70 lldb::StreamSP s1(ss1);
71 lldb::StreamSP s2(ss2);
72 StreamTee tee(s1, s2);
73
74 tee << "foo";
75 tee.Flush();
76
77 ASSERT_EQ(2U, tee.GetNumStreams());
78 EXPECT_EQ("foo", ss1->GetString().str());
79 EXPECT_EQ("foo", ss2->GetString().str());
80
81 tee << "bar";
82 tee.Flush();
83 EXPECT_EQ("foobar", ss1->GetString().str());
84 EXPECT_EQ("foobar", ss2->GetString().str());
85}
86
87namespace {
88 struct FlushTestStream : public Stream {
89 unsigned m_flush_count = false;
90 void Flush() override {
91 ++m_flush_count;
92 }
93 size_t Write(const void *src, size_t src_len) override { return src_len; }
94 };
95}
96
97TEST(StreamTeeTest, Flush) {
98 // Check that Flush is distributed to all streams.
99 auto fs1 = new FlushTestStream();
100 auto fs2 = new FlushTestStream();
101 lldb::StreamSP s1(fs1);
102 lldb::StreamSP s2(fs2);
103 StreamTee tee(s1, s2);
104
105 tee << "foo";
106 tee.Flush();
107
108 ASSERT_EQ(2U, tee.GetNumStreams());
109 EXPECT_EQ(1U, fs1->m_flush_count);
110 EXPECT_EQ(1U, fs2->m_flush_count);
111
112 tee << "bar";
113 tee.Flush();
114 EXPECT_EQ(2U, fs1->m_flush_count);
115 EXPECT_EQ(2U, fs2->m_flush_count);
116}
117
118TEST(StreamTeeTest, AppendStream) {
119 // Append new streams to our StreamTee.
120 auto ss1 = new StreamString();
121 auto ss2 = new StreamString();
122 lldb::StreamSP s1(ss1);
123 lldb::StreamSP s2(ss2);
124
125 StreamTee tee;
126
127 ASSERT_EQ(0U, tee.GetNumStreams());
128
129 tee.AppendStream(s1);
130 ASSERT_EQ(1U, tee.GetNumStreams());
131 EXPECT_EQ(s1, tee.GetStreamAtIndex(0U));
132
133 tee.AppendStream(s2);
134 ASSERT_EQ(2U, tee.GetNumStreams());
135 EXPECT_EQ(s1, tee.GetStreamAtIndex(0U));
136 EXPECT_EQ(s2, tee.GetStreamAtIndex(1U));
137}
138
139TEST(StreamTeeTest, GetStreamAtIndexOutOfBounds) {
140 // The index we check for is not in the bounds of the StreamTee.
141 lldb::StreamSP s1(std::make_shared<StreamString>());
142 StreamTee tee(s1);
143
144 ASSERT_EQ(1U, tee.GetNumStreams());
145 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1));
146}
147
148TEST(StreamTeeTest, GetStreamAtIndexOutOfBoundsEmpty) {
149 // Same as above, but with an empty StreamTee.
150 StreamTee tee;
151 ASSERT_EQ(0U, tee.GetNumStreams());
152 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(0U));
153 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1U));
154}
155
156TEST(StreamTeeTest, SetStreamAtIndexOverwrite) {
157 // We overwrite an existing stream at a given index.
158 lldb::StreamSP s1(std::make_shared<StreamString>());
159 StreamTee tee(s1);
160
161 ASSERT_EQ(1U, tee.GetNumStreams());
162 EXPECT_EQ(s1, tee.GetStreamAtIndex(0U));
163 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1U));
164
165 lldb::StreamSP s2(std::make_shared<StreamString>());
166 tee.SetStreamAtIndex(0U, s2);
167 EXPECT_EQ(1U, tee.GetNumStreams());
168 EXPECT_EQ(s2, tee.GetStreamAtIndex(0U));
169 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1));
170}
171
172TEST(StreamTeeTest, SetStreamAtIndexOutOfBounds) {
173 // We place a new stream out of the bounds of the current StreamTee.
174 lldb::StreamSP s1(std::make_shared<StreamString>());
175 StreamTee tee(s1);
176
177 ASSERT_EQ(1U, tee.GetNumStreams());
178 EXPECT_EQ(s1, tee.GetStreamAtIndex(0U));
179 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1U));
180
181 // Place a new stream out of bounds of the current array. The StreamTee should
182 // resize itself until it can contain this index.
183 lldb::StreamSP s2(std::make_shared<StreamString>());
184 tee.SetStreamAtIndex(4U, s2);
185 // Check that the vector has been resized.
186 EXPECT_EQ(5U, tee.GetNumStreams());
187 // Is our stream at the right place?
188 EXPECT_EQ(s2, tee.GetStreamAtIndex(4U));
189
190 // Existing stream should still be there.
191 EXPECT_EQ(s1, tee.GetStreamAtIndex(0U));
192 // Other elements are all invalid StreamSPs.
193 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(1U));
194 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(2U));
195 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(3U));
196 EXPECT_EQ(lldb::StreamSP(), tee.GetStreamAtIndex(5U));
197}