git.fiddlerwoaroof.com
user_test.cc
7684972a
 /* Copyright (C) CJ Affiliate
  *
  * You may use, distribute and modify this code under  the
  * terms of the  GNU General Public License  version 2  or
  * later.
  *
  * You should have received a copy of the license with this
  * file. If not, you will find a copy in the "LICENSE" file
  * at https://github.com/cjdev/dual-control.
  */
 
55259c47
 #include "user.h"
 #include "test_util.h"
d8adc881
 #include "sys_pwd.h"
 #include "sys_unistd.h"
 
189f062b
 class fake_pwd : public pwd_ifc
 {
 private:
     std::string expected_user_name_;
5a49538d
     std::string home_directory_;
189f062b
 public:
     fake_pwd (const std::string expected_user_name) : expected_user_name_
4ef9dc34
         (expected_user_name), home_directory_ ("/somehome") {}
189f062b
     int getpwnam_r (const char *user_name, passwd *out, char *buffer,
bf756dea
                     size_t buffer_sz, passwd **result) const override
189f062b
     {
         if (expected_user_name_ == user_name)  {
4ef9dc34
             out->pw_dir = const_cast<char *> (home_directory_.c_str());
             out->pw_name = const_cast<char *> (expected_user_name_.c_str());
189f062b
             *result = out;
         } else {
36518286
             *result = 0;
         }
189f062b
 
         return 0;
     }
36518286
 };
 
189f062b
 class match_buffer_pwd : public pwd_ifc
 {
 private:
     long int expected_buffer_sz_;
801a5342
     std::string charbuf_;
189f062b
 public:
     match_buffer_pwd (long int buffer_sz) : expected_buffer_sz_ (buffer_sz) {}
     int getpwnam_r (const char *user_name, passwd *out, char *buffer,
bf756dea
                     size_t buffer_sz, passwd **result) const override
189f062b
     {
 
         if (expected_buffer_sz_ == buffer_sz && buffer != 0) {
4ef9dc34
             out->pw_name = const_cast<char *> (charbuf_.c_str());
             out->pw_dir = const_cast<char *> (charbuf_.c_str());
189f062b
             *result = out;
         } else {
36518286
             *result = 0;
d8adc881
         }
189f062b
 
         return 0;
     }
d8adc881
 };
 
189f062b
 class stub_pwnam_err_pwd : public pwd_ifc
 {
 public:
     int getpwnam_r (const char *user_name, passwd *out, char *buffer,
bf756dea
                     size_t buffer_sz, passwd **result) const override
189f062b
     {
         *result = out;
         return 3;
     }
0a8bb2f7
 
 };
 
189f062b
 class fake_unistd : public unistd_ifc
 {
 private:
     int expected_name_;
     long int return_value_;
 public:
     fake_unistd (int expected_name, long int return_value = 0)
         : expected_name_ (expected_name),
           return_value_ (return_value) {}
bf756dea
     long int sysconf (int name) const override
189f062b
     {
         if (name == expected_name_) {
36518286
             return return_value_;
d8adc881
         }
189f062b
 
         return -1;
     }
d8adc881
 };
717259b5
 
189f062b
 int find_user_happy()
 {
d8adc881
     //given
189f062b
     std::string user_name ("user");
     pwd test_pwd (pwd::delegate (new fake_pwd (user_name)));
     unistd test_unistd (unistd::delegate (new fake_unistd (
             _SC_GETPW_R_SIZE_MAX)));
     directory directory (directory::create (test_unistd, test_pwd));
d8adc881
 
     //when
189f062b
     std::vector<user> results = directory.find_user (user_name);
d8adc881
 
     //then
189f062b
     check (!results.empty(), "user should have been found");
d8adc881
     succeed();
dad2109c
 }
 
189f062b
 int user_not_found()
 {
dad2109c
     //given
189f062b
     pwd test_pwd (pwd::delegate (new fake_pwd ("user")));
     unistd test_unistd (unistd::delegate (new fake_unistd (
             _SC_GETPW_R_SIZE_MAX)));
     directory directory (directory::create (test_unistd, test_pwd));
d8adc881
 
dad2109c
     //when
189f062b
     std::vector<user> results = directory.find_user ("not_user");
dad2109c
 
     //then
189f062b
     check (results.empty(), "user should not have been found");
dad2109c
     succeed();
d8adc881
 
a8b53afd
 }
 
189f062b
 int find_user_passes_buffer_and_size()
 {
36518286
     //given
     long int buffer_sz = 5976;
189f062b
     unistd test_unistd (unistd::delegate (new fake_unistd (_SC_GETPW_R_SIZE_MAX,
                                           buffer_sz)));
     pwd match_pwd (pwd::delegate (new match_buffer_pwd (buffer_sz)));
     directory directory (directory::create (test_unistd, match_pwd));
9a0bfcb2
 
36518286
     //when
189f062b
     std::vector<user> results = directory.find_user ("does_not_matter");
717259b5
 
     // then
189f062b
     check (!results.empty(), "match failed");
717259b5
     succeed();
 }
 
189f062b
 int find_user_fails_on_pwnam_r_error_and_result_ok()
 {
0a8bb2f7
     //given
189f062b
     unistd test_unistd (unistd::delegate (new fake_unistd (
             _SC_GETPW_R_SIZE_MAX)));
     pwd stub_pwd (pwd::delegate (new stub_pwnam_err_pwd));
     directory directory (directory::create (test_unistd, stub_pwd));
0a8bb2f7
 
     //when
189f062b
     std::vector<user> results = directory.find_user ("does_not_matter");
0a8bb2f7
 
     // then
189f062b
     check (results.empty(), "did not check return");
0a8bb2f7
     succeed();
 }
 
55259c47
 RESET_VARS_START
 RESET_VARS_END
 
189f062b
 int run_tests()
 {
     test (find_user_happy);
801a5342
     test (user_not_found);
     test (find_user_passes_buffer_and_size);
     test (find_user_fails_on_pwnam_r_error_and_result_ok);
55259c47
     succeed();
 }
36518286
 
189f062b
 int main (int argc, char **argv)
 {
55259c47
     return !run_tests();
 }