]>
Commit | Line | Data |
---|---|---|
7379f3de ZJS |
1 | /*** |
2 | SPDX-License-Identifier: LGPL-2.1+ | |
7379f3de ZJS |
3 | ***/ |
4 | ||
5 | #include "fd-util.h" | |
6 | #include "fileio.h" | |
7 | #include "log.h" | |
8 | #include "macro.h" | |
9 | #include "network-internal.h" | |
10 | #include "networkd-manager.h" | |
11 | #include "string-util.h" | |
6d7c4033 | 12 | #include "tests.h" |
e4de7287 | 13 | #include "tmpfile-util.h" |
7379f3de ZJS |
14 | |
15 | static void test_rule_serialization(const char *title, const char *ruleset, const char *expected) { | |
16 | char pattern[] = "/tmp/systemd-test-routing-policy-rule.XXXXXX", | |
17 | pattern2[] = "/tmp/systemd-test-routing-policy-rule.XXXXXX", | |
18 | pattern3[] = "/tmp/systemd-test-routing-policy-rule.XXXXXX"; | |
19 | const char *cmd; | |
20 | int fd, fd2, fd3; | |
21 | _cleanup_fclose_ FILE *f = NULL, *f2 = NULL, *f3 = NULL; | |
b921fcb2 | 22 | Set *rules = NULL; |
7379f3de ZJS |
23 | _cleanup_free_ char *buf = NULL; |
24 | size_t buf_size; | |
25 | ||
26 | log_info("========== %s ==========", title); | |
27 | log_info("put:\n%s\n", ruleset); | |
28 | ||
14899e2b ZJS |
29 | fd = mkostemp_safe(pattern); |
30 | assert_se(fd >= 0); | |
e92aaed3 | 31 | assert_se(f = fdopen(fd, "a+")); |
7379f3de ZJS |
32 | assert_se(write_string_stream(f, ruleset, 0) == 0); |
33 | ||
34 | assert_se(routing_policy_load_rules(pattern, &rules) == 0); | |
35 | ||
14899e2b ZJS |
36 | fd2 = mkostemp_safe(pattern2); |
37 | assert_se(fd2 >= 0); | |
e92aaed3 | 38 | assert_se(f2 = fdopen(fd2, "a+")); |
7379f3de ZJS |
39 | |
40 | assert_se(routing_policy_serialize_rules(rules, f2) == 0); | |
41 | assert_se(fflush_and_check(f2) == 0); | |
42 | ||
43 | assert_se(read_full_file(pattern2, &buf, &buf_size) == 0); | |
44 | ||
45 | log_info("got:\n%s", buf); | |
46 | ||
14899e2b ZJS |
47 | fd3 = mkostemp_safe(pattern3); |
48 | assert_se(fd3 >= 0); | |
e92aaed3 | 49 | assert_se(f3 = fdopen(fd3, "w")); |
7379f3de ZJS |
50 | assert_se(write_string_stream(f3, expected ?: ruleset, 0) == 0); |
51 | ||
52 | cmd = strjoina("diff -u ", pattern3, " ", pattern2); | |
53 | log_info("$ %s", cmd); | |
54 | assert_se(system(cmd) == 0); | |
b921fcb2 | 55 | |
8eec0b9d | 56 | set_free(rules); |
7379f3de ZJS |
57 | } |
58 | ||
59 | int main(int argc, char **argv) { | |
60 | _cleanup_free_ char *p = NULL; | |
61 | ||
6d7c4033 | 62 | test_setup_logging(LOG_DEBUG); |
7379f3de ZJS |
63 | |
64 | test_rule_serialization("basic parsing", | |
ec863cdc | 65 | "RULE=from=1.2.3.4/32 to=2.3.4.5/32 family=AF_INET tos=5 priority=0 fwmark=1/2 table=10", NULL); |
7379f3de ZJS |
66 | |
67 | test_rule_serialization("ignored values", | |
68 | "RULE=something=to=ignore from=1.2.3.4/32 from=1.2.3.4/32" | |
69 | " \t to=2.3.4.5/24 to=2.3.4.5/32 tos=5 fwmark=2 fwmark=1 table=10 table=20", | |
70 | "RULE=from=1.2.3.4/32" | |
ec863cdc | 71 | " to=2.3.4.5/32 family=AF_INET tos=5 priority=0 fwmark=1/0 table=20"); |
7379f3de ZJS |
72 | |
73 | test_rule_serialization("ipv6", | |
ec863cdc | 74 | "RULE=from=1::2/64 to=2::3/64 family=AF_INET6 priority=0 table=6", NULL); |
7379f3de | 75 | |
ec863cdc | 76 | assert_se(asprintf(&p, "RULE=from=1::2/64 to=2::3/64 family=AF_INET6 priority=0 table=%d", RT_TABLE_MAIN) >= 0); |
7379f3de ZJS |
77 | test_rule_serialization("default table", |
78 | "RULE=from=1::2/64 to=2::3/64", p); | |
79 | ||
9491f55f ZJS |
80 | test_rule_serialization("incoming interface", |
81 | "RULE=from=1::2/64 to=2::3/64 table=1 iif=lo", | |
ec863cdc | 82 | "RULE=from=1::2/64 to=2::3/64 family=AF_INET6 priority=0 iif=lo table=1"); |
9491f55f ZJS |
83 | |
84 | test_rule_serialization("outgoing interface", | |
ec863cdc | 85 | "RULE=from=1::2/64 to=2::3/64 family=AF_INET6 priority=0 oif=eth0 table=1", NULL); |
9491f55f | 86 | |
93f9da6e | 87 | test_rule_serialization("freeing interface names", |
43e08c78 | 88 | "RULE=from=1::2/64 to=2::3/64 family=AF_INET6 iif=e0 iif=e1 oif=e0 oif=e1 table=1", |
ec863cdc | 89 | "RULE=from=1::2/64 to=2::3/64 family=AF_INET6 priority=0 iif=e1 oif=e1 table=1"); |
93f9da6e | 90 | |
7379f3de ZJS |
91 | return 0; |
92 | } |