Index: /trunk/src/VBox/Installer/linux/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Installer/linux/Makefile.kmk	(revision 37087)
+++ /trunk/src/VBox/Installer/linux/Makefile.kmk	(revision 37088)
@@ -18,4 +18,9 @@
 SUB_DEPTH = ../../../..
 include $(KBUILD_PATH)/subheader.kmk
+
+# Include sub-makefile.
+ifdef VBOX_WITH_TESTCASES
+ include $(PATH_SUB_CURRENT)/testcase/Makefile.kmk
+endif
 
 ifneq ($(KBUILD_HOST),linux)
@@ -310,4 +315,5 @@
 		$(VBOX_LNX_INST_OUT_DIR)/vboxweb-service.sh \
 		$(VBOX_LNX_INST_OUT_DIR)/install.sh \
+		$(VBOX_PATH_LNX_INST_SRC)/installer-utils.sh \
 		$(VBOX_PATH_LNX_INST_SRC)/vboxdrv-pardus.py \
 		$(VBOX_PATH_LNX_INST_SRC)/uninstall.sh \
@@ -357,5 +363,5 @@
 		$<
 
-$(VBOX_LNX_INST_OUT_DIR)/install.sh: $(VBOX_PATH_LNX_INST_SRC)/install.sh $(VBOX_VERSION_STAMP) $(VBOX_SVN_REV_KMK).ts | $$(dir $$@)
+$(VBOX_LNX_INST_OUT_DIR)/install.sh: $(VBOX_PATH_LNX_INST_SRC)/install.sh $(VBOX_PATH_LNX_INST_SRC)/installer-utils.sh $(VBOX_VERSION_STAMP) $(VBOX_SVN_REV_KMK).ts | $$(dir $$@)
 	$(QUIET)$(SED) \
 		-e "s;_VERSION_;$(VBOX_VERSION_STRING);g" \
@@ -365,4 +371,8 @@
 		-e "s;_HARDENED_;$(VBOX_WITH_HARDENING);g" \
 		-e "s;_PYTHON_;$(VBOX_WITH_PYTHON);g" \
+		-e '/#include installer-utils.sh/ {' \
+		-e "r $(PATH_ROOT)/src/VBox/Installer/linux/installer-utils.sh" \
+		-e 'd' \
+		-e '}' \
 		--output $@ \
 		$<
Index: /trunk/src/VBox/Installer/linux/debian/postinst.in
===================================================================
--- /trunk/src/VBox/Installer/linux/debian/postinst.in	(revision 37087)
+++ /trunk/src/VBox/Installer/linux/debian/postinst.in	(revision 37088)
@@ -17,4 +17,6 @@
 #  abort-remove:      (our version): removing this package failed
 #  abort-deconfigure: (our version): error during resolving conflicts
+
+#include installer-utils.sh
 
 LOG="/var/log/vbox-install.log"
@@ -41,44 +43,10 @@
 
   # install udev rule (disable with INSTALL_NO_UDEV=1 in /etc/default/virtualbox)
-  if [ -d /etc/udev/rules.d -a "$INSTALL_NO_UDEV" != "1" ]; then
-    udev_call=""
-    udev_app=`which udevadm 2> /dev/null`
-    if [ $? -eq 0 ]; then
-      udev_call="${udev_app} version 2> /dev/null"
-    else
-      udev_app=`which udevinfo 2> /dev/null`
-      if [ $? -eq 0 ]; then
-        udev_call="${udev_app} -V 2> /dev/null"
-      fi
-    fi
-    udev_fix="="
-    if [ "${udev_call}" != "" ]; then
-      udev_out=`${udev_call}`
-      udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
-      if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
-        udev_fix=""
-      fi
-    fi
-    echo "KERNEL=${udev_fix}\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"root\", MODE=\"0600\"" \
-      > /etc/udev/rules.d/10-vboxdrv.rules
-    if [ "$INSTALL_NO_GROUP" != "1" ]; then
-        usb_group=vboxusers
-    else
-        usb_group=root
-    fi
-    usb_createnode="/usr/share/virtualbox/VBoxCreateUSBNode.sh"
-    echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass} ${usb_group}\"" \
-        >> /etc/udev/rules.d/10-vboxdrv.rules
-    echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}==\"usb_device\", RUN=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass} ${usb_group}\"" \
-        >> /etc/udev/rules.d/10-vboxdrv.rules
-    echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN=\"${usb_createnode} --remove \$major \$minor\"" \
-        >> /etc/udev/rules.d/10-vboxdrv.rules
-    echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN=\"${usb_createnode} --remove \$major \$minor\"" \
-        >> /etc/udev/rules.d/10-vboxdrv.rules
+  if [ "$INSTALL_NO_GROUP" != "1" ]; then
+      usb_group=vboxusers
+  else
+      usb_group=root
   fi
