Commit | Line | Data |
c4a322ec |
1 | #!/usr/bin/perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
c86a46cc |
6 | use Test::More; |
c4a322ec |
7 | use Test::Exception; |
8 | use Test::Deep; |
9 | |
10 | BEGIN { |
c86a46cc |
11 | eval "use Digest"; |
12 | plan skip_all => "Digest is required for this test" if $@; |
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 | |
116 | SKIP: { |
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 | } |