15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/dir_reader_posix.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/os_compat_android.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(DirReaderPosixUnittest, Read) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const unsigned kNumFiles = 100; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DirReaderPosix::IsFallback()) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char kDirTemplate[] = "/tmp/org.chromium.dir-reader-posix-XXXXXX"; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* dir = mkdtemp(kDirTemplate); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(dir); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int prev_wd = open(".", O_RDONLY | O_DIRECTORY); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(prev_wd, 0); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PCHECK(chdir(dir) == 0); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < kNumFiles; i++) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[16]; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(buf, sizeof(buf), "%d", i); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int fd = open(buf, O_CREAT | O_RDONLY | O_EXCL, 0600); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PCHECK(fd >= 0); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PCHECK(close(fd) == 0); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<unsigned> seen; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DirReaderPosix reader(dir); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader.IsValid()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!reader.IsValid()) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool seen_dot = false, seen_dotdot = false; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; reader.Next(); ) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(reader.name(), ".") == 0) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seen_dot = true; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (strcmp(reader.name(), "..") == 0) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seen_dotdot = true; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(testing::Message() << "reader.name(): " << reader.name()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *endptr; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned long value = strtoul(reader.name(), &endptr, 10); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(*endptr); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(value, kNumFiles); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, seen.count(value)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) seen.insert(value); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < kNumFiles; i++) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char buf[16]; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf(buf, sizeof(buf), "%d", i); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PCHECK(unlink(buf) == 0); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PCHECK(rmdir(dir) == 0); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PCHECK(fchdir(prev_wd) == 0); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PCHECK(close(prev_wd) == 0); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(seen_dot); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(seen_dotdot); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kNumFiles, seen.size()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 93