The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

BEGIN {
  unless ($ENV{AUTHOR_TESTING}) {
    print "1..0 # SKIP these tests are for testing by the author\n";
    exit
  }
}


use strict;
use warnings;

use Test::More;
BEGIN {
    plan skip_all => 'memory leak test is linux-specific' unless $^O eq 'linux';
}

plan tests => 2;

use lib 'lib';

use t::Utils;
rebuild_tfiles();

use Ubic;

local_ubic( service_dirs => [qw( t/service/freaks )] );

# These tests check that ubic-ping don't waste memory in long runs.
# Ubic compiles service descriptions on-the-fly, every time with new package name, so memory leaks are possible.
# They happened before and can come back again after some unfortunate refactoring...
# (currently, Ubic caches every service instance forever, though, and ubic-ping don't compile simple services at all, just multiservices).

sub mem_usage {
    my $stat = slurp("/proc/$$/statm");
    my ($mem) = $stat =~ /^(\d+)/;
    return $mem;
}

{
    my $check_status = sub {
        my $status = Ubic->cached_status('multi-broken.abc');
    };

    $check_status->();

    my $mem = mem_usage;
    $check_status->() for 1..10_000;

    cmp_ok(mem_usage() - $mem, '<', 50);
}

{
    my $check_status = sub {
        eval {
            my $status = Ubic->cached_status('multi-broken.broken.blah');
        };
    };

    $check_status->();

    my $mem = mem_usage;
    $check_status->() for 1..10_000;

    cmp_ok(mem_usage() - $mem, '<', 50);
}