summaryrefslogtreecommitdiff
path: root/author_t/leaks.t
diff options
context:
space:
mode:
Diffstat (limited to 'author_t/leaks.t')
-rw-r--r--author_t/leaks.t75
1 files changed, 75 insertions, 0 deletions
diff --git a/author_t/leaks.t b/author_t/leaks.t
new file mode 100644
index 0000000..f3c811b
--- /dev/null
+++ b/author_t/leaks.t
@@ -0,0 +1,75 @@
+#!perl
+use strict;
+use warnings;
+package Foo;{
+use Moose;
+use Data::MultiValued::AttributeTrait::Ranges;
+
+with 'Data::MultiValued::UglySerializationHelperRole';
+
+has rr => (
+ is => 'rw',
+ isa => 'Str',
+ traits => ['MultiValued::Ranges'],
+ predicate => 'has_rr',
+ clearer => 'clear_rr',
+);
+
+}
+package main;
+use Test::Most 'die';
+use Data::Printer;
+use JSON::XS;
+BEGIN { $ENV{DEBUG_MEM}=1 };
+use Dash::Leak;
+
+my $ropts={from=>10,to=>20};
+
+my $json = JSON::XS->new->utf8;
+my $obj = Foo->new(rr=>'foo');
+$obj->rr_multi($ropts,777);
+
+subtest 'serialisation memory leak' => sub {
+ $obj=Foo->new_in_place($json->decode($json->encode($obj->as_hash)));
+ leaksz 'start memory leak';
+ for my $iter (0..2000) {
+ $obj=Foo->new_in_place($json->decode($json->encode($obj->as_hash)));
+ }
+ leaksz 'stop memory leak';
+ ok(1,'done');
+};
+
+subtest 'accessor memory leak' => sub {
+ leaksz 'start memory leak';
+ for my $iter (0..1000) {
+ $obj->rr_multi({at=>35});
+ }
+ leaksz 'stop memory leak non-exist';
+ leaksz '...';
+ for my $iter (0..1000) {
+ $obj->rr_multi({at=>15});
+ }
+ leaksz 'stop memory leak exist';
+
+ ok(1,'done');
+};
+
+subtest 'inner memory leak' => sub {
+ my $cont = $obj->{rr__MULTIVALUED_STORAGE__}
+ {_storage};
+
+ leaksz 'start memory leak';
+ for my $iter (0..1000) {
+ eval { $cont->get({at=>35}) }
+ }
+ leaksz 'stop memory leak non-exist';
+ leaksz '...';
+ for my $iter (0..1000) {
+ $cont->get({at=>15});
+ }
+ leaksz 'stop memory leak exist';
+
+ ok(1,'done');
+};
+
+done_testing();