diff options
Diffstat (limited to 'icetray/unittests/testIceTrayMail.cpp')
-rw-r--r-- | icetray/unittests/testIceTrayMail.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/icetray/unittests/testIceTrayMail.cpp b/icetray/unittests/testIceTrayMail.cpp new file mode 100644 index 0000000..ff2220a --- /dev/null +++ b/icetray/unittests/testIceTrayMail.cpp @@ -0,0 +1,156 @@ +#define BOOST_TEST_MODULE TestIceTrayMail +#include <boost/test/unit_test.hpp> +#include <boost/test/data/test_case.hpp> + +#include <memstream.h> +#include <mailServer.h> +#include <mimeImpl.h> +#include <fileUtils.h> +#include <definedDirs.h> + +using namespace std::string_literals; +using namespace IceTray::Mime; +using namespace IceTray::Mail; +using QPTD = std::tuple<std::string_view, std::string_view>; +using B64TD = std::tuple<size_t, std::string_view>; + +BOOST_DATA_TEST_CASE(quotedPrintable, boost::unit_test::data::make<QPTD>({ + { "", "" }, + { "Simple string", "Simple string" }, + { " \t Leading whitespace", " \t Leading whitespace" }, + { "Trailing whitespace \t \n", "Trailing whitespace \t=20\r\n" }, + { "High byte values £ © ±", "High byte values =C2=A3 =\r\n=C2=A9 =C2=B1" }, + { "<html lang=\"en\">", "<html lang=3D\"en\">" } +}), input, expected) +{ + AdHoc::MemStream ms; + TextPart::quotedPrintable(input, ms, 25); + BOOST_CHECK_EQUAL(expected, ms.sv()); +} + +BOOST_DATA_TEST_CASE(base64, boost::unit_test::data::make<B64TD>({ + { 0, "\r\n" }, + { 1, "iQ==\r\n" }, + { 2, "iVA=\r\n" }, + { 3, "iVBO\r\n" }, + { 4, "iVBORw==\r\n" }, + { 5, "iVBORw0=\r\n" }, + { 90, + "iVBORw0KGgoAAAANSUhEUgAA\r\n" + "AAsAAAALCAYAAACprHcmAAAA\r\n" + "BmJLR0QA/wD/AP+gvaeTAAAA\r\n" + "J0lEQVQYlWP8////fwbiwGom\r\n" + "IhUyMDAwMIwqpo9iFgYGhtVE\r\n" }, + { 113, + "iVBORw0KGgoAAAANSUhEUgAA\r\n" + "AAsAAAALCAYAAACprHcmAAAA\r\n" + "BmJLR0QA/wD/AP+gvaeTAAAA\r\n" + "J0lEQVQYlWP8////fwbiwGom\r\n" + "IhUyMDAwMIwqpo9iFgYGhtVE\r\n" + "qj0BAAvPBjJ63HJVAAAAAElF\r\n" + "TkSuQmA=\r\n" }, +}), input, expected) +{ + AdHoc::MemStream ms; + AdHoc::FileUtils::MemMap png(rootDir / "fixtures" / "mail" / "blank.png"); + BinaryViewPart::base64(png.sv<uint8_t>().substr(0, input), ms, 24); + BOOST_CHECK_EQUAL(expected, ms.sv()); +} + +struct TestBase { + TestBase() : + e(std::make_shared<Email>()), +#ifdef DUMP + dump(fopen("/tmp/dump.eml", "w")), +#endif + fixtures(rootDir / "fixtures" / "mail") + { + e->from = {"from", "from@test.com"}; + e->to = {"to", "to@test.com"}; + e->subject = "subject"; + + auto commonHeaders = [](FILE * s) { + fputs("From: from <from@test.com>\r\n", s); + fputs("To: to <to@test.com>\r\n", s); + fputs("Date: Fri, 24 May 2019 22:19:54 +0000 (UTC)\r\n", s); + fputs("Return-path: <bounces@test.com>\r\n", s); + }; + commonHeaders(ms); +#ifdef DUMP + commonHeaders(dump); +#endif + } + ~TestBase() + { +#ifdef DUMP + fclose(dump); +#endif + } + EmailPtr e; + AdHoc::MemStream ms; +#ifdef DUMP + FILE * dump; +#endif + const std::filesystem::path fixtures; +}; + +const std::string text_content = "Simple text £\r\n"; +const std::string html_content = "<html lang=\"en\">\r\n" +"<head>\r\n" +"<title>£</title>\r\n" +"</head>\r\n" +"<html>\r\n"; + +BOOST_FIXTURE_TEST_SUITE(base, TestBase); + +BOOST_AUTO_TEST_CASE(single_part) +{ + e->content = std::make_shared<TextPart>(Headers { + { "X-Source", "single_part" } + }, "text/plain", text_content); + BasicMailServer::writeEmailContent(e, ms); + BOOST_CHECK_EQUAL(ms, AdHoc::FileUtils::MemMap(fixtures / "simple.eml").sv()); +} + +BOOST_AUTO_TEST_CASE(multipart_alt) +{ + auto text = std::make_shared<TextPart>(Headers { + { "X-Source", "multipart_plain" } + }, "text/plain", text_content); + auto html = std::make_shared<TextPart>(Headers { + { "X-Source", "multipart_html" } + }, "text/html", html_content); + e->content = std::make_shared<MultiPart>(Headers { + { "X-Source", "multipart_top" } + }, "alternative", Parts { text, html }); + BasicMailServer::writeEmailContent(e, ms); + BOOST_CHECK_EQUAL(ms, AdHoc::FileUtils::MemMap(fixtures / "multipart-alt.eml").sv()); +} + +BOOST_AUTO_TEST_CASE(multipart_alt_imgs) +{ + AdHoc::FileUtils::MemMap png(fixtures / "blank.png"); + auto text = std::make_shared<TextPart>(Headers { + { "X-Source", "multipart_plain" } + }, "text/plain", text_content); + auto img1 = std::make_shared<BinaryViewPart>(Headers { + { "X-Source", "multipart_html_img1" } + }, "image/png", png.sv<uint8_t>()); + auto img2 = std::make_shared<BinaryCopyPart>(Headers { + { "X-Source", "multipart_html_img2" } + }, "image/png", std::vector<uint8_t>{ png.sv<uint8_t>().begin(), png.sv<uint8_t>().end() }); + auto html = std::make_shared<TextPart>(Headers { + { "X-Source", "multipart_html_main" } + }, "text/html", html_content); + auto htmlrel = std::make_shared<MultiPart>(Headers { + { "X-Source", "multipart_html" } + }, "related", Parts { html, img1, img2 }); + e->content = std::make_shared<MultiPart>(Headers { + { "X-Source", "multipart_top" } + }, "alternative", Parts { text, htmlrel }); + BasicMailServer::writeEmailContent(e, ms); + BOOST_CHECK_EQUAL(ms, AdHoc::FileUtils::MemMap(fixtures / "multipart-alt-imgs.eml").sv()); +} + +BOOST_AUTO_TEST_SUITE_END(); + |