From 3fca7a6b6f6de8b513eb0b4d922cbe771d475e96 Mon Sep 17 00:00:00 2001 From: Jason Tibbitts Date: Wed, 30 May 2018 14:30:15 -0500 Subject: [PATCH] Update Cassandane and re-check tests. --- .gitignore | 1 + 57.patch | 5711 ++++++++++++++++++++++++++++++++++++++++++++++ cyrus-imapd.spec | 10 +- sources | 2 +- 4 files changed, 5722 insertions(+), 2 deletions(-) create mode 100644 57.patch diff --git a/.gitignore b/.gitignore index 801e826..56639e7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ /cassandane-389601b.tar.gz /cassandane-e4e97bb.tar.gz /cassandane-00bfe01.tar.gz +/cassandane-8776dd6.tar.gz diff --git a/57.patch b/57.patch new file mode 100644 index 0000000..aa3f478 --- /dev/null +++ b/57.patch @@ -0,0 +1,5711 @@ +From 82c6216183dfe2669ef377c033790aefc81e7447 Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Tue, 22 May 2018 17:33:43 +1000 +Subject: [PATCH 01/11] BuildInfo: split build info parser out of Instance + object + +--- + Cassandane/BuildInfo.pm | 89 +++++++++++++++++++++++++++++++++++++++++ + Cassandane/Cyrus/Autocreate.pm | 2 +- + Cassandane/Cyrus/CaldavAlarm.pm | 2 +- + Cassandane/Cyrus/ClamAV.pm | 2 +- + Cassandane/Cyrus/SearchFuzzy.pm | 4 +- + Cassandane/Instance.pm | 30 ++------------ + 6 files changed, 98 insertions(+), 31 deletions(-) + create mode 100644 Cassandane/BuildInfo.pm + +diff --git a/Cassandane/BuildInfo.pm b/Cassandane/BuildInfo.pm +new file mode 100644 +index 0000000..8c87410 +--- /dev/null ++++ b/Cassandane/BuildInfo.pm +@@ -0,0 +1,89 @@ ++#!/usr/bin/perl ++# ++# Copyright (c) 2011-2018 FastMail Pty Ltd. All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions ++# are met: ++# ++# 1. Redistributions of source code must retain the above copyright ++# notice, this list of conditions and the following disclaimer. ++# ++# 2. Redistributions in binary form must reproduce the above copyright ++# notice, this list of conditions and the following disclaimer in ++# the documentation and/or other materials provided with the ++# distribution. ++# ++# 3. The name "Fastmail Pty Ltd" must not be used to ++# endorse or promote products derived from this software without ++# prior written permission. For permission or any legal ++# details, please contact ++# FastMail Pty Ltd ++# PO Box 234 ++# Collins St West 8007 ++# Victoria ++# Australia ++# ++# 4. Redistributions of any form whatsoever must retain the following ++# acknowledgment: ++# "This product includes software developed by Fastmail Pty. Ltd." ++# ++# FASTMAIL PTY LTD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, ++# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO ++# EVENT SHALL OPERA SOFTWARE AUSTRALIA BE LIABLE FOR ANY SPECIAL, INDIRECT ++# OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF ++# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER ++# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE ++# OF THIS SOFTWARE. ++# ++ ++package Cassandane::BuildInfo; ++use JSON; ++ ++use lib '.'; ++use Cassandane::Cassini; ++use Cassandane::Util::Log; ++ ++sub new { ++ my $class = shift; ++ my %params = @_; ++ my $self = {}; ++ ++ my $cassini = Cassandane::Cassini->instance(); ++ ++ my $prefix = $cassini->val("cyrus default", 'prefix', '/usr/cyrus'); ++ $prefix = $params{cyrus_prefix} ++ if defined $params{cyrus_prefix}; ++ ++ my $destdir = $cassini->val("cyrus default", 'destdir', ''); ++ $destdir = $params{cyrus_destdir} ++ if defined $params{cyrus_destdir}; ++ ++ $self->{data} = _read_buildinfo($destdir, $prefix); ++ ++ return bless $self, $class; ++} ++ ++sub _read_buildinfo ++{ ++ my ($destdir, $prefix) = @_; ++ ++ my $cyr_buildinfo = "$destdir$prefix/sbin/cyr_buildinfo"; ++ return if not -x $cyr_buildinfo; ++ ++ my $jsondata = qx($cyr_buildinfo); ++ return if not $jsondata; ++ ++ return JSON::decode_json($jsondata); ++ ++} ++ ++sub get ++{ ++ my ($self, $category, $key) = @_; ++ ++ return if not exists $self->{data}->{$category}->{$key}; ++ return $self->{data}->{$category}->{$key}; ++} ++ ++1; +diff --git a/Cassandane/Cyrus/Autocreate.pm b/Cassandane/Cyrus/Autocreate.pm +index 32e4c8d..7ce7e8f 100644 +--- a/Cassandane/Cyrus/Autocreate.pm ++++ b/Cassandane/Cyrus/Autocreate.pm +@@ -72,7 +72,7 @@ sub set_up + { + my ($self) = @_; + $self->SUPER::set_up(); +- if (not $self->{instance}->{buildinfo}->{component}->{autocreate}) { ++ if (not $self->{instance}->{buildinfo}->get('component', 'autocreate')) { + xlog "autocreate not enabled. Skipping tests."; + return; + } +diff --git a/Cassandane/Cyrus/CaldavAlarm.pm b/Cassandane/Cyrus/CaldavAlarm.pm +index f00ee51..3467389 100644 +--- a/Cassandane/Cyrus/CaldavAlarm.pm ++++ b/Cassandane/Cyrus/CaldavAlarm.pm +@@ -84,7 +84,7 @@ sub set_up + expandurl => 1, + ); + +- if (not $self->{instance}->{buildinfo}->{component}->{calalarmd}) { ++ if (not $self->{instance}->{buildinfo}->get('component', 'calalarmd')) { + xlog "calalarmd not enabled. Skipping tests."; + return; + } +diff --git a/Cassandane/Cyrus/ClamAV.pm b/Cassandane/Cyrus/ClamAV.pm +index 394d149..d199b66 100644 +--- a/Cassandane/Cyrus/ClamAV.pm ++++ b/Cassandane/Cyrus/ClamAV.pm +@@ -79,7 +79,7 @@ sub set_up + { + my ($self) = @_; + $self->SUPER::set_up(); +- if (not $self->{instance}->{buildinfo}->{dependency}->{clamav}) { ++ if (not $self->{instance}->{buildinfo}->get('dependency', 'clamav')) { + xlog "clamav not enabled. Skipping tests."; + return; + } +diff --git a/Cassandane/Cyrus/SearchFuzzy.pm b/Cassandane/Cyrus/SearchFuzzy.pm +index c3b95ab..e88cbba 100644 +--- a/Cassandane/Cyrus/SearchFuzzy.pm ++++ b/Cassandane/Cyrus/SearchFuzzy.pm +@@ -61,7 +61,7 @@ sub set_up + my ($self) = @_; + $self->SUPER::set_up(); + +- if (not $self->{instance}->{buildinfo}->{search}->{xapian}) { ++ if (not $self->{instance}->{buildinfo}->get('search', 'xapian')) { + xlog "No xapian support enabled. Skipping tests."; + return; + } +@@ -71,7 +71,7 @@ sub set_up + # if using our fork of xapian, or "none" if the Cyrus being tested isn't + # new enough to know the difference. + $self->{xapian_flavor} = +- $self->{instance}->{buildinfo}->{search}->{xapian_flavor} || "none"; ++ $self->{instance}->{buildinfo}->get('search', 'xapian_flavor') || "none"; + + xlog "Xapian flavor '$self->{xapian_flavor}' detected.\n"; + +diff --git a/Cassandane/Instance.pm b/Cassandane/Instance.pm +index 1561143..debd793 100644 +--- a/Cassandane/Instance.pm ++++ b/Cassandane/Instance.pm +@@ -72,6 +72,7 @@ use Cassandane::MasterEvent; + use Cassandane::Cassini; + use Cassandane::PortManager; + use Cassandane::Net::SMTPServer; ++use Cassandane::BuildInfo; + require Cyrus::DList; + + my $__cached_rootdir; +@@ -646,7 +647,7 @@ sub _generate_imapd_conf + event_groups => 'mailbox message flags', + ); + } +- if ($self->{buildinfo}->{search}->{xapian}) { ++ if ($self->{buildinfo}->get('search', 'xapian')) { + my %xapian_defaults = ( + search_engine => 'xapian', + search_index_headers => 'no', +@@ -663,30 +664,6 @@ sub _generate_imapd_conf + $self->{config}->generate($self->_imapd_conf()); + } + +-sub _read_buildinfo +-{ +- my ($self) = @_; +- +- # don't choke if we don't have cyr_buildinfo +- eval { +- $self->_find_binary('cyr_buildinfo'); +- }; +- return if $@; +- +- my $filename = $self->{basedir} . "/buildinfo.out"; +- $self->run_command({ +- cyrus => 1, +- redirects => { stdout => $filename } +- }, 'cyr_buildinfo'); +- +- local $/; +- open FH, '<', $filename +- or die "Cannot open $filename for reading: $!"; +- my $str = ; +- $self->{buildinfo} = JSON::decode_json($str); +- close FH; +-} +- + sub _emit_master_entry + { + my ($self, $entry) = @_; +@@ -1086,7 +1063,8 @@ sub start + $self->_build_skeleton(); + # TODO: system("echo 1 >/proc/sys/kernel/core_uses_pid"); + # TODO: system("echo 1 >/proc/sys/fs/suid_dumpable"); +- $self->_read_buildinfo(); ++ $self->{buildinfo} = Cassandane::BuildInfo->new($self->{cyrus_destdir}, ++ $self->{cyrus_prefix}); + $self->_generate_imapd_conf(); + $self->_generate_master_conf(); + $self->_fix_ownership(); + +From 78eac0a9786cebae62637be7cc400b02babc7fdf Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Tue, 22 May 2018 15:29:16 +1000 +Subject: [PATCH 02/11] TestCase: add ':needs_foo_bar' attr to limit tests by + feature + +So if your test needs, say, Sieve to have been compiled in, +tag your test function with :needs_component_sieve and the test +won't bother to run if Cyrus was built with --disable-sieve. + +See cyr_buildinfo output for valid values of foo and bar :) +--- + Cassandane/Cyrus/TestCase.pm | 39 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 39 insertions(+) + +diff --git a/Cassandane/Cyrus/TestCase.pm b/Cassandane/Cyrus/TestCase.pm +index 565f7bf..4e44c53 100644 +--- a/Cassandane/Cyrus/TestCase.pm ++++ b/Cassandane/Cyrus/TestCase.pm +@@ -41,6 +41,7 @@ package Cassandane::Cyrus::TestCase; + use strict; + use warnings; + use attributes; ++use Data::Dumper; + use Mail::JMAPTalk; + use Net::CalDAVTalk 0.09; + use Net::CardDAVTalk 0.03; +@@ -126,6 +127,42 @@ sub new + return $self; + } + ++sub list_tests ++{ ++ my ($class) = @_; ++ ++ my %tests; ++ @tests{$class->SUPER::list_tests()} = undef; ++ ++ # filter the list for tests that require cyr_buildinfo features ++ # which aren't currently enabled ++ # ++ # XXX could probably do the skip_version stuff here too actually ++ foreach my $name (keys %tests) { ++ my $sub = $class->can($name); ++ if (defined $sub) { ++ foreach my $a (attributes::get($sub)) { ++ my $m = lc($a); ++ next if $a !~ m/^needs_(\w+)_([\w_]+)$/; ++ xlog "found attributed test: $name $a"; ++ ++ my $buildinfo = Cassandane::BuildInfo->new(); ++ ++ if (not $buildinfo) { ++ xlog "Cyrus build info unreadable, " . ++ "cannot skip tests for missing features"; ++ } ++ elsif (not $buildinfo->get($1, $2)) { ++ xlog "$1.$2 not enabled, $name will be skipped"; ++ delete $tests{$name}; ++ } ++ } ++ } ++ } ++ ++ return sort keys %tests; ++} ++ + # will magically cause some special actions to be taken during test + # setup. This used to be a horrible hack to enable a replica instance + # if the test name contained the word "replication", but now it's more +@@ -268,6 +305,8 @@ sub _run_magic + my $m = lc($a); + # ignore min/max version attribution here + next if $a =~ m/^(?:min|max)_version_/; ++ # ignore feature test attribution here ++ next if $a =~ m/^needs_/; + die "Unknown attribute $a" + unless defined $magic_handlers{$m}; + next if $seen{$m}; + +From 6e7c4a97212a2e6ea97a32c78bb56b83d3bbd229 Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Mon, 28 May 2018 13:17:18 +1000 +Subject: [PATCH 03/11] TestCase: reimplement :needs_foo_bar as a filter + instead + +Test::Unit::TestCase::list_unit() inverts the usual inheritance chain +in a really annoying way, so if you override it you basically can't +call SUPER to extend the default behaviour, uggh. Just because you +can, doesn't mean you should! + +Implementing it as a filter is less than ideal, as it confuses the +number-of-tests counter, but it's what we've got to work with. +--- + Cassandane/Cyrus/TestCase.pm | 36 ------------------------------------ + Cassandane/Unit/TestCase.pm | 18 ++++++++++++++++++ + testrunner.pl | 7 +++---- + 3 files changed, 21 insertions(+), 40 deletions(-) + +diff --git a/Cassandane/Cyrus/TestCase.pm b/Cassandane/Cyrus/TestCase.pm +index 4e44c53..b519c6d 100644 +--- a/Cassandane/Cyrus/TestCase.pm ++++ b/Cassandane/Cyrus/TestCase.pm +@@ -127,42 +127,6 @@ sub new + return $self; + } + +-sub list_tests +-{ +- my ($class) = @_; +- +- my %tests; +- @tests{$class->SUPER::list_tests()} = undef; +- +- # filter the list for tests that require cyr_buildinfo features +- # which aren't currently enabled +- # +- # XXX could probably do the skip_version stuff here too actually +- foreach my $name (keys %tests) { +- my $sub = $class->can($name); +- if (defined $sub) { +- foreach my $a (attributes::get($sub)) { +- my $m = lc($a); +- next if $a !~ m/^needs_(\w+)_([\w_]+)$/; +- xlog "found attributed test: $name $a"; +- +- my $buildinfo = Cassandane::BuildInfo->new(); +- +- if (not $buildinfo) { +- xlog "Cyrus build info unreadable, " . +- "cannot skip tests for missing features"; +- } +- elsif (not $buildinfo->get($1, $2)) { +- xlog "$1.$2 not enabled, $name will be skipped"; +- delete $tests{$name}; +- } +- } +- } +- } +- +- return sort keys %tests; +-} +- + # will magically cause some special actions to be taken during test + # setup. This used to be a horrible hack to enable a replica instance + # if the test name contained the word "replication", but now it's more +diff --git a/Cassandane/Unit/TestCase.pm b/Cassandane/Unit/TestCase.pm +index c67a189..c804896 100644 +--- a/Cassandane/Unit/TestCase.pm ++++ b/Cassandane/Unit/TestCase.pm +@@ -48,10 +48,14 @@ use lib '.'; + use Cassandane::Util::Log; + + my $enabled; ++my $buildinfo; + + sub new + { + my $class = shift; ++ if (not $buildinfo) { ++ $buildinfo = Cassandane::BuildInfo->new(); ++ } + return $class->SUPER::new(@_); + } + +@@ -128,6 +132,20 @@ sub filter + } + return; + }, ++ skip_missing_features => sub ++ { ++ return if not exists $self->{_name}; ++ my $sub = $self->can($self->{_name}); ++ return if not defined $sub; ++ foreach my $attr (attributes::get($sub)) { ++ next if $attr !~ m/^needs_(\w+)_([\w_]+)$/; ++ if (not $buildinfo->get($1, $2)) { ++ xlog "$1.$2 not enabled, $self->{_name} will be skipped"; ++ return 1; ++ } ++ } ++ return; ++ } + }; + } + +diff --git a/testrunner.pl b/testrunner.pl +index 7411ea3..dbc9b1e 100755 +--- a/testrunner.pl ++++ b/testrunner.pl +@@ -108,28 +108,27 @@ + }; + }; + +- + my %runners = + ( + tap => sub + { + my ($plan, $fh) = @_; + my $runner = Cassandane::Unit::Runner->new($fh); +- $runner->filter('x', 'skip_version'); ++ $runner->filter('x', 'skip_version', 'skip_missing_features'); + return $runner->do_run($plan, 0); + }, + pretty => sub + { + my ($plan, $fh) = @_; + my $runner = Cassandane::Unit::RunnerPretty->new({}, $fh); +- $runner->filter('x', 'skip_version'); ++ $runner->filter('x', 'skip_version', 'skip_missing_features'); + return $runner->do_run($plan, 0); + }, + prettier => sub + { + my ($plan, $fh) = @_; + my $runner = Cassandane::Unit::RunnerPretty->new({quiet=>1}, $fh); +- $runner->filter('x', 'skip_version'); ++ $runner->filter('x', 'skip_version', 'skip_missing_features'); + return $runner->do_run($plan, 0); + }, + ); + +From 4af3e5528ce704186ce7a0f23b12f27ea9aed518 Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Tue, 22 May 2018 15:28:47 +1000 +Subject: [PATCH 04/11] Sieve: tag sieve tests as :needs_component_sieve + +--- + Cassandane/Cyrus/Autocreate.pm | 2 +- + Cassandane/Cyrus/Replication.pm | 5 +++++ + Cassandane/Cyrus/Sieve.pm | 33 ++++++++++++++++++++++++++++++++- + 3 files changed, 38 insertions(+), 2 deletions(-) + +diff --git a/Cassandane/Cyrus/Autocreate.pm b/Cassandane/Cyrus/Autocreate.pm +index 7ce7e8f..b258ce7 100644 +--- a/Cassandane/Cyrus/Autocreate.pm ++++ b/Cassandane/Cyrus/Autocreate.pm +@@ -117,7 +117,7 @@ sub test_autocreate_specialuse + } + + sub test_autocreate_sieve_script_generation +- :min_version_3_0 ++ :min_version_3_0 :needs_component_sieve + { + my ($self) = @_; + return unless $self->{test_autocreate}; +diff --git a/Cassandane/Cyrus/Replication.pm b/Cassandane/Cyrus/Replication.pm +index 6c8e331..93259f8 100644 +--- a/Cassandane/Cyrus/Replication.pm ++++ b/Cassandane/Cyrus/Replication.pm +@@ -444,6 +444,7 @@ sub assert_sieve_matches + } + + sub test_sieve_replication ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -487,6 +488,7 @@ EOF + } + + sub test_sieve_replication_exists ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -531,6 +533,7 @@ EOF + } + + sub test_sieve_replication_different ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -592,6 +595,7 @@ EOF + } + + sub test_sieve_replication_stale ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -657,6 +661,7 @@ EOF + } + + sub test_sieve_replication_delete_unactivate ++ :needs_component_sieve + { + my ($self) = @_; + +diff --git a/Cassandane/Cyrus/Sieve.pm b/Cassandane/Cyrus/Sieve.pm +index dd232a8..b5b793b 100644 +--- a/Cassandane/Cyrus/Sieve.pm ++++ b/Cassandane/Cyrus/Sieve.pm +@@ -205,7 +205,9 @@ sub compile_sieve_script + return $self->$meth($name, $script); + } + +-sub test_vacation_with_following_rules { ++sub test_vacation_with_following_rules ++ :needs_component_sieve ++{ + my ($self) = @_; + + my $target = "INBOX.target"; +@@ -246,6 +248,7 @@ EOF + } + + sub test_deliver ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -285,6 +288,7 @@ EOF + + sub test_deliver_specialuse + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -320,6 +324,7 @@ EOF + + sub test_deliver_compile + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -429,6 +434,7 @@ sub badscript_common + } + + sub test_badscript_sievec ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -438,6 +444,7 @@ sub test_badscript_sievec + } + + sub test_badscript_timsieved ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -447,6 +454,7 @@ sub test_badscript_timsieved + } + + sub test_dup_keep_keep ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -474,6 +482,7 @@ EOF + # tested for here. + + sub test_dup_keep_fileinto ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -497,6 +506,7 @@ EOF + + sub test_deliver_fileinto_dot + :UnixHierarchySep ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -543,6 +553,7 @@ EOF + # on shared mailboxes in 2.5. + sub XXXtest_shared_delivery_addflag + :Admin ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -594,6 +605,7 @@ EOF + + sub test_rfc5490_create + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -645,6 +657,7 @@ EOF + + sub test_rfc5490_mailboxexists + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -701,6 +714,7 @@ EOF + + sub test_rfc5490_mailboxexists_variables + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -758,6 +772,7 @@ EOF + + sub test_rfc5490_metadata + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -812,6 +827,7 @@ EOF + + sub test_rfc5490_metadata_matches + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -869,6 +885,7 @@ EOF + + sub test_rfc5490_metadataexists + :min_version_3_0 :AnnotationAllowUndefined ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -923,6 +940,7 @@ EOF + + sub test_rfc5490_servermetadata + :min_version_3_0 :AnnotationAllowUndefined ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -981,6 +999,7 @@ EOF + + sub test_rfc5490_servermetadataexists + :min_version_3_0 :AnnotationAllowUndefined ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1037,6 +1056,7 @@ EOF + + sub test_variables_basic + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1092,6 +1112,7 @@ EOF + + sub test_sieve_setflag + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1132,6 +1153,7 @@ EOF + + sub test_variables_regex + :min_version_3_0 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1186,6 +1208,7 @@ EOF + } + + sub test_nested_tests_and_discard ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1213,6 +1236,7 @@ EOF + + sub test_editheader + :min_version_3_1 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1248,6 +1272,7 @@ EOF + + sub test_duplicate + :min_version_3_1 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1295,6 +1320,7 @@ EOF + + sub test_ereject + :min_version_3_1 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1320,6 +1346,7 @@ EOF + + sub test_specialuse_exists + :min_version_3_1 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1376,6 +1403,7 @@ EOF + + sub test_specialuse + :min_version_3_1 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1407,6 +1435,7 @@ EOF + + sub test_specialuse_create + :min_version_3_1 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1434,6 +1463,7 @@ EOF + + sub test_vacation_with_fcc + :min_version_3_1 ++ :needs_component_sieve + { + my ($self) = @_; + +@@ -1477,6 +1507,7 @@ EOF + + sub test_github_issue_complex_variables + :min_version_3_1 ++ :needs_component_sieve + { + my ($self) = @_; + + +From 844c0481f73135be35240e805a269688b99755a8 Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Mon, 28 May 2018 14:35:06 +1000 +Subject: [PATCH 05/11] Autocreate: tag tests as :needs_component_autocreate + +--- + Cassandane/Cyrus/Autocreate.pm | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +diff --git a/Cassandane/Cyrus/Autocreate.pm b/Cassandane/Cyrus/Autocreate.pm +index b258ce7..6c0d497 100644 +--- a/Cassandane/Cyrus/Autocreate.pm ++++ b/Cassandane/Cyrus/Autocreate.pm +@@ -72,11 +72,6 @@ sub set_up + { + my ($self) = @_; + $self->SUPER::set_up(); +- if (not $self->{instance}->{buildinfo}->get('component', 'autocreate')) { +- xlog "autocreate not enabled. Skipping tests."; +- return; +- } +- $self->{test_autocreate} = 1; + } + + sub tear_down +@@ -86,10 +81,9 @@ sub tear_down + } + + sub test_autocreate_specialuse +- :min_version_3_0 ++ :min_version_3_0 :needs_component_autocreate + { + my ($self) = @_; +- return unless $self->{test_autocreate}; + + my $svc = $self->{instance}->get_service('imap'); + my $store = $svc->create_store(username => 'foo'); +@@ -117,10 +111,9 @@ sub test_autocreate_specialuse + } + + sub test_autocreate_sieve_script_generation +- :min_version_3_0 :needs_component_sieve ++ :min_version_3_0 :needs_component_autocreate :needs_component_sieve + { + my ($self) = @_; +- return unless $self->{test_autocreate}; + + my $basedir = $self->{instance}->get_basedir(); + my $sieve_script_path = $basedir . "/conf/foo_sieve.script"; + +From dcb1fb73e620cc6166ac015351e6fc5a3243d9be Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Mon, 28 May 2018 14:45:43 +1000 +Subject: [PATCH 06/11] CaldavAlarm: tag tests as :needs_component_calalarmd + +--- + Cassandane/Cyrus/CaldavAlarm.pm | 60 +++++++++++++---------------------------- + 1 file changed, 18 insertions(+), 42 deletions(-) + +diff --git a/Cassandane/Cyrus/CaldavAlarm.pm b/Cassandane/Cyrus/CaldavAlarm.pm +index 3467389..df791b6 100644 +--- a/Cassandane/Cyrus/CaldavAlarm.pm ++++ b/Cassandane/Cyrus/CaldavAlarm.pm +@@ -83,13 +83,6 @@ sub set_up + url => '/', + expandurl => 1, + ); +- +- if (not $self->{instance}->{buildinfo}->get('component', 'calalarmd')) { +- xlog "calalarmd not enabled. Skipping tests."; +- return; +- } +- $self->{test_calalarmd} = 1; +- + } + + sub _can_match { +@@ -159,10 +152,9 @@ sub tear_down + } + + sub test_simple +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -241,10 +233,9 @@ EOF + } + + sub test_simple_reconstruct +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -329,10 +320,9 @@ EOF + } + + sub test_reschedule_later +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -431,10 +421,9 @@ EOF + } + + sub test_override +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -539,10 +528,9 @@ EOF + } + + sub test_override_exception +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -649,10 +637,9 @@ EOF + } + + sub test_floating_notz +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -721,10 +708,9 @@ EOF + } + + sub test_floating_sametz +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -806,7 +792,7 @@ EOF + } + + sub test_floating_differenttz +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; + return if not $self->{test_calalarmd}; +@@ -902,10 +888,9 @@ EOF + } + + sub test_replication_at1 +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + $self->assert_not_null($self->{replica}); + +@@ -1035,10 +1020,9 @@ EOF + } + + sub test_override_double +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -1147,10 +1131,9 @@ EOF + } + + sub test_allday_notz +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -1220,10 +1203,9 @@ EOF + } + + sub test_allday_sametz +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -1306,10 +1288,9 @@ EOF + } + + sub test_replication_withalarms_in_tz_with_dst +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -1413,10 +1394,9 @@ EOF + } + + sub test_replication_withalarms_in_tz_without_dst +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -1512,10 +1492,9 @@ EOF + } + + sub test_reschedule_exception +- :min_version_3_0 ++ :min_version_3_0 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + # FIXME disable this test until calalarmd is fixed + return; +@@ -1698,10 +1677,9 @@ EOF + } + + sub test_simple_multiuser +- :min_version_3_1 ++ :min_version_3_1 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -1851,10 +1829,9 @@ EOF + } + + sub test_override_multiuser +- :min_version_3_1 ++ :min_version_3_1 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + +@@ -2036,10 +2013,9 @@ EOF + } + + sub test_simple_multiuser_sametime +- :min_version_3_1 ++ :min_version_3_1 :needs_component_calalarmd + { + my ($self) = @_; +- return if not $self->{test_calalarmd}; + + my $CalDAV = $self->{caldav}; + + +From f7afc06127d9e08021339182a72de68876bcb882 Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Mon, 28 May 2018 14:57:19 +1000 +Subject: [PATCH 07/11] ClamAV: tag tests as :needs_dependency_clamav + +--- + Cassandane/Cyrus/ClamAV.pm | 10 ++-------- + 1 file changed, 2 insertions(+), 8 deletions(-) + +diff --git a/Cassandane/Cyrus/ClamAV.pm b/Cassandane/Cyrus/ClamAV.pm +index d199b66..15394f1 100644 +--- a/Cassandane/Cyrus/ClamAV.pm ++++ b/Cassandane/Cyrus/ClamAV.pm +@@ -79,17 +79,11 @@ sub set_up + { + my ($self) = @_; + $self->SUPER::set_up(); +- if (not $self->{instance}->{buildinfo}->get('dependency', 'clamav')) { +- xlog "clamav not enabled. Skipping tests."; +- return; +- } + + # set up a shared folder that's easy to write to + my $admintalk = $self->{adminstore}->get_client(); + $admintalk->create('shared.folder'); + $admintalk->setacl('shared.folder', 'cassandane' => 'lrswipkxtecd'); +- +- $self->{test_clamav} = 1; + } + + sub tear_down +@@ -99,18 +93,18 @@ sub tear_down + } + + sub test_aaasetup ++ :needs_dependency_clamav + { + my ($self) = @_; +- return if not $self->{test_clamav}; + + # does everything set up and tear down cleanly? + $self->assert(1); + } + + sub test_remove_infected ++ :needs_dependency_clamav + { + my ($self) = @_; +- return if not $self->{test_clamav}; + + $self->{store}->set_fetch_attributes(qw(uid flags)); + + +From af006bbccdd2d4e8dafc423098e983c11ddbea5c Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Mon, 28 May 2018 15:12:12 +1000 +Subject: [PATCH 08/11] SearchFuzzy: tag tests as :needs_search_xapian + +--- + Cassandane/Cyrus/SearchFuzzy.pm | 55 ++++++++++++++--------------------------- + 1 file changed, 18 insertions(+), 37 deletions(-) + +diff --git a/Cassandane/Cyrus/SearchFuzzy.pm b/Cassandane/Cyrus/SearchFuzzy.pm +index e88cbba..e928939 100644 +--- a/Cassandane/Cyrus/SearchFuzzy.pm ++++ b/Cassandane/Cyrus/SearchFuzzy.pm +@@ -61,12 +61,6 @@ sub set_up + my ($self) = @_; + $self->SUPER::set_up(); + +- if (not $self->{instance}->{buildinfo}->get('search', 'xapian')) { +- xlog "No xapian support enabled. Skipping tests."; +- return; +- } +- $self->{test_fuzzy_search} = 1; +- + # This will be "vanilla" if using a standard/distro xapian, "cyruslibs" + # if using our fork of xapian, or "none" if the Cyrus being tested isn't + # new enough to know the difference. +@@ -140,6 +134,7 @@ sub create_testmessages + } + + sub test_copy_messages ++ :needs_search_xapian + { + my ($self) = @_; + +@@ -155,10 +150,9 @@ sub test_copy_messages + } + + sub test_stem_verbs +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + $self->create_testmessages(); + + my $talk = $self->{store}->get_client(); +@@ -189,10 +183,9 @@ sub test_stem_verbs + } + + sub test_stem_any +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + $self->create_testmessages(); + + my $talk = $self->{store}->get_client(); +@@ -218,10 +211,9 @@ sub test_stem_any + } + + sub test_snippet_wildcard +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + # Set up Xapian database + xlog "Generate and index test messages"; +@@ -267,10 +259,9 @@ sub test_snippet_wildcard + } + + sub test_mix_fuzzy_and_nonfuzzy +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + $self->create_testmessages(); + my $talk = $self->{store}->get_client(); + +@@ -286,7 +277,7 @@ sub test_mix_fuzzy_and_nonfuzzy + } + + sub test_weird_crasher +- :Conversations :min_version_3_0 ++ :Conversations :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; + return if not $self->{test_fuzzy_search}; +@@ -303,10 +294,9 @@ sub test_weird_crasher + } + + sub test_stopwords +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + # This test assumes that "the" is a stopword and is configured with + # the search_stopword_path in cassandane.ini. If the option is not +@@ -368,10 +358,9 @@ sub test_stopwords + } + + sub test_normalize_snippets +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + # Set up test message with funny characters + my $body = "foo gären советской diĝir naïve léger"; +@@ -417,10 +406,9 @@ sub test_normalize_snippets + } + + sub test_skipdiacrit +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + # Set up test messages + my $body = "Die Trauben gären."; +@@ -469,10 +457,9 @@ sub test_skipdiacrit + } + + sub test_snippets_termcover +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + my $body = + "The 'charset' portion of an 'encoded-word' specifies the character ". +@@ -553,10 +540,9 @@ sub test_snippets_termcover + } + + sub test_cjk_words +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + xlog "Generate and index test messages."; + +@@ -635,10 +621,9 @@ sub test_cjk_words + } + + sub test_subject_isutf8 +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + xlog "Generate and index test messages."; + # that's: "nuff réunion critères duff" +@@ -699,9 +684,9 @@ sub test_subject_isutf8 + } + + sub test_noindex_multipartheaders ++ :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + my $talk = $self->{store}->get_client(); + +@@ -771,9 +756,9 @@ sub test_noindex_multipartheaders + } + + sub test_xattachmentname ++ :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + my $talk = $self->{store}->get_client(); + +@@ -825,10 +810,9 @@ sub test_xattachmentname + + + sub test_xapianv2 +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + my $talk = $self->{store}->get_client(); + +@@ -906,10 +890,9 @@ sub test_xapianv2 + } + + sub test_snippets_escapehtml +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + xlog "Generate and index test messages."; + $self->make_message("Test1 subject with an unescaped & in it", +@@ -953,10 +936,9 @@ sub test_snippets_escapehtml + } + + sub test_search_exactmatch +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + xlog "Generate and index test messages."; + $self->make_message("test1", +@@ -995,10 +977,9 @@ sub test_search_exactmatch + } + + sub test_search_subjectsnippet +- :min_version_3_0 ++ :min_version_3_0 :needs_search_xapian + { + my ($self) = @_; +- return if not $self->{test_fuzzy_search}; + + xlog "Generate and index test messages."; + $self->make_message("[plumbing] Re: log server v0 live", + +From fa60d4d01175922af6659fd6f380a437719dc3aa Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Mon, 28 May 2018 15:40:01 +1000 +Subject: [PATCH 09/11] JMAP*: remove :JMAP magic, just set up config in the + usual way + +--- + Cassandane/Cyrus/JMAPCalendars.pm | 142 +++++++++--------- + Cassandane/Cyrus/JMAPContacts.pm | 58 ++++---- + Cassandane/Cyrus/JMAPCore.pm | 20 ++- + Cassandane/Cyrus/JMAPMail.pm | 300 ++++++++++++++++++++------------------ + Cassandane/Cyrus/TestCase.pm | 13 +- + 5 files changed, 279 insertions(+), 254 deletions(-) + +diff --git a/Cassandane/Cyrus/JMAPCalendars.pm b/Cassandane/Cyrus/JMAPCalendars.pm +index eeb9f0d..80eadeb 100644 +--- a/Cassandane/Cyrus/JMAPCalendars.pm ++++ b/Cassandane/Cyrus/JMAPCalendars.pm +@@ -60,10 +60,18 @@ sub new + { + my ($class, @args) = @_; + my $config = Cassandane::Config->default()->clone(); +- $config->set(caldav_historical_age => -1); ++ $config->set(caldav_realm => 'Cassandane', ++ caldav_historical_age => -1, ++ conversations => 'yes', ++ httpmodules => 'carddav caldav jmap', ++ httpallowcompress => 'no'); ++ + return $class->SUPER::new({ +- config => $config, +- }, @args); ++ config => $config, ++ jmap => 1, ++ adminstore => 1, ++ services => [ 'imap', 'http' ] ++ }, @args); + } + + sub set_up +@@ -73,7 +81,7 @@ sub set_up + } + + sub test_calendar_get +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -117,7 +125,7 @@ sub test_calendar_get + } + + sub test_calendar_get_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -185,7 +193,7 @@ sub test_calendar_get_shared + + + sub test_calendar_get_default +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -200,7 +208,7 @@ sub test_calendar_get_default + } + + sub test_calendar_set +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -261,7 +269,7 @@ sub test_calendar_set + } + + sub test_calendar_set_state +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -362,7 +370,7 @@ sub test_calendar_set_state + } + + sub test_calendar_set_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -471,7 +479,7 @@ sub test_calendar_set_shared + + + sub test_calendar_changes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -575,7 +583,7 @@ sub test_calendar_changes + } + + sub test_calendar_set_error +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -664,7 +672,7 @@ sub test_calendar_set_error + } + + sub test_calendar_set_badname +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -688,7 +696,7 @@ sub test_calendar_set_badname + } + + sub test_calendar_set_destroydefault +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -911,7 +919,7 @@ sub icalfile + } + + sub test_calendarevent_get_simple +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -940,7 +948,7 @@ sub test_calendarevent_get_simple + } + + sub test_calendarevent_get_privacy +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -952,7 +960,7 @@ sub test_calendarevent_get_privacy + } + + sub test_calendarevent_get_properties +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -968,7 +976,7 @@ sub test_calendarevent_get_properties + } + + sub test_calendarevent_get_relatedto +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -985,7 +993,7 @@ sub test_calendarevent_get_relatedto + } + + sub test_calendarevent_get_links +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1009,7 +1017,7 @@ sub test_calendarevent_get_links + + + sub test_calendarevent_get_rscale +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1026,7 +1034,7 @@ sub test_calendarevent_get_rscale + } + + sub test_calendarevent_get_endtimezone +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1045,7 +1053,7 @@ sub test_calendarevent_get_endtimezone + } + + sub test_calendarevent_get_keywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1059,7 +1067,7 @@ sub test_calendarevent_get_keywords + } + + sub test_calendarevent_get_description +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1072,7 +1080,7 @@ sub test_calendarevent_get_description + } + + sub test_calendarevent_get_participants +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1113,7 +1121,7 @@ sub test_calendarevent_get_participants + } + + sub test_calendarevent_get_recurrence +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1146,7 +1154,7 @@ sub test_calendarevent_get_recurrence + } + + sub test_calendarevent_get_rdate_period +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1162,7 +1170,7 @@ sub test_calendarevent_get_rdate_period + + + sub test_calendarevent_get_recurrenceoverrides +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1192,7 +1200,7 @@ sub test_calendarevent_get_recurrenceoverrides + } + + sub test_calendarevent_get_alerts +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1253,7 +1261,7 @@ sub test_calendarevent_get_alerts + } + + sub test_calendarevent_get_locations +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1266,7 +1274,7 @@ sub test_calendarevent_get_locations + } + + sub test_calendarevent_get_locations_uri +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1280,7 +1288,7 @@ sub test_calendarevent_get_locations_uri + } + + sub test_calendarevent_get_locations_geo +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1293,7 +1301,7 @@ sub test_calendarevent_get_locations_geo + } + + sub test_calendarevent_get_locations_apple +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1307,7 +1315,7 @@ sub test_calendarevent_get_locations_apple + } + + sub test_calendarevent_get_locations_conference +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1334,7 +1342,7 @@ sub test_calendarevent_get_locations_conference + } + + sub test_calendarevent_get_infinite_delegates +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1427,7 +1435,7 @@ sub createcalendar + } + + sub test_calendarevent_set_type +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1473,7 +1481,7 @@ sub test_calendarevent_set_type + + + sub test_calendarevent_set_simple +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1506,7 +1514,7 @@ sub test_calendarevent_set_simple + } + + sub test_calendarevent_set_bymonth +-:JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1547,7 +1555,7 @@ sub test_calendarevent_set_bymonth + } + + sub test_calendarevent_set_relatedto +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1582,7 +1590,7 @@ sub test_calendarevent_set_relatedto + } + + sub test_calendarevent_set_prodid +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1613,7 +1621,7 @@ sub test_calendarevent_set_prodid + } + + sub test_calendarevent_set_endtimezone +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1654,7 +1662,7 @@ sub test_calendarevent_set_endtimezone + } + + sub test_calendarevent_set_keywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1678,7 +1686,7 @@ sub test_calendarevent_set_keywords + } + + sub test_calendarevent_set_endtimezone_recurrence +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1720,7 +1728,7 @@ sub test_calendarevent_set_endtimezone_recurrence + } + + sub test_calendarevent_set_description +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1750,7 +1758,7 @@ sub test_calendarevent_set_description + } + + sub test_calendarevent_set_links +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1798,7 +1806,7 @@ sub test_calendarevent_set_links + } + + sub test_calendarevent_set_locations +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1881,7 +1889,7 @@ sub test_calendarevent_set_locations + } + + sub test_calendarevent_set_locations_single +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1925,7 +1933,7 @@ sub test_calendarevent_set_locations_single + } + + sub test_calendarevent_set_recurrence +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1964,7 +1972,7 @@ sub test_calendarevent_set_recurrence + } + + sub test_calendarevent_set_recurrenceoverrides +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2041,7 +2049,7 @@ sub test_calendarevent_set_recurrenceoverrides + } + + sub test_calendarevent_set_participants +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2145,7 +2153,7 @@ sub test_calendarevent_set_participants + } + + sub test_calendarevent_set_alerts +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2211,7 +2219,7 @@ sub test_calendarevent_set_alerts + } + + sub test_calendarevent_set_participantid +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2256,7 +2264,7 @@ sub test_calendarevent_set_participantid + + + sub test_calendarevent_set_isallday +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2305,7 +2313,7 @@ sub test_calendarevent_set_isallday + } + + sub test_calendarevent_set_move +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2379,7 +2387,7 @@ sub test_calendarevent_set_move + } + + sub test_calendarevent_set_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2540,7 +2548,7 @@ sub test_calendarevent_set_shared + + + sub test_calendarevent_changes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2711,7 +2719,7 @@ sub test_calendarevent_changes + } + + sub test_calendarevent_query +-:JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2841,7 +2849,7 @@ sub test_calendarevent_query + } + + sub test_calendarevent_query_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3002,7 +3010,7 @@ sub test_calendarevent_query_shared + } + + sub test_calendarevent_query_datetime +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3110,7 +3118,7 @@ sub test_calendarevent_query_datetime + } + + sub test_calendarevent_query_date +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3239,7 +3247,7 @@ sub test_calendarevent_query_date + } + + sub test_calendarevent_query_text +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3350,7 +3358,7 @@ sub test_calendarevent_query_text + } + + sub test_calendarevent_query_unixepoch +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3393,7 +3401,7 @@ sub test_calendarevent_query_unixepoch + + + sub test_calendarevent_set_caldav +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3521,7 +3529,7 @@ EOF + } + + sub test_calendarevent_set_schedule_request +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3573,7 +3581,7 @@ sub test_calendarevent_set_schedule_request + } + + sub test_calendarevent_set_schedule_reply +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3634,7 +3642,7 @@ sub test_calendarevent_set_schedule_reply + } + + sub test_calendarevent_set_schedule_cancel +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3698,7 +3706,7 @@ sub test_calendarevent_set_schedule_cancel + } + + sub test_misc_creationids +-:JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3733,7 +3741,7 @@ sub test_misc_creationids + } + + sub test_misc_timezone_expansion +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -3773,7 +3781,7 @@ sub test_misc_timezone_expansion + } + + sub test_calendarevent_set_uid +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +diff --git a/Cassandane/Cyrus/JMAPContacts.pm b/Cassandane/Cyrus/JMAPContacts.pm +index 79e0e8e..6b844e2 100644 +--- a/Cassandane/Cyrus/JMAPContacts.pm ++++ b/Cassandane/Cyrus/JMAPContacts.pm +@@ -57,14 +57,18 @@ use charnames ':full'; + sub new + { + my ($class, @args) = @_; ++ + my $config = Cassandane::Config->default()->clone(); +- $config->set(caldav_realm => 'Cassandane'); +- $config->set(httpmodules => 'carddav jmap'); +- $config->set(httpallowcompress => 'no'); ++ $config->set(caldav_realm => 'Cassandane', ++ conversations => 'yes', ++ httpmodules => 'carddav caldav jmap', ++ httpallowcompress => 'no'); ++ + return $class->SUPER::new({ +- adminstore => 1, +- config => $config, +- services => ['imap', 'http'], ++ config => $config, ++ jmap => 1, ++ adminstore => 1, ++ services => [ 'imap', 'http' ] + }, @args); + } + +@@ -75,7 +79,7 @@ sub set_up + } + + sub test_contact_set_multicontact +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -123,7 +127,7 @@ sub test_contact_set_multicontact + } + + sub test_contact_changes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -246,7 +250,7 @@ sub test_contact_changes + } + + sub test_contact_changes_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -407,7 +411,7 @@ sub test_contact_changes_shared + } + + sub test_contact_set_nickname +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -434,7 +438,7 @@ sub test_contact_set_nickname + } + + sub test_contactgroup_set +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + + my ($self) = @_; +@@ -500,7 +504,7 @@ sub test_contactgroup_set + } + + sub test_contact_query +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -673,7 +677,7 @@ sub test_contact_query + + + sub test_contact_query_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -881,7 +885,7 @@ sub test_contact_query_shared + } + + sub test_contactgroup_changes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1014,7 +1018,7 @@ sub test_contactgroup_changes + } + + sub test_contactgroup_changes_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1184,7 +1188,7 @@ sub test_contactgroup_changes_shared + } + + sub test_contact_set +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1498,7 +1502,7 @@ sub test_contact_set + } + + sub test_contact_set_emaillabel +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1549,7 +1553,7 @@ sub test_contact_set_emaillabel + + + sub test_contact_set_state +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1616,7 +1620,7 @@ sub test_contact_set_state + } + + sub test_contact_set_importance_later +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1651,7 +1655,7 @@ sub test_contact_set_importance_later + } + + sub test_contact_set_importance_upfront +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1686,7 +1690,7 @@ sub test_contact_set_importance_upfront + } + + sub test_contact_set_importance_multiedit +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1721,7 +1725,7 @@ sub test_contact_set_importance_multiedit + } + + sub test_contact_set_importance_zero_multi +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1756,7 +1760,7 @@ sub test_contact_set_importance_zero_multi + } + + sub test_contact_set_importance_zero_byself +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1791,7 +1795,7 @@ sub test_contact_set_importance_zero_byself + } + + sub test_misc_creationids +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1814,7 +1818,7 @@ sub test_misc_creationids + } + + sub test_misc_categories +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1873,7 +1877,7 @@ EOF + } + + sub test_contact_get_issue2292 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1899,7 +1903,7 @@ sub test_contact_get_issue2292 + } + + sub test_contactgroup_get_issue2292 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +diff --git a/Cassandane/Cyrus/JMAPCore.pm b/Cassandane/Cyrus/JMAPCore.pm +index c974ddc..83a8122 100644 +--- a/Cassandane/Cyrus/JMAPCore.pm ++++ b/Cassandane/Cyrus/JMAPCore.pm +@@ -59,11 +59,23 @@ use charnames ':full'; + sub new + { + my ($class, @args) = @_; +- return $class->SUPER::new({}, @args); ++ ++ my $config = Cassandane::Config->default()->clone(); ++ $config->set(caldav_realm => 'Cassandane', ++ conversations => 'yes', ++ httpmodules => 'carddav caldav jmap', ++ httpallowcompress => 'no'); ++ ++ return $class->SUPER::new({ ++ config => $config, ++ jmap => 1, ++ adminstore => 1, ++ services => [ 'imap', 'http' ] ++ }, @args); + } + + sub test_settings +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -179,7 +191,7 @@ sub test_settings + } + + sub test_blob_download +-:JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -217,7 +229,7 @@ sub test_blob_download + } + + sub test_creationids +-:JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +diff --git a/Cassandane/Cyrus/JMAPMail.pm b/Cassandane/Cyrus/JMAPMail.pm +index ca3b14b..660a0b5 100644 +--- a/Cassandane/Cyrus/JMAPMail.pm ++++ b/Cassandane/Cyrus/JMAPMail.pm +@@ -59,7 +59,19 @@ use charnames ':full'; + sub new + { + my ($class, @args) = @_; +- return $class->SUPER::new({}, @args); ++ ++ my $config = Cassandane::Config->default()->clone(); ++ $config->set(caldav_realm => 'Cassandane', ++ conversations => 'yes', ++ httpmodules => 'carddav caldav jmap', ++ httpallowcompress => 'no'); ++ ++ return $class->SUPER::new({ ++ config => $config, ++ jmap => 1, ++ adminstore => 1, ++ services => [ 'imap', 'http' ] ++ }, @args); + } + + sub set_up +@@ -90,7 +102,7 @@ sub getinbox + } + + sub test_mailbox_get +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -168,7 +180,7 @@ sub test_mailbox_get + } + + sub test_mailbox_get_specialuse +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -216,7 +228,7 @@ sub test_mailbox_get_specialuse + } + + sub test_mailbox_get_properties +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -244,7 +256,7 @@ sub test_mailbox_get_properties + } + + sub test_mailbox_get_ids +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -282,7 +294,7 @@ sub test_mailbox_get_ids + } + + sub test_mailbox_get_nocalendars +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -317,7 +329,7 @@ sub test_mailbox_get_nocalendars + } + + sub test_mailbox_get_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -378,7 +390,7 @@ sub test_mailbox_get_shared + } + + sub test_mailbox_query +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -519,7 +531,7 @@ sub test_mailbox_query + } + + sub test_mailbox_query_parentname +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -562,7 +574,7 @@ sub test_mailbox_query_parentname + } + + sub test_mailbox_query_limit_zero +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -577,7 +589,7 @@ sub test_mailbox_query_limit_zero + } + + sub test_mailbox_query_parentid_null +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -610,7 +622,7 @@ sub test_mailbox_query_parentid_null + } + + sub test_mailbox_query_filteroperator +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + return; +@@ -685,7 +697,7 @@ sub test_mailbox_query_filteroperator + } + + sub test_mailbox_query_issue2286 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -699,7 +711,7 @@ sub test_mailbox_query_issue2286 + } + + sub test_mailbox_querychanges +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -723,7 +735,7 @@ sub test_mailbox_querychanges + } + + sub test_mailbox_set +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -805,7 +817,7 @@ sub test_mailbox_set + } + + sub test_mailbox_get_shared_parents +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -843,7 +855,7 @@ sub test_mailbox_get_shared_parents + } + + sub test_mailbox_set_name_missing +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -865,7 +877,7 @@ sub test_mailbox_set_name_missing + + + sub test_mailbox_set_name_collision +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -968,7 +980,7 @@ sub test_mailbox_set_name_collision + } + + sub test_mailbox_set_name_interop +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1024,7 +1036,7 @@ sub test_mailbox_set_name_interop + } + + sub test_mailbox_set_name_unicode_nfc +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1056,7 +1068,7 @@ sub test_mailbox_set_name_unicode_nfc + + + sub test_mailbox_set_role +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1191,7 +1203,7 @@ sub test_mailbox_set_role + } + + sub test_mailbox_set_no_outbox_role +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1209,7 +1221,7 @@ sub test_mailbox_set_no_outbox_role + + + sub test_mailbox_set_parent +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1303,7 +1315,7 @@ sub test_mailbox_set_parent + } + + sub test_mailbox_set_parent_acl +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1336,7 +1348,7 @@ sub test_mailbox_set_parent_acl + } + + sub test_mailbox_set_destroy_empty +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1405,7 +1417,7 @@ sub test_mailbox_set_destroy_empty + } + + sub test_mailbox_set_destroy_removemsgs +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1462,7 +1474,7 @@ sub test_mailbox_set_destroy_removemsgs + } + + sub test_mailbox_set_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1529,7 +1541,7 @@ sub test_mailbox_set_shared + } + + sub test_mailbox_changes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1676,7 +1688,7 @@ sub test_mailbox_changes + } + + sub test_mailbox_changes_counts +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1791,7 +1803,7 @@ sub test_mailbox_changes_counts + + + sub test_mailbox_changes_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -1868,7 +1880,7 @@ sub defaultprops_for_email_get + } + + sub test_email_get +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1970,7 +1982,7 @@ sub test_email_get + } + + sub test_email_get_mimeencode +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2038,7 +2050,7 @@ sub test_email_get_mimeencode + } + + sub test_email_get_multimailboxes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2079,7 +2091,7 @@ sub test_email_get_multimailboxes + } + + sub test_email_get_body_both +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2129,7 +2141,7 @@ sub test_email_get_body_both + } + + sub test_email_get_body_plain +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2163,7 +2175,7 @@ sub test_email_get_body_plain + } + + sub test_email_get_body_html +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2197,7 +2209,7 @@ sub test_email_get_body_html + } + + sub test_email_get_attachment_name +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2302,7 +2314,7 @@ sub test_email_get_attachment_name + } + + sub test_email_get_body_notext +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2331,7 +2343,7 @@ sub test_email_get_body_notext + + + sub test_email_get_preview +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2362,7 +2374,7 @@ sub test_email_get_preview + } + + sub test_email_get_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2403,7 +2415,7 @@ sub test_email_get_shared + } + + sub test_email_set_draft +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2477,7 +2489,7 @@ sub test_email_set_draft + } + + sub test_email_set_issue2293 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2554,7 +2566,7 @@ sub test_email_set_issue2293 + } + + sub test_email_set_inreplyto +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2617,7 +2629,7 @@ sub test_email_set_inreplyto + } + + sub test_email_set_attachedemails +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2685,7 +2697,7 @@ sub test_email_set_attachedemails + } + + sub test_email_set_bodystructure +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2798,7 +2810,7 @@ sub test_email_set_bodystructure + } + + sub test_email_set_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -2859,7 +2871,7 @@ sub test_email_set_shared + } + + sub test_email_set_userkeywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2931,7 +2943,7 @@ sub test_email_set_userkeywords + } + + sub test_misc_upload_zero +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2980,7 +2992,7 @@ sub test_misc_upload_zero + } + + sub test_misc_upload +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3033,7 +3045,7 @@ sub test_misc_upload + } + + sub test_misc_upload_multiaccount +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3056,7 +3068,7 @@ sub test_misc_upload_multiaccount + } + + sub test_misc_upload_bin +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3105,7 +3117,7 @@ sub test_misc_upload_bin + } + + sub test_misc_download +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3170,7 +3182,7 @@ sub download + } + + sub test_blob_copy +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3232,7 +3244,7 @@ sub test_blob_copy + } + + sub test_email_set_attachments +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3387,7 +3399,7 @@ sub test_email_set_attachments + } + + sub test_email_set_flagged +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3425,7 +3437,7 @@ sub test_email_set_flagged + } + + sub test_email_set_mailboxids +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3479,7 +3491,7 @@ sub test_email_set_mailboxids + } + + sub test_email_get_keywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3556,7 +3568,7 @@ sub test_email_get_keywords + } + + sub test_email_get_keywords_case_insensitive +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3589,7 +3601,7 @@ sub test_email_get_keywords_case_insensitive + } + + sub test_email_set_keywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3721,7 +3733,7 @@ sub test_email_set_keywords + } + + sub test_emailsubmission_set +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3773,7 +3785,7 @@ sub test_emailsubmission_set + } + + sub test_emailsubmission_set_with_envelope +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3813,7 +3825,7 @@ sub test_emailsubmission_set_with_envelope + } + + sub test_emailsubmission_set_issue2285 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3876,7 +3888,7 @@ sub test_emailsubmission_set_issue2285 + } + + sub test_emailsubmission_changes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3925,7 +3937,7 @@ sub test_emailsubmission_changes + } + + sub test_emailsubmission_query +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3946,7 +3958,7 @@ sub test_emailsubmission_query + } + + sub test_emailsubmission_querychanges +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3967,7 +3979,7 @@ sub test_emailsubmission_querychanges + } + + sub test_email_set_move +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4027,7 +4039,7 @@ sub test_email_set_move + } + + sub test_email_set_move_keywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4085,7 +4097,7 @@ sub test_email_set_move_keywords + } + + sub test_email_set_update +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4140,7 +4152,7 @@ sub test_email_set_update + } + + sub test_email_set_seen +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4179,7 +4191,7 @@ sub test_email_set_seen + } + + sub test_email_set_destroy +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4255,7 +4267,7 @@ sub test_email_set_destroy + } + + sub test_email_query +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4582,7 +4594,7 @@ sub test_email_query + } + + sub test_email_query_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4935,7 +4947,7 @@ sub test_email_query_shared + } + + sub test_email_query_keywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5033,7 +5045,7 @@ sub test_email_query_keywords + } + + sub test_email_query_userkeywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5102,7 +5114,7 @@ sub test_email_query_userkeywords + } + + sub test_email_query_threadkeywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -5283,7 +5295,7 @@ sub test_email_query_threadkeywords + } + + sub test_email_query_empty +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5303,7 +5315,7 @@ sub test_email_query_empty + } + + sub test_email_query_collapse +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -5355,7 +5367,7 @@ sub test_email_query_collapse + } + + sub test_email_query_inmailbox_null +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5373,7 +5385,7 @@ sub test_email_query_inmailbox_null + } + + sub test_misc_collapsethreads_issue2024 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -5414,7 +5426,7 @@ sub test_misc_collapsethreads_issue2024 + } + + sub test_email_query_window +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -5504,7 +5516,7 @@ sub test_email_query_window + } + + sub test_email_query_long +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -5548,7 +5560,7 @@ sub test_email_query_long + } + + sub test_email_query_acl +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5607,7 +5619,7 @@ sub test_email_query_acl + } + + sub test_email_query_unknown_mailbox +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -5631,7 +5643,7 @@ sub test_email_query_unknown_mailbox + + + sub test_searchsnippet_get +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5740,7 +5752,7 @@ sub test_searchsnippet_get + } + + sub test_searchsnippet_get_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5803,7 +5815,7 @@ sub test_searchsnippet_get_shared + } + + sub test_email_query_snippets +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -5888,7 +5900,7 @@ sub test_email_query_snippets + } + + sub test_email_query_attachments +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5991,7 +6003,7 @@ sub test_email_query_attachments + } + + sub test_email_query_attachmentname +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6050,7 +6062,7 @@ sub test_email_query_attachmentname + } + + sub test_email_query_attachmenttype +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6150,7 +6162,7 @@ sub test_email_query_attachmenttype + } + + sub test_thread_get +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -6257,7 +6269,7 @@ sub test_thread_get + } + + sub test_identity_get +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6281,7 +6293,7 @@ sub test_identity_get + } + + sub test_misc_emptyids +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -6308,7 +6320,7 @@ sub test_misc_emptyids + } + + sub test_email_querychanges_basic +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6359,7 +6371,7 @@ sub test_email_querychanges_basic + } + + sub test_email_querychanges_basic_collapse +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6412,7 +6424,7 @@ sub test_email_querychanges_basic_collapse + } + + sub test_email_querychanges_basic_mb +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6465,7 +6477,7 @@ sub test_email_querychanges_basic_mb + } + + sub test_email_querychanges_basic_mb_collapse +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6586,7 +6598,7 @@ sub test_email_querychanges_basic_mb_collapse + } + + sub test_email_querychanges_skipdeleted +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6648,7 +6660,7 @@ sub test_email_querychanges_skipdeleted + } + + sub test_email_querychanges_deletedcopy +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6711,7 +6723,7 @@ sub test_email_querychanges_deletedcopy + } + + sub test_email_changes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6872,7 +6884,7 @@ sub test_email_changes + } + + sub test_email_querychanges +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6910,7 +6922,7 @@ sub test_email_querychanges + } + + sub test_email_querychanges_zerosince +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6948,7 +6960,7 @@ sub test_email_querychanges_zerosince + + + sub test_email_querychanges_thread +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7026,7 +7038,7 @@ sub test_email_querychanges_thread + } + + sub test_email_querychanges_order +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7085,7 +7097,7 @@ sub test_email_querychanges_order + } + + sub test_email_querychanges_implementation +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7232,7 +7244,7 @@ sub test_email_querychanges_implementation + } + + sub test_email_changes_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7321,7 +7333,7 @@ sub test_email_changes_shared + } + + sub test_misc_upload_download822 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7347,7 +7359,7 @@ EOF + } + + sub test_misc_upload_sametype +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7364,7 +7376,7 @@ sub test_misc_upload_sametype + } + + sub test_misc_brokenrfc822_badendline +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7412,7 +7424,7 @@ EOF + } + + sub test_email_import_zerobyte +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7460,7 +7472,7 @@ EOF + + + sub test_email_import_setdate +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7520,7 +7532,7 @@ EOF + } + + sub test_thread_get_onemsg +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -7589,7 +7601,7 @@ EOF + } + + sub test_thread_changes +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my %exp; +@@ -7809,7 +7821,7 @@ sub test_thread_changes + } + + sub test_email_import +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7907,7 +7919,7 @@ sub test_email_import + } + + sub test_email_import_error +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7943,7 +7955,7 @@ sub test_email_import_error + + + sub test_email_import_shared +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7989,7 +8001,7 @@ EOF + } + + sub test_misc_refobjects_simple +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8024,7 +8036,7 @@ sub test_misc_refobjects_simple + } + + sub test_email_import_no_keywords +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8061,7 +8073,7 @@ EOF + } + + sub test_misc_refobjects_extended +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8102,7 +8114,7 @@ sub test_misc_refobjects_extended + } + + sub test_email_set_patch +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8180,7 +8192,7 @@ sub test_email_set_patch + } + + sub test_capability +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +@@ -8210,7 +8222,7 @@ sub test_capability + } + + sub test_misc_set_oldstate +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8264,7 +8276,7 @@ sub test_misc_set_oldstate + } + + sub test_email_set_text_crlf +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8296,7 +8308,7 @@ sub test_email_set_text_crlf + } + + sub test_email_set_text_split +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8326,7 +8338,7 @@ sub test_email_set_text_split + } + + sub test_email_get_attachedemails +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8383,7 +8395,7 @@ sub test_email_get_attachedemails + } + + sub test_email_get_maxbodyvaluebytes_utf8 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8432,7 +8444,7 @@ sub test_email_get_maxbodyvaluebytes_utf8 + } + + sub test_email_get_header_all +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8464,7 +8476,7 @@ sub test_email_get_header_all + } + + sub test_email_set_nullheader +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8499,7 +8511,7 @@ sub test_email_set_nullheader + } + + sub test_email_set_headers +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8641,7 +8653,7 @@ sub test_email_set_headers + } + + sub test_email_download +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8687,7 +8699,7 @@ sub test_email_download + } + + sub test_email_embedded_download +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8738,7 +8750,7 @@ sub test_email_embedded_download + } + + sub test_blob_download +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8757,7 +8769,7 @@ sub test_blob_download + } + + sub test_email_set_filename +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8833,7 +8845,7 @@ sub test_email_set_filename + } + + sub test_email_get_size +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8856,7 +8868,7 @@ sub test_email_get_size + } + + sub test_email_get_references +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8885,7 +8897,7 @@ sub test_email_get_references + } + + sub test_email_get_groupaddr +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8924,7 +8936,7 @@ sub test_email_get_groupaddr + } + + sub test_email_parse +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8998,7 +9010,7 @@ sub test_email_parse + } + + sub test_email_parse_digest +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9040,7 +9052,7 @@ sub test_email_parse_digest + } + + sub test_email_parse_blob822 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9068,7 +9080,7 @@ EOF + } + + sub test_email_parse_notparsable +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9088,7 +9100,7 @@ EOF + } + + sub test_email_get_bodystructure +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9311,7 +9323,7 @@ sub test_email_get_bodystructure + } + + sub test_email_get_calendarevents +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9388,7 +9400,7 @@ sub test_email_get_calendarevents + } + + sub test_email_set_blobencoding +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9461,7 +9473,7 @@ EOF + } + + sub test_email_body_alternative_without_html +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9509,7 +9521,7 @@ sub test_email_body_alternative_without_html + } + + sub test_mailbox_set_issue2377 +- :JMAP :min_version_3_1 ++ :min_version_3_1 + { + my ($self) = @_; + +diff --git a/Cassandane/Cyrus/TestCase.pm b/Cassandane/Cyrus/TestCase.pm +index b519c6d..ffff77f 100644 +--- a/Cassandane/Cyrus/TestCase.pm ++++ b/Cassandane/Cyrus/TestCase.pm +@@ -97,6 +97,7 @@ sub new + adminstore => 0, + gen => 1, + deliver => 0, ++ jmap => 0, + }; + map { + $want->{$_} = delete $params->{$_} +@@ -232,18 +233,6 @@ magic(MagicPlus => sub { + magic(FastMailSharing => sub { + shift->config_set('fastmailsharing' => 'true'); + }); +-magic(JMAP => sub { +- my $self = shift; +- $self->want('jmap'); +- $self->want('adminstore'); +- $self->want('services' => [ 'imap', 'http' ]); +- $self->config_set(caldav_realm => 'Cassandane'); +- $self->config_set(conversations => 'yes'); +- $self->config_set(httpmodules => 'carddav caldav jmap'); +- $self->config_set(httpallowcompress => 'no'); +-}); +- +- + + # Run any magic handlers indicated by the test name or attributes + sub _run_magic + +From 5762c87d718f928671390e5755b02a4685bf94c9 Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Mon, 28 May 2018 16:04:44 +1000 +Subject: [PATCH 10/11] JMAP*: tag tests as :needs_component_jmap + +--- + Cassandane/Cyrus/JMAPCalendars.pm | 128 ++++++++--------- + Cassandane/Cyrus/JMAPContacts.pm | 42 +++--- + Cassandane/Cyrus/JMAPCore.pm | 6 +- + Cassandane/Cyrus/JMAPMail.pm | 286 +++++++++++++++++++------------------- + 4 files changed, 231 insertions(+), 231 deletions(-) + +diff --git a/Cassandane/Cyrus/JMAPCalendars.pm b/Cassandane/Cyrus/JMAPCalendars.pm +index 80eadeb..144b3c5 100644 +--- a/Cassandane/Cyrus/JMAPCalendars.pm ++++ b/Cassandane/Cyrus/JMAPCalendars.pm +@@ -81,7 +81,7 @@ sub set_up + } + + sub test_calendar_get +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -125,7 +125,7 @@ sub test_calendar_get + } + + sub test_calendar_get_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -193,7 +193,7 @@ sub test_calendar_get_shared + + + sub test_calendar_get_default +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -208,7 +208,7 @@ sub test_calendar_get_default + } + + sub test_calendar_set +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -269,7 +269,7 @@ sub test_calendar_set + } + + sub test_calendar_set_state +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -370,7 +370,7 @@ sub test_calendar_set_state + } + + sub test_calendar_set_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -479,7 +479,7 @@ sub test_calendar_set_shared + + + sub test_calendar_changes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -583,7 +583,7 @@ sub test_calendar_changes + } + + sub test_calendar_set_error +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -672,7 +672,7 @@ sub test_calendar_set_error + } + + sub test_calendar_set_badname +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -696,7 +696,7 @@ sub test_calendar_set_badname + } + + sub test_calendar_set_destroydefault +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -919,7 +919,7 @@ sub icalfile + } + + sub test_calendarevent_get_simple +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -948,7 +948,7 @@ sub test_calendarevent_get_simple + } + + sub test_calendarevent_get_privacy +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -960,7 +960,7 @@ sub test_calendarevent_get_privacy + } + + sub test_calendarevent_get_properties +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -976,7 +976,7 @@ sub test_calendarevent_get_properties + } + + sub test_calendarevent_get_relatedto +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -993,7 +993,7 @@ sub test_calendarevent_get_relatedto + } + + sub test_calendarevent_get_links +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1017,7 +1017,7 @@ sub test_calendarevent_get_links + + + sub test_calendarevent_get_rscale +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1034,7 +1034,7 @@ sub test_calendarevent_get_rscale + } + + sub test_calendarevent_get_endtimezone +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1053,7 +1053,7 @@ sub test_calendarevent_get_endtimezone + } + + sub test_calendarevent_get_keywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1067,7 +1067,7 @@ sub test_calendarevent_get_keywords + } + + sub test_calendarevent_get_description +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1080,7 +1080,7 @@ sub test_calendarevent_get_description + } + + sub test_calendarevent_get_participants +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1121,7 +1121,7 @@ sub test_calendarevent_get_participants + } + + sub test_calendarevent_get_recurrence +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1154,7 +1154,7 @@ sub test_calendarevent_get_recurrence + } + + sub test_calendarevent_get_rdate_period +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1170,7 +1170,7 @@ sub test_calendarevent_get_rdate_period + + + sub test_calendarevent_get_recurrenceoverrides +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1200,7 +1200,7 @@ sub test_calendarevent_get_recurrenceoverrides + } + + sub test_calendarevent_get_alerts +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1261,7 +1261,7 @@ sub test_calendarevent_get_alerts + } + + sub test_calendarevent_get_locations +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1274,7 +1274,7 @@ sub test_calendarevent_get_locations + } + + sub test_calendarevent_get_locations_uri +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1288,7 +1288,7 @@ sub test_calendarevent_get_locations_uri + } + + sub test_calendarevent_get_locations_geo +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1301,7 +1301,7 @@ sub test_calendarevent_get_locations_geo + } + + sub test_calendarevent_get_locations_apple +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1315,7 +1315,7 @@ sub test_calendarevent_get_locations_apple + } + + sub test_calendarevent_get_locations_conference +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1342,7 +1342,7 @@ sub test_calendarevent_get_locations_conference + } + + sub test_calendarevent_get_infinite_delegates +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1435,7 +1435,7 @@ sub createcalendar + } + + sub test_calendarevent_set_type +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1481,7 +1481,7 @@ sub test_calendarevent_set_type + + + sub test_calendarevent_set_simple +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1514,7 +1514,7 @@ sub test_calendarevent_set_simple + } + + sub test_calendarevent_set_bymonth +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1555,7 +1555,7 @@ sub test_calendarevent_set_bymonth + } + + sub test_calendarevent_set_relatedto +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1590,7 +1590,7 @@ sub test_calendarevent_set_relatedto + } + + sub test_calendarevent_set_prodid +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1621,7 +1621,7 @@ sub test_calendarevent_set_prodid + } + + sub test_calendarevent_set_endtimezone +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1662,7 +1662,7 @@ sub test_calendarevent_set_endtimezone + } + + sub test_calendarevent_set_keywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1686,7 +1686,7 @@ sub test_calendarevent_set_keywords + } + + sub test_calendarevent_set_endtimezone_recurrence +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1728,7 +1728,7 @@ sub test_calendarevent_set_endtimezone_recurrence + } + + sub test_calendarevent_set_description +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1758,7 +1758,7 @@ sub test_calendarevent_set_description + } + + sub test_calendarevent_set_links +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1806,7 +1806,7 @@ sub test_calendarevent_set_links + } + + sub test_calendarevent_set_locations +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1889,7 +1889,7 @@ sub test_calendarevent_set_locations + } + + sub test_calendarevent_set_locations_single +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1933,7 +1933,7 @@ sub test_calendarevent_set_locations_single + } + + sub test_calendarevent_set_recurrence +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1972,7 +1972,7 @@ sub test_calendarevent_set_recurrence + } + + sub test_calendarevent_set_recurrenceoverrides +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2049,7 +2049,7 @@ sub test_calendarevent_set_recurrenceoverrides + } + + sub test_calendarevent_set_participants +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2153,7 +2153,7 @@ sub test_calendarevent_set_participants + } + + sub test_calendarevent_set_alerts +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2219,7 +2219,7 @@ sub test_calendarevent_set_alerts + } + + sub test_calendarevent_set_participantid +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2264,7 +2264,7 @@ sub test_calendarevent_set_participantid + + + sub test_calendarevent_set_isallday +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2313,7 +2313,7 @@ sub test_calendarevent_set_isallday + } + + sub test_calendarevent_set_move +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2387,7 +2387,7 @@ sub test_calendarevent_set_move + } + + sub test_calendarevent_set_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2548,7 +2548,7 @@ sub test_calendarevent_set_shared + + + sub test_calendarevent_changes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2719,7 +2719,7 @@ sub test_calendarevent_changes + } + + sub test_calendarevent_query +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2849,7 +2849,7 @@ sub test_calendarevent_query + } + + sub test_calendarevent_query_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3010,7 +3010,7 @@ sub test_calendarevent_query_shared + } + + sub test_calendarevent_query_datetime +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3118,7 +3118,7 @@ sub test_calendarevent_query_datetime + } + + sub test_calendarevent_query_date +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3247,7 +3247,7 @@ sub test_calendarevent_query_date + } + + sub test_calendarevent_query_text +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3358,7 +3358,7 @@ sub test_calendarevent_query_text + } + + sub test_calendarevent_query_unixepoch +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3401,7 +3401,7 @@ sub test_calendarevent_query_unixepoch + + + sub test_calendarevent_set_caldav +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3529,7 +3529,7 @@ EOF + } + + sub test_calendarevent_set_schedule_request +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3581,7 +3581,7 @@ sub test_calendarevent_set_schedule_request + } + + sub test_calendarevent_set_schedule_reply +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3642,7 +3642,7 @@ sub test_calendarevent_set_schedule_reply + } + + sub test_calendarevent_set_schedule_cancel +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3706,7 +3706,7 @@ sub test_calendarevent_set_schedule_cancel + } + + sub test_misc_creationids +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3741,7 +3741,7 @@ sub test_misc_creationids + } + + sub test_misc_timezone_expansion +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -3781,7 +3781,7 @@ sub test_misc_timezone_expansion + } + + sub test_calendarevent_set_uid +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +diff --git a/Cassandane/Cyrus/JMAPContacts.pm b/Cassandane/Cyrus/JMAPContacts.pm +index 6b844e2..53dd7fc 100644 +--- a/Cassandane/Cyrus/JMAPContacts.pm ++++ b/Cassandane/Cyrus/JMAPContacts.pm +@@ -79,7 +79,7 @@ sub set_up + } + + sub test_contact_set_multicontact +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -127,7 +127,7 @@ sub test_contact_set_multicontact + } + + sub test_contact_changes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -250,7 +250,7 @@ sub test_contact_changes + } + + sub test_contact_changes_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -411,7 +411,7 @@ sub test_contact_changes_shared + } + + sub test_contact_set_nickname +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -438,7 +438,7 @@ sub test_contact_set_nickname + } + + sub test_contactgroup_set +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + + my ($self) = @_; +@@ -504,7 +504,7 @@ sub test_contactgroup_set + } + + sub test_contact_query +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -677,7 +677,7 @@ sub test_contact_query + + + sub test_contact_query_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -885,7 +885,7 @@ sub test_contact_query_shared + } + + sub test_contactgroup_changes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1018,7 +1018,7 @@ sub test_contactgroup_changes + } + + sub test_contactgroup_changes_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1188,7 +1188,7 @@ sub test_contactgroup_changes_shared + } + + sub test_contact_set +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1502,7 +1502,7 @@ sub test_contact_set + } + + sub test_contact_set_emaillabel +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1553,7 +1553,7 @@ sub test_contact_set_emaillabel + + + sub test_contact_set_state +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1620,7 +1620,7 @@ sub test_contact_set_state + } + + sub test_contact_set_importance_later +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1655,7 +1655,7 @@ sub test_contact_set_importance_later + } + + sub test_contact_set_importance_upfront +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1690,7 +1690,7 @@ sub test_contact_set_importance_upfront + } + + sub test_contact_set_importance_multiedit +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1725,7 +1725,7 @@ sub test_contact_set_importance_multiedit + } + + sub test_contact_set_importance_zero_multi +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1760,7 +1760,7 @@ sub test_contact_set_importance_zero_multi + } + + sub test_contact_set_importance_zero_byself +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1795,7 +1795,7 @@ sub test_contact_set_importance_zero_byself + } + + sub test_misc_creationids +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1818,7 +1818,7 @@ sub test_misc_creationids + } + + sub test_misc_categories +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1877,7 +1877,7 @@ EOF + } + + sub test_contact_get_issue2292 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1903,7 +1903,7 @@ sub test_contact_get_issue2292 + } + + sub test_contactgroup_get_issue2292 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +diff --git a/Cassandane/Cyrus/JMAPCore.pm b/Cassandane/Cyrus/JMAPCore.pm +index 83a8122..1b6f9cb 100644 +--- a/Cassandane/Cyrus/JMAPCore.pm ++++ b/Cassandane/Cyrus/JMAPCore.pm +@@ -75,7 +75,7 @@ sub new + } + + sub test_settings +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -191,7 +191,7 @@ sub test_settings + } + + sub test_blob_download +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -229,7 +229,7 @@ sub test_blob_download + } + + sub test_creationids +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +diff --git a/Cassandane/Cyrus/JMAPMail.pm b/Cassandane/Cyrus/JMAPMail.pm +index 660a0b5..e7bf8fd 100644 +--- a/Cassandane/Cyrus/JMAPMail.pm ++++ b/Cassandane/Cyrus/JMAPMail.pm +@@ -102,7 +102,7 @@ sub getinbox + } + + sub test_mailbox_get +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -180,7 +180,7 @@ sub test_mailbox_get + } + + sub test_mailbox_get_specialuse +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -228,7 +228,7 @@ sub test_mailbox_get_specialuse + } + + sub test_mailbox_get_properties +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -256,7 +256,7 @@ sub test_mailbox_get_properties + } + + sub test_mailbox_get_ids +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -294,7 +294,7 @@ sub test_mailbox_get_ids + } + + sub test_mailbox_get_nocalendars +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -329,7 +329,7 @@ sub test_mailbox_get_nocalendars + } + + sub test_mailbox_get_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -390,7 +390,7 @@ sub test_mailbox_get_shared + } + + sub test_mailbox_query +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -531,7 +531,7 @@ sub test_mailbox_query + } + + sub test_mailbox_query_parentname +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -574,7 +574,7 @@ sub test_mailbox_query_parentname + } + + sub test_mailbox_query_limit_zero +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -589,7 +589,7 @@ sub test_mailbox_query_limit_zero + } + + sub test_mailbox_query_parentid_null +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -622,7 +622,7 @@ sub test_mailbox_query_parentid_null + } + + sub test_mailbox_query_filteroperator +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + return; +@@ -697,7 +697,7 @@ sub test_mailbox_query_filteroperator + } + + sub test_mailbox_query_issue2286 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -711,7 +711,7 @@ sub test_mailbox_query_issue2286 + } + + sub test_mailbox_querychanges +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -735,7 +735,7 @@ sub test_mailbox_querychanges + } + + sub test_mailbox_set +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -817,7 +817,7 @@ sub test_mailbox_set + } + + sub test_mailbox_get_shared_parents +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -855,7 +855,7 @@ sub test_mailbox_get_shared_parents + } + + sub test_mailbox_set_name_missing +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -877,7 +877,7 @@ sub test_mailbox_set_name_missing + + + sub test_mailbox_set_name_collision +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -980,7 +980,7 @@ sub test_mailbox_set_name_collision + } + + sub test_mailbox_set_name_interop +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1036,7 +1036,7 @@ sub test_mailbox_set_name_interop + } + + sub test_mailbox_set_name_unicode_nfc +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1068,7 +1068,7 @@ sub test_mailbox_set_name_unicode_nfc + + + sub test_mailbox_set_role +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1203,7 +1203,7 @@ sub test_mailbox_set_role + } + + sub test_mailbox_set_no_outbox_role +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1221,7 +1221,7 @@ sub test_mailbox_set_no_outbox_role + + + sub test_mailbox_set_parent +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1315,7 +1315,7 @@ sub test_mailbox_set_parent + } + + sub test_mailbox_set_parent_acl +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1348,7 +1348,7 @@ sub test_mailbox_set_parent_acl + } + + sub test_mailbox_set_destroy_empty +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1417,7 +1417,7 @@ sub test_mailbox_set_destroy_empty + } + + sub test_mailbox_set_destroy_removemsgs +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1474,7 +1474,7 @@ sub test_mailbox_set_destroy_removemsgs + } + + sub test_mailbox_set_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1541,7 +1541,7 @@ sub test_mailbox_set_shared + } + + sub test_mailbox_changes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1688,7 +1688,7 @@ sub test_mailbox_changes + } + + sub test_mailbox_changes_counts +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1803,7 +1803,7 @@ sub test_mailbox_changes_counts + + + sub test_mailbox_changes_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -1880,7 +1880,7 @@ sub defaultprops_for_email_get + } + + sub test_email_get +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -1982,7 +1982,7 @@ sub test_email_get + } + + sub test_email_get_mimeencode +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2050,7 +2050,7 @@ sub test_email_get_mimeencode + } + + sub test_email_get_multimailboxes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2091,7 +2091,7 @@ sub test_email_get_multimailboxes + } + + sub test_email_get_body_both +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2141,7 +2141,7 @@ sub test_email_get_body_both + } + + sub test_email_get_body_plain +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2175,7 +2175,7 @@ sub test_email_get_body_plain + } + + sub test_email_get_body_html +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2209,7 +2209,7 @@ sub test_email_get_body_html + } + + sub test_email_get_attachment_name +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2314,7 +2314,7 @@ sub test_email_get_attachment_name + } + + sub test_email_get_body_notext +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2343,7 +2343,7 @@ sub test_email_get_body_notext + + + sub test_email_get_preview +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2374,7 +2374,7 @@ sub test_email_get_preview + } + + sub test_email_get_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2415,7 +2415,7 @@ sub test_email_get_shared + } + + sub test_email_set_draft +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2489,7 +2489,7 @@ sub test_email_set_draft + } + + sub test_email_set_issue2293 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2566,7 +2566,7 @@ sub test_email_set_issue2293 + } + + sub test_email_set_inreplyto +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2629,7 +2629,7 @@ sub test_email_set_inreplyto + } + + sub test_email_set_attachedemails +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2697,7 +2697,7 @@ sub test_email_set_attachedemails + } + + sub test_email_set_bodystructure +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2810,7 +2810,7 @@ sub test_email_set_bodystructure + } + + sub test_email_set_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -2871,7 +2871,7 @@ sub test_email_set_shared + } + + sub test_email_set_userkeywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2943,7 +2943,7 @@ sub test_email_set_userkeywords + } + + sub test_misc_upload_zero +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -2992,7 +2992,7 @@ sub test_misc_upload_zero + } + + sub test_misc_upload +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3045,7 +3045,7 @@ sub test_misc_upload + } + + sub test_misc_upload_multiaccount +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3068,7 +3068,7 @@ sub test_misc_upload_multiaccount + } + + sub test_misc_upload_bin +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3117,7 +3117,7 @@ sub test_misc_upload_bin + } + + sub test_misc_download +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3182,7 +3182,7 @@ sub download + } + + sub test_blob_copy +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3244,7 +3244,7 @@ sub test_blob_copy + } + + sub test_email_set_attachments +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3399,7 +3399,7 @@ sub test_email_set_attachments + } + + sub test_email_set_flagged +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3437,7 +3437,7 @@ sub test_email_set_flagged + } + + sub test_email_set_mailboxids +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3491,7 +3491,7 @@ sub test_email_set_mailboxids + } + + sub test_email_get_keywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3568,7 +3568,7 @@ sub test_email_get_keywords + } + + sub test_email_get_keywords_case_insensitive +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3601,7 +3601,7 @@ sub test_email_get_keywords_case_insensitive + } + + sub test_email_set_keywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3733,7 +3733,7 @@ sub test_email_set_keywords + } + + sub test_emailsubmission_set +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3785,7 +3785,7 @@ sub test_emailsubmission_set + } + + sub test_emailsubmission_set_with_envelope +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3825,7 +3825,7 @@ sub test_emailsubmission_set_with_envelope + } + + sub test_emailsubmission_set_issue2285 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3888,7 +3888,7 @@ sub test_emailsubmission_set_issue2285 + } + + sub test_emailsubmission_changes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3937,7 +3937,7 @@ sub test_emailsubmission_changes + } + + sub test_emailsubmission_query +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3958,7 +3958,7 @@ sub test_emailsubmission_query + } + + sub test_emailsubmission_querychanges +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -3979,7 +3979,7 @@ sub test_emailsubmission_querychanges + } + + sub test_email_set_move +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4039,7 +4039,7 @@ sub test_email_set_move + } + + sub test_email_set_move_keywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4097,7 +4097,7 @@ sub test_email_set_move_keywords + } + + sub test_email_set_update +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4152,7 +4152,7 @@ sub test_email_set_update + } + + sub test_email_set_seen +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4191,7 +4191,7 @@ sub test_email_set_seen + } + + sub test_email_set_destroy +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4267,7 +4267,7 @@ sub test_email_set_destroy + } + + sub test_email_query +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4594,7 +4594,7 @@ sub test_email_query + } + + sub test_email_query_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -4947,7 +4947,7 @@ sub test_email_query_shared + } + + sub test_email_query_keywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5045,7 +5045,7 @@ sub test_email_query_keywords + } + + sub test_email_query_userkeywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5114,7 +5114,7 @@ sub test_email_query_userkeywords + } + + sub test_email_query_threadkeywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -5295,7 +5295,7 @@ sub test_email_query_threadkeywords + } + + sub test_email_query_empty +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5315,7 +5315,7 @@ sub test_email_query_empty + } + + sub test_email_query_collapse +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -5367,7 +5367,7 @@ sub test_email_query_collapse + } + + sub test_email_query_inmailbox_null +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5385,7 +5385,7 @@ sub test_email_query_inmailbox_null + } + + sub test_misc_collapsethreads_issue2024 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -5426,7 +5426,7 @@ sub test_misc_collapsethreads_issue2024 + } + + sub test_email_query_window +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -5516,7 +5516,7 @@ sub test_email_query_window + } + + sub test_email_query_long +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -5560,7 +5560,7 @@ sub test_email_query_long + } + + sub test_email_query_acl +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5619,7 +5619,7 @@ sub test_email_query_acl + } + + sub test_email_query_unknown_mailbox +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -5643,7 +5643,7 @@ sub test_email_query_unknown_mailbox + + + sub test_searchsnippet_get +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5752,7 +5752,7 @@ sub test_searchsnippet_get + } + + sub test_searchsnippet_get_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -5815,7 +5815,7 @@ sub test_searchsnippet_get_shared + } + + sub test_email_query_snippets +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -5900,7 +5900,7 @@ sub test_email_query_snippets + } + + sub test_email_query_attachments +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6003,7 +6003,7 @@ sub test_email_query_attachments + } + + sub test_email_query_attachmentname +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6062,7 +6062,7 @@ sub test_email_query_attachmentname + } + + sub test_email_query_attachmenttype +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6162,7 +6162,7 @@ sub test_email_query_attachmenttype + } + + sub test_thread_get +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -6269,7 +6269,7 @@ sub test_thread_get + } + + sub test_identity_get +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6293,7 +6293,7 @@ sub test_identity_get + } + + sub test_misc_emptyids +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -6320,7 +6320,7 @@ sub test_misc_emptyids + } + + sub test_email_querychanges_basic +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6371,7 +6371,7 @@ sub test_email_querychanges_basic + } + + sub test_email_querychanges_basic_collapse +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6424,7 +6424,7 @@ sub test_email_querychanges_basic_collapse + } + + sub test_email_querychanges_basic_mb +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6477,7 +6477,7 @@ sub test_email_querychanges_basic_mb + } + + sub test_email_querychanges_basic_mb_collapse +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6598,7 +6598,7 @@ sub test_email_querychanges_basic_mb_collapse + } + + sub test_email_querychanges_skipdeleted +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6660,7 +6660,7 @@ sub test_email_querychanges_skipdeleted + } + + sub test_email_querychanges_deletedcopy +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6723,7 +6723,7 @@ sub test_email_querychanges_deletedcopy + } + + sub test_email_changes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6884,7 +6884,7 @@ sub test_email_changes + } + + sub test_email_querychanges +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6922,7 +6922,7 @@ sub test_email_querychanges + } + + sub test_email_querychanges_zerosince +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -6960,7 +6960,7 @@ sub test_email_querychanges_zerosince + + + sub test_email_querychanges_thread +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7038,7 +7038,7 @@ sub test_email_querychanges_thread + } + + sub test_email_querychanges_order +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7097,7 +7097,7 @@ sub test_email_querychanges_order + } + + sub test_email_querychanges_implementation +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7244,7 +7244,7 @@ sub test_email_querychanges_implementation + } + + sub test_email_changes_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7333,7 +7333,7 @@ sub test_email_changes_shared + } + + sub test_misc_upload_download822 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7359,7 +7359,7 @@ EOF + } + + sub test_misc_upload_sametype +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7376,7 +7376,7 @@ sub test_misc_upload_sametype + } + + sub test_misc_brokenrfc822_badendline +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7424,7 +7424,7 @@ EOF + } + + sub test_email_import_zerobyte +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7472,7 +7472,7 @@ EOF + + + sub test_email_import_setdate +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7532,7 +7532,7 @@ EOF + } + + sub test_thread_get_onemsg +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -7601,7 +7601,7 @@ EOF + } + + sub test_thread_changes +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my %exp; +@@ -7821,7 +7821,7 @@ sub test_thread_changes + } + + sub test_email_import +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7919,7 +7919,7 @@ sub test_email_import + } + + sub test_email_import_error +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -7955,7 +7955,7 @@ sub test_email_import_error + + + sub test_email_import_shared +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8001,7 +8001,7 @@ EOF + } + + sub test_misc_refobjects_simple +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8036,7 +8036,7 @@ sub test_misc_refobjects_simple + } + + sub test_email_import_no_keywords +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8073,7 +8073,7 @@ EOF + } + + sub test_misc_refobjects_extended +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8114,7 +8114,7 @@ sub test_misc_refobjects_extended + } + + sub test_email_set_patch +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8192,7 +8192,7 @@ sub test_email_set_patch + } + + sub test_capability +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + +@@ -8222,7 +8222,7 @@ sub test_capability + } + + sub test_misc_set_oldstate +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8276,7 +8276,7 @@ sub test_misc_set_oldstate + } + + sub test_email_set_text_crlf +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8308,7 +8308,7 @@ sub test_email_set_text_crlf + } + + sub test_email_set_text_split +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8338,7 +8338,7 @@ sub test_email_set_text_split + } + + sub test_email_get_attachedemails +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8395,7 +8395,7 @@ sub test_email_get_attachedemails + } + + sub test_email_get_maxbodyvaluebytes_utf8 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8444,7 +8444,7 @@ sub test_email_get_maxbodyvaluebytes_utf8 + } + + sub test_email_get_header_all +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8476,7 +8476,7 @@ sub test_email_get_header_all + } + + sub test_email_set_nullheader +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8511,7 +8511,7 @@ sub test_email_set_nullheader + } + + sub test_email_set_headers +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8653,7 +8653,7 @@ sub test_email_set_headers + } + + sub test_email_download +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8699,7 +8699,7 @@ sub test_email_download + } + + sub test_email_embedded_download +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8750,7 +8750,7 @@ sub test_email_embedded_download + } + + sub test_blob_download +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8769,7 +8769,7 @@ sub test_blob_download + } + + sub test_email_set_filename +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8845,7 +8845,7 @@ sub test_email_set_filename + } + + sub test_email_get_size +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8868,7 +8868,7 @@ sub test_email_get_size + } + + sub test_email_get_references +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8897,7 +8897,7 @@ sub test_email_get_references + } + + sub test_email_get_groupaddr +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -8936,7 +8936,7 @@ sub test_email_get_groupaddr + } + + sub test_email_parse +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9010,7 +9010,7 @@ sub test_email_parse + } + + sub test_email_parse_digest +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9052,7 +9052,7 @@ sub test_email_parse_digest + } + + sub test_email_parse_blob822 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9080,7 +9080,7 @@ EOF + } + + sub test_email_parse_notparsable +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9100,7 +9100,7 @@ EOF + } + + sub test_email_get_bodystructure +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9323,7 +9323,7 @@ sub test_email_get_bodystructure + } + + sub test_email_get_calendarevents +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9400,7 +9400,7 @@ sub test_email_get_calendarevents + } + + sub test_email_set_blobencoding +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9473,7 +9473,7 @@ EOF + } + + sub test_email_body_alternative_without_html +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + my $jmap = $self->{jmap}; +@@ -9521,7 +9521,7 @@ sub test_email_body_alternative_without_html + } + + sub test_mailbox_set_issue2377 +- :min_version_3_1 ++ :min_version_3_1 :needs_component_jmap + { + my ($self) = @_; + + +From 19ecf16b81dc5865cc9b8ee66be78ac102137baa Mon Sep 17 00:00:00 2001 +From: ellie timoney +Date: Mon, 28 May 2018 16:10:10 +1000 +Subject: [PATCH 11/11] TesterJMAP: don't run if jmap support not compiled in + +--- + Cassandane/Cyrus/TesterJMAP.pm | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/Cassandane/Cyrus/TesterJMAP.pm b/Cassandane/Cyrus/TesterJMAP.pm +index 7c30845..e6b554c 100644 +--- a/Cassandane/Cyrus/TesterJMAP.pm ++++ b/Cassandane/Cyrus/TesterJMAP.pm +@@ -63,6 +63,11 @@ sub cyrus_version_supports_jmap + + return 0 if ($maj < 3); # not supported before 3.x + return 0 if ($maj == 3 && $min == 0); # not supported in 3.0.x ++ ++ # not supported if configured out ++ my $buildinfo = Cassandane::BuildInfo->new(); ++ return 0 if not $buildinfo->get('component', 'jmap'); ++ + return 1; # supported in everything newer + } + diff --git a/cyrus-imapd.spec b/cyrus-imapd.spec index 8a3d22a..8aa5a5f 100644 --- a/cyrus-imapd.spec +++ b/cyrus-imapd.spec @@ -2,7 +2,7 @@ # Cassandane commit hash. Cassandane doesn't have releases often, but it # receives constant development. This was fetched on 20180518. -%global cocas 00bfe0109f80437ed09154aca9fbd53eef8f1b09 +%global cocas 8776dd697fa78af69876a127f2d6a9ee12c13a2f # Cassandane run by default. '--without cassandane' disables. %bcond_without cassandane @@ -76,6 +76,8 @@ Source91: patch-cassandane-no-syslog # Upstream ticket https://github.com/cyrusimap/cyrus-imapd/issues/1995 Source92: patch-cassandane-fix-annotator +Source93: https://patch-diff.githubusercontent.com/raw/cyrusimap/cassandane/pull/57.patch + BuildRequires: autoconf automake bison flex gcc gcc-c++ git groff libtool BuildRequires: pkgconfig systemd transfig @@ -208,6 +210,7 @@ tar xf %SOURCE81 patch -p1 < %SOURCE91 patch -p1 < %SOURCE92 +patch -p1 < %SOURCE93 cp %SOURCE82 cassandane.ini # RF rpm-buildroot-usage @@ -432,6 +435,8 @@ export CYRUS_USER=$USER # --------------------------------------------------------- exclude=() tests=( + # This exclusion list was verified on 2018-05-30. + # This is more a test of system performance and according to upstream won't # be reliable on shared hardware like our builders. Metronome @@ -597,6 +602,9 @@ getent passwd cyrus >/dev/null || /usr/sbin/useradd -c "Cyrus IMAP Server" -d /v * Wed May 30 2018 Jason L Tibbitts III - 3.0.7-3 - Remove ldconfig scriptlets. - Remove F26-specific test exclusions. +- Update Cassandane checkout. +- Add extra Cassandane patch from https://github.com/cyrusimap/cassandane/pull/57 +- Revalidate the excluded test list. * Fri May 18 2018 Jason L Tibbitts III - 3.0.7-2 - Really enable mysql and clamav support. diff --git a/sources b/sources index 8df2b50..bc5c8ed 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ SHA512 (cassandane-testdata-20170523.tar.gz) = 705f5af6a31fe3b8d6e8027bbddbedb2f64d65997f8a06620ec07fcd30a95d98ac3f3fbef7af5080684ee21be1c5b8bcad2374b2749f0571099e780355a04420 SHA512 (cyrus-imapd-3.0.7.tar.gz) = 6f9af658df6ae6e4463bb52c672c7e8d49482c8e5542985825f099ea8b76291d1598a2a5c92711ae642b0d053c5168792f1832eeb15d1fdeb4b8d2efcfb4d9b9 -SHA512 (cassandane-00bfe01.tar.gz) = 96f2ca6cbf36c8f9df2b4762ca572b5ba597ca305408f992d6671cba2845f990c8d3cf35ae91ea44da9ea825c9b4c6b1e5fb314b27c31cf4c63805699ab46ab6 +SHA512 (cassandane-8776dd6.tar.gz) = 9dc7c2a05b70f16f875079ab510cf5af68f04f5237a7a56a9307797fdca97770c4317bba106bff149d19bb7deca9adc161bed3903502a73dc5587aa5b293d72a