// This file is under GNU General Public License 3.0 // see LICENSE.txt #include "framework/framework.hh" #include #include #include #include "../src/passphrase_cache.hh" #include "../src/status_to_string.hh" #include "../src/Adapter.hh" using namespace pEp; extern "C" { ::PEP_STATUS api_test1(::PEP_SESSION session, const char *str, char *bytes, int n, ::stringlist_t *sl) { std::cout << "called api_test1\n"; return PEP_WRONG_PASSPHRASE; } ::PEP_STATUS api_test2(::PEP_SESSION session, int n, const char *str, char *bytes, ::stringlist_t *sl) { std::cout << "called api_test2\n"; return PEP_STATUS_OK; } }; int main(int argc, char **argv) { Test::setup(argc, argv); Adapter::session.initialize(); const char *str = "23"; char *bytes = NULL; int n = 42; ::stringlist_t *sl = NULL; PassphraseCache cache{ 2, std::chrono::seconds(1) }; cache.add("say"); cache.add("hello"); cache.add("world"); std::cout << "expected: two passphrases\n"; cache.for_each_passphrase([&](std::string passphrase) { std::cout << "'" << passphrase << "'\n"; return false; }); std::cout << "expected: one passphrase\n"; cache.for_each_passphrase([&](std::string passphrase) { std::cout << "'" << passphrase << "'\n"; return passphrase != ""; }); std::cout << "expected: two passphrases but reverse order\n"; cache.for_each_passphrase([&](std::string passphrase) { std::cout << "'" << passphrase << "'\n"; return false; }); ::PEP_STATUS status = cache.api(api_test1, Adapter::session(), "23", bytes, n, (::stringlist_t *)NULL); assert(status == PEP_WRONG_PASSPHRASE); status = cache.api(api_test2, Adapter::session(), n, str, bytes, sl); assert(status == PEP_STATUS_OK); cache.add("hello"); cache.add("world"); std::cout << "expected: two passphrases in reverse order\n"; PassphraseCache _cache = cache; try { while (1) { std::cout << "'" << _cache.latest_passphrase(_cache) << "'\n"; } } catch (std::underflow_error &) { } passphrase_cache.add("hello"); passphrase_cache.add("world"); std::cout << "two times PEP_STATUS_OK (0), one time PEP_WRONG_PASSPHRASE (2561)\n"; do { status = PassphraseCache::config_next_passphrase(); std::cout << status_to_string(status) << " (" << status << ")\n"; } while (status == PEP_STATUS_OK); sleep(2); std::cout << "expected: no passphrase\n"; cache.for_each_passphrase([&](std::string passphrase) { std::cout << "'" << passphrase << "'\n"; return false; }); status = cache.api(api_test1, Adapter::session(), str, bytes, n, sl); assert(status == PEP_WRONG_PASSPHRASE); status = cache.api(api_test2, Adapter::session(), 23, str, bytes, sl); assert(status == PEP_STATUS_OK); Adapter::session.release(); return 0; }