1d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle/* 2d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * Copyright (C) 2014 The Android Open Source Project 3d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * 4d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * Licensed under the Apache License, Version 2.0 (the "License"); 5d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * you may not use this file except in compliance with the License. 6d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * You may obtain a copy of the License at 7d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * 8d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * http://www.apache.org/licenses/LICENSE-2.0 9d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * 10d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * Unless required by applicable law or agreed to in writing, software 11d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * distributed under the License is distributed on an "AS IS" BASIS, 12d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * See the License for the specific language governing permissions and 14d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle * limitations under the License. 15d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle */ 16d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 17d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle#include <gtest/gtest.h> 18d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle#include "TemporaryFile.h" 19d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 20d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle#include <ftw.h> 21d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle#include <stdlib.h> 22d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle#include <sys/stat.h> 23d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 24d4934a70e69365c97b1378820152e134a0089b5eCalin Juravlevoid sanity_check_ftw(const char* fpath, const struct stat* sb, int tflag) { 25d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle ASSERT_TRUE(fpath != NULL); 26d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle ASSERT_TRUE(sb != NULL); 27d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle bool is_dir = S_ISDIR(sb->st_mode); 28d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle ASSERT_TRUE((is_dir && tflag == FTW_D) || (!is_dir && tflag == FTW_F)); 29d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 30d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 31d4934a70e69365c97b1378820152e134a0089b5eCalin Juravlevoid sanity_check_nftw( 32d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle const char* fpath, const struct stat* sb, int tflag, struct FTW* ftwbuf) { 33d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle sanity_check_ftw(fpath, sb, tflag); 34d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle // either the parent dir or the file 35d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle bool is_dir = S_ISDIR(sb->st_mode); 36d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle ASSERT_TRUE( 37d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle (is_dir && ftwbuf->level == 0) || (!is_dir && ftwbuf->level == 1)); 38d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 39d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 40d4934a70e69365c97b1378820152e134a0089b5eCalin Juravleint check_ftw(const char* fpath, const struct stat* sb, int tflag) { 41d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle sanity_check_ftw(fpath, sb, tflag); 42d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle return 0; 43d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 44d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 45d4934a70e69365c97b1378820152e134a0089b5eCalin Juravleint check_ftw64(const char* fpath, const struct stat64* sb, int tflag) { 46d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle sanity_check_ftw(fpath, reinterpret_cast<const struct stat*>(sb), tflag); 47d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle return 0; 48d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 49d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 50d4934a70e69365c97b1378820152e134a0089b5eCalin Juravleint check_nftw( 51d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle const char* fpath, const struct stat* sb, int tflag, struct FTW* ftwbuf) { 52d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle sanity_check_nftw(fpath, sb, tflag, ftwbuf); 53d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle return 0; 54d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 55d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 56d4934a70e69365c97b1378820152e134a0089b5eCalin Juravleint check_nftw64( 57d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle const char* fpath, const struct stat64* sb, int tflag, struct FTW* ftwbuf) { 58d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle sanity_check_nftw(fpath, reinterpret_cast<const struct stat*>(sb), 59d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle tflag, ftwbuf); 60d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle return 0; 61d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 62d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 63d4934a70e69365c97b1378820152e134a0089b5eCalin JuravleTEST(ftw, ftw) { 64d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle TemporaryDir td; 65d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle TemporaryFile tf(td.dirname); 66d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle ftw(td.dirname, check_ftw, 1); 67d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 68d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 69d4934a70e69365c97b1378820152e134a0089b5eCalin JuravleTEST(ftw, ftw64) { 70d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle TemporaryDir td; 71d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle GenericTemporaryFile<mkstemp64> tf(td.dirname); 72d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle ftw64(td.dirname, check_ftw64, 1); 73d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 74d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 75d4934a70e69365c97b1378820152e134a0089b5eCalin JuravleTEST(ftw, nftw) { 76d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle TemporaryDir td; 77d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle TemporaryFile tf(td.dirname); 78d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle nftw(td.dirname, check_nftw, 1, 0); 79d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 80d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle 81d4934a70e69365c97b1378820152e134a0089b5eCalin JuravleTEST(ftw, nftw64) { 82d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle TemporaryDir td; 83d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle GenericTemporaryFile<mkstemp64> tf(td.dirname); 84d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle nftw64(td.dirname, check_nftw64, 1, 0); 85d4934a70e69365c97b1378820152e134a0089b5eCalin Juravle} 86