1 // Copyright 2021 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/files/scoped_file.h" 6 7 #include "base/files/file_util.h" 8 #include "base/files/scoped_temp_dir.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 11 namespace base { 12 namespace { 13 14 class ScopedFDOwnershipTrackingTest : public testing::Test { 15 public: SetUp()16 void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); } TearDown()17 void TearDown() override { ASSERT_TRUE(temp_dir_.Delete()); } 18 OpenFD()19 ScopedFD OpenFD() { 20 FilePath dont_care; 21 return CreateAndOpenFdForTemporaryFileInDir(temp_dir_.GetPath(), 22 &dont_care); 23 } 24 25 private: 26 ScopedTempDir temp_dir_; 27 }; 28 TEST_F(ScopedFDOwnershipTrackingTest,BasicTracking)29TEST_F(ScopedFDOwnershipTrackingTest, BasicTracking) { 30 ScopedFD fd = OpenFD(); 31 EXPECT_TRUE(IsFDOwned(fd.get())); 32 int fd_value = fd.get(); 33 fd.reset(); 34 EXPECT_FALSE(IsFDOwned(fd_value)); 35 } 36 37 #if defined(GTEST_HAS_DEATH_TEST) 38 TEST_F(ScopedFDOwnershipTrackingTest,NoDoubleOwnership)39TEST_F(ScopedFDOwnershipTrackingTest, NoDoubleOwnership) { 40 ScopedFD fd = OpenFD(); 41 subtle::EnableFDOwnershipEnforcement(true); 42 EXPECT_DEATH(ScopedFD(fd.get()), ""); 43 } 44 TEST_F(ScopedFDOwnershipTrackingTest,CrashOnUnownedClose)45TEST_F(ScopedFDOwnershipTrackingTest, CrashOnUnownedClose) { 46 ScopedFD fd = OpenFD(); 47 subtle::EnableFDOwnershipEnforcement(true); 48 EXPECT_DEATH(close(fd.get()), ""); 49 } 50 51 #endif // defined(GTEST_HAS_DEATH_TEST) 52 53 } // namespace 54 } // namespace base 55