chiark / gitweb /
libudev: handle "device" link as parent, handle "class" "block" as "subsystem"
[elogind.git] / test / udev-test.pl
index 73d99297d2d7de09b04869da7336c6848d5387ef..a83b156d784b62e21c58dfdabc341f8d1210042a 100755 (executable)
 use warnings;
 use strict;
 
-my $PWD                = $ENV{PWD};
-my $sysfs      = "sys/";
-my $udev_bin   = "../test-udev";
-my $udev_root  = "udev-root/"; # !!! directory will be removed !!!
-my $udev_conf  = "udev-test.conf";
-my $udev_rules = "udev-test.rules";
-
-# uncomment following line to run udev with valgrind.
-# Should make this a runtime option to the script someday...
-#my $udev_bin  = "valgrind --tool=memcheck --leak-check=yes   ../udev";
+my $PWD                        = $ENV{PWD};
+my $sysfs              = "sys/";
+my $udev_bin           = "../udev/test-udev";
+my $valgrind           = 0;
+my $udev_bin_valgrind  = "valgrind --tool=memcheck --leak-check=yes --quiet $udev_bin";
+my $udev_root          = "udev-root/";
+my $udev_conf          = "udev-test.conf";
+my $udev_rules         = "udev-test.rules";
 
 my @tests = (
        {
@@ -290,7 +288,7 @@ EOF
                desc            => "import of shell-value file",
                subsys          => "block",
                devpath         => "/block/sda",
-               exp_name        => "subdir/info/node" ,
+               exp_name        => "subdir/err/node" ,
                rules           => <<EOF
 SUBSYSTEMS=="scsi", IMPORT{file}="udev-test.conf", NAME="subdir/%E{udev_log}/node"
 KERNEL=="ttyUSB0", NAME="visor"
@@ -302,7 +300,7 @@ EOF
                devpath         => "/block/sda",
                exp_name        => "node12345678",
                rules           => <<EOF
-SUBSYSTEMS=="scsi", IMPORT="/bin/echo -e \' TEST_KEY=12345678  \\n  TEST_key2=98765 \'", NAME="node\$env{TEST_KEY}"
+SUBSYSTEMS=="scsi", IMPORT="/bin/echo -e \' TEST_KEY=12345678\\n  TEST_key2=98765\'", NAME="node\$env{TEST_KEY}"
 KERNEL=="ttyUSB0", NAME="visor"
 EOF
        },
@@ -1015,26 +1013,6 @@ EOF
                exp_target      => "ttyUSB0",
                rules           => <<EOF
 KERNEL=="ttyUSB[0-9]*", NAME="ttyUSB%n", SYMLINK+="%3s{dev}"
-EOF
-       },
-       {
-               desc            => "symlink with '%' in name",
-               subsys          => "tty",
-               devpath         => "/class/tty/ttyUSB0",
-               exp_name        => "percent%sign",
-               exp_target      => "ttyUSB0",
-               rules           => <<EOF
-KERNEL=="ttyUSB[0-9]*", NAME="ttyUSB%n", SYMLINK+="percent%%sign"
-EOF
-       },
-       {
-               desc            => "symlink with '%' in name",
-               subsys          => "tty",
-               devpath         => "/class/tty/ttyUSB0",
-               exp_name        => "%ttyUSB0_name",
-               exp_target      => "ttyUSB0",
-               rules           => <<EOF
-KERNEL=="ttyUSB[0-9]*", NAME="ttyUSB%n", SYMLINK+="%%%k_name"
 EOF
        },
        {
@@ -1556,8 +1534,17 @@ EOF
                devpath         => "/block/sda/sda1",
                exp_name        => "yes",
                rules           => <<EOF
-KERNEL="sda1", NAME=="no"
+KERNEL="sda1", NAME="no"
 KERNEL=="sda1", NAME="yes"
+EOF
+       },
+       {
+               desc            => "operator chars in attribute",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "yes",
+               rules           => <<EOF
+KERNEL=="sda", ATTR{test:colon+plus}=="?*", NAME="yes"
 EOF
        },
        {
@@ -1572,6 +1559,83 @@ KERNEL="sda1", NAME=="no"
 KERNEL=="sda1", NAME="yes"
 EOF
        },
