git.fiddlerwoaroof.com
Browse code

supplier and file reader classes

jbalcita authored on 24/04/2017 05:36:48
Showing 7 changed files
... ...
@@ -2,8 +2,8 @@ CXXFLAGS += -fPIC -fno-stack-protector -std=c++14
2 2
 CFLAGS += -fPIC -fno-stack-protector
3 3
 
4 4
 OBJS = dual_control.o request.o dual_control_integrate.o validator.o conversation.o user.o \
5
-	   sys_unistd.o sys_pwd.o
6
-TESTS = dual_control_test validator_test conversation_test request_test user_test
5
+	   sys_unistd.o sys_pwd.o token.o
6
+TESTS = dual_control_test validator_test conversation_test request_test user_test token_test
7 7
 TESTOBJS = $(patsubst %,%.o,$(TESTS))
8 8
 SRCS := $(OBJS:.o=.cc) $(TESTOBJS:.o=.cc)
9 9
 
... ...
@@ -24,8 +24,28 @@ namespace
24 24
         public:
25 25
             impl(file_reader &file_reader) : file_reader_(file_reader) {}
26 26
             std::string token(user &user) {
27
-                std::string filepath = user.home_directory() + "/" + ".dual_control";
28
-                file_reader_.read(filepath);
27
+                std::string file_path(user.home_directory());
28
+                std::string fetched_token(file_reader_.read(file_path));
29
+                return fetched_token;
29 30
             }
30 31
     };
32
+
33
+    class file_reader_impl : public file_reader_ifc {
34
+        public:
35
+            std::string read(std::string file_path) {
36
+                return file_path;
37
+            }
38
+    };
39
+}
40
+
41
+file_reader file_reader::create ()
42
+{
43
+    return file_reader (std::shared_ptr<file_reader_ifc>(new file_reader_impl ));
44
+}
45
+
46
+user_token_supplier user_token_supplier::create (file_reader &file_reader)
47
+{
48
+    return user_token_supplier (std::shared_ptr<user_token_supplier_ifc>(new impl (file_reader)));
31 49
 }
50
+
51
+
... ...
@@ -19,12 +19,36 @@
19 19
 class user_token_supplier_ifc
20 20
 {
21 21
 public:
22
-    virtual std::string token (const user &user)
22
+    virtual ~user_token_supplier_ifc() {}
23
+    virtual std::string token (user &user)
23 24
     {
24
-        return "";
25
+        return "virtual supplier";
25 26
     }
26 27
 };
27 28
 
29
+
30
+class file_reader_ifc {
31
+    public:
32
+        virtual std::string read(std::string file_path) {
33
+            return "";
34
+        }
35
+};
36
+
37
+class file_reader : public file_reader_ifc {
38
+    public:
39
+        typedef std::shared_ptr<file_reader_ifc> delegate;
40
+    private:
41
+        delegate delegate_;
42
+    public:
43
+        file_reader(delegate delegate) :
44
+            delegate_(delegate) {}
45
+        file_reader() : delegate_(delegate(new file_reader_ifc)) {}
46
+        std::string read(std::string file_path) {
47
+            return delegate_->read(file_path);
48
+        }
49
+    static file_reader create ();
50
+};
51
+
28 52
 class user_token_supplier : public user_token_supplier_ifc
29 53
 {
30 54
     public:
... ...
@@ -36,16 +60,12 @@ class user_token_supplier : public user_token_supplier_ifc
36 60
         delegate_ (delegate) {}
37 61
         user_token_supplier() : user_token_supplier (
38 62
            delegate (new user_token_supplier_ifc)) {}
39
-        std::string token (const user &user)
63
+        std::string token (user &user)
40 64
         {
41 65
             return delegate_->token (user);
42 66
         }
67
+    static user_token_supplier create (file_reader &file_reader);
43 68
 };
44 69
 
