diff options
author | David Bremner <bremner@debian.org> | 2017-11-11 08:46:16 -0400 |
---|---|---|
committer | David Bremner <bremner@debian.org> | 2017-11-11 08:46:16 -0400 |
commit | ddd3f417602bdd5fd55b741900f9450402c6ad02 (patch) | |
tree | 541c8e8e99eff11f58504975dc782d7ee931598b /test/address-test.cc |
Import nullmailer_2.1.orig.tar.gz
[dgit import orig nullmailer_2.1.orig.tar.gz]
Diffstat (limited to 'test/address-test.cc')
-rw-r--r-- | test/address-test.cc | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/test/address-test.cc b/test/address-test.cc new file mode 100644 index 0000000..57652bb --- /dev/null +++ b/test/address-test.cc @@ -0,0 +1,216 @@ +#include "config.h" +#include <ctype.h> +#include "canonicalize.h" +#include "mystring/mystring.h" +#include "address.h" + +#include "fdbuf/fdbuf.h" +#include "itoa.h" + +static bool test(const mystring& in, + const mystring& out, + const mystring& list) +{ + mystring line = in; + mystring tmplist; + if(!parse_addresses(line, tmplist)) { + fout << "Parsing of '" << in << "' failed." << endl; + return false; + } + bool status = true; + if(!!list && tmplist != list) { + fout << "Parsing of '" << in << "' failed: bad result list, was:\n" + << tmplist + << "should be:\n" + << list; + status = false; + } + if(!!out && line != out) { + fout << "Parsing of '" << in << "' failed: bad result string, was:\n" + << line + << "\nshould be:\n" + << out << "\n"; + status = false; + } + return status; +} + +#define TEST(X,Y,Z) do{ ++count; if(!test(X,Y,Z)) ++failed; }while(0) + +mystring defaulthost = "a"; +mystring defaultdomain = "b.c"; + +int main() +{ + int count = 0; + int failed = 0; + // empty list + TEST("", + "", + ""); + // empty list with comment + TEST("(no addresses)", + "(no addresses)", + ""); + // periods in local + TEST("a.b@c.d", + "a.b@c.d", + "a.b@c.d\n"); + // quoted local + TEST("\"e\"@c.d", + "e@c.d", + "e@c.d\n"); + // missing host and domain + TEST("e", + "e@a.b.c", + "e@a.b.c\n"); + // missing domain + TEST("e@x", + "e@x.b.c", + "e@x.b.c\n"); + // trailing period + TEST("e@c.d.", + "e@c.d.", + "e@c.d.\n"); + // trailing period, single domain + TEST("e@c.", + "e@c.", + "e@c.\n"); + // comment <address> style + TEST("x<y@a.b>", + "x <y@a.b>", + "y@a.b\n"); + TEST("<y@a.b>", + "<y@a.b>", + "y@a.b\n"); + // address (comment) style + TEST("y@a.b(x)", + "y@a.b (x)", + "y@a.b\n"); + // internal comments before local + TEST("(j)y@a.b", + "y@a.b (j)", + "y@a.b\n"); + // internal comments after local + TEST("y(j)@a.b", + "y@a.b (j)", + "y@a.b\n"); + // internal comments before domain + TEST("y@(j)a.b", + "y@a.b (j)", + "y@a.b\n"); + // internal comments before period + TEST("y@a(j).b", + "y@a.b (j)", + "y@a.b\n"); + // internal comments after period + TEST("y@a.(j)b", + "y@a.b (j)", + "y@a.b\n"); + // normal list + TEST("a@b.c,d@e.f", + "a@b.c, d@e.f", + "a@b.c\nd@e.f\n"); + // list with comments + TEST("a@b.c(j),d@e.f(k)", + "a@b.c (j), d@e.f (k)", + "a@b.c\nd@e.f\n"); + // list without commas + TEST("a@b.c d@e.f", + "a@b.c, d@e.f", + "a@b.c\nd@e.f\n"); + // list without commas with comments + TEST("a@b.c(j) d@e.f(k)", + "a@b.c (j), d@e.f (k)", + "a@b.c\nd@e.f\n"); + // simple group + TEST("g: a@b.c, d@e.f;", + "g: a@b.c, d@e.f;", + "a@b.c\nd@e.f\n"); + // group with spaces in name + TEST("g h: a@b.c, d@e.f;", + "g h: a@b.c, d@e.f;", + "a@b.c\nd@e.f\n"); + // empty group + TEST("g: ;", + "g: ;", + ""); + // group with a comment + TEST("g: a@b.c(j);", + "g: a@b.c (j);", + "a@b.c\n"); + // group with comments + TEST("g:a@b.c(j),d@e.f(k);", + "g: a@b.c (j), d@e.f (k);", + "a@b.c\nd@e.f\n"); + // group with no commas + TEST("g:a@b.c d@e.f;", + "g: a@b.c, d@e.f;", + "a@b.c\nd@e.f\n"); + // group with route addresses + TEST("g:foo<a@b.c>;", + "g: foo <a@b.c>;", + "a@b.c\n"); + // route-path syntax (stripped) + TEST("f<@g.h:a@b.c>", + "f <a@b.c>", + "a@b.c\n"); + // multiple route-path syntax + TEST("f<@g.h@i.j:a@b.c>", + "f <a@b.c>", + "a@b.c\n"); + // comments with quoted brackets + TEST("(f\\)\\()a@b.c", + "a@b.c (f\\)\\()", + "a@b.c\n"); + // nested comments + TEST("(f(g)h)a@b.c", + "a@b.c (f(g)h)", + "a@b.c\n"); + // simple quoted addresses + TEST("\"a\"@b.c", + "a@b.c", + "a@b.c\n"); + // quoted parts of address + TEST("a.\"b\".c@d.e", + "a.b.c@d.e", + "a.b.c@d.e\n"); + // escaped characters within quotes + TEST("\"s\\'b\"@d.e", + "s'b@d.e", + "s'b@d.e\n"); + // escaped specials + TEST("\"s\\\"a\\\"b\"@d.e", + "\"s\\\"a\\\"b\"@d.e", + "s\"a\"b@d.e\n"); + // twisted syntax + //TEST("\"\\\"d\\\" <\"<@_._:e@f.g>", + // "who knows", + // "e@f.g\n"); + TEST("c@d.e (a.b)", + "c@d.e (a.b)", + "c@d.e\n"); + TEST("\"a.b\" <c@d.e>", + "\"a.b\" <c@d.e>", + "c@d.e\n"); + TEST("Mr. T <c@d.e>", + "Mr. T <c@d.e>", + "c@d.e\n"); + TEST("a.b <c@d.e>", + "a.b <c@d.e>", + "c@d.e\n"); + TEST("Mr . and T <c@d.e>", + "Mr . and T <c@d.e>", + "c@d.e\n"); + // Whitespace in the quoted string + TEST("\"\n f\n \" <a@b.c>", + "f <a@b.c>", + "a@b.c\n"); + TEST("\" a.b\" <c@d.e>", + "\"a.b\" <c@d.e>", + "c@d.e\n"); + + fout << itoa(count) << " tests run, "; + fout << itoa(failed) << " failed." << endl; + return failed; +} |