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
+}