The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use Test::More;

use MozRepl::RemoteObject;

my $repl;
my $ok = eval {
    $repl = MozRepl::RemoteObject->install_bridge(
        #log => ['debug'],
        use_queue => 1,
        #max_queue_size => 1000,
    );
    1;
};
if (! $ok) {
    my $err = $@;
    plan skip_all => "Couldn't connect to MozRepl: $@";
} else {
    plan tests => 4;
};

# Number of callbacks
my $callbacks = 10000;
my $start = time;

sub genObj {
    my ($repl) = @_;
    my $rn = $repl->name;
    my $obj = $repl->expr(<<JS)
(function() {
    var res = {};
    res.foo = "bar";
    res.baz = "flirble";
    return res
})()
JS
}

my $obj = genObj($repl);
isa_ok $obj, 'MozRepl::RemoteObject::Instance';

my $called = 0;
my @events;
$obj->{oncommand} = sub {
    $called++;
    push @events, @_;
};
ok 1, "Stored callback";

my $trigger_command = $repl->declare(<<JS);
    function(c,o,m) {
        for( var i=0;i<c;i++ ){
            o.oncommand(m);
        };
    };
JS

my $setup_roundtrips = $repl->{stats}->{roundtrip};
$trigger_command->($callbacks,$obj,'from_js');
is $called, $callbacks, "We got called $callbacks times";

$repl->poll; # flush the queue
my $taken = time - $start;
$taken ||= 1;

# 2 is the magic number of roundtrips needed for triggering the callback
# We have some additional overhead based on max_queue_size, so let's be generous
# and allow for 10%
cmp_ok $repl->{stats}->{roundtrip}-$setup_roundtrips, '<', $callbacks*1.1+2,
    "Callback overhead is about 1 roundtrip per triggered callback";

use Data::Dumper;
diag Dumper $repl->{stats};

diag sprintf "%0.2f iterations/s", $repl->{stats}->{roundtrip} / $taken