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/ScopedHandle.h"
1397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
1497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner#include <gtest/gtest.h>
1597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
1697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnernamespace android {
1797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnernamespace base {
1897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
1997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnernamespace {
2097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
2197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner// The path of a file that can always be opened for reading on any platform.
2297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turnerstatic const char kNullFile[] = "NUL";
2397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
2497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerHANDLE OpenNull() {
2597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    return ::CreateFile(kNullFile,
2697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner                        GENERIC_READ,
2797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner                        FILE_SHARE_READ|FILE_SHARE_WRITE,
2897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner                        NULL,
2997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner                        OPEN_EXISTING,
3097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner                        FILE_ATTRIBUTE_NORMAL,
3197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner                        NULL);
3297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}
3397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
3497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}  // namespace
3597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
3697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedHandle, DefaultConstructor) {
3797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    ScopedHandle h;
3897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_FALSE(h.valid());
3997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_EQ(INVALID_HANDLE_VALUE, h.get());
4097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}
4197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
4297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedHandle, Constructor) {
4397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    ScopedHandle h(OpenNull());
4497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_TRUE(h.valid());
4597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}
4697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
4797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedHandle, Release) {
4897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    ScopedHandle h(OpenNull());
4997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_TRUE(h.valid());
5097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    HANDLE handle = h.release();
5197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_FALSE(h.valid());
5297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_NE(INVALID_HANDLE_VALUE, handle);
5397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    ::CloseHandle(handle);
5497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}
5597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
5697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedHandle, Close) {
5797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    ScopedHandle h(OpenNull());
5897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_TRUE(h.valid());
5997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    h.close();
6097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_FALSE(h.valid());
6197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}
6297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
6397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' TurnerTEST(ScopedHandle, Swap) {
6497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    ScopedHandle h1;
6597502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    ScopedHandle h2(OpenNull());
6697502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_FALSE(h1.valid());
6797502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_TRUE(h2.valid());
6897502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    h1.swap(&h2);
6997502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_FALSE(h2.valid());
7097502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner    EXPECT_TRUE(h1.valid());
7197502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}
7297502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner
7397502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}  // namespace base
7497502faffa2e99bf717749a2d249ba3e57d7da4dDavid 'Digit' Turner}  // namespace android
75