[libcxx-commits] [libcxx] d5fa8b1 - [libc++] Reimplement the dynamic filesystem helper without using Python

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Thu Apr 2 07:46:52 PDT 2020


Author: Louis Dionne
Date: 2020-04-02T10:46:34-04:00
New Revision: d5fa8b11205c53cd9a9692cb0d7f799400f8b0fd

URL: https://github.com/llvm/llvm-project/commit/d5fa8b11205c53cd9a9692cb0d7f799400f8b0fd
DIFF: https://github.com/llvm/llvm-project/commit/d5fa8b11205c53cd9a9692cb0d7f799400f8b0fd.diff

LOG: [libc++] Reimplement the dynamic filesystem helper without using Python

This patch reimplements the dynamic filesystem helper using Posix
functionality instead of relying on Python. The primary reason for
doing this is that it allows running the libc++ test suite on devices
that do not have Python.

Differential Revision: https://reviews.llvm.org/D77140

Added: 
    

Modified: 
    libcxx/test/CMakeLists.txt
    libcxx/test/std/input.output/filesystems/lit.local.cfg
    libcxx/test/support/filesystem_test_helper.h

Removed: 
    libcxx/test/support/filesystem_dynamic_test_helper.py


################################################################################
diff  --git a/libcxx/test/CMakeLists.txt b/libcxx/test/CMakeLists.txt
index 78a7b88c5db1..8681c4abb98f 100644
--- a/libcxx/test/CMakeLists.txt
+++ b/libcxx/test/CMakeLists.txt
@@ -142,9 +142,6 @@ if (LIBCXX_CONFIGURE_IDE)
   set(STATIC_ROOT ${LIBCXX_SOURCE_DIR}/test/std/input.output/filesystems/Inputs/static_test_env)
   add_definitions(-DLIBCXX_FILESYSTEM_STATIC_TEST_ROOT="${STATIC_ROOT}")
 
-  set(DYNAMIC_HELPER "python ${LIBCXX_SOURCE_DIR}/test/support/filesystem_dynamic_test_helper.py ")
-  add_definitions(-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER="${DYNAMIC_HELPER}")
-
   split_list(LIBCXX_COMPILE_FLAGS)
   split_list(LIBCXX_LINK_FLAGS)
 

diff  --git a/libcxx/test/std/input.output/filesystems/lit.local.cfg b/libcxx/test/std/input.output/filesystems/lit.local.cfg
index 00ec4c454d7d..d150d0bc6372 100644
--- a/libcxx/test/std/input.output/filesystems/lit.local.cfg
+++ b/libcxx/test/std/input.output/filesystems/lit.local.cfg
@@ -9,7 +9,3 @@ if 'c++filesystem-disabled' in config.available_features:
 
 inputs = os.path.join(os.path.dirname(__file__), 'Inputs', 'static_test_env')
 config.test_format.addCompileFlags(config, '-DLIBCXX_FILESYSTEM_STATIC_TEST_ROOT={}'.format(inputs))
-
-dynamic_helper = os.path.join(config.test_source_root, 'support', 'filesystem_dynamic_test_helper.py')
-assert os.path.isfile(dynamic_helper)
-config.test_format.addCompileFlags(config, '-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER="{} {}"'.format(sys.executable, dynamic_helper))

