Hello community,

here is the log from the commit of package perl-Sereal for openSUSE:Factory 
checked in at 2018-10-11 11:53:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Sereal (Old)
 and      /work/SRC/openSUSE:Factory/.perl-Sereal.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-Sereal"

Thu Oct 11 11:53:17 2018 rev:2 rq:640428 version:4.005

Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Sereal/perl-Sereal.changes  2018-09-15 
15:34:50.585040556 +0200
+++ /work/SRC/openSUSE:Factory/.perl-Sereal.new/perl-Sereal.changes     
2018-10-11 11:54:12.878117942 +0200
@@ -1,0 +2,11 @@
+Sun Oct  7 15:12:10 UTC 2018 - Dirk Stoecker <[email protected]>
+
+- Fix autogenerated changes
+
+-------------------------------------------------------------------
+Wed Feb  7 17:17:08 UTC 2018 - [email protected]
+
+- updated to 4.005
+   see /usr/share/doc/packages/perl-Sereal/Changes
+
+-------------------------------------------------------------------

Old:
----
  Sereal-3.015.tar.gz

New:
----
  Sereal-4.005.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-Sereal.spec ++++++
--- /var/tmp/diff_new_pack.skVKyi/_old  2018-10-11 11:54:13.258117460 +0200
+++ /var/tmp/diff_new_pack.skVKyi/_new  2018-10-11 11:54:13.258117460 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package perl-Sereal
 #
-# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,31 +12,31 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
 Name:           perl-Sereal
-Version:        3.015
+Version:        4.005
 Release:        0
 %define cpan_name Sereal
 Summary:        Fast, compact, powerful binary (de-)serialization
-License:        Artistic-1.0 or GPL-1.0+
+License:        Artistic-1.0 OR GPL-1.0-or-later
 Group:          Development/Libraries/Perl
-Url:            http://search.cpan.org/dist/Sereal/
-Source0:        
http://www.cpan.org/authors/id/Y/YV/YVES/%{cpan_name}-%{version}.tar.gz
+Url:            https://metacpan.org/release/%{cpan_name}
+Source0:        
https://cpan.metacpan.org/authors/id/Y/YV/YVES/%{cpan_name}-%{version}.tar.gz
 Source1:        cpanspec.yml
 BuildArch:      noarch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  perl
 BuildRequires:  perl-macros
-BuildRequires:  perl(Sereal::Decoder) >= 3.015
-BuildRequires:  perl(Sereal::Encoder) >= 3.015
+BuildRequires:  perl(Sereal::Decoder) >= 4.005
+BuildRequires:  perl(Sereal::Encoder) >= 4.005
 BuildRequires:  perl(Test::LongString)
 BuildRequires:  perl(Test::More) >= 0.88
 BuildRequires:  perl(Test::Warn)
-Requires:       perl(Sereal::Decoder) >= 3.015
-Requires:       perl(Sereal::Encoder) >= 3.015
+Requires:       perl(Sereal::Decoder) >= 4.005
+Requires:       perl(Sereal::Encoder) >= 4.005
 %{perl_requires}
 
 %description
@@ -66,11 +66,12 @@
 %setup -q -n %{cpan_name}-%{version}
 
 %build
-%{__perl} Makefile.PL INSTALLDIRS=vendor
-%{__make} %{?_smp_mflags}
+perl Makefile.PL INSTALLDIRS=vendor
+# Don't use smp_flags!
+make
 
 %check
-%{__make} test
+make test
 
 %install
 %perl_make_install

++++++ Sereal-3.015.tar.gz -> Sereal-4.005.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/Changes new/Sereal-4.005/Changes
--- old/Sereal-3.015/Changes    2016-09-01 20:19:37.000000000 +0200
+++ new/Sereal-4.005/Changes    2018-01-23 21:43:42.000000000 +0100
@@ -7,12 +7,30 @@
    * https://github.com/Sereal/Sereal/blob/master/Perl/Encoder/Changes
 
 ****************************************************************
-* Warning: For a seamless upgrade, upgrade to version 3        *
-*          of the decoder before upgrading to version 3 of the *
+* Warning: For a seamless upgrade, upgrade to version 4        *
+*          of the decoder before upgrading to version 4 of the *
 *          encoder! This may mean you should NOT install the   *
 *          Sereal package and instead install the Encoder or   *
 *          Decoder independently.                              *
 ****************************************************************
+4.005 Tues Jan 23, 2018
+    * Encoder: Document encode_to_file()
+    * Decoder: Document and fix decode_from_file()
+    * Sereal: fixup docs on write_file()/decode_file()
+
+4.004 Sun Nov 12
+    * Fix build issues from C++ style comments
+    * Fixup build_requires
+
+4.003 Sun Nov 12
+    * Fixup Devel::CheckLib usage
+    * Do not compress using Snappy if the buffer is larger 2**32
+    * Build fixes
+
+4.001_001 Mon Feb  6 11:13:40 CEST 2017
+  * Sereal v4 release with Zstandard compression support
+    https://github.com/facebook/zstd
+
 3.015 Thu Sep  1 20:18:44 CEST 2016
   * Fix builds under 5.25+
   * Fix various buffer overun bugs found using AFL (thanks to dgryski)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/MANIFEST new/Sereal-4.005/MANIFEST
