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