+ rules => <<EOF
+BUS=="scsi", KERNEL=="sda1", NAME="start-%r-end"
+EOF
+ },
+ {
+ desc => "last_rule option",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "last",
+ rules => <<EOF
+BUS=="scsi", KERNEL=="sda1", SYMLINK+="last", OPTIONS="last_rule"
+BUS=="scsi", KERNEL=="sda1", NAME="very-last"
+EOF
+ },
+ {
+ desc => "negation KERNEL!=",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "match",
+ rules => <<EOF
+BUS=="scsi", KERNEL!="sda1", NAME="matches-but-is-negated"
+BUS=="scsi", KERNEL!="xsda1", NAME="match"
+BUS=="scsi", KERNEL=="sda1", NAME="wrong"
+EOF
+ },
+ {
+ desc => "negation SUBSYSTEM!=",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "not-anything",
+ rules => <<EOF
+BUS=="scsi", SUBSYSTEM=="block", KERNEL!="sda1", NAME="matches-but-is-negated"
+BUS=="scsi", SUBSYSTEM!="anything", NAME="not-anything"
+BUS=="scsi", KERNEL=="sda1", NAME="wrong"
+EOF
+ },
+ {
+ desc => "negation PROGRAM!= exit code",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "nonzero-program",
+ rules => <<EOF
+KERNEL=="sda1", PROGRAM!="/bin/false", NAME="nonzero-program"
+BUS=="scsi", KERNEL=="sda1", NAME="wrong"
+EOF
+ },
+ {
+ desc => "test for whitespace between the operator",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "true",
+ rules => <<EOF
+KERNEL == "sda1" , NAME = "true"
+BUS=="scsi", KERNEL=="sda1", NAME="wrong"
+EOF
+ },
+ {
+ desc => "ENV{} test",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "true",
+ rules => <<EOF
+BUS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="go", NAME="wrong"
+BUS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="test", NAME="true"
+BUS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="bad", NAME="bad"
+EOF
+ },
+ {
+ desc => "ENV{} test",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "true",
+ rules => <<EOF
+BUS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="go", NAME="wrong"
+BUS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="yes", ENV{ACTION}=="add", ENV{DEVPATH}=="/block/sda/sdax1", NAME="no"
+BUS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="test", ENV{ACTION}=="add", ENV{DEVPATH}=="/block/sda/sda1", NAME="true"
+BUS=="scsi", KERNEL=="sda1", ENV{ENV_KEY_TEST}=="bad", NAME="bad"
+EOF
+ },
+ {
+ desc => "untrusted string sanitize",
+ subsys => "block",
+ devpath => "/block/sda/sda1",
+ exp_name => "sane",
+ rules => <<EOF
+BUS=="scsi", KERNEL=="sda1", PROGRAM=="/bin/echo -e name; (/sbin/badprogram)", RESULT="name_ _/sbin/badprogram_", NAME="sane"
+EOF
+ },
+ {
+ desc => "read sysfs value from device down in the chain",
+ subsys => "block",
+ devpath => "/class/tty/ttyUSB0",
+ exp_name => "serial-0000:00:09.0",
+ rules => <<EOF
+KERNEL=="ttyUSB*", NAME="serial-%s{serial}"
+EOF
+ },
+ {
+ desc => "match against empty key string",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "ok",
+ rules => <<EOF
+KERNEL=="sda", SYSFS{nothing}!="", NAME="not-1-ok"
+KERNEL=="sda", SYSFS{nothing}=="", NAME="not-2-ok"
+KERNEL=="sda", SYSFS{vendor}!="", NAME="ok"
+KERNEL=="sda", SYSFS{vendor}=="", NAME="not-3-ok"
+EOF
+ },
+ {
+ desc => "check ACTION value",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "ok",
+ rules => <<EOF
+ACTION=="unknown", KERNEL=="sda", NAME="unknown-not-ok"
+ACTION=="add", KERNEL=="sda", NAME="ok"
+EOF
+ },
+ {
+ desc => "apply NAME only once",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "link",
+ exp_target => "ok",
+ rules => <<EOF
+KERNEL=="sda", NAME="ok"
+KERNEL=="sda", NAME="not-ok"
+KERNEL=="sda", SYMLINK+="link"
+EOF
+ },
+ {
+ desc => "test RUN key",
+ subsys => "block",
+ devpath => "/block/sda",
+ exp_name => "testsymlink",
+ exp_target => "ok",
+ exp_rem_error => "yes",