diff  --git a/libcxx/test/support/filesystem_dynamic_test_helper.py b/libcxx/test/support/filesystem_dynamic_test_helper.py
deleted file mode 100644
index c769ac8e079b..000000000000
--- a/libcxx/test/support/filesystem_dynamic_test_helper.py
+++ /dev/null
@@ -1,87 +0,0 @@
-import sys
-import os
-import socket
-import stat
-
-# Ensure that this is being run on a specific platform
-assert sys.platform.startswith('linux') or sys.platform.startswith('darwin') \
-    or sys.platform.startswith('cygwin') or sys.platform.startswith('freebsd') \
-    or sys.platform.startswith('netbsd')
-
-test_root = None
-
-# Make sure we don't try and write outside of the test root.
-# All paths used should be sanitized
-def sanitize(p):
-    assert os.path.isdir(test_root)
-    p = os.path.realpath(p)
-    if os.path.commonprefix([test_root, p]):
-        return p
-    assert False
-
-"""
-Some of the tests restrict permissions to induce failures.
-Before we delete the test environment, we have to walk it and re-raise the
-permissions.
-"""
-def clean_recursive(root_p):
-    if not os.path.islink(root_p):
-        os.chmod(root_p, 0o777)
-    for ent in os.listdir(root_p):
-        p = os.path.join(root_p, ent)
-        if os.path.islink(p) or not os.path.isdir(p):
-            os.remove(p)
-        else:
-            assert os.path.isdir(p)
-            clean_recursive(p)
-            os.rmdir(p)
-
-
-def init_test_directory(root_p):
-    root_p = os.path.realpath(root_p)
-    assert not os.path.exists(root_p)
-    os.makedirs(root_p)
-
-
-def destroy_test_directory(root_p):
-    root_p = sanitize(root_p)
-    clean_recursive(root_p)
-    os.rmdir(root_p)
-
-
-def create_file(fname, size):
-    with open(sanitize(fname), 'w') as f:
-        f.write('c' * size)
-
-
-def create_dir(dname):
-    os.mkdir(sanitize(dname))
-
-
-def create_symlink(source, link):
-    os.symlink(sanitize(source), sanitize(link))
-
-
-def create_hardlink(source, link):
-    os.link(sanitize(source), sanitize(link))
-
-
-def create_fifo(source):
-    os.mkfifo(sanitize(source))
-
-
-def create_socket(source):
-    sock = socket.socket(socket.AF_UNIX)
-    sanitized_source = sanitize(source)
-    # AF_UNIX sockets may have very limited path length, so split it
-    # into chdir call (with technically unlimited length) followed
-    # by bind() relative to the directory
-    os.chdir(os.path.dirname(sanitized_source))
-    sock.bind(os.path.basename(sanitized_source))
-
-
-if __name__ == '__main__':
-    test_root = os.path.realpath(sys.argv[1])
-    command = " ".join(sys.argv[2:])
-    eval(command)
-    sys.exit(0)

diff  --git a/libcxx/test/support/filesystem_test_helper.h b/libcxx/test/support/filesystem_test_helper.h
index ef66405d351d..92330969b296 100644
--- a/libcxx/test/support/filesystem_test_helper.h
+++ b/libcxx/test/support/filesystem_test_helper.h
@@ -18,6 +18,12 @@
 #include "rapid-cxx-test.h"
 #include "format_string.h"
 
+// For creating socket files
+#if !defined(__FreeBSD__) && !defined(__APPLE__)
+# include <sys/socket.h>
+# include <sys/un.h>
+#endif
+
 // static test helpers
 
 #ifndef LIBCXX_FILESYSTEM_STATIC_TEST_ROOT
