blob: 8f9a07cb00ba16975eb1dd32ea06a8bb2705a358 [file] [log] [blame]
Nagaraju Gorugantid514e5d2018-11-08 03:07:25 -06001#include "config.h"
2#include "phosphor-ldap-config/ldap_configuration.hpp"
3
4#include <experimental/filesystem>
5#include <phosphor-logging/log.hpp>
6#include <phosphor-logging/elog-errors.hpp>
7#include <sdbusplus/bus.hpp>
8#include <xyz/openbmc_project/Common/error.hpp>
9#include <sdbusplus/bus.hpp>
10#include <gmock/gmock.h>
11#include <gtest/gtest.h>
12#include <fstream>
13#include <string>
14#include <sys/types.h>
15
16namespace phosphor
17{
18namespace ldap
19{
20namespace fs = std::experimental::filesystem;
21namespace ldap_base = sdbusplus::xyz::openbmc_project::User::Ldap::server;
22using Config = phosphor::ldap::Config;
23
24class TestLDAPConfig : public testing::Test
25{
26 public:
27 TestLDAPConfig() : bus(sdbusplus::bus::new_default())
28 {
29 }
30 void SetUp() override
31 {
32 using namespace phosphor::ldap;
33 char tmpldap[] = "/tmp/ldap_test.XXXXXX";
34 dir = fs::path(mkdtemp(tmpldap));
35 fs::path tslCacertFilePath{TLS_CACERT_FILE};
36 tslCacertFile = tslCacertFilePath.filename().c_str();
37 fs::path confFilePath{LDAP_CONFIG_FILE};
38 ldapconfFile = confFilePath.filename().c_str();
39 std::fstream fs;
40 fs.open(dir / defaultNslcdFile, std::fstream::out);
41 fs.close();
42 fs.open(dir / nsSwitchFile, std::fstream::out);
43 fs.close();
44 fs.open(dir / LDAPNsSwitchFile, std::fstream::out);
45 fs.close();
46 fs.open(dir / linuxNsSwitchFile, std::fstream::out);
47 fs.close();
48 fs.open(dir / tslCacertFile, std::fstream::out);
49 fs.close();
50 }
51
52 void TearDown() override
53 {
54 fs::remove_all(dir);
55 }
56
57 protected:
58 fs::path dir;
59 std::string tslCacertFile;
60 std::string ldapconfFile;
61 sdbusplus::bus::bus bus;
62};
63
64class MockConfigMgr : public phosphor::ldap::ConfigMgr
65{
66 public:
67 MockConfigMgr(sdbusplus::bus::bus& bus, const char* path,
68 const char* filePath) :
69 phosphor::ldap::ConfigMgr(bus, path, filePath)
70 {
71 }
72 MOCK_METHOD1(restartService, void(const std::string& service));
73 MOCK_METHOD1(stopService, void(const std::string& service));
74 std::unique_ptr<Config>& getConfigPtr()
75 {
76 return configPtr;
77 }
78
79 void restore(const char* filePath)
80 {
81 phosphor::ldap::ConfigMgr::restore(filePath);
82 return;
83 }
84
85 friend class TestLDAPConfig;
86};
87
88TEST_F(TestLDAPConfig, testCreate)
89{
90 auto configFilePath = std::string(dir.c_str()) + "/" + ldapconfFile;
91
92 if (fs::exists(configFilePath))
93 {
94 fs::remove(configFilePath);
95 }
96 EXPECT_FALSE(fs::exists(configFilePath));
97 MockConfigMgr manager(bus, LDAP_CONFIG_ROOT, configFilePath.c_str());
98 EXPECT_CALL(manager, restartService("nslcd.service")).Times(2);
99 EXPECT_CALL(manager, restartService("nscd.service")).Times(1);
100 manager.createConfig("ldap://9.194.251.136/", "cn=Users,dc=com",
101 "cn=Users,dc=corp", "MyLdap12",
102 ldap_base::Create::SearchScope::sub,
103 ldap_base::Create::Type::ActiveDirectory);
104
105 EXPECT_TRUE(fs::exists(configFilePath));
106 EXPECT_EQ(manager.getConfigPtr()->lDAPServerURI(), "ldap://9.194.251.136/");
107 EXPECT_EQ(manager.getConfigPtr()->lDAPBindDN(), "cn=Users,dc=com");
108 EXPECT_EQ(manager.getConfigPtr()->lDAPBaseDN(), "cn=Users,dc=corp");
109 EXPECT_EQ(manager.getConfigPtr()->lDAPSearchScope(),
110 ldap_base::Config::SearchScope::sub);
111 EXPECT_EQ(manager.getConfigPtr()->lDAPType(),
112 ldap_base::Config::Type::ActiveDirectory);
113}
114
115TEST_F(TestLDAPConfig, testRestores)
116{
117 auto configFilePath = std::string(dir.c_str()) + "/" + ldapconfFile;
118
119 if (fs::exists(configFilePath))
120 {
121 fs::remove(configFilePath);
122 }
123 EXPECT_FALSE(fs::exists(configFilePath));
124 MockConfigMgr* managerPtr =
125 new MockConfigMgr(bus, LDAP_CONFIG_ROOT, configFilePath.c_str());
126 EXPECT_CALL(*managerPtr, restartService("nslcd.service")).Times(4);
127 EXPECT_CALL(*managerPtr, restartService("nscd.service")).Times(2);
128 managerPtr->createConfig("ldap://9.194.251.138/", "cn=Users,dc=com",
129 "cn=Users,dc=corp", "MyLdap12",
130 ldap_base::Create::SearchScope::sub,
131 ldap_base::Create::Type::ActiveDirectory);
132 EXPECT_TRUE(fs::exists(configFilePath));
133 // Delete LDAP configuration
134 managerPtr->deleteObject();
135 EXPECT_TRUE(fs::exists(configFilePath));
136 // Restore from configFilePath
137 managerPtr->restore(configFilePath.c_str());
138 // validate restored properties
139 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPServerURI(),
140 "ldap://9.194.251.138/");
141 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPBindDN(), "cn=Users,dc=com");
142 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPBaseDN(), "cn=Users,dc=corp");
143 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPSearchScope(),
144 ldap_base::Config::SearchScope::sub);
145 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPType(),
146 ldap_base::Config::Type::ActiveDirectory);
147 delete managerPtr;
148}
149
150TEST_F(TestLDAPConfig, testLDAPServerURI)
151{
152 auto configFilePath = std::string(dir.c_str()) + "/" + ldapconfFile;
153 if (fs::exists(configFilePath))
154 {
155 fs::remove(configFilePath);
156 }
157 EXPECT_FALSE(fs::exists(configFilePath));
158 MockConfigMgr* managerPtr =
159 new MockConfigMgr(bus, LDAP_CONFIG_ROOT, configFilePath.c_str());
160 EXPECT_CALL(*managerPtr, restartService("nslcd.service")).Times(6);
161 EXPECT_CALL(*managerPtr, restartService("nscd.service")).Times(2);
162
163 managerPtr->createConfig("ldap://9.194.251.138/", "cn=Users,dc=com",
164 "cn=Users,dc=corp", "MyLdap12",
165 ldap_base::Create::SearchScope::sub,
166 ldap_base::Create::Type::ActiveDirectory);
167 // Change LDAP Server URI
168 managerPtr->getConfigPtr()->lDAPServerURI("ldap://9.194.251.139");
169 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPServerURI(),
170 "ldap://9.194.251.139");
171 // Change LDAP Server URI
172 managerPtr->getConfigPtr()->lDAPServerURI("ldaps://9.194.251.139");
173 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPServerURI(),
174 "ldaps://9.194.251.139");
175 // Delete LDAP configuration
176 managerPtr->deleteObject();
177
178 managerPtr->restore(configFilePath.c_str());
179 // Check LDAP Server URI
180 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPServerURI(),
181 "ldaps://9.194.251.139");
182 delete managerPtr;
183}
184
185TEST_F(TestLDAPConfig, testLDAPBindDN)
186{
187 auto configFilePath = std::string(dir.c_str()) + "/" + ldapconfFile;
188 if (fs::exists(configFilePath))
189 {
190 fs::remove(configFilePath);
191 }
192 EXPECT_FALSE(fs::exists(configFilePath));
193 MockConfigMgr* managerPtr =
194 new MockConfigMgr(bus, LDAP_CONFIG_ROOT, configFilePath.c_str());
195 EXPECT_CALL(*managerPtr, restartService("nslcd.service")).Times(5);
196 EXPECT_CALL(*managerPtr, restartService("nscd.service")).Times(2);
197
198 managerPtr->createConfig("ldap://9.194.251.138/", "cn=Users,dc=com",
199 "cn=Users,dc=corp", "MyLdap12",
200 ldap_base::Create::SearchScope::sub,
201 ldap_base::Create::Type::ActiveDirectory);
202 // Change LDAP BindDN
203 managerPtr->getConfigPtr()->lDAPBindDN(
204 "cn=Administrator,cn=Users,dc=corp,dc=ibm,dc=com");
205 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPBindDN(),
206 "cn=Administrator,cn=Users,dc=corp,dc=ibm,dc=com");
207 // Change LDAP BindDN
208 EXPECT_THROW(
209 {
210 try
211 {
212 managerPtr->getConfigPtr()->lDAPBindDN("");
213 }
214 catch (const InvalidArgument& e)
215 {
216 throw;
217 }
218 },
219 InvalidArgument);
220 // Delete LDAP configuration
221 managerPtr->deleteObject();
222
223 managerPtr->restore(configFilePath.c_str());
224 // Check LDAP BindDN after restoring
225 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPBindDN(),
226 "cn=Administrator,cn=Users,dc=corp,dc=ibm,dc=com");
227 delete managerPtr;
228}
229
230TEST_F(TestLDAPConfig, testLDAPBaseDN)
231{
232 auto configFilePath = std::string(dir.c_str()) + "/" + ldapconfFile;
233 if (fs::exists(configFilePath))
234 {
235 fs::remove(configFilePath);
236 }
237 EXPECT_FALSE(fs::exists(configFilePath));
238 MockConfigMgr* managerPtr =
239 new MockConfigMgr(bus, LDAP_CONFIG_ROOT, configFilePath.c_str());
240 EXPECT_CALL(*managerPtr, restartService("nslcd.service")).Times(5);
241 EXPECT_CALL(*managerPtr, restartService("nscd.service")).Times(2);
242 managerPtr->createConfig("ldap://9.194.251.138/", "cn=Users,dc=com",
243 "cn=Users,dc=corp", "MyLdap12",
244 ldap_base::Create::SearchScope::sub,
245 ldap_base::Create::Type::ActiveDirectory);
246 // Change LDAP BaseDN
247 managerPtr->getConfigPtr()->lDAPBaseDN(
248 "cn=Administrator,cn=Users,dc=corp,dc=ibm,dc=com");
249 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPBaseDN(),
250 "cn=Administrator,cn=Users,dc=corp,dc=ibm,dc=com");
251 // Change LDAP BaseDN
252 EXPECT_THROW(
253 {
254 try
255 {
256 managerPtr->getConfigPtr()->lDAPBaseDN("");
257 }
258 catch (const InvalidArgument& e)
259 {
260 throw;
261 }
262 },
263 InvalidArgument);
264 // Delete LDAP configuration
265 managerPtr->deleteObject();
266
267 managerPtr->restore(configFilePath.c_str());
268 // Check LDAP BaseDN after restoring
269 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPBaseDN(),
270 "cn=Administrator,cn=Users,dc=corp,dc=ibm,dc=com");
271 delete managerPtr;
272}
273
274TEST_F(TestLDAPConfig, testSearchScope)
275{
276 auto configFilePath = std::string(dir.c_str()) + "/" + ldapconfFile;
277 if (fs::exists(configFilePath))
278 {
279 fs::remove(configFilePath);
280 }
281 EXPECT_FALSE(fs::exists(configFilePath));
282 MockConfigMgr* managerPtr =
283 new MockConfigMgr(bus, LDAP_CONFIG_ROOT, configFilePath.c_str());
284 EXPECT_CALL(*managerPtr, restartService("nslcd.service")).Times(5);
285 EXPECT_CALL(*managerPtr, restartService("nscd.service")).Times(2);
286 managerPtr->createConfig("ldap://9.194.251.138/", "cn=Users,dc=com",
287 "cn=Users,dc=corp", "MyLdap12",
288 ldap_base::Create::SearchScope::sub,
289 ldap_base::Create::Type::ActiveDirectory);
290 // Change LDAP SearchScope
291 managerPtr->getConfigPtr()->lDAPSearchScope(
292 ldap_base::Config::SearchScope::one);
293 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPSearchScope(),
294 ldap_base::Config::SearchScope::one);
295 // Delete LDAP configuration
296 managerPtr->deleteObject();
297
298 managerPtr->restore(configFilePath.c_str());
299 // Check LDAP SearchScope after restoring
300 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPSearchScope(),
301 ldap_base::Config::SearchScope::one);
302 delete managerPtr;
303}
304
305TEST_F(TestLDAPConfig, testLDAPType)
306{
307 auto configFilePath = std::string(dir.c_str()) + "/" + ldapconfFile;
308 if (fs::exists(configFilePath))
309 {
310 fs::remove(configFilePath);
311 }
312 EXPECT_FALSE(fs::exists(configFilePath));
313 MockConfigMgr* managerPtr =
314 new MockConfigMgr(bus, LDAP_CONFIG_ROOT, configFilePath.c_str());
315 EXPECT_CALL(*managerPtr, restartService("nslcd.service")).Times(5);
316 EXPECT_CALL(*managerPtr, restartService("nscd.service")).Times(2);
317 managerPtr->createConfig("ldap://9.194.251.138/", "cn=Users,dc=com",
318 "cn=Users,dc=corp", "MyLdap12",
319 ldap_base::Create::SearchScope::sub,
320 ldap_base::Create::Type::ActiveDirectory);
321 // Change LDAP type
322 managerPtr->getConfigPtr()->lDAPType(ldap_base::Config::Type::OpenLdap);
323 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPType(),
324 ldap_base::Config::Type::OpenLdap);
325 // Delete LDAP configuration
326 managerPtr->deleteObject();
327
328 managerPtr->restore(configFilePath.c_str());
329 // Check LDAP type after restoring
330 EXPECT_EQ(managerPtr->getConfigPtr()->lDAPType(),
331 ldap_base::Config::Type::OpenLdap);
332 delete managerPtr;
333}
334} // namespace ldap
335} // namespace phosphor