From 08fcee389f46fa29b3c691b6dea7b5a6664633e7 Mon Sep 17 00:00:00 2001 From: Heikki Hannikainen Date: Thu, 5 Mar 2009 08:40:56 +0000 Subject: [PATCH] + new tests with unverified clients git-svn-id: http://repo.ham.fi/svn/aprsc/trunk@288 3ce903b1-3385-4e86-93cd-f9a4a239f7ac --- tests/t/21qconstr-unver.t | 116 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 tests/t/21qconstr-unver.t diff --git a/tests/t/21qconstr-unver.t b/tests/t/21qconstr-unver.t new file mode 100644 index 0000000..ff38ffd --- /dev/null +++ b/tests/t/21qconstr-unver.t @@ -0,0 +1,116 @@ +# +# Second batch of Q construct tests +# Feed packets from an unverified client +# + +use Test; +BEGIN { plan tests => 14 }; +use runproduct; +use istest; +use Ham::APRS::IS; +ok(1); # If we made it this far, we're ok. + +my $p = new runproduct('basic'); + +ok(defined $p, 1, "Failed to initialize product runner"); +ok($p->start(), 1, "Failed to start product"); + +$tx_call = "N0CALL-1"; +$server_call = "TESTING"; +$i_tx = new Ham::APRS::IS("localhost:10152", $tx_call, 'nopass' => 1); +ok(defined $i_tx, 1, "Failed to initialize Ham::APRS::IS"); + +$i_rx = new Ham::APRS::IS("localhost:10152", "N0CALL-2", 'nopass' => 1); +ok(defined $i_rx, 1, "Failed to initialize Ham::APRS::IS"); + +# connect + +$ret = $i_tx->connect('retryuntil' => 8); +ok($ret, 1, "Failed to connect to the server: " . $i_tx->{'error'}); +$ret = $i_rx->connect('retryuntil' => 8); +ok($ret, 1, "Failed to connect to the server: " . $i_rx->{'error'}); + +# +# Currently, all packets from an unverified connection, with the FROMCALL +# not matching the login call, will be dropped. Send a few of those packets +# here: if they will be forwarded, the following tests will fail. +# + +# basic packet with no Q construct +my $position = "!6028.52N/02505.61E# Testing"; +$i_tx->sendline("OH7LZB>DST:$position"); + +# basic packet with Q construct inserted by normal igate +$position .= "."; # make unique +$i_tx->sendline("OH7LZB-1>DST,qAR,$tx_call:$position"); + +# basic packet with old-style ,I construct inserted by igate +$position .= "."; # make unique +$i_tx->sendline("OH7LZB-2>DST,$tx_call,I:$position"); + +# +# If the packet entered the server from an unverified connection AND the FROMCALL +# equals the client login AND the header has been successfully converted to TCPXX +# format (per current validation algorithm): +# { +# (All packets not deemed "OK" from an unverified connection should be dropped.) +# (1) if a q construct with a single call exists in the packet +# Replace the q construct with ,qAX,SERVERLOGIN +# (2) else if more than a single call exists after the q construct +# Invalid header, drop packet as error +# (3) else +# Append ,qAX,SERVERLOGIN +# Quit q processing +# } +# +# Must send a proper position packet - unverified clients +# can only send position and WX packets. +# + +$position = "!6028.51N/02505.68E# Testing"; + +# (1) +istest::txrx(\&ok, $i_tx, $i_rx, + "$tx_call>DST,DIGI,qAR,BLAH:$position", + "$tx_call>DST,TCPXX*,qAX,$server_call:$position"); + +# (2) should be dropped, so don't expect anything +# if it's not dropped, the *next* test will fail +# NOTE: javaprssrvr seems to forward with ,qAX,SERVERLOGIN +#$position .= '.'; # make it unique +#$i_tx->sendline("$tx_call>DST,qAR,CALL1,CALL2:$position"); + +# (3) +$position .= '.'; # make it unique +istest::txrx(\&ok, $i_tx, $i_rx, + "$tx_call>DST,DIGI:$position", + "$tx_call>DST,TCPXX*,qAX,$server_call:$position"); + +$position .= '.'; +istest::txrx(\&ok, $i_tx, $i_rx, + "$tx_call>DST,DIGI1,DIGI5*,N0CALL,I:$position", + "$tx_call>DST,TCPXX*,qAX,$server_call:$position"); + + +# Although qAZ says "drop" in the end of the Q algorithm, this will +# match case (1) in the case of an unverified connection and +# will be forwarded, with ,qAX,SERVERLOGIN +$position .= '.'; +istest::txrx(\&ok, $i_tx, $i_rx, + "$tx_call>DST,DIGI,qAZ,$tx_call:$position", + "$tx_call>DST,TCPXX*,qAX,$server_call:$position"); + +# TODO: should verify the rest of the things in the end of the +# algorithm - everything should come out with a qAX,SERVERLOGIN + +# disconnect + +$ret = $i_rx->disconnect(); +ok($ret, 1, "Failed to disconnect from the server: " . $i_rx->{'error'}); +$ret = $i_tx->disconnect(); +ok($ret, 1, "Failed to disconnect from the server: " . $i_tx->{'error'}); + +# stop + +ok($p->stop(), 1, "Failed to stop product"); +