]> Sergey Matveev's repositories - public-inbox.git/blob - xt/imapd-mbsync-oimap.t
No ext_urls
[public-inbox.git] / xt / imapd-mbsync-oimap.t
1 #!perl -w
2 # Copyright (C) all contributors <meta@public-inbox.org>
3 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
4 # ensure mbsync and offlineimap compatibility
5 use strict;
6 use v5.10.1;
7 use File::Path qw(mkpath);
8 use PublicInbox::TestCommon;
9 use PublicInbox::Spawn qw(spawn);
10 require_mods(qw(-imapd));
11 my $inboxdir = $ENV{GIANT_INBOX_DIR};
12 (defined($inboxdir) && -d $inboxdir) or
13         plan skip_all => "GIANT_INBOX_DIR not defined for $0";
14 plan skip_all => "bad characters in $inboxdir" if $inboxdir =~ m![^\w\.\-/]!;
15 my ($tmpdir, $for_destroy) = tmpdir();
16 my $cfg = "$tmpdir/cfg";
17 my $newsgroup = 'inbox.test';
18 my $mailbox = "$newsgroup.0";
19 {
20         open my $fh, '>', $cfg or BAIL_OUT "open: $!";
21         print $fh <<EOF or BAIL_OUT "print: $!";
22 [publicinbox "test"]
23         newsgroup = $newsgroup
24         address = oimap\@example.com
25         inboxdir = $inboxdir
26 EOF
27         close $fh or BAIL_OUT "close: $!";
28 }
29 my ($out, $err) = ("$tmpdir/stdout.log", "$tmpdir/stderr.log");
30 my $sock = tcp_server();
31 my $cmd = [ '-imapd', '-W0', "--stdout=$out", "--stderr=$err" ];
32 my $env = { PI_CONFIG => $cfg };
33 my $td = start_script($cmd, $env, { 3 => $sock }) or BAIL_OUT "-imapd: $?";
34 {
35         my $c = tcp_connect($sock);
36         like(readline($c), qr/CAPABILITY /, 'got greeting');
37 }
38
39 my $host_port = tcp_host_port($sock);
40 my ($host, $port) = ($sock->sockhost, $sock->sockport);
41 my %pids;
42
43 SKIP: {
44         mkpath([map { "$tmpdir/oimapdir/$_" } qw(cur new tmp)]);
45         my $oimap = require_cmd('offlineimap', 1) or
46                 skip 'no offlineimap(1)', 1;
47         open my $fh, '>', "$tmpdir/.offlineimaprc" or BAIL_OUT "open: $!";
48         print $fh <<EOF or BAIL_OUT "print: $!";
49 [general]
50 accounts = test
51 socktimeout = 10
52 fsync = false
53
54 [Account test]
55 localrepository = l.test
56 remoterepository = r.test
57
58 [Repository l.test]
59 type = Maildir
60 localfolders = ~/oimapdir
61
62 [Repository r.test]
63 type = IMAP
64 ssl = no
65 remotehost = $host
66 remoteport = $port
67 remoteuser = anonymous
68 remotepass = Hunter2
69
70 # python-imaplib2 times out on select/poll when compression is enabled
71 # <https://bugs.debian.org/961713>
72 usecompression = no
73 EOF
74         close $fh or BAIL_OUT "close: $!";
75         my $cmd = [ $oimap, qw(-o -q -u quiet) ];
76         my $pid = spawn($cmd, { HOME => $tmpdir }, { 1 => 2 });
77         $pids{$pid} = $cmd;
78 }
79
80 SKIP: {
81         mkpath([map { "$tmpdir/mbsyncdir/test/$_" } qw(cur new tmp)]);
82         my $mbsync = require_cmd('mbsync', 1) or skip 'no mbsync(1)', 1;
83         open my $fh, '>', "$tmpdir/.mbsyncrc" or BAIL_OUT "open: $!";
84         print $fh <<EOF or BAIL_OUT "print: $!";
85 Create Slave
86 SyncState *
87 Remove None
88 FSync no
89
90 MaildirStore local
91 Path ~/mbsyncdir/
92 Inbox ~/mbsyncdir/test
93 SubFolders verbatim
94
95 IMAPStore remote
96 Host $host
97 Port $port
98 User anonymous
99 Pass Hunter2
100 SSLType None
101 UseNamespace no
102 # DisableExtension COMPRESS=DEFLATE
103
104 Channel "test"
105 Master ":remote:INBOX"
106 Slave ":local:test"
107 Expunge None
108 Sync PullNew
109 Patterns *
110 EOF
111         close $fh or BAIL_OUT "close: $!";
112         my $cmd = [ $mbsync, qw(-aqq) ];
113         my $pid = spawn($cmd, { HOME => $tmpdir }, { 1 => 2 });
114         $pids{$pid} = $cmd;
115 }
116
117 while (scalar keys %pids) {
118         my $pid = waitpid(-1, 0) or next;
119         my $cmd = delete $pids{$pid} or next;
120         is($?, 0, join(' ', @$cmd, 'done'));
121 }
122
123 my $sec = $ENV{TEST_PERSIST} // 0;
124 diag "TEST_PERSIST=$sec";
125 if ($sec) {
126         diag "sleeping ${sec}s, imap://$host_port/$mailbox available";
127         diag "tmpdir=$tmpdir (Maildirs available)";
128         diag "stdout=$out";
129         diag "stderr=$err";
130         diag "pid=$td->{pid}";
131         sleep $sec;
132 }
133 $td->kill;
134 $td->join;
135 is($?, 0, 'no error on -imapd exit');
136 done_testing;