278 lines
7.8 KiB
Perl
278 lines
7.8 KiB
Perl
|
use Test::More qw( no_plan );
|
||
|
use strict;
|
||
|
|
||
|
BEGIN { use_ok('Device::iPod'); }
|
||
|
require_ok('Device::iPod');
|
||
|
|
||
|
my $ipod = Device::iPod->new();
|
||
|
my $m;
|
||
|
my ($l, $c, $p);
|
||
|
|
||
|
isa_ok($ipod, 'Device::iPod');
|
||
|
|
||
|
$ipod->{-debug} = 1;
|
||
|
$ipod->open("/dev/ttyUSB0");
|
||
|
|
||
|
$m = $ipod->sendraw("\xFF" x 16); # Wake up and sync
|
||
|
ok($m == 1, "Wakeup sent");
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# IdentifyDeviceLingoes(lingos=0x01, options=0x00, deviceid=0x00)
|
||
|
# We expect an ACK OK message as response
|
||
|
$m = $ipod->sendmsg(0x00, 0x13, "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00");
|
||
|
ok($m == 1, "IdentifyDeviceLingoes(lingos=0x01, options=0x00, deviceid=0x00) sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK OK" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
is($p, "\x00\x13", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestRemoteUIMode
|
||
|
# We expect an ACK Bad Parameter as response, as we have not
|
||
|
# negotiated lingo 0x04
|
||
|
$m = $ipod->sendmsg(0x00, 0x03);
|
||
|
ok($m == 1, "RequestRemoteUIMode sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK Bad Parameter" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
is($p, "\x04\x03", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# EnterRemoteUIMode
|
||
|
# We expect an ACK Bad Parameter as response, as we have not
|
||
|
# negotiated lingo 0x04
|
||
|
$m = $ipod->sendmsg(0x00, 0x05);
|
||
|
ok($m == 1, "EnterRemoteUIMode sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK Bad Parameter" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
is($p, "\x04\x05", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# ExitRemoteUIMode
|
||
|
# We expect an ACK Bad Parameter as response, as we have not
|
||
|
# negotiated lingo 0x04
|
||
|
$m = $ipod->sendmsg(0x00, 0x06);
|
||
|
ok($m == 1, "ExitRemoteUIMode sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK Bad Parameter" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
is($p, "\x04\x06", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestiPodName
|
||
|
# We expect a ReturniPodName packet
|
||
|
$m = $ipod->sendmsg(0x00, 0x07);
|
||
|
ok($m == 1, "RequestiPodName sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ReturniPodName" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x08, "Response command");
|
||
|
like($p, "/^[^\\x00]*\\x00\$/", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestiPodSoftwareVersion
|
||
|
# We expect a ReturniPodSoftwareVersion packet
|
||
|
$m = $ipod->sendmsg(0x00, 0x09);
|
||
|
ok($m == 1, "RequestiPodSoftwareVersion sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ReturniPodSoftwareVersion" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x0A, "Response command");
|
||
|
like($p, "/^...\$/", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestiPodSerialNumber
|
||
|
# We expect a ReturniPodSerialNumber packet
|
||
|
$m = $ipod->sendmsg(0x00, 0x0B);
|
||
|
ok($m == 1, "RequestiPodSerialNumber sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ReturniPodSerialNumber" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x0C, "Response command");
|
||
|
like($p, "/^[^\\x00]*\\x00\$/", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestiPodModelNum
|
||
|
# We expect a ReturniPodModelNum packet
|
||
|
$m = $ipod->sendmsg(0x00, 0x0D);
|
||
|
ok($m == 1, "RequestiPodModelNum sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ReturniPodModelNum" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x0E, "Response command");
|
||
|
like($p, "/^....[^\\x00]*\\x00\$/", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestLingoProtocolVersion(lingo=0x00)
|
||
|
# We expect a ReturnLingoProtocolVersion packet
|
||
|
$m = $ipod->sendmsg(0x00, 0x0F, "\x00");
|
||
|
ok($m == 1, "RequestLingoProtocolVersion(lingo=0x00) sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ReturnLingoProtocolVersion" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x10, "Response command");
|
||
|
like($p, "/^\\x00..\$/", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# IdentifyDeviceLingoes(lingos=0x11, options=0x00, deviceid=0x00)
|
||
|
# We expect an ACK OK message as response
|
||
|
$m = $ipod->sendmsg(0x00, 0x13, "\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00");
|
||
|
ok($m == 1, "IdentifyDeviceLingoes(lingos=0x11, options=0x00, deviceid=0x00) sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK OK" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
is($p, "\x00\x13", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestRemoteUIMode
|
||
|
# We expect an ReturnRemoteUIMode packet specifying standard mode
|
||
|
$m = $ipod->sendmsg(0x00, 0x03);
|
||
|
ok($m == 1, "RequestRemoteUIMode sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ReturnRemoteUIMode" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x04, "Response command");
|
||
|
is($p, "\x00", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# EnterRemoteUIMode
|
||
|
# We expect an ACK Pending packet, followed by an ACK OK packet
|
||
|
$m = $ipod->sendmsg(0x00, 0x05);
|
||
|
ok($m == 1, "EnterRemoteUIMode sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK Pending" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
like($p, "/^\\x06\\x05/", "Response payload");
|
||
|
};
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK OK" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
is($p, "\x00\x05", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestRemoteUIMode
|
||
|
# We expect an ReturnRemoteUIMode packet specifying extended mode
|
||
|
$m = $ipod->sendmsg(0x00, 0x03);
|
||
|
ok($m == 1, "RequestRemoteUIMode sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ReturnRemoteUIMode" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x04, "Response command");
|
||
|
isnt($p, "\x00", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# ExitRemoteUIMode
|
||
|
# We expect an ACK Pending packet, followed by an ACK OK packet
|
||
|
$m = $ipod->sendmsg(0x00, 0x06);
|
||
|
ok($m == 1, "ExitRemoteUIMode sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK Pending" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
like($p, "/^\\x06\\x06/", "Response payload");
|
||
|
};
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK OK" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
is($p, "\x00\x06", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# RequestRemoteUIMode
|
||
|
# We expect an ReturnRemoteUIMode packet specifying standard mode
|
||
|
$m = $ipod->sendmsg(0x00, 0x03);
|
||
|
ok($m == 1, "RequestRemoteUIMode sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ReturnRemoteUIMode" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x04, "Response command");
|
||
|
is($p, "\x00", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|
||
|
|
||
|
# Send an undefined command
|
||
|
# We expect an ACK Bad Parameter as response
|
||
|
$m = $ipod->sendmsg(0x00, 0xFF);
|
||
|
ok($m == 1, "Undefined command sent");
|
||
|
($l, $c, $p) = $ipod->recvmsg();
|
||
|
subtest "ACK Bad Parameter" => sub {
|
||
|
ok(defined($l), "Response received");
|
||
|
is($l, 0x00, "Response lingo");
|
||
|
is($c, 0x02, "Response command");
|
||
|
is($p, "\x04\xFF", "Response payload");
|
||
|
};
|
||
|
|
||
|
# Empty the buffer
|
||
|
$ipod->emptyrecv();
|