1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00
ipxwrapper/tests/40-ip-spx.t

240 lines
6.4 KiB
Perl
Raw Permalink Normal View History

# IPXWrapper test suite
# Copyright (C) 2014 Daniel Collins <solemnwarning@solemnwarning.net>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 as published by
# the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
use strict;
use warnings;
use Test::Spec;
use FindBin;
use lib "$FindBin::Bin/lib/";
use IPXWrapper::Capture::IPXOverUDP;
2024-12-21 23:59:22 +00:00
use IPXWrapper::LogServer;
use IPXWrapper::SPX;
use IPXWrapper::Tool::Generic;
use IPXWrapper::Util;
require "$FindBin::Bin/config.pm";
our ($local_dev_a, $local_mac_a, $local_ip_a);
our ($local_dev_b, $local_mac_b, $local_ip_b);
our ($remote_mac_a, $remote_ip_a);
our ($remote_mac_b, $remote_ip_b);
our ($net_a_bcast, $net_b_bcast);
use constant {
UDP_BCAST_PORT => 54792,
IPX_CONNECT_TRIES => 3,
};
describe "IPXWrapper using IP encapsulation" => sub
{
before all => sub
{
reg_delete_key($remote_ip_a, "HKCU\\Software\\IPXWrapper");
reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\00:00:00:00:00:00", "net", "00:00:00:01");
reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\$remote_mac_a", "net", "00:00:00:01");
reg_set_addr( $remote_ip_a, "HKCU\\Software\\IPXWrapper\\$remote_mac_b", "net", "00:00:00:02");
};
2024-12-21 23:59:22 +00:00
my $log = undef;
before each => sub
{
$log = IPXWrapper::LogServer->new();
reg_set_string($remote_ip_a, "HKCU\\Software\\IPXWrapper", "log_server_addr", $local_ip_a);
reg_set_dword( $remote_ip_a, "HKCU\\Software\\IPXWrapper", "log_server_port", $log->port());
};
after each => sub
{
# TODO: Call this if the test succeeded.
#
# If a test fails due to an exception, the after blocks won't be called, however a
# test failing due to an assertion still calls the after blocks. I haven't found
# any way to actually determine if the test passed from code.
# $log->discard();
};
it "responds to SPX lookups" => sub
{
my $listener = IPXWrapper::Tool::Generic->new(
$remote_ip_a, "Z:\\tools\\spx-server.exe",
"00:00:00:01", $remote_mac_a, "2222");
my @replies = perform_spxlookup($local_ip_a, $net_a_bcast,
"00:00:00:01", $remote_mac_a, 2222);
cmp_hashes_partial(\@replies, [
{
network => "00:00:00:01",
node => $remote_mac_a,
socket => 2222,
ip => $remote_ip_a,
},
]);
};
it "responds to SPX lookups with network number 00:00:00:00" => sub
{
my $listener = IPXWrapper::Tool::Generic->new(
$remote_ip_a, "Z:\\tools\\spx-server.exe",
"00:00:00:01", $remote_mac_a, "2222");
my @replies = perform_spxlookup($local_ip_a, $net_a_bcast,
"00:00:00:00", $remote_mac_a, 2222);
cmp_hashes_partial(\@replies, [
{
network => "00:00:00:00",
node => $remote_mac_a,
socket => 2222,
ip => $remote_ip_a,
},
]);
};
it "ignores SPX lookups with the wrong network number" => sub
{
my $listener = IPXWrapper::Tool::Generic->new(
$remote_ip_a, "Z:\\tools\\spx-server.exe",
"00:00:00:01", $remote_mac_a, "2222");
my @replies = perform_spxlookup($local_ip_a, $net_a_bcast,
"00:00:00:04", $remote_mac_a, 2222);
cmp_hashes_partial(\@replies, []);
};
it "ignores SPX lookups with the wrong node number" => sub
{
my $listener = IPXWrapper::Tool::Generic->new(
$remote_ip_a, "Z:\\tools\\spx-server.exe",
"00:00:00:01", $remote_mac_a, "2222");
my @replies = perform_spxlookup($local_ip_a, $net_a_bcast,
"00:00:00:01", "AA:AA:AA:AA:AA:AA", 2222);
cmp_hashes_partial(\@replies, []);
};
it "ignores SPX lookups with the wrong socket number" => sub
{
my $listener = IPXWrapper::Tool::Generic->new(
$remote_ip_a, "Z:\\tools\\spx-server.exe",
"00:00:00:01", $remote_mac_a, "2222");
my @replies = perform_spxlookup($local_ip_a, $net_a_bcast,
"00:00:00:01", $remote_mac_a, 2223);
cmp_hashes_partial(\@replies, []);
};
my $spx_connect_expect = sub
{
my ($bcast_ip) = @_;
return map { {
dst_ip => $bcast_ip,
dst_port => UDP_BCAST_PORT,
dst_network => "00:00:00:00",
dst_node => "00:00:00:00:00:00",
dst_socket => 0,
src_network => "00:00:00:00",
src_node => "00:00:00:00:00:00",
src_socket => 0,
data => pack_spxlookup_req(
"00:00:00:01",
"AB:CD:EF:00:11:22",
2222
),
} } (1 .. IPX_CONNECT_TRIES);
};
it "transmits SPX lookups on each interface when connecting an unbound SPX socket" => sub
{
my $capture_a = IPXWrapper::Capture::IPXOverUDP->new($local_dev_a);
my $capture_b = IPXWrapper::Capture::IPXOverUDP->new($local_dev_b);
run_remote_cmd(
$remote_ip_a, "Z:\\tools\\spx-client.exe",
"00:00:00:01", "AB:CD:EF:00:11:22", "2222",
);
sleep(1);
my @packets_a = $capture_a->read_available();
my @packets_b = $capture_b->read_available();
cmp_hashes_partial(\@packets_a, [
$spx_connect_expect->($net_a_bcast),
]);
cmp_hashes_partial(\@packets_b, [
$spx_connect_expect->($net_b_bcast),
]);
};
it "transmits SPX lookups on the bound interface when connecting a bound SPX socket" => sub
{
my $capture_a = IPXWrapper::Capture::IPXOverUDP->new($local_dev_a);
my $capture_b = IPXWrapper::Capture::IPXOverUDP->new($local_dev_b);
run_remote_cmd(
$remote_ip_a, "Z:\\tools\\spx-client.exe",
"00:00:00:01", "AB:CD:EF:00:11:22", "2222",
"00:00:00:01", $remote_mac_a, "0",
);
sleep(1);
my @packets_a = $capture_a->read_available();
my @packets_b = $capture_b->read_available();
cmp_hashes_partial(\@packets_a, [
$spx_connect_expect->($net_a_bcast),
]);
cmp_hashes_partial(\@packets_b, []);
};
# TODO: Test wildcard specific cases.
# TODO: Properly test spxinit step.
it "can exchange data between SPX sockets" => sub
{
my $listener = IPXWrapper::Tool::Generic->new(
$remote_ip_a, "Z:\\tools\\spx-server.exe",
"00:00:00:01", $remote_mac_a, 2222);
my $output = run_remote_cmd(
$remote_ip_a, "Z:\\tools\\spx-client.exe",
"00:00:00:01", $remote_mac_a, "2222",
);
like($output, qr/^success$/m);
};
};
runtests unless caller;