Ancient

 view release on metacpan or  search on metacpan

t/9057-leak-object-singleton.t  view on Meta::CPAN

    eval { require Test::LeakTrace };
    plan skip_all => 'Test::LeakTrace required' if $@;
}
use Test::LeakTrace;

use object;

# Define singleton test classes
object::define('LeakSingleton1', 'config:Str', 'count:Int:default(0)');
object::singleton('LeakSingleton1');

object::define('LeakSingleton2', 'name:Str:default(default)', 'value:Int:default(0)');
object::singleton('LeakSingleton2');

object::define('LeakSingletonTyped',
    'setting:Str:default(default_setting)',
    'cache:HashRef:default({})',
);
object::singleton('LeakSingletonTyped');

# Warmup - initialize singletons
for (1..10) {
    my $s1 = LeakSingleton1->instance(config => 'warmup', count => 0);
    my $s2 = LeakSingleton2->instance();
    my $s3 = LeakSingletonTyped->instance(setting => 'init');
    $s1->count;
    $s2->value;
    $s3->setting;
}

subtest 'singleton instance no leak' => sub {
    no_leaks_ok {
        for (1..1000) {
            my $s = LeakSingleton1->instance();
        }
    } 'singleton instance no leak';
};

subtest 'singleton instance with args no leak' => sub {
    no_leaks_ok {
        for (1..1000) {
            my $s = LeakSingleton2->instance(name => 'test', value => 42);
        }
    } 'singleton instance args no leak';
};

subtest 'singleton accessor get no leak' => sub {
    my $s = LeakSingleton1->instance();
    no_leaks_ok {
        for (1..1000) {
            my $cfg = $s->config;
            my $cnt = $s->count;
        }
    } 'singleton accessor get no leak';
};

subtest 'singleton accessor set no leak' => sub {
    my $s = LeakSingleton1->instance();
    no_leaks_ok {
        for (1..1000) {
            $s->config('updated');
            $s->count(42);
        }
    } 'singleton accessor set no leak';
};

subtest 'singleton state increment no leak' => sub {
    my $s = LeakSingleton1->instance();
    $s->count(0);
    no_leaks_ok {
        for (1..1000) {
            my $c = $s->count;
            $s->count($c + 1);
        }
    } 'singleton increment no leak';
};

subtest 'singleton hash manipulation no leak' => sub {
    my $s = LeakSingletonTyped->instance(setting => 'test');
    no_leaks_ok {
        for (1..500) {
            $s->cache->{key} = 'value';
            my $v = $s->cache->{key};
            delete $s->cache->{key};
        }
    } 'singleton hash no leak';
};

subtest 'singleton multiple classes no leak' => sub {
    no_leaks_ok {
        for (1..500) {
            my $s1 = LeakSingleton1->instance();
            my $s2 = LeakSingleton2->instance();
            my $c = $s1->config;
            my $n = $s2->name;
        }
    } 'singleton multi-class no leak';
};

subtest 'singleton same instance check no leak' => sub {
    no_leaks_ok {
        for (1..500) {
            my $a = LeakSingleton1->instance();
            my $b = LeakSingleton1->instance();
            my $same = ($a == $b);
        }
    } 'singleton same instance no leak';
};

done_testing;



( run in 0.556 second using v1.01-cache-2.11-cpan-df04353d9ac )