-  # Remove old udev description file
-  if [ -f /etc/udev/rules.d/60-vboxdrv.rules ]; then
-      rm -f /etc/udev/rules.d/60-vboxdrv.rules 2> /dev/null
-  fi
+  install_udev_package ${usb_group} > /etc/udev/rules.d/10-vboxdrv.rules
   # Build our device tree
   for i in /sys/bus/usb/devices/*; do
Index: /trunk/src/VBox/Installer/linux/debian/rules
===================================================================
--- /trunk/src/VBox/Installer/linux/debian/rules	(revision 37087)
+++ /trunk/src/VBox/Installer/linux/debian/rules	(revision 37088)
@@ -340,5 +340,11 @@
 	cat debian/preinst.in | sed -e 's|%VER%|$(ver)|g' > debian/preinst
 	cat debian/prerm.in | sed -e 's|%VER%|$(ver)|g' > debian/prerm
-	cat debian/postinst.in | sed -e 's|%VER%|$(ver)|g' > debian/postinst
+	cat debian/postinst.in | \
+	    sed -e 's|%VER%|$(ver)|g' \
+	    -e '/#include installer-utils.sh/ {' \
+	    -e "r $(vboxroot)/src/VBox/Installer/linux/installer-utils.sh" \
+	    -e 'd' \
+	    -e '}' \
+	    > debian/postinst
 	dh_installdebconf
 	dh_installchangelogs
Index: /trunk/src/VBox/Installer/linux/install.sh
===================================================================
--- /trunk/src/VBox/Installer/linux/install.sh	(revision 37087)
+++ /trunk/src/VBox/Installer/linux/install.sh	(revision 37088)
@@ -18,6 +18,7 @@
 PATH=$PATH:/bin:/sbin:/usr/sbin
 
-# Source functions needed by the installer
+# Include routines and utilities needed by the installer
 . ./routines.sh
+#include installer-utils.sh
 
 LOG="/var/log/vbox-install.log"
@@ -442,39 +443,6 @@
 
     # Create udev description file
-    if [ -d /etc/udev/rules.d ]; then
-        udev_call=""
-        udev_app=`which udevadm 2> /dev/null`
-        if [ $? -eq 0 ]; then
-            udev_call="${udev_app} version 2> /dev/null"
-        else
-            udev_app=`which udevinfo 2> /dev/null`
-            if [ $? -eq 0 ]; then
-                udev_call="${udev_app} -V 2> /dev/null"
-            fi
-        fi
-        udev_fix="="
-        if [ "${udev_call}" != "" ]; then
-            udev_out=`${udev_call}`
-            udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
-            if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
-               udev_fix=""
-            fi
-        fi
-        # Write udev rules
-        echo "KERNEL=${udev_fix}\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"$VBOXDRV_GRP\", MODE=\"$VBOXDRV_MODE\"" \
-          > /etc/udev/rules.d/10-vboxdrv.rules
-        echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\"" \
-          >> /etc/udev/rules.d/10-vboxdrv.rules
-        echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}==\"usb_device\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\"" \
-          >> /etc/udev/rules.d/10-vboxdrv.rules
-        echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\"" \
-          >> /etc/udev/rules.d/10-vboxdrv.rules
-        echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\"" \
-          >> /etc/udev/rules.d/10-vboxdrv.rules
-    fi
-    # Remove old udev description file
-    if [ -f /etc/udev/rules.d/60-vboxdrv.rules ]; then
-        rm -f /etc/udev/rules.d/60-vboxdrv.rules 2> /dev/null
-    fi
+    install_udev_run "$VBOXDRV_GRP" "$VBOXDRV_MODE" "$INSTALLATION_DIR" \
+        > /etc/udev/rules.d/10-vboxdrv.rules
 
     # Build our device tree
Index: /trunk/src/VBox/Installer/linux/installer-utils.sh
===================================================================
--- /trunk/src/VBox/Installer/linux/installer-utils.sh	(revision 37088)
+++ /trunk/src/VBox/Installer/linux/installer-utils.sh	(revision 37088)
@@ -0,0 +1,104 @@
+# Oracle VM VirtualBox
+# VirtualBox installer shell routines
+#
+
+# Copyright (C) 2007-2011 Oracle Corporation
+#
+# This file is part of VirtualBox Open Source Edition (OSE), as
+# available from http://www.virtualbox.org. This file is free software;
+# you can redistribute it and/or modify it under the terms of the GNU
+# General Public License (GPL) as published by the Free Software
+# Foundation, in version 2 as it comes in the "COPYING" file of the
+# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+#
+
+my_which() {
+    which "$@"
+}
+
+my_rm() {
+    rm "$@"
+}
+
+setup_test_install_udev() {
+    eval 'my_which() { echo test_udev ; }'
+    eval 'my_rm() { true ; }'
+    eval 'test_udev() { echo "$TEST_UDEV_VERSION" ; }'
+}
+
+install_udev_run() {
+    # install udev rule (disable with INSTALL_NO_UDEV=1 in /etc/default/virtualbox) for distribution packages
+    VBOXDRV_GRP="$1"
+    VBOXDRV_MODE="$2"
+    INSTALLATION_DIR="$3"
+    if [ -d /etc/udev/rules.d ]; then
+        udev_call=""
+        udev_app=`my_which udevadm 2> /dev/null`
+        if [ $? -eq 0 ]; then
+            udev_call="${udev_app} version 2> /dev/null"
+        else
+            udev_app=`my_which udevinfo 2> /dev/null`
+            if [ $? -eq 0 ]; then
+                udev_call="${udev_app} -V 2> /dev/null"
+            fi
+        fi
+        udev_fix="="
+        if [ "${udev_call}" != "" ]; then
+            udev_out=`${udev_call}`
+            udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
+            if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
+                udev_fix=""
+            fi
+        fi
+        # Write udev rules
+        echo "KERNEL=${udev_fix}\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"$VBOXDRV_GRP\", MODE=\"$VBOXDRV_MODE\""
+        echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\""
+        echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}=${udev_fix}\"usb_device\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh \$major \$minor \$attr{bDeviceClass}\""
+        echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\""
+        echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}=${udev_fix}\"usb_device\", RUN=\"$INSTALLATION_DIR/VBoxCreateUSBNode.sh --remove \$major \$minor\""
+    fi
+    # Remove old udev description file
+    if [ -f /etc/udev/rules.d/60-vboxdrv.rules ]; then
+        my_rm -f /etc/udev/rules.d/60-vboxdrv.rules 2> /dev/null
+    fi
+}
+
+teardown_test_install_udev() {
+    true
+}
+
+install_udev_package() {
+    # install udev rule (disable with INSTALL_NO_UDEV=1 in /etc/default/virtualbox) for distribution packages
+    usb_group=$1
+    if [ -d /etc/udev/rules.d -a "$INSTALL_NO_UDEV" != "1" ]; then
+        udev_call=""
+        udev_app=`my_which udevadm 2> /dev/null`
+        if [ $? -eq 0 ]; then
+            udev_call="${udev_app} version 2> /dev/null"
+        else
+            udev_app=`my_which udevinfo 2> /dev/null`
+            if [ $? -eq 0 ]; then
+                udev_call="${udev_app} -V 2> /dev/null"
+            fi
+        fi
+        udev_fix="="
+        if [ "${udev_call}" != "" ]; then
+            udev_out=`${udev_call}`
+            udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
+            if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
+                udev_fix=""
+            fi
+        fi
+        usb_createnode="/usr/share/virtualbox/VBoxCreateUSBNode.sh"
+        echo "KERNEL=${udev_fix}\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"root\", MODE=\"0600\""
+        echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass} ${usb_group}\""
+        echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}=${udev_fix}\"usb_device\", RUN=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass} ${usb_group}\""
+        echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN=\"${usb_createnode} --remove \$major \$minor\""
+        echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}=${udev_fix}\"usb_device\", RUN=\"${usb_createnode} --remove \$major \$minor\""
+    fi
+    # Remove old udev description file
+    if [ -f /etc/udev/rules.d/60-vboxdrv.rules ]; then
+        my_rm -f /etc/udev/rules.d/60-vboxdrv.rules 2> /dev/null
+    fi
+}
Index: /trunk/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec
===================================================================
--- /trunk/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec	(revision 37087)
+++ /trunk/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec	(revision 37088)
@@ -219,4 +219,6 @@
 
 %post
+#include installer-utils.sh
+
 LOG="/var/log/vbox-install.log"
 
@@ -236,39 +238,6 @@
 
 # install udev rule (disable with INSTALL_NO_UDEV=1 in /etc/default/virtualbox)
-if [ -d /etc/udev/rules.d -a "$INSTALL_NO_UDEV" != "1" ]; then
-  udev_call=""
-  udev_app=`which udevadm 2> /dev/null`
-  if [ $? -eq 0 ]; then
-    udev_call="${udev_app} version 2> /dev/null"
-  else
-    udev_app=`which udevinfo 2> /dev/null`
-    if [ $? -eq 0 ]; then
-      udev_call="${udev_app} -V 2> /dev/null"
-    fi
-  fi
-  udev_fix="="
-  if [ "${udev_call}" != "" ]; then
-    udev_out=`${udev_call}`
-    udev_ver=`expr "$udev_out" : '[^0-9]*\([0-9]*\)'`
-    if [ "$udev_ver" = "" -o "$udev_ver" -lt 55 ]; then
-      udev_fix=""
-    fi
-  fi
-  usb_createnode="/usr/share/virtualbox/VBoxCreateUSBNode.sh"
-  echo "KERNEL=${udev_fix}\"vboxdrv\", NAME=\"vboxdrv\", OWNER=\"root\", GROUP=\"root\", MODE=\"0600\"" \
-    > /etc/udev/rules.d/10-vboxdrv.rules
-  echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"add\", RUN=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass}\"" \
-    >> /etc/udev/rules.d/10-vboxdrv.rules
-  echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"add\", ENV{DEVTYPE}==\"usb_device\", RUN=\"${usb_createnode} \$major \$minor \$attr{bDeviceClass}\"" \
-    >> /etc/udev/rules.d/10-vboxdrv.rules
-  echo "SUBSYSTEM=${udev_fix}\"usb_device\", ACTION=${udev_fix}\"remove\", RUN=\"${usb_createnode} --remove \$major \$minor\"" \
-    >> /etc/udev/rules.d/10-vboxdrv.rules
-  echo "SUBSYSTEM=${udev_fix}\"usb\", ACTION=${udev_fix}\"remove\", ENV{DEVTYPE}==\"usb_device\", RUN=\"${usb_createnode} --remove \$major \$minor\"" \
-    >> /etc/udev/rules.d/10-vboxdrv.rules
-fi
-# Remove old udev description file
-if [ -f /etc/udev/rules.d/60-vboxdrv.rules ]; then
-  rm -f /etc/udev/rules.d/60-vboxdrv.rules 2> /dev/null
-fi
+install_udev_package vboxusers > /etc/udev/rules.d/10-vboxdrv.rules
+
 # Build our device tree
 for i in /sys/bus/usb/devices/*; do
Index: /trunk/src/VBox/Installer/linux/rpm/rules
===================================================================
--- /trunk/src/VBox/Installer/linux/rpm/rules	(revision 37087)
+++ /trunk/src/VBox/Installer/linux/rpm/rules	(revision 37088)
@@ -171,4 +171,8 @@
 	  -e 's|%INSTMOD%|$(instmod)|g' \
 	  -e 's|%LIBASOUND%|$(if $(filter lib64,$(rpmlib)),libasound.so.2()(64bit),libasound.so.2)|g' \
+	  -e '/#include installer-utils.sh/ {' \
+	  -e "r $(vboxroot)/src/VBox/Installer/linux/installer-utils.sh" \
+	  -e 'd' \
+	  -e '}' \
 	   rpm/VirtualBox.tmpl.spec > $(archdir)/VirtualBox.spec
 	sed \
Index: /trunk/src/VBox/Installer/linux/testcase/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Installer/linux/testcase/Makefile.kmk	(revision 37088)
+++ /trunk/src/VBox/Installer/linux/testcase/Makefile.kmk	(revision 37088)
@@ -0,0 +1,40 @@
+# $Id$
+## @file
+# Sub-Makefile for the VBox Linux installer testcase.
+#
+
+#
+# Copyright (C) 2006-2011 Oracle Corporation
+#
+# This file is part of VirtualBox Open Source Edition (OSE), as
+# available from http://www.virtualbox.org. This file is free software;
+# you can redistribute it and/or modify it under the terms of the GNU
+# General Public License (GPL) as published by the Free Software
+# Foundation, in version 2 as it comes in the "COPYING" file of the
+# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+#
+
+SUB_DEPTH = ../../../../..
+include	$(KBUILD_PATH)/subheader.kmk
+
+INSTALLS += tstInstallerLinux
+TESTING += tstInstallerLinux
+tstInstallerLinux_INST    = bin/testcase
+tstInstallerLinux_MODE    = a+rx,u+w
+tstInstallerLinux_SOURCES = $(tstInstallerLinux_0_OUTDIR)/tstInstallerLinux.sh
+tstInstallerLinux_CLEAN   = $(tstInstallerLinux_0_OUTDIR)/tstInstallerLinux.sh
+
+$$(tstInstallerLinux_0_OUTDIR)/tstInstallerLinux.sh: \
+	$(PATH_SUB_CURRENT)/tstInstallerLinux.sh \
+	$(PATH_SUB_CURRENT)/../installer-utils.sh \
+	| $$(dir $$@)
+	$(QUIET)$(SED) \
+	-e '/#include installer-utils.sh/ {' \
+	-e "r $(PATH_ROOT)/src/VBox/Installer/linux/installer-utils.sh" \
+	-e 'd' \
+	-e '}' \
+	--output $@ \
+	$<
+
+include	$(KBUILD_PATH)/subfooter.kmk
Index: /trunk/src/VBox/Installer/linux/testcase/tstInstaller.sh
===================================================================
--- /trunk/src/VBox/Installer/linux/testcase/tstInstaller.sh	(revision 37088)
+++ /trunk/src/VBox/Installer/linux/testcase/tstInstaller.sh	(revision 37088)
@@ -0,0 +1,66 @@
+#!/bin/sh
+#
+# Oracle VM VirtualBox
+# VirtualBox linux installation script unit test
+
+#
+# Copyright (C) 2007-2011 Oracle Corporation
+#
+# This file is part of VirtualBox Open Source Edition (OSE), as
+# available from http://www.virtualbox.org. This file is free software;
+# you can redistribute it and/or modify it under the terms of the GNU
+# General Public License (GPL) as published by the Free Software
+# Foundation, in version 2 as it comes in the "COPYING" file of the
+# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+#
+
+#include installer-utils.sh
+
+echo Testing udev rule generation
+
+setup_test_install_udev
+
+TEST_UDEV_VERSION=55
+
+udev_55_rules=`cat <<UDEV_END
+KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"
+SUBSYSTEM=="usb_device", ACTION=="add", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM=="usb_device", ACTION=="remove", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh --remove $major $minor"
+SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh --remove $major $minor"
+UDEV_END
+
+install_udev_output="`install_udev_run`"
+case "$install_udev_output" in
+    "$udev_55_rules") ;;
+    *)
+        echo "Bad output for udev version 55.  Expected:"
+        echo "$udev_55_rules"
+        echo "Actual:"
+        echo "$install_udev_output"
+        ;;
+esac
+
+TEST_UDEV_VERSION=54
+
+udev_54_rules=`cat <<UDEV_END
+KERNEL="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"
+SUBSYSTEM="usb_device", ACTION="add", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM="usb", ACTION="add", ENV{DEVTYPE}="usb_device", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM="usb_device", ACTION="remove", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh --remove $major $minor"
+SUBSYSTEM="usb", ACTION="remove", ENV{DEVTYPE}="usb_device", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh --remove $major $minor"
+UDEV_END
+
+install_udev_output="`install_udev_run`"
+case "$install_udev_output" in
+    "$udev_54_rules") ;;
+    *)
+        echo "Bad output for udev version 54.  Expected:"
+        echo "$udev_54_rules"
+        echo "Actual:"
+        echo "$install_udev_output"
+        ;;
+esac
+
+echo Done.
Index: /trunk/src/VBox/Installer/linux/testcase/tstInstallerLinux.sh
===================================================================
--- /trunk/src/VBox/Installer/linux/testcase/tstInstallerLinux.sh	(revision 37088)
+++ /trunk/src/VBox/Installer/linux/testcase/tstInstallerLinux.sh	(revision 37088)
@@ -0,0 +1,116 @@
+#!/bin/sh
+#
+# Oracle VM VirtualBox
+# VirtualBox linux installation script unit test
+
+#
+# Copyright (C) 2007-2011 Oracle Corporation
+#
+# This file is part of VirtualBox Open Source Edition (OSE), as
+# available from http://www.virtualbox.org. This file is free software;
+# you can redistribute it and/or modify it under the terms of the GNU
+# General Public License (GPL) as published by the Free Software
+# Foundation, in version 2 as it comes in the "COPYING" file of the
+# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+#
+
+#include installer-utils.sh
+
+CERRS=0
+
+setup_test_install_udev
+
+echo "Testing udev rule generation for the \".run\" installer"
+
+TEST_UDEV_VERSION=55
+
+udev_55_rules=`cat <<'UDEV_END'
+KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"
+SUBSYSTEM=="usb_device", ACTION=="add", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM=="usb_device", ACTION=="remove", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh --remove $major $minor"
+SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN="/opt/VirtualBox/VBoxCreateUSBNode.sh --remove $major $minor"
+UDEV_END`
+
+install_udev_output="`install_udev_run vboxusers 0660 /opt/VirtualBox`"
+case "$install_udev_output" in
+    "$udev_55_rules") ;;
+    *)
+        echo "Bad output for udev version 55.  Expected:"
+        echo "$udev_55_rules"
+        echo "Actual:"
+        echo "$install_udev_output"
+        CERRS="`expr "$CERRS" + 1`"
+        ;;
+esac
+
+TEST_UDEV_VERSION=54
+
+udev_54_rules=`cat <<'UDEV_END'
+KERNEL="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600"
+SUBSYSTEM="usb_device", ACTION="add", RUN="/usr/lib/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM="usb", ACTION="add", ENV{DEVTYPE}="usb_device", RUN="/usr/lib/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass}"
+SUBSYSTEM="usb_device", ACTION="remove", RUN="/usr/lib/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
+SUBSYSTEM="usb", ACTION="remove", ENV{DEVTYPE}="usb_device", RUN="/usr/lib/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
+UDEV_END`
+
+install_udev_output="`install_udev_run root 0600 /usr/lib/virtualbox`"
+case "$install_udev_output" in
+    "$udev_54_rules") ;;
+    *)
+        echo "Bad output for udev version 54.  Expected:"
+        echo "$udev_54_rules"
+        echo "Actual:"
+        echo "$install_udev_output"
+        CERRS="`expr "$CERRS" + 1`"
+        ;;
+esac
+
+echo "Testing udev rule generation for the \"package\" installer"
+
+TEST_UDEV_VERSION=55
+
+udev_55_rules=`cat <<'UDEV_END'
+KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600"
+SUBSYSTEM=="usb_device", ACTION=="add", RUN="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass} vboxusers"
+SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass} vboxusers"
+SUBSYSTEM=="usb_device", ACTION=="remove", RUN="/usr/share/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
+SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN="/usr/share/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
+UDEV_END`
+
+install_udev_output="`install_udev_package vboxusers`"
+case "$install_udev_output" in
+    "$udev_55_rules") ;;
+    *)
+        echo "Bad output for udev version 55.  Expected:"
+        echo "$udev_55_rules"
+        echo "Actual:"
+        echo "$install_udev_output"
+        CERRS="`expr "$CERRS" + 1`"
+        ;;
+esac
+
+TEST_UDEV_VERSION=54
+
+udev_54_rules=`cat <<'UDEV_END'
+KERNEL="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600"
+SUBSYSTEM="usb_device", ACTION="add", RUN="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass} root"
+SUBSYSTEM="usb", ACTION="add", ENV{DEVTYPE}="usb_device", RUN="/usr/share/virtualbox/VBoxCreateUSBNode.sh $major $minor $attr{bDeviceClass} root"
+SUBSYSTEM="usb_device", ACTION="remove", RUN="/usr/share/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
+SUBSYSTEM="usb", ACTION="remove", ENV{DEVTYPE}="usb_device", RUN="/usr/share/virtualbox/VBoxCreateUSBNode.sh --remove $major $minor"
+UDEV_END`
+
+install_udev_output="`install_udev_package root`"
+case "$install_udev_output" in
+    "$udev_54_rules") ;;
+    *)
+        echo "Bad output for udev version 54.  Expected:"
+        echo "$udev_54_rules"
+        echo "Actual:"
+        echo "$install_udev_output"
+        CERRS="`expr "$CERRS" + 1`"
+        ;;
+esac
+
+echo "Done.  Error count $CERRS."
