X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=test%2Fudevd-test%2Fudevd-test.pl;h=2328de814f0f4325365f336d3e4c5c788e04317e;hp=060c3ec5f2cbdd5075898932ed3131de30f290d6;hb=98446db5533596fd4d32f5019479d37d9495f1a1;hpb=7d855c3116ec9ddab9adde96b568681930d9855b diff --git a/test/udevd-test/udevd-test.pl b/test/udevd-test/udevd-test.pl index 060c3ec5f..2328de814 100644 --- a/test/udevd-test/udevd-test.pl +++ b/test/udevd-test/udevd-test.pl @@ -5,11 +5,10 @@ # Copyright (C) Intel Corp, 2004 # # Author: Yin Hu -# Kay Sievers # # Provides automated testing of the udevd binary.This test script is self-contained. # Before you run this script please modify $sysfs to locate your sysfs filesystem, -# modify $udevd_bin to locate your udevsend binary, +# modify $udevsend_bin to locate your udevsend binary, # modify $udev_bin to locate dummy udev script, # modify $udev_bin2 to locate another dummy udev script ( amplify the execution time for test), # modify $log_file to locate where udev script have placed the log file, @@ -38,98 +37,52 @@ use warnings; use strict; # modifiable settings -my $sysfs = "../sys"; -my $udevd_bin = "../../udevsend"; -my $udev_bin = "$ENV{PWD}/udev-log-script.pl"; -my $udev_bin2 = "$ENV{PWD}/udev-log-amplify.pl"; -my $log_file = "/tmp/udev_log.txt"; -my $time_out = 10; -my $udev_exe_time = 5; +my $sysfs = "../sys"; +my $udevd_bin = "../../udevd"; +my $udevsend_bin = "../../udevsend"; +my $udev_bin = "$ENV{'PWD'}/udev-log-script.pl"; +my $udev_bin2 = "$ENV{'PWD'}/udev-log-amplify.pl"; +my $log_file = "/tmp/udev_log.txt"; +my $time_out = 10; +my $udev_exe_time = 5; # global variables my $test_case = 0; # common functions -sub kill_daemon { +sub restart_daemon { + my ($udev_binary) = @_; + system("killall udevd"); system("rm -f $log_file"); sleep 1; -} - -sub udevsend { - # This function prepares corresponding environment variables - # and then call $udevd_bin to send event. - - my ($seqnum, $devpath, $action, $subsystem, $udev_bin_tmp) = @_; - - $ENV{DEVPATH} = $devpath; - $ENV{ACTION} = $action; - $udev_bin_tmp = $udev_bin if ( not $udev_bin_tmp ); - $ENV{UDEV_BIN} = $udev_bin_tmp; - if ( $seqnum != -1) { - $ENV{SEQNUM} = $seqnum; - } else { - delete $ENV{SEQNUM}; - } - - return system("$udevd_bin $subsystem"); -} - -sub getDate { - # Get current date function - # If we want GTM time, simply pass GMT as first argument to this function. - my $format = @_; - my $date; - - if( $format =~ /GMT/i ) { - $date = gmtime() . " GMT"; - } else { - $date = localtime(); + if (!defined($udev_binary)) { + $udev_binary = $udev_bin; } - return $date; + $ENV{'UDEV_BIN'} = $udev_binary; + system("/bin/sh -c $udevd_bin&"); + sleep(1); } -sub cmpDate { - # This function should return a difference betweent date1 and date2 - - my ($date1, $date2) = @_; - my @monList = ( "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", - "Aug", "Sep", "Oct", "Nov", "Dec" ); - my ( $m1, $m2, $tmp ); - - $date1 =~ s/([\D]*)$//g; - $date2 =~ s/([\D]*)$//g; - - return if( (not $date1) or (not $date2) ); - - my $mon = 0; - - my ( @T1 ) = - ( $date1 =~ /([\d]+)[\s]+([\d]+):([\d]+):([\d]+)[\s]+([\d]+)/g ); - my ( @T2 ) = - ( $date2 =~ /([\d]+)[\s]+([\d]+):([\d]+):([\d]+)[\s]+([\d]+)/g ); - - foreach $tmp (@monList) { - $m1 = sprintf("%2.2d",$mon) if( $date1 =~ /$tmp/i ); - $m2 = sprintf("%2.2d",$mon) if( $date2 =~ /$tmp/i ); - $mon++; - } +sub udevsend { + # This function prepares corresponding environment variables + # and then call $udevsend_bin to send event. - my $dt1 = sprintf("%4.4d%s%2.2d%2.2d%2.2d%2.2d", $T1[4], $m1, $T1[0], - $T1[1], $T1[2], $T1[3]); - my $dt2 = sprintf("%4.4d%s%2.2d%2.2d%2.2d%2.2d", $T2[4], $m2, $T2[0], - $T2[1], $T2[2], $T2[3]); + my ($seqnum, $devpath, $action, $subsystem, $script) = @_; - my $ret = $dt1 - $dt2; + %ENV = (); + $ENV{'DEVPATH'} = $devpath; + $ENV{'ACTION'} = $action; + $ENV{'SUBSYSTEM'} = $subsystem; - if ( $ret > 40 ) { - $ret = abs($ret-40); + if ( $seqnum != -1) { + $ENV{SEQNUM} = $seqnum; } - return $ret; + return system("$udevsend_bin $subsystem"); } sub check_count_and_time { @@ -151,9 +104,9 @@ sub check_count_and_time { @line_items = split(/,/,$line); print " device: $line_items[0], action: $line_items[1] \n"; print " forking udev time: $line_items[-1]"; - $diff = cmpDate($line_items[-1], $event_recv_time); + $diff = $line_items[-1] - $event_recv_time; print " the delay time is: $diff s \n\n"; - if ( $diff > $time_out ) { + if ( $diff > $time_out+10 ) { print " the delay time is: $diff \n"; print " udevd doesn't act properly. \n"; exit 1; @@ -196,7 +149,7 @@ sub show_result { @line_items = split(/,/,$line); print " device: $line_items[0], action: $line_items[1] \n"; print " forking udev time: $line_items[-1]"; - $diff = cmpDate($line_items[-1], $event_recv_time); + $diff = $line_items[-1] - $event_recv_time; print " the delay time is: $diff s \n\n"; } close(LOGF); @@ -220,7 +173,7 @@ sub show_result_tm_out { @line_items = split(/,/,$line); print " device: $line_items[0], action: $line_items[1] \n"; print " forking udev time: $line_items[-1]"; - $diff = cmpDate($line_items[-1], $event_recv_time); + $diff = $line_items[-1] - $event_recv_time; print " the delay time is: $diff s \n\n"; if ( $diff < $time_out ) { print " the delay time is: $diff \n"; @@ -249,7 +202,7 @@ sub show_result_immediate { @line_items = split(/,/,$line); print " device: $line_items[0], action: $line_items[1] \n"; print " forking udev time: $line_items[-1]"; - $diff = cmpDate($line_items[-1], $event_recv_time); + $diff = $line_items[-1] - $event_recv_time; print " the delay time is: $diff s \n\n"; if ( $diff > $time_out ) { print " the delay time is: $diff \n"; @@ -276,7 +229,7 @@ sub check_exe_time { $exe_time[$i] = $line_items[-1]; $i++; } - $diff = cmpDate($exe_time[1], $exe_time[0]); + $diff = $exe_time[1] - $exe_time[0]; if ( $diff < $udev_exe_time ) { print " there are more than one udev instance for a single device at the same time. \n"; exit 1; @@ -293,21 +246,19 @@ sub run_no_seq_test { print " the delay time between event receiving and forking udev for udevd should be negligible, \n"; print " that is, udev should be forked at once. please notice the following time...\n\n"; - # local variables my $time; # # add devices event test # - kill_daemon(); + restart_daemon(); # check if devices /block/sda exist check_sysfs_device_exist("$sysfs/block/sda"); # log current system date/time - $time = getDate(); + $time = time(); - # fork udevd udevsend(-1, "/block/sda", "add", "block"); # check if execution is successful in time @@ -321,9 +272,8 @@ sub run_no_seq_test { system("rm -f $log_file"); # log current system date/time - $time = getDate(); + $time = time(); - # fork udevd udevsend(-1, "/block/sda", "remove", "block"); # check if execution is successful in time @@ -342,19 +292,17 @@ sub run_normal_seq_test { print " event to udev for each device. \n"; print " We can see the delay time for each device should be negligible. \n\n"; - # local variables my @file_list; my $file; my $seq = 0; my $time; my $ret_seq; - # prepare - kill_daemon(); + restart_daemon(); @file_list = glob "$sysfs/class/tty/*"; # log current system date/time for device add events - $time = getDate(); + $time = time(); # # add devices event test @@ -373,7 +321,7 @@ sub run_normal_seq_test { # we'd better wait the udev to create all the device for a few seconds print " wait for udevd processing about $time_out s... \n\n"; - sleep $time_out; + sleep $time_out + 5; $ret_seq = check_count_and_time($time); if ( $ret_seq != $seq ) { @@ -384,13 +332,13 @@ sub run_normal_seq_test { } # log current system date/time for device remove events - $time = getDate(); + $time = time(); # # remove devices event test # print "remove device events test: \n"; - kill_daemon(); + restart_daemon(); @file_list = glob "$sysfs/class/tty/*"; $seq = 0; foreach $file (@file_list) { @@ -406,7 +354,7 @@ sub run_normal_seq_test { # we'd better wait the udev to create all the device for a few seconds print " waiting for udev removing devices (about $time_out s)...\n"; - sleep $time_out; + sleep $time_out + 5; # show results $ret_seq = check_count_and_time($time); @@ -427,7 +375,6 @@ sub run_random_seq_test { print " We have disordered the events sent to udevd, if udevd can order them correctly, the devices' \n"; print " add/remove sequence should be tty0, tty1, tty2. \n\n"; - # local variables my $time; # check if devices /class/tty/tty0, tty1, tty2 exist @@ -437,10 +384,10 @@ sub run_random_seq_test { # add device events test # print "add device events test: \n"; - kill_daemon(); + restart_daemon(); # log current system date/time for device remove events - $time = getDate(); + $time = time(); # parameters: 1 sequence number, 2 device, 3 action, 4 subsystem udevsend(3, "/class/tty/tty2", "add", "tty"); @@ -454,12 +401,11 @@ sub run_random_seq_test { # remove device events test # print "\nremove device events test: \n"; - kill_daemon(); + restart_daemon(); # log current system date/time for device remove events - $time = getDate(); + $time = time(); - # fork udevd udevsend(3, "/class/tty/tty2", "remove", "tty"); udevsend(2, "/class/tty/tty1", "remove", "tty"); udevsend(1, "/class/tty/tty0", "remove", "tty"); @@ -481,14 +427,12 @@ sub run_expected_seq_test { print " should fork udev immediately, the delay time should be negligible. \n"; print " where: event 7 is (add device /class/tty/tty2) \n\n"; - # local variables my $time; # check if devices /class/tty0, tty1, tty2 exist check_sysfs_device_exist("$sysfs/class/tty/tty0", "$sysfs/class/tty/tty1", "$sysfs/class/tty/tty2"); - # prepare - kill_daemon(); + restart_daemon(); # parameters: 1 sequence number, 2 device, 3 action, 4 subsystem udevsend(3, "/class/tty/tty2", "add", "tty"); @@ -499,11 +443,11 @@ sub run_expected_seq_test { udevsend(6, "/class/tty/tty2", "remove", "tty"); print " wait for udevd timing out for disorder events (about $time_out s) \n\n"; - sleep $time_out+1; + sleep $udev_exe_time + $time_out+1; system("rm -f $log_file"); # log current system date/time for device remove events - $time = getDate(); + $time = time(); # show results udevsend(7, "/class/tty/tty2", "add", "tty"); @@ -527,21 +471,18 @@ sub run_single_instance_test { print " we send a add event for device /block/sda, and then we send a remove event, so the \n"; print " execution of remove event should be delayed until add is finished. \n\n"; - # local variables my $time; - # prepare - kill_daemon(); + restart_daemon($udev_bin2); # check if device exists check_sysfs_device_exist("$sysfs/block/sda"); # log current system date/time - $time = getDate(); + $time = time(); - # fork udved - udevsend(-1, "/block/sda", "add", "block", $udev_bin2); - udevsend(-1, "/block/sda", "remove", "block", $udev_bin2); + udevsend(-1, "/block/sda", "add", "block"); + udevsend(-1, "/block/sda", "remove", "block"); # show results print " wait for udevd processing about $udev_exe_time s... \n\n"; @@ -560,24 +501,20 @@ sub run_same_events_test { print " event ( add device /class/tty/tty1 ) should be delayed for $time_out s than its previous \n"; print " event ( remove device /block/sda ) \n\n"; - # local variables my $time; - # prepare - kill_daemon(); + restart_daemon(); # check if device exist check_sysfs_device_exist("$sysfs/block/sda", "$sysfs/class/tty/tty1"); - # fork udevd udevsend(0, "/block/sda", "add", "block"); # log current system date/time sleep 1; - $time = getDate(); + $time = time(); system("rm -f $log_file"); - # fork udevd udevsend(1, "/block/sda", "remove", "block"); udevsend(1, "/class/tty/tty1", "add", "tty"); @@ -595,25 +532,21 @@ sub run_missing_seq_test { print "Test expected visible results:\n"; print " the delay time for event(add device /block/sda) should be about $time_out s.\n\n"; - # local variables my $time; - # prepare - kill_daemon(); + restart_daemon(); # check if device exist check_sysfs_device_exist("$sysfs/block/sda", "$sysfs/class/tty/tty1"); - # fork udevd udevsend(0, "/class/tty/tty1", "add", "tty"); udevsend(1, "/class/tty/tty1", "remove", "tty"); sleep 1; # log current system date/time - $time = getDate(); + $time = time(); system("rm -f $log_file"); - # fork udevd udevsend(3, "/block/sda", "add", "block"); # show results