197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// Copyright 2014 The Android Open Source Project 297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// 397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// This software is licensed under the terms of the GNU General Public 497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// License version 2, as published by the Free Software Foundation, and 597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// may be copied, distributed, and modified under those terms. 697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// 797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// This program is distributed in the hope that it will be useful, 897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// but WITHOUT ANY WARRANTY; without even the implied warranty of 997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// GNU General Public License for more details. 1197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 1297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner#include "android/base/files/ScopedFd.h" 1397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 1497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner#include <unistd.h> 1597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner#include <fcntl.h> 1697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 1797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner#include <gtest/gtest.h> 1897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 1997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnernamespace android { 2097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnernamespace base { 2197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 2297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnernamespace { 2397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 2497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// The path of a file that can always be opened for reading on any platform. 2597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner#ifdef _WIN32 2697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnerstatic const char kNullFile[] = "NUL"; 2797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner#else 2897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnerstatic const char kNullFile[] = "/dev/null"; 2997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner#endif 3097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 3197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnerint OpenNull() { 3297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner return ::open(kNullFile, O_RDONLY); 3397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} 3497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 3597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} // namespace 3697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 3797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedFd, DefaultConstructor) { 3897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner ScopedFd f; 3997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_FALSE(f.valid()); 4097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_EQ(-1, f.get()); 4197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} 4297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 4397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedFd, Constructor) { 4497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner ScopedFd f(OpenNull()); 4597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_TRUE(f.valid()); 4697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} 4797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 4897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedFd, Release) { 4997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner ScopedFd f(OpenNull()); 5097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_TRUE(f.valid()); 5197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner int fd = f.release(); 5297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_FALSE(f.valid()); 5397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_NE(-1, fd); 5497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner ::close(fd); 5597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} 5697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 5797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedFd, Close) { 5897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner ScopedFd f(OpenNull()); 5997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_TRUE(f.valid()); 6097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner f.close(); 6197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_FALSE(f.valid()); 6297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} 6397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 6497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedFd, Swap) { 6597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner ScopedFd f1; 6697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner ScopedFd f2(OpenNull()); 6797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_FALSE(f1.valid()); 6897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_TRUE(f2.valid()); 6997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner f1.swap(&f2); 7097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_FALSE(f2.valid()); 7197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner EXPECT_TRUE(f1.valid()); 7297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} 7397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 7497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner 7597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} // namespace base 7697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner} // namespace android 77