--- old/Sereal-3.015/MANIFEST   2016-09-01 20:21:41.000000000 +0200
+++ new/Sereal-4.005/MANIFEST   2018-01-23 21:51:20.000000000 +0100
@@ -67,6 +67,23 @@
 t/700_roundtrip/v3/sort_keys_perl_rev.t
 t/700_roundtrip/v3/zlib.t
 t/700_roundtrip/v3/zlib_force.t
+t/700_roundtrip/v4/dedudep_strings.t
+t/700_roundtrip/v4/freeze_thaw.t
+t/700_roundtrip/v4/plain.t
+t/700_roundtrip/v4/plain_canon.t
+t/700_roundtrip/v4/readonly.t
+t/700_roundtrip/v4/snappy.t
+t/700_roundtrip/v4/snappy_and_warn_unknown.t
+t/700_roundtrip/v4/snappy_canon.t
+t/700_roundtrip/v4/snappy_incr.t
+t/700_roundtrip/v4/snappy_incr_canon.t
+t/700_roundtrip/v4/sort_keys.t
+t/700_roundtrip/v4/sort_keys_perl.t
+t/700_roundtrip/v4/sort_keys_perl_rev.t
+t/700_roundtrip/v4/zlib.t
+t/700_roundtrip/v4/zlib_force.t
+t/700_roundtrip/v4/zstd.t
+t/700_roundtrip/v4/zstd_force.t
 t/800_threads.t
 t/900_reentrancy.t
 t/900_regr_issue_15.t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/META.json new/Sereal-4.005/META.json
--- old/Sereal-3.015/META.json  2016-09-01 20:21:41.000000000 +0200
+++ new/Sereal-4.005/META.json  2018-01-23 21:51:20.000000000 +0100
@@ -4,7 +4,7 @@
       "Steffen Mueller <[email protected]>"
    ],
    "dynamic_config" : 1,
-   "generated_by" : "ExtUtils::MakeMaker version 7.18, CPAN::Meta::Converter 
version 2.143240",
+   "generated_by" : "ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter 
version 2.150010",
    "license" : [
       "perl_5"
    ],
@@ -32,8 +32,8 @@
       },
       "runtime" : {
          "requires" : {
-            "Sereal::Decoder" : "3.015",
-            "Sereal::Encoder" : "3.015",
+            "Sereal::Decoder" : "4.005",
+            "Sereal::Encoder" : "4.005",
             "perl" : "5.008"
          }
       },
@@ -42,8 +42,8 @@
             "Data::Dumper" : "0",
             "File::Spec" : "0",
             "Scalar::Util" : "0",
-            "Sereal::Decoder" : "3.015",
-            "Sereal::Encoder" : "3.015",
+            "Sereal::Decoder" : "4.005",
+            "Sereal::Encoder" : "4.005",
             "Test::LongString" : "0",
             "Test::More" : "0.88",
             "Test::Warn" : "0"
@@ -60,5 +60,6 @@
          "url" : "git://github.com/Sereal/Sereal.git"
       }
    },
-   "version" : "3.015"
+   "version" : "4.005",
+   "x_serialization_backend" : "JSON::PP version 2.27400"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/META.yml new/Sereal-4.005/META.yml
--- old/Sereal-3.015/META.yml   2016-09-01 20:21:41.000000000 +0200
+++ new/Sereal-4.005/META.yml   2018-01-23 21:51:20.000000000 +0100
@@ -7,15 +7,15 @@
   ExtUtils::MakeMaker: '0'
   File::Spec: '0'
   Scalar::Util: '0'
-  Sereal::Decoder: '3.015'
-  Sereal::Encoder: '3.015'
+  Sereal::Decoder: '4.005'
+  Sereal::Encoder: '4.005'
   Test::LongString: '0'
   Test::More: '0.88'
   Test::Warn: '0'
 configure_requires:
   ExtUtils::MakeMaker: '0'
 dynamic_config: 1
-generated_by: 'ExtUtils::MakeMaker version 7.18, CPAN::Meta::Converter version 
2.143240'
+generated_by: 'ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 
2.150010'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -26,10 +26,11 @@
     - t
     - inc
 requires:
-  Sereal::Decoder: '3.015'
-  Sereal::Encoder: '3.015'
+  Sereal::Decoder: '4.005'
+  Sereal::Encoder: '4.005'
   perl: '5.008'
 resources:
   bugtracker: https://github.com/Sereal/Sereal/issues
   repository: git://github.com/Sereal/Sereal.git
-version: '3.015'
+version: '4.005'
+x_serialization_backend: 'CPAN::Meta::YAML version 0.011'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/Makefile.PL new/Sereal-4.005/Makefile.PL
--- old/Sereal-3.015/Makefile.PL        2016-09-01 20:19:56.000000000 +0200
+++ new/Sereal-4.005/Makefile.PL        2018-01-23 21:43:47.000000000 +0100
@@ -4,7 +4,7 @@
 
 use ExtUtils::MakeMaker;
 use Cwd;
