The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use Test::More qw/ no_plan /;
use Devel::DTrace::Provider;

SKIP: {
    skip unless Devel::DTrace::Provider::DTRACE_AVAILABLE();
 
    my $provider = Devel::DTrace::Provider->new('provider0', 'test1module');
    my $probe = $provider->add_probe('test', 'func', ['string', 'integer']);
    ok(my $probes = $provider->enable, 'Generate provider DOF');
    is(scalar keys %$probes, 1);
    ok($probes->{test});
    ok($probe->fire('foo', 42));
    ok($probes->{test}->fire('foo', 13));
    $provider->disable;

    my $probe2 = $provider->add_probe('test2', 'func', ['string', 'integer']);
    ok($probes = $provider->enable, 'Generate provider DOF');
    is(scalar keys %$probes, 2);
    ok($probes->{test});
    ok($probes->{test2});
    ok($probe->fire('foo', 42));
    ok($probes->{test}->fire('foo', 13));
    ok($probe2->fire('foo', 42));
    ok($probes->{test2}->fire('foo', 13));
    $provider->disable;

    $provider->remove_probe($probe);
    ok($probes = $provider->enable, 'Generate provider DOF');
    is(scalar keys %$probes, 1);
    ok($probes->{test2});
    $provider->disable;

    eval {
        $provider->remove_probe($probe);
    };
    like($@, qr/provider0:test1module:func:test/);
}