no mail-dmarc.ini found; using bundled defaults. at t/00.Dmarc.t line 276. no mail-dmarc.ini found; using bundled defaults. at t/00.Dmarc.t line 103. t/00.Dmarc.t ................................. ok 1 - use Mail::DMARC; ok 2 - An object of class 'Mail::DMARC' isa 'Mail::DMARC' ok 3 - An object of class 'Mail::DMARC' isa 'Mail::DMARC' ok 4 - new, empty using ./share/public_suffix_list for Public Suffix List ok 5 - An object of class 'Mail::DMARC' isa 'Mail::DMARC' ok 6 - new, one shot ok 7 - new, individual accessors ok 8 - config file is initialized before assert_ok ok 9 - header_from, spam-example.com ok 10 - header_from, bar.com ok 11 - header_from, test.co.UK ok 12 - header_from, test.CO.za ok 13 - header_from, a.b ok 14 - header_from, a@b.c ok 15 - header_from, f*ct.org ok 16 - envelope_from, example.com ok 17 - dkim, ARRAY(0x64b8657c42a0) ok 18 - header_from, spam-example.com ok 19 - spf, ARRAY(0x64b8657d4938) ok 20 - source_ip, 0.0.0.0 ok 21 - source_ip, 1.1.1.1 ok 22 - source_ip, 255.255.255.255 ok 23 - envelope_to, example.com ok 24 - neg, envelope_to, 3.a ok 25 - neg, source_ip, 0.257.0.25 ok 26 - neg, source_ip, 255.255.255.256 ok 27 - spf, hash set ok 28 - spf, hash set result ok 29 - spf, hashref set ok 30 - spf, hashref set, result ok 31 - spf, arrayref set ok 32 - spf, arrayref set result ok 33 - spf, arrayref set ok 34 - spf, arrayref set result ok 35 - spf, callback set ok 36 - callback not yet called ok 37 - spf, callback-derived result ok 38 - spf, callback-cached result ok 39 - callback exactly once ok 40 - spf, neg, invalid pairs ok 41 - dkim, hash set ok 42 - dkim, hash set result ok 43 - dkim, hashref set ok 44 - dkim, hashref set, result ok 45 - dkim, arrayref set ok 46 - dkim, arrayref set result ok 47 - dkim, arrayref set ok 48 - dkim, arrayref set result ok 49 - dkim, hash set 1 ok 50 - dkim, hash set 2 ok 51 - dkim, iterative hashes ok 52 - dkim, as Mail::DKIM::Verifier ok 53 - dkim, arrayref set ok 54 - callback not yet called ok 55 - dkim, callback-derived result ok 56 - dkim, callback-cached result ok 57 - callback exactly once ok 58 - dkim, neg, invalid pairs ok 59 - dkim, neg, invalid result ok 60 - Zulu Day: Day Start ok 61 - Zulu Day: Day Middle ok 62 - Zulu Day: Day End ok 63 - Zulu Day: Day Next ok 64 - Report Window: Daily Start ok 65 - Report Window: Daily Middle ok 66 - Report Window: Daily End ok 67 - Report Window: Hourly First Start ok 68 - Report Window: Hourly First Middle ok 69 - Report Window: Hourly First End ok 70 - Report Window: Hourly Second Start ok 71 - Report Window: Hourly Second Middle ok 72 - Report Window: Hourly Second End ok 73 - Report Window: Irregular Interval ok 74 - Interval Limit: Below Limit ok 75 - Interval Limit: Lower Limit ok 76 - Interval Limit: Between Limits ok 77 - Interval Limit: Upper Limit ok 78 - Interval Limit: Above Limit ok 79 - Public Suffix: xn--zfr164b ok 80 - Public Suffix: examplebogusdomainname ok 81 - Public Suffix: xn--55qx5d.cn ok 82 - Public Suffix: com 1..82 ok t/01.Policy.t ................................ ok 1 - use Mail::DMARC::Policy; ok 2 - An object of class 'Mail::DMARC::Policy' isa 'Mail::DMARC::Policy' ok 3 - policy, version, neg ok 4 - policy, set ok 5 - policy, version, pos ok 6 - An object of class 'Mail::DMARC::Policy' isa 'Mail::DMARC::Policy' ok 7 - new, empty policy ok 8 - An object of class 'Mail::DMARC::Policy' isa 'Mail::DMARC::Policy' ok 9 - new, with args ok 10 - An object of class 'Mail::DMARC::Policy' isa 'Mail::DMARC::Policy' ok 11 - new, with args ok 12 - policy->is_valid_p, pos, none ok 13 - policy->is_valid_p, pos, reject ok 14 - policy->is_valid_p, pos, quarantine ok 15 - policy->is_valid_p, neg, other ok 16 - policy->is_valid_p, neg, gibberish ok 17 - policy->is_valid_p, neg, non-policy ok 18 - policy->is_valid_p, neg, words ok 19 - policy->is_valid_rf, pos, afrf ok 20 - policy->is_valid_rf, pos, iodef ok 21 - policy->is_valid_rf, neg, ffrf ok 22 - policy->is_valid_rf, neg, i0def ok 23 - policy->is_valid_rf, neg, report ok 24 - An object of class 'Mail::DMARC::Policy' isa 'Mail::DMARC::Policy' ok 25 - parse ok 26 - parse, warns of invalid DMARC record format ok 27 - parse, warns of invalid DMARC record format, with location ok 28 - An object of class 'Mail::DMARC::Policy' isa 'Mail::DMARC::Policy' ok 29 - parse ok 30 - STDERR yields parse warnings ok 31 - rf, iodef ok 32 - rf, afrf ok 33 - rf, IODEF ok 34 - rf, AFRF ok 35 - ruf, https://example.com/dmarc?report!1m ok 36 - psd, y ok 37 - psd, n ok 38 - psd, u ok 39 - psd, Y ok 40 - psd, N ok 41 - psd, U ok 42 - np, none ok 43 - np, reject ok 44 - np, quarantine ok 45 - np, None ok 46 - np, Reject ok 47 - np, Quarantine ok 48 - ri, 0 ok 49 - ri, 1 ok 50 - ri, 1000 ok 51 - ri, 4294967295 ok 52 - rua, http://example.com/pub/dmarc!30m ok 53 - rua, mailto:dmarc-feed@example.com!10m ok 54 - p, none ok 55 - p, reject ok 56 - p, quarantine ok 57 - p, NONE ok 58 - p, REJEcT ok 59 - p, Quarantine ok 60 - adkim, r ok 61 - adkim, s ok 62 - adkim, R ok 63 - adkim, S ok 64 - v, DMARC1 ok 65 - v, dmarc1 ok 66 - sp, none ok 67 - sp, reject ok 68 - sp, quarantine ok 69 - sp, NoNe ok 70 - sp, REjEcT ok 71 - sp, QuarAntine ok 72 - aspf, r ok 73 - aspf, s ok 74 - aspf, R ok 75 - aspf, S ok 76 - fo, 0 ok 77 - fo, 1 ok 78 - fo, d ok 79 - fo, s ok 80 - fo, D ok 81 - fo, S ok 82 - fo, 0:d ok 83 - fo, 0:1:d:s ok 84 - pct, 0 ok 85 - pct, 10 ok 86 - pct, 50 ok 87 - pct, 99 ok 88 - pct, 100 ok 89 - t, y ok 90 - t, n ok 91 - t, Y ok 92 - t, N ok 93 - neg, p, nonense ok 94 - neg, p, silly ok 95 - neg, p, example ok 96 - neg, adkim, relaxed ok 97 - neg, adkim, strict ok 98 - neg, v, DMARC2 ok 99 - neg, aspf, relaxed ok 100 - neg, aspf, strict ok 101 - neg, sp, nones ok 102 - neg, sp, rejection ok 103 - neg, sp, quarrantine ok 104 - neg, pct, -1 ok 105 - neg, pct, f ok 106 - neg, pct, 101 ok 107 - neg, pct, 1.1 ok 108 - neg, pct, 1.0 ok 109 - neg, pct, 5.f1 ok 110 - neg, t, yes ok 111 - neg, t, no ok 112 - neg, t, testing ok 113 - neg, fo, 00 ok 114 - neg, fo, 11 ok 115 - neg, fo, dd ok 116 - neg, fo, ss ok 117 - neg, rf, iodef2 ok 118 - neg, rf, rfrf2 ok 119 - neg, rf, rfrf ok 120 - neg, ruf, mail:msimerson@cnap.org ok 121 - neg, psd, yes ok 122 - neg, psd, no ok 123 - neg, psd, maybe ok 124 - neg, ri, -1 ok 125 - neg, ri, a ok 126 - neg, ri, 4294967296 ok 127 - neg, rua, ftp://example.com/pub ok 128 - neg, rua, torrent://piratebay.net/dmarc ok 129 - neg, np, nones ok 130 - neg, np, rejection ok 131 - neg, np, quarrantine ok 132 - An object of class 'Mail::DMARC::Policy' isa 'Mail::DMARC::Policy' ok 133 - new, empty policy ok 134 - apply_defaults ok 135 - new, with defaults ok 136 - is_valid croaks on empty policy ok 137 - is_valid, 1.4.1 meaningless ok 138 - is_valid, 1.4.3 extra backslashes ok 139 - is_valid, 1.4.4 unknown tag ok 140 - is_valid, 1.4.5 bogus p value ok 141 - is_valid, 1.4.2 smallest record ok 142 - is_valid, pos, w/defaults ok 143 - is_valid, neg, missing p, no rua ok 144 - is_valid, neg, missing p, invalid rua ok 145 - is_valid, pos, implicit p=none w/rua ok 146 - is_valid, psd=y without p is valid ok 147 - is_valid, np=reject psd=n ok 148 - is_valid, neg, invalid np value ok 149 ok 150 - policy is valid: domain=accuquote.com;v=DMARC1;p=none;fo:0;adkim=r;aspf=r;sp=none;rua=mailto:accu_postmaster@accuquote.com ok 151 - policy is valid: domain=targetselect.net;v=DMARC1;p=none;rua=mailto:postmaster@targetselect.net;ruf=mailto:postmaster@targetselect.net;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 152 - policy is valid: domain=1105insight.com;v=DMARC1;p=none;rua=mailto:postmaster@1105insight.com;ruf=mailto:postmaster@1105insight.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 153 - policy is valid: domain=borsheims.net;v=DMARC1;p=none;rua=mailto:postmaster@borsheims.net;ruf=mailto:postmaster@borsheims.net;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 154 - policy is valid: domain=consumersilver.com;v=DMARC1;p=none;rua=mailto:postmaster@consumersilver.com;ruf=mailto:postmaster@consumersilver.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 155 - policy is valid: domain=coppermail-usa.com;v=DMARC1;p=none;rua=mailto:postmaster@coppermail-usa.com;ruf=mailto:postmaster@coppermail-usa.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 156 - policy is valid: domain=eglancesender.com;v=DMARC1;p=none;rua=mailto:postmaster@eglancesender.com;ruf=mailto:postmaster@eglancesender.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 157 - policy is valid: domain=egroupconsumer.com;v=DMARC1;p=none;rua=mailto:postmaster@egroupconsumer.com;ruf=mailto:postmaster@egroupconsumer.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 158 - policy is valid: domain=eselectsender.com;v=DMARC1;p=none;rua=mailto:postmaster@eselectsender.com;ruf=mailto:postmaster@eselectsender.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 159 - policy is valid: domain=filemail.com;v=DMARC1;p=none;rua=mailto:admin@filemail.com;ruf=mailto:admin@filemail.com;fo:0;adkim=r;aspf=r ok 160 - policy is valid: domain=fisherprograms.com;v=DMARC1;p=none;rua=mailto:postmaster@fisherprograms.com;ruf=mailto:postmaster@fisherprograms.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 161 - policy is valid: domain=mail-peninsula.com;v=DMARC1;p=none;rua=mailto:umesh@force24.co.uk;ruf=mailto:umesh@force24.co.uk;fo:0;adkim=r;aspf=r;pct=100;rf=afrf;ri=86000;sp=none ok 162 - policy is valid: domain=sendergroup.com;v=DMARC1;p=none;rua=mailto:postmaster@sendergroup.com;ruf=mailto:postmaster@sendergroup.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 163 - policy is valid: domain=targetselection.com;v=DMARC1;p=none;rua=mailto:postmaster@targetselection.com;ruf=mailto:postmaster@targetselection.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 164 - policy is valid: domain=trondheim-redcross.no;v=DMARC1;p=none;rua=mailto:postmaster@trondheim-redcross.no;ruf=mailto:johess@trondheim-redcross.no;fo:0;adkim=r;aspf=r;pct=100;rf=afrf;ri=86400;sp=none ok 165 - policy is valid: domain=vsender-2.com;v=DMARC1;p=none;rua=mailto:postmaster@vsender-2.com;ruf=mailto:postmaster@vsender-2.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 166 - policy is valid: domain=vsender-3.com;v=DMARC1;p=none;rua=mailto:postmaster@vsender-3.com;ruf=mailto:postmaster@vsender-3.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 167 - policy is valid: domain=wfyi.org;v=DMARC1;p=none;rua=mailto:dmarc1630@wfyi.org;ruf=mailto:dmarc1630@wfyi.org;fo:0;adkim=r;aspf=r;pct=100;rf=afrf;ri=86400;sp=none ok 168 - policy is valid: domain=wk1business.com;v=DMARC1;p=none;rua=mailto:postmaster@wk1business.com;ruf=mailto:postmaster@wk1business.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 169 - policy is valid: domain=teogenes.com.br;v=DMARC1;p=quarantine;rua=mailto:retorno@teogenes.com.br;fo:1:d;adkim=r;aspf=r;rf=afrf;sp=quarantine ok 170 - policy is valid: domain=wkcplatnium.com;v=DMARC1;p=none;rua=mailto:postmaster@wkcplatnium.com;ruf=mailto:postmaster@wkcplatnium.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 171 - policy is valid: domain=brightworksgroup.net;v=DMARC1;p=none;0;adkim=r;aspf=r ok 172 - policy is valid: domain=bronzemail-usa.com;v=DMARC1;p=none;rua=mailto:postmaster@bronzemail-usa.com;ruf=mailto:postmaster@bronzemail-usa.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 173 - policy is valid: domain=driveconsumer.com;v=DMARC1;p=none;rua=mailto:postmaster@driveconsumer.com;ruf=mailto:postmaster@driveconsumer.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 174 - policy is valid: domain=econnect1.com;v=DMARC1;p=none;rua=mailto:postmaster@econnect1.com;ruf=mailto:postmaster@econnect1.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 175 - policy is valid: domain=esender1.com;v=DMARC1;p=none;rua=mailto:postmaster@esender1.com;ruf=mailto:postmaster@esender1.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 176 - policy is valid: domain=esender3.com;v=DMARC1;p=none;rua=mailto:postmaster@esender3.com;ruf=mailto:postmaster@esender3.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 177 - policy is valid: domain=lns.com;v=DMARC1;p=none;rua=mailto:dmarc@lns.com;ruf=mailto:dmarc@lns.com;0;adkim=r;aspf=r;pct=100;rf=afrf;ri=86400;sp=none ok 178 - policy is valid: domain=my-dear-lady.com;v=DMARC1;p=none;rua=mailto:postmaster@my-dear-lady.com;ruf=mailto:postmaster@my-dear-lady.com;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 179 - policy is valid: domain=theluxurycloset.info;v=DMARC1;p=reject;adkim=s;aspf=r;rf=afrf;;pct=100 ok 180 - policy is valid: domain=newsletter.ironpony.net;v=DMARC1;p=none;rua=mailto:postmaster@newsletter.ironpony.net;ruf=mailto:postmaster@newsletter.ironpony.net;adkim=r;aspf=r;pct=100;rf:afrf;ri=86400;sp=none ok 181 - policy is valid: domain=cmnet.org;v=DMARC1;p=none;sp=none;rua=mailto:postmaster@cmnet.org!10m;;pct=100;ri=86400 ok 182 - policy is valid: domain=coachingcompass.com;v=DMARC1;p=quarantine;rua=mailto:dan@darau.com;ruf=mailto:dan@darau.com;1:d:s;adkim=r;aspf=r;rf=afrf;sp=quarantine ok 183 - policy is valid: domain=genetex.com;v=DMARC1;p=none;sp-none;rua=mailto:postmaster@genetex.com!1m;ruf=mailto:postmaster@genetex.com!1m;rf=afrf;pct=100;ri=86400 1..183 ok no mail-dmarc.ini found; using bundled defaults. at t/03.Base.t line 23. t/03.Base.t .................................. ok 1 - use Mail::DMARC::Base; ok 2 - An object of class 'Mail::DMARC::Base' isa 'Mail::DMARC::Base' ok 3 - An object of class 'Config::Tiny' isa 'Config::Tiny' ok 4 - An object of class 'Net::DNS::Resolver' isa 'Net::DNS::Resolver' ok 5 - invalid config file ok 6 - alternate config file ok 7 - any_inet_pton, 1.1.1.1 ok 8 - any_inet_ntop, 1.1.1.1 ok 9 - any_inet_ntop, 1.1.1.1 ok 10 - any_inet_pton, 10.0.1.1 ok 11 - any_inet_ntop, 10.0.1.1 ok 12 - any_inet_ntop, 10.0.1.1 ok 13 - any_inet_pton, 2002:4c79:6240::1610:9fff:fee5:fb5 ok 14 - any_inet_ntop, 2002:4c79:6240::1610:9fff:fee5:fb5 ok 15 - any_inet_ntop, 2002:4c79:6240::1610:9fff:fee5:fb5 ok 16 - any_inet_pton, 2607:f060:b008:feed::6 ok 17 - any_inet_ntop, 2607:f060:b008:feed::6 ok 18 - any_inet_ntop, 2607:f060:b008:feed::6 using ./share/public_suffix_list for Public Suffix List ok 19 - is_public_suffix, neg, a ok 20 - is_public_suffix, neg, z ok 21 - is_public_suffix, pos, net ok 22 - is_public_suffix, neg, tnpi.net ok 23 - is_public_suffix, pos, com ok 24 - is_public_suffix, neg, *.uk ok 25 - is_public_suffix, pos, test.sch.uk ok 26 - is_public_suffix, neg, sch.uk ok 27 - is_public_suffix, neg, google.com ok 28 - is_public_suffix, pos, co.uk ok 29 - is_public_suffix, neg, www.tnpi.net ok 30 - has_dns_rr, NS:fake.mail-dmarc.tnpi.net ok 31 - is_valid_ip, 0.0.0.0 ok 32 - is_valid_ip, 1.1.1.1 ok 33 - is_valid_ip, 255.255.255.255 ok 34 - is_valid_ip, 2607:f060:b008:feed::2 ok 35 - is_valid_ip, neg, 256.1.1.1 ok 36 - is_valid_ip, neg, a ok 37 - is_valid_ip, neg, 1.1.1.256 ok 38 - is_valid_ip, neg, 1.1.1 ok 39 - is_valid_domain, test.sch.uk ok 40 - is_valid_domain, example.com ok 41 - is_valid_domain, bbc.co.uk ok 42 - is_valid_domain, 3.am ok 43 - is_valid_domain, example.m ok 44 - is_valid_domain, bbc.co.k ok 45 - is_valid_domain, 3.a ok 46 - epoch_to_iso, 2026-09-01T12:16:14 ok 47 - get_prefix: /usr/local/, /opt/local/, /, ./ ok 48 - get_prefix(etc): /usr/local/etc, /opt/local/etc, /etc, ./etc ok 49 - get_prefix(share): /usr/local/share, /opt/local/share, /share, ./share ok 50 - get_config finds mail-dmarc.ini in etc/mail/ ok 51 - get_config warns when falling back to bundled defaults ok 52 - get_sharefile: /tmp/O3znVRHCpc/auto/share/dist/Mail-DMARC/mail-dmarc.ini ok 53 - Public Suffix List cached ok 54 - Public Suffix List loaded using ./share/public_suffix_list for Public Suffix List using ./share/public_suffix_list for Public Suffix List using ./share/public_suffix_list for Public Suffix List ok 55 - Public Suffix List reloaded ok 56 - Public Suffix List reloaded true return using ./share/public_suffix_list for Public Suffix List ok 57 - Public Suffix List reloaded false return 1..57 ok no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 449. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 529. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 529. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 540. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 559. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 559. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 559. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 559. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 559. no mail-dmarc.ini found; using bundled defaults. at t/04.PurePerl.t line 559. no mail-dmarc.ini found; using bundled defaults. at lib/Mail/DMARC/Report.pm line 70. no mail-dmarc.ini found; using bundled defaults. at lib/Mail/DMARC/Report.pm line 70. t/04.PurePerl.t .............................. ok 1 - use Mail::DMARC::PurePerl; ok 2 - An object of class 'Mail::DMARC::PurePerl' isa 'Mail::DMARC::PurePerl' using ./share/public_suffix_list for Public Suffix List ok 3 - get_from_dom, example.com eq example.com ok 4 - get_from_dom, From: "Test 1.1.5", invalid header_from at t/04.PurePerl.t line 673. ok 5 - get_from_dom, example.com eq example.com ok 6 - get_from_dom, example.com eq example.com ok 7 - get_from_dom, example.com eq example.com ok 8 - get_from_dom, example.com eq example.com ok 9 - get_from_dom, example.com eq example.com ok 10 - get_from_dom, example.com eq example.com ok 11 - get_from_dom, Sample User ,Sample2, ok 12 - get_from_dom, example.com eq example.com ok 13 - fetch_dmarc_record, non-exist ok 14 - fetch_dmarc_record ok 15 - fetch_dmarc_record, 1.2.4 TLD lookup not allowed ok 16 - get_organizational_domain, mail-dmarc.tnpi.net ok 17 - get_organizational_domain, bbc.co.uk ok 18 - get_organizational_domain, sub.anchor.dmarctest.net ok 19 - get_organizational_domain, www.tnpi.net ok 20 - get_organizational_domain, tnpi.net ok 21 - get_organizational_domain, anchor.dmarctest.net ok 22 - tree_walk, psd=n anchor: record found ok 23 - tree_walk, psd=n: org = anchor domain ok 24 - tree_walk, psd=n: at = anchor domain ok 25 - tree_walk, psd=n anchor: record found for subdomain ok 26 - tree_walk, subdomain walks to anchor ok 27 - tree_walk, psd=y: record found ok 28 - tree_walk, psd=y: org = domain below PSD ok 29 - tree_walk, psd=y: deep author resolves org to PSD child ok 30 - tree_walk, no records: record is undef ok 31 - tree_walk, no records: org is undef (PSL fallback in get_org_dom) ok 32 - tree_walk, cache populated ok 33 - tree_walk, cached result correct ok 34 - exists_in_dns, fake.mail-dmarc.tnpi.net ok 35 - exists_in_dns, tnpi.net ok 36 - exists_in_dns, txtonly.dmarctest.net ok 37 - exists_in_dns, no-such-made-up-name-should-exist.com.uk.nonsense ok 38 - no-such-made-up-name-should-exist.com.uk.nonsense, result none ok 39 - no-such-made-up-name-should-exist.com.uk.nonsense, disposition none ok 40 - no-such-made-up-name-should-exist.com.uk.nonsense, reason not in DNS ok 41 - spf, set header_from ok 42 - spf, set spf ok 43 - is_spf_aligned ok 44 - is_spf_aligned, strict ok 45 - spf, set spf ok 46 - spf alignment->r ok 47 - is_spf_aligned, relaxed ok 48 - is_spf_aligned, relaxed ok 49 - spf, set spf ok 50 - is_spf_aligned, neg ok 51 - dkim, set header_from ok 52 - dkim, setup ok 53 - is_dkim_aligned, strict ok 54 - dkim, set header_from ok 55 - is_dkim_aligned, relaxed ok 56 - dkim, set header_from ok 57 - is_dkim_aligned, miss ok 58 - dkim, no signatures ok 59 - is_dkim_aligned, empty ok 60 - dkim, setup ok 61 - dkim, set header_from ok 62 - is_dkim_aligned, relaxed ok 63 - dkim, set header_from ok 64 - is_dkim_aligned, miss ok 65 - is_aligned, both ok 66 - is_aligned, spf ok 67 - is_aligned, dkim ok 68 - is_aligned, none ok 69 - is_whitelisted, 127.0.0.1, local_policy ok 70 - is_whitelisted, 127.0.0.3, trusted_forwarder ok 71 - is_whitelisted, neg, 127.0.0.2 ok 72 - is_whitelisted, neg, 10.0.0.0 ok 73 - discover_policy ok 74 - discover_policy, deeply ok 75 - discover_policy, is_subdomain ok 76 - fetch_dmarc_record, is_subdomain ok 77 - validate, one-shot, is_spf_aligned, yes ok 78 - validate, one-shot, is_dkim_aligned, no ok 79 - validate t=y, validate() did not die ok 80 - validate t=y, result exists ok 81 - validate t=y, disposition downgraded from reject to quarantine ok 82 - DMARC result is pass ok 83 - DMARC result is none ok 84 - psd=y: result is fail (alignment failed) ok 85 - psd=y: disposition is none (no p= → default none) ok 86 - psd=y: published policy has p=none after discover_policy ok 87 - psd=y: no uninitialized-value warnings ok 88 - np tag: existing subdomain uses p=none ok 89 - np tag: TXT-only subdomain treated as existing (p=none, not np=reject) ok 90 - np tag: non-existent subdomain uses np=reject ok 91 - np absent: NXDOMAIN subdomain uses sp=quarantine ok 92 - np=none: NXDOMAIN subdomain disposition is none ok 93 - np+t=y: NXDOMAIN subdomain reject downgraded by t=y ok 94 - has_valid_reporting_uri, mailto:dmarc@example.com ok 95 - has_valid_reporting_uri, mailto:dmarc@example.com,http://example.com/dmarc ok 96 - has_valid_reporting_uri, ftp://dmarc.example.com,http://example.com/dmarc ok 97 - has_valid_reporting_uri, single filtered ok 98 - has_valid_reporting_uri, neg, ftp://ftp.example.com ok 99 - has_valid_reporting_uri, neg, gopher://www.example.com/dmarc ok 100 - has_valid_reporting_uri, neg, scp://secure.example.com ok 101 - has_valid_reporting_uri, neg, http://www.example.com/dmarc ok 102 - new policy ok 103 - new URI ok 104 - external_report, mailto:test@example.com for example.com ok 105 - new policy ok 106 - new URI ok 107 - external_report, mailto:test@silly.com for silly.com ok 108 - new policy ok 109 - new URI ok 110 - external_report, mailto:test@example.com for example.com.com ok 111 - new policy ok 112 - new URI ok 113 - external_report, mailto:test@silly.com for silly.com.com ok 114 - new policy ok 115 - verify_external_reporting, tnpi.net, theartfarm.com ok 116 - new policy ok 117 - verify_external_reporting, cadillac.net, theartfarm.com ok 118 - new policy ok 119 - verify_external_reporting, mail-dmarc.tnpi.net, theartfarm.com ok 120 - verify_external_reporting, override rua ok 121 - discover_policy ok 122 - result is a ref ok 123 - result=pass ok 124 - spf=pass ok 125 - disposition=none ok 126 - disposition changed to reject ok 127 - added reason ok 128 - added reason 2 ok 129 - save aggregate 1..129 ok no mail-dmarc.ini found; using bundled defaults. at t/06.Result.t line 49. t/06.Result.t ................................ ok 1 - use Mail::DMARC::PurePerl; ok 2 - use Mail::DMARC::Result; ok 3 - An object of class 'Mail::DMARC::Result' isa 'Mail::DMARC::Result' using ./share/public_suffix_list for Public Suffix List ok 4 - result, pass, strict, tnpi.net ok 5 - pass, relaxed, tnpi.net ok 6 - is_dkim_aligned, neg ok 7 - is_spf_aligned, neg ok 8 - is_aligned, neg ok 9 - result, fail, strict, tnpi.net ok 10 - is_dkim_aligned, neg ok 11 - is_spf_aligned, neg ok 12 - is_aligned, neg ok 13 - result, fail, strict, tnpi.net ok 14 - is_dkim_aligned, neg ok 15 - is_spf_aligned, neg ok 16 - is_aligned, neg ok 17 - result, fail, strict, tnpi.net ok 18 - is_dkim_aligned, neg ok 19 - is_spf_aligned, neg ok 20 - is_aligned, neg ok 21 - result, fail, strict, sampled out (pct ignored), tnpi.net ok 22 # skip DNS returned 'interesting' results for invalid domain ok 23 - result, fail, nonexist ok 24 - disposition, none ok 25 - disposition, reject ok 26 - disposition, quarantine ok 27 - disposition, NONE ok 28 - disposition, REJECT ok 29 - disposition, QUARANTINE ok 30 - disposition, neg, non ok 31 - disposition, neg, rejec ok 32 - disposition, neg, quarantin ok 33 - disposition, neg, NON ok 34 - disposition, neg, REJEC ok 35 - disposition, neg, QUARANTIN ok 36 - dkim, pass ok 37 - dkim, fail ok 38 - dkim, PASS ok 39 - dkim, FAIL ok 40 - dkim, neg, pas ok 41 - dkim, neg, fai ok 42 - dkim, neg, PAS ok 43 - dkim, neg, FAI ok 44 - dkim_align, strict ok 45 - dkim_align, relaxed ok 46 - dkim_align, STRICT ok 47 - dkim_align, RELAXED ok 48 - dkim_align, neg, stric ok 49 - dkim_align, neg, relaxe ok 50 - dkim_align, neg, STRIC ok 51 - dkim_align, neg, RELAXE ok 52 - spf, pass ok 53 - spf, fail ok 54 - spf, PASS ok 55 - spf, FAIL ok 56 - spf, neg, pas ok 57 - spf, neg, fai ok 58 - spf, neg, PAS ok 59 - spf, neg, FAI ok 60 - spf_align, strict ok 61 - spf_align, relaxed ok 62 - spf_align, STRICT ok 63 - spf_align, RELAXED ok 64 - spf_align, neg, stric ok 65 - spf_align, neg, relaxe ok 66 - spf_align, neg, STRIC ok 67 - spf_align, neg, RELAXE ok 68 - result, pass ok 69 - result, fail ok 70 - result, PASS ok 71 - result, FAIL ok 72 - result, neg, pas ok 73 - result, neg, fai ok 74 - result, neg, PAS ok 75 - result, neg, FAI ok 76 - reason type: forwarded ok 77 - reason type: sampled_out ok 78 - reason type: trusted_forwarder ok 79 - reason type: mailing_list ok 80 - reason type: local_policy ok 81 - reason type: other ok 82 - reason, any ok 83 - reason, reason ok 84 - reason, not ok 85 - reason, in ok 86 - reason, above ok 87 - reason, list ok 88 - dkim_meta ok 89 - published croaks when policy not set ok 90 - published croaks when policy has no domain 1..90 ok t/07.GetterSetter.Undef.t .................... ok 1 - Mail::DMARC::local_policy stores initial value ok 2 - Mail::DMARC::local_policy clears with explicit undef ok 3 - Mail::DMARC::source_ip treats explicit undef as a setter ok 4 - Mail::DMARC::Base::verbose stores initial value ok 5 - Mail::DMARC::Base::verbose clears with explicit undef ok 6 - Mail::DMARC::Result::Reason::comment stores initial value ok 7 - Mail::DMARC::Result::Reason::comment clears with explicit undef ok 8 - Mail::DMARC::Result::Reason::type treats explicit undef as a setter ok 9 - Mail::DMARC::Result::dkim_meta stores initial value ok 10 - Mail::DMARC::Result::dkim_meta clears with explicit undef ok 11 - Mail::DMARC::Result::result treats explicit undef as a setter ok 12 - Mail::DMARC::Policy::domain stores initial value ok 13 - Mail::DMARC::Policy::domain clears with explicit undef ok 14 - Mail::DMARC::Policy::p treats explicit undef as a setter ok 15 - Mail::DMARC::Report::Aggregate::Record::Identifiers::header_from stores initial value ok 16 - Mail::DMARC::Report::Aggregate::Record::Identifiers::header_from clears with explicit undef ok 17 - Mail::DMARC::Report::Aggregate::Record::Row::Policy_Evaluated::dkim stores initial value ok 18 - Mail::DMARC::Report::Aggregate::Record::Row::Policy_Evaluated::dkim clears with explicit undef ok 19 - Mail::DMARC::Report::Aggregate::Record::Row::Policy_Evaluated::disposition treats explicit undef as a setter ok 20 - Mail::DMARC::Report::Aggregate::Record::Row::count stores initial value ok 21 - Mail::DMARC::Report::Aggregate::Record::Row::count clears with explicit undef ok 22 - Mail::DMARC::Report::Aggregate::Record::Auth_Results::SPF::result treats explicit undef as a setter ok 23 - Mail::DMARC::Report::Aggregate::Record::Auth_Results::DKIM::human_result stores initial value ok 24 - Mail::DMARC::Report::Aggregate::Record::Auth_Results::DKIM::human_result clears with explicit undef ok 25 - Mail::DMARC::Report::Aggregate::Metadata::report_id stores initial value ok 26 - Mail::DMARC::Report::Aggregate::Metadata::report_id clears with explicit undef ok 27 - Mail::DMARC::Report::Aggregate::Metadata::begin stores initial value ok 28 - Mail::DMARC::Report::Aggregate::Metadata::begin clears with explicit undef 1..28 ok no mail-dmarc.ini found; using bundled defaults. at lib/Mail/DMARC/HTTP.pm line 181. no mail-dmarc.ini found; using bundled defaults. at lib/Mail/DMARC/HTTP.pm line 190. no mail-dmarc.ini found; using bundled defaults. at lib/Mail/DMARC/HTTP.pm line 190. no mail-dmarc.ini found; using bundled defaults. at t/09.HTTP.t line 62. t/09.HTTP.t .................................. ok 1 - use Mail::DMARC::HTTP; ok 2 - An object of class 'Mail::DMARC::HTTP' isa 'Mail::DMARC::HTTP' Content-Type: application/json {"err":"missing POST data"} ok 3 - serve_validator, missing POST data Content-Type: application/json {"err":"'false' expected, at character offset 0 (before \"foo\") at lib/Mail/DMARC/HTTP.pm line 170.\n"} ok 4 - serve_validator, invalid JSON Content-Type: application/json {"disposition":"none","dkim":"","reason":[{"comment":"no header_from","type":"other"}],"result":"fail","spf":""} ok 5 - serve_validator, missing header_from Content-Type: application/json using ./share/public_suffix_list for Public Suffix List {"disposition":"reject","published":{"v":"DMARC1","domain":"tnpi.net","ruf":"mailto:dmarc-feedback@theartfarm.com","pct":"100","p":"reject","rua":"mailto:dmarc-feedback@theartfarm.com"},"reason":[],"dkim":"fail","result":"fail","spf":""} ok 6 - serve_validator, missing SPF ok 7 - serve_validator, missing DKIM Content-Type: application/json {"spf":"pass","reason":[],"dkim":"fail","result":"pass","published":{"rua":"mailto:dmarc-feedback@theartfarm.com","p":"reject","ruf":"mailto:dmarc-feedback@theartfarm.com","pct":"100","domain":"tnpi.net","v":"DMARC1"},"disposition":"none","spf_align":"strict"} ok 8 - serve_validator, pass SPF ok 9 - serve_validator, missing DKIM Content-Type: application/json {"spf":"","dkim_align":"strict","result":"pass","published":{"rua":"mailto:dmarc-feedback@theartfarm.com","ruf":"mailto:dmarc-feedback@theartfarm.com","pct":"100","p":"reject","domain":"tnpi.net","v":"DMARC1"},"disposition":"none","dkim_meta":{"identity":"","selector":"mar2013","domain":"tnpi.net"},"reason":[],"dkim":"pass"} ok 10 - serve_validator, missing SPF ok 11 - serve_validator, pass DKIM ok 12 - post_max, default when no config is loaded ok 13 - post_max, from config ok 14 - post_max, falls back on '' ok 15 - post_max, falls back on 'lots' ok 16 - post_max, falls back on '-1' ok 17 - post_max, falls back on '0' ok 18 - post_max, falls back on '00' ok 19 - post_max, falls back on '01' ok 20 - post_max, falls back on '007' ok 21 - post_max, falls back on ' 8' ok 22 - post_max, falls back on '8 ' ok 23 - post_max, falls back on '1e6' ok 24 - read_post_body, undef over post_max ok 25 - serve_validator, refuses over post_max ok 26 - discard_post_body, drains the body ok 27 - discard_post_body, leaves a huge body unread ok 28 - warn_unusable_post_max, warns on '0' ok 29 - warn_unusable_post_max, warns on '00' ok 30 - warn_unusable_post_max, warns on '01' ok 31 - warn_unusable_post_max, warns on '20M' ok 32 - warn_unusable_post_max, warns on '-1' ok 33 - warn_unusable_post_max, warns on '1e6' ok 34 - warn_unusable_post_max, silent on undef ok 35 - warn_unusable_post_max, silent on ok 36 - warn_unusable_post_max, silent on 4096 ok 37 - agg_params, window defaults ok 38 - agg_params, default window is 30 days ok 39 - agg_params, since honored ok 40 - agg_params, until honored ok 41 - agg_params, rejects since=abc ok 42 - agg_params, rejects since=1e9 ok 43 - agg_params, rejects since=2024-01-01 ok 44 - agg_params, rejects since=12; DROP TABLE report ok 45 - agg_params, rejects since=99999999999999 ok 46 - agg_params, start ok 47 - agg_params, length ok 48 - agg_params, from_domain ok 49 - agg_params, source_ip ok 50 - agg_params, sort_col ok 51 - agg_params, drops unknown params ok 52 - agg_params, drops empty params ok 53 - agg_params, drops oversized string ok 54 - agg_params, drops undef ok 55 - serve_file, no file served outside share for /dmarc/../../META.json ok 56 - serve_file, rejects /dmarc/../../META.json ok 57 - serve_file, no file served outside share for /dmarc/js/../../../META.json ok 58 - serve_file, rejects /dmarc/js/../../../META.json ok 59 - serve_file, no file served outside share for /dmarc/./../META.json ok 60 - serve_file, rejects /dmarc/./../META.json ok 61 - serve_file, no file served outside share for /dmarc/..%2f..%2fMETA.json ok 62 - serve_file, rejects /dmarc/..%2f..%2fMETA.json ok 63 - serve_file, no file served outside share for /dmarc/....//META.json ok 64 - serve_file, rejects /dmarc/....//META.json ok 65 - serve_file, no file served outside share for /dmarc/.hidden.js ok 66 - serve_file, rejects /dmarc/.hidden.js ok 67 - serve_file, no file served outside share for /dmarc//index.html ok 68 - serve_file, rejects /dmarc//index.html ok 69 - serve_file, serves /dmarc/dmarc.css ok 70 - serve_file, /dmarc/dmarc.css has content ok 71 - serve_file, serves /dmarc/index.html ok 72 - serve_file, /dmarc/index.html has content ok 73 - serve_file, serves /dmarc/js/app.js ok 74 - serve_file, /dmarc/js/app.js has content ok 75 - serve_file, rejects an extension with no mime type 1..75 ok t/10.Report.t ................................ ok 1 - use Mail::DMARC::PurePerl; ok 2 - An object of class 'Mail::DMARC::PurePerl' isa 'Mail::DMARC::PurePerl' ok 3 - An object of class 'Mail::DMARC::Report' isa 'Mail::DMARC::Report' ok 4 - An object of class 'Mail::DMARC::Report::Send' isa 'Mail::DMARC::Report::Send' ok 5 - An object of class 'Mail::DMARC::Report::Store' isa 'Mail::DMARC::Report::Store' ok 6 - An object of class 'Mail::DMARC::Report::Receive' isa 'Mail::DMARC::Report::Receive' ok 7 - compress_report ok 8 - compress_report, extracts 1..8 ok no mail-dmarc.ini found; using bundled defaults. at t/11.Report.Store.t line 36. no mail-dmarc.ini found; using bundled defaults. at t/11.Report.Store.t line 58. no mail-dmarc.ini found; using bundled defaults. at t/11.Report.Store.t line 44. t/11.Report.Store.t .......................... ok 1 - use Mail::DMARC::PurePerl; ok 2 - An object of class 'Mail::DMARC::PurePerl' isa 'Mail::DMARC::PurePerl' ok 3 - An object of class 'Mail::DMARC::Report' isa 'Mail::DMARC::Report' ok 4 - An object of class 'Mail::DMARC::Report::Store' isa 'Mail::DMARC::Report::Store' ok 5 - selected backend loaded using ./share/public_suffix_list for Public Suffix List ok 6 - header_from ok 7 - envelope_to ok 8 - source_ip ok 9 - pub ok 10 - result, pass, strict, tnpi.net ok 11 - reason 1..11 ok t/12.Report.Store.SQL.t ...................... ok 1 - Store::SQL loads Mail::DMARC::Policy ok 2 - Store::SQL loads Mail::DMARC::Report::Aggregate::Record ok 3 - use Mail::DMARC::Report::Store::SQL; ok 4 - An object of class 'Mail::DMARC::Report::Store::SQL' isa 'Mail::DMARC::Report::Store::SQL' ok 5 - db_connect: SQLite ok 6 - An object of class 'DBIx::Simple' isa 'DBIx::Simple' ok 7 - An object of class 'Mail::DMARC::Report::Store::SQL::Grammars::SQLite' isa 'Mail::DMARC::Report::Store::SQL::Grammars::SQLite' ok 8 - query_insert, report, 1 ok 9 - delete_report, report, 1 ok 10 - query_insert, neg, bad table ok 11 - query_insert, neg, bad column ok 12 - STDERR has expected warning (SQLite) ok 13 - replace, negative ok 14 - delete, negative ok 15 - query ok 16 - query, select, report ok 17 - query, select, author ok 18 - query, select, domain ok 19 - query, select, report_record ok 20 - query, select, negative ok 21 - meta, end, set ok 22 - meta, email, set ok 23 - meta, begin, set ok 24 - meta, org_name, set ok 25 - policy, rua, set ok 26 - policy, domain, set ok 27 - policy published, set ok 28 - get_report_id, 2 ok 29 - any_inet_pton, 1.1.1.1 ok 30 - any_inet_ntop, 1.1.1.1 ok 31 - any_inet_ntop, round_trip, 1.1.1.1 ok 32 - records_retrieved ok 33 - any_inet_ntop, round_trip, 1.1.1.1 ok 34 - any_inet_pton, 10.0.1.1 ok 35 - any_inet_ntop, 10.0.1.1 ok 36 - any_inet_ntop, round_trip, 10.0.1.1 ok 37 - records_retrieved ok 38 - any_inet_ntop, round_trip, 10.0.1.1 ok 39 - any_inet_pton, 2002:4c79:6240::1610:9fff:fee5:fb5 ok 40 - any_inet_ntop, 2002:4c79:6240::1610:9fff:fee5:fb5 ok 41 - any_inet_ntop, round_trip, zero-pad, 2002:4c79:6240::1610:9fff:fee5:fb5 ok 42 - records_retrieved ok 43 - any_inet_ntop, round_trip, zero-pad, 2002:4c79:6240::1610:9fff:fee5:fb5 ok 44 - any_inet_pton, 2607:f060:b008:feed::6 ok 45 - any_inet_ntop, 2607:f060:b008:feed::6 ok 46 - any_inet_ntop, round_trip, 2607:f060:b008:feed::6 ok 47 - records_retrieved ok 48 - any_inet_ntop, round_trip, 2607:f060:b008:feed::6 ok 49 - insert_policy_published ok 50 - get_report_policy_published ok 51 - get_report_policy_published, deeply ok 52 - insert_rr, 5 ok 53 - at_test_insert_rr_spf with 5 ok 54 - insert_rr_spf ok 55 - insert_rr_spf ok 56 - insert_rr_spf ok 57 - at_test_insert_rr_dkim with 5 ok 58 - insert_rr_dkim ok 59 - insert_rr_dkim ok 60 - insert_rr_dkim ok 61 - at_test_insert_rr_reason with 5 ok 62 - insert_rr_reason, forwarded ok 63 - insert_rr_reason, local_policy ok 64 - insert_rr_reason, mailing_list ok 65 - insert_rr_reason, other ok 66 - insert_rr_reason, sampled_out ok 67 - insert_rr_reason, trusted_forwarder ok 68 - retrieve, 1 ok 69 - retrieve, author, 1 ok 70 - retrieve, end, 1 ok 71 - retrieve, rid, 1 ok 72 - retrieve, begin, 1 ok 73 - retrieve, from_domain, 1 ok 74 - retrieve, negate author excludes nothing when non-matching ok 75 - retrieve, negate from_domain excludes nothing when non-matching ok 76 - retrieve, negate author excludes matching records ok 77 - retrieve supports sort and limit ok 78 - retrieve falls back to default sort options for invalid values ok 79 - retrieve croaks when limit is zero ok 80 - retrieve croaks when limit is non-numeric ok 81 - retrieve_todo ok 82 - next_todo returns cached report ok 83 - next_todo returns undef when cached list is exhausted ok 84 - next_todo clears exhausted cache ok 85 - meta, email, set ok 86 - meta, org_name, set ok 87 - meta, end, set ok 88 - meta, begin, set ok 89 - policy, rua, set ok 90 - policy, domain, set ok 91 - policy published, set ok 92 - get_report_id, 3 ok 93 - meta, email, set ok 94 - meta, org_name, set ok 95 - meta, begin, set ok 96 - meta, end, set ok 97 - policy, rua, set ok 98 - policy, domain, set ok 99 - policy published, set ok 100 - get_report_id, 4 ok 101 - meta, end, set ok 102 - meta, begin, set ok 103 - meta, email, set ok 104 - meta, org_name, set ok 105 - policy, rua, set ok 106 - policy, domain, set ok 107 - policy published, set ok 108 - get_report_id, 5 ok 109 - get_report, no limits, 4 ok 110 - skipping author tests ok 111 - get_row_reason ok 112 - get_row_spf ok 113 - get_row_dkim ok 114 - populate_agg_metadata ok 115 - populate_agg_metadata, deeply ok 116 - populate_agg_records ok 117 - populate_agg_records, deeply ok 118 - test_aggregates, report created, 6 ok 119 - get_timeseries, one day bucket ok 120 - get_timeseries, day is 1699920000 ok 121 - get_timeseries, 2190 messages ok 122 - get_summary, aligned_both is 1985 ok 123 - get_summary, aligned_dkim is 40 ok 124 - get_summary, aligned_none is 165 ok 125 - get_summary, aligned_spf is 0 ok 126 - get_summary, days is 1 ok 127 - get_summary, disp_none is 2047 ok 128 - get_summary, disp_quarantine is 25 ok 129 - get_summary, disp_reject is 118 ok 130 - get_summary, dmarc_pass is 2025 ok 131 - get_summary, messages is 2190 ok 132 - get_summary, alignment buckets partition volume ok 133 - get_summary, dispositions partition volume ok 134 - get_summary, previous window present ok 135 - get_summary, previous window is empty ok 136 - get_summary, no previous window without both bounds ok 137 - get_sources, 7 sources ok 138 - get_sources, messagesTotal covers the window ok 139 - get_sources, ranked by failing volume ok 140 - get_sources, two records for one IP are summed ok 141 - get_sources, reporters ok 142 - get_sources, bucket aligned ok 143 - get_sources, DKIM-only pass is aligned ok 144 - get_sources, bucket failing ok 145 - get_sources, failures explained by forwarding ok 146 - get_sources, failures under tolerance stay aligned ok 147 - get_sources, tolerated failures are still counted ok 148 - get_sources, failures over tolerance are failing ok 149 - get_sources, forwarding need only explain the bulk ok 150 - get_sources, reasons attached ok 151 - get_sources, sort_col messages ok 152 - get_sources, recordsTotal ignores paging ok 153 - get_sources, messagesTotal ignores paging ok 154 - get_sources, page of 2 ok 155 - get_sources, paging offset ok 156 - get_source_detail, presented auth that failed is broken ok 157 - get_source_detail, one row per disposition ok 158 - get_source_detail, records ranked by volume ok 159 - get_source_detail, DKIM selector ok 160 - get_source_detail, DKIM volume summed ok 161 - get_source_detail, SPF scope ok 162 - get_source_detail, no auth presented is unauthenticated ok 163 - get_source_detail, no DKIM ok 164 - get_source_detail, bucket aligned ok 165 - get_source_detail, source_ip required ok 166 - get_timeseries, odd parameter list ok 167 - get_report_domains, 2 domains ok 168 - get_report_domains, includes agg.example.com ok 169 - get_report_domains, report count ok 170 - get_report_domains, first_seen ok 171 - get_report, window includes a report beginning in it ok 172 - get_report, window excludes a report beginning before it ok 173 - get_report, non-numeric window bound ignored ok 174 - get_report, no summary unless asked ok 175 - get_report, summary attached ok 176 - report summary, messages ok 177 - report summary, aligned_both ok 178 - report summary, aligned_none ok 179 - report summary, buckets partition the report ok 180 - report summary, From domains ok 181 - report summary, To domains ok 182 - test_arc_override, report created ok 183 - arc=pass explains the failures ok 184 - arc=pass with chain detail explains the failures ok 185 - arc=fail does not explain the failures ok 186 - local_policy with no comment does not explain the failures ok 187 - reason comment is carried through ok 188 - test_origin_filter, outgoing report created ok 189 - test_origin_filter, record stored ok 190 - test_origin_filter, record stored ok 191 - get_summary, outgoing reports excluded by default ok 192 - get_summary, outgoing counts a NULL count as one message ok 193 - get_summary, reports=all includes outgoing ok 194 - get_sources, outgoing source ok 195 - get_sources, NULL count included ok 196 - get_sources, outgoing excluded by default ok 197 - get_report_domains, outgoing domain not offered by default ok 198 - get_report_domains, reports=all offers it ok 199 - get_report, lists outgoing by default ok 200 - get_report, reports=received hides outgoing ok 201 - test_reason_accounting, report created ok 202 - a reason on a passing record does not explain a failure ok 203 - two reasons on one record are not counted twice ok 204 - auth on passing records does not make failures look broken ok 205 - Skipping Pg, DBD::Pg not available ok 206 - Skipping mysql, DBD::mysql not available 1..206 ok t/13.Report.Aggregate.t ...................... ok 1 - use Mail::DMARC::Report::Aggregate; ok 2 - An object of class 'Mail::DMARC::Report::Aggregate' isa 'Mail::DMARC::Report::Aggregate' ok 3 - An object of class 'Mail::DMARC::Report::Aggregate::Metadata' isa 'Mail::DMARC::Report::Aggregate::Metadata' ok 4 - Mail::DMARC::Report::Aggregate::Record, empty ok 5 - record, test ok 6 - record, deeply ok 7 - record, empty, again ok 8 - record, deeply, multiple ok 9 - policy_published, empty ok 10 - policy_published, default ok 11 - metadata, as_xml ok 12 - policy_published, as_xml ok 13 - record, as_xml ok 14 - as_xml ok 15 - RFC 9990: as_xml includes the dmarc-2.0 namespace ok 16 - RFC 9990: as_xml does not include deprecated version element ok 17 - RFC 9990: np tag emitted in policy_published ok 18 - RFC 9990: t tag emitted in policy_published ok 19 - RFC 9990: psd tag emitted in policy_published ok 20 - RFC 9990: pct tag absent from policy_published (deprecated) ok 21 - RFC 9990: selector element always present in DKIM auth result 1..21 ok t/14.Report.Aggregate.Metadata.t ............. ok 1 - use Mail::DMARC::Report::Aggregate; ok 2 - An object of class 'Mail::DMARC::Report::Aggregate' isa 'Mail::DMARC::Report::Aggregate' ok 3 - An object of class 'Mail::DMARC::Report::Aggregate::Metadata' isa 'Mail::DMARC::Report::Aggregate::Metadata' ok 4 - email, set ok 5 - email, get ok 6 - extra_contact_info, set ok 7 - extra_contact_info, get ok 8 - org_name, set ok 9 - org_name, get ok 10 - report_id, set ok 11 - report_id, get ok 12 - uuid, set ok 13 - uuid, get ok 14 - date_range, set ok 15 - date_range, get ok 16 - date_range, get start ok 17 - date_range, get end ok 18 - begin, set ok 19 - date_range, get start ok 20 - end, set ok 21 - date_range, get end ok 22 - error, error \#1 for test ok 23 - error, error \#2 for testing ok 24 - error, deeply ok 25 - as_xml 1..25 ok t/15.Report.Aggregate.Record.t ............... ok 1 - use Mail::DMARC::Report::Aggregate::Record; ok 2 - An object of class 'Mail::DMARC::Report::Aggregate::Record' isa 'Mail::DMARC::Report::Aggregate::Record' ok 3 - envelope_from, set ok 4 - envelope_from, get ok 5 - envelope_to, set ok 6 - envelope_to, get ok 7 - header_from, set ok 8 - header_from, get ok 9 - envelope_from, get ok 10 - envelope_to, get ok 11 - header_from, get ok 12 - auth_results, empty ok 13 - auth_results, one SPF ok 14 - auth_results, two SPF ok 15 - auth_results, two SPF, one DKIM ok 16 - auth_results, two SPF, two DKIM ok 17 - row, empty ok 18 - row, source_ip ok 19 - row, count ok 20 - row, policy_evaluated 1..20 ok t/16.Report.Aggregate.Record.Auth_Results.t .. ok 1 - use Mail::DMARC::Report::Aggregate::Record::Auth_Results; ok 2 - An object of class 'Mail::DMARC::Report::Aggregate::Record::Auth_Results' isa 'Mail::DMARC::Report::Aggregate::Record::Auth_Results' ok 3 - spf, empty ok 4 - spf, hash ok 5 - spf, hashref ok 6 - spf, arrayref of hashref ok 7 - dkim ok 8 - dkim, as hash ok 9 - dkim, as hashref ok 10 - dkim, as hashref again ok 11 - dkim, as arrayref of hashrefs 1..11 ok t/17.Report.Aggregate.Schema.t ............... skipped: XML::Validator::Schema not available t/20.Report.URI.t ............................ ok 1 - use Mail::DMARC::Report::URI; ok 2 - An object of class 'Mail::DMARC::Report::URI' isa 'Mail::DMARC::Report::URI' ok 3 - get_size_limit, 1073741824 ok 4 - get_size_limit, 500 ok 5 - get_size_limit, 53477376 ok 6 - get_size_limit, 5242880 ok 7 - get_size_limit, 20480 ok 8 - get_size_limit, 10485760 ok 9 - get_size_limit undef means no limit ok 10 - get_size_limit croaks on invalid unit ok 11 - parse, http://www.example.com/dmarc-feedback ok 12 - parse, count 1 ok 13 - parse, https://www.example.com/dmarc-feedback ok 14 - parse, count 1 ok 15 - parse, mailto:dmarc@example.com ok 16 - parse, count 1 ok 17 - parse, mailto:dmarc-feedback@example.com,mailto:tld-test@thirdparty.example.net!10m ok 18 - parse, count 2 ok 19 - parse filters unsupported schemes (ftp) ok 20 - parse croaks without URI string 1..20 ok no mail-dmarc.ini found; using bundled defaults. at t/21.Report.Send.t line 19. t/21.Report.Send.t ........................... ok 1 - use Mail::DMARC::Report::Send; ok 2 - An object of class 'Mail::DMARC::Report::Send' isa 'Mail::DMARC::Report::Send' ok 3 - An object of class 'Mail::DMARC::Report::Send::SMTP' isa 'Mail::DMARC::Report::Send::SMTP' ok 4 - An object of class 'Mail::DMARC::Report::Send::HTTP' isa 'Mail::DMARC::Report::Send::HTTP' ok 5 - too_big_report 1..5 ok t/22.Report.Send.SMTP.t ...................... ok 1 - use Mail::DMARC::Report::Send::SMTP; ok 2 - An object of class 'Mail::DMARC::Report::Send::SMTP' isa 'Mail::DMARC::Report::Send::SMTP' ok 3 - get_subject, Report Domain: they.com Submitter: example-test.com Report-ID:2026.09.01.2013.06.01.6789 getting MX for tnpi.net ok 4 - get_domain_mx, tnpi.net ok 5 - get_domain_mx, tnpi.net, deeply getting MX for tnpi.net ok 6 - get_smtp_hosts, tnpi.net ok 7 - human_summary ok 8 - get_filename, example-test.com!they.com!1788254976!1788264876!2013.06.01.6789.xml ok 9 - get_timestamp_rfc2822, Tue, 01 Sep 2026 12:16:16 +0000 ok 10 - get_helo_hostname, netdns ok 11 - assemble_message_object 1..11 ok t/23.Report.Send.HTTP.t ...................... ok 1 - use Mail::DMARC::Report::Send::HTTP; ok 2 - An object of class 'Mail::DMARC::Report::Send::HTTP' isa 'Mail::DMARC::Report::Send::HTTP' 1..2 ok t/25.Report.Receive.t ........................ ok 1 - use Mail::DMARC::Report::Receive; ok 2 - An object of class 'Mail::DMARC::Report::Receive' isa 'Mail::DMARC::Report::Receive' ok 3 - from_file croaks when file argument is missing ok 4 - from_file croaks for missing file path ok 5 - filename parser extracts envelope submitter ok 6 - filename parser sets header from domain ok 7 - filename parser returns early when submitter already set ok 8 - existing submitter is preserved subject: report domain:theartfarm.com submitter:aol.com report-id:theartfarm.com_1366084800 ok 9 - get_submitter_from_subject, aol.com subject: report domain: timbersmart.com submitter: google.com report-id: 6022178961730607282 ok 10 - get_submitter_from_subject, google.com subject: report domain: lynboyer.com submitter: hotmail.com report-id: <02c539af4f164aeda7dd1e7aaba9751b@hotmail.com> ok 11 - get_submitter_from_subject, hotmail.com subject: report domain: tnpi.net submitter: ivenue.com report-id: tnpi.net-1366977854@ivenue.com ok 12 - get_submitter_from_subject, ivenue.com subject: report domain: timbersmart.com submitter: yahoo.com report-id: <1368868092.438744> ok 13 - get_submitter_from_subject, yahoo.com subject: report domain: example.com submitter: sender.example report-id: ok 14 - subject parser sets metadata uuid ok 15 # skip Net::IMAP::Simple not installed and # imap not configured in mail-dmarc.ini 1..15 ok t/26.Report.Sender.t ......................... # Subtest: method using ./share/public_suffix_list for Public Suffix List ok 1 - 1 Email sent ok 2 - Sent to correct address ok 3 - Human readable description ok 4 - Human readable summary ok 5 - Gzip attachment 1..5 ok 1 - method # Subtest: object ok 1 - 1 Email sent ok 2 - Sent to correct address ok 3 - Human readable description ok 4 - Human readable summary ok 5 - Gzip attachment 1..5 ok 2 - object # Subtest: fail ok 1 - Email send fails 1..1 ok 3 - fail # Subtest: fallback ok 1 - 1 Email sent ok 2 - Sent to correct address ok 3 - Human readable description ok 4 - Human readable summary ok 5 - Gzip attachment 1..5 ok 4 - fallback # Subtest: a 5xx on one rung does not stop the ladder ok 1 - the next rung is still tried ok 2 - and the report is retired 1..2 ok 5 - a 5xx on one rung does not stop the ladder # Subtest: a 5xx still falls back where the routes are different hosts ok 1 - a custom transports list keeps its fallback 1..1 ok 6 - a 5xx still falls back where the routes are different hosts # Subtest: a send failure that is not a Failure object still retires the report ok 1 - one report is queued ok 2 - the run completes ok 3 - the failed report is retired rather than left to fail forever 1..3 ok 7 - a send failure that is not a Failure object still retires the report # Subtest: a host that answered is not retried without encryption ok 1 - the cleartext rung is skipped 1..1 ok 8 - a host that answered is not retried without encryption # Subtest: a timeout keeps the errors from earlier routes ok 1 - the earlier route is still reported ok 2 - along with the timeout that stopped it ok 3 - and both codes are kept in order 1..3 ok 9 - a timeout keeps the errors from earlier routes # Subtest: the report alarm stops the ladder rather than advancing it ok 1 - no further rung is tried 1..1 ok 10 - the report alarm stops the ladder rather than advancing it # Subtest: every MX is tried encrypted before any is tried in the clear getting MX for fastmaildmarc.com ok 1 - more than one route ok 2 - encrypted first ok 3 - cleartext last ok 4 - both passes present ok 5 - the MX list reaches the transport ok 6 - and the cleartext pass covers the same hosts 1..6 ok 11 - every MX is tried encrypted before any is tried in the clear 1..11 ok t/27.Report.Sender.Smarthost.t ............... # Subtest: a smart host alone tries relay, submission, then cleartext ok 1 - encrypted first, cleartext rather than not delivering ok 2 - empty settings are not settings 1..2 ok 1 - a smart host alone tries relay, submission, then cleartext # Subtest: credentials never reach a mode that can authenticate in clear ok 1 - ladder offers only modes that always encrypt ok 2 - port 25 offers only modes that always encrypt ok 3 - port 2525 offers only modes that always encrypt ok 4 - port 587 offers only modes that always encrypt ok 5 - unless they say so 1..5 ok 2 - credentials never reach a mode that can authenticate in clear # Subtest: a password without a username is not credentials ok 1 - the unauthenticated ladder is used 1..1 ok 3 - a password without a username is not credentials # Subtest: a port is taken as given ok 1 - relay ok 2 - anything else 1..2 ok 4 - a port is taken as given # Subtest: the submission ports imply their TLS ok 1 - smtps ok 2 - submission 1..2 ok 5 - the submission ports imply their TLS # Subtest: smartssl governs TLS ok 1 - smtps ok 2 - starttls ok 3 - opportunistic ok 4 - plaintext ok 5 - case and space ok 6 - and overrides what the port would imply ok 7 - while the port is still taken as given 1..7 ok 6 - smartssl governs TLS # Subtest: credentials try smtps, then submission, then the relay port ok 1 - all three routes ok 2 - credentials on every route ok 3 - a port still pins one route ok 4 - so does smartssl, private networks included 1..4 ok 7 - credentials try smtps, then submission, then the relay port # Subtest: an unusable smartssl is refused, not guessed at ok 1 - smartssl 'tls' croaks ok 2 - smartssl 'yes' croaks ok 3 - smartssl 'secure' croaks ok 4 - smartssl 'starttls!' croaks ok 5 - smartssl '1' croaks 1..5 ok 8 - an unusable smartssl is refused, not guessed at # Subtest: the route that worked is the only one tried next time ok 1 - three routes to begin with ok 2 - the dead route is not offered again ok 3 - and the working one is kept ok 4 - a transport from elsewhere does not replace the list 1..4 ok 9 - the route that worked is the only one tried next time # Subtest: a transport supplied to the constructor still wins ok 1 - the given transport is used ok 2 - and nothing else is built 1..2 ok 10 - a transport supplied to the constructor still wins # Subtest: a custom transports class is left to its own routing ok 1 - smartssl is not consulted when it will never be used 1..1 ok 11 - a custom transports class is left to its own routing # Subtest: an unusable smartssl stops the run before any report is touched ok 1 - a typo is refused at startup, not once per report 1..1 ok 12 - an unusable smartssl stops the run before any report is touched 1..12 ok no mail-dmarc.ini found; using bundled defaults. at t/30.Validate.t line 62. t/30.Validate.t .............................. # Subtest: Basic Pass using ./share/public_suffix_list for Public Suffix List ok 1 - Result is pass ok 2 - Disposition is none 1..2 ok 1 - Basic Pass # Subtest: Non-existent domain short circuits validation ok 1 - Result is none ok 2 - Disposition is none ok 3 - Reason is not in DNS 1..3 ok 2 - Non-existent domain short circuits validation # Subtest: SPF helo scope should not satisfy DMARC alignment ok 1 - helo-scoped SPF should not satisfy DMARC alignment 1..1 ok 3 - SPF helo scope should not satisfy DMARC alignment # Subtest: SPF should pass if at least one pass is aligned ok 1 - SPF should pass if at least one pass is aligned ok 2 - SPF should be strictly aligned 1..2 ok 4 - SPF should pass if at least one pass is aligned # Subtest: SPF Fail, DKIM Pass ok 1 - Result is pass (via DKIM) ok 2 - Disposition is none 1..2 ok 5 - SPF Fail, DKIM Pass # Subtest: Both Fail, Policy Reject ok 1 - Result is fail ok 2 - Disposition is reject 1..2 ok 6 - Both Fail, Policy Reject # Subtest: Both Fail, Policy Quarantine ok 1 - Result is fail ok 2 - Disposition is quarantine 1..2 ok 7 - Both Fail, Policy Quarantine # Subtest: Subdomain Policy ok 1 - Result is fail ok 2 - Disposition is reject (via sp) 1..2 ok 8 - Subdomain Policy # Subtest: Relaxed Alignment ok 1 - Result is pass (via relaxed alignment) ok 2 - DKIM alignment is relaxed ok 3 - SPF alignment is relaxed 1..3 ok 9 - Relaxed Alignment # Subtest: Strict Alignment (Fail) ok 1 - Result is fail (strict alignment requested) 1..1 ok 10 - Strict Alignment (Fail) # Subtest: No Policy ok 1 - Result is none when no policy found 1..1 ok 11 - No Policy # Subtest: PSL Exception (!www.ck) ok 1 - bar.foo.ck is org dom (foo.ck is public suffix) ok 2 - www.ck is org dom (www.ck is NOT public suffix) 1..2 ok 12 - PSL Exception (!www.ck) # Subtest: Whitelisting ok 1 - Result is still fail ok 2 - Disposition is none due to whitelist ok 3 - Reason type is local_policy ok 4 - Reason comment matches 1..4 ok 13 - Whitelisting # Subtest: External Reporting Verification ok 1 - RUA is preserved if verified ok 2 - save_aggregate succeeds if verified ok 3 - save_aggregate returns undef if NOT verified 1..3 ok 14 - External Reporting Verification 1..14 ok All tests successful. Files=23, Tests=1036, 4 wallclock secs ( 0.07 usr 0.03 sys + 2.31 cusr 0.98 csys = 3.39 CPU) Result: PASS