Move unique_fd fdsan tests into bionic.
EXPECT_DEATH requires special handling to work with fdsan, because of
our fork detection. Instead of duplicating the EXPECT_FDSAN_DEATH macro
in the libbase tests as well, move the unique_fd fdsan tests here.
Test: bionic_unit_tests
Change-Id: Ia7b65d4560601d5a78d143aced887a6773b401c0
diff --git a/tests/fdsan_test.cpp b/tests/fdsan_test.cpp
index a57e7c7..fb3f73d 100644
--- a/tests/fdsan_test.cpp
+++ b/tests/fdsan_test.cpp
@@ -24,12 +24,14 @@
#include <stdlib.h>
#include <sys/types.h>
-#include <unordered_map>
-
#if defined(__BIONIC__)
#include <android/fdsan.h>
#endif
+#include <unordered_map>
+
+#include <android-base/unique_fd.h>
+
#define FDSAN_TEST(test_name) TEST_F(FdsanTest, test_name)
#define EXPECT_FDSAN_DEATH(expression, regex) \
EXPECT_DEATH((android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_FATAL), expression), \
@@ -158,3 +160,35 @@
"0x1");
#endif
}
+
+TEST_F(FdsanTest, unique_fd_unowned_close) {
+#if defined(__BIONIC__)
+ android::base::unique_fd fd(open("/dev/null", O_RDONLY));
+ android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_FATAL);
+ EXPECT_FDSAN_DEATH(close(fd.get()), "expected to be unowned, actually owned by unique_fd");
+#endif
+}
+
+TEST_F(FdsanTest, unique_fd_untag_on_release) {
+ android::base::unique_fd fd(open("/dev/null", O_RDONLY));
+ close(fd.release());
+}
+
+TEST_F(FdsanTest, unique_fd_move) {
+ android::base::unique_fd fd(open("/dev/null", O_RDONLY));
+ android::base::unique_fd fd_moved = std::move(fd);
+ ASSERT_EQ(-1, fd.get());
+ ASSERT_GT(fd_moved.get(), -1);
+}
+
+TEST_F(FdsanTest, unique_fd_unowned_close_after_move) {
+#if defined(__BIONIC__)
+ android::base::unique_fd fd(open("/dev/null", O_RDONLY));
+ android::base::unique_fd fd_moved = std::move(fd);
+ ASSERT_EQ(-1, fd.get());
+ ASSERT_GT(fd_moved.get(), -1);
+
+ android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_FATAL);
+ EXPECT_FDSAN_DEATH(close(fd_moved.get()), "expected to be unowned, actually owned by unique_fd");
+#endif
+}