-our $VERSION = '3.015';
+our $VERSION = '4.005';
 
 my $shared_dir = "../shared";
 my $its_our_repo_file= "../this_is_the_Sereal_repo.txt";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/inc/Sereal/BuildTools.pm 
new/Sereal-4.005/inc/Sereal/BuildTools.pm
--- old/Sereal-3.015/inc/Sereal/BuildTools.pm   2016-07-13 02:39:28.000000000 
+0200
+++ new/Sereal-4.005/inc/Sereal/BuildTools.pm   2018-01-23 21:18:12.000000000 
+0100
@@ -1,15 +1,34 @@
-package inc::Sereal::BuildTools;
+package #
+inc::Sereal::BuildTools;
 use strict;
 use warnings;
 
 use Config;
 use constant OSNAME => $^O;
 
+my %bare_minimum_files= map { $_ => 1 } qw{
+    typemap
+    ppport.h
+    srl_stack.h
+    srl_common.h
+    srl_inline.h
+    srl_taginfo.h
+    srl_protocol.h
+    srl_reader_error.h
+    srl_reader_types.h
+    inc/Sereal/BuildTools.pm
+    inc/Devel/CheckLib.pm
+    inc/Sereal
+    inc/Devel
+    inc
+};
+
 sub link_files {
   my $shared_dir = shift;
-  my $do_tests = shift || "";
-  my $exclude_tests= $do_tests eq "without_tests";
-  my $tests_only= $do_tests eq "tests_only";
+  my $mode = shift || "";
+  my $exclude_tests= $mode eq "without_tests";
+  my $tests_only= $mode eq "tests_only";
+  my $bare_minimum= $mode eq "bare_minimum";
 
   # This fires from a git source tree only.
   # Right now, all devs are on Linux. Feel free to make portable.
@@ -26,6 +45,7 @@
           return unless $_;
           return if $exclude_tests && m#^/?t/#;
           return if $tests_only && !m#^/?t/#;
+          return if $bare_minimum && !exists $bare_minimum_files{$_};
 
           if (-d $f) {
             File::Path::mkpath($_)
@@ -60,7 +80,7 @@
 
 # Prefer external csnappy and miniz libraries over the bundled ones.
 sub check_external_libraries {
-  my ($libs, $defines, $objects) = @_;
+  my ($libs, $defines, $objects, $subdirs) = @_;
   require Devel::CheckLib;
 
   if (
@@ -91,6 +111,22 @@
     print "Using bundled miniz code\n";
     $$objects .= ' miniz$(OBJ_EXT)';
   }
+
+  if (
+    !$ENV{SEREAL_USE_BUNDLED_LIBS} &&
+    !$ENV{SEREAL_USE_BUNDLED_ZSTD} &&
+    Devel::CheckLib::check_lib(
+      lib      => 'zstd',
+      header   => 'zstd.h'
+  )) {
+    print "Using installed zstd library\n";
+    $$libs .= ' -lzstd';
+    $$defines .= ' -DHAVE_ZSTD';
+  } else {
+    print "Using bundled zstd code\n";
+    push @{ $subdirs }, 'zstd';
+    $$objects .= ' zstd/libzstd$(OBJ_EXT)';
+  }
 }
 
 sub build_defines {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/lib/Sereal.pm 
new/Sereal-4.005/lib/Sereal.pm
--- old/Sereal-3.015/lib/Sereal.pm      2016-09-01 20:19:56.000000000 +0200
+++ new/Sereal-4.005/lib/Sereal.pm      2018-01-23 21:43:47.000000000 +0100
@@ -2,10 +2,10 @@
 use 5.008;
 use strict;
 use warnings;
-our $VERSION = '3.015';
+our $VERSION = '4.005';
 our $XS_VERSION = $VERSION; $VERSION= eval $VERSION;
-use Sereal::Encoder 3.015 qw(encode_sereal sereal_encode_with_object);
-use Sereal::Decoder 3.015 qw(
+use Sereal::Encoder 4.005 qw(encode_sereal sereal_encode_with_object);
+use Sereal::Decoder 4.005 qw(
     decode_sereal looks_like_sereal decode_sereal_with_header_data
     scalar_looks_like_sereal
     sereal_decode_with_object sereal_decode_with_header_with_object
@@ -21,8 +21,10 @@
   get_sereal_encoder
   clear_sereal_object_cache
 
-  encode_sereal decode_sereal
-  write_sereal read_sereal
+  encode_sereal
+  decode_sereal
+  write_sereal
+  read_sereal
   looks_like_sereal
   sereal_encode_with_object
   sereal_decode_with_object
@@ -58,14 +60,14 @@
     return $DECODERS{_key($opts)} ||= Sereal::Decoder->new($opts);
 }
 
-sub write_sereal {
+sub write_sereal_file {
     my ($file, $struct, $append, $opts)= @_;
-    get_sereal_encoder($opts)->write_to_file($file, $_[1], $append);
+    get_sereal_encoder($opts)->encode_to_file($file, $_[1], $append);
 }
 
-sub read_sereal {
+sub read_sereal_file {
     my ($file, $opts)= @_;
-    get_sereal_decoder($opts)->read_from_file($file,$_[2]);
+    get_sereal_decoder($opts)->decode_from_file($file,$_[2]);
 }
 
 1;
@@ -80,14 +82,29 @@
 
 =head1 SYNOPSIS
 
-  use Sereal qw(encode_sereal decode_sereal
-                sereal_encode_with_object
-                sereal_decode_with_object
-                looks_like_sereal);
-  # Note: For performance reasons, you should prefer the OO interface,
-  #       or sereal_(en|de)code_with_object over the stateless
-  #       encode_sereal/decode_sereal functions.
-  #       See the Sereal::Performance documentation for details.
+    use Sereal qw(
+      get_sereal_decoder
+      get_sereal_encoder
+      clear_sereal_object_cache
+      encode_sereal
+      decode_sereal
+      write_sereal
+      read_sereal
+      looks_like_sereal
+      sereal_encode_with_object
+      sereal_decode_with_object
+      decode_sereal_with_header_data
+      scalar_looks_like_sereal
+      sereal_decode_with_header_with_object
+      sereal_decode_only_header_with_object
+      sereal_decode_only_header_with_offset_with_object
+      sereal_decode_with_header_and_offset_with_object
+      sereal_decode_with_offset_with_object
+    );
+    # Note: For performance reasons, you should prefer the OO interface,
+    #       or sereal_(en|de)code_with_object over the stateless
+    #       encode_sereal/decode_sereal functions.
+    #       See the Sereal::Performance documentation for details.
 
 =head1 DESCRIPTION
 
@@ -132,6 +149,24 @@
 C<Sereal::Decoder> are guaranteed to be loaded, so you can use
 their object-oriented interface.
 
+=head2 get_sereal_encoder($OPTSHASH)
+
+Returns a Sereal::Encoder with the given options. This encoder will be shared 
by other calls
+to this function.
+
+=head2 get_sereal_decoder($OPTSHASH)
+
+Returns a Sereal::Decoder with the given options. This encoder will be shared 
by other calls
+to this function.
+
+=head2 write_sereal($FILENAME,$STRUCT,$APPEND,$OPTS)
+
+Write a sereal packet to $FILENAME. See Sereal::Encoder::encode_to_file().
+
+=head2 read_sereal($FILENAME,$OPTS)
+
+Read a sereal packet from a file. See Sereal::Decoder::decode_from_file().
+
 =head1 BUGS, CONTACT AND SUPPORT
 
 For reporting bugs, please use the github bug tracker at
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/010_desperate.t 
new/Sereal-4.005/t/010_desperate.t
--- old/Sereal-3.015/t/010_desperate.t  2016-08-30 11:14:06.000000000 +0200
+++ new/Sereal-4.005/t/010_desperate.t  2018-01-23 21:18:12.000000000 +0100
@@ -30,7 +30,7 @@
 
 sub run_tests {
   my ($extra_name, $opt_hash) = @_;
-  setup_tests(3);
+  setup_tests(4);
   foreach my $bt (@BasicTests) {
     my (undef, $expect, $name, @alternate) = @$bt;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/080_set_readonly.t 
new/Sereal-4.005/t/080_set_readonly.t
--- old/Sereal-3.015/t/080_set_readonly.t       2016-08-30 11:18:10.000000000 
+0200
+++ new/Sereal-4.005/t/080_set_readonly.t       2017-11-12 21:16:47.000000000 
+0100
@@ -10,13 +10,14 @@
 }
 use Sereal::TestSet qw(:all);
 use Sereal::Decoder;
+use Scalar::Util qw(reftype weaken);
 
 my @tests= (
     [ set_readonly => 1  ],
 );
 
 if (have_encoder_and_decoder()) {
-    my $num_tests= 26;
+    my $num_tests= 62;
     plan tests => $num_tests;
 } else {
     plan skip_all => 'Did not find right version of encoder';
@@ -24,11 +25,15 @@
 
 my $foo = bless([ 1, 2, 3 ],"foo");
 
+my $weak_blessed_href = bless({ blah => 'bat', hash => { t => 1 } }, 
'SomeClass');
+weaken($weak_blessed_href->{foo} = $weak_blessed_href);
 my $struct= {
     hashref => { a => [ "b", 5, bless({ foo => "bar"}, "SomeClass")] },
+    blessed_ref_with_refs => bless({ foo => { bar => 'test' }, bar => ['baz'], 
empty_href => {}, empty_aref => [] }, 'Blah'),
     string => "foobar",
     arrayref => [ "foobar" ],
     blessed_arrayref => $foo,
+    weak_blessed_href => $weak_blessed_href,
 };
 
 foreach my $name ( keys %$struct ) {
@@ -58,27 +63,33 @@
 
     $scalars_only ||= 0;
     my $should_be_readonly = $scalars_only ? !ref($s) : 1;
-    is(Internals::SvREADONLY($_[0]), $should_be_readonly,
+    is(Internals::SvREADONLY( $_[0] ), $should_be_readonly,
        "scalar_only: '$scalars_only'. We want ro: '$should_be_readonly'. 
struct: $name, path: $path"
       );
 
-    my $ref = ref $s
-      or return;
+    my $reftype = reftype($_[0])
+        or return;
 
-    if ($ref eq 'ARRAY' || $ref eq 'foo') { 
+    if ( length($path) ) {
+        is(&Internals::SvREADONLY( $_[0] ), $should_be_readonly,
+            "scalar_only: '$scalars_only'. We want ro: '$should_be_readonly'. 
struct: $name, path: $path"
+        );
+    }
+    if ($reftype eq 'ARRAY') {
         my $i = 0;
         foreach (@$s) {
             _recurse($_, $path . '->[' . $i . ']', $name, $scalars_only);
         }
     }
-    elsif ($ref eq 'HASH' || $ref eq 'SomeClass') {
+    elsif ($reftype eq 'HASH') {
         foreach (keys %$s) {
+            next if reftype($s->{$_}) && $s->{$_} == $s;
             _recurse($s->{$_}, $path . '->{' . $_ . '}', $name, $scalars_only);
         }
-    } elsif ($ref eq 'SCALAR') {
+    } elsif ($reftype eq 'SCALAR') {
         _recurse($$s, '${' . $path . '}', $name, $scalars_only);
     } else {
-        die "unknown ref value '$ref'";
+        die "unknown ref type '$reftype'";
     }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/300_fail.t 
new/Sereal-4.005/t/300_fail.t
--- old/Sereal-3.015/t/300_fail.t       2016-08-30 11:15:46.000000000 +0200
+++ new/Sereal-4.005/t/300_fail.t       2017-11-12 21:16:47.000000000 +0100
@@ -11,10 +11,19 @@
 }
 
 use Sereal::TestSet qw(:all);
-use Test::More tests => 19;
+use Test::More;
 
 use Sereal::Encoder;
 use Sereal::Encoder::Constants qw(:all);
+BEGIN {
+    if (not have_encoder_and_decoder()) {
+        plan skip_all => 'Did not find right version of decoder';
+        exit 0;
+    } else {
+        plan tests => 19;
+    }
+}
+use Sereal::Decoder;
 
 my ($ok, $err, $out);
 
@@ -152,5 +161,3 @@
         qr/Sereal/,
         "warn_unknown == -1 warns about stringified sub without overloading";
 }
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/dedudep_strings.t 
new/Sereal-4.005/t/700_roundtrip/v4/dedudep_strings.t
--- old/Sereal-3.015/t/700_roundtrip/v4/dedudep_strings.t       1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/dedudep_strings.t       2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,29 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'dedupe_strings', { dedupe_strings   => 1 } 
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/freeze_thaw.t 
new/Sereal-4.005/t/700_roundtrip/v4/freeze_thaw.t
--- old/Sereal-3.015/t/700_roundtrip/v4/freeze_thaw.t   1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/freeze_thaw.t   2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,29 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'freeze-thaw',    { freeze_callbacks => 1 }
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/plain.t 
new/Sereal-4.005/t/700_roundtrip/v4/plain.t
--- old/Sereal-3.015/t/700_roundtrip/v4/plain.t 1970-01-01 01:00:00.000000000 
+0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/plain.t 2017-10-03 19:46:10.000000000 
+0200
@@ -0,0 +1,28 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $version;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests("plain");
+}
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/plain_canon.t 
new/Sereal-4.005/t/700_roundtrip/v4/plain_canon.t
--- old/Sereal-3.015/t/700_roundtrip/v4/plain_canon.t   1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/plain_canon.t   2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,27 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+$ok= 0 if $ok and $Sereal::Encoder::VERSION < 3.001006;
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder (want 3.001006)';
+}
+else {
+    run_roundtrip_tests("plain_canonical", { canonical => 1 });
+}
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/readonly.t 
new/Sereal-4.005/t/700_roundtrip/v4/readonly.t
--- old/Sereal-3.015/t/700_roundtrip/v4/readonly.t      1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/readonly.t      2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,29 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'readonly',       { set_readonly     => 1 } 
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/snappy.t 
new/Sereal-4.005/t/700_roundtrip/v4/snappy.t
--- old/Sereal-3.015/t/700_roundtrip/v4/snappy.t        1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/snappy.t        2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,27 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests('snappy', { snappy           => 1 } );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/Sereal-3.015/t/700_roundtrip/v4/snappy_and_warn_unknown.t 
new/Sereal-4.005/t/700_roundtrip/v4/snappy_and_warn_unknown.t
--- old/Sereal-3.015/t/700_roundtrip/v4/snappy_and_warn_unknown.t       
1970-01-01 01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/snappy_and_warn_unknown.t       
2017-10-03 19:46:10.000000000 +0200
@@ -0,0 +1,45 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    my $e = Sereal::Encoder->new();
+    my $d = Sereal::Decoder->new();
+
+    my $out;
+    my $payload = [ 'abcd' x 1024 ];
+    my $ok = eval {$out = $e->encode($payload); 1};
+    my $err = $@ || 'Zombie error';
+    ok($ok, "snappy_incr and warn_unknown makes CODE encoding not fail");
+
+    my $decoded;
+    $ok = eval {$decoded = $d->decode($out); 1};
+    $err = $@ || 'Zombie error';
+    ok($ok, "snappy_incr and warn_unknown produced decodable output")
+    or do {
+        diag($err);
+        hobodecode($out) if $ENV{DEBUG_SEREAL};
+    };
+
+    is_deeply($decoded, $payload, 'results matches');
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/snappy_canon.t 
new/Sereal-4.005/t/700_roundtrip/v4/snappy_canon.t
--- old/Sereal-3.015/t/700_roundtrip/v4/snappy_canon.t  1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/snappy_canon.t  2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,27 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+$ok= 0 if $ok and $Sereal::Encoder::VERSION < 3.001006;
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder (want 3.001006)';
+}
+else {
+    run_roundtrip_tests('snappy_canon', { snappy => 1, canonical => 1 } );
+}
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/snappy_incr.t 
new/Sereal-4.005/t/700_roundtrip/v4/snappy_incr.t
--- old/Sereal-3.015/t/700_roundtrip/v4/snappy_incr.t   1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/snappy_incr.t   2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,29 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'snappy_incr',    { snappy_incr      => 1 } 
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/snappy_incr_canon.t 
new/Sereal-4.005/t/700_roundtrip/v4/snappy_incr_canon.t
--- old/Sereal-3.015/t/700_roundtrip/v4/snappy_incr_canon.t     1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/snappy_incr_canon.t     2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,27 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+$ok= 0 if $ok and $Sereal::Encoder::VERSION < 3.001006;
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder (want 3.001006)';
+}
+else {
+    run_roundtrip_tests('snappy_incr_canon', { snappy_incr => 1, canonical => 
1 });
+}
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/sort_keys.t 
new/Sereal-4.005/t/700_roundtrip/v4/sort_keys.t
--- old/Sereal-3.015/t/700_roundtrip/v4/sort_keys.t     1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/sort_keys.t     2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,29 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'sort_keys',      { sort_keys        => 1 }
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/sort_keys_perl.t 
new/Sereal-4.005/t/700_roundtrip/v4/sort_keys_perl.t
--- old/Sereal-3.015/t/700_roundtrip/v4/sort_keys_perl.t        1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/sort_keys_perl.t        2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,29 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'sort_keys',      { sort_keys        => 2 }
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/sort_keys_perl_rev.t 
new/Sereal-4.005/t/700_roundtrip/v4/sort_keys_perl_rev.t
--- old/Sereal-3.015/t/700_roundtrip/v4/sort_keys_perl_rev.t    1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/sort_keys_perl_rev.t    2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,29 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'sort_keys',      { sort_keys        => 3 }
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/zlib.t 
new/Sereal-4.005/t/700_roundtrip/v4/zlib.t
--- old/Sereal-3.015/t/700_roundtrip/v4/zlib.t  1970-01-01 01:00:00.000000000 
+0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/zlib.t  2017-10-03 19:46:10.000000000 
+0200
@@ -0,0 +1,32 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'zlib', 
+        { 
+            compress => Sereal::Encoder::SRL_ZLIB(),
+        }
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/zlib_force.t 
new/Sereal-4.005/t/700_roundtrip/v4/zlib_force.t
--- old/Sereal-3.015/t/700_roundtrip/v4/zlib_force.t    1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/zlib_force.t    2017-10-03 
19:46:10.000000000 +0200
@@ -0,0 +1,33 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'zlib_force',     
+        { 
+            compress => Sereal::Encoder::SRL_ZLIB(), 
+            compress_threshold => 0,
+        } 
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/zstd.t 
new/Sereal-4.005/t/700_roundtrip/v4/zstd.t
--- old/Sereal-3.015/t/700_roundtrip/v4/zstd.t  1970-01-01 01:00:00.000000000 
+0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/zstd.t  2017-11-12 23:20:41.000000000 
+0100
@@ -0,0 +1,32 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'zstd', 
+        { 
+            compress => Sereal::Encoder::SRL_ZSTD(),
+        }
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/700_roundtrip/v4/zstd_force.t 
new/Sereal-4.005/t/700_roundtrip/v4/zstd_force.t
--- old/Sereal-3.015/t/700_roundtrip/v4/zstd_force.t    1970-01-01 
01:00:00.000000000 +0100
+++ new/Sereal-4.005/t/700_roundtrip/v4/zstd_force.t    2017-11-12 
23:18:28.000000000 +0100
@@ -0,0 +1,33 @@
+#!perl
+use strict;
+use warnings;
+use Data::Dumper;
+use File::Spec;
+
+use lib File::Spec->catdir(qw(t lib));
+BEGIN {
+    lib->import('lib')
+        if !-d 't';
+}
+
+use Sereal::TestSet qw(:all);
+use Test::More;
+
+my $ok = have_encoder_and_decoder();
+if (not $ok) {
+    plan skip_all => 'Did not find right version of encoder';
+}
+else {
+    run_roundtrip_tests(
+        'zstd_force',     
+        { 
+            compress => Sereal::Encoder::SRL_ZSTD(), 
+            compress_threshold => 0,
+        } 
+    );
+}
+
+
+pass();
+done_testing();
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Sereal-3.015/t/lib/Sereal/TestSet.pm 
new/Sereal-4.005/t/lib/Sereal/TestSet.pm
--- old/Sereal-3.015/t/lib/Sereal/TestSet.pm    2016-08-30 11:37:23.000000000 
+0200
+++ new/Sereal-4.005/t/lib/Sereal/TestSet.pm    2018-01-23 21:18:12.000000000 
+0100
@@ -632,34 +632,35 @@
 sub have_encoder_and_decoder {
     my ($min_v)= @_;
     # $Class is the already-loaded class, so the one we're testing
-    my $need = $Class =~ /Encoder/ ? "Decoder" : "Encoder";
-    my $need_class = "Sereal::$need";
+    my @need = $Class =~ /Encoder/ ? ("Decoder") :
+               $Class =~ /Decoder/ ? ("Encoder") :
+                                     ("Encoder", "Decoder");
+    my @need_class = ($Class, map { "Sereal::$_" } @need);
+
+    foreach my $class (@need_class) {
+        eval "use $class; 1"
+        or do {
+            note("Could not locate $class for testing" . ($@ ? " (Exception: 
$@)" : ""));
+            return();
+        };
+        my $cmp_v= $class->VERSION;
+
+        if ($min_v and $cmp_v < $min_v) {
+            diag("Could not load correct version of $class for testing "
+                 ."(got: $cmp_v, needed at least $min_v)");
+            return;
+        }
 
-    eval "use $Class; 1"
-    or do {
-        note("Could not locate $Class for testing" . ($@ ? " (Exception: $@)" 
: ""));
-        return();
-    };
-
-    eval "use $need_class; 1"
-    or do {
-        note("Could not locate $need_class for testing" . ($@ ? " (Exception: 
$@)" : ""));
-        return();
-    };
-    my $cmp_v = $need_class->VERSION;
-    if ($min_v and $cmp_v < $min_v) {
-        diag("Could not load correct version of $need_class for testing "
-             ."(got: $cmp_v, needed at least $min_v)");
-        return;
-    }
-    $cmp_v =~ s/_//;
-    $cmp_v = sprintf("%.2f", int($cmp_v*100)/100);
-    my %compat_versions = map {$_ => 1} $Class->_test_compat();
-    if (not defined $cmp_v or not exists $compat_versions{$cmp_v}) {
-        diag("Could not load correct version of $need_class for testing "
-             ."(got: $cmp_v, needed any of ".join(", ", keys 
%compat_versions).")");
-        return();
+        $cmp_v =~ s/_//;
+        $cmp_v = sprintf("%.2f", int($cmp_v*100)/100);
+        my %compat_versions = map {$_ => 1} $Class->_test_compat();
+        if (not defined $cmp_v or not exists $compat_versions{$cmp_v}) {
+            diag("Could not load correct version of $class for testing "
+                 ."(got: $cmp_v, needed any of ".join(", ", keys 
%compat_versions).")");
+            return();
+        }
     }
+
     return 1;
 }
 
@@ -1054,6 +1055,8 @@
     my ($ename, $opt, $encode_decode_callbacks) = @_;
     require Data::Dumper;
 
+    my $failed = 0;
+
     my $decoder = Sereal::Decoder->new($opt);
     my $encoder = Sereal::Encoder->new($opt);
     my %seen_name;
@@ -1061,6 +1064,11 @@
     foreach my $rt (@RoundtripTests) {
         my ($name, $data) = @$rt;
 
+        if ($failed > 20) {
+            fail("too many test failures to continue");
+            last;
+        }
+
         TODO:
         foreach my $meth (
               ['object-oriented',
@@ -1089,13 +1097,15 @@
             eval {$encoded = $enc->($data); 1}
                 or do {
                     my $err = $@ || 'Zombie error';
-                    diag("Got error while encoding: $err");
+                    fail("$name ($ename, $mname, encoding failed)");
+                    $failed++;
                 };
 
             defined($encoded)
                 or do {
                     fail("$name ($ename, $mname, encoded defined)");
                     debug_checks(\$data, \$encoded, undef);
+                    $failed++;
                     next; #test
                 };
 
@@ -1103,13 +1113,16 @@
             eval {$decoded = $dec->($encoded); 1}
                 or do {
                     my $err = $@ || 'Zombie error';
-                    diag("Got error while decoding: $err");
+                    fail("$name ($ename, $mname, decoding failed)");
+                    $failed++;
+                    next;
                 };
 
             defined($decoded) == defined($data)
                 or do {
                     fail("$name ($ename, $mname, decoded definedness)");
                     debug_checks(\$data, \$encoded, undef);
+                    $failed++;
                     next; #test
                 };
 
@@ -1118,13 +1131,15 @@
             eval {$encoded2 = $enc->($decoded); 1}
                 or do {
                     my $err = $@ || 'Zombie error';
-                    diag("Got error while encoding the second time: $err");
+                    fail("$name ($ename, $mname, second encoding failed)");
+                    $failed++;
+                    next; #test
                 };
 
             defined $encoded2
                 or do {
                     fail("$name ($ename, $mname, encoded2 defined)");
-                    debug_checks(\$data, \$encoded, \$decoded);
+                    $failed++;
                     next; #test
                 };
 
@@ -1132,13 +1147,15 @@
             eval {$decoded2 = $dec->($encoded2); 1}
                 or do {
                     my $err = $@ || 'Zombie error';
-                    diag("Got error while decoding the second time: $err");
-                    # hobodecode($encoded2);
+                    fail("$name ($ename, $mname, second decoding failed)");
+                    $failed++;
+                    next; #test
                 };
 
             defined($decoded2) == defined($data)
                 or do {
                     fail("$name ($ename, $mname, decoded2 defined)");
+                    $failed++;
                     next; #test
                 };
 
@@ -1147,13 +1164,15 @@
             eval {$encoded3 = $enc->($decoded2); 1}
                 or do {
                     my $err = $@ || 'Zombie error';
-                    diag("Got error while encoding the third time: $err");
+                    fail("$name ($ename, $mname, third encoding failed)");
+                    $failed++;
+                    next; #test
                 };
 
             defined $encoded3
                 or do {
                     fail("$name ($ename, $mname, encoded3 defined)");
-                    debug_checks(\$data, \$encoded, \$decoded);
+                    $failed++;
                     next; #test
                 };
 
@@ -1161,31 +1180,38 @@
             eval {$decoded3 = $dec->($encoded3); 1}
                 or do {
                     my $err = $@ || 'Zombie error';
-                    diag("Got error while decoding the third time: $err");
+                    fail("$name ($ename, $mname, third decoding failed)");
+                    $failed++;
+                    next; #test
                 };
 
             defined($decoded3) == defined($data)
                 or do {
                     fail("$name ($ename, $mname, decoded3 defined)");
+                    $failed++;
                     next; #test
                 };
 
-            deep_cmp($decoded, $data,       "$name ($ename, $mname, decoded vs 
data)") or next; #test
-            deep_cmp($decoded2, $data,      "$name ($ename, $mname, decoded2 
vs data)") or next; #test
-            deep_cmp($decoded2, $decoded,   "$name ($ename, $mname, decoded2 
vs decoded)") or next; #test
-
-            deep_cmp($decoded3, $data,      "$name ($ename, $mname, decoded3 
vs data)") or next; #test
-            deep_cmp($decoded3, $decoded,   "$name ($ename, $mname, decoded3 
vs decoded)") or next; #test
-            deep_cmp($decoded3, $decoded2,  "$name ($ename, $mname, decoded3 
vs decoded2)") or next; #test
+            deep_cmp($decoded, $data,       "$name ($ename, $mname, decoded vs 
data)")
+                or do { $failed++; next }; #test
+            deep_cmp($decoded2, $data,      "$name ($ename, $mname, decoded2 
vs data)")
+                or do { $failed++; next }; #test
+            deep_cmp($decoded2, $decoded,   "$name ($ename, $mname, decoded2 
vs decoded)")
+                or do { $failed++; next }; #test
+            deep_cmp($decoded3, $data,      "$name ($ename, $mname, decoded3 
vs data)")
+                or do { $failed++; next }; #test
+            deep_cmp($decoded3, $decoded,   "$name ($ename, $mname, decoded3 
vs decoded)")
+                or do { $failed++; next }; #test
+            deep_cmp($decoded3, $decoded2,  "$name ($ename, $mname, decoded3 
vs decoded2)")
+                or do { $failed++; next }; #test
 
             if ( $ename =~ /canon/ ) {
-                deep_cmp($encoded2, $encoded,  "$name ($ename, $mname, 
encoded2 vs encoded)") or do {
-                    diag Dumper($encoded2);
-                    diag Dumper($encoded);
-                    next; #test
-                };
-                deep_cmp($encoded3, $encoded2, "$name ($ename, $mname, 
encoded3 vs encoded2)") or next; #test
-                deep_cmp($encoded3, $encoded,  "$name ($ename, $mname, 
encoded3 vs encoded)") or next; #test
+                deep_cmp($encoded2, $encoded,  "$name ($ename, $mname, 
encoded2 vs encoded)")
+                    or do { $failed++; next }; #test
+                deep_cmp($encoded3, $encoded2, "$name ($ename, $mname, 
encoded3 vs encoded2)")
+                    or do { $failed++; next }; #test
+                deep_cmp($encoded3, $encoded,  "$name ($ename, $mname, 
encoded3 vs encoded)")
+                    or do { $failed++; next }; #test
 
                 if ($ENV{SEREAL_TEST_SAVE_OUTPUT} and $mname eq 
'object-oriented') {
                     use File::Path;
@@ -1237,13 +1263,13 @@
 # For bootstrapping other language implementations' tests
 our $COMPRESS;
 sub write_test_files {
-    my $dir = shift;
+    my ($dir, $version) = @_;
     require File::Path;
     File::Path::mkpath($dir);
     my $make_data_file_name = sub {File::Spec->catfile($dir, 
sprintf("test_data_%05u", shift))};
     my $make_name_file_name = sub {File::Spec->catfile($dir, 
sprintf("test_name_%05u", shift))};
 
-    setup_tests();
+    setup_tests($version);
     foreach my $testno (1..@BasicTests) {
         my $t = $BasicTests[$testno-1];
         my $data = ref($t->[1]) eq 'CODE' ? $t->[1]->() : $t->[1];


Reply via email to