Browse code
find user happy
Greg Wiley authored on 21/04/2017 23:25:54
Showing 4 changed files
Showing 4 changed files
... | ... |
@@ -10,16 +10,38 @@ |
10 | 10 |
*/ |
11 | 11 |
|
12 | 12 |
#include <memory> |
13 |
+#include <vector> |
|
14 |
+ |
|
13 | 15 |
|
14 | 16 |
#include "user.h" |
17 |
+#include "sys_unistd.h" |
|
18 |
+#include "sys_pwd.h" |
|
15 | 19 |
|
16 | 20 |
namespace { |
17 | 21 |
class directory_impl : public directory_ifc { |
22 |
+ private: |
|
23 |
+ unistd unistd_; |
|
24 |
+ pwd pwd_; |
|
18 | 25 |
public: |
19 |
- std::vector<user> find_user (const std::string &user_name); |
|
26 |
+ directory_impl(unistd &unistd, pwd &pwd) : unistd_(unistd), pwd_(pwd) {} |
|
27 |
+ std::vector<user> find_user (const std::string &user_name) { |
|
28 |
+ std::vector<char> buffer (unistd_.sysconf (_SC_GETPW_R_SIZE_MAX)); |
|
29 |
+ passwd sys_passwd; |
|
30 |
+ passwd *found_passwd(0); |
|
31 |
+ int result = pwd_.getpwnam_r(user_name.c_str(), &sys_passwd, |
|
32 |
+ buffer.data(), buffer.size(), &found_passwd); |
|
33 |
+ std::vector<user> return_value; |
|
34 |
+ if (found_passwd) { |
|
35 |
+ return_value.push_back(user()); |
|
36 |
+ } |
|
37 |
+ return return_value; |
|
38 |
+ } |
|
20 | 39 |
}; |
21 | 40 |
} |
22 | 41 |
|
42 |
+directory directory::create(unistd &unistd, pwd &pwd) { |
|
43 |
+ return directory(delegate(new directory_impl(unistd, pwd))); |
|
44 |
+} |
|
23 | 45 |
|
24 | 46 |
/* |
25 | 47 |
class concrete_user : public user |
... | ... |
@@ -14,7 +14,9 @@ |
14 | 14 |
#include <vector> |
15 | 15 |
#include <string> |
16 | 16 |
#include <memory> |
17 |
-#include <pwd.h> |
|
17 |
+ |
|
18 |
+#include "sys_unistd.h" |
|
19 |
+#include "sys_pwd.h" |
|
18 | 20 |
|
19 | 21 |
class user_ifc |
20 | 22 |
{ |
... | ... |
@@ -43,19 +45,20 @@ public: |
43 | 45 |
|
44 | 46 |
class directory : public directory_ifc |
45 | 47 |
{ |
46 |
-private: |
|
47 |
- std::shared_ptr<directory_ifc> delegate_; |
|
48 |
-public: |
|
49 |
- directory (std::shared_ptr<directory_ifc> delegate) : delegate_ |
|
48 |
+ public: |
|
49 |
+ typedef std::shared_ptr<directory_ifc> delegate; |
|
50 |
+ private: |
|
51 |
+ delegate delegate_; |
|
52 |
+ public: |
|
53 |
+ directory (delegate delegate) : delegate_ |
|
50 | 54 |
(delegate) {} |
51 |
- directory() : directory (std::shared_ptr<directory_ifc> |
|
52 |
- (new directory_ifc)) {} |
|
55 |
+ directory() : directory(delegate(new directory_ifc)) {} |
|
53 | 56 |
std::vector<user> find_user (const std::string &user_name) |
54 | 57 |
{ |
55 | 58 |
return delegate_->find_user (user_name); |
56 | 59 |
} |
57 | 60 |
|
58 |
- static directory create(); |
|
61 |
+ static directory create(unistd &unistd, pwd &pwd); |
|
59 | 62 |
}; |
60 | 63 |
|
61 | 64 |
#endif |
... | ... |
@@ -11,9 +11,53 @@ |
11 | 11 |
|
12 | 12 |
#include "user.h" |
13 | 13 |
#include "test_util.h" |
14 |
+#include "sys_pwd.h" |
|
15 |
+#include "sys_unistd.h" |
|
16 |
+ |
|
17 |
+class fake_pwd : public pwd_ifc { |
|
18 |
+ private: |
|
19 |
+ passwd passwd_; |
|
20 |
+ std::string expected_user_name_; |
|
21 |
+ public: |
|
22 |
+ fake_pwd(const std::string expected_user_name) : expected_user_name_(expected_user_name) {} |
|
23 |
+ int getpwnam_r(const char *user_name, passwd *out, char *buffer, |
|
24 |
+ size_t buffer_sz, passwd **result) { |
|
25 |
+ if (expected_user_name_ == user_name) { |
|
26 |
+ *out = passwd_; |
|
27 |
+ *result = out; |
|
28 |
+ } |
|
29 |
+ return 0; |
|
30 |
+ } |
|
31 |
+}; |
|
32 |
+ |
|
33 |
+class fake_unistd : public unistd_ifc { |
|
34 |
+ private: |
|
35 |
+ int expected_name_; |
|
36 |
+ public: |
|
37 |
+ fake_unistd(int expected_name) : expected_name_(expected_name) {} |
|
38 |
+ long int sysconf(int name) { |
|
39 |
+ if (name == expected_name_) { |
|
40 |
+ return 0; |
|
41 |
+ } |
|
42 |
+ return -1; |
|
43 |
+ } |
|
44 |
+}; |
|
14 | 45 |
|
15 | 46 |
int find_user_happy() { |
16 |
- fail(); |
|
47 |
+ //given |
|
48 |
+ std::string user_name("user"); |
|
49 |
+ pwd test_pwd(pwd::delegate(new fake_pwd(user_name))); |
|
50 |
+ unistd test_unistd(unistd::delegate(new fake_unistd(_SC_GETPW_R_SIZE_MAX))); |
|
51 |
+ directory directory(directory::create(test_unistd, test_pwd)); |
|
52 |
+ |
|
53 |
+ //when |
|
54 |
+ std::vector<user> results = directory.find_user(user_name); |
|
55 |
+ |
|
56 |
+ //then |
|
57 |
+ check(!results.empty(), "user should have been found"); |
|
58 |
+ succeed(); |
|
59 |
+ |
|
60 |
+ |
|
17 | 61 |
} |
18 | 62 |
|
19 | 63 |
RESET_VARS_START |