| // Copyright 2019 The Fuchsia 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 "src/developer/debug/zxdb/console/async_output_buffer.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include "src/developer/debug/zxdb/common/err.h" |
| |
| namespace zxdb { |
| |
| TEST(AsyncOutputBuffer, Empty) { |
| auto buf = fxl::MakeRefCounted<AsyncOutputBuffer>(); |
| EXPECT_FALSE(buf->is_complete()); |
| |
| buf->Complete(); |
| EXPECT_TRUE(buf->is_complete()); |
| |
| auto flat = buf->DestructiveFlatten(); |
| EXPECT_TRUE(flat.empty()); |
| } |
| |
| TEST(AsyncOutputBuffer, OneLevel) { |
| auto buf = fxl::MakeRefCounted<AsyncOutputBuffer>(); |
| |
| buf->Append("One "); |
| buf->Complete("Two"); |
| EXPECT_TRUE(buf->is_complete()); |
| EXPECT_EQ("One Two", buf->DestructiveFlatten().AsString()); |
| } |
| |
| TEST(AsyncOutputBuffer, Sync) { |
| auto level1 = fxl::MakeRefCounted<AsyncOutputBuffer>(); |
| |
| level1->Append("[1 "); |
| |
| // Level 2 is appended before being marked complete. |
| auto level2 = fxl::MakeRefCounted<AsyncOutputBuffer>(); |
| level1->Append(level2); |
| level2->Append("[2 "); |
| |
| // Level 3 is complete before being appended. |
| auto level3 = fxl::MakeRefCounted<AsyncOutputBuffer>(); |
| level3->Complete("[3]]"); |
| EXPECT_TRUE(level3->is_complete()); |
| |
| EXPECT_FALSE(level2->is_complete()); |
| level2->Complete(level3); |
| EXPECT_TRUE(level2->is_complete()); |
| |
| EXPECT_FALSE(level1->is_complete()); |
| level1->Complete(OutputBuffer("]")); |
| EXPECT_TRUE(level1->is_complete()); |
| |
| auto flat = level1->DestructiveFlatten(); |
| EXPECT_EQ("[1 [2 [3]]]", flat.AsString()); |
| } |
| |
| TEST(AsyncOutputBuffer, Async) { |
| auto level1 = fxl::MakeRefCounted<AsyncOutputBuffer>(); |
| |
| bool level1_complete = false; |
| level1->SetCompletionCallback([&level1, &level1_complete]() { |
| EXPECT_TRUE(level1->is_complete()); |
| level1_complete = true; |
| }); |
| |
| level1->Append("[1 "); |
| |
| // Level 2 is appended before being marked complete. |
| auto level2 = fxl::MakeRefCounted<AsyncOutputBuffer>(); |
| level1->Append(level2); |
| level1->Complete(OutputBuffer("]")); |
| level2->Append("[2 "); |
| |
| // Level 3 is complete before being appended. |
| auto level3 = fxl::MakeRefCounted<AsyncOutputBuffer>(); |
| level3->Complete("[3]]"); |
| EXPECT_TRUE(level3->is_complete()); |
| |
| // Level 1 callback should not have been issued yet. |
| EXPECT_FALSE(level1_complete); |
| |
| EXPECT_FALSE(level2->is_complete()); |
| level2->Complete(level3); |
| EXPECT_TRUE(level2->is_complete()); |
| |
| // Level 1 callback should have been issued. |
| EXPECT_TRUE(level1_complete); |
| EXPECT_TRUE(level1->is_complete()); |
| |
| auto flat = level1->DestructiveFlatten(); |
| EXPECT_EQ("[1 [2 [3]]]", flat.AsString()); |
| } |
| |
| } // namespace zxdb |