1#!perl 2use strict; 3use warnings; 4use Test::More; 5use File::Spec; 6use lib File::Spec->catdir(qw(t lib)); 7 8BEGIN { 9 lib->import('lib') 10 if !-d 't'; 11} 12use Sereal::TestSet qw(:all); 13use Sereal::Encoder; 14 15if ( not have_encoder_and_decoder() ) { 16 plan skip_all => 'Did not find right version of decoder'; 17 exit 0; 18} 19 20# Encoder reentrancy test courtesy of Zefram 21 22my $enc= Sereal::Encoder->new( { freeze_callbacks => 1 } ); 23 24package Foo; 25sub FREEZE { $enc->encode( $_[0]->{a} ) } 26 27sub THAW { 28 my $class= shift; 29 return bless( { a => Sereal::Decoder->new->decode( $_[1] ) } => $class ); 30} 31 32package main; 33 34my $data= bless( { a => 42 }, "Foo" ); 35my $a= $enc->encode($data); 36my $output; 37my $err; 38eval { 39 $output= Sereal::Decoder->new->decode($a); 40 1; 41} or do { 42 $err= $@ || "Zombie Error"; 43}; 44 45ok( !$err, "Decoding did not barf" ) 46 or diag("Decoding barfed with '$err'"); 47 48is_deeply( 49 $output, 50 $data, 51 "Decoded result is correct" 52); 53 54done_testing(); 55