Home | History | Annotate | Download | only in unit
      1 /*
      2  * Copyright 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <errno.h>
     18 #include <sys/stat.h>
     19 #include <unistd.h>
     20 
     21 #include <string>
     22 
     23 #include <android-base/test_utils.h>
     24 #include <gtest/gtest.h>
     25 #include <otautil/DirUtil.h>
     26 
     27 TEST(DirUtilTest, create_invalid) {
     28   // Requesting to create an empty dir is invalid.
     29   ASSERT_EQ(-1, mkdir_recursively("", 0755, false, nullptr));
     30   ASSERT_EQ(ENOENT, errno);
     31 
     32   // Requesting to strip the name with no slash present.
     33   ASSERT_EQ(-1, mkdir_recursively("abc", 0755, true, nullptr));
     34   ASSERT_EQ(ENOENT, errno);
     35 
     36   // Creating a dir that already exists.
     37   TemporaryDir td;
     38   ASSERT_EQ(0, mkdir_recursively(td.path, 0755, false, nullptr));
     39 
     40   // "///" is a valid dir.
     41   ASSERT_EQ(0, mkdir_recursively("///", 0755, false, nullptr));
     42 
     43   // Request to create a dir, but a file with the same name already exists.
     44   TemporaryFile tf;
     45   ASSERT_EQ(-1, mkdir_recursively(tf.path, 0755, false, nullptr));
     46   ASSERT_EQ(ENOTDIR, errno);
     47 }
     48 
     49 TEST(DirUtilTest, create_smoke) {
     50   TemporaryDir td;
     51   std::string prefix(td.path);
     52   std::string path = prefix + "/a/b";
     53   constexpr mode_t mode = 0755;
     54   ASSERT_EQ(0, mkdir_recursively(path, mode, false, nullptr));
     55 
     56   // Verify.
     57   struct stat sb;
     58   ASSERT_EQ(0, stat(path.c_str(), &sb)) << strerror(errno);
     59   ASSERT_TRUE(S_ISDIR(sb.st_mode));
     60   constexpr mode_t mask = S_IRWXU | S_IRWXG | S_IRWXO;
     61   ASSERT_EQ(mode, sb.st_mode & mask);
     62 
     63   // Clean up.
     64   ASSERT_EQ(0, rmdir((prefix + "/a/b").c_str()));
     65   ASSERT_EQ(0, rmdir((prefix + "/a").c_str()));
     66 }
     67 
     68 TEST(DirUtilTest, create_strip_filename) {
     69   TemporaryDir td;
     70   std::string prefix(td.path);
     71   std::string path = prefix + "/a/b";
     72   ASSERT_EQ(0, mkdir_recursively(path, 0755, true, nullptr));
     73 
     74   // Verify that "../a" exists but not "../a/b".
     75   struct stat sb;
     76   ASSERT_EQ(0, stat((prefix + "/a").c_str(), &sb)) << strerror(errno);
     77   ASSERT_TRUE(S_ISDIR(sb.st_mode));
     78 
     79   ASSERT_EQ(-1, stat(path.c_str(), &sb));
     80   ASSERT_EQ(ENOENT, errno);
     81 
     82   // Clean up.
     83   ASSERT_EQ(0, rmdir((prefix + "/a").c_str()));
     84 }
     85 
     86 TEST(DirUtilTest, create_mode) {
     87   TemporaryDir td;
     88   std::string prefix(td.path);
     89   std::string path = prefix + "/a/b";
     90   constexpr mode_t mode = 0751;
     91   ASSERT_EQ(0, mkdir_recursively(path, mode, false, nullptr));
     92 
     93   // Verify the mode for "../a/b".
     94   struct stat sb;
     95   ASSERT_EQ(0, stat(path.c_str(), &sb)) << strerror(errno);
     96   ASSERT_TRUE(S_ISDIR(sb.st_mode));
     97   constexpr mode_t mask = S_IRWXU | S_IRWXG | S_IRWXO;
     98   ASSERT_EQ(mode, sb.st_mode & mask);
     99 
    100   // Verify the mode for "../a".
    101   ASSERT_EQ(0, stat((prefix + "/a").c_str(), &sb)) << strerror(errno);
    102   ASSERT_TRUE(S_ISDIR(sb.st_mode));
    103   ASSERT_EQ(mode, sb.st_mode & mask);
    104 
    105   // Clean up.
    106   ASSERT_EQ(0, rmdir((prefix + "/a/b").c_str()));
    107   ASSERT_EQ(0, rmdir((prefix + "/a").c_str()));
    108 }
    109