| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| |
| #include "open-file.h" |
| #include "string-util.h" |
| #include "tests.h" |
| |
| TEST(open_file_parse) { |
| _cleanup_(open_file_freep) OpenFile *of = NULL; |
| int r; |
| |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:read-only", &of); |
| |
| assert_se(r >= 0); |
| assert_se(streq(of->path, "/proc/1/ns/mnt")); |
| assert_se(streq(of->fdname, "host-mount-namespace")); |
| assert_se(of->flags == OPENFILE_READ_ONLY); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt", &of); |
| |
| assert_se(r >= 0); |
| assert_se(streq(of->path, "/proc/1/ns/mnt")); |
| assert_se(streq(of->fdname, "mnt")); |
| assert_se(of->flags == 0); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace", &of); |
| |
| assert_se(r >= 0); |
| assert_se(streq(of->path, "/proc/1/ns/mnt")); |
| assert_se(streq(of->fdname, "host-mount-namespace")); |
| assert_se(of->flags == 0); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt::read-only", &of); |
| |
| assert_se(r >= 0); |
| assert_se(streq(of->path, "/proc/1/ns/mnt")); |
| assert_se(streq(of->fdname, "mnt")); |
| assert_se(of->flags == OPENFILE_READ_ONLY); |
| |
| of = open_file_free(of); |
| r = open_file_parse("../file.dat:file:read-only", &of); |
| |
| assert_se(r == -EINVAL); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:rw", &of); |
| |
| assert_se(r == -EINVAL); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:append", &of); |
| |
| assert_se(r >= 0); |
| assert_se(streq(of->path, "/proc/1/ns/mnt")); |
| assert_se(streq(of->fdname, "host-mount-namespace")); |
| assert_se(of->flags == OPENFILE_APPEND); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:truncate", &of); |
| |
| assert_se(r >= 0); |
| assert_se(streq(of->path, "/proc/1/ns/mnt")); |
| assert_se(streq(of->fdname, "host-mount-namespace")); |
| assert_se(of->flags == OPENFILE_TRUNCATE); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:read-only,append", &of); |
| |
| assert_se(r == -EINVAL); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:read-only,truncate", &of); |
| |
| assert_se(r == -EINVAL); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:append,truncate", &of); |
| |
| assert_se(r == -EINVAL); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:read-only,read-only", &of); |
| |
| assert_se(r == -EINVAL); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:graceful", &of); |
| |
| assert_se(r >= 0); |
| assert_se(streq(of->path, "/proc/1/ns/mnt")); |
| assert_se(streq(of->fdname, "host-mount-namespace")); |
| assert_se(of->flags == OPENFILE_GRACEFUL); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:read-only,graceful", &of); |
| |
| assert_se(r >= 0); |
| assert_se(streq(of->path, "/proc/1/ns/mnt")); |
| assert_se(streq(of->fdname, "host-mount-namespace")); |
| assert_se(of->flags == (OPENFILE_READ_ONLY | OPENFILE_GRACEFUL)); |
| |
| of = open_file_free(of); |
| r = open_file_parse("/proc/1/ns/mnt:host-mount-namespace:read-only:other", &of); |
| |
| assert_se(r == -EINVAL); |
| } |
| |
| TEST(open_file_to_string) { |
| _cleanup_free_ char *s = NULL; |
| _cleanup_(open_file_freep) OpenFile *of = NULL; |
| int r; |
| |
| assert_se(of = new (OpenFile, 1)); |
| *of = (OpenFile){ .path = strdup("/proc/1/ns/mnt"), |
| .fdname = strdup("host-mount-namespace"), |
| .flags = OPENFILE_READ_ONLY }; |
| |
| r = open_file_to_string(of, &s); |
| |
| assert_se(r >= 0); |
| assert_se(streq(s, "/proc/1/ns/mnt:host-mount-namespace:read-only")); |
| |
| s = mfree(s); |
| of->flags = OPENFILE_APPEND; |
| |
| r = open_file_to_string(of, &s); |
| |
| assert_se(r >= 0); |
| assert_se(streq(s, "/proc/1/ns/mnt:host-mount-namespace:append")); |
| |
| s = mfree(s); |
| of->flags = OPENFILE_TRUNCATE; |
| |
| r = open_file_to_string(of, &s); |
| |
| assert_se(r >= 0); |
| assert_se(streq(s, "/proc/1/ns/mnt:host-mount-namespace:truncate")); |
| |
| s = mfree(s); |
| of->flags = OPENFILE_GRACEFUL; |
| |
| r = open_file_to_string(of, &s); |
| |
| assert_se(r >= 0); |
| assert_se(streq(s, "/proc/1/ns/mnt:host-mount-namespace:graceful")); |
| |
| s = mfree(s); |
| of->flags = OPENFILE_READ_ONLY | OPENFILE_GRACEFUL; |
| |
| r = open_file_to_string(of, &s); |
| |
| assert_se(r >= 0); |
| assert_se(streq(s, "/proc/1/ns/mnt:host-mount-namespace:read-only,graceful")); |
| |
| s = mfree(s); |
| of->flags = 0; |
| |
| r = open_file_to_string(of, &s); |
| |
| assert_se(r >= 0); |
| assert_se(streq(s, "/proc/1/ns/mnt:host-mount-namespace")); |
| |
| s = mfree(s); |
| assert_se(free_and_strdup(&of->fdname, "mnt")); |
| of->flags = OPENFILE_READ_ONLY; |
| |
| r = open_file_to_string(of, &s); |
| |
| assert_se(r >= 0); |
| assert_se(streq(s, "/proc/1/ns/mnt::read-only")); |
| |
| s = mfree(s); |
| assert_se(free_and_strdup(&of->path, "/path:with:colon")); |
| assert_se(free_and_strdup(&of->fdname, "path:with:colon")); |
| of->flags = 0; |
| |
| r = open_file_to_string(of, &s); |
| |
| assert_se(r >= 0); |
| assert_se(streq(s, "/path\\:with\\:colon")); |
| } |
| |
| DEFINE_TEST_MAIN(LOG_INFO); |