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