2003-11-23 05:47:28 -08:00
#!/usr/bin/perl
# udev-test
#
# Provides automated testing of the udev binary.
# The whole test is self contained in this file, except the matching sysfs tree.
# Simply extend the @tests array, to add a new test variant.
#
# Every test is driven by its own temporary config file.
# This program prepares the environment, creates the config and calls udev.
#
# udev reads the config, looks at the provided sysfs and
# first creates and then removes the device node.
# After creation and removal the result is checked against the
# expected value and the result is printed.
#
# happy testing,
# Kay Sievers <kay.sievers@vrfy.org>, 2003
use warnings ;
use strict ;
2003-11-24 05:44:01 -08:00
my $ PWD = $ ENV { PWD } ;
2003-11-23 05:47:28 -08:00
my $ sysfs = "sys/" ;
my $ udev_bin = "../udev" ;
my $ udev_root = "udev-root/" ; # !!! directory will be removed !!!
2003-11-24 23:45:38 -08:00
my $ udev_db = ".udev.tdb" ;
2003-11-23 05:47:28 -08:00
my $ perm = "udev.permissions" ;
2003-12-03 08:13:53 -08:00
my $ main_conf = "udev-test.conf" ;
my $ conf_tmp = "udev-test.rules" ;
2003-11-23 05:47:28 -08:00
my @ tests = (
{
desc = > "label test of scsi disc" ,
subsys = > "block" ,
devpath = > "block/sda" ,
expected = > "boot_disk" ,
conf = > << EOF
LABEL , BUS = "scsi" , vendor = "IBM-ESXS" , NAME = "boot_disk%n"
REPLACE , KERNEL = "ttyUSB0" , NAME = "visor" "
EOF
} ,
{
desc = > "label test of scsi partition" ,
subsys = > "block" ,
devpath = > "block/sda/sda1" ,
expected = > "boot_disk1" ,
conf = > << EOF
LABEL , BUS = "scsi" , vendor = "IBM-ESXS" , NAME = "boot_disk%n"
2003-12-02 17:52:26 -08:00
EOF
} ,
{
2003-12-03 06:22:53 -08:00
desc = > "catch device by *" ,
2003-12-02 17:52:26 -08:00
subsys = > "tty" ,
devpath = > "class/tty/ttyUSB0" ,
expected = > "visor/0" ,
conf = > << EOF
REPLACE , KERNEL = "ttyUSB*" , NAME = "visor/%n"
2003-12-03 06:22:53 -08:00
EOF
} ,
{
desc = > "catch device by ?" ,
subsys = > "tty" ,
devpath = > "class/tty/ttyUSB0" ,
expected = > "visor/0" ,
conf = > << EOF
REPLACE , KERNEL = "ttyUSB??*" , NAME = "visor/%n-1"
REPLACE , KERNEL = "ttyUSB??" , NAME = "visor/%n-2"
REPLACE , KERNEL = "ttyUSB?" , NAME = "visor/%n"
EOF
} ,
{
desc = > "catch device by character class" ,
subsys = > "tty" ,
devpath = > "class/tty/ttyUSB0" ,
expected = > "visor/0" ,
conf = > << EOF
REPLACE , KERNEL = "ttyUSB[A-Z]*" , NAME = "visor/%n-1"
REPLACE , KERNEL = "ttyUSB?[0-9]" , NAME = "visor/%n-2"
REPLACE , KERNEL = "ttyUSB[0-9]*" , NAME = "visor/%n"
2003-11-23 05:47:28 -08:00
EOF
} ,
{
desc = > "replace kernel name" ,
subsys = > "tty" ,
devpath = > "class/tty/ttyUSB0" ,
expected = > "visor" ,
conf = > << EOF
REPLACE , KERNEL = "ttyUSB0" , NAME = "visor"
2003-11-24 22:27:23 -08:00
EOF
} ,
{
desc = > "subdirectory handling" ,
subsys = > "tty" ,
devpath = > "class/tty/ttyUSB0" ,
expected = > "sub/direct/ory/visor" ,
conf = > << EOF
REPLACE , KERNEL = "ttyUSB0" , NAME = "sub/direct/ory/visor"
2003-11-23 05:47:28 -08:00
EOF
} ,
{
desc = > "place on bus of scsi partition" ,
subsys = > "block" ,
devpath = > "block/sda/sda3" ,
expected = > "first_disk3" ,
conf = > << EOF
TOPOLOGY , BUS = "scsi" , PLACE = "0:0:0:0" , NAME = "first_disk%n"
EOF
} ,
{
desc = > "test NAME substitution chars" ,
subsys = > "block" ,
devpath = > "block/sda/sda3" ,
expected = > "Major:8:minor:3:kernelnumber:3:bus:0:0:0:0" ,
conf = > << EOF
TOPOLOGY , BUS = "scsi" , PLACE = "0:0:0:0" , NAME = "Major:%M:minor:%m:kernelnumber:%n:bus:%b"
EOF
} ,
{
2003-12-03 06:22:53 -08:00
desc = > "callout result substitution" ,
2003-11-23 05:47:28 -08:00
subsys = > "block" ,
devpath = > "block/sda/sda3" ,
expected = > "special-device-3" ,
conf = > << EOF
CALLOUT , BUS = "scsi" , PROGRAM = "/bin/echo -n special-device" , ID = "-special-*" , NAME = "%c-1-%n"
CALLOUT , BUS = "scsi" , PROGRAM = "/bin/echo -n special-device" , ID = "special--*" , NAME = "%c-2-%n"
CALLOUT , BUS = "scsi" , PROGRAM = "/bin/echo -n special-device" , ID = "special-device-" , NAME = "%c-3-%n"
CALLOUT , BUS = "scsi" , PROGRAM = "/bin/echo -n special-device" , ID = "special-devic" , NAME = "%c-4-%n"
CALLOUT , BUS = "scsi" , PROGRAM = "/bin/echo -n special-device" , ID = "special-*" , NAME = "%c-%n"
2003-11-23 22:25:13 -08:00
EOF
} ,
{
2003-11-24 05:44:01 -08:00
desc = > "callout program substitution" ,
2003-11-23 22:25:13 -08:00
subsys = > "block" ,
devpath = > "block/sda/sda3" ,
expected = > "test-0:0:0:0" ,
conf = > << EOF
CALLOUT , BUS = "scsi" , PROGRAM = "/bin/echo -n test-%b" , ID = "test-*" , NAME = "%c"
2003-11-24 23:45:38 -08:00
EOF
} ,
{
desc = > "devfs disk naming substitution" ,
subsys = > "block" ,
devpath = > "block/sda" ,
expected = > "lun0/disk" ,
conf = > << EOF
LABEL , BUS = "scsi" , vendor = "IBM-ESXS" , NAME = "lun0/%D"
EOF
} ,
{
desc = > "devfs disk naming substitution" ,
subsys = > "block" ,
devpath = > "block/sda/sda2" ,
expected = > "lun0/part2" ,
conf = > << EOF
LABEL , BUS = "scsi" , vendor = "IBM-ESXS" , NAME = "lun0/%D"
2003-11-26 17:45:26 -08:00
EOF
} ,
{
desc = > "callout bus type" ,
subsys = > "block" ,
devpath = > "block/sda" ,
expected = > "scsi-0:0:0:0" ,
conf = > << EOF
CALLOUT , BUS = "usb" , PROGRAM = "/bin/echo -n usb-%b" , ID = "*" , NAME = "%c"
CALLOUT , BUS = "scsi" , PROGRAM = "/bin/echo -n scsi-%b" , ID = "*" , NAME = "%c"
CALLOUT , BUS = "foo" , PROGRAM = "/bin/echo -n foo-%b" , ID = "*" , NAME = "%c"
2003-11-23 05:47:28 -08:00
EOF
} ,
) ;
# set env
$ ENV { UDEV_TEST } = "yes" ;
$ ENV { SYSFS_PATH } = $ sysfs ;
2003-12-03 08:13:53 -08:00
$ ENV { UDEV_CONFIG_FILE } = $ main_conf ;
2003-11-23 05:47:28 -08:00
sub udev {
my ( $ action , $ subsys , $ devpath , $ config ) = @ _ ;
$ ENV { DEVPATH } = $ devpath ;
# create temporary config
open CONF , ">$conf_tmp" || die "unable to create config file: $conf_tmp" ;
print CONF $$ config ;
close CONF ;
$ ENV { ACTION } = $ action ;
system ( "$udev_bin $subsys" ) ;
}
# prepare
system ( "rm -rf $udev_root" ) ;
mkdir ( $ udev_root ) || die "unable to create udev_root: $udev_root\n" ;
# test
2003-11-23 21:17:34 -08:00
my $ error = 0 ;
2003-11-23 05:47:28 -08:00
print "\nudev-test will run " . ( $# tests + 1 ) . " tests:\n\n" ;
2003-12-03 08:13:53 -08:00
# create initial config file
open CONF , ">$main_conf" || die "unable to create config file: $main_conf" ;
print CONF "udev_root=\"$udev_root\"\n" ;
print CONF "udev_db=\"$udev_db\"\n" ;
print CONF "udev_rules=\"$conf_tmp\"\n" ;
print CONF "udev_permissions=\"$perm\"\n" ;
close CONF ;
2003-11-23 05:47:28 -08:00
foreach my $ config ( @ tests ) {
$ config - > { conf } =~ m/^([A-Z]*).*/ ;
my $ method = $ 1 ;
print "TEST: $config->{desc}\n" ;
print "method \'$method\' for \'$config->{devpath}\' expecting node \'$config->{expected}\'\n" ;
udev ( "add" , $ config - > { subsys } , $ config - > { devpath } , \ $ config - > { conf } ) ;
if ( - e "$PWD/$udev_root$config->{expected}" ) {
print "add: ok " ;
} else {
print "add: error\n" ;
system ( "tree $udev_root" ) ;
print "\n" ;
$ error + + ;
}
udev ( "remove" , $ config - > { subsys } , $ config - > { devpath } , \ $ config - > { conf } ) ;
if ( - e "$PWD/$udev_root$config->{expected}" ) {
print "remove: error\n\n" ;
system ( "tree $udev_root" ) ;
$ error + + ;
} else {
print "remove: ok\n\n" ;
}
}
print "$error errors occured\n\n" ;
# cleanup
2003-11-24 23:45:38 -08:00
unlink ( $ udev_db ) ;
2003-11-23 05:47:28 -08:00
system ( "rm -rf $udev_root" ) ;
unlink ( $ conf_tmp ) ;
2003-12-03 08:13:53 -08:00
unlink ( $ main_conf ) ;
2003-11-23 05:47:28 -08:00