// Copyright 2018 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 "platform/impl/scoped_pipe.h" #include #include "gmock/gmock.h" #include "gtest/gtest.h" #include "util/osp_logging.h" namespace openscreen { namespace { using ::testing::ElementsAre; std::vector* g_freed_values = nullptr; struct IntTraits { using PipeType = int; static constexpr int kInvalidValue = -1; static void Close(int fd) { g_freed_values->push_back(fd); } }; constexpr int IntTraits::kInvalidValue; class ScopedPipeTest : public ::testing::Test { protected: void SetUp() override { OSP_DCHECK(!g_freed_values); g_freed_values = new std::vector(); } void TearDown() override { delete g_freed_values; g_freed_values = nullptr; } }; } // namespace TEST_F(ScopedPipeTest, Close) { { ScopedPipe x; } ASSERT_TRUE(g_freed_values->empty()); { ScopedPipe x(3); } EXPECT_THAT(*g_freed_values, ElementsAre(3)); g_freed_values->clear(); { ScopedPipe x(3); EXPECT_EQ(3, x.release()); ScopedPipe y; EXPECT_EQ(IntTraits::kInvalidValue, y.release()); } ASSERT_TRUE(g_freed_values->empty()); { ScopedPipe x(3); ScopedPipe y(std::move(x)); EXPECT_EQ(IntTraits::kInvalidValue, x.get()); EXPECT_EQ(3, y.get()); EXPECT_TRUE(g_freed_values->empty()); } EXPECT_THAT(*g_freed_values, ElementsAre(3)); g_freed_values->clear(); { ScopedPipe x(3); ScopedPipe y(4); y = std::move(x); EXPECT_EQ(IntTraits::kInvalidValue, x.get()); EXPECT_EQ(3, y.get()); EXPECT_EQ(1u, g_freed_values->size()); EXPECT_EQ(4, g_freed_values->front()); } EXPECT_THAT(*g_freed_values, ElementsAre(4, 3)); g_freed_values->clear(); } TEST_F(ScopedPipeTest, Comparisons) { std::vector g_freed_values; ScopedPipe x; ScopedPipe y; EXPECT_FALSE(x); EXPECT_EQ(x, y); x = ScopedPipe(3); EXPECT_TRUE(x); EXPECT_NE(x, y); y = ScopedPipe(4); EXPECT_TRUE(y); EXPECT_NE(x, y); y = ScopedPipe(3); EXPECT_EQ(x, y); } } // namespace openscreen