X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=tests%2Funit%2Ftest_fd_tracker.c;h=345eaf25604352b11e442c200ed2a4cea0f24228;hb=a0377dfefe40662ba7d68617bce6ff467114136c;hp=99b0dae2c3268c60d454e0b8a5f394f9d9b679a2;hpb=f7c3ffd79ddcece895eb0de616001d549aced5fc;p=lttng-tools.git diff --git a/tests/unit/test_fd_tracker.c b/tests/unit/test_fd_tracker.c index 99b0dae2c..345eaf256 100644 --- a/tests/unit/test_fd_tracker.c +++ b/tests/unit/test_fd_tracker.c @@ -1,31 +1,19 @@ /* - * Copyright (c) - 2018 Jérémie Galarneau + * Copyright (C) 2018 Jérémie Galarneau * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by as - * published by the Free Software Foundation; only version 2 of the License. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include -#include #include #include #include #include #include #include -#include #include #include #include @@ -34,6 +22,7 @@ #include #include +#include #include #include @@ -50,6 +39,13 @@ int lttng_opt_mi; #define TMP_DIR_PATTERN "/tmp/fd-tracker-XXXXXX" #define TEST_UNLINK_DIRECTORY_NAME "unlinked_files" +#ifdef __linux__ +#define SELF_FD_DIR "/proc/self/fd" +#else +/* Most Unices have /dev/fd */ +#define SELF_FD_DIR "/dev/fd" +#endif + /* * Count of fds, beyond stdin, stderr, stdout that were open * at the launch of the test. This allows the test to succeed when @@ -64,6 +60,7 @@ const char file_contents[] = "Bacon ipsum dolor amet jerky drumstick sirloin " "Landjaeger tri-tip salami leberkas ball tip, ham hock chuck sausage " "flank jerky cupim. Pig bacon chuck pancetta andouille."; +static void get_temporary_directories(char **_test_directory, char **_unlink_directory) { int ret; @@ -74,28 +71,29 @@ void get_temporary_directories(char **_test_directory, char **_unlink_directory) if (!output_dir) { diag("Failed to create temporary path of the form %s", TMP_DIR_PATTERN); - assert(0); + abort(); } *_test_directory = strdup(output_dir); - assert(*_test_directory); + LTTNG_ASSERT(*_test_directory); ret = asprintf(_unlink_directory, "%s/%s", output_dir, TEST_UNLINK_DIRECTORY_NAME); if (ret < 0) { - assert(0); + abort(); } } +static int fd_count(void) { DIR *dir; struct dirent *entry; - int count = 0; + int count = 0; - dir = opendir("/proc/self/fd"); + dir = opendir(SELF_FD_DIR); if (!dir) { - perror("# Failed to enumerate /proc/self/fd/ to count the number of used file descriptors"); - count = -1; + perror("# Failed to enumerate " SELF_FD_DIR " to count the number of used file descriptors"); + count = -1; goto end; } @@ -103,12 +101,12 @@ int fd_count(void) if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) { continue; } - count++; + count++; } /* Don't account for the file descriptor opened by opendir(). */ - count--; + count--; if (closedir(dir)) { - perror("# Failed to close test program's self/fd directory file descriptor"); + perror("# Failed to close test program's " SELF_FD_DIR " directory file descriptor"); } end: return count; @@ -117,9 +115,9 @@ end: static void check_fd_count(int expected_count) { - int count = 0; + int count = 0; - count = fd_count(); + count = fd_count(); ok(count == expected_count, "Expected %d open file descriptors (%d are open)", expected_count, count); } @@ -127,7 +125,7 @@ void check_fd_count(int expected_count) static int noop_open(void *data, int *fds) { - *fds = *((int *) data); + *fds = *((int *) data); return 0; } @@ -141,7 +139,7 @@ static void track_std_fds(struct fd_tracker *tracker) { int i; - struct { int fd; const char *name; } files[] = { + struct { int fd; const char *name; } files[] = { { .fd = fileno(stdin), .name = "stdin" }, { .fd = fileno(stdout), .name = "stdout" }, { .fd = fileno(stderr), .name = "stderr" }, @@ -152,7 +150,7 @@ void track_std_fds(struct fd_tracker *tracker) ret = fd_tracker_open_unsuspendable_fd(tracker, &out_fd, &files[i].name, 1, noop_open, &files[i].fd); - assert(out_fd == files[i].fd); + LTTNG_ASSERT(out_fd == files[i].fd); ok(ret == 0, "Track unsuspendable fd %d (%s)", files[i].fd, files[i].name); @@ -163,7 +161,7 @@ static void untrack_std_fds(struct fd_tracker *tracker) { int i; - struct { int fd; const char *name; } files[] = { + struct { int fd; const char *name; } files[] = { { .fd = fileno(stdin), .name = "stdin" }, { .fd = fileno(stdout), .name = "stdout" }, { .fd = fileno(stderr), .name = "stderr" }, @@ -193,11 +191,11 @@ void test_unsuspendable_basic(void) get_temporary_directories(&test_directory, &unlinked_files_directory); - tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); + tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); ok(tracker, "Created an fd tracker with a limit of %d simulateously opened file descriptors", TRACKER_FD_LIMIT); if (!tracker) { - return; + goto end; } track_std_fds(tracker); @@ -206,6 +204,7 @@ void test_unsuspendable_basic(void) fd_tracker_destroy(tracker); ret = rmdir(test_directory); ok(ret == 0, "Test directory is empty"); +end: free(test_directory); free(unlinked_files_directory); } @@ -236,8 +235,8 @@ void test_unsuspendable_cb_return(void) get_temporary_directories(&test_directory, &unlinked_files_directory); - tracker = fd_tracker_create(test_directory, TRACKER_FD_LIMIT); - assert(tracker); + tracker = fd_tracker_create(test_directory, TRACKER_FD_LIMIT); + LTTNG_ASSERT(tracker); /* The error_open callback should fail and return 'expected_error'. */ ret = fd_tracker_open_unsuspendable_fd(tracker, &out_fd, @@ -252,14 +251,14 @@ void test_unsuspendable_cb_return(void) ret = fd_tracker_open_unsuspendable_fd(tracker, &out_fd, NULL, 1, noop_open, &stdout_fd); ok(out_fd == stdout_fd, "fd_tracker_open_unsuspendable_fd() sets the output fd parameter to the newly-tracked fd's value"); - assert(!ret); + LTTNG_ASSERT(!ret); ret = fd_tracker_close_unsuspendable_fd(tracker, &stdout_fd, 1, error_close, &expected_error); ok(ret == expected_error, "fd_tracker_close_unsuspendable_fd() forwards the user callback's error code"); ret = fd_tracker_close_unsuspendable_fd(tracker, &stdout_fd, 1, noop_close, &expected_error); - assert(!ret); + LTTNG_ASSERT(!ret); fd_tracker_destroy(tracker); ret = rmdir(test_directory); @@ -281,19 +280,19 @@ void test_unsuspendable_duplicate(void) get_temporary_directories(&test_directory, &unlinked_files_directory); - tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); - assert(tracker); + tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); + LTTNG_ASSERT(tracker); ret = fd_tracker_open_unsuspendable_fd(tracker, &out_fd, NULL, 1, noop_open, &stdout_fd); - assert(!ret); + LTTNG_ASSERT(!ret); ret = fd_tracker_open_unsuspendable_fd(tracker, &out_fd, NULL, 1, noop_open, &stdout_fd); ok(ret == -EEXIST, "EEXIST reported on open of an already tracked file descriptor"); ret = fd_tracker_close_unsuspendable_fd(tracker, &stdout_fd, 1, noop_close, NULL); - assert(!ret); + LTTNG_ASSERT(!ret); fd_tracker_destroy(tracker); ret = rmdir(test_directory); @@ -336,7 +335,7 @@ int close_pipes(void *data, int *fds) /* * Validate that the tracker enforces the open file descriptor limit - * when unsuspendable file descritptors are being opened. + * when unsuspendable file descriptors are being opened. */ static void test_unsuspendable_limit(void) @@ -349,14 +348,14 @@ void test_unsuspendable_limit(void) get_temporary_directories(&test_directory, &unlinked_files_directory); /* This test assumes TRACKER_FD_LIMIT is a multiple of 2. */ - assert((TRACKER_FD_LIMIT % 2 == 0) && TRACKER_FD_LIMIT); + LTTNG_ASSERT((TRACKER_FD_LIMIT % 2 == 0) && TRACKER_FD_LIMIT); - tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); - assert(tracker); + tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); + LTTNG_ASSERT(tracker); ret = fd_tracker_open_unsuspendable_fd(tracker, fds, NULL, TRACKER_FD_LIMIT, open_pipes, NULL); - ok(ret == 0, "File descriptor tracker allowed the user to meet its limit with unsuspendable file descritptors (%d)", + ok(ret == 0, "File descriptor tracker allowed the user to meet its limit with unsuspendable file descriptors (%d)", TRACKER_FD_LIMIT); ret = fd_tracker_open_unsuspendable_fd(tracker, &out_fd, @@ -365,7 +364,7 @@ void test_unsuspendable_limit(void) ret = fd_tracker_close_unsuspendable_fd(tracker, fds, TRACKER_FD_LIMIT, close_pipes, NULL); - assert(!ret); + LTTNG_ASSERT(!ret); fd_tracker_destroy(tracker); ret = rmdir(test_directory); @@ -387,19 +386,21 @@ void test_unsuspendable_close_untracked(void) get_temporary_directories(&test_directory, &unlinked_files_directory); - tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); + tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); if (!tracker) { - return; + goto end;; } ret = pipe(unknown_fds); - assert(!ret); - assert(close(unknown_fds[0]) == 0); - assert(close(unknown_fds[1]) == 0); + LTTNG_ASSERT(!ret); + ret = close(unknown_fds[0]); + LTTNG_ASSERT(ret == 0); + ret = close(unknown_fds[1]); + LTTNG_ASSERT(ret == 0); ret = fd_tracker_open_unsuspendable_fd(tracker, &out_fd, NULL, 1, noop_open, &stdout_fd); - assert(!ret); + LTTNG_ASSERT(!ret); ret = fd_tracker_close_unsuspendable_fd(tracker, unknown_fds, 1, noop_close, NULL); @@ -407,11 +408,12 @@ void test_unsuspendable_close_untracked(void) ret = fd_tracker_close_unsuspendable_fd(tracker, &stdout_fd, 1, noop_close, NULL); - assert(!ret); + LTTNG_ASSERT(!ret); fd_tracker_destroy(tracker); ret = rmdir(test_directory); ok(ret == 0, "Test directory is empty"); +end: free(test_directory); free(unlinked_files_directory); } @@ -427,13 +429,13 @@ static int open_files(struct fd_tracker *tracker, for (i = 0; i < count; i++) { int p_ret; - char *file_path; + char *file_path; struct fs_handle *handle; mode_t mode = S_IWUSR | S_IRUSR; p_ret = asprintf(&file_path, "file-%u", i); - assert(p_ret >= 0); - file_paths[i] = file_path; + LTTNG_ASSERT(p_ret >= 0); + file_paths[i] = file_path; handle = fd_tracker_open_fs_handle(tracker, directory, file_path, O_RDWR | O_CREAT, &mode); @@ -488,7 +490,7 @@ int cleanup_files(struct fd_tracker *tracker, const char *dir, diag("Failed to unlink fs_handle to file %s", file_path); ret = -1; } - if (fs_handle_close(handles[i])) { + if (fs_handle_close(handles[i])) { diag("Failed to close fs_handle to file %s", file_path); ret = -1; } @@ -514,13 +516,13 @@ void test_suspendable_limit(void) get_temporary_directories(&test_directory, &unlinked_files_directory); - tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); + tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); if (!tracker) { - return; + goto end; } dir_handle = lttng_directory_handle_create(test_directory); - assert(dir_handle); + LTTNG_ASSERT(dir_handle); dir_handle_fd_count = !!lttng_directory_handle_uses_fd(dir_handle); ret = open_files(tracker, dir_handle, files_to_create, handles, @@ -537,6 +539,7 @@ void test_suspendable_limit(void) ok(ret == 0, "Test directory is empty"); fd_tracker_destroy(tracker); lttng_directory_handle_put(dir_handle); +end: free(test_directory); free(unlinked_files_directory); } @@ -560,11 +563,11 @@ void test_mixed_limit(void) tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); if (!tracker) { - return; + goto end; } dir_handle = lttng_directory_handle_create(test_directory); - assert(dir_handle); + LTTNG_ASSERT(dir_handle); dir_handle_fd_count = !!lttng_directory_handle_uses_fd(dir_handle); ret = open_files(tracker, dir_handle, files_to_create, handles, @@ -596,6 +599,7 @@ void test_mixed_limit(void) ok(ret == 0, "Test directory is empty"); fd_tracker_destroy(tracker); lttng_directory_handle_put(dir_handle); +end: free(test_directory); free(unlinked_files_directory); } @@ -630,13 +634,13 @@ void test_suspendable_restore(void) get_temporary_directories(&test_directory, &unlinked_files_directory); - tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); + tracker = fd_tracker_create(unlinked_files_directory, TRACKER_FD_LIMIT); if (!tracker) { - return; + goto end; } dir_handle = lttng_directory_handle_create(test_directory); - assert(dir_handle); + LTTNG_ASSERT(dir_handle); dir_handle_fd_count = !!lttng_directory_handle_uses_fd(dir_handle); ret = open_files(tracker, dir_handle, files_to_create, handles, @@ -656,8 +660,8 @@ void test_suspendable_restore(void) fd = fs_handle_get_fd(handle); if (fd < 0) { write_success = false; - diag("Failed to restore fs_handle to %s", - path); + diag("Failed to restore fs_handle to %s", + path); goto skip_write; } @@ -667,7 +671,7 @@ void test_suspendable_restore(void) if (ret != 1) { write_success = false; - PERROR("write() to %s failed", path); + PERROR("write() to %s failed", path); goto skip_write; } @@ -696,9 +700,9 @@ skip_write: fd = lttng_directory_handle_open_file( dir_handle, path, O_RDONLY, 0); - assert(fd >= 0); + LTTNG_ASSERT(fd >= 0); ret = fstat(fd, &fd_stat); - assert(!ret); + LTTNG_ASSERT(!ret); if (fd_stat.st_size != sizeof(file_contents)) { diag("Content size of file %s doesn't match, got %" PRId64 ", expected %zu", path, (int64_t) fd_stat.st_size, @@ -739,6 +743,7 @@ skip_write: ok(ret == 0, "Test directory is empty"); fd_tracker_destroy(tracker); lttng_directory_handle_put(dir_handle); +end: free(test_directory); free(unlinked_files_directory); } @@ -761,18 +766,18 @@ void test_unlink(void) get_temporary_directories(&test_directory, &unlinked_files_directory); ret = asprintf(&unlinked_file_zero, "%s/%u", unlinked_files_directory, 0); - assert(ret > 0); + LTTNG_ASSERT(ret > 0); ret = asprintf(&unlinked_file_one, "%s/%u", unlinked_files_directory, 1); - assert(ret > 0); + LTTNG_ASSERT(ret > 0); tracker = fd_tracker_create(unlinked_files_directory, 1); if (!tracker) { - return; + goto end; } dir_handle = lttng_directory_handle_create(test_directory); - assert(dir_handle); + LTTNG_ASSERT(dir_handle); /* Open two handles to the same file. */ ret = open_same_file(tracker, dir_handle, file_name, handles_to_open, @@ -780,7 +785,7 @@ void test_unlink(void) ok(!ret, "Successfully opened %i handles to %s/%s", handles_to_open, test_directory, file_name); if (ret) { - return; + goto end; } /* @@ -832,7 +837,7 @@ void test_unlink(void) ret = open_same_file(tracker, dir_handle, file_name, 1, &new_handle); ok(!ret, "Successfully opened a new handle to previously unlinked file %s/%s", test_directory, file_name); - assert(new_handle); + LTTNG_ASSERT(new_handle); /* * Unlinking the new handle should cause the file to be renamed @@ -869,6 +874,7 @@ void test_unlink(void) ret = rmdir(test_directory); ok(ret == 0, "Test directory is empty"); +end: fd_tracker_destroy(tracker); free(test_directory); free(unlinked_files_directory); @@ -885,7 +891,7 @@ int main(int argc, char **argv) rcu_register_thread(); unknown_fds_count = fd_count() - STDIO_FD_COUNT; - assert(unknown_fds_count >= 0); + LTTNG_ASSERT(unknown_fds_count >= 0); diag("Unsuspendable - basic"); test_unsuspendable_basic(); @@ -895,15 +901,15 @@ int main(int argc, char **argv) test_unsuspendable_duplicate(); diag("Unsuspendable - closing an untracked file descriptor"); test_unsuspendable_close_untracked(); - diag("Unsuspendable - check that file descritptor limit is enforced"); + diag("Unsuspendable - check that file descriptor limit is enforced"); test_unsuspendable_limit(); - diag("Suspendable - check that file descritptor limit is enforced"); + diag("Suspendable - check that file descriptor limit is enforced"); test_suspendable_limit(); diag("Suspendable - restoration test"); test_suspendable_restore(); - diag("Mixed - check that file descritptor limit is enforced"); + diag("Mixed - check that file descriptor limit is enforced"); test_mixed_limit(); diag("Suspendable - Unlinking test");