Protocol-DBus
view release on metacpan or search on metacpan
t/Protocol-DBus-Marshal.t view on Meta::CPAN
in => [ 'i', [ -8 ] ],
out => pack( 'l<', -8 ),
},
{
in => [ 'u', [ 127 ] ],
out => pack( 'L<', 127 ),
},
{
in => [ 'd', [ 127.46 ] ],
out => pack( 'd<', 127.46 ),
},
#----------------------------------------------------------------------
{
in => [ 'g', [ 'ybn' ] ],
out => "\x03ybn\0",
},
{
in => [ 's',[ 'ybn' ] ],
out => "\x03\0\0\0ybn\0",
},
{
in => [ 's', [ do { use utf8; "é" } ] ],
out => "\x02\0\0\0é\0",
},
{
in => [ 's', [ "é" ] ],
out => "\x04\0\0\0" . do { utf8::encode(my $v = 'é'); $v } . "\0",
},
{
in => [ 'o',[ '/yb' ] ],
out => "\x03\0\0\0/yb\0",
},
#----------------------------------------------------------------------
( $can_64
? (
{
in => [ 'at', [ [5] ] ],
out => "\x08\0\0\0" . "\0\0\0\0" . "\x05\0\0\0\0\0\0\0",
},
{
in => [ 't', [ 5 ] ],
out => "\x05\0\0\0\0\0\0\0",
},
{
in => [ '(t)', [ [5] ] ],
out => "\x05\0\0\0\0\0\0\0",
},
)
: ()
),
{
in => [ v => [ [ o => '/org/freedesktop/NetworkManager' ] ] ],
out => "\1o\0\0\37\0\0\0/org/freedesktop/NetworkManager\0",
},
{
in => [ '(s)', [ ['hello'] ] ],
out => "\5\0\0\0hello\0",
},
{
in => [ '(ss)', [ ['hello', 'there'] ] ],
out => "\5\0\0\0hello\0" . "\0\0". "\5\0\0\0there\0",
},
{
in => [
'ua(yv)',
[
127,
[
[ 1 => [ o => '/org/freedesktop/NetworkManager' ] ],
[ 3 => [ s => 'Introspect' ] ],
[ 2 => [ s => 'org.freedesktop.DBus.Introspectable' ] ],
[ 6 => [ s => 'org.freedesktop.NetworkManager' ] ],
],
],
],
out => "\x7f\0\0\0\227\0\0\0\1\1o\0\37\0\0\0/org/freedesktop/NetworkManager\0\3\1s\0\n\0\0\0Introspect\0\0\0\0\0\0\2\1s\0#\0\0\0org.freedesktop.DBus.Introspectable\0\0\0\0\0\6\1s\0\36\0\0\0org.freedesktop.NetworkManager\0",
},
{
in => [
'uua(yv)',
[
2,
127,
[
[ 1 => [ o => '/org/freedesktop/NetworkManager' ] ],
[ 3 => [ s => 'Introspect' ] ],
[ 2 => [ s => 'org.freedesktop.DBus.Introspectable' ] ],
[ 6 => [ s => 'org.freedesktop.NetworkManager' ] ],
],
],
],
out => "\2\0\0\0\x7f\0\0\0\227\0\0\0\0\0\0\0\1\1o\0\37\0\0\0/org/freedesktop/NetworkManager\0\3\1s\0\n\0\0\0Introspect\0\0\0\0\0\0\2\1s\0#\0\0\0org.freedesktop.DBus.Introspectable\0\0\0\0\0\6\1s\0\36\0\0\0org.freedesktop.NetworkManager\0",
},
{
in => [
'uua{yv}',
[
127,
2,
{
1 => [ o => '/org/freedesktop/NetworkManager' ],
},
],
],
out => "\x7f\0\0\0\2\0\0\0(\0\0\0\0\0\0\0\1\1o\0\37\0\0\0/org/freedesktop/NetworkManager\0",
},
# Note the reuse of index 1 (STDOUT).
{
in => [
'hhyh',
[ \*STDERR, \*STDOUT, 2, \*STDOUT ],
],
out => "\0\0\0\0\1\0\0\0\x02\0\0\0\1\0\0\0",
out_fds => [ map { fileno $_ } (\*STDERR, \*STDOUT) ],
},
);
for my $t (@marshal_le_tests) {
my ($out_sr, $out_fds) = Protocol::DBus::Marshal::marshal_le( @{ $t->{'in'} } );
is(
$$out_sr,
$t->{'out'},
'marshal_le(): ' . _terse_dump($t->{'in'}),
) or diag _terse_dump( [ got => $out_sr, wanted => $t->{'out'} ] );
if ($t->{'out_fds'}) {
is_deeply(
$out_fds,
$t->{'out_fds'},
'... and associated file handles',
);
}
}
#done_testing();
#exit;
#----------------------------------------------------------------------
my @positive_le_tests = (
{
in => ["\x0a\0\0\0", 0, 'u'],
out => [ [10], 4 ],
},
{
in => [ "\x02\0\0\0é\0", 0, 's'],
out => [ [ do { use utf8; "é" } ], 7 ],
},
{
in => [
"\x04\0\0\0" . do { utf8::encode(my $v = 'é'); $v } . "\0",
0,
's',
],
out => [ [ "é" ], 9 ],
},
{
in => ["\0\0\0\0\x0a\0\0\0", 1, 'u'],
out => [ [10], 7 ],
},
{
in => ["\x02\0\0\0hi\0" . "\0" . "\x04\0". "\x02\0", 0, '(s(qq))'],
out => [
[ all(
noclass( [ 'hi', all(
noclass( [ 4, 2 ] ),
Isa('Protocol::DBus::Type::Struct'),
) ] ),
Isa('Protocol::DBus::Type::Struct'),
) ],
12,
],
},
{
in => [ "\x08\0\0\0" . "\0\0\0\0" . "\x05\0\0\0\0\0\0\0", 0, 'at' ],
out => [
[ all(
noclass([ 5 ]),
Isa('Protocol::DBus::Type::Array'),
) ],
16,
],
},
{
in => [ "\0\0\0\0" . "\x08\0\0\0" . "\x05\0\0\0\0\0\0\0", 4, 'at' ],
out => [
[ all(
noclass([ 5 ]),
Isa('Protocol::DBus::Type::Array'),
) ],
12,
],
},
{
in => ["\0\0\0\0" . "\x08\0\0\0" . "\x0a\0\0\0" . "\0\1\0\0", 2, 'au'],
out => [
[ all(
noclass([ 10, 256 ]),
Isa('Protocol::DBus::Type::Array'),
) ],
14,
],
},
{
in => ["\0\0\0\0" . "\x10\0\0\0" . "\x0a\0\0\0" . "\0\1\0\0" . "\x02\0\0\0" . "\x10\0\0\0", 2, 'a{uu}'],
out => [
[ all(
Isa('Protocol::DBus::Type::Dict'),
noclass( { 10 => 256, 2 => 16 } ),
) ],
22,
],
},
{
in => ["\0\0\0\0\237\0\0\0\1\1o\0.\0\0\0/org/freedesktop/systemd1/unit/spamd_2eservice\0\0\3\1s\0\6\0\0\0GetAll\0\0\2\1s\0\37\0\0\0org.freedesktop.DBus.Properties\0\6\1s\0\30\0\0\0org.freedesktop.systemd1\0\0\0\0\0\0\0\0\10\1g\0\1s\0\0", 1, '...
out => [
[ all(
Isa('Protocol::DBus::Type::Array'),
noclass( [
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
1,
'/org/freedesktop/systemd1/unit/spamd_2eservice',
] ),
),
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
3,
'GetAll',
] ),
),
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
2,
'org.freedesktop.DBus.Properties',
] ),
),
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
6,
'org.freedesktop.systemd1',
] ),
),
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
8,
's',
] ),
),
] ),
) ],
166,
],
},
{
in => ["l\1\0\1\5\0\0\0\1\0\0\0\237\0\0\0\1\1o\0.\0\0\0/org/freedesktop/systemd1/unit/spamd_2eservice\0\0\3\1s\0\6\0\0\0GetAll\0\0\2\1s\0\37\0\0\0org.freedesktop.DBus.Properties\0\6\1s\0\30\0\0\0org.freedesktop.systemd1\0\0\0\0\0\0\0\0\10\1g\...
out => [
[
108,
1,
0,
1,
5,
1,
all(
Isa('Protocol::DBus::Type::Array'),
noclass( [
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
1,
'/org/freedesktop/systemd1/unit/spamd_2eservice',
] ),
),
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
3,
'GetAll',
] ),
),
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
2,
'org.freedesktop.DBus.Properties',
] ),
),
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
6,
'org.freedesktop.systemd1',
] ),
),
all(
Isa('Protocol::DBus::Type::Struct'),
noclass( [
8,
's',
] ),
),
] ),
),
],
175,
],
},
);
for my $t (@positive_le_tests) {
my ($buf, $buf_offset, $sig) = @{ $t->{'in'} };
my $str = _str_for_buf_offset_sig( $buf, $buf_offset, $sig);
#$str .= "] â [" . join(', ', map { Dumper($_) } @{ $t->{'out'} } ) . ']';
my ($data, $offset_delta) = Protocol::DBus::Marshal::unmarshal_le(\$buf, $buf_offset, $sig);
cmp_deeply(
[$data, $offset_delta],
$t->{'out'},
"unmarshal_le: $str",
) or diag explain [$data, $offset_delta];
}
sub _str_for_buf_offset_sig {
my ($buf, $buf_offset, $sig) = @_;
return '[' . join(', ', _terse_dump($buf), $buf_offset, $sig) . ']';
}
sub _terse_dump {
my ($thing) = @_;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Indent = 0;
local $Data::Dumper::Useqq = 1;
return Dumper($thing);
}
#----------------------------------------------------------------------
done_testing();
( run in 1.134 second using v1.01-cache-2.11-cpan-5837b0d9d2c )