407e2fd6ee28ec448d80aa93e4e73af60a551c24
[gitmo/MooseX-Storage.git] / t / 030_with_checksum.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7 use Test::Exception;
8 use Test::Deep;
9
10 BEGIN {
11     eval "use Digest; use Digest::SHA1";
12     plan skip_all => "Digest and Digest::SHA1 is required for this test" if $@;        
13     plan tests => 26;
14     use_ok('MooseX::Storage');
15 }
16
17 {
18
19     package Foo;
20     use Moose;
21     use MooseX::Storage;
22
23     with Storage(base => 'WithChecksum', format => "JSON");
24
25     has 'number' => ( is => 'ro', isa => 'Int' );
26     has 'string' => ( is => 'ro', isa => 'Str' );
27     has 'float'  => ( is => 'ro', isa => 'Num' );
28     has 'array'  => ( is => 'ro', isa => 'ArrayRef' );
29     has 'hash'   => ( is => 'ro', isa => 'HashRef' );
30     has 'object' => ( is => 'ro', isa => 'Foo' );
31 }
32
33 {
34     my $foo = Foo->new(
35         number => 10,
36         string => 'foo',
37         float  => 10.5,
38         array  => [ 1 .. 10 ],
39         hash   => { map { $_ => undef } ( 1 .. 10 ) },
40         object => Foo->new( number => 2 ),
41     );
42     isa_ok( $foo, 'Foo' );
43     
44     my $packed = $foo->pack;
45     
46     cmp_deeply(
47         $packed,
48         {
49             __CLASS__ => 'Foo',
50             __DIGEST__  => re('[0-9a-f]+'),
51             number    => 10,
52             string    => 'foo',
53             float     => 10.5,
54             array     => [ 1 .. 10 ],
55             hash      => { map { $_ => undef } ( 1 .. 10 ) },
56             object    => { 
57                             __CLASS__ => 'Foo', 
58                             __DIGEST__  => re('[0-9a-f]+'),               
59                             number    => 2 
60                          },            
61         },
62         '... got the right frozen class'
63     );
64
65     my $foo2;
66     lives_ok {
67         $foo2 = Foo->unpack($packed);
68     } '... unpacked okay';
69     isa_ok($foo2, 'Foo');
70     
71     cmp_deeply(
72         $foo2->pack,
73         {
74             __CLASS__ => 'Foo',
75             __DIGEST__  => re('[0-9a-f]+'),
76             number    => 10,
77             string    => 'foo',
78             float     => 10.5,
79             array     => [ 1 .. 10 ],
80             hash      => { map { $_ => undef } ( 1 .. 10 ) },
81             object    => { 
82                             __CLASS__ => 'Foo', 
83                             __DIGEST__  => re('[0-9a-f]+'),               
84                             number    => 2 
85                          },            
86         },
87         '... got the right frozen class'
88     );    
89 }
90
91 {
92     my $foo = Foo->new(
93         number => 10,
94         string => 'foo',
95         float  => 10.5,
96         array  => [ 1 .. 10 ],
97         hash   => { map { $_ => undef } ( 1 .. 10 ) },
98         object => Foo->new( number => 2 ),
99     );
100     isa_ok( $foo, 'Foo' );
101
102     my $frozen = $foo->freeze;
103
104     ok( length($frozen), "got frozen data" );
105
106     $frozen =~ s/foo/bar/;
107
108     my $foo2 = eval { Foo->thaw( $frozen ) };
109     my $e = $@;
110
111     ok( !$foo2, "not thawed" );
112     ok( $e, "has error" );
113     like( $e, qr/bad checksum/i, "bad checksum error" );
114 }
115
116 SKIP: {
117     eval { require Digest::HMAC_SHA1 };
118     skip join( " ", "no Digest::HMAC", ( $@ =~ /\@INC/ ? () : do { chomp(my $e = $@); "($e)" } ) ), 14 if $@;
119
120     local $::DEBUG = 1;
121
122     my $foo = Foo->new(
123         number => 10,
124         string => 'foo',
125         float  => 10.5,
126         array  => [ 1 .. 10 ],
127         hash   => { map { $_ => undef } ( 1 .. 10 ) },
128         object => Foo->new( number => 2 ),
129     );
130     isa_ok( $foo, 'Foo' );
131
132     my $frozen1 = $foo->freeze( digest => [ "HMAC_SHA1", "secret" ] );
133     ok( length($frozen1), "got frozen data" );
134
135     $::DEBUG = 0;
136
137     my $d2 = Digest::HMAC_SHA1->new("s3cr3t");
138
139     my $frozen2 = $foo->freeze( digest => $d2 );
140     ok( length($frozen2), "got frozen data" );
141
142     cmp_ok( $frozen1, "ne", $frozen2, "versions are different" );
143
144     is( $frozen1, $foo->freeze( digest => [ HMAC_SHA1 => "secret" ] ), "refreeze" );
145
146 $::DEBUG = 1;
147
148     my $foo1 = eval { Foo->thaw( $frozen1, digest => [ "HMAC_SHA1", "secret" ] ) };
149     my $e = $@;
150
151     ok( $foo1, "thawed" );
152     ok( !$e, "no error" ) || diag $e;
153
154     my $foo2 = eval { Foo->thaw( $frozen2, digest => $d2 ) };
155     $e = $@;
156
157     ok( $foo2, "thawed" );
158     ok( !$e, "no error" ) || diag $e;
159
160     $foo1 = eval { Foo->thaw( $frozen1, digest => $d2 ) };
161     $e = $@;
162
163     ok( !$foo1, "not thawed" );
164     ok( $e, "has error" );
165     like( $e, qr/bad checksum/i, "bad checksum error" );
166
167     $frozen1 =~ s/foo/bar/;
168
169     $foo1 = eval { Foo->thaw( $frozen1, digest => [ "HMAC_SHA1", "secret" ] ) };
170     $e = $@;
171
172     ok( !$foo1, "not thawed" );
173     ok( $e, "has error" );
174     like( $e, qr/bad checksum/i, "bad checksum error" );
175 }