7fb4c0766e858653c9776474005a6ae6d94828afgryzor/*
7fb4c0766e858653c9776474005a6ae6d94828afgryzor * Authors:
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd * Jakub Hrozek <jhrozek@redhat.com>
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd *
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd * Copyright (C) 2008 Red Hat
7fb4c0766e858653c9776474005a6ae6d94828afgryzor * see file 'COPYING' for use and warranty information
7fb4c0766e858653c9776474005a6ae6d94828afgryzor *
7fb4c0766e858653c9776474005a6ae6d94828afgryzor * This program is free software; you can redistribute it and/or
7fb4c0766e858653c9776474005a6ae6d94828afgryzor * modify it under the terms of the GNU General Public License as
96ad5d81ee4a2cc66a4ae19893efc8aa6d06fae7jailletc * published by the Free Software Foundation; version 3 or (at
7fb4c0766e858653c9776474005a6ae6d94828afgryzor * your option) any later version.
7fb4c0766e858653c9776474005a6ae6d94828afgryzor *
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * This program is distributed in the hope that it will be useful,
2e545ce2450a9953665f701bb05350f0d3f26275nd * but WITHOUT ANY WARRANTY; without even the implied warranty of
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * GNU General Public License for more details.
7fb4c0766e858653c9776474005a6ae6d94828afgryzor *
7fb4c0766e858653c9776474005a6ae6d94828afgryzor * You should have received a copy of the GNU General Public License
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen * along with this program; if not, write to the Free Software
3f08db06526d6901aa08c110b5bc7dde6bc39905nd * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
7fb4c0766e858653c9776474005a6ae6d94828afgryzor */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include <stdlib.h>
3f08db06526d6901aa08c110b5bc7dde6bc39905nd#include <check.h>
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include <unistd.h>
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include <sys/types.h>
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung#include <sys/stat.h>
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include <fcntl.h>
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include <limits.h>
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include <errno.h>
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include <talloc.h>
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include <popt.h>
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#include "config.h"
4bebf996eb7002ebfe897d46a0e0572390604a77nd#include "tools/tools_util.h"
4bebf996eb7002ebfe897d46a0e0572390604a77nd#include "util/util.h"
4bebf996eb7002ebfe897d46a0e0572390604a77nd#include "tests/common.h"
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor#define TESTS_PATH "tp_" BASE_FILE_STEM
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic char tpl_dir[] = "file-tests-dir-XXXXXX";
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic char *dir_path;
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic char *dst_path;
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic uid_t uid;
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic gid_t gid;
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic TALLOC_CTX *test_ctx = NULL;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic void setup_files_test(void)
7fb4c0766e858653c9776474005a6ae6d94828afgryzor{
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create a temporary directory that we fill with stuff later on */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor test_ctx = talloc_new(NULL);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor mkdir(TESTS_PATH, 0700);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor dir_path = mkdtemp(talloc_asprintf(test_ctx, "%s/%s", TESTS_PATH, tpl_dir));
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh dst_path = mkdtemp(talloc_asprintf(test_ctx, "%s/%s", TESTS_PATH, tpl_dir));
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor uid = getuid();
7fb4c0766e858653c9776474005a6ae6d94828afgryzor gid = getgid();
7fb4c0766e858653c9776474005a6ae6d94828afgryzor}
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic void teardown_files_test(void)
7fb4c0766e858653c9776474005a6ae6d94828afgryzor{
7fb4c0766e858653c9776474005a6ae6d94828afgryzor char *cmd = NULL;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor int ret;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* OK this is crude but since the functions to remove tree are under test.. */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor if (dir_path && test_ctx) {
7fb4c0766e858653c9776474005a6ae6d94828afgryzor cmd = talloc_asprintf(test_ctx, "/bin/rm -rf %s\n", dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = system(cmd);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor if (ret == -1) {
7fb4c0766e858653c9776474005a6ae6d94828afgryzor DEBUG(SSSDBG_CRIT_FAILURE, "Removing [%s] failed.\n", dir_path);
4bebf996eb7002ebfe897d46a0e0572390604a77nd }
4bebf996eb7002ebfe897d46a0e0572390604a77nd }
4bebf996eb7002ebfe897d46a0e0572390604a77nd if (dst_path && test_ctx) {
7fb4c0766e858653c9776474005a6ae6d94828afgryzor cmd = talloc_asprintf(test_ctx, "/bin/rm -rf %s\n", dst_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = system(cmd);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor if (ret == -1) {
7fb4c0766e858653c9776474005a6ae6d94828afgryzor DEBUG(SSSDBG_CRIT_FAILURE, "Removing [%s] failed.\n", dst_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor }
7fb4c0766e858653c9776474005a6ae6d94828afgryzor }
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor rmdir(TESTS_PATH);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* clean up */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor talloc_zfree(test_ctx);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor}
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzorstatic int create_simple_file(const char *name, const char *content)
7fb4c0766e858653c9776474005a6ae6d94828afgryzor{
7fb4c0766e858653c9776474005a6ae6d94828afgryzor int fd;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ssize_t size;
4bebf996eb7002ebfe897d46a0e0572390604a77nd int ret;
4bebf996eb7002ebfe897d46a0e0572390604a77nd
4bebf996eb7002ebfe897d46a0e0572390604a77nd fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0700);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(fd == -1, "Cannot create simple file\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor size = write(fd, "abc", 3);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(size == -1, "Cannot write to file\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = fsync(fd);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot sync file\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = close(fd);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot close file\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor return ret;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor}
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzorSTART_TEST(test_remove_tree)
7fb4c0766e858653c9776474005a6ae6d94828afgryzor{
7fb4c0766e858653c9776474005a6ae6d94828afgryzor int ret;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor char origpath[PATH_MAX+1];
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor errno = 0;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(getcwd(origpath, PATH_MAX) == origpath, "Cannot getcwd\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(errno == 0, "Cannot getcwd\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor DEBUG(SSSDBG_FUNC_DATA, "About to delete %s\n", dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create a file */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir(dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir1\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = create_simple_file("bar", "bar");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create file1\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create a subdir and file inside it */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = mkdir("subdir", 0700);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create subdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir("subdir");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = create_simple_file("foo", "foo");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create file\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create another subdir, empty this time */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = mkdir("subdir2", 0700);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create subdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir(origpath);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir2\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* go back */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir(origpath);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* and finally wipe it out.. */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = remove_tree(dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(ret == EOK, "remove_tree failed\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* check if really gone */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = access(dir_path, F_OK);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(ret == -1, "directory still there after remove_tree\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor}
7fb4c0766e858653c9776474005a6ae6d94828afgryzorEND_TEST
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzorSTART_TEST(test_remove_subtree)
7fb4c0766e858653c9776474005a6ae6d94828afgryzor{
7fb4c0766e858653c9776474005a6ae6d94828afgryzor int ret;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor char origpath[PATH_MAX+1];
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor errno = 0;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(getcwd(origpath, PATH_MAX) == origpath, "Cannot getcwd\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(errno == 0, "Cannot getcwd\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor DEBUG(SSSDBG_FUNC_DATA, "About to delete %s\n", dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create a file */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir(dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir1\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = create_simple_file("bar", "bar");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create file1\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create a subdir and file inside it */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = mkdir("subdir", 0700);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create subdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir("subdir");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = create_simple_file("foo", "foo");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create file\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create another subdir, empty this time */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = mkdir("subdir2", 0700);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create subdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir(origpath);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir2\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* go back */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir(origpath);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* and finally wipe it out.. */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = remove_subtree(dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(ret == EOK, "remove_subtree failed\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* check if really gone */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = access(dir_path, F_OK);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(ret == 0, "directory was deleted\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = rmdir(dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(ret == 0, "unable to delete root directory\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor}
7fb4c0766e858653c9776474005a6ae6d94828afgryzorEND_TEST
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzorSTART_TEST(test_simple_copy)
7fb4c0766e858653c9776474005a6ae6d94828afgryzor{
7fb4c0766e858653c9776474005a6ae6d94828afgryzor int ret;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor char origpath[PATH_MAX+1];
7fb4c0766e858653c9776474005a6ae6d94828afgryzor char *tmp;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor int fd = -1;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor errno = 0;
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(getcwd(origpath, PATH_MAX) == origpath, "Cannot getcwd\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_unless(errno == 0, "Cannot getcwd\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create a file */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir(dir_path);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir1\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = create_simple_file("bar", "bar");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create file1\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor /* create a subdir and file inside it */
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = mkdir("subdir", 0700);
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot create subdir\n");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
7fb4c0766e858653c9776474005a6ae6d94828afgryzor ret = chdir("subdir");
7fb4c0766e858653c9776474005a6ae6d94828afgryzor fail_if(ret == -1, "Cannot chdir\n");
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung
727872d18412fc021f03969b8641810d8896820bhumbedooh ret = create_simple_file("foo", "foo");
0d0ba3a410038e179b695446bb149cce6264e0abnd fail_if(ret == -1, "Cannot create file\n");
727872d18412fc021f03969b8641810d8896820bhumbedooh
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh /* go back */
0d0ba3a410038e179b695446bb149cce6264e0abnd ret = chdir(origpath);
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh fail_if(ret == -1, "Cannot chdir\n");
727872d18412fc021f03969b8641810d8896820bhumbedooh
0d0ba3a410038e179b695446bb149cce6264e0abnd /* and finally copy.. */
0d0ba3a410038e179b695446bb149cce6264e0abnd DEBUG(SSSDBG_FUNC_DATA,
0d0ba3a410038e179b695446bb149cce6264e0abnd "Will copy from '%s' to '%s'\n", dir_path, dst_path);
ac082aefa89416cbdc9a1836eaf3bed9698201c8humbedooh ret = copy_tree(dir_path, dst_path, 0700, uid, gid);
0d0ba3a410038e179b695446bb149cce6264e0abnd fail_unless(ret == EOK, "copy_tree failed\n");
0d0ba3a410038e179b695446bb149cce6264e0abnd
0d0ba3a410038e179b695446bb149cce6264e0abnd /* check if really copied */
727872d18412fc021f03969b8641810d8896820bhumbedooh ret = access(dst_path, F_OK);
0d0ba3a410038e179b695446bb149cce6264e0abnd fail_unless(ret == 0, "destination directory not there\n");
0d0ba3a410038e179b695446bb149cce6264e0abnd
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh tmp = talloc_asprintf(test_ctx, "%s/bar", dst_path);
205f749042ed530040a4f0080dbcb47ceae8a374rjung ret = check_and_open_readonly(tmp, &fd, uid, gid, S_IFREG|S_IRWXU, 0);
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen fail_unless(ret == EOK, "Cannot open %s\n", tmp);
0d0ba3a410038e179b695446bb149cce6264e0abnd close(fd);
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd talloc_free(tmp);
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd}
7fec19672a491661b2fe4b29f685bc7f4efa64d4ndEND_TEST
7fb4c0766e858653c9776474005a6ae6d94828afgryzor
START_TEST(test_copy_file)
{
TALLOC_CTX *tmp_ctx = talloc_new(test_ctx);
int ret;
char origpath[PATH_MAX+1];
char *foo_path;
char *bar_path;
int fd = -1;
errno = 0;
fail_unless(getcwd(origpath, PATH_MAX) == origpath, "Cannot getcwd\n");
fail_unless(errno == 0, "Cannot getcwd\n");
/* create a file */
ret = chdir(dir_path);
fail_if(ret == -1, "Cannot chdir1\n");
ret = create_simple_file("foo", "foo");
fail_if(ret == -1, "Cannot create foo\n");
foo_path = talloc_asprintf(tmp_ctx, "%s/foo", dir_path);
bar_path = talloc_asprintf(tmp_ctx, "%s/bar", dst_path);
/* create a file */
ret = chdir(origpath);
fail_if(ret == -1, "Cannot chdir1\n");
/* Copy this file to a new file */
DEBUG(SSSDBG_FUNC_DATA,
"Will copy from 'foo' to 'bar'\n");
ret = copy_file_secure(foo_path, bar_path, 0700, uid, gid, 0);
fail_unless(ret == EOK, "copy_file_secure failed\n");
/* check if really copied */
ret = access(bar_path, F_OK);
fail_unless(ret == 0, "destination file 'bar' not there\n");
ret = check_and_open_readonly(bar_path, &fd, uid, gid, S_IFREG|S_IRWXU, 0);
fail_unless(ret == EOK, "Cannot open %s\n", bar_path);
close(fd);
talloc_free(tmp_ctx);
}
END_TEST
START_TEST(test_copy_symlink)
{
int ret;
char origpath[PATH_MAX+1];
char *tmp;
struct stat statbuf;
errno = 0;
fail_unless(getcwd(origpath, PATH_MAX) == origpath, "Cannot getcwd\n");
fail_unless(errno == 0, "Cannot getcwd\n");
/* create a subdir */
ret = chdir(dir_path);
fail_if(ret == -1, "Cannot chdir\n");
ret = create_simple_file("footarget", "foo");
fail_if(ret == -1, "Cannot create file\n");
ret = symlink("footarget", "foolink");
fail_if(ret == -1, "Cannot create symlink\n");
/* go back */
ret = chdir(origpath);
fail_if(ret == -1, "Cannot chdir\n");
/* and finally copy.. */
DEBUG(SSSDBG_FUNC_DATA,
"Will copy from '%s' to '%s'\n", dir_path, dst_path);
ret = copy_tree(dir_path, dst_path, 0700, uid, gid);
fail_unless(ret == EOK, "copy_tree failed\n");
/* check if really copied */
ret = access(dst_path, F_OK);
fail_unless(ret == 0, "destination directory not there\n");
tmp = talloc_asprintf(test_ctx, "%s/foolink", dst_path);
ret = lstat(tmp, &statbuf);
fail_unless(ret == 0, "cannot stat the symlink %s\n", tmp);
fail_unless(S_ISLNK(statbuf.st_mode), "%s not a symlink?\n", tmp);
talloc_free(tmp);
}
END_TEST
START_TEST(test_copy_node)
{
int ret;
char origpath[PATH_MAX+1];
char *tmp;
errno = 0;
fail_unless(getcwd(origpath, PATH_MAX) == origpath, "Cannot getcwd\n");
fail_unless(errno == 0, "Cannot getcwd\n");
/* create a node */
ret = chdir(dir_path);
fail_if(ret == -1, "Cannot chdir\n");
ret = mknod("testnode", S_IFIFO | S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, 0);
fail_unless(ret == 0, "cannot stat /dev/null: %s", strerror(errno));
/* go back */
ret = chdir(origpath);
fail_if(ret == -1, "Cannot chdir\n");
/* and finally copy.. */
DEBUG(SSSDBG_FUNC_DATA,
"Will copy from '%s' to '%s'\n", dir_path, dst_path);
ret = copy_tree(dir_path, dst_path, 0700, uid, gid);
fail_unless(ret == EOK, "copy_tree failed\n");
/* check if really copied and without special files */
ret = access(dst_path, F_OK);
fail_unless(ret == 0, "destination directory not there\n");
tmp = talloc_asprintf(test_ctx, "%s/testnode", dst_path);
ret = access(tmp, F_OK);
fail_unless(ret == -1, "special file %s exists, it shouldn't\n", tmp);
talloc_free(tmp);
}
END_TEST
static Suite *files_suite(void)
{
Suite *s = suite_create("files_suite");
TCase *tc_files = tcase_create("files");
tcase_add_checked_fixture(tc_files,
setup_files_test,
teardown_files_test);
tcase_add_test(tc_files, test_remove_tree);
tcase_add_test(tc_files, test_remove_subtree);
tcase_add_test(tc_files, test_simple_copy);
tcase_add_test(tc_files, test_copy_file);
tcase_add_test(tc_files, test_copy_symlink);
tcase_add_test(tc_files, test_copy_node);
suite_add_tcase(s, tc_files);
return s;
}
int main(int argc, const char *argv[])
{
int number_failed;
int opt;
poptContext pc;
int debug = 0;
struct poptOption long_options[] = {
POPT_AUTOHELP
{ "debug-level", 'd', POPT_ARG_INT, &debug, 0, "Set debug level", NULL },
POPT_TABLEEND
};
/* Set debug level to invalid value so we can deside if -d 0 was used. */
debug_level = SSSDBG_INVALID;
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options, 0);
while((opt = poptGetNextOpt(pc)) != -1) {
fprintf(stderr, "\nInvalid option %s: %s\n\n",
poptBadOption(pc, 0), poptStrerror(opt));
poptPrintUsage(pc, stderr, 0);
return 1;
}
poptFreeContext(pc);
DEBUG_CLI_INIT(debug);
tests_set_cwd();
Suite *s = files_suite();
SRunner *sr = srunner_create(s);
/* If CK_VERBOSITY is set, use that, otherwise it defaults to CK_NORMAL */
srunner_run_all(sr, CK_ENV);
number_failed = srunner_ntests_failed(sr);
srunner_free(sr);
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}