git.fiddlerwoaroof.com
Browse code

find user happy

Greg Wiley authored on 21/04/2017 23:25:54
Showing 4 changed files
... ...
@@ -3,6 +3,8 @@
3 3
 
4 4
 #include <memory>
5 5
 
6
+#include <unistd.h>
7
+
6 8
 class unistd_ifc {
7 9
     public:
8 10
         virtual long int sysconf(int name) { return -1; }
... ...
@@ -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