+       {
+               desc            => "magic subsys/kernel lookup",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "00:e0:00:fb:04:e1",
+               rules           => <<EOF
+KERNEL=="sda", NAME="\$attr{[net/eth0]address}"
+EOF
+       },
+       {
+               desc            => "TEST absolute path",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "there",
+               rules           => <<EOF
+TEST=="/etc/hosts", NAME="there"
+NAME="notthere"
+EOF
+       },
+       {
+               desc            => "TEST subsys/kernel lookup",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "yes",
+               rules           => <<EOF
+KERNEL=="sda", TEST=="[net/eth0]", NAME="yes"
+EOF
+       },
+       {
+               desc            => "TEST relative path",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "relative",
+               rules           => <<EOF
+KERNEL=="sda", TEST=="size", NAME="relative"
+EOF
+       },
+       {
+               desc            => "TEST wildcard substitution (find queue/nr_requests)",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "found-subdir",
+               rules           => <<EOF
+KERNEL=="sda", TEST=="*/nr_requests", NAME="found-subdir"
+EOF
+       },
+       {
+               desc            => "TEST MODE=0000",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "sda",
+               exp_perms       => "0:0:0000",
+               rules           => <<EOF
+KERNEL=="sda", MODE="0000"
+EOF
+       },
+       {
+               desc            => "TEST PROGRAM feeds MODE",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "sda",
+               exp_perms       => "0:0:0400",
+               rules           => <<EOF
+KERNEL=="sda", PROGRAM=="/bin/echo 0 0 0400", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}"
+EOF
+       },
+       {
+               desc            => "TEST PROGRAM feeds MODE with overflow",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "sda",
+               exp_perms       => "0:0:0400",
+               rules           => <<EOF
+KERNEL=="sda", PROGRAM=="/bin/echo 0 0 0400letsdoabuffferoverflow0123456789012345789012345678901234567890", OWNER="%c{1}", GROUP="%c{2}", MODE="%c{3}"
+EOF
+       },
+
 );
 
 # set env
@@ -1590,7 +1654,11 @@ sub udev {
        close CONF;
 
        $ENV{ACTION} = $action;
-       system("$udev_bin $subsys");
+       if ($valgrind > 0) {
+               system("$udev_bin_valgrind $subsys");
+       } else {
+               system("$udev_bin $subsys");
+       }
 }
 
 my $error = 0;
@@ -1687,6 +1755,15 @@ sub symlink_test {
        }
 }
 
+sub make_udev_root {
+       system("rm -rf $udev_root");
+       mkdir($udev_root) || die "unable to create udev_root: $udev_root\n";
+       # setting group and mode of udev_root ensures the tests work
+       # even if the parent directory has setgid bit enabled.
+       chown (0, 0, $udev_root) || die "unable to chown $udev_root\n";
+       chmod (0755, $udev_root) || die "unable to chmod $udev_root\n";
+}
+
 sub run_test {
        my ($rules, $number) = @_;
 
@@ -1759,8 +1836,7 @@ sub run_test {
        print "\n";
 
        if (defined($rules->{option}) && $rules->{option} eq "clean") {
-               system("rm -rf $udev_root");
-               mkdir($udev_root) || die "unable to create udev_root: $udev_root\n";
+               make_udev_root ();
        }
 
 }
@@ -1773,27 +1849,35 @@ if (!($<==0)) {
 }
 
 # prepare
-system("rm -rf $udev_root");
-mkdir($udev_root) || die "unable to create udev_root: $udev_root\n";
+make_udev_root();
 
 # create config file
 open CONF, ">$udev_conf" || die "unable to create config file: $udev_conf";
 print CONF "udev_root=\"$udev_root\"\n";
-print CONF "udev_rules=\"$udev_rules\"\n";
-print CONF "udev_log=\"info\"\n";
+print CONF "udev_rules=\"$PWD\"\n";
+print CONF "udev_log=\"err\"\n";
 close CONF;
 
 my $test_num = 1;
+my @list;
 
-if ($ARGV[0]) {
-       # only run one test
-       $test_num = $ARGV[0];
-
-       if (defined($tests[$test_num-1]->{desc})) {
-               print "udev-test will run test number $test_num only:\n\n";
-               run_test($tests[$test_num-1], $test_num);
+foreach my $arg (@ARGV) {
+       if ($arg =~ m/--valgrind/) {
+               $valgrind = 1;
+               printf("using valgrind\n");
        } else {
-               print "test does not exist.\n";
+               push(@list, $arg);
+       }
+}
+
+if ($list[0]) {
+       foreach my $arg (@list) {
+               if (defined($tests[$arg-1]->{desc})) {
+                       print "udev-test will run test number $arg:\n\n";
+                       run_test($tests[$arg-1], $arg);
+               } else {
+                       print "test does not exist.\n";
+               }
        }
 } else {
        # test all