@@ -103,11 +109,6 @@ static const fs::path RecDirFollowSymlinksIterationList[] = {
 
 #endif // LIBCXX_FILESYSTEM_STATIC_TEST_ROOT
 
-
-#ifndef LIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER
-#error LIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER must be defined
-#endif
-
 namespace random_utils {
 inline char to_hex(int ch) {
   return ch < 10 ? static_cast<char>('0' + ch)
@@ -124,9 +125,10 @@ inline char random_hex_char() {
 
 struct scoped_test_env
 {
-    scoped_test_env() : test_root(random_path())
-    {
-        fs_helper_run(fs_make_cmd("init_test_directory", test_root));
+    scoped_test_env() : test_root(random_path()) {
+        std::string cmd = "mkdir -p " + test_root.native();
+        int ret = std::system(cmd.c_str());
+        assert(ret == 0);
 
         // Ensure that the root_path is fully resolved, i.e. it contains no
         // symlinks. The filesystem tests depend on that. We do this after
@@ -135,8 +137,15 @@ struct scoped_test_env
         test_root = fs::canonical(test_root);
     }
 
-    ~scoped_test_env()
-        { fs_helper_run(fs_make_cmd("destroy_test_directory", test_root)); }
+    ~scoped_test_env() {
+        std::string cmd = "chmod -R 777 " + test_root.native();
+        int ret = std::system(cmd.c_str());
+        assert(ret == 0);
+
+        cmd = "rm -r " + test_root.native();
+        ret = std::system(cmd.c_str());
+        assert(ret == 0);
+    }
 
     scoped_test_env(scoped_test_env const &) = delete;
     scoped_test_env & operator=(scoped_test_env const &) = delete;
@@ -200,27 +209,35 @@ struct scoped_test_env
 
     std::string create_dir(std::string filename) {
         filename = sanitize_path(std::move(filename));
-        fs_helper_run(fs_make_cmd("create_dir", filename));
+        std::string cmd = "mkdir " + filename;
+        int ret = std::system(cmd.c_str());
+        assert(ret == 0);
         return filename;
     }
 
     std::string create_symlink(std::string source, std::string to) {
         source = sanitize_path(std::move(source));
         to = sanitize_path(std::move(to));
-        fs_helper_run(fs_make_cmd("create_symlink", source, to));
+        std::string cmd = "ln -s " + source + ' ' + to;
+        int ret = std::system(cmd.c_str());
+        assert(ret == 0);
         return to;
     }
 
     std::string create_hardlink(std::string source, std::string to) {
         source = sanitize_path(std::move(source));
         to = sanitize_path(std::move(to));
-        fs_helper_run(fs_make_cmd("create_hardlink", source, to));
+        std::string cmd = "ln " + source + ' ' + to;
+        int ret = std::system(cmd.c_str());
+        assert(ret == 0);
         return to;
     }
 
     std::string create_fifo(std::string file) {
         file = sanitize_path(std::move(file));
-        fs_helper_run(fs_make_cmd("create_fifo", file));
+        std::string cmd = "mkfifo " + file;
+        int ret = std::system(cmd.c_str());
+        assert(ret == 0);
         return file;
     }
 
@@ -229,7 +246,13 @@ struct scoped_test_env
 #if !defined(__FreeBSD__) && !defined(__APPLE__)
     std::string create_socket(std::string file) {
         file = sanitize_path(std::move(file));
-        fs_helper_run(fs_make_cmd("create_socket", file));
+
+        ::sockaddr_un address;
+        address.sun_family = AF_UNIX;
+        assert(file.size() <= sizeof(address.sun_path));
+        ::strncpy(address.sun_path, file.c_str(), sizeof(address.sun_path));
+        int fd = ::socket(AF_UNIX, SOCK_STREAM, 0);
+        ::bind(fd, reinterpret_cast<::sockaddr*>(&address), sizeof(address));
         return file;
     }
 #endif
@@ -253,34 +276,6 @@ struct scoped_test_env
         fs::path p = fs::path(tmp) / unique_path_suffix();
         return p;
     }
-
-    static inline std::string make_arg(std::string const& arg) {
-        return "'" + arg + "'";
-    }
-
-    static inline std::string make_arg(std::size_t arg) {
-        return std::to_string(arg);
-    }
-
-    template <class T>
-    static inline std::string
-    fs_make_cmd(std::string const& cmd_name, T const& arg) {
-        return cmd_name + "(" + make_arg(arg) + ")";
-    }
-
-    template <class T, class U>
-    static inline std::string
-    fs_make_cmd(std::string const& cmd_name, T const& arg1, U const& arg2) {
-        return cmd_name + "(" + make_arg(arg1) + ", " + make_arg(arg2) + ")";
-    }
-
-    void fs_helper_run(std::string const& raw_cmd) {
-        std::string cmd = LIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER;
-        cmd += " \"" + test_root.native() + "\"";
-        cmd += " \"" + raw_cmd + "\"";
-        int ret = std::system(cmd.c_str());
-        assert(ret == 0);
-    }
 };
 
 // Misc test types


        


More information about the libcxx-commits mailing list