Add mysteriously-missing Bool handling
[gitmo/MooseX-Storage.git] / t / 030_with_checksum.t
CommitLineData
c4a322ec 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
c86a46cc 6use Test::More;
c4a322ec 7use Test::Exception;
8use Test::Deep;
9
10BEGIN {
bc0c5bf9 11 eval "use Digest; use Digest::SHA1";
a7f358fb 12 plan skip_all => "Digest and Digest::SHA1 is required for this test" if $@;
27444b02 13 plan tests => 26;
c4a322ec 14 use_ok('MooseX::Storage');
15}
16
17{
18
19 package Foo;
20 use Moose;
21 use MooseX::Storage;
22
98ae09f0 23 with Storage(base => 'WithChecksum', format => "JSON");
c4a322ec 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',
98ae09f0 50 __DIGEST__ => re('[0-9a-f]+'),
c4a322ec 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',
98ae09f0 58 __DIGEST__ => re('[0-9a-f]+'),
c4a322ec 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',
98ae09f0 75 __DIGEST__ => re('[0-9a-f]+'),
c4a322ec 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',
98ae09f0 83 __DIGEST__ => re('[0-9a-f]+'),
c4a322ec 84 number => 2
85 },
86 },
87 '... got the right frozen class'
88 );
c4a322ec 89}
90
98ae09f0 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
116SKIP: {
117 eval { require Digest::HMAC_SHA1 };
118 skip join( " ", "no Digest::HMAC", ( $@ =~ /\@INC/ ? () : do { chomp(my $e = $@); "($e)" } ) ), 14 if $@;
119
34dcaa5d 120 local $::DEBUG = 1;
121
98ae09f0 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
a6ebb4c8 132 my $frozen1 = $foo->freeze( digest => [ "HMAC_SHA1", "secret" ] );
98ae09f0 133 ok( length($frozen1), "got frozen data" );
134
34dcaa5d 135 $::DEBUG = 0;
136
98ae09f0 137 my $d2 = Digest::HMAC_SHA1->new("s3cr3t");
138
a6ebb4c8 139 my $frozen2 = $foo->freeze( digest => $d2 );
98ae09f0 140 ok( length($frozen2), "got frozen data" );
141
142 cmp_ok( $frozen1, "ne", $frozen2, "versions are different" );
143
34dcaa5d 144 is( $frozen1, $foo->freeze( digest => [ HMAC_SHA1 => "secret" ] ), "refreeze" );
145
146$::DEBUG = 1;
147
a6ebb4c8 148 my $foo1 = eval { Foo->thaw( $frozen1, digest => [ "HMAC_SHA1", "secret" ] ) };
98ae09f0 149 my $e = $@;
150
151 ok( $foo1, "thawed" );
152 ok( !$e, "no error" ) || diag $e;
34dcaa5d 153
a6ebb4c8 154 my $foo2 = eval { Foo->thaw( $frozen2, digest => $d2 ) };
98ae09f0 155 $e = $@;
156
157 ok( $foo2, "thawed" );
158 ok( !$e, "no error" ) || diag $e;
159
a6ebb4c8 160 $foo1 = eval { Foo->thaw( $frozen1, digest => $d2 ) };
98ae09f0 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
a6ebb4c8 169 $foo1 = eval { Foo->thaw( $frozen1, digest => [ "HMAC_SHA1", "secret" ] ) };
98ae09f0 170 $e = $@;
171
172 ok( !$foo1, "not thawed" );
173 ok( $e, "has error" );
174 like( $e, qr/bad checksum/i, "bad checksum error" );
175}