git.fiddlerwoaroof.com
installer_test.cc
7d075ab4
 /* 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.
  */
 
bf756dea
 #include <functional>
 #include <memory>
 #include <string>
 #include <vector>
c7bdd0eb
 #include <tuple>
bf756dea
 
66796de1
 #include "installer.h"
bf756dea
 #include "user.h"
 #include "token.h"
 #include "test_util.h"
d0d6ce9f
 #include "generator.h"
c1e18905
 #include "typealiases.h"
bf756dea
 
7d075ab4
 class mock_tokens : public tokens_ifc
 {
 public:
6133fc1e
     mutable std::string captured_key;
8c56f42f
     const std::string key_;
 
     mock_tokens (std::string key)
         : key_ (key)
     {}
 
8c62e61c
     std::string token (const user &user) const override
     {
8c56f42f
         return key_;
     }
 
8c62e61c
     std::string ensure_key (const user &user) const override
     {
         save (user, key_);
3f7d4dd6
         return key_;
     }
 
6133fc1e
     void save (const user &user, const std::string &key) const override
7d075ab4
     {
6133fc1e
         captured_key = key;
7d075ab4
     }
bf756dea
 };
 
7d075ab4
 class fake_unistd : public unistd_ifc
 {
 private:
     std::string user_name_;
 public:
     fake_unistd (const std::string &user_name) : user_name_ (user_name) {}
     const char *getlogin() const override
     {
         return user_name_.c_str();
     }
bf756dea
 };
66796de1
 
7d075ab4
 class fail_unistd : public unistd_ifc
 {
 public:
     const char *getlogin() const override
     {
         return nullptr;
     }
55530c94
 };
 
d0d6ce9f
 class fake_totp_generator : public token_generator_ifc
 {
dcdd8ca1
 private:
     std::string expected_token;
 public:
     fake_totp_generator (const std::string expected_token = "000000"):
         expected_token (expected_token)
     {}
 
40fd6c82
     std::string generate_token (const octet_vector &key) const override
dcdd8ca1
     {
         return expected_token;
     }
d0d6ce9f
 };
 
7d075ab4
 class fake_directory : public directory_ifc
 {
 private:
     std::string expected_user_name_;
b8155a93
     bool has_current_user_;
7d075ab4
 public:
8c62e61c
     fake_directory (const std::string &expected_user_name,
                     bool has_current_user = true) :
b8155a93
         expected_user_name_ (expected_user_name),
         has_current_user_ (has_current_user)
7d075ab4
     {
     }
     std::vector<user> find_user (const std::string &user_name) const override
     {
         std::vector<user> rval;
 
         if (user_name == expected_user_name_) {
             rval.push_back (user());
bf756dea
         }
 
7d075ab4
         return rval;
     }
b8155a93
     std::vector<user> get_current_user() const override
     {
         std::vector<user> result = {};
8c62e61c
 
b8155a93
         if (has_current_user_) {
8c62e61c
             result = {find_user (expected_user_name_)};
b8155a93
         }
8c62e61c
 
b8155a93
         return result;
     }
bf756dea
 };
 
7d075ab4
 int installs_token()
 {
66796de1
     //given
7d075ab4
     std::string user_name ("user");
f04cd01b
     std::string key ("THEKEYIS");
c7bdd0eb
     std::string token ("thetoken");
8c62e61c
     auto  test_tokens = std::make_shared<mock_tokens> (key);
bf756dea
     tokens tokens{test_tokens};
7d075ab4
     unistd unistd (std::make_shared<fake_unistd> (user_name));
     directory directory (std::make_shared<fake_directory> (user_name));
8c62e61c
     std::shared_ptr<fake_totp_generator> fake_generator =
         std::make_shared<fake_totp_generator> (token);
c7bdd0eb
     totp_generator generator (fake_generator );
bf756dea
 
dcdd8ca1
     installer installer = installer::create (tokens, unistd, directory,
                           generator);
66796de1
 
     //when
c7bdd0eb
     std::string actual_key, actual_token;
8c62e61c
     std::tie (actual_key, actual_token) = installer.install_key();
66796de1
 
     //then
6133fc1e
     check (test_tokens->captured_key == key, "installed wrong key");
c7bdd0eb
     check (actual_key == key, "installer returned wrong key");
     check (actual_token == token, "installer returned wrong token");
bf756dea
     succeed();
66796de1
 }
 
284e9ab4
 int unistd_does_not_find_user_name_empty_string_case()
 {
     //given
     std::string user_name ("user");
8c56f42f
     std::string key ("token");
8c62e61c
     auto  test_tokens = std::make_shared<mock_tokens> (key);
284e9ab4
     tokens tokens{test_tokens};
     unistd unistd (std::make_shared<fake_unistd> (""));
b8155a93
     directory directory (std::make_shared<fake_directory> (user_name, false));
8c62e61c
     totp_generator generator (totp_generator (
                                   std::make_shared<fake_totp_generator>()));
284e9ab4
 
dcdd8ca1
     installer installer = installer::create (tokens, unistd, directory,
                           generator);
284e9ab4
 
     //when
c7bdd0eb
     std::string actual_key, actual_token;
8c62e61c
     std::tie (actual_key, actual_token) = installer.install_key();
284e9ab4
 
     //then
c7bdd0eb
     check (actual_key == "",
            "should not have installed a token");
     check (actual_token == "",
            "should not have installed a token");
284e9ab4
     succeed();
 }
 
7d075ab4
 int directory_finds_no_user_info()
 {
     std::string user_name ("user");
8c56f42f
     std::string key ("token");
8c62e61c
     auto  test_tokens = std::make_shared<mock_tokens> (key);
43a993d5
     tokens tokens{test_tokens};
7d075ab4
     unistd unistd (std::make_shared<fake_unistd> (user_name));
8c62e61c
     directory directory (std::make_shared<fake_directory> ("not the user",
                          false));
62a4ee36
     totp_generator generator (std::make_shared<fake_totp_generator>());
43a993d5
 
dcdd8ca1
     installer installer = installer::create (tokens, unistd, directory,
                           generator);
43a993d5
 
     //when
c7bdd0eb
     std::string actual_key, actual_token;
8c62e61c
     std::tie (actual_key, actual_token) = installer.install_key();
43a993d5
 
     //then
6133fc1e
     check (test_tokens->captured_key == "", "installed wrong key");
c7bdd0eb
     check (actual_key == "", "did not return empty token");
     check (actual_token == "", "did not return an empty token");
43a993d5
     succeed();
 }
 
7d075ab4
 int run_tests()
 {
377fd79f
     test (installs_token);
     test (unistd_does_not_find_user_name_empty_string_case);
     test (directory_finds_no_user_info);
bf756dea
     succeed();
 }
 
7d075ab4
 int main (int argc, char *argv[])
 {
bf756dea
     return !run_tests();
 }
0d8b9a17