1 #include "remote_logging_tests.hpp"
2
3 #include <fstream>
4 #include <string>
5
6 namespace phosphor
7 {
8
9 namespace rsyslog_config::internal
10 {
11 extern std::optional<
12 std::tuple<std::string, uint32_t, NetworkClient::TransportProtocol>>
13 parseConfig(std::istream& ss);
14 }
15
16 namespace logging
17 {
18 namespace test
19 {
20
getConfig(const char * filePath)21 std::string getConfig(const char* filePath)
22 {
23 std::fstream stream(filePath, std::fstream::in);
24 std::string line;
25 std::getline(stream, line);
26 return line;
27 }
28
TEST_F(TestRemoteLogging,testOnlyAddress)29 TEST_F(TestRemoteLogging, testOnlyAddress)
30 {
31 config->address("1.1.1.1");
32 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* /dev/null");
33 }
34
TEST_F(TestRemoteLogging,testOnlyPort)35 TEST_F(TestRemoteLogging, testOnlyPort)
36 {
37 config->port(100);
38 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* /dev/null");
39 }
40
TEST_F(TestRemoteLogging,testGoodConfig)41 TEST_F(TestRemoteLogging, testGoodConfig)
42 {
43 config->address("1.1.1.1");
44 config->port(100);
45 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* @@1.1.1.1:100");
46 }
47
TEST_F(TestRemoteLogging,testClearAddress)48 TEST_F(TestRemoteLogging, testClearAddress)
49 {
50 config->address("1.1.1.1");
51 config->port(100);
52 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* @@1.1.1.1:100");
53 config->address("");
54 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* /dev/null");
55 }
56
TEST_F(TestRemoteLogging,testClearPort)57 TEST_F(TestRemoteLogging, testClearPort)
58 {
59 config->address("1.1.1.1");
60 config->port(100);
61 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* @@1.1.1.1:100");
62 config->port(0);
63 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* /dev/null");
64 }
65
TEST_F(TestRemoteLogging,testGoodIPv6Config)66 TEST_F(TestRemoteLogging, testGoodIPv6Config)
67 {
68 config->address("abcd:ef01::01");
69 config->port(50000);
70 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* @@[abcd:ef01::01]:50000");
71 }
72
TEST_F(TestRemoteLogging,parseConfigGoodIpv6)73 TEST_F(TestRemoteLogging, parseConfigGoodIpv6)
74 {
75 // A good case
76 std::string str = "*.* @@[abcd:ef01::01]:50000";
77 std::stringstream ss(str);
78 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
79 EXPECT_TRUE(ret);
80 EXPECT_EQ(std::get<0>(*ret), "abcd:ef01::01");
81 EXPECT_EQ(std::get<1>(*ret), 50000);
82 }
83
TEST_F(TestRemoteLogging,parseConfigBadIpv6WithoutRightBracket)84 TEST_F(TestRemoteLogging, parseConfigBadIpv6WithoutRightBracket)
85 {
86 // Bad case: without ]
87 std::string str = "*.* @@[abcd:ef01::01:50000";
88 std::stringstream ss(str);
89 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
90 EXPECT_FALSE(ret);
91 }
92
TEST_F(TestRemoteLogging,parseConfigBadIpv6WithoutLeftBracket)93 TEST_F(TestRemoteLogging, parseConfigBadIpv6WithoutLeftBracket)
94 {
95 // Bad case: without [
96 std::string str = "*.* @@abcd:ef01::01]:50000";
97 std::stringstream ss(str);
98 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
99 EXPECT_FALSE(ret);
100 }
101
TEST_F(TestRemoteLogging,parseConfigBadIpv6WithoutPort)102 TEST_F(TestRemoteLogging, parseConfigBadIpv6WithoutPort)
103 {
104 // Bad case: without port
105 std::string str = "*.* @@[abcd:ef01::01]:";
106 std::stringstream ss(str);
107 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
108 EXPECT_FALSE(ret);
109 }
110
TEST_F(TestRemoteLogging,parseConfigBadIpv6InvalidPort)111 TEST_F(TestRemoteLogging, parseConfigBadIpv6InvalidPort)
112 {
113 // Bad case: without port
114 std::string str = "*.* @@[abcd:ef01::01]:xxx";
115 std::stringstream ss(str);
116 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
117 EXPECT_FALSE(ret);
118 }
119
TEST_F(TestRemoteLogging,parseConfigBadIpv6WihtoutColon)120 TEST_F(TestRemoteLogging, parseConfigBadIpv6WihtoutColon)
121 {
122 // Bad case: invalid IPv6 address
123 std::string str = "*.* @@[abcd:ef01::01]";
124 std::stringstream ss(str);
125 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
126 EXPECT_FALSE(ret);
127 }
128
TEST_F(TestRemoteLogging,parseConfigBadEmpty)129 TEST_F(TestRemoteLogging, parseConfigBadEmpty)
130 {
131 // Bad case: invalid IPv6 address
132 std::string str = "";
133 std::stringstream ss(str);
134 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
135 EXPECT_FALSE(ret);
136 }
137
TEST_F(TestRemoteLogging,parseConfigTCP)138 TEST_F(TestRemoteLogging, parseConfigTCP)
139 {
140 // A good case
141 std::string str = "*.* @@[abcd:ef01::01]:50000";
142 std::stringstream ss(str);
143 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
144 EXPECT_TRUE(ret);
145 EXPECT_EQ(std::get<2>(*ret),
146 phosphor::rsyslog_config::NetworkClient::TransportProtocol::TCP);
147 }
148
TEST_F(TestRemoteLogging,parseConfigUdp)149 TEST_F(TestRemoteLogging, parseConfigUdp)
150 {
151 // A good case
152 std::string str = "*.* @[abcd:ef01::01]:50000";
153 std::stringstream ss(str);
154 auto ret = phosphor::rsyslog_config::internal::parseConfig(ss);
155 EXPECT_TRUE(ret);
156 EXPECT_EQ(std::get<2>(*ret),
157 phosphor::rsyslog_config::NetworkClient::TransportProtocol::UDP);
158 }
159
TEST_F(TestRemoteLogging,createUdpConfig)160 TEST_F(TestRemoteLogging, createUdpConfig)
161 {
162 // A good case
163 config->address("abcd:ef01::01");
164 config->port(50000);
165 config->transportProtocol(
166 phosphor::rsyslog_config::NetworkClient::TransportProtocol::UDP);
167 EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* @[abcd:ef01::01]:50000");
168 }
169
170 } // namespace test
171 } // namespace logging
172 } // namespace phosphor
173