From d96ddf1f893e69ad4b5732ba9bb0a8bdd6981725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Mon, 31 Aug 2026 15:26:26 -0300 Subject: [PATCH] test(ipmi): cover netmask validation --- xCAT-test/unit/ipmi_ipv4_command_encoding.t | 46 +++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/xCAT-test/unit/ipmi_ipv4_command_encoding.t b/xCAT-test/unit/ipmi_ipv4_command_encoding.t index c6dc3a76f..176239310 100644 --- a/xCAT-test/unit/ipmi_ipv4_command_encoding.t +++ b/xCAT-test/unit/ipmi_ipv4_command_encoding.t @@ -137,6 +137,11 @@ subtest 'IPv4 settings preserve their wire command bytes' => sub { data => [ 2, 0x03, 0, 0, 0, 0 ], value => '0.0.0.0', }, + { + setting => 'netmask=255.255.255.0', + data => [ 2, 0x06, 255, 255, 255, 0 ], + value => '255.255.255.0', + }, { setting => 'gateway=10.20.30.1', data => [ 2, 0x0c, 10, 20, 30, 1 ], @@ -342,6 +347,47 @@ subtest 'IPv4 settings resolve once per transaction' => sub { } }; +subtest 'netmask values must be contiguous dotted-decimal masks' => sub { + plan skip_all => 'netmask validation is not present on the base revision' + unless xCAT_plugin::ipmi->can('_resolve_ipv4_octets'); + + my @accepted = ( + [ '255.255.255.255', [ 2, 0x06, 255, 255, 255, 255 ] ], + [ '128.0.0.0', [ 2, 0x06, 128, 0, 0, 0 ] ], + [ '0.0.0.0', [ 2, 0x06, 0, 0, 0, 0 ] ], + ); + foreach my $case (@accepted) { + my ( $value, $data ) = @{$case}; + my $result = run_setting("netmask=$value"); + is( scalar( @{ $result->{calls} } ), 1, "netmask=$value sends one command" ); + is_deeply( $result->{calls}->[0]->{data}, $data, + "netmask=$value keeps its wire bytes" ); + is_deeply( $result->{messages}, [], "netmask=$value reports no error" ); + } + + my @rejected = ( + [ '999.999.999.999', 'octets above 255' ], + [ '255.255.255', 'three-part form' ], + [ '255.255.255.255.255', 'five-part form' ], + [ '255.0.255.0', 'noncontiguous mask bits' ], + [ '255.255.255.256', 'octet above 255' ], + [ '255.255.255.010', 'leading-zero octet' ], + [ '24', 'prefix length form' ], + ); + foreach my $case (@rejected) { + my ( $value, $reason ) = @{$case}; + my $result = run_setting("netmask=$value"); + ok( $result->{succeeded}, "netmask=$value does not raise a Perl exception" ) + or diag $result->{error}; + is_deeply( $result->{calls}, [], "netmask=$value sends no IPMI command: $reason" ); + is_deeply( + $result->{messages}->[0]->[0], + [ 1, "'$value' is not a valid netmask" ], + "netmask=$value reports the rejection" + ); + } +}; + subtest 'invalid IPv4 settings report an xCAT error' => sub { plan skip_all => 'invalid setting handling is not present on the base revision' unless xCAT_plugin::ipmi->can('_resolve_ipv4_octets');