45
-class file_reader_ifc {
46
-    public:
47
-        std::string read(
48
-}
49
-
50 70
 #endif
51 71
 
... ...
@@ -9,19 +9,61 @@
9 9
  * at https://github.com/cjdev/dual-control.
10 10
  */
11 11
 
12
+#include <memory>
12 13
 #include <cstring>
13 14
 #include <pwd.h>
14 15
 #include <cstdio>
15 16
 #include <sys/stat.h>
16 17
 
18
+
17 19
 #include "token.h"
18 20
 #include "test_util.h"
21
+#include "user.h"
22
+
23
+class fake_file_reader : public file_reader_ifc {
24
+    public:
25
+        std::string read(std::string file_path) {
26
+            return file_path;
27
+        }
28
+};
19 29
 
30
+class fake_user : public user_ifc {
31
+    private:
32
+        std::string home_directory_;
33
+    public:
34
+        fake_user(std::string &user_name) :
35
+            home_directory_("home/" + user_name + "/.dual_control") {
36
+            }
37
+        std::string home_directory() {
38
+            return home_directory_;
39
+        }
40
+};
20 41
 
42
+int reads_from_the_right_file () {
43
+    //given
44
+    file_reader test_file_reader(file_reader::delegate(new fake_file_reader));
45
+    std::string user_name = "user";
46
+    std::string expected = "home/" + user_name + "/.dual_control";
47
+    user test_user(std::shared_ptr<fake_user>((new fake_user(user_name))));
48
+    user_token_supplier supplier(user_token_supplier::create(test_file_reader));
21 49
 
50
+    //when
51
+    std::string actual = supplier.token(test_user);
22 52
 
53
+    //then
54
+    check(actual == expected, "read wrong file");
55
+    succeed();
56
+}
23 57
 
24 58
 RESET_VARS_START
25 59
 RESET_VARS_END
26 60
 
61
+int run_tests() {
62
+    test(reads_from_the_right_file);
63
+    succeed();
64
+}
65
+
66
+int main(int argc, char *argv[]) {
67
+    return !run_tests();
68
+}
27 69
 
... ...
@@ -11,6 +11,7 @@
11 11
 
12 12
 #include <memory>
13 13
 #include <vector>
14
+#include <iostream>
14 15
 
15 16
 #include "user.h"
16 17
 #include "sys_unistd.h"
... ...
@@ -18,7 +19,6 @@
18 19
 
19 20
 namespace
20 21
 {
21
-
22 22
 class user_impl : public user_ifc {
23 23
     private:
24 24
         std::string home_directory_;
... ...
@@ -14,7 +14,7 @@
14 14
 #include <vector>
15 15
 #include <string>
16 16
 #include <memory>
17
-
17
+#include <iostream>
18 18
 #include "sys_unistd.h"
19 19
 #include "sys_pwd.h"
20 20
 
... ...
@@ -22,7 +22,9 @@ class user_ifc
22 22
 {
23 23
 public:
24 24
     virtual ~user_ifc() {}
25
-    virtual std::string home_directory();
25
+    virtual std::string home_directory() {
26
+        return "virtual";
27
+    }
26 28
 };
27 29
 
28 30
 class user : public user_ifc
... ...
@@ -32,8 +34,13 @@ class user : public user_ifc
32 34
     private:
33 35
         delegate delegate_;
34 36
     public:
35
-        user (delegate delegate) : delegate_ (delegate) {}
37
+        user (delegate delegate) : delegate_ (delegate) {
38
+        }
36 39
         user() : user (delegate (new user_ifc)) {}
40
+        std::string home_directory() {
41
+            return delegate_-> home_directory();
42
+        }
43
+    static user create (const passwd &passwd);
37 44
 };
38 45
 
39 46
 class directory_ifc
... ...
@@ -34,7 +34,6 @@ public:
34 34
         if (user_name == user_name_) {
35 35
             result.push_back (user());
36 36
         }
37
-
38 37
         return result;
39 38
     }
40 39
 };
... ...
@@ -46,7 +45,7 @@ private:
46 45
 public:
47 46
     fake_user_token_supplier (const std::string &token) : token_ (token) {}
48 47
     fake_user_token_supplier() : token_ ("_NOT_A_TOKEN") {}
49
-    virtual std::string token (const user &user)
48
+    std::string token (user &user)
50 49
     {
51 50
         return token_;
52 51
     }