unofficial mirror of meta@public-inbox.org
 help / color / mirror / Atom feed
* Re: Bug#1002219: public-inbox: FTBFS: dh_auto_test: error: make -j4 test TEST_VERBOSE=1 returned exit code 2
       [not found] <YcICMPpA2SE5k5ZL@xanadu.blop.info>
@ 2021-12-30  9:12 ` Uwe Kleine-König
  2021-12-30 18:49   ` Uwe Kleine-König
  0 siblings, 1 reply; 4+ messages in thread
From: Uwe Kleine-König @ 2021-12-30  9:12 UTC (permalink / raw)
  To: Lucas Nussbaum, 1002219, meta


[-- Attachment #1.1: Type: text/plain, Size: 162361 bytes --]

Hello,

I got a bug report against the public-inbox 1.6.1 package about a 
failing test, see below for the whole output. I didn't have time yet to 
look into it, so this is just a heads up to make you aware. If someone 
has a hint what to do, this would be greatly appreciated. Maybe just 
updating to 1.7 will help?

Best regards
Uwe

On 12/21/21 17:34, Lucas Nussbaum wrote:
> Source: public-inbox
> Version: 1.6.1-1
> Severity: serious
> Justification: FTBFS
> Tags: bookworm sid ftbfs
> User: lucas@debian.org
> Usertags: ftbfs-20211220 ftbfs-bookworm
> 
> Hi,
> 
> During a rebuild of all packages in sid, your package failed to build
> on amd64.
> 
> 
> Relevant part (hopefully):
>> make[1]: Entering directory '/<<PKGBUILDDIR>>'
>> fatal: not a git repository (or any of the parent directories): .git
>> PERL_DL_NONLAZY=1 "/usr/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(1, 'blib/lib', 'blib/arch')" t/*.t
>> t/address.t ..................
>> ok 1 - use PublicInbox::Address;
>> ok 2 - address extraction works as expected
>> ok 3 - comment after domain accepted before >
>> ok 4 - name extraction works as expected
>> ok 5 - address-as-name extraction works as expected
>> ok 6 - backwards name OK
>> ok 7 - backwards emails OK
>> ok 8 - extra quotes dropped
>> ok 9 - no address for local address
>> ok 10 - no address, no name
>> ok 11 - use PublicInbox::AddressPP;
>> ok 12 - address extraction works as expected
>> ok 13 - comment after domain accepted before >
>> ok 14 - name extraction works as expected
>> ok 15 - address-as-name extraction works as expected
>> ok 16 - backwards name OK
>> ok 17 - backwards emails OK
>> ok 18 - extra quotes dropped
>> ok 19 - no address for local address
>> ok 20 - no address, no name
>> 1..20
>> ok
>> t/admin.t ....................
>> ok 1 - use PublicInbox::Admin;
>> ok 2 - top-level GIT_DIR resolved
>> ok 3 - GIT_DIR/objects resolved
>> ok 4 - chdir GIT_DIR works
>> ok 5 - resolve_repo_dir works in GIT_DIR
>> ok 6 - chdir GIT_DIR/objects works
>> ok 7 - resolve_repo_dir works in GIT_DIR
>> ok 8 - version 1 detected
>> ok 9 - detects directory along with version
>> ok 10 - chdir to a non-inbox
>> ok 11 - fails inside non-version-controlled dir
>> ok 12 - back to test-specific $tmpdir
>> ok 13 - fails on non-version-controlled dir
>> ok 14 - $@ set on failure
>> ok 15 - use PublicInbox::V2Writable;
>> ok 16 - use PublicInbox::Inbox;
>> ok 17 - exists
>> ok 18 - resolve_repo_dir works on v2_dir
>> ok 19 - chdir v2_dir OK
>> ok 20 - resolve_repo_dir works inside v2_dir
>> ok 21 - version 2 detected
>> ok 22 - detects directory along with version
>> ok 23 - parse_unsigned 1g
>> ok 24 - got 1g => (1073741824 == 1073741824)
>> ok 25 - parse_unsigned 666
>> ok 26 - got 666 => (666 == 666)
>> ok 27 - parse_unsigned 1500K
>> ok 28 - got 1500K => (1536000 == 1536000)
>> ok 29 - parse_unsigned 15m
>> ok 30 - got 15m => (15728640 == 15728640)
>> ok 31 - parse_unsigned rejects
>> ok 32 - parse_unsigned rejects bogus
>> ok 33 - parse_unsigned rejects 1p
>> ok 34 - parse_unsigned rejects 1gig
>> 1..34
>> ok
>> t/altid.t ....................
>> ok 1 - use PublicInbox::Msgmap;
>> ok 2 - use PublicInbox::SearchIdx;
>> ok 3 - use PublicInbox::Import;
>> ok 4 - use PublicInbox::Inbox;
>> ok 5 - mid_set once OK
>> ok 6 - mid_set not idempotent
>> ok 7 - mid_set fails with dup MID
>> ok 8 - got one match
>> ok 9 - body did NOT match
>> ok 10 - auto-increment goes beyond mid_set
>> 1..10
>> ok
>> t/altid_v2.t .................
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2 - use PublicInbox::Inbox;
>> ok 3 - created repo for msgmap
>> ok 4 - mid_set once OK
>> ok 5 - mid_set not idempotent
>> ok 6 - mid_set fails with dup MID
>> ok 7 - got one match
>> ok 8 - body did NOT match
>> 1..8
>> ok
>> t/cgi.t ......................
>> ok 1 - setup ~/ for testing
>> ok 2 - setup ~/.public-inbox
>> ok 3 - use PublicInbox::Inbox;
>> ok 4 - use PublicInbox::InboxWritable;
>> ok 5 - use PublicInbox::Config;
>> ok 6 - added initial message
>> ok 7 - added big message
>> ok 8 - added reply
>> ok 9 - added slash
>> ok 10 - slashy mid raw hit
>> ok 11 - search not-yet-enabled
>> ok 12 - search returned mbox
>> ok 13 - From lines in mbox
>> ok 14 - did not index or return >max-size message
>> ok 15 - warned about skipping large OID
>> ok 16 # skip DBD::SQLite or XML::TreePP missing
>> ok 17 # skip DBD::SQLite or XML::TreePP missing
>> 1..17
>> ok
>> t/config.t ...................
>> ok 1 - set config
>> ok 2 - config read correctly
>> ok 3 - init used --bare repo
>> ok 4 - reject invalid inboxdir
>> ok 5 - warned about newline
>> ok 6 - examples/public-inbox-config is readable
>> ok 7 - lookup matches expected output
>> ok 8 - non-existent lookup returns undef
>> ok 9 - lookup matches expected output for test
>> ok 10
>> ok 11 - mainrepo still works
>> ok 12 - inboxdir takes precedence
>> ok 13 - global NNTP server
>> ok 14 - per-inbox NNTP server
>> ok 15 - public-inbox.org address not to be obfuscated
>> ok 16 - example.com address not to be obfuscated
>> ok 17 - example.comM address does not match
>> ok 18 - known addresses populated
>> ok 19 - `' name rejected
>> ok 20 - `..' name rejected
>> ok 21 - `.' name rejected
>> ok 22 - `stash@{9}' name rejected
>> ok 23 - `inbox.' name rejected
>> ok 24 - `^caret' name rejected
>> ok 25 - `~tilde' name rejected
>> ok 26 - `*asterisk' name rejected
>> ok 27 - `s p a c e s' name rejected
>> ok 28 - ` leading-space' name rejected
>> ok 29 - `trailing-space ' name rejected
>> ok 30 - `question?' name rejected
>> ok 31 - `colon:' name rejected
>> ok 32 - `[square-brace]' name rejected
>> ok 33 - `\fformfeed' name rejected
>> ok 34 - `\0zero' name rejected
>> ok 35 - `\bbackspace' name rejected
>> ok 36 - `a' name accepted
>> ok 37 - `a@example' name accepted
>> ok 38 - `a@example.com' name accepted
>> ok 39 - `bang!' name accepted
>> ok 40 - `ca$h' name accepted
>> ok 41 - `less<' name accepted
>> ok 42 - `more>' name accepted
>> ok 43 - `1%' name accepted
>> ok 44 - `(parens)' name accepted
>> ok 45 - `&more' name accepted
>> ok 46 - `eql=' name accepted
>> ok 47 - `+plus' name accepted
>> ok 48 - `\#hash' name accepted
>> ok 49
>> ok 50 - inboxes share ::Git object
>> ok 51 - TRUE is true
>> ok 52 - TRUE matches git-config behavior
>> ok 53 - true is true
>> ok 54 - true matches git-config behavior
>> ok 55 - yes is true
>> ok 56 - yes matches git-config behavior
>> ok 57 - on is true
>> ok 58 - on matches git-config behavior
>> ok 59 - 1 is true
>> ok 60 - 1 matches git-config behavior
>> ok 61 - +1 is true
>> ok 62 - +1 matches git-config behavior
>> ok 63 - -1 is true
>> ok 64 - -1 matches git-config behavior
>> ok 65 - 13 is true
>> ok 66 - 13 matches git-config behavior
>> ok 67 - 0x1 is true
>> ok 68 - 0x1 matches git-config behavior
>> ok 69 - 0x12 is true
>> ok 70 - 0x12 matches git-config behavior
>> ok 71 - 0X5 is true
>> ok 72 - 0X5 matches git-config behavior
>> ok 73 - FALSE is false
>> ok 74 - FALSE matches git-config behavior
>> ok 75 - false is false
>> ok 76 - false matches git-config behavior
>> ok 77 - no is false
>> ok 78 - no matches git-config behavior
>> ok 79 - off is false
>> ok 80 - off matches git-config behavior
>> ok 81 - 0 is false
>> ok 82 - 0 matches git-config behavior
>> ok 83 - +0 is false
>> ok 84 - +0 matches git-config behavior
>> ok 85 - +000 is false
>> ok 86 - +000 matches git-config behavior
>> ok 87 - 00 is false
>> ok 88 - 00 matches git-config behavior
>> ok 89 - 0x00 is false
>> ok 90 - 0x00 matches git-config behavior
>> ok 91 - 0X0 is false
>> ok 92 - 0X0 matches git-config behavior
>> ok 93 - bogus is undef
>> ok 94 - urlmatch hit
>> ok 95 - urlmatch miss
>> 1..95
>> ok
>> t/config_limiter.t ...........
>> ok 1 - Limiter exists
>> ok 2 - limiter has expected slots
>> ok 3 - got new Git object
>> ok 4 - same limiter
>> ok 5 - got git object
>> ok 6 - Limiter exists
>> ok 7 - limiter has expected slots
>> ok 8 - got new Git object
>> ok 9 - same limiter
>> ok 10 - limiter has expected slots
>> 1..10
>> ok
>> t/content_hash.t .............
>> ok 1 - content_hash matches after serialization
>> ok 2 - content_hash does not mutate From:
>> ok 3 - quotes ignored in From:
>> ok 4 - content_hash does not mutate To:
>> ok 5 - quotes ignored in To:
>> ok 6 - content_hash does not mutate Cc:
>> ok 7 - quotes ignored in Cc:
>> 1..7
>> ok
>> t/convert-compact.t ..........
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2 - set restrictive umask
>> ok 3 - set sharedRepository
>> ok 4 - added one message
>> ok 5 - remove message
>> ok 6 - added message again
>> ok 7 - no errors syncing
>> ok 8 - no errors syncing
>> ok 9 - sharedRepository respected for v1
>> ok 10 - sharedRepository respected for v1 msgmap
>> ok 11 - sharedRepository respected on file after convert
>> ok 12 - sharedRepository respected on file after convert
>> ok 13 - sharedRepository respected on file after convert
>> ok 14 - sharedRepository respected on file after convert
>> ok 15 - sharedRepository respected on file after convert
>> ok 16 - sharedRepository respected on file after convert
>> ok 17 - sharedRepository respected on file after convert
>> ok 18 - sharedRepository respected on file after convert
>> ok 19 - v1 compact works
>> ok 20 - got one xapian directory after compact
>> ok 21 - sharedRepository respected on v1 compact
>> ok 22 - highwater mark set \#2
>> ok 23 - convert --no-index works
>> ok 24 - convert works
>> ok 25 - sharedRepository respected after convert
>> ok 26 - sharedRepository respected after convert
>> ok 27 - sharedRepository respected after convert
>> ok 28 - sharedRepository respected after convert
>> ok 29 - sharedRepository respected after convert
>> ok 30 - v2 compact works
>> ok 31 - highwater mark unchanged in v2 inbox
>> ok 32 - sharedRepository respected after v2 compact
>> ok 33 - sharedRepository respected after v2 compact
>> ok 34 - sharedRepository respected after v2 compact
>> ok 35 - sharedRepository respected after v2 compact
>> ok 36 - sharedRepository respected after v2 compact
>> ok 37 - sharedRepository respected for v2 msgmap
>> ok 38 - sharedRepository respected after v2 compact
>> ok 39 - sharedRepository respected after v2 compact
>> ok 40 - sharedRepository respected after v2 compact
>> ok 41 - sharedRepository respected after v2 compact
>> ok 42 - sharedRepository respected after v2 compact
>> ok 43 - sharedRepository respected after v2 compact
>> ok 44 - message exists in history
>> ok 45 - only one message in history
>> ok 46 - --reindex -c
>> ok 47 - xapian-compact ran (-c)
>> ok 48 - --reindex -c -c
>> ok 49 - xapian-compact ran (-c -c)
>> ok 50 - -compacted twice
>> 1..50
>> ok
>> t/dir_idle.t .................
>> ok 1 - use PublicInbox::DirIdle;
>> 1..1
>> ok
>> t/ds-kqxs.t .................. skipped: DSKQXS is only for *BSD systems
>> t/ds-leak.t ..................
>> ok 1 - use PublicInbox::DS;
>> ok 2 - subprocess spawned
>> ok 3 - cloexec works and sleep(1) is running
>> ok 4 # skip lsof missing
>> ok 5 # skip BSD::Resource missing for t/ds-leak.t
>> 1..5
>> ok
>> t/ds-poll.t ..................
>> ok 1 - use PublicInbox::DSPoll;
>> ok 2 - add EPOLLIN
>> ok 3 - no events set
>> ok 4 - nothing ready, yet
>> ok 5 - add EPOLLOUT|EPOLLONESHOT
>> ok 6 - got POLLOUT event
>> ok 7 - $w ready
>> ok 8 - nothing ready after oneshot
>> ok 9 - no events set after oneshot
>> ok 10 - level-trigger POLLIN ready \#0
>> ok 11 - only event ready \#0
>> ok 12 - level-trigger POLLIN ready \#1
>> ok 13 - only event ready \#1
>> ok 14 - EPOLLIN|EPOLLONESHOT add
>> ok 15 - epoll_wait has 2 ready
>> ok 16 - got both ready FDs
>> ok 17 - EPOLL_CTL_DEL OK
>> ok 18 - nothing ready after EPOLL_CTL_DEL
>> 1..18
>> ok
>> t/edit.t .....................
>> ok 1 - add message to be edited
>> ok 2 - -F FILE edit OK
>> ok 3 - -F FILE message edited
>> ok 4 - -F FILE shows commit on success
>> ok 5 - -m MESSAGE_ID edit OK
>> ok 6 - -m MESSAGE_ID message edited
>> ok 7 - -m MESSAGE_ID shows commit on success
>> ok 8 - no-op -m MESSAGE_ID succeeds
>> ok 9 - no-op -m MESSAGE_ID makes no change
>> ok 10 - no-op -m MESSAGE_ID does not change message
>> ok 11 - noop shows NONE
>> ok 12 - git head unchanged
>> ok 13 - no-op -m MESSAGE_ID w/Status: header succeeds
>> ok 14 - no-op -m MESSAGE_ID w/Status: header makes no change
>> ok 15 - no-op -m MESSAGE_ID w/Status: header does not change message
>> ok 16 - Status header not added
>> ok 17 - noop shows NONE
>> ok 18 - git head unchanged
>> ok 19 - -m MESSAGE_ID can change Received: headers succeeds
>> ok 20 - -m MESSAGE_ID can change Received: headers does not change Subject
>> ok 21 - added Received header
>> ok 22 - -m miss fails on invalid MID
>> ok 23 - -m miss shows error
>> ok 24 - non-interactive editor failure detected
>> ok 25 - non-interactive editor failure shows error
>> ok 26 - set publicinbox.mailEditor
>> ok 27 - mailEditor set in config edited message
>> ok 28 - mailEditor set in config message edited
>> ok 29 - did not run GIT_EDITOR
>> ok 30 - --raw and mbox escaping succeeds
>> ok 31 - put "From " line into body
>> ok 32 - --raw and mbox escaping succeeds with mbox escaping
>> ok 33 - changed "From " line unescaped
>> ok 34 - --raw and mbox escaping succeeds again
>> ok 35 - --raw and mbox escaping restored body
>> ok 36 - reuse Message-ID and re-add
>> ok 37 - reuse Message-ID got warning
>> ok 38 - edit ambiguous Message-ID with -m fails w/o --force
>> ok 39 - edit ambiguous Message-ID with -m shows matches
>> ok 40 - edit ambiguous Message-ID with -m shows git commands
>> ok 41 - edit ambiguous Message-ID with -m and --force succeeds
>> ok 42 - edit ambiguous Message-ID with -m and --force notes all will be edited
>> ok 43 - edit ambiguous Message-ID with -m and --force edited both messages
>> 1..43
>> ok
>> t/emergency.t ................
>> ok 1 - use PublicInbox::Emergency;
>> ok 2 - Maildir a auto-created
>> ok 3 - no temporary files exist, yet
>> ok 4 - globbed one temporary file
>> ok 5 - wrote contents to temporary location
>> ok 6 - no new files exist, yet
>> ok 7 - temporary file no longer exists
>> ok 8 - globbed one new file
>> ok 9 - wrote contents to new location
>> ok 10 - Maildir b auto-created
>> ok 11 - no temporary files exist, yet
>> ok 12 - globbed one temporary file
>> ok 13 - wrote contents to temporary location
>> ok 14 - no new files exist, yet
>> ok 15 - read file handle exposed
>> ok 16 - got expected data
>> ok 17 - temporary file no longer exists
>> ok 18 - new file no longer exists
>> 1..18
>> ok
>>
>> #   Failed test 'filename decoded'
>> #   at t/eml.t line 407.
>> #          got: '=?utf-8?q?vtpm-makefile.patch?='
>> #     expected: 'vtpm-makefile.patch'
>> # Looks like you failed 1 test of 146.
>> t/eml.t ......................
>> ok 1 - use PublicInbox::Eml;
>> ok 2 - use PublicInbox::MIME;
>> ok 3 - ->new modified body like Email::Simple
>> ok 4 - ->body works
>> ok 5 - ->as_string
>> ok 6 - ->as_string works
>> ok 7 - header ->as_string works
>> ok 8 - header_raw scalar context
>> ok 9 - multi-value
>> ok 10 - multi-value header
>> ok 11 - multi-line, multi-value header
>> ok 12 - header_set clears
>> ok 13 - header_set clears idempotent
>> ok 14 - header_set
>> ok 15 - header_set ary
>> ok 16 - header_set `rr' did not clobber `r'
>> ok 17 - got set scalar
>> ok 18 - got long set scalar
>> ok 19 - single token not wrapped
>> ok 20 - wrapped after long token
>> ok 21 - preformatted preserved
>> ok 22 - ->as_string works
>> ok 23 - header ->as_string works
>> ok 24 - header_raw scalar context
>> ok 25 - multi-value
>> ok 26 - multi-value header
>> ok 27 - multi-line, multi-value header
>> ok 28 - header_set clears
>> ok 29 - header_set clears idempotent
>> ok 30 - header_set
>> ok 31 - header_set ary
>> ok 32 - header_set `rr' did not clobber `r'
>> ok 33 - got set scalar
>> ok 34 - got long set scalar
>> ok 35 - preformatted preserved
>> ok 36 - name not unnecessarily quoted PublicInbox::Eml
>> ok 37 - name not unnecessarily quoted PublicInbox::MIME
>> ok 38 - MIME-B encoded UTF-8 Subject
>> ok 39 - got wide character back
>> ok 40 - MIME-B encoded UTF-8 Subject
>> ok 41 - got wide character back
>> ok 42 - continued long line w/o leading spaces PublicInbox::Eml
>> ok 43 - subsequent line not corrupted
>> ok 44 - preceding line readable
>> ok 45 - continued long line w/o leading spaces PublicInbox::MIME
>> ok 46 - subsequent line not corrupted
>> ok 47 - preceding line readable
>> ok 48 - order is fine
>> ok 49 - unchanged by ->each_part
>> ok 50 - each_part can clobber body
>> ok 51 - got all parts
>> ok 52 - first part found
>> ok 53 - got expected depth and level for part \#0
>> ok 54 - attachment filename found
>> ok 55 - got expected depth and level for part \#1
>> ok 56 - got expected depth and level for part \#2
>> ok 57 - got expected depth and level for part \#3
>> ok 58 - got expected depth and level for part \#4
>> ok 59 - another attachment filename found
>> ok 60 - got expected depth and level for part \#5
>> ok 61 - called on bodyless multipart
>> ok 62 - got one part even w/o boundary
>> ok 63 - body preserved
>> ok 64 - $depth is zero
>> ok 65 - @idx is one
>> ok 66 - called on bodyless multipart
>> ok 67 - got one part even w/o boundary
>> ok 68 - body preserved
>> ok 69 - $depth is zero
>> ok 70 - @idx is one
>> ok 71 - body-only subpart in PublicInbox::Eml
>> ok 72
>> ok 73 - two parts
>> ok 74
>> ok 75 - two parts
>> ok 76 - no header
>> ok 77 - got CRLF as "\n"
>> ok 78
>> ok 79 - only one part
>> ok 80 - nothing w/o body PublicInbox::Eml
>> ok 81 - only one part
>> ok 82 - nothing w/o body PublicInbox::MIME
>> ok 83 - only got one header
>> ok 84 - got expected body
>> ok 85 - only one part
>> ok 86 - only got one header
>> ok 87 - got expected body
>> ok 88 - only one part
>> ok 89 - got wide character by assuming utf-8 (PublicInbox::Eml)
>> ok 90 # skip newer Email::MIME behavior inconsistent
>> ok 91 - final "\n" preserved on missing epilogue
>> ok 92 - no overrun header
>> ok 93 - body not damaged
>> ok 94 - header truncated
>> ok 95 - truncation warned
>> ok 96 - no overrun header w/o body
>> ok 97 - no overrun header on CRLF
>> ok 98 - body not damaged
>> ok 99 - ignored header warned
>> ok 100 - part \#1 matches
>> ok 101 - part \#2 matches
>> ok 102 - part \#3 matches
>> ok 103 - part \#4 matches
>> ok 104 - maxparts honored
>> ok 105 - part[0] matches
>> ok 106 - part[1] matches
>> ok 107 - part[2] matches
>> ok 108 - maxparts honored
>> ok 109 - decoded -8 Subject matches Email::MIME
>> ok 110 - Subject is UTF-8
>> ok 111 - UTF-8 valid Subject
>> ok 112 - decoded -8 From matches Email::MIME
>> ok 113 - From is UTF-8
>> ok 114 - UTF-8 valid From
>> ok 115 - decoded -8 To matches Email::MIME
>> ok 116 - To is UTF-8
>> ok 117 - UTF-8 valid To
>> ok 118 - body_str is UTF-8
>> ok 119 - UTF-8 valid body_str
>> ok 120 - raw octets after body_str_set
>> ok 121 - body_str is UTF-8 after set
>> ok 122 - UTF-8 valid body_str after set
>> ok 123 - body_set worked on scalar ref
>> ok 124 - body_set worked on scalar
>> ok 125 - raw octets after body_str_set
>> ok 126 - body_str is UTF-8 after set
>> ok 127 - UTF-8 valid body_str after set
>> ok 128 - body_set worked on scalar ref
>> ok 129 - body_set worked on scalar
>> ok 130 - ISO-2202-JP body_str
>> ok 131 - ISO-2202-JP => UTF-8 body_str
>> ok 132 - UTF-8 valid body_str
>> ok 133 - raw ->subparts match deeply
>> ok 134 - ->subparts match deeply
>> ok 135 - parts_set can clear
>> ok 136 - only last remains
>> ok 137 - parts_set can clear
>> ok 138 - only last remains
>> ok 139 - as_string matches after parts_set
>> ok 140 - filename decoded
>> ok 141 - filename fallback (PublicInbox::Eml)
>> ok 142 - matches Email::MIME output, "correct" or not
>> ok 143 - got filename for both attachments (PublicInbox::Eml)
>> not ok 144 - filename decoded
>> ok 145 - matches Email::MIME output, "correct" or not
>> ok 146 # skip newer Email::MIME is inconsistent here
>> 1..146
>> Dubious, test returned 1 (wstat 256, 0x100)
>> Failed 1/146 subtests
>> 	(less 2 skipped subtests: 143 okay)
>> t/eml_content_disposition.t ..
>> ok 1 - Can parse C-D <>
>> ok 2 - Can parse C-D <attachment>
>> ok 3 - Can parse C-D <attachment; filename*0*=''This%20is%20even%20more%20; filename*1*=%2A%2A%2Afun%2A%2A%2A%20; filename*2="isn't it!">
>> ok 4 - Can parse C-D <attachment; filename*0*='en'This%20is%20even%20more%20; filename*1*=%2A%2A%2Afun%2A%2A%2A%20; filename*2="isn't it!">
>> ok 5 - Can parse C-D <attachment; filename*0*=us-ascii''This%20is%20even%20more%20; filename*1*=%2A%2A%2Afun%2A%2A%2A%20; filename*2="isn't it!">
>> ok 6 - Can parse C-D <attachment; filename*0*=us-ascii'en'This%20is%20even%20more%20; filename*1*=%2A%2A%2Afun%2A%2A%2A%20; filename*2="isn't it!">
>> ok 7 - Can parse C-D <attachment; filename*=UTF-8''genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500">
>> ok 8 - Can parse C-D <attachment; filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500">
>> ok 9 - Can parse C-D <inline>
>> ok 10 - Can parse non-strict C-D <>
>> ok 11 - Can parse non-strict C-D <attachment>
>> ok 12 - Can parse non-strict C-D <attachment; filename*0*=''This%20is%20even%20more%20; filename*1*=%2A%2A%2Afun%2A%2A%2A%20; filename*2="isn't it!">
>> ok 13 - Can parse non-strict C-D <attachment; filename*0*='en'This%20is%20even%20more%20; filename*1*=%2A%2A%2Afun%2A%2A%2A%20; filename*2="isn't it!">
>> ok 14 - Can parse non-strict C-D <attachment; filename*0*=us-ascii''This%20is%20even%20more%20; filename*1*=%2A%2A%2Afun%2A%2A%2A%20; filename*2="isn't it!">
>> ok 15 - Can parse non-strict C-D <attachment; filename*0*=us-ascii'en'This%20is%20even%20more%20; filename*1*=%2A%2A%2Afun%2A%2A%2A%20; filename*2="isn't it!">
>> ok 16 - Can parse non-strict C-D <attachment; filename*=UTF-8''genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500">
>> ok 17 - Can parse non-strict C-D <attachment; filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500">
>> ok 18 - Can parse non-strict C-D <inline>
>> ok 19 - Can parse non-strict C-D <attachment; filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500";>
>> 1..19
>> ok
>> t/eml_content_type.t .........
>> ok 1 - Can parse C-T <>
>> ok 2 - Can parse C-T <(c \( \\) (c) text/plain (c) (c) ; (c) (c) charset=utf-8 (c)>
>> ok 3 - Can parse C-T <(c) text/plain (c); (c) charset=ISO-8859-1 (c)>
>> ok 4 - Can parse C-T <application/foo>
>> ok 5 - Can parse C-T <application/x-stuff; title*0*=''This%20is%20even%20more%20; title*1*=%2A%2A%2Afun%2A%2A%2A%20; title*2="isn't it!">
>> ok 6 - Can parse C-T <application/x-stuff; title*0*='en'This%20is%20even%20more%20; title*1*=%2A%2A%2Afun%2A%2A%2A%20; title*2="isn't it!">
>> ok 7 - Can parse C-T <application/x-stuff; title*0*=us-ascii''This%20is%20even%20more%20; title*1*=%2A%2A%2Afun%2A%2A%2A%20; title*2="isn't it!">
>> ok 8 - Can parse C-T <application/x-stuff; title*0*=us-ascii'en'This%20is%20even%20more%20;title*1*=%2A%2A%2Afun%2A%2A%2A%20; title*2="isn't it!">
>> ok 9 - Can parse C-T <application/x-stuff; title*=''This%20is%20f%2Ad>
>> ok 10 - Can parse C-T <application/x-stuff; title*='en-us'This%20is%20f%2Ad>
>> ok 11 - Can parse C-T <application/x-stuff; title*=us-ascii''This%20is%20f%2Ad>
>> ok 12 - Can parse C-T <application/x-stuff; title*=us-ascii'en-us'This%20is%20f%2Ad>
>> ok 13 - Can parse C-T <message/external-body; access-type=URL; URL*0="ftp://"; URL*1="example.com/">
>> ok 14 - Can parse C-T <message/external-body; access-type=URL; URL="ftp://example.com/">
>> ok 15 - Can parse C-T <message/external-body; access-type=local-file; name="/u/n/m.jpg">
>> ok 16 - Can parse C-T <multipart/mixed; boundary="----------=_1026452699-10321-0" >
>> ok 17 - Can parse C-T <multipart/mixed; boundary=unique-boundary-1>
>> ok 18 - Can parse C-T <multipart/report; boundary= 	"=_0=7-c-5-b-2=">
>> ok 19 - Can parse C-T <multipart/report; boundary= "=_0=73e476c3-cd5a-5ba3-b910-2=">
>> ok 20 - Can parse C-T <text/plain>
>> ok 21 - Can parse C-T <text/plain (c \(!nested ()c\)\)(nested\(c())); charset=utf-8>
>> ok 22 - Can parse C-T <text/plain;\r\n	 charset=us-ascii;\r\n	 attribute="\r value1 \r value2\r\n value3\r\n value4\r\n "\r\n >
>> ok 23 - Can parse C-T <text/plain; (c (nested ()c)another c)() charset=ISO-8859-1>
>> ok 24 - Can parse C-T <text/plain; attribute="v\"v\\v\(v\>\<\)\@\,\;\:\/\]\[\?\=v v"; charset=us-ascii>
>> ok 25 - Can parse C-T <text/plain; charset="ISO-8859-1">
>> ok 26 - Can parse C-T <text/plain; charset="ISO-8859-1" (comment)>
>> ok 27 - Can parse C-T <text/plain; charset="us-ascii">
>> ok 28 - Can parse C-T <text/plain; charset=ISO-8859-1>
>> ok 29 - Can parse C-T <text/plain; charset=us-ascii>
>> ok 30 - Can parse C-T <text/plain; charset=us-ascii (Plain text)>
>> ok 31 - Can parse non-strict C-T <>
>> ok 32 - Can parse non-strict C-T <(c \( \\) (c) text/plain (c) (c) ; (c) (c) charset=utf-8 (c)>
>> ok 33 - Can parse non-strict C-T <(c) text/plain (c); (c) charset=ISO-8859-1 (c)>
>> ok 34 - Can parse non-strict C-T <application/foo>
>> ok 35 - Can parse non-strict C-T <application/x-stuff; title*0*=''This%20is%20even%20more%20; title*1*=%2A%2A%2Afun%2A%2A%2A%20; title*2="isn't it!">
>> ok 36 - Can parse non-strict C-T <application/x-stuff; title*0*='en'This%20is%20even%20more%20; title*1*=%2A%2A%2Afun%2A%2A%2A%20; title*2="isn't it!">
>> ok 37 - Can parse non-strict C-T <application/x-stuff; title*0*=us-ascii''This%20is%20even%20more%20; title*1*=%2A%2A%2Afun%2A%2A%2A%20; title*2="isn't it!">
>> ok 38 - Can parse non-strict C-T <application/x-stuff; title*0*=us-ascii'en'This%20is%20even%20more%20;title*1*=%2A%2A%2Afun%2A%2A%2A%20; title*2="isn't it!">
>> ok 39 - Can parse non-strict C-T <application/x-stuff; title*=''This%20is%20f%2Ad>
>> ok 40 - Can parse non-strict C-T <application/x-stuff; title*='en-us'This%20is%20f%2Ad>
>> ok 41 - Can parse non-strict C-T <application/x-stuff; title*=us-ascii''This%20is%20f%2Ad>
>> ok 42 - Can parse non-strict C-T <application/x-stuff; title*=us-ascii'en-us'This%20is%20f%2Ad>
>> ok 43 - Can parse non-strict C-T <message/external-body; access-type=URL; URL*0="ftp://"; URL*1="example.com/">
>> ok 44 - Can parse non-strict C-T <message/external-body; access-type=URL; URL="ftp://example.com/">
>> ok 45 - Can parse non-strict C-T <message/external-body; access-type=local-file; name="/u/n/m.jpg">
>> ok 46 - Can parse non-strict C-T <multipart/mixed; boundary="----------=_1026452699-10321-0" >
>> ok 47 - Can parse non-strict C-T <multipart/mixed; boundary=unique-boundary-1>
>> ok 48 - Can parse non-strict C-T <multipart/report; boundary= 	"=_0=7-c-5-b-2=">
>> ok 49 - Can parse non-strict C-T <multipart/report; boundary= "=_0=73e476c3-cd5a-5ba3-b910-2=">
>> ok 50 - Can parse non-strict C-T <text/plain>
>> ok 51 - Can parse non-strict C-T <text/plain (c \(!nested ()c\)\)(nested\(c())); charset=utf-8>
>> ok 52 - Can parse non-strict C-T <text/plain;\r\n	 charset=us-ascii;\r\n	 attribute="\r value1 \r value2\r\n value3\r\n value4\r\n "\r\n >
>> ok 53 - Can parse non-strict C-T <text/plain; (c (nested ()c)another c)() charset=ISO-8859-1>
>> ok 54 - Can parse non-strict C-T <text/plain; attribute="v\"v\\v\(v\>\<\)\@\,\;\:\/\]\[\?\=v v"; charset=us-ascii>
>> ok 55 - Can parse non-strict C-T <text/plain; charset="ISO-8859-1">
>> ok 56 - Can parse non-strict C-T <text/plain; charset="ISO-8859-1" (comment)>
>> ok 57 - Can parse non-strict C-T <text/plain; charset="us-ascii">
>> ok 58 - Can parse non-strict C-T <text/plain; charset=ISO-8859-1>
>> ok 59 - Can parse non-strict C-T <text/plain; charset=us-ascii>
>> ok 60 - Can parse non-strict C-T <text/plain; charset=us-ascii (Plain text)>
>> ok 61 - Can parse non-strict C-T <image/jpeg; x-mac-type="3F3F3F3F"; x-mac-creator="3F3F3F3F" name="file name.jpg";>
>> ok 62 - Can parse non-strict C-T <multipart/mixed; boundary = "--=_Next_Part_24_Nov_2016_08.09.21">
>> ok 63 - Can parse non-strict C-T <text/plain;>
>> ok 64 - Can parse non-strict C-T <text/plain; >
>> ok 65 - Can parse non-strict C-T <text/plain; key=very long value>
>> ok 66 - Can parse non-strict C-T <text/plain; key=very long value key2=value2>
>> 1..66
>> ok
>> t/epoll.t ....................
>> ok 1 - epoll_create
>> ok 2 - epoll_ctl socket EPOLLOUT
>> ok 3 - epoll_wait returns
>> ok 4 - got one event
>> ok 5 - got expected FD
>> ok 6 - got expected event
>> ok 7 - epoll_wait timeout
>> 1..7
>> ok
>> t/fake_inotify.t .............
>> ok 1 - use PublicInbox::FakeInotify;
>> ok 2 - rename(2) detected
>> ok 3 - link(2) detected
>> ok 4 - link(2) not detected after cancel
>> 1..4
>> ok
>> t/feed.t .....................
>> ok 1 - added
>> ok 2 - added
>> ok 3 - added
>> ok 4 - added
>> ok 5 - added
>> ok 6 - added
>> ok 7 # skip XML::TreePP missing
>> ok 8 # skip XML::TreePP missing
>> ok 9 # skip XML::TreePP missing
>> ok 10 - long quoted text kept
>> ok 11 - short quoted text kept
>> ok 12 - unquoted text saved
>> ok 13 # skip XML::TreePP missing
>> ok 14 # skip XML::TreePP missing
>> ok 15 - spam showed up :<
>> ok 16 # skip XML::TreePP missing
>> ok 17 # skip XML::TreePP missing
>> ok 18 - spam gone :>
>> 1..18
>> ok
>> t/filter_base.t ..............
>> ok 1 - use PublicInbox::Filter::Base;
>> ok 2 - created stock object
>> ok 3 - rejected suffix redefined
>> ok 4 - reject_suffix should be a RE
>> ok 5 - created base object q/o reject_suffix
>> ok 6 - reject_suffix not defined
>> ok 7 - xhtml rejected
>> ok 8 - proprietary format rejected on glob
>> 1..8
>> ok
>> t/filter_mirror.t ............
>> ok 1 - use PublicInbox::Filter::Mirror;
>> ok 2 - created PublicInbox::Filter::Mirror object
>> ok 3 - accept any trash that comes
>> 1..3
>> ok
>> t/filter_rubylang.t ..........
>> ok 1 - use PublicInbox::Filter::RubyLang;
>> ok 2 - created PublicInbox::Filter::RubyLang object
>> ok 3 - delivery successful
>> ok 4 - normal message filtered OK
>> ok 5 - use PublicInbox::Inbox;
>> ok 6 - created public-inbox dir
>> ok 7 - delivery successful
>> ok 8 - MM entry created based on X-ML-Count
>> ok 9 - delivery rejected without X-Mail-Count
>> 1..9
>> ok
>> t/filter_subjecttag.t ........
>> ok 1 - use PublicInbox::Filter::SubjectTag;
>> ok 2 - error without args
>> ok 3 - new object created
>> ok 4 - filtered with Re:
>> ok 5 - filtered non-reply
>> ok 6 - subject filtered correctly
>> 1..6
>> ok
>> t/filter_vger.t ..............
>> ok 1 - use PublicInbox::Filter::Vger;
>> ok 2 - created PublicInbox::Filter::Vger object
>> ok 3 - normal message filtered OK
>> ok 4 - missing trailing LF in original OK
>> 1..4
>> ok
>> t/git.t ......................
>> ok 1 - use PublicInbox::Git;
>> ok 2 - fast-import succeeded
>> ok 3 - modified time detected from commit
>> ok 4 - returned 3 element array for existing file
>> ok 5 - returns obj ID in 1st element
>> ok 6 - returns obj type in 2nd element
>> ok 7 - returns obj size in 3rd element
>> ok 8 - length matches
>> ok 9 - not broken after failures
>> ok 10 - not broken after partial read
>> ok 11 - got expected header
>> ok 12 - arg passed to cat_async
>> ok 13 - blob result matches
>> ok 14 - non-existent blob gives expected result
>> ok 15 - COPYING readable
>> ok 16 - file is big enough
>> ok 17 - hashed object successfully
>> ok 18 - got correct size ref on big file
>> ok 19 - read correct number of bytes
>> ok 20 - qx returned array length of 661
>> ok 21 - packed size is positive
>> ok 22 - remote file not found
>> ok 23 - alternates reloaded
>> ok 24 - got expected results
>> ok 25 - cleanup can expire
>> ok 26 - cleanup idempotent
>> ok 27 - repo not modified in the future
>> ok 28 - repo not modified in 1970
>> ok 29 - use PublicInbox::Git;
>> ok 30 - unquoted newline
>> ok 31 - unquoted octal
>> ok 32 - unquoted dq
>> ok 33 - unquoted backslash
>> ok 34 - quoted octal
>> ok 35 - quoted dq
>> ok 36 - quoted backslash
>> ok 37 - quoted LF
>> 1..37
>> ok
>> t/gzip_filter.t ..............
>> ok 1 - require PublicInbox::GzipFilter;
>> ok 2 - wrote something
>> ok 3 - wrote more
>> ok 4 - buffer matches
>> ok 5 - got SIGPIPE
>> 1..5
>> ok
>> t/hl_mod.t ................... skipped: failed to load highlight.pm for t/hl_mod.t
>> t/html_index.t ...............
>> ok 1 - inserted message
>> ok 2 - inserted message
>> ok 3 - inserted message
>> ok 4 - inserted message
>> ok 5 - inserted message
>> ok 6 - inserted message
>> 1..6
>> ok
>> t/httpd-corner.t .............
>> ok 1 - created FIFO
>> ok 2 - UNIX socket created
>> ok 3 - connected for killed worker
>> ok 4 - /pid response
>> ok 5 - killed worker
>> ok 6 - worker died and EOF-ed client
>> ok 7 - connected for respawned worker
>> ok 8 - read response
>> ok 9 - /pid response
>> ok 10 - respawned worker
>> ok 11 - connected for streaming callback
>> ok 12 - read response
>> ok 13 - callback body matches expected
>> ok 14 - connected for getline-die
>> ok 15 - read some response
>> ok 16 - got some sort of header
>> ok 17 - read EOF
>> ok 18 - failure logged
>> ok 19 - body->close not called
>> ok 20 - connected for close-die
>> ok 21 - read some response
>> ok 22 - got some sort of header
>> ok 23 - read EOF
>> ok 24 - getline not failed
>> ok 25 - body->close not called
>> ok 26 - connected for excessive header
>> ok 27 - broken request
>> ok 28 - got 400 response
>> ok 29 - connected for excessive body Content-Length
>> ok 30 - read response
>> ok 31 - got 413 response
>> ok 32 - connected for excessive body chunked
>> ok 33 - read response
>> ok 34 - got 413 response
>> ok 35 - connected for 1.1 Transfer-Encoding bogus
>> ok 36 - got 400 response on bogus TE
>> ok 37 - connected for 1.1 Content-Length bogus
>> ok 38 - got 400 response on bad length
>> ok 39 - connected for 1.1 Content-Length dupe
>> ok 40 - got 400 response on dupe length
>> ok 41 - connected for chunk with pipeline
>> ok 42 - chunk parser can handled pipelined requests
>> ok 43 - unix socket connected
>> ok 44 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 45 - connected for host-port
>> ok 46 - host matches addr
>> ok 47 - port matches
>> ok 48 - connected for graceful termination via slow header
>> ok 49 - wrote something to fifo
>> ok 50 - started graceful shutdown
>> ok 51 - wrote else to fifo
>> ok 52 - got 200 for slow-header
>> ok 53 - read expected body
>> ok 54 - no error
>> ok 55 - connected for graceful termination via slow-body
>> ok 56 - got 200 for slow-body
>> ok 57 - finished HTTP response header
>> ok 58 - wrote line to fifo
>> ok 59 - got trickle for reading
>> ok 60 - wrote line to fifo
>> ok 61 - got trickle for reading
>> ok 62 - wrote line to fifo
>> ok 63 - got trickle for reading
>> ok 64 - started graceful shutdown
>> ok 65 - wrote else to fifo
>> ok 66 - read expected body
>> ok 67 - got EOF from server
>> ok 68 - no error
>> ok 69 - got the alphabet
>> ok 70 # skip curl(1) missing
>> ok 71 # skip curl(1) missing
>> ok 72 # skip curl(1) missing
>> ok 73 # skip curl(1) missing
>> ok 74 - connected for psgi_return ENOENT
>> ok 75 - got 500 error on ENOENT
>> ok 76 - connected for 1.1 pipeline together
>> ok 77 - got 2 responses
>> ok 78 - read expected body 3
>> ok 79 - read expected body 4
>> ok 80 - connected for no TCP_CORK on empty body
>> ok 81 - no 200ms TCP cork delay on empty body
>> ok 82 - connected for graceful termination during slow request
>> ok 83 - start graceful shutdown
>> ok 84 - graceful shutdown did not kill httpd
>> ok 85 - wrote alphabet
>> ok 86 - got expected length
>> ok 87 - read expected body
>> ok 88 - no error
>> ok 89 - connected for 1.1 chunk header excessive
>> ok 90 - got error set in $!
>> ok 91 - write error happened
>> ok 92 - was able to write
>> ok 93 - got 400 response
>> ok 94 - connected for 1.1 chunk trailer excessive
>> ok 95 - wrote first header + chunk
>> ok 96 - got error set in $!
>> ok 97 - wrote part of chunk end (\r)
>> ok 98 - got 400 response
>> ok 99 - connected for 1.1 chunked close trickle
>> ok 100 - got expected length
>> ok 101 - read expected body
>> ok 102 - connected for 1.1 chunked close
>> ok 103 - got expected length
>> ok 104 - read expected body
>> ok 105 - connected for chunked body + pipeline
>> ok 106 - got expected length
>> ok 107 - read expected body
>> ok 108 - got expected length
>> ok 109 - read expected body
>> ok 110 - connected for trickle header, one-shot body + pipeline
>> ok 111 - got expected length
>> ok 112 - read expected body
>> ok 113 - got expected length
>> ok 114 - read expected body
>> ok 115 - connected for trickle body
>> ok 116 - substr setup correct
>> ok 117 - got expected length
>> ok 118 - read expected body
>> ok 119 - connected for one-shot write
>> ok 120 - got expected length
>> ok 121 - read expected body
>> ok 122 - connected for trickle header, one-shot body
>> ok 123 - got expected length
>> ok 124 - read expected body
>> ok 125 - connected for 1.1 Connection: close
>> ok 126 - got expected length
>> ok 127 - read expected body
>> ok 128 - connected for 1.1 pipeline start
>> ok 129 - got expected length
>> ok 130 - read expected body
>> ok 131 - got expected length
>> ok 132 - read expected body \#2
>> ok 133 - TCP_DEFER_ACCEPT unchanged if previously set
>> ok 134 # skip SO_ACCEPTFILTER is FreeBSD-only
>> ok 135 # skip no lsof in PATH
>> ok 136 - use HTTP::Request::Common;
>> ok 137 - use Plack::Test;
>> ok 138 - got expected output
>> ok 139 - got error on ENOENT
>> ok 140 - error logged about missing command
>> 1..140
>> ok
>> t/httpd-https.t .............. skipped: certs/ missing for t/httpd-https.t, run /usr/bin/perl ./create-certs.perl in certs/
>> t/httpd-unix.t ...............
>> ok 1 - sockname works for UNIX
>> ok 2 - UNIX socket does not exist, yet
>> ok 3 - UNIX socket was bound by -httpd
>> ok 4 - client UNIX socket connected
>> ok 5 - wrote req to server
>> ok 6 - read response
>> ok 7 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 8 - httpd failure set $?
>> ok 9 - httpd failed with EADDRINUSE
>> ok 10 - got error message
>> ok 11 - stdout was empty
>> ok 12 - terminate existing process
>> ok 13 - existing httpd exited successfully
>> ok 14 - unix socket still exists
>> ok 15 - daemonized -W0 process
>> ok 16 - client UNIX socket connected
>> ok 17 - wrote req to server
>> ok 18 - read response
>> ok 19 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 20 - -W0 pid file written
>> ok 21 - signaled daemonized -W0 process
>> ok 22 - daemonized -W0 process exited
>> ok 23 - -W0 pid file unlinked at exit
>> ok 24 - daemonized -W1 process
>> ok 25 - client UNIX socket connected
>> ok 26 - wrote req to server
>> ok 27 - read response
>> ok 28 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 29 - -W1 pid file written
>> ok 30 - signaled daemonized -W1 process
>> ok 31 - daemonized -W1 process exited
>> ok 32 - -W1 pid file unlinked at exit
>> ok 33 - daemonized process again
>> ok 34 - client UNIX socket connected
>> ok 35 - wrote req to server
>> ok 36 - read response
>> ok 37 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 38 - pid file written
>> ok 39 - new child started
>> ok 40 - $new_pid valid
>> ok 41 - .oldbin pid file written
>> ok 42 - $old_pid valid
>> ok 43 - client UNIX socket connected
>> ok 44 - wrote req to server
>> ok 45 - read response
>> ok 46 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 47 - old PID file restored
>> ok 48 - .oldbin PID file gone
>> ok 49 - new child started again
>> ok 50 - .oldbin pid file written
>> ok 51 - .oldbin PID file gone
>> ok 52 - client UNIX socket connected
>> ok 53 - wrote req to server
>> ok 54 - read response
>> ok 55 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 56 - PID file is gone
>> ok 57 - daemonized w/o workers
>> ok 58 - client UNIX socket connected
>> ok 59 - wrote req to server
>> ok 60 - read response
>> ok 61 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 62 - client UNIX socket connected
>> ok 63 - wrote req to server
>> ok 64 - read response
>> ok 65 - set REMOTE_ADDR and REMOTE_PORT for Unix socket
>> ok 66 - PID file is gone
>> 1..66
>> ok
>> t/httpd.t ....................
>> ok 1 - use PublicInbox::Git;
>> ok 2 - use PublicInbox::Import;
>> ok 3 - init ran properly
>> ok 4 - sock created
>> ok 5 - got 405 on bad req
>> ok 6 - connected
>> ok 7 - wrote data to socket
>> ok 8 - read some bytes
>> ok 9 - got 404 response
>> ok 10 - EOF
>> ok 11 - smart clone successful
>> ok 12 - disable http.uploadpack
>> ok 13 - clone successful
>> ok 14 - killed httpd
>> ok 15 - fsck on cloned directory successful
>> ok 16 - TCP_DEFER_ACCEPT set
>> ok 17 # skip SO_ACCEPTFILTER is FreeBSD-only
>> 1..17
>> ok
>> t/hval.t .....................
>> ok 1 - use PublicInbox::Hval;
>> ok 2 - only obfuscated relevant addresses
>> ok 3 - to_filename has no trailing -
>> ok 4 - to_filename has no repeated -, and nothing past LF
>> ok 5 - to_filename squeezes -
>> ok 6 - empty string returns undef
>> ok 7 - src_escape works as intended
>> ok 8 - Hello/World.pm => Hello:World.pm => Hello/World.pm round trips
>> ok 9 - Zcat => Z5acat => Zcat round trips
>> ok 10 - hello world.c => hello::20world.c => hello world.c round trips
>> ok 11 - Eléanor => El::c3::83::c2::a9anor => Eléanor round trips
>> ok 12 - $at => Z24at => $at round trips
>> ok 13 - double-slash rejected
>> 1..13
>> ok
>> t/idx_stack.t ................
>> ok 1 - use PublicInbox::IdxStack;
>> ok 2 - nothing
>> ok 3 - no records
>> ok 4 - undef on empty
>> ok 5 - read_prepare
>> ok 6 - num_records
>> ok 7 - pop once
>> ok 8 - undef on empty
>> ok 9 - read_prepare
>> ok 10 - num_records
>> ok 11 - pop
>> ok 12 - pop-pop
>> ok 13 - empty
>> ok 14 # skip TEST_GIT_LOG unset
>> ok 15 # skip TEST_GIT_LOG unset
>> ok 16 # skip TEST_GIT_LOG unset
>> 1..16
>> ok
>> t/imap.t ..................... skipped: Parse::RecDescent missing for t/imap.t
>> t/imap_searchqp.t ............ skipped: Parse::RecDescent missing for t/imap_searchqp.t
>> t/imap_tracker.t .............
>> ok 1 - use PublicInbox::IMAPTracker;
>> ok 2 - ->new creates file
>> ok 3 - file persists after DESTROY
>> ok 4 - ->new does not create new file if old is present
>> ok 5 # skip TEST_STRESS_NPROC= not set
>> 1..5
>> ok
>> t/imapd-tls.t ................ skipped: Mail::IMAPClient, Parse::RecDescent missing for t/imapd-tls.t
>> t/imapd.t .................... skipped: Mail::IMAPClient, Mail::IMAPClient::BodyStructure, Parse::RecDescent missing for t/imapd.t
>> t/import.t ...................
>> ok 1 - added one message
>> ok 2 - got last object_id
>> ok 3 - string matches
>> ok 4 - length matches
>> ok 5 - waitpid succeeds on hash-object
>> ok 6 - hash-object
>> ok 7 - blob object_id matches exp
>> ok 8 - one revision created
>> ok 9 - added 2nd message
>> ok 10 - 2 revisions exist
>> ok 11 - message only inserted once
>> ok 12 - 2 revisions exist
>> ok 13 - added c message
>> ok 14 - added d message
>> ok 15 - added e message
>> ok 16 - added f message
>> ok 17 - added g message
>> ok 18 - added h message
>> ok 19 - added i message
>> ok 20 - added j message
>> ok 21 - added k message
>> ok 22 - added l message
>> ok 23 - added m message
>> ok 24 - added n message
>> ok 25 - added o message
>> ok 26 - added p message
>> ok 27 - added q message
>> ok 28 - added r message
>> ok 29 - added s message
>> ok 30 - added t message
>> ok 31 - added u message
>> ok 32 - added v message
>> ok 33 - added w message
>> ok 34 - added x message
>> ok 35 - added y message
>> ok 36 - added z message
>> ok 37 - 26 revisions exist after mass import
>> ok 38 - got mark
>> ok 39 - got old message deleted
>> ok 40 - remove is idempotent
>> ok 41 - mark == MISMATCH on mismatch
>> ok 42 - Message-ID matches
>> ok 43 - subject mismatch
>> ok 44 - check callback fails
>> ok 45 - message not added, so not removed
>> ok 46 - checkpoint works before ->done
>> ok 47 - checkpoint works after ->done
>> ok 48 - Import->add fails on non-existent dir
>> ok 49 - added PublicInbox::Eml message with nasty char in From
>> ok 50 - added PublicInbox::MIME message with nasty char in From
>> ok 51 - latest commit accepted by spammer
>> ok 52 - fsck reported no errors
>> 1..52
>> ok
>> t/inbox.t ....................
>> ok 1 - use PublicInbox::Inbox;
>> ok 2 - expanded protocol-relative
>> ok 3 - added trailing slash
>> ok 4 - undef base_url allowed
>> ok 5 - no cloneurls
>> ok 6 - default description
>> ok 7 - cloneurls update
>> ok 8 - description is utf8::valid
>> ok 9 - description updated
>> ok 10 - unlinked cloneurl & description
>> ok 11 - cloneurls memoized
>> ok 12 - description memoized
>> 1..12
>> ok
>> t/inbox_idle.t ...............
>> ok 1 - use PublicInbox::InboxIdle;
>> ok 2 - InboxIdle created
>> ok 3 # skip inotify or kqueue missing
>> ok 4 - 1 added
>> ok 5 - called on unlock
>> ok 6 - 1 added \#2
>> ok 7 - not called when unsubbed
>> ok 8 - InboxIdle created
>> ok 9 # skip inotify or kqueue missing
>> ok 10 - 2 added
>> ok 11 - called on unlock
>> ok 12 - 2 added \#2
>> ok 13 - not called when unsubbed
>> 1..13
>> ok
>> t/index-git-times.t ..........
>> ok 1 - use PublicInbox::Over;
>> ok 2 - indexlevel detected
>> ok 3 - --skip-docdata flag set on -index
>> ok 4 - datestamp from git author time
>> ok 5 - timestamp from git committer time
>> ok 6 - got one result for m:
>> ok 7 - Xapian stored datestamp
>> ok 8 - got one result for d:
>> ok 9 - Xapian search on datestamp
>> ok 10 - indexlevel detected after convert
>> ok 11 - --skip-docdata preserved after convert
>> ok 12 - v2 datestamp from git author time
>> ok 13 - v2 timestamp from git committer time
>> ok 14 - Xapian stored datestamp
>> ok 15 - got one result for d:
>> ok 16 - Xapian search on datestamp
>> ok 17 - indexlevel detected after convert
>> ok 18 - --skip-docdata preserved after convert
>> ok 19 - v2 datestamp from git author time
>> ok 20 - v2 timestamp from git committer time
>> ok 21 - Xapian stored datestamp
>> ok 22 - got one result for d:
>> ok 23 - Xapian search on datestamp
>> 1..23
>> ok
>> t/indexlevels-mirror-v1.t ....
>> ok 1 - first message added
>> ok 2 - index master
>> ok 3 - only one message in master, so far
>> ok 4 - first message in master indexed
>> ok 5 - v1 clone OK
>> ok 6 - v1 init OK
>> ok 7 - v1 index mirror OK
>> ok 8 - only one message, so far
>> ok 9 - read first message
>> ok 10 - 2nd message added
>> ok 11 - fetch OK
>> ok 12 - v1 index mirror again OK
>> ok 13 - 2nd message seen in mirror
>> ok 14 - got both messages in mirror
>> ok 15 - index master OK
>> ok 16 - 2nd message seen in master
>> ok 17 - got both messages in master
>> ok 18 - master has expected NNTP articles
>> ok 19 - mirror has expected NNTP articles
>> ok 20 - 2nd message removed
>> ok 21 - unindex NNTP article1basic
>> ok 22 - fetch OK
>> ok 23 - v1 index mirror again OK
>> ok 24 - 2nd message gone from mirror
>> ok 25 - message unavailable in mirror
>> ok 26 - \#3 message added
>> ok 27 - \#4 message added
>> ok 28 - \#5 message added
>> ok 29 - fetch OK
>> ok 30 - v1 index --reindex mirror OK
>> ok 31 - v1 master has expected NNTP articles
>> ok 32 - v1 mirror matches master articles
>> ok 33 - indexlevel detectable by Admin 1basic
>> ok 34 - compact basic
>> ok 35 - first message added
>> ok 36 - index master
>> ok 37 - only one message in master, so far
>> ok 38 - first message in master indexed
>> ok 39 - v1 clone OK
>> ok 40 - v1 init OK
>> ok 41 - v1 index mirror OK
>> ok 42 - only one message, so far
>> ok 43 - read first message
>> ok 44 - 2nd message added
>> ok 45 - fetch OK
>> ok 46 - v1 index mirror again OK
>> ok 47 - 2nd message seen in mirror
>> ok 48 - got both messages in mirror
>> ok 49 - index master OK
>> ok 50 - 2nd message seen in master
>> ok 51 - got both messages in master
>> ok 52 - master has expected NNTP articles
>> ok 53 - mirror has expected NNTP articles
>> ok 54 - 2nd message removed
>> ok 55 - unindex NNTP article1medium
>> ok 56 - v1 xcpdb OK
>> ok 57 - indexlevel detectable by Admin after xcpdb v1medium
>> ok 58 - v1 found m@2 via Xapian on medium
>> ok 59 - fetch OK
>> ok 60 - v1 index mirror again OK
>> ok 61 - 2nd message gone from mirror
>> ok 62 - message unavailable in mirror
>> ok 63 - v1 m@2 gone from Xapian in mirror on medium
>> ok 64 - \#3 message added
>> ok 65 - \#4 message added
>> ok 66 - \#5 message added
>> ok 67 - fetch OK
>> ok 68 - v1 index --reindex mirror OK
>> ok 69 - v1 master has expected NNTP articles
>> ok 70 - v1 mirror matches master articles
>> ok 71 - indexlevel detectable by Admin 1medium
>> ok 72 - compact medium
>> ok 73 - first message added
>> ok 74 - index master
>> ok 75 - only one message in master, so far
>> ok 76 - first message in master indexed
>> ok 77 - v1 clone OK
>> ok 78 - v1 init OK
>> ok 79 - v1 index mirror OK
>> ok 80 - only one message, so far
>> ok 81 - read first message
>> ok 82 - 2nd message added
>> ok 83 - fetch OK
>> ok 84 - v1 index mirror again OK
>> ok 85 - 2nd message seen in mirror
>> ok 86 - got both messages in mirror
>> ok 87 - index master OK
>> ok 88 - 2nd message seen in master
>> ok 89 - got both messages in master
>> ok 90 - master has expected NNTP articles
>> ok 91 - mirror has expected NNTP articles
>> ok 92 - 2nd message removed
>> ok 93 - unindex NNTP article1full
>> ok 94 - v1 xcpdb OK
>> ok 95 - indexlevel detectable by Admin after xcpdb v1full
>> ok 96 - v1 found m@2 via Xapian on full
>> ok 97 - fetch OK
>> ok 98 - v1 index mirror again OK
>> ok 99 - 2nd message gone from mirror
>> ok 100 - message unavailable in mirror
>> ok 101 - v1 m@2 gone from Xapian in mirror on full
>> ok 102 - \#3 message added
>> ok 103 - \#4 message added
>> ok 104 - \#5 message added
>> ok 105 - fetch OK
>> ok 106 - v1 index --reindex mirror OK
>> ok 107 - v1 master has expected NNTP articles
>> ok 108 - v1 mirror matches master articles
>> ok 109 - indexlevel detectable by Admin 1full
>> ok 110 - compact full
>> 1..110
>> ok
>> t/indexlevels-mirror.t .......
>> ok 1 - first message added
>> ok 2 - index master
>> ok 3 - only one message in master, so far
>> ok 4 - first message in master indexed
>> ok 5 - v2 clone OK
>> ok 6 - v2 init OK
>> ok 7 - v2 index mirror OK
>> ok 8 - only one message, so far
>> ok 9 - read first message
>> ok 10 - 2nd message added
>> ok 11 - fetch OK
>> ok 12 - v2 index mirror again OK
>> ok 13 - 2nd message seen in mirror
>> ok 14 - got both messages in mirror
>> ok 15 - index master OK
>> ok 16 - 2nd message seen in master
>> ok 17 - got both messages in master
>> ok 18 - master has expected NNTP articles
>> ok 19 - mirror has expected NNTP articles
>> ok 20 - 2nd message removed
>> ok 21 - unindex NNTP article2basic
>> ok 22 - fetch OK
>> ok 23 - v2 index mirror again OK
>> ok 24 - 2nd message gone from mirror
>> ok 25 - message unavailable in mirror
>> ok 26 - no Xapian shard directories for v2 basic
>> ok 27 - \#3 message added
>> ok 28 - \#4 message added
>> ok 29 - \#5 message added
>> ok 30 - fetch OK
>> ok 31 - v2 index --reindex mirror OK
>> ok 32 - v2 master has expected NNTP articles
>> ok 33 - v2 mirror matches master articles
>> ok 34 - indexlevel detectable by Admin 2basic
>> ok 35 - compact basic
>> ok 36 - first message added
>> ok 37 - index master
>> ok 38 - only one message in master, so far
>> ok 39 - first message in master indexed
>> ok 40 - v2 clone OK
>> ok 41 - v2 init OK
>> ok 42 - v2 index mirror OK
>> ok 43 - only one message, so far
>> ok 44 - read first message
>> ok 45 - 2nd message added
>> ok 46 - fetch OK
>> ok 47 - v2 index mirror again OK
>> ok 48 - 2nd message seen in mirror
>> ok 49 - got both messages in mirror
>> ok 50 - index master OK
>> ok 51 - 2nd message seen in master
>> ok 52 - got both messages in master
>> ok 53 - master has expected NNTP articles
>> ok 54 - mirror has expected NNTP articles
>> ok 55 - 2nd message removed
>> ok 56 - unindex NNTP article2medium
>> ok 57 - v2 xcpdb OK
>> ok 58 - indexlevel detectable by Admin after xcpdb v2medium
>> ok 59 - v2 found m@2 via Xapian on medium
>> ok 60 - fetch OK
>> ok 61 - v2 index mirror again OK
>> ok 62 - 2nd message gone from mirror
>> ok 63 - message unavailable in mirror
>> ok 64 - v2 m@2 gone from Xapian in mirror on medium
>> ok 65 - \#3 message added
>> ok 66 - \#4 message added
>> ok 67 - \#5 message added
>> ok 68 - fetch OK
>> ok 69 - v2 index --reindex mirror OK
>> ok 70 - v2 master has expected NNTP articles
>> ok 71 - v2 mirror matches master articles
>> ok 72 - indexlevel detectable by Admin 2medium
>> ok 73 - compact medium
>> ok 74 - first message added
>> ok 75 - index master
>> ok 76 - only one message in master, so far
>> ok 77 - first message in master indexed
>> ok 78 - v2 clone OK
>> ok 79 - v2 init OK
>> ok 80 - v2 index mirror OK
>> ok 81 - only one message, so far
>> ok 82 - read first message
>> ok 83 - 2nd message added
>> ok 84 - fetch OK
>> ok 85 - v2 index mirror again OK
>> ok 86 - 2nd message seen in mirror
>> ok 87 - got both messages in mirror
>> ok 88 - index master OK
>> ok 89 - 2nd message seen in master
>> ok 90 - got both messages in master
>> ok 91 - master has expected NNTP articles
>> ok 92 - mirror has expected NNTP articles
>> ok 93 - 2nd message removed
>> ok 94 - unindex NNTP article2full
>> ok 95 - v2 xcpdb OK
>> ok 96 - indexlevel detectable by Admin after xcpdb v2full
>> ok 97 - v2 found m@2 via Xapian on full
>> ok 98 - fetch OK
>> ok 99 - v2 index mirror again OK
>> ok 100 - 2nd message gone from mirror
>> ok 101 - message unavailable in mirror
>> ok 102 - v2 m@2 gone from Xapian in mirror on full
>> ok 103 - \#3 message added
>> ok 104 - \#4 message added
>> ok 105 - \#5 message added
>> ok 106 - fetch OK
>> ok 107 - v2 index --reindex mirror OK
>> ok 108 - v2 master has expected NNTP articles
>> ok 109 - v2 mirror matches master articles
>> ok 110 - indexlevel detectable by Admin 2full
>> ok 111 - compact full
>> 1..111
>> ok
>> # err=no email in From:  or Sender:
>> # no name in From:  or Sender:
>> # err=no email in From:  or Sender:
>> # no name in From:  or Sender:
>> t/init.t .....................
>> ok 1 - public-inbox-init OK
>> ok 2 - indexlevel unset by default
>> ok 3 - config exists, now
>> ok 4 - public-inbox-init OK (idempotent)
>> ok 5 - public-inbox-init clist OK
>> ok 6 - permissions preserved
>> ok 7 - attempting to init V2 from V1 fails
>> ok 8 - no lock leftover after init
>> ok 9 - lock exists
>> ok 10 - lock init failed
>> ok 11 - got expected exit code on lock failure
>> ok 12 - -init did not unlink lock on failure
>> ok 13 - public-inbox-init rejects LF in inboxdir
>> ok 14 - reported \n
>> ok 15 - no junk files left behind
>> ok 16 - initializes non-existent hierarchy
>> ok 17 - directory created
>> ok 18 - fails on D/F conflict
>> ok 19 - use PublicInbox::Msgmap;
>> ok 20 - public-inbox-init -V2 OK
>> ok 21 - v2list directory exists
>> ok 22 - msgmap exists
>> ok 23 - catch-all.git directory exists
>> ok 24 - public-inbox-init is idempotent
>> ok 25 - idempotent invocation w/o -V2 does not make inbox v1
>> ok 26 - indexlevel unset by default
>> ok 27 - initializing V2 as V1 fails
>> ok 28 - -init -L medium
>> ok 29 - indexlevel set to 'medium'
>> ok 30 - detected expected level w/o config
>> ok 31 - docdata written by default
>> ok 32 - -init -L basic
>> ok 33 - indexlevel set to 'basic'
>> ok 34 - detected expected level w/o config
>> ok 35 - docdata written by default
>> ok 36 - -init -V1 --skip-docdata
>> ok 37 - detected default indexlevel -V1
>> ok 38 - docdata skip set -V1
>> ok 39 - has_threadid flag set on new inbox
>> ok 40 - -init -V2 --skip-docdata
>> ok 41 - detected default indexlevel -V2
>> ok 42 - docdata skip set -V2
>> ok 43 - has_threadid flag set on new inbox
>> ok 44 - --skip-epoch 1
>> ok 45 - skip OK
>> ok 46 - --skip-epoch 1
>> ok 47 - skip OK
>> ok 48 - --skip-epoch 2
>> ok 49 - skipping 2 works, too
>> ok 50 - --skip-artnum -V2
>> ok 51 - deliver V1
>> ok 52 - V2 NNTP article numbers skipped via --skip-artnum
>> ok 53 - --skip-artnum -V1
>> ok 54 - deliver V1
>> ok 55 - V1 NNTP article numbers skipped via --skip-artnum
>> 1..55
>> ok
>> t/kqnotify.t ................. skipped: KQNotify is only for *BSD systems
>> t/linkify.t ..................
>> ok 1 - trailing period not in URL
>> ok 2 - missing trailing slash OK
>> ok 3 - trailing ) not in URL
>> ok 4 - trailing semicolon not in URL
>> ok 5 - URL preserved
>> ok 6 - paired () in URL OK
>> ok 7 - query preserved
>> ok 8 - query + fragment preserved
>> ok 9 - root URL preserved
>> ok 10 - root + fragment
>> ok 11 - Markdown-compatible
>> ok 12 - Markdown title compatible
>> ok 13 - Markdown-compatible end of sentence
>> ok 14 - no quote('%s') in URL
>> ok 15 - no quote('%s') in URL array
>> ok 16 - no quote("%s") in URL
>> ok 17 - no quote("%s") in URL array
>> ok 18 - no quote(q!%s!) in URL
>> ok 19 - no quote(q!%s!) in URL array
>> ok 20 - no quote(q(%s)) in URL
>> ok 21 - no quote(q(%s)) in URL array
>> ok 22 - punctuation with unpaired ) OK
>> ok 23 - IDN message escaped properly
>> 1..23
>> ok
>> t/mda.t ......................
>> ok 1 - spamc ham mock found (run in top of source tree
>> ok 2 - spamc mock found (run in top of source tree
>> ok 3 - setup ~/ for testing
>> ok 4 - setup ~/.public-inbox
>> ok 5 - HTML conversion is correct
>> ok 6 - email parsed correctly
>> ok 7 - message date parsed correctly
>> ok 8
>> ok 9 - good revision committed
>> ok 10 - author info set correctly
>> ok 11 - committer info set correctly
>> ok 12 - nothing in PI_EMERGENCY before
>> ok 13
>> ok 14 - bad revision not committed
>> ok 15 - PI_EMERGENCY is written to
>> ok 16 - no error on undeliverable (bad recipient)
>> ok 17 - bad revision not committed (bad recipient)
>> ok 18 - faildir written to
>> ok 19 - no error on undeliverable (duplicate Message-ID)
>> ok 20 - bad revision not committed (duplicate Message-ID)
>> ok 21 - faildir written to
>> ok 22 - duplicate Message-ID message
>> ok 23 - no error on undeliverable (missing From:)
>> ok 24 - bad revision not committed (missing From:)
>> ok 25 - faildir written to
>> ok 26 - no error on undeliverable (short subject:)
>> ok 27 - bad revision not committed (short subject:)
>> ok 28 - faildir written to
>> ok 29 - no error on undeliverable (no date)
>> ok 30 - bad revision not committed (no date)
>> ok 31 - faildir written to
>> ok 32 - no error on undeliverable (bad date)
>> ok 33 - bad revision not committed (bad date)
>> ok 34 - faildir written to
>> ok 35
>> ok 36 - message delivered
>> ok 37 - no failure from learning spam
>> ok 38 - no failure from learning spam idempotently
>> ok 39 - learned ham without failure
>> ok 40 - ham message delivered
>> ok 41 - learned ham idempotently
>> ok 42 - learned ham without failure
>> ok 43 - ham message delivered
>> ok 44 - <html> filtered
>> ok 45 - mda OK with List-Id match
>> ok 46 - delivered message w/ List-ID matches
>> ok 47 - mda OK with List-Id match and --no-precheck
>> ok 48 - --no-precheck delivered message anyways
>> ok 49 - mda OK with multiple List-Id matches
>> ok 50 - multi List-ID match delivered
>> ok 51 - warned about multiple List-ID
>> ok 52 - rm-ed via -learn
>> ok 53 - changed in git
>> 1..53
>> ok
>> t/mda_filter_rubylang.t ......
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2
>> ok 3 - public-inbox-init
>> ok 4 - public-inbox-index
>> ok 5
>> ok 6
>> ok 7 - message delivered
>> ok 8 - message delivered
>> ok 9 - got one result for alerts:1
>> ok 10 - got expected MID for 1
>> ok 11 - got one result for alerts:2
>> ok 12 - got expected MID for 2
>> ok 13 - no warnings
>> ok 14 - public-inbox-init
>> ok 15 - public-inbox-index
>> ok 16
>> ok 17
>> ok 18 - message delivered
>> ok 19 - message delivered
>> ok 20 - got one result for alerts:1
>> ok 21 - got expected MID for 1
>> ok 22 - got one result for alerts:2
>> ok 23 - got expected MID for 2
>> ok 24 - no warnings
>> 1..24
>> ok
>> t/mid.t ......................
>> ok 1
>> ok 2
>> ok 3
>> ok 4 - percent always converted to sha1 to workaround buggy httpds
>> ok 5 - regular ID not compressed
>> ok 6 - mids in common case
>> ok 7 - 2 mids
>> ok 8 - dup mids
>> ok 9 - comment ignored
>> ok 10 - bare mid OK
>> ok 11 - references combines with In-Reply-To
>> ok 12 - multiline References OK
>> ok 13 - drop \t in References <656C30A1EFC89F6B2082D9B6@localhost>
>> ok 14 - drop \t in Message-ID
>> ok 15
>> ok 16 - X-Alt-Message-ID can be indexed
>> 1..16
>> ok
>> t/mime.t .....................
>> ok 1 - use PublicInbox::Eml;
>> ok 2 - use PublicInbox::MIME;
>> ok 3 - body matches expected
>> ok 4 - at expected level
>> ok 5 - body OK
>> ok 6 - at expected level
>> ok 7 - sig "matches"
>> ok 8 - got 2 parts
>> ok 9 - stringified sufficiently close to original
>> ok 10 - body matches expected
>> ok 11 - at expected level
>> ok 12 - body OK
>> ok 13 - at expected level
>> ok 14 - sig "matches"
>> ok 15 - got 2 parts
>> ok 16 - stringified sufficiently close to original
>> 1..16
>> ok
>> t/msg_iter.t .................
>> ok 1 - use PublicInbox::MsgIter;
>> ok 2 - order is fine
>> ok 3 - nested part shows up properly
>> ok 4 - no error
>> ok 5 - got non-empty message
>> ok 6 - no unescaped $$$
>> ok 7 - tab expanded with X-UNKNOWN
>> ok 8 - got bullet point when X-UNKNOWN assumes UTF-8
>> ok 9 - attribution matches
>> ok 10 - quoted section matches
>> ok 11 - non-quoted section matches
>> ok 12 - only three sections for short message
>> ok 13 - no warnings
>> ok 14 - no warnings on giant message
>> ok 15 - result matches expected
>> ok 16 - attribution is first section
>> ok 17 - section ends with newline
>> ok 18 - section ends with newline
>> ok 19 - long quoted section matches
>> ok 20 - long quoted section matches
>> 1..20
>> ok
>> t/msgmap.t ...................
>> ok 1 - use PublicInbox::Msgmap;
>> ok 2 - empty min max on new DB
>> ok 3 - mid a@b inserted
>> ok 4 - mid c@d inserted
>> ok 5 - mid e@f inserted
>> ok 6 - mid g@h inserted
>> ok 7 - mid aa@bb inserted
>> ok 8 - mid aa@cc inserted
>> ok 9 - duplicate mid_insert in undef result
>> ok 10 - existing number not clobbered
>> ok 11 - got expected num after failing mid_insert
>> ok 12 - num:4 maps correctly
>> ok 13 - num:5 maps correctly
>> ok 14 - num:1 maps correctly
>> ok 15 - num:2 maps correctly
>> ok 16 - num:6 maps correctly
>> ok 17 - num:3 maps correctly
>> ok 18 - mid:a@b maps correctly
>> ok 19 - mid:c@d maps correctly
>> ok 20 - mid:e@f maps correctly
>> ok 21 - mid:g@h maps correctly
>> ok 22 - mid:aa@bb maps correctly
>> ok 23 - mid:aa@cc maps correctly
>> ok 24 - last commit not set
>> ok 25 - previous last commit (undef) returned
>> ok 26 - last commit was set correctly
>> ok 27 - returned previously set commit
>> ok 28 - new commit was set correctly
>> ok 29 - deleted a@b
>> ok 30 - delete again returns zero
>> ok 31 - num_for fails on deleted msg
>> ok 32 - idempotent DB creation
>> ok 33 - article min OK
>> ok 34 - article max OK
>> ok 35 - article counts OK
>> ok 36 - last number not recycled
>> ok 37 - Cloned temporary DB matches
>> ok 38 - temporary DB is writable
>> ok 39 - atfork_* work on tmp_clone
>> 1..39
>> ok
>> t/msgtime.t ..................
>> ok 1 - Fri, 02 Oct 1993 00:00:00 -2400
>> ok 2 - Fri, 02 Oct 1993 00:00:00 -2330
>> ok 3 - Fri, 02 Oct 1993 00:00:00 -2300
>> ok 4 - Fri, 02 Oct 1993 00:00:00 -2230
>> ok 5 - Fri, 02 Oct 1993 00:00:00 -2200
>> ok 6 - Fri, 02 Oct 1993 00:00:00 -2130
>> ok 7 - Fri, 02 Oct 1993 00:00:00 -2100
>> ok 8 - Fri, 02 Oct 1993 00:00:00 -2030
>> ok 9 - Fri, 02 Oct 1993 00:00:00 -2000
>> ok 10 - Fri, 02 Oct 1993 00:00:00 -1930
>> ok 11 - Fri, 02 Oct 1993 00:00:00 -1900
>> ok 12 - Fri, 02 Oct 1993 00:00:00 -1830
>> ok 13 - Fri, 02 Oct 1993 00:00:00 -1800
>> ok 14 - Fri, 02 Oct 1993 00:00:00 -1730
>> ok 15 - Fri, 02 Oct 1993 00:00:00 -1700
>> ok 16 - Fri, 02 Oct 1993 00:00:00 -1630
>> ok 17 - Fri, 02 Oct 1993 00:00:00 -1600
>> ok 18 - Fri, 02 Oct 1993 00:00:00 -1530
>> ok 19 - Fri, 02 Oct 1993 00:00:00 -1500
>> ok 20 - Fri, 02 Oct 1993 00:00:00 -1430
>> ok 21 - Fri, 02 Oct 1993 00:00:00 -1400
>> ok 22 - Fri, 02 Oct 1993 00:00:00 -1330
>> ok 23 - Fri, 02 Oct 1993 00:00:00 -1300
>> ok 24 - Fri, 02 Oct 1993 00:00:00 -1230
>> ok 25 - Fri, 02 Oct 1993 00:00:00 -1200
>> ok 26 - Fri, 02 Oct 1993 00:00:00 -1130
>> ok 27 - Fri, 02 Oct 1993 00:00:00 -1100
>> ok 28 - Fri, 02 Oct 1993 00:00:00 -1030
>> ok 29 - Fri, 02 Oct 1993 00:00:00 -1000
>> ok 30 - Fri, 02 Oct 1993 00:00:00 -0930
>> ok 31 - Fri, 02 Oct 1993 00:00:00 -0900
>> ok 32 - Fri, 02 Oct 1993 00:00:00 -0830
>> ok 33 - Fri, 02 Oct 1993 00:00:00 -0800
>> ok 34 - Fri, 02 Oct 1993 00:00:00 -0730
>> ok 35 - Fri, 02 Oct 1993 00:00:00 -0700
>> ok 36 - Fri, 02 Oct 1993 00:00:00 -0630
>> ok 37 - Fri, 02 Oct 1993 00:00:00 -0600
>> ok 38 - Fri, 02 Oct 1993 00:00:00 -0530
>> ok 39 - Fri, 02 Oct 1993 00:00:00 -0500
>> ok 40 - Fri, 02 Oct 1993 00:00:00 -0430
>> ok 41 - Fri, 02 Oct 1993 00:00:00 -0400
>> ok 42 - Fri, 02 Oct 1993 00:00:00 -0330
>> ok 43 - Fri, 02 Oct 1993 00:00:00 -0300
>> ok 44 - Fri, 02 Oct 1993 00:00:00 -0230
>> ok 45 - Fri, 02 Oct 1993 00:00:00 -0200
>> ok 46 - Fri, 02 Oct 1993 00:00:00 -0130
>> ok 47 - Fri, 02 Oct 1993 00:00:00 -0100
>> ok 48 - Fri, 02 Oct 1993 00:00:00 -0030
>> ok 49 - Fri, 02 Oct 1993 00:00:00 +0000
>> ok 50 - Fri, 02 Oct 1993 00:00:00 +0030
>> ok 51 - Fri, 02 Oct 1993 00:00:00 +0100
>> ok 52 - Fri, 02 Oct 1993 00:00:00 +0130
>> ok 53 - Fri, 02 Oct 1993 00:00:00 +0200
>> ok 54 - Fri, 02 Oct 1993 00:00:00 +0230
>> ok 55 - Fri, 02 Oct 1993 00:00:00 +0300
>> ok 56 - Fri, 02 Oct 1993 00:00:00 +0330
>> ok 57 - Fri, 02 Oct 1993 00:00:00 +0400
>> ok 58 - Fri, 02 Oct 1993 00:00:00 +0430
>> ok 59 - Fri, 02 Oct 1993 00:00:00 +0500
>> ok 60 - Fri, 02 Oct 1993 00:00:00 +0530
>> ok 61 - Fri, 02 Oct 1993 00:00:00 +0600
>> ok 62 - Fri, 02 Oct 1993 00:00:00 +0630
>> ok 63 - Fri, 02 Oct 1993 00:00:00 +0700
>> ok 64 - Fri, 02 Oct 1993 00:00:00 +0730
>> ok 65 - Fri, 02 Oct 1993 00:00:00 +0800
>> ok 66 - Fri, 02 Oct 1993 00:00:00 +0830
>> ok 67 - Fri, 02 Oct 1993 00:00:00 +0900
>> ok 68 - Fri, 02 Oct 1993 00:00:00 +0930
>> ok 69 - Fri, 02 Oct 1993 00:00:00 +1000
>> ok 70 - Fri, 02 Oct 1993 00:00:00 +1030
>> ok 71 - Fri, 02 Oct 1993 00:00:00 +1100
>> ok 72 - Fri, 02 Oct 1993 00:00:00 +1130
>> ok 73 - Fri, 02 Oct 1993 00:00:00 +1200
>> ok 74 - Fri, 02 Oct 1993 00:00:00 +1230
>> ok 75 - Fri, 02 Oct 1993 00:00:00 +1300
>> ok 76 - Fri, 02 Oct 1993 00:00:00 +1330
>> ok 77 - Fri, 02 Oct 1993 00:00:00 +1400
>> ok 78 - Fri, 02 Oct 1993 00:00:00 +1430
>> ok 79 - Fri, 02 Oct 1993 00:00:00 +1500
>> ok 80 - Fri, 02 Oct 1993 00:00:00 +1530
>> ok 81 - Fri, 02 Oct 1993 00:00:00 +1600
>> ok 82 - Fri, 02 Oct 1993 00:00:00 +1630
>> ok 83 - Fri, 02 Oct 1993 00:00:00 +1700
>> ok 84 - Fri, 02 Oct 1993 00:00:00 +1730
>> ok 85 - Fri, 02 Oct 1993 00:00:00 +1800
>> ok 86 - Fri, 02 Oct 1993 00:00:00 +1830
>> ok 87 - Fri, 02 Oct 1993 00:00:00 +1900
>> ok 88 - Fri, 02 Oct 1993 00:00:00 +1930
>> ok 89 - Fri, 02 Oct 1993 00:00:00 +2000
>> ok 90 - Fri, 02 Oct 1993 00:00:00 +2030
>> ok 91 - Fri, 02 Oct 1993 00:00:00 +2100
>> ok 92 - Fri, 02 Oct 1993 00:00:00 +2130
>> ok 93 - Fri, 02 Oct 1993 00:00:00 +2200
>> ok 94 - Fri, 02 Oct 1993 00:00:00 +2230
>> ok 95 - Fri, 02 Oct 1993 00:00:00 +2300
>> ok 96 - Fri, 02 Oct 1993 00:00:00 +2330
>> ok 97 - Fri, 02 Oct 1993 00:00:00 +2400
>> ok 98 - Mon, 22 Jan 2007 13:16:24 -2400
>> ok 99 - Mon, 22 Jan 2007 13:16:24 -2330
>> ok 100 - Mon, 22 Jan 2007 13:16:24 -2300
>> ok 101 - Mon, 22 Jan 2007 13:16:24 -2230
>> ok 102 - Mon, 22 Jan 2007 13:16:24 -2200
>> ok 103 - Mon, 22 Jan 2007 13:16:24 -2130
>> ok 104 - Mon, 22 Jan 2007 13:16:24 -2100
>> ok 105 - Mon, 22 Jan 2007 13:16:24 -2030
>> ok 106 - Mon, 22 Jan 2007 13:16:24 -2000
>> ok 107 - Mon, 22 Jan 2007 13:16:24 -1930
>> ok 108 - Mon, 22 Jan 2007 13:16:24 -1900
>> ok 109 - Mon, 22 Jan 2007 13:16:24 -1830
>> ok 110 - Mon, 22 Jan 2007 13:16:24 -1800
>> ok 111 - Mon, 22 Jan 2007 13:16:24 -1730
>> ok 112 - Mon, 22 Jan 2007 13:16:24 -1700
>> ok 113 - Mon, 22 Jan 2007 13:16:24 -1630
>> ok 114 - Mon, 22 Jan 2007 13:16:24 -1600
>> ok 115 - Mon, 22 Jan 2007 13:16:24 -1530
>> ok 116 - Mon, 22 Jan 2007 13:16:24 -1500
>> ok 117 - Mon, 22 Jan 2007 13:16:24 -1430
>> ok 118 - Mon, 22 Jan 2007 13:16:24 -1400
>> ok 119 - Mon, 22 Jan 2007 13:16:24 -1330
>> ok 120 - Mon, 22 Jan 2007 13:16:24 -1300
>> ok 121 - Mon, 22 Jan 2007 13:16:24 -1230
>> ok 122 - Mon, 22 Jan 2007 13:16:24 -1200
>> ok 123 - Mon, 22 Jan 2007 13:16:24 -1130
>> ok 124 - Mon, 22 Jan 2007 13:16:24 -1100
>> ok 125 - Mon, 22 Jan 2007 13:16:24 -1030
>> ok 126 - Mon, 22 Jan 2007 13:16:24 -1000
>> ok 127 - Mon, 22 Jan 2007 13:16:24 -0930
>> ok 128 - Mon, 22 Jan 2007 13:16:24 -0900
>> ok 129 - Mon, 22 Jan 2007 13:16:24 -0830
>> ok 130 - Mon, 22 Jan 2007 13:16:24 -0800
>> ok 131 - Mon, 22 Jan 2007 13:16:24 -0730
>> ok 132 - Mon, 22 Jan 2007 13:16:24 -0700
>> ok 133 - Mon, 22 Jan 2007 13:16:24 -0630
>> ok 134 - Mon, 22 Jan 2007 13:16:24 -0600
>> ok 135 - Mon, 22 Jan 2007 13:16:24 -0530
>> ok 136 - Mon, 22 Jan 2007 13:16:24 -0500
>> ok 137 - Mon, 22 Jan 2007 13:16:24 -0430
>> ok 138 - Mon, 22 Jan 2007 13:16:24 -0400
>> ok 139 - Mon, 22 Jan 2007 13:16:24 -0330
>> ok 140 - Mon, 22 Jan 2007 13:16:24 -0300
>> ok 141 - Mon, 22 Jan 2007 13:16:24 -0230
>> ok 142 - Mon, 22 Jan 2007 13:16:24 -0200
>> ok 143 - Mon, 22 Jan 2007 13:16:24 -0130
>> ok 144 - Mon, 22 Jan 2007 13:16:24 -0100
>> ok 145 - Mon, 22 Jan 2007 13:16:24 -0030
>> ok 146 - Mon, 22 Jan 2007 13:16:24 +0000
>> ok 147 - Mon, 22 Jan 2007 13:16:24 +0030
>> ok 148 - Mon, 22 Jan 2007 13:16:24 +0100
>> ok 149 - Mon, 22 Jan 2007 13:16:24 +0130
>> ok 150 - Mon, 22 Jan 2007 13:16:24 +0200
>> ok 151 - Mon, 22 Jan 2007 13:16:24 +0230
>> ok 152 - Mon, 22 Jan 2007 13:16:24 +0300
>> ok 153 - Mon, 22 Jan 2007 13:16:24 +0330
>> ok 154 - Mon, 22 Jan 2007 13:16:24 +0400
>> ok 155 - Mon, 22 Jan 2007 13:16:24 +0430
>> ok 156 - Mon, 22 Jan 2007 13:16:24 +0500
>> ok 157 - Mon, 22 Jan 2007 13:16:24 +0530
>> ok 158 - Mon, 22 Jan 2007 13:16:24 +0600
>> ok 159 - Mon, 22 Jan 2007 13:16:24 +0630
>> ok 160 - Mon, 22 Jan 2007 13:16:24 +0700
>> ok 161 - Mon, 22 Jan 2007 13:16:24 +0730
>> ok 162 - Mon, 22 Jan 2007 13:16:24 +0800
>> ok 163 - Mon, 22 Jan 2007 13:16:24 +0830
>> ok 164 - Mon, 22 Jan 2007 13:16:24 +0900
>> ok 165 - Mon, 22 Jan 2007 13:16:24 +0930
>> ok 166 - Mon, 22 Jan 2007 13:16:24 +1000
>> ok 167 - Mon, 22 Jan 2007 13:16:24 +1030
>> ok 168 - Mon, 22 Jan 2007 13:16:24 +1100
>> ok 169 - Mon, 22 Jan 2007 13:16:24 +1130
>> ok 170 - Mon, 22 Jan 2007 13:16:24 +1200
>> ok 171 - Mon, 22 Jan 2007 13:16:24 +1230
>> ok 172 - Mon, 22 Jan 2007 13:16:24 +1300
>> ok 173 - Mon, 22 Jan 2007 13:16:24 +1330
>> ok 174 - Mon, 22 Jan 2007 13:16:24 +1400
>> ok 175 - Mon, 22 Jan 2007 13:16:24 +1430
>> ok 176 - Mon, 22 Jan 2007 13:16:24 +1500
>> ok 177 - Mon, 22 Jan 2007 13:16:24 +1530
>> ok 178 - Mon, 22 Jan 2007 13:16:24 +1600
>> ok 179 - Mon, 22 Jan 2007 13:16:24 +1630
>> ok 180 - Mon, 22 Jan 2007 13:16:24 +1700
>> ok 181 - Mon, 22 Jan 2007 13:16:24 +1730
>> ok 182 - Mon, 22 Jan 2007 13:16:24 +1800
>> ok 183 - Mon, 22 Jan 2007 13:16:24 +1830
>> ok 184 - Mon, 22 Jan 2007 13:16:24 +1900
>> ok 185 - Mon, 22 Jan 2007 13:16:24 +1930
>> ok 186 - Mon, 22 Jan 2007 13:16:24 +2000
>> ok 187 - Mon, 22 Jan 2007 13:16:24 +2030
>> ok 188 - Mon, 22 Jan 2007 13:16:24 +2100
>> ok 189 - Mon, 22 Jan 2007 13:16:24 +2130
>> ok 190 - Mon, 22 Jan 2007 13:16:24 +2200
>> ok 191 - Mon, 22 Jan 2007 13:16:24 +2230
>> ok 192 - Mon, 22 Jan 2007 13:16:24 +2300
>> ok 193 - Mon, 22 Jan 2007 13:16:24 +2330
>> ok 194 - Mon, 22 Jan 2007 13:16:24 +2400
>> ok 195 - Wed, 13 Dec 2006 10:26:38 +1
>> ok 196 - Fri, 3 Feb 2006 18:11:22 -00
>> ok 197 - Thursday, 20 Feb 2003 01:14:34 +000
>> ok 198 - Fri, 28 Jun 2002 12:54:40 -700
>> ok 199 - Sat, 12 Jan 2002 12:52:57 -200
>> ok 200 - Mon, 05 Nov 2001 10:36:16 -800
>> ok 201 - Tue, 3 Jun 2003 8:58:23 --500
>> ok 202 - Thu, 18 May 100 10:40:43 +0200 (MET DST)
>> ok 203 - Thu, 18 May 2000 10:40:43 +0200
>> ok 204 - Tue, 27 Feb 2007 16:23:25 -0060
>> ok 205 - Wed, 20 Dec 2006 05:32:58 -0420
>> ok 206 - Wed, 20 Dec 2006 05:32:58 +0420
>> ok 207 - Thu, 14 Dec 2006 00:20:24 +0480
>> ok 208 - Thu, 14 Dec 2006 00:20:24 -0480
>> ok 209 - Mon, 14 Apr 2014 07:59:01 -0007
>> ok 210 - Sat, 27 Sep 1997 10:02:32
>> ok 211 - Fri, 02 Oct 1993 00:00:00 UT
>> ok 212 - Fri, 02 Oct 1993 00:00:00 GMT
>> ok 213 - Fri, 02 Oct 1993 00:00:00 Z
>> ok 214 - Fri, 02 Oct 1993 00:00:00 EDT
>> ok 215 - Fri, 1 Jan 1904 10:12:31 +0100
>> ok 216 - Fri, 9 Mar 71685 18:45:56 +0000
>> 1..216
>> ok
>> t/multi-mid.t ................
>> ok 1 - added bad
>> ok 2 - added good
>> ok 3 - convert to v2
>> ok 4 - no errors or warnings from -convert
>> ok 5 - min, max article numbers unchanged
>> ok 6 - v2 conversion times match
>> ok 7 - init clone
>> ok 8 - index the clone
>> ok 9 - v2 clone times match
>> ok 10 - added good
>> ok 11 - added bad
>> ok 12 - convert to v2
>> ok 13 - no errors or warnings from -convert
>> ok 14 - min, max article numbers unchanged
>> ok 15 - v2 conversion times match
>> ok 16 - init clone
>> ok 17 - index the clone
>> ok 18 - v2 clone times match
>> 1..18
>> ok
>> t/nntp.t .....................
>> ok 1 - use PublicInbox::NNTP;
>> ok 2 - use PublicInbox::Inbox;
>> ok 3 - '[\[foo\]]' matches '[foo]' using qr/\A\[foo\]\z/
>> ok 4 - '*' matches 'any' using qr/.*/
>> ok 5 - 'foo.*' does not match 'bar.foo.bar' using qr/\Afoo\..*\z/
>> ok 6 - normal re with (?{"HI"}) matches, but ...
>> ok 7 - '(?{"HI"})' does not match 'HI' using qr/\A\(.\{\"HI\"\}\)\z/
>> ok 8 - normal re with [(?{"HI"})] matches, but ...
>> ok 9 - '[(?{"HI"})]' does not match 'HI' using qr/\A\"HI\)\z/
>> ok 10 - '*' matches 'any' using (?^:\A(?:.*)\z)
>> ok 11 - 'a.t,a.s.r' matches 'a.s.r' using (?^:\A(?:a\.t|a\.s\.r)\z)
>> ok 12 - 'a.t,a.s.*' matches 'a.s.r' using (?^:\A(?:a\.t|a\.s\..*)\z)
>> ok 13 - roundtripped: 20141109 060606 GMT
>> ok 14 - roundtripped: 141109 060606 GMT
>> ok 15 - roundtripped: 930724 060606 GMT
>> ok 16 - roundtripped: 710101 000000
>> ok 17 - roundtripped: 720101 000000
>> ok 18 - YYYYMMDD and YYMMDD parse identically
>> ok 19 - 930724 was in 1993
>> ok 20 - roundtripped: 700101 000000 GMT
>> ok 21 - epoch parsed correctly
>> ok 22 - 1972 > 1971
>> ok 23 - 1971 > Unix epoch
>> ok 24 - URL expanded
>> ok 25 - Message-ID unchanged
>> ok 26 - Archived-At: set
>> ok 27 - List-Archive: set
>> ok 28 - List-Post: set
>> ok 29 - Newsgroups: set
>> ok 30 - Xref: set
>> ok 31 - Message-ID unchanged
>> ok 32 - Archived-At: appended
>> ok 33 - Old Xref: clobbered
>> 1..33
>> ok
>> t/nntpd-tls.t ................ skipped: certs/ missing for t/nntpd-tls.t, run /usr/bin/perl ./create-certs.perl in certs/
>> # waiting for initial fetch...
>> # inbox unlocked on initial fetch
>> t/nntpd-v2.t .................
>> ok 1 - use PublicInbox::Msgmap;
>> ok 2 - init test-nntpd
>> ok 3 - init xyz
>> ok 4 - disable spamcheck
>> ok 5 - sock created
>> ok 6 - deleted x.y.z group
>> ok 7 - LIST works
>> ok 8 - GROUP works
>> ok 9 - listgroup OK
>> ok 10 - RFC3977 8.4.2 compliant LIST OVERVIEW.FMT
>> ok 11 - STARTTLS fails when unconfigured
>> ok 12 - got 580 code on server w/o TLS
>> ok 13 - got greeting
>> ok 14 - wrote spaces
>> ok 15 - wrote nothing
>> ok 16 - GOT EOF on cntrl
>> ok 17 - got greeting
>> ok 18 - CAPABILITIES works
>> ok 19 - STARTTLS not advertised
>> ok 20 - DEFLATE advertised
>> ok 21 - newgroups OK
>> ok 22 - XHDR from by message-id works
>> ok 23 - from by article number works
>> ok 24 - from by article range works
>> ok 25 - 225 response for HDR
>> ok 26 - got expected response for HDR
>> ok 27 - XHDR date by message-id works
>> ok 28 - date by article number works
>> ok 29 - date by article range works
>> ok 30 - 225 response for HDR
>> ok 31 - got expected response for HDR
>> ok 32 - XHDR cc by message-id works
>> ok 33 - cc by article number works
>> ok 34 - cc by article range works
>> ok 35 - 225 response for HDR
>> ok 36 - got expected response for HDR
>> ok 37 - XHDR subject by message-id works
>> ok 38 - subject by article number works
>> ok 39 - subject by article range works
>> ok 40 - 225 response for HDR
>> ok 41 - got expected response for HDR
>> ok 42 - XHDR message-id by message-id works
>> ok 43 - message-id by article number works
>> ok 44 - message-id by article range works
>> ok 45 - 225 response for HDR
>> ok 46 - got expected response for HDR
>> ok 47 - XHDR to by message-id works
>> ok 48 - to by article number works
>> ok 49 - to by article range works
>> ok 50 - 225 response for HDR
>> ok 51 - got expected response for HDR
>> ok 52 - XHDR references by message-id works
>> ok 53 - references by article number works
>> ok 54 - references by article range works
>> ok 55 - 225 response for HDR
>> ok 56 - got expected response for HDR
>> ok 57 - XHDR xref by message-id works
>> ok 58 - xref by article number works
>> ok 59 - xref by article range works
>> ok 60 - 225 response for HDR
>> ok 61 - got expected response for HDR
>> ok 62 - from by message-id works without group
>> ok 63 - date by message-id works without group
>> ok 64 - cc by message-id works without group
>> ok 65 - subject by message-id works without group
>> ok 66 - message-id by message-id works without group
>> ok 67 - to by message-id works without group
>> ok 68 - references by message-id works without group
>> ok 69 - xref by message-id works without group
>> ok 70 - XOVER range works
>> ok 71 - XOVER by article works
>> ok 72 - HEAD OK
>> ok 73 - BODY OK
>> ok 74 - STAT
>> ok 75 - body really matches
>> ok 76 - got array for ARTICLE
>> ok 77 - ARTICLE OK
>> ok 78 - non-existent num
>> ok 79 - non-existent mid
>> ok 80 - got 224 response for OVER
>> ok 81 - OVER by Message-ID works
>> ok 82 - correctly terminated response
>> ok 83 - XHDR Cc 1- works
>> ok 84 - XHDR References 1- works)
>> ok 85 - XHDR on invalid header returns empty
>> ok 86 - NEWNEWS works
>> ok 87 - valid date after start
>> ok 88 - valid date before stop
>> ok 89 - Message-ID not folded
>> ok 90 - Path: header found
>> ok 91 - warned for reused MID
>> ok 92 - Single Message-ID in header
>> ok 93 - got expected mid
>> ok 94 - cross newsgroup ARTICLE by Message-ID
>> ok 95 - cross newsgroup BODY by Message-ID
>> ok 96 - cross newsgroup HEAD by Message-ID
>> ok 97 - xpath hit
>> ok 98 - xpath miss
>> ok 99 - reader done
>> ok 100 - no errors
>> ok 101 # skip Search/Xapian.pm pre-loaded (by t/run.perl?)
>> ok 102 - upgraded indexlevel
>> ok 103 - article did not exist
>> ok 104 - -compacted
>> ok 105 - new article retrieved after compact
>> ok 106 # skip lsof missing
>> ok 107 - use PublicInbox::Watch;
>> ok 108 - use PublicInbox::InboxIdle;
>> ok 109 - use PublicInbox::Config;
>> ok 110 - no error in exited -watch process
>> ok 111 - no warnings/errors from -watch
>> ok 112 - imported something
>> ok 113 - killed nntpd
>> ok 114 - got 5xx response for unoptimized HDR
>> ok 115 - only one response line
>> ok 116 - no error in exited process
>> ok 117 - no Wide character warnings
>> 1..117
>> ok
>> # waiting for initial fetch...
>> # inbox unlocked on initial fetch
>> t/nntpd.t ....................
>> ok 1 - use PublicInbox::Msgmap;
>> ok 2 - init test-nntpd
>> ok 3 - init xyz
>> ok 4 - disable spamcheck
>> ok 5 - indexed v1
>> ok 6 - sock created
>> ok 7 - deleted x.y.z group
>> ok 8 - LIST works
>> ok 9 - GROUP works
>> ok 10 - listgroup OK
>> ok 11 - RFC3977 8.4.2 compliant LIST OVERVIEW.FMT
>> ok 12 - STARTTLS fails when unconfigured
>> ok 13 - got 580 code on server w/o TLS
>> ok 14 - got greeting
>> ok 15 - wrote spaces
>> ok 16 - wrote nothing
>> ok 17 - GOT EOF on cntrl
>> ok 18 - got greeting
>> ok 19 - CAPABILITIES works
>> ok 20 - STARTTLS not advertised
>> ok 21 - DEFLATE advertised
>> ok 22 - newgroups OK
>> ok 23 - XHDR date by message-id works
>> ok 24 - date by article number works
>> ok 25 - date by article range works
>> ok 26 - 225 response for HDR
>> ok 27 - got expected response for HDR
>> ok 28 - XHDR xref by message-id works
>> ok 29 - xref by article number works
>> ok 30 - xref by article range works
>> ok 31 - 225 response for HDR
>> ok 32 - got expected response for HDR
>> ok 33 - XHDR message-id by message-id works
>> ok 34 - message-id by article number works
>> ok 35 - message-id by article range works
>> ok 36 - 225 response for HDR
>> ok 37 - got expected response for HDR
>> ok 38 - XHDR subject by message-id works
>> ok 39 - subject by article number works
>> ok 40 - subject by article range works
>> ok 41 - 225 response for HDR
>> ok 42 - got expected response for HDR
>> ok 43 - XHDR to by message-id works
>> ok 44 - to by article number works
>> ok 45 - to by article range works
>> ok 46 - 225 response for HDR
>> ok 47 - got expected response for HDR
>> ok 48 - XHDR cc by message-id works
>> ok 49 - cc by article number works
>> ok 50 - cc by article range works
>> ok 51 - 225 response for HDR
>> ok 52 - got expected response for HDR
>> ok 53 - XHDR references by message-id works
>> ok 54 - references by article number works
>> ok 55 - references by article range works
>> ok 56 - 225 response for HDR
>> ok 57 - got expected response for HDR
>> ok 58 - XHDR from by message-id works
>> ok 59 - from by article number works
>> ok 60 - from by article range works
>> ok 61 - 225 response for HDR
>> ok 62 - got expected response for HDR
>> ok 63 - date by message-id works without group
>> ok 64 - xref by message-id works without group
>> ok 65 - message-id by message-id works without group
>> ok 66 - subject by message-id works without group
>> ok 67 - to by message-id works without group
>> ok 68 - cc by message-id works without group
>> ok 69 - references by message-id works without group
>> ok 70 - from by message-id works without group
>> ok 71 - XOVER range works
>> ok 72 - XOVER by article works
>> ok 73 - HEAD OK
>> ok 74 - BODY OK
>> ok 75 - STAT
>> ok 76 - body really matches
>> ok 77 - got array for ARTICLE
>> ok 78 - ARTICLE OK
>> ok 79 - non-existent num
>> ok 80 - non-existent mid
>> ok 81 - got 224 response for OVER
>> ok 82 - OVER by Message-ID works
>> ok 83 - correctly terminated response
>> ok 84 - XHDR Cc 1- works
>> ok 85 - XHDR References 1- works)
>> ok 86 - XHDR on invalid header returns empty
>> ok 87 - NEWNEWS works
>> ok 88 - valid date after start
>> ok 89 - valid date before stop
>> ok 90 - indexed v1
>> ok 91 - Message-ID not folded
>> ok 92 - Path: header found
>> ok 93 - cross newsgroup ARTICLE by Message-ID
>> ok 94 - cross newsgroup BODY by Message-ID
>> ok 95 - cross newsgroup HEAD by Message-ID
>> ok 96 - xpath hit
>> ok 97 - xpath miss
>> ok 98 - reader done
>> ok 99 - no errors
>> ok 100 # skip Search/Xapian.pm pre-loaded (by t/run.perl?)
>> ok 101 - upgraded indexlevel
>> ok 102 - article did not exist
>> ok 103 - -compacted
>> ok 104 - new article retrieved after compact
>> ok 105 # skip lsof missing
>> ok 106 - use PublicInbox::Watch;
>> ok 107 - use PublicInbox::InboxIdle;
>> ok 108 - use PublicInbox::Config;
>> ok 109 - no error in exited -watch process
>> ok 110 - no warnings/errors from -watch
>> ok 111 - imported something
>> ok 112 - killed nntpd
>> ok 113 - got 5xx response for unoptimized HDR
>> ok 114 - only one response line
>> ok 115 - no error in exited process
>> ok 116 - no Wide character warnings
>> 1..116
>> ok
>> t/nodatacow.t ................
>> ok 1 - use PublicInbox::NDC_PP;
>> ok 2 # skip BTRFS_TESTDIR not defined
>> ok 3 # skip BTRFS_TESTDIR not defined
>> 1..3
>> ok
>> t/nulsubject.t ...............
>> ok 1 - use PublicInbox::Import;
>> ok 2 - use PublicInbox::Git;
>> ok 3 - git fsck ok
>> 1..3
>> ok
>> t/over.t .....................
>> ok 1 - use PublicInbox::OverIdx;
>> ok 2 - max is zero on new DB (scalar context)
>> ok 3 - max is zero on new DB (list context)
>> ok 4 - integer tid
>> ok 5 - tid increases
>> ok 6 - integer sid
>> ok 7 - sid increases
>> ok 8 - idempotent
>> ok 9 - OverIdx is not ReadOnly
>> ok 10 - Over is ReadOnly
>> ok 11 - idempotent across reopen
>> ok 12 - integer tid for ghost
>> ok 13 - integer tid for ghost increases
>> ok 14 - messages not linked by empty subject
>> ok 15 - messages not linked by empty subject
>> ok 16 - linked messages by subject
>> ok 17 - linked messages by subject
>> ok 18 - linked messages by Message-ID: <a>
>> ok 19 - linked messages by Message-ID: <b>
>> ok 20 - max is non-zero
>> ok 21 - WAL journal_mode not clobbered if manually set
>> 1..21
>> ok
>> Plack::Middleware::ReverseProxy missing,
>> URL generation for redirects may be wrong if behind a reverse proxy
>> t/plack.t ....................
>> ok 1 - use PublicInbox::Import;
>> ok 2 - use PublicInbox::Git;
>> ok 3 - use HTTP::Request::Common;
>> ok 4 - use Plack::Test;
>> ok 5 - use URI::Escape;
>> ok 6 - psgi example file found
>> ok 7 - initialized repo
>> ok 8 - good revision committed
>> ok 9 - our test used QP correctly
>> ok 10 - robots.txt is missing
>> ok 11 - favicon.ico is missing
>> ok 12 - .well-known/foo is missing
>> ok 13 - retrieved CRLF as HTML
>> ok 14 - no CR in HTML
>> ok 15 - retrieved CRLF raw
>> ok 16 - CR preserved in raw message
>> ok 17 - newsgroup name is permanent redirect
>> ok 18 - redirect location matches
>> ok 19 - newsgroup name/ is permanent redirect
>> ok 20 - redirect location matches
>> ok 21 - is permanent redirect
>> ok 22 - redirect location matches with trailing slash
>> ok 23 - redirect for missing /
>> ok 24 - redirected with missing /
>> ok 25 - redirect for missing /
>> ok 26 - redirected with missing /
>> ok 27 - redirect for legacy /f
>> ok 28 - redirected with missing /
>> ok 29 - success response received
>> ok 30 - atom URL generated
>> ok 31 - index generated
>> ok 32 - date set
>> ok 33 - success response received for atom
>> ok 34 - atom feed generated correct URL
>> ok 35 - set title in XML feed
>> ok 36 - body included
>> ok 37 - got description
>> ok 38 - success for /blah@example.com/
>> ok 39 - HTML returned
>> ok 40 - raw link present
>> ok 41 - quoted text inline
>> ok 42 - redirect for /blah@example.com/f/
>> ok 43 - /$MESSAGE_ID/f/ redirected to /$MESSAGE_ID/
>> ok 44 - multipart split
>> ok 45 - original body
>> ok 46 - parts split with filename
>> ok 47 - HTML output decoded QP
>> ok 48 - success response received for /*/raw
>> ok 49 - mbox returned
>> ok 50 - 501 when overview missing
>> ok 51 - overview omission noted
>> ok 52 - redirect for old m .txt link
>> ok 53 - .txt redirected to /raw
>> ok 54 - redirect for old f .txt link
>> ok 55 - .txt redirected to /raw
>> ok 56 - redirect for old m .html link
>> ok 57 - .html redirected to new location
>> ok 58 - redirect for old f .html link
>> ok 59 - .html redirected to new location
>> ok 60 - redirect for old t .html link
>> ok 61 - .html redirected to new location
>> ok 62 - redirect for old thread link
>> ok 63 - mbox redirected to /mbox.gz
>> ok 64 - redirect for old thread link
>> ok 65 - mbox.gz redirected to /mbox.gz
>> ok 66 - is permanent redirect
>> ok 67 - redirect from x40 MIDs works
>> ok 68 - refs readable
>> ok 69 - got partial response
>> ok 70 - partial body OK
>> ok 71 - got partial another response
>> ok 72 - partial body OK past end
>> ok 73 - no PUT to / allowed
>> ok 74 - no PUT /$INBOX allowed
>> 1..74
>> ok
>> t/precheck.t .................
>> ok 1 - Cc list is OK
>> ok 2 - wrong ORIGINAL_RECIPIENT rejected
>> ok 3 - ORIGINAL_RECIPIENT in To: is OK
>> ok 4 - ORIGINAL_RECIPIENT in Cc: is OK
>> ok 5 - alias list is OK
>> ok 6 - wrong ORIGINAL_RECIPIENT rejected
>> ok 7 - ORIGINAL_RECIPIENT in To: is OK
>> ok 8 - ORIGINAL_RECIPIENT in Cc: is OK
>> ok 9 - alias list is OK
>> ok 10 - missing From: is rejected
>> 1..10
>> ok
>> # testing with index indexed
>> t/psgi_attach.t ..............
>> ok 1 - use HTTP::Request::Common;
>> ok 2 - use Plack::Builder;
>> ok 3 - use Plack::Test;
>> ok 4 - use URI::Escape;
>> ok 5 - use PublicInbox::WWW;
>> ok 6 - use PublicInbox::WwwAttach;
>> ok 7 - attachment links generated
>> ok 8 - QP length is close
>> ok 9 - trailing newline exists
>> ok 10 - QP trailing newline is there
>> ok 11 - Base64 matches exactly
>> ok 12 - plain text almost matches
>> ok 13 - trailing newline exists in text
>> ok 14 - plain text not truncated
>> ok 15 - dot almost matches
>> ok 16 - user-specified filename is OK
>> ok 17 - 0-byte download not offered
>> ok 18 - href to message/rfc822 attachment visible
>> ok 19 - href to nested message/rfc822 attachment visible
>> ok 20 - got attached eml
>> ok 21 - attachment had 2 subparts
>> ok 22 - 1st attachment is as expected
>> ok 23 - 2nd attachment is as expected
>> ok 24 - nested eml retrieved
>> ok 25 - indexed
>> ok 26 - attachment links generated
>> ok 27 - QP length is close
>> ok 28 - trailing newline exists
>> ok 29 - QP trailing newline is there
>> ok 30 - Base64 matches exactly
>> ok 31 - plain text almost matches
>> ok 32 - trailing newline exists in text
>> ok 33 - plain text not truncated
>> ok 34 - dot almost matches
>> ok 35 - user-specified filename is OK
>> ok 36 - 0-byte download not offered
>> ok 37 - href to message/rfc822 attachment visible
>> ok 38 - href to nested message/rfc822 attachment visible
>> ok 39 - got attached eml
>> ok 40 - attachment had 2 subparts
>> ok 41 - 1st attachment is as expected
>> ok 42 - 2nd attachment is as expected
>> ok 43 - nested eml retrieved
>> ok 44 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 45 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 46 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 47 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 48 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 49 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 50 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 51 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 52 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 53 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 54 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 55 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 56 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 57 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 58 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 59 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 60 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> ok 61 # skip Plack::Test::ExternalServer missing for t/psgi_attach.t
>> 1..61
>> ok
>> t/psgi_bad_mids.t ............
>> ok 1 - use DBD::SQLite;
>> ok 2 - use HTTP::Request::Common;
>> ok 3 - use Plack::Test;
>> ok 4 - use URI::Escape;
>> ok 5 - use Plack::Builder;
>> ok 6 - use PublicInbox::WWW;
>> ok 7 - use PublicInbox::WWW;
>> ok 8 - use PublicInbox::V2Writable;
>> ok 9 - added F1V5OR6NMF.3M649JTLO9IXD@tux.localdomain/hehe1"'<foo
>> ok 10 - added F1V5NB0PTU.3U0DCVGAJ750Z@tux.localdomain"'<>/foo
>> ok 11 - added F1V5NB0PTU.3U0DCVGAJ750Z@tux&.ampersand
>> ok 12 - added F1V5MIHGCU.2ABINKW6WBE8N@tux.localdomain/raw
>> ok 13 - added F1V5LF9D9C.2QT5PGXZQ050E@tux.localdomain/t.atom
>> ok 14 - added F1V58X3CMU.2DCCVAKQZGADV@tux.localdomain/../../../../foo
>> ok 15 - added F1TVKINT3G.2S6I36MXMHYG6@tux.localdomain" onclick="alert(1)"
>> ok 16 - got 200 OK listing
>> ok 17 - escaped F1V5OR6NMF.3M649JTLO9IXD@tux.localdomain/hehe1"'<foo
>> ok 18 - escaped F1V5NB0PTU.3U0DCVGAJ750Z@tux.localdomain"'<>/foo
>> ok 19 - escaped F1V5NB0PTU.3U0DCVGAJ750Z@tux&.ampersand
>> ok 20 - escaped F1V5MIHGCU.2ABINKW6WBE8N@tux.localdomain/raw
>> ok 21 - escaped F1V5LF9D9C.2QT5PGXZQ050E@tux.localdomain/t.atom
>> ok 22 - escaped F1V58X3CMU.2DCCVAKQZGADV@tux.localdomain/../../../../foo
>> ok 23 - escaped F1TVKINT3G.2S6I36MXMHYG6@tux.localdomain" onclick="alert(1)"
>> ok 24 - got escaped links to all messages
>> ok 25 - got 200 OK raw message F1V5OR6NMF.3M649JTLO9IXD@tux.localdomain%2Fhehe1%22'%3Cfoo
>> ok 26 - retrieved correct message
>> ok 27 - got 200 OK raw message F1V5NB0PTU.3U0DCVGAJ750Z@tux.localdomain%22'%3C
>> ok 28 - retrieved correct message
>> ok 29 - got 200 OK raw message F1V5NB0PTU.3U0DCVGAJ750Z@tux&.ampersand
>> ok 30 - retrieved correct message
>> ok 31 - got 200 OK raw message F1V5MIHGCU.2ABINKW6WBE8N@tux.localdomain%2Fraw
>> ok 32 - retrieved correct message
>> ok 33 - got 200 OK raw message F1V5LF9D9C.2QT5PGXZQ050E@tux.localdomain%2Ft.atom
>> ok 34 - retrieved correct message
>> ok 35 - got 200 OK raw message F1V58X3CMU.2DCCVAKQZGADV@tux.localdomain%2F..%2F..%2F..%2F..%2Ffoo
>> ok 36 - retrieved correct message
>> ok 37 - got 200 OK raw message F1TVKINT3G.2S6I36MXMHYG6@tux.localdomain%22%20onclick=%22alert(1)%22
>> ok 38 - retrieved correct message
>> 1..38
>> ok
>> t/psgi_mount.t ...............
>> ok 1 - use HTTP::Request::Common;
>> ok 2 - use Plack::Test;
>> ok 3 - use URI::Escape;
>> ok 4 - use Plack::Builder;
>> ok 5 - use Plack::App::URLMap;
>> ok 6 - use PublicInbox::WWW;
>> ok 7 - URLs which exist in Atom feed are mount-aware
>> ok 8 - No URLs which are not mount-aware
>> ok 9 - clone URL in new.html is mount-aware
>> ok 10 - OK with URLMap mount
>> ok 11 - clone URL in /$INBOX/$MESSAGE_ID/ is mount-aware
>> ok 12 - OK with URLMap mount
>> ok 13 - List-Archive set in /raw mboxrd
>> ok 14 - Archived-At set in /raw mboxrd
>> ok 15 - redirect functions properly under mount
>> ok 16 - intentional 404 with URLMap mount
>> ok 17 - require PublicInbox::SearchIdx;
>> ok 18 - List-Archive set in /t.mbox.gz mboxrd
>> ok 19 - Archived-At set in /t.mbox.gz mboxrd
>> 1..19
>> ok
>> t/psgi_multipart_not.t .......
>> ok 1 - use HTTP::Request::Common;
>> ok 2 - use Plack::Test;
>> ok 3 - use PublicInbox::WWW;
>> ok 4 - use PublicInbox::V2Writable;
>> ok 5 - added broken multipart message
>> ok 6 - /v2test/?q=%22ain't what it used to be%22&x=t
>> ok 7 - /v2test/?q=%22ain't what it used to be%22&x=t warns
>> ok 8 - /v2test/new.atom
>> ok 9 - /v2test/new.atom warns
>> ok 10 - /v2test/new.html
>> ok 11 - /v2test/new.html warns
>> 1..11
>> ok
>> t/psgi_scan_all.t ............
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2 - use HTTP::Request::Common;
>> ok 3 - use Plack::Test;
>> ok 4 - use URI::Escape;
>> ok 5 - use DBD::SQLite;
>> ok 6 - added message to 1
>> ok 7 - added message to 2
>> ok 8 - use PublicInbox::WWW;
>> ok 9 - got 302
>> ok 10 - redirected OK to 1
>> ok 11 - got 302
>> ok 12 - redirected OK to 1
>> ok 13 - got 302
>> ok 14 - redirected OK to 2
>> ok 15 - got 302
>> ok 16 - redirected OK to 2
>> ok 17 - 404 on inv@lid
>> ok 18 - 404 on inv@lid/
>> ok 19 - 404 on i/v/a
>> ok 20 - 404 on l/i/d/
>> 1..20
>> ok
>> t/psgi_search.t ..............
>> ok 1 - use HTTP::Request::Common;
>> ok 2 - use Plack::Test;
>> ok 3 - use PublicInbox::WWW;
>> ok 4 - use PublicInbox::SearchIdx;
>> ok 5 - HTML escaped in title
>> ok 6 - saw query strings
>> ok 7 - all query values identical in HTML
>> ok 8 - matches original query
>> ok 9 - displayed Ævar's name properly in HTML
>> ok 10 - "full threads" download option shown
>> ok 11 - successful search result
>> ok 12 - no warnings from non-numeric comparison
>> ok 13 - failed search result gives 404
>> ok 14 - no warnings
>> ok 15 - partial match found while truncated
>> ok 16
>> ok 17 - found mid in response
>> ok 18 - partial match found while truncated
>> ok 19
>> ok 20 - found mid in response
>> ok 21 - partial match found while truncated
>> ok 22
>> ok 23 - found mid in response
>> ok 24 - partial match found while truncated
>> ok 25
>> ok 26 - found mid in response
>> ok 27 - partial match found while truncated
>> ok 28
>> ok 29 - found mid in response
>> ok 30 - partial match found while truncated
>> ok 31
>> ok 32 - found mid in response
>> ok 33 - subject-less message linked from "/$INBOX/"
>> ok 34 - blank subject message linked from "/$INBOX/"
>> ok 35 - displayed Ævar's name properly in topic view
>> ok 36 - subject-less message linked from "/$INBOX/?q=..."
>> ok 37 - blank subject message linked from "/$INBOX/?q=..."
>> ok 38
>> ok 39
>> ok 40 - successful mbox download with threads
>> ok 41 - got full thread
>> ok 42 - successful search w/o has_threadid
>> ok 43 - "full threads" download option not shown w/o has_threadid
>> ok 44 - successful mbox download w/ threads
>> ok 45
>> 1..45
>> ok
>> t/psgi_text.t ................
>> ok 1 - use HTTP::Request::Common;
>> ok 2 - use Plack::Test;
>> ok 3 - use URI::Escape;
>> ok 4 - use Plack::Builder;
>> ok 5 - use PublicInbox::WWW;
>> ok 6 - use PublicInbox::WwwText;
>> ok 7 - default help
>> ok 8 - got gzip encoding
>> ok 9 - got gzipped HTML
>> ok 10 - gzipped content is correct
>> ok 11 - got expected address in config
>> ok 12 - got gzip encoding
>> ok 13 - gzipped help is smaller
>> ok 14
>> 1..14
>> ok
>> t/psgi_v2.t ..................
>> ok 1 - use HTTP::Request::Common;
>> ok 2 - use Plack::Test;
>> ok 3 - use PublicInbox::WWW;
>> ok 4 - use PublicInbox::V2Writable;
>> ok 5 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 6 - added one message
>> ok 7 - added duplicate-but-different message
>> ok 8 - got one warning
>> ok 9 - "From_" line stored to test old bug workaround
>> ok 10 - got v2 description missing message
>> ok 11 - buggy "From_" line omitted
>> ok 12 - got first message
>> ok 13 - got second message
>> ok 14 - two From_ lines
>> ok 15 - second message with new Message-Id
>> ok 16 - only one From_ line
>> ok 17 - Atom ordering is chronological
>> ok 18 - new.html ordering is chronological
>> ok 19 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 20 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 21 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 22 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 23 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 24 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 25 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 26 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 27 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 28 - added 3rd duplicate-but-different message
>> ok 29 - got another warning
>> ok 30 - warned about mismatched messages
>> ok 31 - both warnings are the same
>> ok 32 - got third message
>> ok 33 - one From_ line
>> ok 34 - got first message
>> ok 35 - got second message
>> ok 36 - got third message
>> ok 37 - three From_ lines
>> ok 38 - gzip encoding
>> ok 39 - gzip response matches
>> ok 40 - buggy "From_" line omitted
>> ok 41 - got first in t.mbox.gz
>> ok 42 - got second in t.mbox.gz
>> ok 43 - got third in t.mbox.gz
>> ok 44 - three From_ lines in t.mbox.gz
>> ok 45 - buggy "From_" line omitted
>> ok 46 - got first in mbox POST
>> ok 47 - got second in mbox POST
>> ok 48 - got third in mbox POST
>> ok 49 - three From_ lines in mbox POST
>> ok 50 - buggy "From_" line omitted
>> ok 51 - got first in all.mbox
>> ok 52 - got second in all.mbox
>> ok 53 - got third in all.mbox
>> ok 54 - three From_ lines in all.mbox
>> ok 55 - success with threaded search
>> ok 56 - got all results
>> ok 57 - threaded messages show up
>> ok 58 - success with Atom search
>> ok 59 # skip XML::TreePP missing for t/psgi_v2.t
>> ok 60 # skip XML::TreePP missing for t/psgi_v2.t
>> ok 61 - got first message
>> ok 62 - got second message
>> ok 63 - got third message
>> ok 64 - three From: lines
>> ok 65 - Message-ID a-mid@b shown
>> ok 66 - Message-ID 19931002000100.9-qiS1sw0W51lPiuJcG5rhnBeqrGDSQ2hhYSYtiG550@z shown
>> ok 67 - Message-ID 19931002000100.OouBSRcl2eR6Hp1GyWxqYGpsnboYZkTDy9mi9IQcpdo@z shown
>> ok 68 - thread overview shown
>> ok 69 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 70 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 71 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 72 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 73 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 74 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 75 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 76 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 77 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 78 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 79 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 80 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 81 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 82 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 83 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 84 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 85 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 86 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 87 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 88 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 89 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 90 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 91 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 92 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 93 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 94 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 95 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 96 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 97 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 98 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 99 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 100 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 101 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 102 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 103 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 104 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 105 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 106 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 107 - added one message
>> ok 108 - reused existing Message-ID
>> ok 109 - feed ids unique
>> ok 110 - thread overview shown with /T/
>> ok 111 - duplicate messages share the same root
>> ok 112 - thread overview shown with /t/
>> ok 113 - got info refs for dumb clones
>> ok 114 - got info refs for dumb clones w/ .git suffix
>> ok 115 - v2 git URL w/o shard fails
>> ok 116 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 117 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 118 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 119 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 120 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 121 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 122 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 123 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 124 - added attachment old
>> ok 125 - added attachment new
>> ok 126 - both attachment links exist
>> ok 127 - attachment links are different
>> ok 128 - got expected old content
>> ok 129 - got expected new content
>> ok 130 - 404 for out-of-range t= param
>> ok 131 - no warnings on YYYYMMDD only
>> ok 132 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 133 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 134 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> ok 135 # skip Plack::Test::ExternalServer missing for t/psgi_v2.t
>> 1..135
>> ok
>> t/purge.t ....................
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2 - add message to be purged
>> ok 3 - purge -f OK
>> ok 4 - mismatch fails without -f
>> ok 5 - missed purge exits with 1
>> ok 6 - match OK
>> ok 7 - removed commit noted
>> ok 8 - add vger-signatured message to be purged
>> ok 9 - chdir / OK for --all test
>> ok 10 - scrub purge OK
>> ok 11 - removed commit noted
>> ok 12 - scrub purge not idempotent without -f
>> 1..12
>> ok
>> t/qspawn.t ...................
>> ok 1 - use PublicInbox::Qspawn;
>> ok 2 - captured stderr and stdout
>> ok 3 - captured stderr and stdout
>> ok 4 - read zero bytes
>> ok 5 - no error on finish
>> ok 6 - callback ran alright
>> ok 7 - read zero bytes from false
>> ok 8 - error on finish
>> ok 9 - callback ran alright
>> ok 10 - read zero bytes
>> ok 11 - no error on sleep
>> ok 12 - true 0 succeeded
>> ok 13 - true 1 succeeded
>> ok 14 - true 2 succeeded
>> ok 15 - ran in order
>> ok 16 - read zero bytes
>> ok 17 - got error on false after sleep
>> ok 18 - true 0 succeeded
>> ok 19 - true 1 succeeded
>> ok 20 - true 2 succeeded
>> ok 21 - ran in order
>> 1..21
>> ok
>> # v2 basic replace
>> # v2 basic replace
>> # v2 basic replace
>> # v2 basic replace
>> # v2 medium replace
>> # v2 medium replace
>> # v2 medium replace
>> # v2 medium replace
>> t/replace.t ..................
>> ok 1 - add message to be replaced
>> ok 2 - ->replace died on Message-ID change
>> ok 3 - no replacement happened
>> ok 4 - ->replace died on Message-ID change
>> ok 5 - no replacement happened
>> ok 6 - ->replace died on Message-ID change
>> ok 7 - no replacement happened
>> ok 8 - replaced message
>> ok 9 - replace returned current commit
>> ok 10 - only one epoch changed
>> ok 11 - replaced message
>> ok 12 - no warnings on noop
>> ok 13 - nothing confidential
>> ok 14 - Streisand who?
>> ok 15 - nothing from Oct 1993
>> ok 16 - nothing matches (?^: 749520000 )
>> ok 17 - git fsck is clean in epoch 0.git
>> ok 18 - threading preserved
>> ok 19 - one unique blob from before left
>> ok 20 - one unique blob from after left
>> ok 21 - old blob not found
>> ok 22 - before subject
>> ok 23 - before MID
>> ok 24 - new blob found
>> ok 25 - after subject
>> ok 26 - before MID
>> ok 27 - no-op replace returns undef
>> ok 28 - no-op purge returns undef
>> ok 29 - no warnings on noop
>> ok 30 - add message to be replaced
>> ok 31 - ->replace died on Message-ID change
>> ok 32 - no replacement happened
>> ok 33 - ->replace died on Message-ID change
>> ok 34 - no replacement happened
>> ok 35 - ->replace died on Message-ID change
>> ok 36 - no replacement happened
>> ok 37 - replaced message
>> ok 38 - replace returned current commit
>> ok 39 - only one epoch changed
>> ok 40 - replaced message
>> ok 41 - no warnings on noop
>> ok 42 - nothing confidential
>> ok 43 - Streisand who?
>> ok 44 - nothing from Oct 1993
>> ok 45 - nothing matches (?^: 749520000 )
>> ok 46 - git fsck is clean in epoch 0.git
>> ok 47 - threading preserved
>> ok 48 - one unique blob from before left
>> ok 49 - one unique blob from after left
>> ok 50 - old blob not found
>> ok 51 - before subject
>> ok 52 - before MID
>> ok 53 - new blob found
>> ok 54 - after subject
>> ok 55 - before MID
>> ok 56 - no-op replace returns undef
>> ok 57 - no-op purge returns undef
>> ok 58 - no warnings on noop
>> ok 59 - add message to be replaced
>> ok 60 - ->replace died on Message-ID change
>> ok 61 - no replacement happened
>> ok 62 - ->replace died on Message-ID change
>> ok 63 - no replacement happened
>> ok 64 - ->replace died on Message-ID change
>> ok 65 - no replacement happened
>> ok 66 - replaced message
>> ok 67 - replace returned current commit
>> ok 68 - only one epoch changed
>> ok 69 - replaced message
>> ok 70 - no warnings on noop
>> ok 71 - nothing confidential
>> ok 72 - Streisand who?
>> ok 73 - nothing from Oct 1993
>> ok 74 - nothing matches (?^: 749520000 )
>> ok 75 - git fsck is clean in epoch 0.git
>> ok 76 - threading preserved
>> ok 77 - one unique blob from before left
>> ok 78 - one unique blob from after left
>> ok 79 - old blob not found
>> ok 80 - before subject
>> ok 81 - before MID
>> ok 82 - new blob found
>> ok 83 - after subject
>> ok 84 - before MID
>> ok 85 - no-op replace returns undef
>> ok 86 - no-op purge returns undef
>> ok 87 - no warnings on noop
>> ok 88 - add message to be replaced
>> ok 89 - ->replace died on Message-ID change
>> ok 90 - no replacement happened
>> ok 91 - ->replace died on Message-ID change
>> ok 92 - no replacement happened
>> ok 93 - ->replace died on Message-ID change
>> ok 94 - no replacement happened
>> ok 95 - replaced message
>> ok 96 - replace returned current commit
>> ok 97 - only one epoch changed
>> ok 98 - replaced message
>> ok 99 - no warnings on noop
>> ok 100 - nothing confidential
>> ok 101 - Streisand who?
>> ok 102 - nothing from Oct 1993
>> ok 103 - nothing matches (?^: 749520000 )
>> ok 104 - git fsck is clean in epoch 0.git
>> ok 105 - git fsck is clean in epoch 1.git
>> ok 106 - git fsck is clean in epoch 2.git
>> ok 107 - git fsck is clean in epoch 3.git
>> ok 108 - git fsck is clean in epoch 4.git
>> ok 109 - threading preserved
>> ok 110 - one unique blob from before left
>> ok 111 - one unique blob from after left
>> ok 112 - old blob not found
>> ok 113 - before subject
>> ok 114 - before MID
>> ok 115 - new blob found
>> ok 116 - after subject
>> ok 117 - before MID
>> ok 118 - no-op replace returns undef
>> ok 119 - no-op purge returns undef
>> ok 120 - no warnings on noop
>> ok 121 - add message to be replaced
>> ok 122 - ->replace died on Message-ID change
>> ok 123 - no replacement happened
>> ok 124 - ->replace died on Message-ID change
>> ok 125 - no replacement happened
>> ok 126 - ->replace died on Message-ID change
>> ok 127 - no replacement happened
>> ok 128 - replaced message
>> ok 129 - replace returned current commit
>> ok 130 - only one epoch changed
>> ok 131 - replaced message
>> ok 132 - no warnings on noop
>> ok 133 - nothing confidential
>> ok 134 - Streisand who?
>> ok 135 - nothing from Oct 1993
>> ok 136 - nothing matches (?^: 749520000 )
>> ok 137 - git fsck is clean in epoch 0.git
>> ok 138 - threading preserved
>> ok 139 - no match for f:streisand
>> ok 140 - no match for s:confidential
>> ok 141 - no match for malibu
>> ok 142 - got match for f:redactor
>> ok 143 - got match for s:redacted
>> ok 144 - got match for nothing to see
>> ok 145 - one unique blob from before left
>> ok 146 - one unique blob from after left
>> ok 147 - old blob not found
>> ok 148 - before subject
>> ok 149 - before MID
>> ok 150 - new blob found
>> ok 151 - after subject
>> ok 152 - before MID
>> ok 153 - no-op replace returns undef
>> ok 154 - no-op purge returns undef
>> ok 155 - no warnings on noop
>> ok 156 - add message to be replaced
>> ok 157 - ->replace died on Message-ID change
>> ok 158 - no replacement happened
>> ok 159 - ->replace died on Message-ID change
>> ok 160 - no replacement happened
>> ok 161 - ->replace died on Message-ID change
>> ok 162 - no replacement happened
>> ok 163 - replaced message
>> ok 164 - replace returned current commit
>> ok 165 - only one epoch changed
>> ok 166 - replaced message
>> ok 167 - no warnings on noop
>> ok 168 - nothing confidential
>> ok 169 - Streisand who?
>> ok 170 - nothing from Oct 1993
>> ok 171 - nothing matches (?^: 749520000 )
>> ok 172 - git fsck is clean in epoch 0.git
>> ok 173 - threading preserved
>> ok 174 - no match for f:streisand
>> ok 175 - no match for s:confidential
>> ok 176 - no match for malibu
>> ok 177 - got match for f:redactor
>> ok 178 - got match for s:redacted
>> ok 179 - got match for nothing to see
>> ok 180 - got match for m:1@example.com
>> ok 181 - got match for m:2@example.com
>> ok 182 - got match for s:message2
>> ok 183 - got match for s:message1
>> ok 184 - one unique blob from before left
>> ok 185 - one unique blob from after left
>> ok 186 - old blob not found
>> ok 187 - before subject
>> ok 188 - before MID
>> ok 189 - new blob found
>> ok 190 - after subject
>> ok 191 - before MID
>> ok 192 - no-op replace returns undef
>> ok 193 - no-op purge returns undef
>> ok 194 - no warnings on noop
>> ok 195 - add message to be replaced
>> ok 196 - ->replace died on Message-ID change
>> ok 197 - no replacement happened
>> ok 198 - ->replace died on Message-ID change
>> ok 199 - no replacement happened
>> ok 200 - ->replace died on Message-ID change
>> ok 201 - no replacement happened
>> ok 202 - replaced message
>> ok 203 - replace returned current commit
>> ok 204 - only one epoch changed
>> ok 205 - replaced message
>> ok 206 - no warnings on noop
>> ok 207 - nothing confidential
>> ok 208 - Streisand who?
>> ok 209 - nothing from Oct 1993
>> ok 210 - nothing matches (?^: 749520000 )
>> ok 211 - git fsck is clean in epoch 0.git
>> ok 212 - threading preserved
>> ok 213 - no match for f:streisand
>> ok 214 - no match for s:confidential
>> ok 215 - no match for malibu
>> ok 216 - got match for f:redactor
>> ok 217 - got match for s:redacted
>> ok 218 - got match for nothing to see
>> ok 219 - got match for m:1@example.com
>> ok 220 - got match for m:2@example.com
>> ok 221 - got match for s:message2
>> ok 222 - got match for s:message1
>> ok 223 - got match for m:3@example.com
>> ok 224 - got match for m:4@example.com
>> ok 225 - got match for s:message3
>> ok 226 - got match for s:message4
>> ok 227 - one unique blob from before left
>> ok 228 - one unique blob from after left
>> ok 229 - old blob not found
>> ok 230 - before subject
>> ok 231 - before MID
>> ok 232 - new blob found
>> ok 233 - after subject
>> ok 234 - before MID
>> ok 235 - no-op replace returns undef
>> ok 236 - no-op purge returns undef
>> ok 237 - no warnings on noop
>> ok 238 - add message to be replaced
>> ok 239 - ->replace died on Message-ID change
>> ok 240 - no replacement happened
>> ok 241 - ->replace died on Message-ID change
>> ok 242 - no replacement happened
>> ok 243 - ->replace died on Message-ID change
>> ok 244 - no replacement happened
>> ok 245 - replaced message
>> ok 246 - replace returned current commit
>> ok 247 - only one epoch changed
>> ok 248 - replaced message
>> ok 249 - no warnings on noop
>> ok 250 - nothing confidential
>> ok 251 - Streisand who?
>> ok 252 - nothing from Oct 1993
>> ok 253 - nothing matches (?^: 749520000 )
>> ok 254 - git fsck is clean in epoch 0.git
>> ok 255 - git fsck is clean in epoch 1.git
>> ok 256 - git fsck is clean in epoch 2.git
>> ok 257 - git fsck is clean in epoch 3.git
>> ok 258 - git fsck is clean in epoch 4.git
>> ok 259 - threading preserved
>> ok 260 - no match for f:streisand
>> ok 261 - no match for s:confidential
>> ok 262 - no match for malibu
>> ok 263 - got match for f:redactor
>> ok 264 - got match for s:redacted
>> ok 265 - got match for nothing to see
>> ok 266 - got match for m:1@example.com
>> ok 267 - got match for m:2@example.com
>> ok 268 - got match for s:message2
>> ok 269 - got match for s:message1
>> ok 270 - got match for m:3@example.com
>> ok 271 - got match for m:4@example.com
>> ok 272 - got match for s:message3
>> ok 273 - got match for s:message4
>> ok 274 - one unique blob from before left
>> ok 275 - one unique blob from after left
>> ok 276 - old blob not found
>> ok 277 - before subject
>> ok 278 - before MID
>> ok 279 - new blob found
>> ok 280 - after subject
>> ok 281 - before MID
>> ok 282 - no-op replace returns undef
>> ok 283 - no-op purge returns undef
>> ok 284 - no warnings on noop
>> 1..284
>> ok
>> t/reply.t ....................
>> ok 1 - use PublicInbox::Reply;
>> ok 2 - quote foo@bar => foo@bar
>> ok 3 - quote a b => 'a b'
>> ok 4 - quote a'b => 'a'\''b'
>> ok 5 - default reply is to :all
>> ok 6 - ":all" also works
>> ok 7 - ":list" works for centralized lists
>> ok 8 - ":list,Cc,To" works for kinda centralized lists
>> ok 9 - explicit address works, too
>> ok 10 - address obfuscation works
>> ok 11 - no mailto: link given
>> ok 12 - :none= works
>> 1..12
>> ok
>> t/search-thr-index.t .........
>> ok 1 - search indexer created
>> ok 2 - message added: 4-bw@g
>> ok 3 - message added: 10-bw@g
>> ok 4 - message added: 1-bw@g
>> ok 5 - got all messages from 4-bw@g
>> ok 6 - got all messages from 10-bw@g
>> ok 7 - got all messages from 1-bw@g
>> ok 8 - all messages have the same tid
>> ok 9
>> ok 10 - message reindexed1-bw@g
>> ok 11 - article number unchanged: 3
>> ok 12 - tid unchanged on reindex
>> 1..12
>> ok
>> t/search.t ...................
>> ok 1 - git init (main)
>> ok 2 - exception raised on non-existent DB
>> ok 3 - undefined permission is group
>> ok 4 - 644 => umask(0022)
>> ok 5 - 600 => umask(0077)
>> ok 6 - 640 => umask(0027)
>> ok 7 - group => umask(0007)
>> ok 8 - everybody => umask(0002)
>> ok 9 - umask => existing umask
>> ok 10 - no adjustment needed
>> ok 11 - LF-only counts two CR
>> ok 12 - CRLF/LF-mix 1 counts 1 CR
>> ok 13 - CRLF/LF-mix 2 counts 1 CR
>> ok 14 - root_id is an integer: 1
>> ok 15 - last_id is an integer: 2
>> ok 16 - message found
>> ok 17 - mid set correctly
>> ok 18 - got expected results for s:() match
>> ok 19 - got expected results for s:"" match
>> ok 20 - limit works
>> ok 21 - offset works
>> ok 22 - offset returned different result from limit
>> ok 23 - reply_id is an integer: 3
>> ok 24 - ghost_id is an integer: 4
>> ok 25 - got both messages in ghost thread
>> ok 26 - {sid} match
>> ok 27 - {tid} match
>> ok 28 - num do not match
>> ok 29 - positive art num
>> ok 30 - positive art num
>> ok 31 - got expected results for Subject match
>> ok 32 - goodbye message found
>> ok 33 - got goodbye message body
>> ok 34 - exact Date: match works
>> ok 35 - exact Date: match down to the second
>> ok 36 - long_id is an integer: 5
>> ok 37 - inserted long reply
>> ok 38 - got all 4 messages in thread
>> ok 39 - get_thread works
>> ok 40 - got both matches
>> ok 41 - non-quoted scores higher
>> ok 42 - quoted result still returned
>> ok 43 - got a match for quoted text
>> ok 44 - quoted result returned if nothing else
>> ok 45 - doc_id defined with circular reference
>> ok 46 - found m:circl@a
>> ok 47 - no references created
>> ok 48 - long subject not rewritten
>> ok 49 - got results within range
>> ok 50 - nothing after 20101003
>> ok 51 - nothing before 19931001
>> ok 52 - message indexed doc_id with UTF-8
>> ok 53 - found testmessage@example.com
>> ok 54 - UTF-8 subject preserved
>> ok 55 - searched To: successfully
>> ok 56 - to appears
>> ok 57 - $bytes stored as digit
>> ok 58 - $bytes is > 0
>> ok 59 - bytes Xapian value matches Over
>> ok 60 - UID column matches {num}
>> ok 61 - UID column matches docid
>> ok 62 - to appears
>> ok 63 - $bytes stored as digit
>> ok 64 - $bytes is > 0
>> ok 65 - bytes Xapian value matches Over
>> ok 66 - UID column matches {num}
>> ok 67 - UID column matches docid
>> ok 68 - to appears
>> ok 69 - $bytes stored as digit
>> ok 70 - $bytes is > 0
>> ok 71 - bytes Xapian value matches Over
>> ok 72 - UID column matches {num}
>> ok 73 - UID column matches docid
>> ok 74 - to appears
>> ok 75 - $bytes stored as digit
>> ok 76 - $bytes is > 0
>> ok 77 - bytes Xapian value matches Over
>> ok 78 - UID column matches {num}
>> ok 79 - UID column matches docid
>> ok 80 - to appears
>> ok 81 - $bytes stored as digit
>> ok 82 - $bytes is > 0
>> ok 83 - bytes Xapian value matches Over
>> ok 84 - UID column matches {num}
>> ok 85 - UID column matches docid
>> ok 86 - to appears
>> ok 87 - $bytes stored as digit
>> ok 88 - $bytes is > 0
>> ok 89 - bytes Xapian value matches Over
>> ok 90 - UID column matches {num}
>> ok 91 - UID column matches docid
>> ok 92 - to appears
>> ok 93 - $bytes stored as digit
>> ok 94 - $bytes is > 0
>> ok 95 - bytes Xapian value matches Over
>> ok 96 - UID column matches {num}
>> ok 97 - UID column matches docid
>> ok 98 - to appears
>> ok 99 - $bytes stored as digit
>> ok 100 - $bytes is > 0
>> ok 101 - bytes Xapian value matches Over
>> ok 102 - UID column matches {num}
>> ok 103 - UID column matches docid
>> ok 104 - to appears
>> ok 105 - $bytes stored as digit
>> ok 106 - $bytes is > 0
>> ok 107 - bytes Xapian value matches Over
>> ok 108 - UID column matches {num}
>> ok 109 - UID column matches docid
>> ok 110 - searched To+Cc: successfully
>> ok 111 - tocc appears
>> ok 112 - tocc appears
>> ok 113 - tocc appears
>> ok 114 - tocc appears
>> ok 115 - tocc appears
>> ok 116 - tocc appears
>> ok 117 - tocc appears
>> ok 118 - tocc appears
>> ok 119 - tocc appears
>> ok 120 - searched tcf: successfully for Cc:
>> ok 121 - cc appears
>> ok 122 - searched c: successfully for Cc:
>> ok 123 - cc appears
>> ok 124 - searched  successfully for From:
>> ok 125 - From appears with
>> ok 126 - searched tcf: successfully for From:
>> ok 127 - From appears with tcf:
>> ok 128 - searched f: successfully for From:
>> ok 129 - From appears with f:
>> ok 130 - no match on body search only
>> ok 131 - no match on body+subject search for From
>> ok 132 - only one quoted body
>> ok 133 - got quoted body
>> ok 134 - only one non-quoted body
>> ok 135 - got non-quoted body
>> ok 136 - searched both bodies for b:
>> ok 137 - non-quoter first for b:
>> ok 138 - searched both bodies for bs:
>> ok 139 - non-quoter first for bs:
>> ok 140 - added attachment
>> ok 141 - got result for n:
>> ok 142 - got result without n:
>> ok 143 - same result with and without
>> ok 144 - found inside another
>> ok 145 - search inside text attachments works
>> ok 146 - article exists in OVER DB
>> ok 147 - gone from OVER DB
>> ok 148 - sharedRepository respected for msgmap.sqlite3
>> ok 149 - sharedRepository respected for public-inbox
>> ok 150 - sharedRepository respected for xapian15
>> ok 151 - sharedRepository respected for docdata.glass
>> ok 152 - sharedRepository respected for flintlock
>> ok 153 - sharedRepository respected for iamglass
>> ok 154 - sharedRepository respected for over.sqlite3
>> ok 155 - sharedRepository respected for over.sqlite3-journal
>> ok 156 - sharedRepository respected for position.glass
>> ok 157 - sharedRepository respected for postlist.glass
>> ok 158 - sharedRepository respected for spelling.glass
>> ok 159 - sharedRepository respected for synonym.glass
>> ok 160 - sharedRepository respected for termlist.glass
>> ok 161 - no results yet
>> ok 162 - searching only digit yielded result
>> ok 163 - searching chopped(1) digit yielded result 1001026093633
>> ok 164 - searching chopped(2) digit yielded result 100102609363
>> ok 165 - searching chopped(3) digit yielded result 10010260936
>> ok 166 - searching chopped(4) digit yielded result 1001026093
>> ok 167 - searching chopped(5) digit yielded result 100102609
>> ok 168 - searching chopped(6) digit yielded result 10010260
>> ok 169
>> ok 170 - got expected mid on exact lid: search
>> ok 171 - got nothing on lid: search
>> ok 172 - got nothing on lid: search
>> ok 173 - probabilistic search works on full List-Id contents
>> ok 174 - probabilistic search works on partial List-Id contents
>> ok 175 - no match on phrase with lid:
>> ok 176 - no match on partial List-Id with lid:
>> ok 177 - matched on phrase with l:
>> ok 178 - messages within messages
>> ok 179 - got a result
>> ok 180 - .eml filenames searchable
>> ok 181 - probabilistic m:20200418222508.GA13918@dcvr
>> ok 182 - boolean mid:20200418222508.GA13918@dcvr
>> ok 183 - probabilistic m:20200418222020.GA2745@dcvr
>> ok 184 - boolean mid:20200418222020.GA2745@dcvr
>> ok 185 - probabilistic m:20200418214114.7575-1-e@yhbt.net
>> ok 186 - boolean mid:20200418214114.7575-1-e@yhbt.net
>> ok 187 - diff search reaches inside message/rfc822
>> ok 188 - Subject search reaches inside message/rfc822
>> 1..188
>> ok
>> t/sigfd.t ....................
>> ok 1 - require PublicInbox::Sigfd;
>> ok 2 - Sigfd->new works
>> ok 3 - fileno(Sigfd->{sock}) works
>> ok 4 - select() works
>> ok 5 - wait_once reported success
>> ok 6 - sigfd fired HUP
>> ok 7 - normal $SIG{$s} not fired
>> ok 8 - sigfd fired INT
>> ok 9 - normal $SIG{$s} not fired
>> ok 10 - Sigfd->new $SFD_NONBLOCK works
>> ok 11 - nonblocking ->wait_once
>> ok 12 - got EAGAIN
>> ok 13 - HUP sigfd fired in event loop
>> ok 14 - TERM sigfd fired in event loop
>> ok 15 - HUP sigfd fired in event loop
>> 1..15
>> ok
>> t/solver_git.t ............... skipped: t/solver_git.t must be run from a git working tree
>> t/spamcheck_spamc.t ..........
>> ok 1 - use PublicInbox::Spamcheck::Spamc;
>> ok 2 - empty GLOB
>> ok 3 - IO::File->new_tmpfile
>> ok 4 - PublicInbox::Eml works
>> ok 5 - input == output
>> ok 6 - Failed check works
>> ok 7 - input == output for spammy example
>> ok 8 - hamlearn OK
>> ok 9 - ham command ran alright
>> ok 10 - spamlearn OK
>> ok 11 - spam command ran alright
>> 1..11
>> ok
>> # waiting for child to reap grandchild...
>> t/spawn.t ....................
>> ok 1 - 'true' command found with which()
>> ok 2 - spawned process
>> ok 3 - waitpid succeeds on spawned process
>> ok 4 - true exited successfully
>> ok 5 - got ready signal, waitpid(-1) works in child
>> ok 6 - sent SIGCHLD to child
>> ok 7 - $SIG{CHLD} works in child
>> ok 8 - popen_rd close works
>> ok 9 - read stdout of spawned from pipe
>> ok 10 - waitpid succeeds on spawned process
>> ok 11 - true exited successfully
>> ok 12 - read stdout of spawned from pipe
>> ok 13 - waitpid succeeds on spawned process
>> ok 14 - sh exited successfully
>> ok 15 - tied fileno works
>> ok 16 - tied readline works
>> ok 17 - tied readline works for EOF
>> ok 18 - tied fileno works
>> ok 19 - wantarray works on readline
>> ok 20 - sysread got 6 bytes
>> ok 21 - tied gets works
>> ok 22 - sysread got EOF
>> ok 23 - close succeeds
>> ok 24 - $? set properly
>> ok 25 - close fails on false
>> ok 26 - $? set properly: 256
>> ok 27 # skip BSD::Resource::RLIMIT_CPU missing
>> ok 28 # skip BSD::Resource::RLIMIT_CPU missing
>> ok 29 # skip BSD::Resource::RLIMIT_CPU missing
>> 1..29
>> ok
>> t/thread-cycle.t .............
>> ok 1 - use PublicInbox::SearchThread;
>> ok 2 # skip Mail::Thread missing
>> ok 3 # skip Mail::Thread missing
>> ok 4 - forward and backward matches
>> 1..4
>> ok
>> t/thread-index-gap.t .........
>> ok 1 - only one thread initially (orig)
>> ok 2 - only one thread after rethread (orig)
>> ok 3 - only one thread initially (shuffle)
>> ok 4 - only one thread after rethread (shuffle)
>> 1..4
>> ok
>> t/time.t .....................
>> ok 1 - got expected date with 2 digit year
>> ok 2 - got expected date with 3 digit year
>> 1..2
>> ok
>> t/uri_imap.t .................
>> ok 1 - use PublicInbox::URIimap;
>> ok 2 - invalid scheme ignored
>> ok 3 - host ok
>> ok 4 - host canonicalized
>> ok 5 - URI canonicalized
>> ok 6 - imaps port
>> ok 7
>> ok 8
>> ok 9 - numeric host
>> ok 10 - user extracted
>> ok 11 - no fragment
>> ok 12
>> ok 13 - AUTH=ANONYMOUS accepted
>> ok 14 - decoded AUTH
>> ok 15 - decoded user
>> ok 16 - mailbox is undef
>> ok 17 - IPv6 host
>> ok 18 - mailbox is undef
>> ok 19 - port read
>> ok 20
>> ok 21
>> ok 22
>> ok 23
>> ok 24
>> ok 25
>> ok 26
>> ok 27 - RFC 2192 '%' supported
>> ok 28 - RFC 2192 '*' supported
>> 1..28
>> ok
>> t/v1-add-remove-add.t ........
>> ok 1 - message added
>> ok 2 - message removed
>> ok 3 - message added again
>> ok 4 - message exists in history
>> ok 5 - only one message in history
>> ok 6 - exists with second article number
>> 1..6
>> ok
>> t/v1reindex.t ................
>> ok 1 - use PublicInbox::SearchIdx;
>> ok 2 - use PublicInbox::Import;
>> ok 3 - use PublicInbox::OverIdx;
>> ok 4 - message 1 added
>> ok 5 - message 2 added
>> ok 6 - message 3 added
>> ok 7 - message 4 added
>> ok 8 - message 5 added
>> ok 9 - message 6 added
>> ok 10 - message 7 added
>> ok 11 - message 8 added
>> ok 12 - message 9 added
>> ok 13 - message 10 added
>> ok 14 - no error from indexing
>> ok 15 - minmax defined
>> ok 16 - minmax as expected
>> ok 17 - num_highwater as expected
>> ok 18 - msgmap as expected
>> ok 19 - no error from reindexing
>> ok 20 - num_highwater as expected
>> ok 21 - msgmap unchanged
>> ok 22 - Xapian directories removed
>> ok 23 - no error from reindexing
>> ok 24 - Xapian directories recreated
>> ok 25 - minmax unchanged
>> ok 26 - num_highwater as expected
>> ok 27 - msgmap unchanged
>> ok 28
>> ok 29 - Xapian directories removed again
>> ok 30 - no error from reindexing without msgmap
>> ok 31 - no warnings from reindexing
>> ok 32 - Xapian directories recreated
>> ok 33 - minmax unchanged
>> ok 34 - num_highwater as expected
>> ok 35 - msgmap unchanged
>> ok 36
>> ok 37 - Xapian directories removed again
>> ok 38 - no error from reindexing without msgmap
>> ok 39 - no warnings
>> ok 40 - Xapian directories recreated
>> ok 41 - minmax unchanged
>> ok 42 - num_highwater as expected
>> ok 43 - msgmap unchanged
>> ok 44
>> ok 45 - Xapian directories removed again
>> ok 46 - no error from reindexing without msgmap
>> ok 47 - no warnings
>> ok 48 - Xapian directories recreated
>> ok 49 - minmax unchanged
>> ok 50 - num_highwater as expected
>> ok 51 - got Xapian search results
>> ok 52 - msgmap unchanged
>> ok 53
>> ok 54 - Xapian directories removed again
>> ok 55 - no error from reindexing without msgmap
>> ok 56 - no warnings
>> ok 57 - Xapian directories recreated
>> ok 58 - minmax unchanged
>> ok 59 - num_highwater as expected
>> ok 60
>> ok 61 - msgmap unchanged
>> ok 62 - no error from indexing
>> ok 63 - no warnings
>> ok 64 - search OK after basic -> medium
>> ok 65 - num_highwater as expected
>> ok 66 - msgmap unchanged
>> ok 67
>> ok 68 - Xapian directories removed again
>> ok 69 - no error from reindexing without msgmap
>> ok 70 - no warnings
>> ok 71 - min as expected
>> ok 72 - max as expected
>> ok 73 - num_highwater as expected
>> ok 74 - msgmap as expected
>> ok 75 - no error from reindexing without msgmap
>> ok 76 - no warnings
>> ok 77 - min as expected
>> ok 78 - max as expected
>> ok 79 - num_highwater as expected
>> ok 80 - msgmap as expected
>> ok 81 - no error from reindexing without msgmap
>> ok 82 - no warnings
>> ok 83 - min as expected
>> ok 84 - max as expected
>> ok 85 - num_highwater as expected
>> ok 86 - msgmap as expected
>> ok 87 - no error from reindexing without msgmap
>> ok 88 - no warnings
>> ok 89 - min as expected
>> ok 90 - max as expected
>> ok 91 - num_highwater as expected
>> ok 92 - msgmap as expected
>> ok 93
>> ok 94 - Xapian directories removed again
>> ok 95 - no error from reindexing without msgmap
>> ok 96 - no warnings
>> ok 97 - min as expected
>> ok 98 - max as expected
>> ok 99 - num_highwater as expected
>> ok 100 - msgmap as expected
>> ok 101 - no error from reindexing without msgmap
>> ok 102 - no warnings
>> ok 103 - min as expected
>> ok 104 - max as expected
>> ok 105 - num_highwater as expected
>> ok 106 - msgmap as expected
>> ok 107 - no error from reindexing without msgmap
>> ok 108 - no warnings
>> ok 109 - min as expected
>> ok 110 - max as expected
>> ok 111 - num_highwater as expected
>> ok 112 - msgmap as expected
>> ok 113 - rethread dropped old threadids
>> ok 114 - all tids greater than before
>> ok 115 - thread count unchanged
>> ok 116 - no warnings
>> 1..116
>> ok
>> t/v2-add-remove-add.t ........
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2 - message added
>> ok 3 - message removed
>> ok 4 - message added again
>> ok 5 - message exists in history
>> ok 6 - only one message in history
>> 1..6
>> ok
>> t/v2dupindex.t ...............
>> ok 1 - use PublicInbox::Import;
>> ok 2 - use PublicInbox::Git;
>> ok 3 - use PublicInbox::InboxWritable;
>> ok 4 - add seen message directly
>> ok 5 - add another seen message directly
>> ok 6 - add another new message
>> ok 7 - unlinked SQLite indices
>> ok 8 - no Xapian shards to drop
>> ok 9 - -indexed
>> ok 10 - identical message not re-indexed
>> ok 11 - msgmap omits redundant message
>> 1..11
>> ok
>> t/v2mda.t ....................
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2
>> ok 3 - initialized v2 inbox
>> ok 4 - mda delivered a message
>> ok 5 - only got one message
>> ok 6 - injected message
>> ok 7 - nothing in faildir
>> ok 8 - mda did not die on "spam"
>> ok 9 - got a message in faildir
>> ok 10 - no new message
>> ok 11 - config exists
>> ok 12 - disabled spamcheck for mda
>> ok 13 - mda did not die
>> ok 14 - no new message in faildir
>> ok 15 - new message added OK
>> ok 16 - mda delivered a patch
>> ok 17 - got one result for dfpost
>> ok 18 - got one result for dfpre
>> ok 19 - same message in both cases
>> 1..19
>> ok
>> t/v2mirror.t .................
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2 - inbox found
>> ok 3 - v2w loaded
>> ok 4 - add msg 1 OK
>> ok 5 - add msg 2 OK
>> ok 6 - add msg 3 OK
>> ok 7 - add msg 4 OK
>> ok 8 - add msg 5 OK
>> ok 9 - add msg 6 OK
>> ok 10 - add msg 7 OK
>> ok 11 - add msg 8 OK
>> ok 12 - add msg 9 OK
>> ok 13 - multiple epochs
>> ok 14 - lines is a digit
>> ok 15 - bytes is a digit
>> ok 16 - sock created
>> ok 17 - cloned 0.git
>> ok 18 - mirror 0 OK
>> ok 19 - cloned 1.git
>> ok 20 - mirror 1 OK
>> ok 21 - cloned 2.git
>> ok 22 - mirror 2 OK
>> ok 23 - initialized public-inbox -V2
>> ok 24 - got a single shard on init
>> ok 25 - indexed
>> ok 26 - index synched minmax
>> ok 27 - add msg 10 OK
>> ok 28 - add msg 11 OK
>> ok 29 - add msg 12 OK
>> ok 30 - add msg 13 OK
>> ok 31 - add msg 14 OK
>> ok 32 - add msg 15 OK
>> ok 33 - fetch successful
>> ok 34 - fetch successful
>> ok 35 - fetch successful
>> ok 36 - new message not found in mirror, yet
>> ok 37 - index updated
>> ok 38 - index synched minmax
>> ok 39 - found message in mirror
>> ok 40 - purge a message
>> ok 41
>> ok 42 - only rewrote one
>> ok 43 - read blob to be purged
>> ok 44 - purged message gone from origin
>> ok 45 - fetch successful
>> ok 46 - fetch successful
>> ok 47 - fetch successful
>> ok 48 - -index --prune
>> ok 49 - warned about discontiguous range
>> ok 50 - no scary fatal error shown
>> ok 51 - purged message not found in mirror
>> ok 52 - minmax still synced
>> ok 53 - 1@example.com remains visible
>> ok 54 - 2@example.com remains visible
>> ok 55 - 3@example.com remains visible
>> ok 56 - 4@example.com remains visible
>> ok 57 - 5@example.com remains visible
>> ok 58 - 6@example.com remains visible
>> ok 59 - 7@example.com remains visible
>> ok 60 - 8@example.com remains visible
>> ok 61 - 9@example.com remains visible
>> ok 62 - 11@example.com remains visible
>> ok 63 - 12@example.com remains visible
>> ok 64 - 13@example.com remains visible
>> ok 65 - 14@example.com remains visible
>> ok 66 - 15@example.com remains visible
>> ok 67 - unindex+prune successful in mirror
>> ok 68 - no warnings from index_sync after purge
>> ok 69 - 1@example.com visible in mirror
>> ok 70 - removed <1@example.com> from source
>> ok 71 - fetch successful
>> ok 72 - fetch successful
>> ok 73 - fetch successful
>> ok 74 - index ran
>> ok 75 - no errors reported by index
>> ok 76 - 1@example.com no longer visible in mirror
>> ok 77 - large message not indexed
>> ok 78 - --sequential-shard works
>> ok 79 - got expected shard count
>> ok 80 - search works after --sequential-shard
>> ok 81 - add big message
>> ok 82 - fetch successful
>> ok 83 - fetch successful
>> ok 84 - fetch successful
>> ok 85 - indexed with --max-size
>> ok 86 - warned about skipping message
>> ok 87 - large message not indexed
>> ok 88 - reindexed w/ indexMaxSize in file
>> ok 89 - warned about skipping message
>> ok 90 - large message not re-indexed
>> ok 91 - killed httpd
>> 1..91
>> ok
>> # messing up all threads with tid=10
>> # messing up all threads with tid=13
>> # messing up all threads with tid=29
>> t/v2reindex.t ................
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2 - use PublicInbox::OverIdx;
>> ok 3 - message 1 added
>> ok 4 - message 2 added
>> ok 5 - message 3 added
>> ok 6 - message 4 added
>> ok 7 - message 5 added
>> ok 8 - message 6 added
>> ok 9 - message 7 added
>> ok 10 - message 8 added
>> ok 11 - message 9 added
>> ok 12 - message 10 added
>> ok 13 - minmax defined
>> ok 14 - minmax as expected
>> ok 15 - num_highwater as expected
>> ok 16 - msgmap as expected
>> ok 17 - no error from reindexing
>> ok 18 - minmax unchanged
>> ok 19 - num_highwater as expected
>> ok 20 - msgmap unchanged
>> ok 21 - Xapian directories removed
>> ok 22 - no error from reindexing
>> ok 23 - Xapian directories recreated
>> ok 24 - minmax unchanged
>> ok 25 - num_highwater as expected
>> ok 26 - msgmap unchanged
>> ok 27
>> ok 28 - Xapian directories removed again
>> ok 29 - no error from reindexing without msgmap
>> ok 30 - no warnings from reindexing
>> ok 31 - Xapian directories recreated
>> ok 32 - minmax unchanged
>> ok 33 - num_highwater as expected
>> ok 34 - msgmap unchanged
>> ok 35
>> ok 36 - Xapian directories removed again
>> ok 37 - no error from reindexing without msgmap
>> ok 38 - no warnings
>> ok 39 - Xapian directories recreated
>> ok 40 - minmax unchanged
>> ok 41 - num_highwater as expected
>> ok 42 - phrase search succeeds on indexlevel=full
>> ok 43 - msgmap unchanged
>> ok 44
>> ok 45 - Xapian directories removed again
>> ok 46 - no error from reindexing without msgmap
>> ok 47 - no warnings
>> ok 48 - Xapian directories recreated
>> ok 49 - minmax unchanged
>> ok 50 - num_highwater as expected
>> ok 51 - normal search works on indexlevel=medium
>> ok 52 - medium is smaller than full
>> ok 53 - msgmap unchanged
>> ok 54
>> ok 55 - Xapian directories removed again
>> ok 56 - no error from reindexing without msgmap
>> ok 57 - no warnings
>> ok 58 - Xapian directories recreated
>> ok 59 - minmax unchanged
>> ok 60 - num_highwater as expected
>> ok 61
>> ok 62 - basic is smaller than medium
>> ok 63 - msgmap unchanged
>> ok 64
>> ok 65 - Xapian directories removed again
>> ok 66 - no error from reindexing without msgmap
>> ok 67 - no warnings
>> ok 68 - min as expected
>> ok 69 - max as expected
>> ok 70 - num_highwater as expected
>> ok 71 - msgmap as expected
>> ok 72 - no error from reindexing without msgmap
>> ok 73 - no warnings
>> ok 74 - min as expected
>> ok 75 - max as expected
>> ok 76 - num_highwater as expected
>> ok 77 - msgmap as expected
>> ok 78 - no error from reindexing without msgmap
>> ok 79 - no warnings
>> ok 80 - min as expected
>> ok 81 - max as expected
>> ok 82 - num_highwater as expected
>> ok 83 - msgmap as expected
>> ok 84 - no error from reindexing without msgmap
>> ok 85 - no warnings
>> ok 86 - min as expected
>> ok 87 - max as expected
>> ok 88 - num_highwater as expected
>> ok 89 - msgmap as expected
>> ok 90
>> ok 91 - Xapian directories removed again
>> ok 92 - no error from reindexing without msgmap
>> ok 93 - no warnings
>> ok 94 - min as expected
>> ok 95 - max as expected
>> ok 96 - num_highwater as expected
>> ok 97 - msgmap as expected
>> ok 98 - no error from reindexing without msgmap
>> ok 99 - no warnings
>> ok 100 - min as expected
>> ok 101 - max as expected
>> ok 102 - num_highwater as expected
>> ok 103 - msgmap as expected
>> ok 104 - no error from reindexing without msgmap
>> ok 105 - no warnings
>> ok 106 - min as expected
>> ok 107 - max as expected
>> ok 108 - num_highwater as expected
>> ok 109 - msgmap as expected
>> ok 110 - no warnings on reindex + rethread
>> ok 111 - rethread dropped old threadids
>> ok 112 - all tids greater than before
>> ok 113 - thread count unchanged
>> ok 114 - no error from initial indexing
>> ok 115 - no warnings from initial index
>> ok 116 - no error from reindexing after reused Message-ID (x3)
>> ok 117 - no warnings on reindex
>> ok 118 - only one result for `uno'
>> ok 119 - only one result for `dos'
>> ok 120 - only one result for `tres'
>> ok 121 - search on different subjects
>> ok 122 - no warnings on reindex + rethread
>> ok 123 - rethread dropped old threadids
>> ok 124 - all tids greater than before
>> ok 125 - thread count unchanged
>> ok 126 - no warnings on reindex + rethread
>> ok 127 - rethread dropped old threadids
>> ok 128 - all tids greater than before
>> ok 129 - thread count unchanged
>> 1..129
>> ok
>> t/v2writable.t ...............
>> ok 1 - use PublicInbox::V2Writable;
>> ok 2 - one shard when forced
>> ok 3 - ordinary message added
>> ok 4 - default sharedRepository respected for msgmap.sqlite3
>> ok 5 - default sharedRepository respected for 0
>> ok 6 - default sharedRepository respected for over.sqlite3
>> ok 7 - default sharedRepository respected for over.sqlite3-journal
>> ok 8 - default sharedRepository respected for flintlock
>> ok 9 - default sharedRepository respected for iamglass
>> ok 10 - default sharedRepository respected for postlist.glass
>> ok 11 - default sharedRepository respected for termlist.glass
>> ok 12 - set sharedRepository in all.git
>> ok 13 - child repo inherited core.sharedRepository
>> ok 14 - child repo inherited repack.writeBitmaps
>> ok 15 - obvious duplicate rejected
>> ok 16 - no warning about resent message
>> ok 17 - secondary MID ignored if first matches
>> ok 18 - secondary MID used if data is different
>> ok 19 - warned about mismatch
>> ok 20 - warned about alternative
>> ok 21 - no new Message-Id added
>> ok 22 - reused mid ok
>> ok 23 - warned about reused MID
>> ok 24 - original mid not changed
>> ok 25 - new MID added
>> ok 26 - only one new MID added
>> ok 27 - no URL-unfriendly chars in Message-Id
>> ok 28 - fake added easily
>> ok 29 - no warnings from a faker
>> ok 30 - random MID made
>> ok 31 - warned about using random
>> ok 32 - original mid not changed
>> ok 33 - new MID added
>> ok 34 - only one new MID added
>> ok 35 - random MID made for MID free message
>> ok 36 - mid was generated
>> ok 37 - new generated
>> ok 38 - message added with space in Message-Id
>> ok 39
>> ok 40 - message with multiple Message-ID
>> ok 41 - got expected highwater value
>> ok 42 - message found by first MID
>> ok 43 - message found by second MID
>> ok 44 - same document
>> ok 45 - message found by alt MID (NNTP)
>> ok 46 - same document
>> ok 47 - all alt Message-ID queries give same smsg
>> ok 48 - 3 queries, 3 results
>> ok 49 - sock created
>> ok 50 - MID for 1 is unique in XOVER
>> ok 51 - XHDR lookup OK on num 1
>> ok 52 - XHDR lookup OK on MID <a-mid@b> (1)
>> ok 53 - MID for 2 is unique in XOVER
>> ok 54 - XHDR lookup OK on num 2
>> ok 55 - XHDR lookup OK on MID <c@d> (2)
>> ok 56 - MID for 3 is unique in XOVER
>> ok 57 - XHDR lookup OK on num 3
>> ok 58 - XHDR lookup OK on MID <19931002000000.v4S32va-9R-SabIkPGyZ95yXuV-4aNbw0fT4I4Ep8rM@z> (3)
>> ok 59 - MID for 4 is unique in XOVER
>> ok 60 - XHDR lookup OK on num 4
>> ok 61 - XHDR lookup OK on MID <19931002000000.VUkdJD5SvuUHFNiHG63fMldnKy0_KbeDqiP2qeREXms@z> (4)
>> ok 62 - MID for 5 is unique in XOVER
>> ok 63 - XHDR lookup OK on num 5
>> ok 64 - XHDR lookup OK on MID <19931002000000.I0iIPnwPVsBYRQBK-mSDQm42sPU8hOJE1fOvB3O25MA@z> (5)
>> ok 65 - MID for 6 is unique in XOVER
>> ok 66 - XHDR lookup OK on num 6
>> ok 67 - XHDR lookup OK on MID <19931002000000.BOYi8e-FbvFDX_kh5f1rDPhvEGE-YFwNj1OcRD98Heg@z> (6)
>> ok 68 - MID for 7 is unique in XOVER
>> ok 69 - XHDR lookup OK on num 7
>> ok 70 - MID for 8 is unique in XOVER
>> ok 71 - XHDR lookup OK on num 8
>> ok 72 - XHDR lookup OK on MID <abcde@1> (8)
>> ok 73 - MID is unique in NEWNEWS
>> ok 74 - MID is unique in NEWNEWS
>> ok 75 - MID is unique in NEWNEWS
>> ok 76 - MID is unique in NEWNEWS
>> ok 77 - MID is unique in NEWNEWS
>> ok 78 - MID is unique in NEWNEWS
>> ok 79 - MID is unique in NEWNEWS
>> ok 80 - MID is unique in NEWNEWS
>> ok 81
>> ok 82 - num is unique in LISTGROUP
>> ok 83 - num is unique in LISTGROUP
>> ok 84 - num is unique in LISTGROUP
>> ok 85 - num is unique in LISTGROUP
>> ok 86 - num is unique in LISTGROUP
>> ok 87 - num is unique in LISTGROUP
>> ok 88 - num is unique in LISTGROUP
>> ok 89 - num is unique in LISTGROUP
>> ok 90 - XOVER and LISTGROUPS return the same article numbers
>> ok 91 - Xref range OK
>> ok 92 - Message-ID range OK
>> ok 93 - XROVER range OK
>> ok 94 - detected single shard from previous
>> ok 95 - removed object returned matches
>> ok 96 - mark set
>> ok 97 - commit message propagated to git
>> ok 98 - only one commit written to git
>> ok 99 - no longer in Msgmap by mid
>> ok 100 - numeric number in return message
>> ok 101 - no longer in Msgmap by num
>> ok 102 - no longer found in Xapian
>> ok 103 - removal propagated to Over DB
>> ok 104 - no new blob introduced
>> ok 105 - remove is idempotent
>> ok 106 - no git history made with idempotent remove
>> ok 107 - ->done is idempotent
>> ok 108 - add message to be purged
>> ok 109 - purged message
>> ok 110 - purge returned current commit
>> ok 111 - no-op returns undef
>> ok 112 - add excessively long Message-ID
>> ok 113 - add excessively long References
>> ok 114 - got both messages
>> ok 115 - stored truncated mid
>> ok 116 - stored truncated ref
>> ok 117 - stored truncated mid(2)
>> ok 118 - V2Writable fails on non-existent dir
>> ok 119 - creat flag works
>> ok 120 - init a new epoch
>> ok 121 - old contents preserved after adding epoch
>> ok 122 - first line is newest epoch
>> ok 123 - 0664 is 0664
>> 1..123
>> ok
>> t/view.t .....................
>> ok 1 - use PublicInbox::View;
>> ok 2 - folded result
>> ok 3 - "last, first" no broken
>> ok 4 - no addresses lost in translation
>> ok 5 - not thrown off by trailing whitespace
>> 1..5
>> ok
>> t/watch_filter_rubylang.t ....
>> ok 1 - use PublicInbox::Watch;
>> ok 2 - use PublicInbox::Emergency;
>> ok 3 - use PublicInbox::V2Writable;
>> ok 4 - public-inbox init OK
>> ok 5 - v1 indexed
>> ok 6 - found inbox by name
>> ok 7 - got one result for alerts:1
>> ok 8 - got expected MID for 1
>> ok 9 - got one result for alerts:2
>> ok 10 - got expected MID for 2
>> ok 11 - got one result for alerts:3
>> ok 12 - got expected MID for 3
>> ok 13 - got one result for alerts:4
>> ok 14 - got expected MID for 4
>> ok 15 - got one result for alerts:5
>> ok 16 - got expected MID for 5
>> ok 17 - got one result for alerts:6
>> ok 18 - got expected MID for 6
>> ok 19 - got one result for alerts:7
>> ok 20 - got expected MID for 7
>> ok 21 - got one result for alerts:8
>> ok 22 - got expected MID for 8
>> ok 23 - got one result for alerts:9
>> ok 24 - got expected MID for 9
>> ok 25 - got one result for alerts:10
>> ok 26 - got expected MID for 10
>> ok 27 - got one result for alerts:11
>> ok 28 - got expected MID for 11
>> ok 29 - got one result for alerts:12
>> ok 30 - got expected MID for 12
>> ok 31 - got one result for alerts:13
>> ok 32 - got expected MID for 13
>> ok 33 - got one result for alerts:14
>> ok 34 - got expected MID for 14
>> ok 35 - got one result for alerts:15
>> ok 36 - got expected MID for 15
>> ok 37 - got spam message
>> ok 38
>> ok 39
>> ok 40
>> ok 41 - spam removed
>> ok 42 - no warnings
>> ok 43 - public-inbox init OK
>> ok 44 - found inbox by name
>> ok 45 - got one result for alerts:1
>> ok 46 - got expected MID for 1
>> ok 47 - got one result for alerts:2
>> ok 48 - got expected MID for 2
>> ok 49 - got one result for alerts:3
>> ok 50 - got expected MID for 3
>> ok 51 - got one result for alerts:4
>> ok 52 - got expected MID for 4
>> ok 53 - got one result for alerts:5
>> ok 54 - got expected MID for 5
>> ok 55 - got one result for alerts:6
>> ok 56 - got expected MID for 6
>> ok 57 - got one result for alerts:7
>> ok 58 - got expected MID for 7
>> ok 59 - got one result for alerts:8
>> ok 60 - got expected MID for 8
>> ok 61 - got one result for alerts:9
>> ok 62 - got expected MID for 9
>> ok 63 - got one result for alerts:10
>> ok 64 - got expected MID for 10
>> ok 65 - got one result for alerts:11
>> ok 66 - got expected MID for 11
>> ok 67 - got one result for alerts:12
>> ok 68 - got expected MID for 12
>> ok 69 - got one result for alerts:13
>> ok 70 - got expected MID for 13
>> ok 71 - got one result for alerts:14
>> ok 72 - got expected MID for 14
>> ok 73 - got one result for alerts:15
>> ok 74 - got expected MID for 15
>> ok 75 - got spam message
>> ok 76
>> ok 77
>> ok 78
>> ok 79 - spam removed
>> ok 80 - no warnings
>> 1..80
>> ok
>> t/watch_imap.t ...............
>> ok 1 - use PublicInbox::Watch;
>> ok 2 - watched an inbox
>> ok 3 - watched spam folder
>> 1..3
>> ok
>> # waiting 1s for -watch to start up
>> # waiting for -watch to import new message
>> # message delivered to `test'
>> t/watch_maildir.t ............
>> ok 1 - use PublicInbox::Watch;
>> ok 2 - use PublicInbox::Emergency;
>> ok 3 - create FIFO to ensure we do not get stuck on it :P
>> ok 4 - got warning about spam
>> ok 5 - only got the spam folder to watch
>> ok 6 - one revision in rev-list
>> ok 7 - no spam existing
>> ok 8
>> ok 9
>> ok 10
>> ok 11 - unlinked old spam
>> ok 12 - two revisions in rev-list
>> ok 13 - tree is empty
>> ok 14 - unlinked trained spam
>> ok 15 - tree has one file
>> ok 16 - message scrubbed on import
>> ok 17 - unlinked spam
>> ok 18 - no spam existing
>> ok 19
>> ok 20
>> ok 21
>> ok 22 - tree is empty
>> ok 23 - four revisions in rev-list
>> ok 24 - unlinked trained spam
>> ok 25 - mock spamc exists
>> ok 26 - tree has no files spamc checked
>> ok 27
>> ok 28 - mock spamc exists
>> ok 29 - tree has one file after spamc checked
>> ok 30 - message scrubbed on import
>> ok 31 - use PublicInbox::InboxIdle;
>> ok 32 - use PublicInbox::DS;
>> ok 33 - new commit made
>> ok 34 - extra slash gone
>> ok 35 - trailing slash gone
>> ok 36 - non-maildir rejected
>> 1..36
>> ok
>> t/watch_maildir_v2.t .........
>> ok 1 - use PublicInbox::Watch;
>> ok 2 - use PublicInbox::Emergency;
>> ok 3 - public-inbox init OK
>> ok 4 - create FIFO to ensure we do not get stuck on it :P
>> ok 5 - found inbox by name
>> ok 6 - got one revision
>> ok 7 - no spam existing
>> ok 8
>> ok 9
>> ok 10
>> ok 11 - unlinked old spam
>> ok 12 - deleted file
>> ok 13 - unlinked trained spam
>> ok 14 - got one file back
>> ok 15 - message scrubbed on import
>> ok 16 - unlinked spam
>> ok 17 - no spam existing
>> ok 18
>> ok 19
>> ok 20
>> ok 21 - inbox is empty again
>> ok 22 - unlinked trained spam
>> ok 23 - mock spamc exists
>> ok 24 - inbox is still empty
>> ok 25
>> ok 26 - mock spamc exists
>> ok 27 - inbox has one mail after spamc OK-ed a message
>> ok 28 - message scrubbed on import
>> ok 29 - diff postimage found
>> ok 30 - diff preimage found
>> ok 31 - diff preimage found
>> ok 32 - same message
>> ok 33 - got original message back from v1
>> ok 34 - got original message back from v2
>> ok 35 - List-ID matched for watch
>> ok 36 - unaccepted List-ID matched for watch
>> ok 37 - X-Mailing-List matched
>> 1..37
>> ok
>> t/watch_multiple_headers.t ...
>> ok 1 - use PublicInbox::Watch;
>> ok 2 - use PublicInbox::Emergency;
>> ok 3 - public-inbox init OK
>> ok 4 - found inbox by name
>> ok 5 - Matched for address in To:
>> ok 6 - Matched for address in Cc:
>> ok 7 - No match without address in To: or Cc:
>> 1..7
>> ok
>> t/watch_nntp.t ...............
>> ok 1 - use PublicInbox::Watch;
>> ok 2 - lowercased
>> ok 3 - nntps:// accepted
>> ok 4 - snews => nntps
>> 1..4
>> ok
>> t/www_altid.t ................ skipped: sqlite3 binary missing
>> t/www_listing.t ..............
>> ok 1 - use PublicInbox::Git;
>> ok 2 - empty repo has no fingerprint
>> ok 3 - fast-import
>> ok 4 - got fingerprint with non-empty repo
>> ok 5 - sock created
>> ok 6 - clone shared repo
>> ok 7 - clone epoch 0
>> ok 8 - clone epoch 1
>> ok 9 - clone epoch 2
>> ok 10 - mock a v2 inbox
>> ok 11 - set gitweb user
>> ok 12 - removed bare/description
>> ok 13 - got HTML listing
>> ok 14 - listing looks like HTML
>> ok 15 - got gzipped HTML listing
>> ok 16 - unzipped listing looks like HTML
>> ok 17 - got manifest
>> ok 18 - modified is an integer
>> ok 19 - /alt in manifest
>> ok 20 - owner set
>> ok 21 - reference detected
>> ok 22 - description read
>> ok 23 - /bare in manifest
>> ok 24 - missing $GIT_DIR/description fallback
>> ok 25 - fingerprint
>> ok 26 - fingerprint matches
>> ok 27 - modified field and Last-Modified header match
>> ok 28 - v2 epoch 0 appeared
>> ok 29 - epoch 0 in description
>> ok 30 - v2 epoch 1 appeared
>> ok 31 - epoch 1 in description
>> ok 32 # skip skipping grok-pull integration test
>> ok 33 # skip skipping grok-pull integration test
>> 1..33
>> ok
>> t/www_static.t ...............
>> ok 1 - use HTTP::Request::Common;
>> ok 2 - use Plack::Test;
>> ok 3 - use URI::Escape;
>> ok 4 - use PublicInbox::WwwStatic;
>> ok 5 - 404 on "/" by default
>> ok 6 - 200 with index.html
>> ok 7 - default index.html returned
>> ok 8 - 200 on HEAD /
>> ok 9 - no content
>> ok 10 - content-length set
>> ok 11 - content-type is html
>> ok 12 - 200 with autoindex default
>> ok 13 - got listing with index.html
>> ok 14 - no updir at /
>> ok 15 - 200 with autoindex for dir/
>> ok 16 - updir at /dir/
>> ok 17 - `/../' traversal rejected
>> ok 18 - `..' traversal rejected
>> ok 19 - `/dir/..' traversal rejected
>> ok 20 - `/dir/../' traversal rejected
>> ok 21 - 302 w/o slash
>> ok 22 - redirected w/ slash
>> ok 23 - .gz file hidden if mtime matches uncompressed
>> ok 24 - uncompressed foo shown
>> ok 25 - using file as dir fails
>> ok 26 - .gz shown when no uncompressed version exists
>> ok 27 - uncompressed foo shown
>> ok 28 - gzipped foo shown on mtime mismatch
>> ok 29 - got uncompressed on mtime mismatch
>> ok 30 - got compressed on mtime match
>> ok 31 - got HTML start after gunzip
>> ok 32 - got HTML end after gunzip
>> 1..32
>> ok
>> t/xcpdb-reshard.t ............
>> ok 1 - message 1 added
>> ok 2 - message 2 added
>> ok 3 - message 3 added
>> ok 4 - message 4 added
>> ok 5 - message 5 added
>> ok 6 - message 6 added
>> ok 7 - message 7 added
>> ok 8 - message 8 added
>> ok 9 - message 9 added
>> ok 10 - message 10 added
>> ok 11 - message 11 added
>> ok 12 - message 12 added
>> ok 13 - message 13 added
>> ok 14 - got expected shards
>> ok 15 - xcpdb -R2
>> ok 16 - resharded to two shards
>> ok 17 - got expected docs after resharding
>> ok 18 - 1 exists
>> ok 19 - 2 exists
>> ok 20 - 3 exists
>> ok 21 - 4 exists
>> ok 22 - 5 exists
>> ok 23 - 6 exists
>> ok 24 - 7 exists
>> ok 25 - 8 exists
>> ok 26 - 9 exists
>> ok 27 - 10 exists
>> ok 28 - 11 exists
>> ok 29 - 12 exists
>> ok 30 - 13 exists
>> ok 31 - saw \#2
>> ok 32 - saw \#4
>> ok 33 - saw \#6
>> ok 34 - saw \#8
>> ok 35 - saw \#10
>> ok 36 - saw \#12
>> ok 37 - saw \#1
>> ok 38 - saw \#3
>> ok 39 - saw \#5
>> ok 40 - saw \#7
>> ok 41 - saw \#9
>> ok 42 - saw \#11
>> ok 43 - saw \#13
>> ok 44 - all docids seen
>> ok 45 - xcpdb -R4
>> ok 46 - resharded to two shards
>> ok 47 - got expected docs after resharding
>> ok 48 - 1 exists
>> ok 49 - 2 exists
>> ok 50 - 3 exists
>> ok 51 - 4 exists
>> ok 52 - 5 exists
>> ok 53 - 6 exists
>> ok 54 - 7 exists
>> ok 55 - 8 exists
>> ok 56 - 9 exists
>> ok 57 - 10 exists
>> ok 58 - 11 exists
>> ok 59 - 12 exists
>> ok 60 - 13 exists
>> ok 61 - saw \#4
>> ok 62 - saw \#8
>> ok 63 - saw \#12
>> ok 64 - saw \#1
>> ok 65 - saw \#5
>> ok 66 - saw \#9
>> ok 67 - saw \#13
>> ok 68 - saw \#2
>> ok 69 - saw \#6
>> ok 70 - saw \#10
>> ok 71 - saw \#3
>> ok 72 - saw \#7
>> ok 73 - saw \#11
>> ok 74 - all docids seen
>> ok 75 - xcpdb -R1
>> ok 76 - resharded to two shards
>> ok 77 - got expected docs after resharding
>> ok 78 - 1 exists
>> ok 79 - 2 exists
>> ok 80 - 3 exists
>> ok 81 - 4 exists
>> ok 82 - 5 exists
>> ok 83 - 6 exists
>> ok 84 - 7 exists
>> ok 85 - 8 exists
>> ok 86 - 9 exists
>> ok 87 - 10 exists
>> ok 88 - 11 exists
>> ok 89 - 12 exists
>> ok 90 - 13 exists
>> ok 91 - saw \#1
>> ok 92 - saw \#2
>> ok 93 - saw \#3
>> ok 94 - saw \#4
>> ok 95 - saw \#5
>> ok 96 - saw \#6
>> ok 97 - saw \#7
>> ok 98 - saw \#8
>> ok 99 - saw \#9
>> ok 100 - saw \#10
>> ok 101 - saw \#11
>> ok 102 - saw \#12
>> ok 103 - saw \#13
>> ok 104 - all docids seen
>> ok 105 - xcpdb -R3
>> ok 106 - resharded to two shards
>> ok 107 - got expected docs after resharding
>> ok 108 - 1 exists
>> ok 109 - 2 exists
>> ok 110 - 3 exists
>> ok 111 - 4 exists
>> ok 112 - 5 exists
>> ok 113 - 6 exists
>> ok 114 - 7 exists
>> ok 115 - 8 exists
>> ok 116 - 9 exists
>> ok 117 - 10 exists
>> ok 118 - 11 exists
>> ok 119 - 12 exists
>> ok 120 - 13 exists
>> ok 121 - saw \#3
>> ok 122 - saw \#6
>> ok 123 - saw \#9
>> ok 124 - saw \#12
>> ok 125 - saw \#1
>> ok 126 - saw \#4
>> ok 127 - saw \#7
>> ok 128 - saw \#10
>> ok 129 - saw \#13
>> ok 130 - saw \#2
>> ok 131 - saw \#5
>> ok 132 - saw \#8
>> ok 133 - saw \#11
>> ok 134 - all docids seen
>> ok 135 - xcpdb -R3
>> ok 136 - resharded to two shards
>> ok 137 - got expected docs after resharding
>> ok 138 - 1 exists
>> ok 139 - 2 exists
>> ok 140 - 3 exists
>> ok 141 - 4 exists
>> ok 142 - 5 exists
>> ok 143 - 6 exists
>> ok 144 - 7 exists
>> ok 145 - 8 exists
>> ok 146 - 9 exists
>> ok 147 - 10 exists
>> ok 148 - 11 exists
>> ok 149 - 12 exists
>> ok 150 - 13 exists
>> ok 151 - saw \#3
>> ok 152 - saw \#6
>> ok 153 - saw \#9
>> ok 154 - saw \#12
>> ok 155 - saw \#1
>> ok 156 - saw \#4
>> ok 157 - saw \#7
>> ok 158 - saw \#10
>> ok 159 - saw \#13
>> ok 160 - saw \#2
>> ok 161 - saw \#5
>> ok 162 - saw \#8
>> ok 163 - saw \#11
>> ok 164 - all docids seen
>> 1..164
>> ok
>>
>> Test Summary Report
>> -------------------
>> t/eml.t                    (Wstat: 256 Tests: 146 Failed: 1)
>>    Failed test:  144
>>    Non-zero exit status: 1
>> Files=108, Tests=3976, 67 wallclock secs ( 0.37 usr  0.13 sys + 21.69 cusr  9.40 csys = 31.59 CPU)
>> Result: FAIL
>> Failed 1/108 test programs. 1/3976 subtests failed.
>> make[1]: *** [Makefile:1064: test_dynamic] Error 255
>> make[1]: Leaving directory '/<<PKGBUILDDIR>>'
>> dh_auto_test: error: make -j4 test TEST_VERBOSE=1 returned exit code 2
> 
> 
> The full build log is available from:
> http://qa-logs.debian.net/2021/12/20/public-inbox_1.6.1-1_unstable.log
> 
> A list of current common problems and possible solutions is available at
> http://wiki.debian.org/qa.debian.org/FTBFS . You're welcome to contribute!
> 
> If you reassign this bug to another package, please marking it as 'affects'-ing
> this package. See https://www.debian.org/Bugs/server-control#affects
> 
> If you fail to reproduce this, please provide a build log and diff it with mine
> so that we can identify if something relevant changed in the meantime.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Bug#1002219: public-inbox: FTBFS: dh_auto_test: error: make -j4 test TEST_VERBOSE=1 returned exit code 2
  2021-12-30  9:12 ` Bug#1002219: public-inbox: FTBFS: dh_auto_test: error: make -j4 test TEST_VERBOSE=1 returned exit code 2 Uwe Kleine-König
@ 2021-12-30 18:49   ` Uwe Kleine-König
  2021-12-30 19:17     ` [PATCH] t/eml.t: ignore newer Email::MIME behavior Eric Wong
  0 siblings, 1 reply; 4+ messages in thread
From: Uwe Kleine-König @ 2021-12-30 18:49 UTC (permalink / raw)
  To: Lucas Nussbaum, 1002219, meta, Debian Perl Group


[-- Attachment #1.1: Type: text/plain, Size: 1679 bytes --]

Hello,

adding the Debian Perl Group to Cc, maybe they can help here.
(for context look at https://bugs.debian.org/1002219)

On 12/30/21 10:12, Uwe Kleine-König wrote:
> I got a bug report against the public-inbox 1.6.1 package about a 
> failing test, see below for the whole output. I didn't have time yet to 
> look into it, so this is just a heads up to make you aware. If someone 
> has a hint what to do, this would be greatly appreciated. Maybe just 
> updating to 1.7 will help?
> 
> Best regards
> Uwe
> 
> On 12/21/21 17:34, Lucas Nussbaum wrote:
>>> #   Failed test 'filename decoded'
>>> #   at t/eml.t line 407.
>>> #          got: '=?utf-8?q?vtpm-makefile.patch?='
>>> #     expected: 'vtpm-makefile.patch'
>>> # Looks like you failed 1 test of 146.
>>> t/eml.t ......................

I can reproduce this problem with 1.6.1 checked out. I played a bit 
around (suffering from my weak perl foo) and found that when I downgrade 
libemail-mime-perl from 1.952-1 (i.e. Debian unstable's version) to 
1.949-1 (i.e. Debian stable's version), this works.

The reproducer is:

$ perl -e 'use Email::MIME; print Email::MIME->new("Content-Type: 
text/x-patch; 
name=\"=?utf-8?q?vtpm-fakefile.patch?=\"\nContent-Disposition: 
attachment; filename=\"=?utf-8?q?vtpm-makefile.patch?=\"\n\n")->filename;'

which emits "vtpm-makefile.patch" with 1.949-1 (as public-inbox 
expects), but =?utf-8?q?vtpm-makefile.patch?= with 1.952-1.

So the key question is: Is the test correct and his is a regression in 
libemail-mime-perl, or is the test wrong and we need to fix the test 
(and PublicInbox::Eml)?

Best regards
Uwe

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH] t/eml.t: ignore newer Email::MIME behavior
  2021-12-30 18:49   ` Uwe Kleine-König
@ 2021-12-30 19:17     ` Eric Wong
  2022-01-02 14:14       ` Uwe Kleine-König
  0 siblings, 1 reply; 4+ messages in thread
From: Eric Wong @ 2021-12-30 19:17 UTC (permalink / raw)
  To: Uwe Kleine-König; +Cc: Lucas Nussbaum, 1002219, meta, Debian Perl Group

Uwe Kleine-König <uwe@kleine-koenig.org> wrote:
> Hello,
> 
> adding the Debian Perl Group to Cc, maybe they can help here.
> (for context look at https://bugs.debian.org/1002219)
> 
> On 12/30/21 10:12, Uwe Kleine-König wrote:
> > I got a bug report against the public-inbox 1.6.1 package about a
> > failing test, see below for the whole output. I didn't have time yet to
> > look into it, so this is just a heads up to make you aware. If someone
> > has a hint what to do, this would be greatly appreciated. Maybe just
> > updating to 1.7 will help?
> > 
> > Best regards
> > Uwe
> > 
> > On 12/21/21 17:34, Lucas Nussbaum wrote:
> > > > #   Failed test 'filename decoded'
> > > > #   at t/eml.t line 407.
> > > > #          got: '=?utf-8?q?vtpm-makefile.patch?='
> > > > #     expected: 'vtpm-makefile.patch'
> > > > # Looks like you failed 1 test of 146.
> > > > t/eml.t ......................
> 
> I can reproduce this problem with 1.6.1 checked out. I played a bit around
> (suffering from my weak perl foo) and found that when I downgrade
> libemail-mime-perl from 1.952-1 (i.e. Debian unstable's version) to 1.949-1
> (i.e. Debian stable's version), this works.
> 
> The reproducer is:
> 
> $ perl -e 'use Email::MIME; print Email::MIME->new("Content-Type:
> text/x-patch; name=\"=?utf-8?q?vtpm-fakefile.patch?=\"\nContent-Disposition:
> attachment; filename=\"=?utf-8?q?vtpm-makefile.patch?=\"\n\n")->filename;'
> 
> which emits "vtpm-makefile.patch" with 1.949-1 (as public-inbox expects),
> but =?utf-8?q?vtpm-makefile.patch?= with 1.952-1.
> 
> So the key question is: Is the test correct and his is a regression in
> libemail-mime-perl, or is the test wrong and we need to fix the test (and
> PublicInbox::Eml)?

I thought I sent a fix to this; but I nuked the root FS on one of
my workstations on accident :<  Still recovering...

--------------8<-------------
Subject: [PATCH] t/eml.t: ignore newer Email::MIME behavior

Once again, our message parser class matches the more tolerant
behavior of older Email::MIME releases in order to handle
ancient messages.

This fixes <https://bugs.debian.org/1002219>, but dropping
Email::MIME entirely from the test suite may be prudent in
the future.
---
 t/eml.t | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/t/eml.t b/t/eml.t
index 2d8993a5..2e6a441f 100644
--- a/t/eml.t
+++ b/t/eml.t
@@ -417,13 +417,14 @@ Content-Type: text/x-patch; name="=?utf-8?q?vtpm-fakefile.patch?="
 Content-Disposition: attachment; filename="=?utf-8?q?vtpm-makefile.patch?="
 
 EOF
-	is($cls->new($s)->filename, 'vtpm-makefile.patch', 'filename decoded');
+	is($cls->new($s)->filename, 'vtpm-makefile.patch',
+		"filename decoded ($cls)") if $cls ne 'PublicInbox::MIME';
 	$s =~ s/^Content-Disposition:.*$//sm;
 	is($cls->new($s)->filename, 'vtpm-fakefile.patch',
 		"filename fallback ($cls)") if $cls ne 'PublicInbox::MIME';
 	is($cls->new($s)->content_type,
 		'text/x-patch; name="vtpm-fakefile.patch"',
-		'matches Email::MIME output, "correct" or not');
+		qq[matches Email::MIME output, "correct" or not ($cls)]);
 
 	$s = <<'EOF';
 Content-Type: multipart/foo; boundary=b

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] t/eml.t: ignore newer Email::MIME behavior
  2021-12-30 19:17     ` [PATCH] t/eml.t: ignore newer Email::MIME behavior Eric Wong
@ 2022-01-02 14:14       ` Uwe Kleine-König
  0 siblings, 0 replies; 4+ messages in thread
From: Uwe Kleine-König @ 2022-01-02 14:14 UTC (permalink / raw)
  To: Eric Wong; +Cc: Lucas Nussbaum, 1002219, meta, Debian Perl Group


[-- Attachment #1.1: Type: text/plain, Size: 2491 bytes --]

Hello Eric,

On 12/30/21 20:17, Eric Wong wrote:
> Uwe Kleine-König <uwe@kleine-koenig.org> wrote:
>> Hello,
>>
>> adding the Debian Perl Group to Cc, maybe they can help here.
>> (for context look at https://bugs.debian.org/1002219)
>>
>> On 12/30/21 10:12, Uwe Kleine-König wrote:
>>> I got a bug report against the public-inbox 1.6.1 package about a
>>> failing test, see below for the whole output. I didn't have time yet to
>>> look into it, so this is just a heads up to make you aware. If someone
>>> has a hint what to do, this would be greatly appreciated. Maybe just
>>> updating to 1.7 will help?
>>>
>>> Best regards
>>> Uwe
>>>
>>> On 12/21/21 17:34, Lucas Nussbaum wrote:
>>>>> #   Failed test 'filename decoded'
>>>>> #   at t/eml.t line 407.
>>>>> #          got: '=?utf-8?q?vtpm-makefile.patch?='
>>>>> #     expected: 'vtpm-makefile.patch'
>>>>> # Looks like you failed 1 test of 146.
>>>>> t/eml.t ......................
>>
>> I can reproduce this problem with 1.6.1 checked out. I played a bit around
>> (suffering from my weak perl foo) and found that when I downgrade
>> libemail-mime-perl from 1.952-1 (i.e. Debian unstable's version) to 1.949-1
>> (i.e. Debian stable's version), this works.
>>
>> The reproducer is:
>>
>> $ perl -e 'use Email::MIME; print Email::MIME->new("Content-Type:
>> text/x-patch; name=\"=?utf-8?q?vtpm-fakefile.patch?=\"\nContent-Disposition:
>> attachment; filename=\"=?utf-8?q?vtpm-makefile.patch?=\"\n\n")->filename;'
>>
>> which emits "vtpm-makefile.patch" with 1.949-1 (as public-inbox expects),.
>> but =?utf-8?q?vtpm-makefile.patch?= with 1.952-1.
>>
>> So the key question is: Is the test correct and his is a regression in
>> libemail-mime-perl, or is the test wrong and we need to fix the test (and
>> PublicInbox::Eml)?
> 
> I thought I sent a fix to this; but I nuked the root FS on one of
> my workstations on accident :<  Still recovering...

Oh, good luck in restoring your precious data.

Thanks for your patch. I just uploaded public-inbox with this change to 
fix the bug.

I still wonder if this is a regression in Email::MIME, or just a wrong 
expectation. In the first case I'd open a bug against libemail-mime-perl.

Bisecting in https://github.com/rjbs/Email-MIME.git yields 
https://github.com/rjbs/Email-MIME/commit/8a7cffd2b1091ff1a750d541a85e1813a6747b72 
as breaking commit. So this looks like an intended change.

Best regards
Uwe

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-01-02 14:14 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <YcICMPpA2SE5k5ZL@xanadu.blop.info>
2021-12-30  9:12 ` Bug#1002219: public-inbox: FTBFS: dh_auto_test: error: make -j4 test TEST_VERBOSE=1 returned exit code 2 Uwe Kleine-König
2021-12-30 18:49   ` Uwe Kleine-König
2021-12-30 19:17     ` [PATCH] t/eml.t: ignore newer Email::MIME behavior Eric Wong
2022-01-02 14:14       ` Uwe Kleine-König

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).