Clone

 view release on metacpan or  search on metacpan

t/12-memleak.t  view on Meta::CPAN

    my $before = get_rss_kb();
    SKIP: {
        skip "Cannot measure RSS on this platform", 1 unless defined $before;
        for (1..100_000) {
            my $tmp = $data->{no_such_key};
            clone($tmp);
        }
        my $after = get_rss_kb();
        my $delta = $after - $before;
        ok($delta < 2000, "clone via intermediate variable does not leak (delta: ${delta} KB)")
            or diag("Memory grew by $delta KB over 100K iterations");
    }
}

# Test 5: direct hash miss should not leak (the actual bug from GH #42)
{
    my $data = {};
    my $before = get_rss_kb();
    SKIP: {
        skip "Cannot measure RSS on this platform", 1 unless defined $before;
        for (1..100_000) {
            Clone::clone($data->{no_such_key});
        }
        my $after = get_rss_kb();
        my $delta = $after - $before;
        ok($delta < 2000, "clone of hash miss does not leak (delta: ${delta} KB)")
            or diag("Memory grew by $delta KB over 100K iterations — GH #42 regression");
    }
}

# Test 6: populated hash, direct miss should not leak
{
    my %hash = (a => 1, b => 2, c => 3);
    my $before = get_rss_kb();
    SKIP: {
        skip "Cannot measure RSS on this platform", 1 unless defined $before;
        for (1..100_000) {
            Clone::clone($hash{nonexistent});
        }
        my $after = get_rss_kb();
        my $delta = $after - $before;
        ok($delta < 2000, "clone of hash miss on populated hash does not leak (delta: ${delta} KB)")
            or diag("Memory grew by $delta KB over 100K iterations");
    }
}

# Test 7: clone of existing hash key should work fine and not leak
{
    my %hash = (key => "value");
    my $result = clone($hash{key});
    is($result, "value", "clone of existing hash key returns correct value");
}



( run in 1.369 second using v1.01-cache-2.11-cpan-71847e10f99 )