#include #include #include #include #include "conversation.h" #include "test_util.h" #include "pam.h" class fake_pam_conversation : public pam_conversation { private: pam_response response_; std::string answer_; public: fake_pam_conversation(const std::string &answer) : answer_(answer) {} int conv(const std::vector &prompts, std::vector &answers) { if (prompts.size() != 1) { throw std::string("test only supports one prompt"); } response_.resp_retcode = 0; response_.resp = const_cast(answer_.c_str()); answers.resize(1); answers[0] = &response_; return 0; } }; class fake_pam : public pam { private: std::shared_ptr conversation_; public: fake_pam(std::shared_ptr conversation) : conversation_(conversation) {} fake_pam() {} int get_conversation(pam_handle_t *pamh, std::shared_ptr &conversation) { if (conversation_) { conversation = conversation_; return 0; } return 12; } }; int returns_correct_token() { //given pam_handle_t *pamh; pam_conversation_p fake_conversation = (pam_conversation_p) new fake_pam_conversation("user:code"); pam_p pam = (pam_p)new fake_pam(fake_conversation); //when pam_token_conversation conversation(pamh, pam); //then check(conversation.token() == "code", "returned incorrect token"); succeed(); } int returns_correct_user_name() { //given pam_handle_t *pamh; pam_conversation_p fake_conversation = (pam_conversation_p) new fake_pam_conversation("sally:token"); pam_p pam = (pam_p)new fake_pam(fake_conversation); //when pam_token_conversation conversation(pamh, pam); //then check(conversation.user_name() == "sally", "returned incorrect user name"); succeed(); } int returns_empty_user_and_token_when_no_colon() { //given pam_handle_t *pamh; pam_conversation_p fake_conversation = (pam_conversation_p) new fake_pam_conversation("sally"); pam_p pam = (pam_p)new fake_pam(fake_conversation); //when pam_token_conversation conversation(pamh, pam); //then check(conversation.user_name() == "", "did not return empty user name"); check(conversation.token() == "", "did not return empty token"); succeed(); } int returns_empty_user_and_token_when_empty_answer() { //given pam_handle_t *pamh; pam_conversation_p fake_conversation = (pam_conversation_p) new fake_pam_conversation(""); pam_p pam = (pam_p)new fake_pam(fake_conversation); //when pam_token_conversation conversation(pamh, pam); //then check(conversation.user_name() == "", "did not return empty user name"); check(conversation.token() == "", "did not return empty token"); succeed(); } int returns_empty_token_when_colon_end() { //given pam_handle_t *pamh; pam_conversation_p fake_conversation = (pam_conversation_p) new fake_pam_conversation("sally:"); pam_p pam = (pam_p)new fake_pam(fake_conversation); //when pam_token_conversation conversation(pamh, pam); //then check(conversation.user_name() == "sally", "did not return empty user name"); check(conversation.token() == "", "did not return empty token"); succeed(); } int returns_empty_user_when_colon_begin() { //given pam_handle_t *pamh; pam_conversation_p fake_conversation = (pam_conversation_p) new fake_pam_conversation(":token"); pam_p pam = (pam_p)new fake_pam(fake_conversation); //when pam_token_conversation conversation(pamh, pam); //then check(conversation.user_name() == "", "did not return empty user name"); check(conversation.token() == "token", "did not return empty token"); succeed(); } int returns_empty_user_and_token_when_pam_cant_create_conversation() { // given pam_handle_t *pamh; pam_p pam = (pam_p)new fake_pam; //when pam_token_conversation conversation(pamh, pam); //then check(conversation.user_name() == "", "did not return empty user name"); check(conversation.token() == "", "did not return empty token"); succeed(); } RESET_VARS_START RESET_VARS_END int run_tests() { test(returns_correct_token); test(returns_correct_user_name); test(returns_empty_user_and_token_when_no_colon); test(returns_empty_token_when_colon_end); test(returns_empty_user_when_colon_begin); test(returns_empty_user_and_token_when_empty_answer); test(returns_empty_user_and_token_when_pam_cant_create_conversation); succeed(); } int main(int argc, char *args[]) { return !run_tests(); }